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.
Files changed (142) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/date-picker/CustomDatePickerFormat.mjs +43 -0
  3. package/esm2022/lib/date-picker/CustomDatePickerI18n.mjs +50 -0
  4. package/esm2022/lib/date-picker/date-picker.component.mjs +366 -0
  5. package/esm2022/lib/date-picker/date-picker.mjs +3 -0
  6. package/esm2022/lib/date-picker/date-picker.module.mjs +69 -0
  7. package/esm2022/lib/date-picker/date-picker.service.mjs +68 -0
  8. package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +311 -0
  9. package/esm2022/lib/date-time-picker/date-time-picker.mjs +3 -0
  10. package/esm2022/lib/date-time-picker/date-time-picker.module.mjs +76 -0
  11. package/esm2022/lib/date-time-picker/date-time-picker.service.mjs +64 -0
  12. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.component.mjs +1140 -0
  13. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.module.mjs +93 -0
  14. package/esm2022/lib/date-time-picker-editable/date-time-picker-editable.service.mjs +85 -0
  15. package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.mjs +283 -0
  16. package/esm2022/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.mjs +23 -0
  17. package/esm2022/lib/error-message/error-message.component.mjs +24 -0
  18. package/esm2022/lib/error-message/error-message.module.mjs +19 -0
  19. package/esm2022/lib/input-number/input-number.component.mjs +351 -0
  20. package/esm2022/lib/input-number/input-number.mjs +3 -0
  21. package/esm2022/lib/input-number/input-number.module.mjs +65 -0
  22. package/esm2022/lib/input-number/input-number.service.mjs +68 -0
  23. package/esm2022/lib/input-text/input-text.component.mjs +345 -0
  24. package/esm2022/lib/input-text/input-text.mjs +3 -0
  25. package/esm2022/lib/input-text/input-text.module.mjs +73 -0
  26. package/esm2022/lib/input-text/input-text.service.mjs +96 -0
  27. package/esm2022/lib/ng-select-multiple/ng-select-multiple.component.mjs +375 -0
  28. package/esm2022/lib/ng-select-multiple/ng-select-multiple.mjs +3 -0
  29. package/esm2022/lib/ng-select-multiple/ng-select-multiple.module.mjs +69 -0
  30. package/esm2022/lib/ng-select-multiple/ng-select-multiple.service.mjs +96 -0
  31. package/esm2022/lib/ng-select-simple/ng-select-simple.component.mjs +461 -0
  32. package/esm2022/lib/ng-select-simple/ng-select-simple.mjs +3 -0
  33. package/esm2022/lib/ng-select-simple/ng-select-simple.module.mjs +53 -0
  34. package/esm2022/lib/ng-select-simple/ng-select-simple.service.mjs +138 -0
  35. package/esm2022/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.mjs +144 -0
  36. package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.mjs +27 -0
  37. package/esm2022/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.mjs +22 -0
  38. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.mjs +242 -0
  39. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.mjs +62 -0
  40. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-config.mjs +27 -0
  41. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.mjs +70 -0
  42. package/esm2022/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.mjs +45 -0
  43. package/esm2022/lib/sc-ag-grid/directives/scAgGrid.directive.mjs +25 -0
  44. package/esm2022/lib/sc-ag-grid/index.mjs +14 -0
  45. package/esm2022/lib/sc-ag-grid/input-search/input-search.component.mjs +20 -0
  46. package/esm2022/lib/sc-ag-grid/input-search/input-search.module.mjs +31 -0
  47. package/esm2022/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.mjs +564 -0
  48. package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.mjs +80 -0
  49. package/esm2022/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.mjs +31 -0
  50. package/esm2022/lib/sc-ag-grid/sc-ag-grid.module.mjs +118 -0
  51. package/esm2022/lib/sc-ag-grid/sc-grid.uitl.mjs +10 -0
  52. package/esm2022/lib/sc-wizard/sc-wizard.component.mjs +75 -0
  53. package/esm2022/lib/sc-wizard/sc-wizard.module.mjs +44 -0
  54. package/esm2022/lib/text-area/text-area.component.mjs +272 -0
  55. package/esm2022/lib/text-area/text-area.mjs +3 -0
  56. package/esm2022/lib/text-area/text-area.module.mjs +60 -0
  57. package/esm2022/lib/text-area/text-area.service.mjs +54 -0
  58. package/esm2022/lib/tooltip-message/tooltip-message.component.mjs +25 -0
  59. package/esm2022/lib/tooltip-message/tooltip-message.module.mjs +21 -0
  60. package/esm2022/lib/utils/DateTimeModel.mjs +56 -0
  61. package/esm2022/lib/utils/DateTimePickerEditable.mjs +3 -0
  62. package/esm2022/lib/utils/DateUtil.mjs +196 -0
  63. package/esm2022/lib/utils/INgSelect.mjs +2 -0
  64. package/esm2022/lib/utils/IScAgGrid.mjs +7 -0
  65. package/esm2022/lib/utils/ScWizardBase.mjs +14 -0
  66. package/esm2022/lib/utils/SharedComponentsUtil.mjs +38 -0
  67. package/esm2022/lib/utils/ValidateUtil.mjs +18 -0
  68. package/esm2022/lib/utils/message-util.service.mjs +75 -0
  69. package/esm2022/ngx-sumax-erp-components.mjs +5 -0
  70. package/esm2022/public-api.mjs +33 -0
  71. package/fesm2022/ngx-sumax-erp-components.mjs +7045 -0
  72. package/fesm2022/ngx-sumax-erp-components.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/date-picker/CustomDatePickerFormat.d.ts +11 -0
  75. package/lib/date-picker/CustomDatePickerI18n.d.ts +25 -0
  76. package/lib/date-picker/date-picker.component.d.ts +108 -0
  77. package/lib/date-picker/date-picker.d.ts +10 -0
  78. package/lib/date-picker/date-picker.module.d.ts +18 -0
  79. package/lib/date-picker/date-picker.service.d.ts +22 -0
  80. package/lib/date-time-picker/date-time-picker.component.d.ts +96 -0
  81. package/lib/date-time-picker/date-time-picker.d.ts +9 -0
  82. package/lib/date-time-picker/date-time-picker.module.d.ts +18 -0
  83. package/lib/date-time-picker/date-time-picker.service.d.ts +20 -0
  84. package/lib/date-time-picker-editable/date-time-picker-editable.component.d.ts +118 -0
  85. package/lib/date-time-picker-editable/date-time-picker-editable.module.d.ts +16 -0
  86. package/lib/date-time-picker-editable/date-time-picker-editable.service.d.ts +27 -0
  87. package/lib/dialog-ag-grid-search/dialog-ag-grid-search.component.d.ts +82 -0
  88. package/lib/dialog-ag-grid-search/dialog-ag-grid-search.module.d.ts +13 -0
  89. package/lib/error-message/error-message.component.d.ts +13 -0
  90. package/lib/error-message/error-message.module.d.ts +9 -0
  91. package/lib/input-number/input-number.component.d.ts +74 -0
  92. package/lib/input-number/input-number.d.ts +10 -0
  93. package/lib/input-number/input-number.module.d.ts +17 -0
  94. package/lib/input-number/input-number.service.d.ts +22 -0
  95. package/lib/input-text/input-text.component.d.ts +85 -0
  96. package/lib/input-text/input-text.d.ts +17 -0
  97. package/lib/input-text/input-text.module.d.ts +18 -0
  98. package/lib/input-text/input-text.service.d.ts +35 -0
  99. package/lib/ng-select-multiple/ng-select-multiple.component.d.ts +83 -0
  100. package/lib/ng-select-multiple/ng-select-multiple.d.ts +14 -0
  101. package/lib/ng-select-multiple/ng-select-multiple.module.d.ts +17 -0
  102. package/lib/ng-select-multiple/ng-select-multiple.service.d.ts +30 -0
  103. package/lib/ng-select-simple/ng-select-simple.component.d.ts +124 -0
  104. package/lib/ng-select-simple/ng-select-simple.d.ts +20 -0
  105. package/lib/ng-select-simple/ng-select-simple.module.d.ts +17 -0
  106. package/lib/ng-select-simple/ng-select-simple.service.d.ts +42 -0
  107. package/lib/sc-ag-grid/cell-editors/container-shared/container-shared.component.d.ts +61 -0
  108. package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayCustom.component.d.ts +10 -0
  109. package/lib/sc-ag-grid/cell-render/no-rows-overlay/noRowsOverlayDefault.component.d.ts +9 -0
  110. package/lib/sc-ag-grid/cell-render/sc-cell-render-button/sc-cell-render-button.component.d.ts +49 -0
  111. package/lib/sc-ag-grid/cell-render/sc-cell-render-checkbox-list/sc-cell-render-checkbox-list.component.d.ts +11 -0
  112. package/lib/sc-ag-grid/cell-render/sc-cell-render-config.d.ts +20 -0
  113. package/lib/sc-ag-grid/cell-render/sc-cell-render-select/sc-cell-render-select.component.d.ts +16 -0
  114. package/lib/sc-ag-grid/cell-render/sc-cell-render-toggle/sc-cell-render-toggle.component.d.ts +16 -0
  115. package/lib/sc-ag-grid/directives/scAgGrid.directive.d.ts +10 -0
  116. package/lib/sc-ag-grid/index.d.ts +13 -0
  117. package/lib/sc-ag-grid/input-search/input-search.component.d.ts +11 -0
  118. package/lib/sc-ag-grid/input-search/input-search.module.d.ts +9 -0
  119. package/lib/sc-ag-grid/sc-ag-grid-customizable/sc-ag-grid-customizable.component.d.ts +191 -0
  120. package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.component.d.ts +25 -0
  121. package/lib/sc-ag-grid/sc-ag-grid-pagination/sc-ag-grid-pagination.module.d.ts +9 -0
  122. package/lib/sc-ag-grid/sc-ag-grid.module.d.ts +32 -0
  123. package/lib/sc-ag-grid/sc-grid.uitl.d.ts +5 -0
  124. package/lib/sc-wizard/sc-wizard.component.d.ts +38 -0
  125. package/lib/sc-wizard/sc-wizard.module.d.ts +13 -0
  126. package/lib/text-area/text-area.component.d.ts +66 -0
  127. package/lib/text-area/text-area.d.ts +8 -0
  128. package/lib/text-area/text-area.module.d.ts +16 -0
  129. package/lib/text-area/text-area.service.d.ts +18 -0
  130. package/lib/tooltip-message/tooltip-message.component.d.ts +13 -0
  131. package/lib/tooltip-message/tooltip-message.module.d.ts +11 -0
  132. package/lib/utils/DateTimeModel.d.ts +16 -0
  133. package/lib/utils/DateTimePickerEditable.d.ts +13 -0
  134. package/lib/utils/DateUtil.d.ts +37 -0
  135. package/lib/utils/INgSelect.d.ts +6 -0
  136. package/lib/utils/IScAgGrid.d.ts +65 -0
  137. package/lib/utils/ScWizardBase.d.ts +9 -0
  138. package/lib/utils/SharedComponentsUtil.d.ts +6 -0
  139. package/lib/utils/ValidateUtil.d.ts +4 -0
  140. package/lib/utils/message-util.service.d.ts +10 -0
  141. package/package.json +32 -0
  142. 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==