keevo-components 1.8.39 → 1.8.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. package/README.md +24 -24
  2. package/esm2022/keevo-components.mjs +4 -4
  3. package/esm2022/lib/api/base-components/base-component-button.mjs +36 -36
  4. package/esm2022/lib/api/base-components/base-component-chart.mjs +92 -92
  5. package/esm2022/lib/api/base-components/base-component-crud-form.mjs +298 -298
  6. package/esm2022/lib/api/base-components/base-component-crud-list.mjs +78 -78
  7. package/esm2022/lib/api/base-components/base-component-crud.mjs +65 -65
  8. package/esm2022/lib/api/base-components/base-component-dropdown-external.mjs +31 -31
  9. package/esm2022/lib/api/base-components/base-component-dropdown.mjs +169 -169
  10. package/esm2022/lib/api/base-components/base-component-input.mjs +94 -94
  11. package/esm2022/lib/api/base-components/base-component-multi-select.mjs +130 -130
  12. package/esm2022/lib/api/base-components/base-component.mjs +51 -51
  13. package/esm2022/lib/api/components/chart/chart.config.mjs +2 -2
  14. package/esm2022/lib/api/components/chart/chart.model.mjs +2 -2
  15. package/esm2022/lib/api/components/chart/orchart.config.mjs +2 -2
  16. package/esm2022/lib/api/components/chart/orchart.item.mjs +2 -2
  17. package/esm2022/lib/api/components/dropdown/filtro.combo.mjs +2 -2
  18. package/esm2022/lib/api/components/table/action-item.mjs +2 -2
  19. package/esm2022/lib/api/components/table/kv-menuitem.mjs +3 -3
  20. package/esm2022/lib/api/components/table/table-dropdown-control.mjs +2 -2
  21. package/esm2022/lib/api/components/table/table.config.column.mjs +2 -2
  22. package/esm2022/lib/api/components/table/table.config.mjs +2 -2
  23. package/esm2022/lib/api/components/table/table.paginate.mjs +9 -9
  24. package/esm2022/lib/api/components/table/tabledit.config.mjs +2 -2
  25. package/esm2022/lib/api/components/table/tableedit.config.column.mjs +2 -2
  26. package/esm2022/lib/api/directives/template/template.directive.mjs +24 -24
  27. package/esm2022/lib/api/helpers/component-providers.mjs +16 -16
  28. package/esm2022/lib/api/helpers/keevo-validators.mjs +72 -72
  29. package/esm2022/lib/api/helpers/translate-primeng.mjs +23 -23
  30. package/esm2022/lib/api/models/menu/menu.model.mjs +2 -2
  31. package/esm2022/lib/api/models/menu/menucompleto.model.mjs +2 -2
  32. package/esm2022/lib/api/models/menu/sistemamenu.model.mjs +2 -2
  33. package/esm2022/lib/api/modules/primeng.module.mjs +255 -251
  34. package/esm2022/lib/api/pipes/codigofile.pipe.mjs +19 -19
  35. package/esm2022/lib/api/pipes/cpfcnpj.pipe.mjs +25 -25
  36. package/esm2022/lib/api/pipes/mask.pipe.mjs +29 -29
  37. package/esm2022/lib/api/pipes/pipes.module.mjs +39 -39
  38. package/esm2022/lib/api/pipes/telefone.pipe.mjs +45 -45
  39. package/esm2022/lib/api/services/base.api.service.mjs +74 -74
  40. package/esm2022/lib/api/services/breadcrumbs.service.mjs +57 -57
  41. package/esm2022/lib/api/services/component.service.mjs +27 -27
  42. package/esm2022/lib/api/services/form.service.mjs +85 -85
  43. package/esm2022/lib/api/services/imagens.service.mjs +28 -28
  44. package/esm2022/lib/api/services/notification.service.mjs +67 -67
  45. package/esm2022/lib/api/services/object.service.mjs +39 -39
  46. package/esm2022/lib/components/keevo-components.module.mjs +137 -144
  47. package/esm2022/lib/components/kv-avatar/kv-avatar.component.mjs +78 -78
  48. package/esm2022/lib/components/kv-avatar/kv-avatar.module.mjs +32 -32
  49. package/esm2022/lib/components/kv-buttons/kv-button-personalize/kv-button-personalize.component.mjs +31 -31
  50. package/esm2022/lib/components/kv-buttons/kv-button-popup/kv-button-popup.component.mjs +31 -31
  51. package/esm2022/lib/components/kv-buttons/kv-button-secondary/kv-button-secondary.component.mjs +17 -17
  52. package/esm2022/lib/components/kv-buttons/kv-button-success/kv-button-success.component.mjs +17 -17
  53. package/esm2022/lib/components/kv-buttons/kv-button.module.mjs +39 -39
  54. package/esm2022/lib/components/kv-carousel/kv-carousel.component.mjs +92 -92
  55. package/esm2022/lib/components/kv-carousel/kv-carousel.module.mjs +28 -28
  56. package/esm2022/lib/components/kv-chart/kv-chart.component.mjs +145 -145
  57. package/esm2022/lib/components/kv-chart/kv-chart.module.mjs +32 -32
  58. package/esm2022/lib/components/kv-error/kv-error.component.mjs +26 -26
  59. package/esm2022/lib/components/kv-error/kv-error.module.mjs +35 -35
  60. package/esm2022/lib/components/kv-inputs/kv-check/kv-check.component.mjs +26 -26
  61. package/esm2022/lib/components/kv-inputs/kv-dropdown/kv-dropdown.component.mjs +37 -37
  62. package/esm2022/lib/components/kv-inputs/kv-editor/kv-editor.component.mjs +88 -88
  63. package/esm2022/lib/components/kv-inputs/kv-input-calendar/kv-input-calendar.component.mjs +89 -89
  64. package/esm2022/lib/components/kv-inputs/kv-input-mask/kv-input-mask.component.mjs +29 -29
  65. package/esm2022/lib/components/kv-inputs/kv-input-number/kv-input-number.component.mjs +59 -59
  66. package/esm2022/lib/components/kv-inputs/kv-input-password/kv-input-password.component.mjs +33 -33
  67. package/esm2022/lib/components/kv-inputs/kv-input-text/kv-input-text.component.mjs +21 -21
  68. package/esm2022/lib/components/kv-inputs/kv-input-text-checkbox/kv-input-text-checkbox.component.mjs +42 -42
  69. package/esm2022/lib/components/kv-inputs/kv-input-textarea/kv-input-textarea.component.mjs +43 -43
  70. package/esm2022/lib/components/kv-inputs/kv-input-time/kv-input-time.component.mjs +24 -24
  71. package/esm2022/lib/components/kv-inputs/kv-inputs.module.mjs +108 -108
  72. package/esm2022/lib/components/kv-inputs/kv-multi-select/kv-multi-select.component.mjs +44 -44
  73. package/esm2022/lib/components/kv-inputs/kv-radio-group/kv-radio-group.component.mjs +53 -53
  74. package/esm2022/lib/components/kv-inputs/kv-switch/kv-switch.component.mjs +34 -34
  75. package/esm2022/lib/components/kv-label/kv-label.component.mjs +15 -15
  76. package/esm2022/lib/components/kv-label/kv-label.module.mjs +24 -24
  77. package/esm2022/lib/components/kv-loader/kv-loader.component.mjs +17 -17
  78. package/esm2022/lib/components/kv-loader/kv-loader.module.mjs +28 -28
  79. package/esm2022/lib/components/kv-loader/kv-loader.service.mjs +29 -29
  80. package/esm2022/lib/components/kv-login/kv-login.component.mjs +52 -52
  81. package/esm2022/lib/components/kv-login/kv-login.module.mjs +47 -47
  82. package/esm2022/lib/components/kv-menu/kv-menu.component.mjs +189 -188
  83. package/esm2022/lib/components/kv-menu/kv-menu.module.mjs +47 -47
  84. package/esm2022/lib/components/kv-modal/kv-modal.component.mjs +67 -67
  85. package/esm2022/lib/components/kv-modal/kv-modal.module.mjs +31 -31
  86. package/esm2022/lib/components/kv-orgchart/kv-orgchart.component.mjs +100 -100
  87. package/esm2022/lib/components/kv-orgchart/kv-orgchart.module.mjs +24 -24
  88. package/esm2022/lib/components/kv-page-form/kv-page-form.component.mjs +147 -147
  89. package/esm2022/lib/components/kv-page-form/kv-page-form.module.mjs +38 -38
  90. package/esm2022/lib/components/kv-pick-list/kv-pick-list.component.mjs +48 -48
  91. package/esm2022/lib/components/kv-pick-list/kv-pick-list.module.mjs +32 -32
  92. package/esm2022/lib/components/kv-progress-bar/kv-progress-bar.component.mjs +58 -58
  93. package/esm2022/lib/components/kv-progress-bar/kv-progress-bar.module.mjs +28 -28
  94. package/esm2022/lib/components/kv-table/kv-table.component.mjs +554 -554
  95. package/esm2022/lib/components/kv-table/kv-table.module.mjs +36 -36
  96. package/esm2022/lib/components/kv-table-edit/kv-table-edit.component.mjs +567 -567
  97. package/esm2022/lib/components/kv-table-edit/kv-table-edit.module.mjs +34 -34
  98. package/esm2022/lib/components/kv-tree-table/kv-tree-table.component.mjs +215 -215
  99. package/esm2022/lib/components/kv-tree-table/kv-tree-table.module.mjs +28 -28
  100. package/esm2022/lib/components/kv-tree-view/kv-tree-view.component.mjs +30 -30
  101. package/esm2022/lib/components/kv-tree-view/kv-tree-view.module.mjs +28 -28
  102. package/esm2022/lib/components/kv-workspace/kv-workspace.component.mjs +178 -178
  103. package/esm2022/lib/components/kv-workspace/kv-workspace.module.mjs +51 -51
  104. package/esm2022/public-api.mjs +167 -169
  105. package/fesm2022/keevo-components.mjs +5406 -5790
  106. package/fesm2022/keevo-components.mjs.map +1 -1
  107. package/index.d.ts +5 -5
  108. package/lib/api/base-components/base-component-button.d.ts +14 -14
  109. package/lib/api/base-components/base-component-chart.d.ts +40 -40
  110. package/lib/api/base-components/base-component-crud-form.d.ts +145 -145
  111. package/lib/api/base-components/base-component-crud-list.d.ts +63 -63
  112. package/lib/api/base-components/base-component-crud.d.ts +36 -36
  113. package/lib/api/base-components/base-component-dropdown-external.d.ts +15 -15
  114. package/lib/api/base-components/base-component-dropdown.d.ts +44 -44
  115. package/lib/api/base-components/base-component-input.d.ts +31 -31
  116. package/lib/api/base-components/base-component-multi-select.d.ts +35 -35
  117. package/lib/api/base-components/base-component.d.ts +22 -22
  118. package/lib/api/components/chart/chart.config.d.ts +11 -11
  119. package/lib/api/components/chart/chart.model.d.ts +9 -9
  120. package/lib/api/components/chart/orchart.config.d.ts +35 -35
  121. package/lib/api/components/chart/orchart.item.d.ts +26 -26
  122. package/lib/api/components/dropdown/filtro.combo.d.ts +4 -4
  123. package/lib/api/components/table/action-item.d.ts +11 -11
  124. package/lib/api/components/table/kv-menuitem.d.ts +10 -10
  125. package/lib/api/components/table/table-dropdown-control.d.ts +6 -6
  126. package/lib/api/components/table/table.config.column.d.ts +25 -25
  127. package/lib/api/components/table/table.config.d.ts +19 -19
  128. package/lib/api/components/table/table.paginate.d.ts +6 -6
  129. package/lib/api/components/table/tabledit.config.d.ts +8 -8
  130. package/lib/api/components/table/tableedit.config.column.d.ts +10 -10
  131. package/lib/api/directives/template/template.directive.d.ts +11 -11
  132. package/lib/api/helpers/component-providers.d.ts +2 -2
  133. package/lib/api/helpers/keevo-validators.d.ts +11 -11
  134. package/lib/api/helpers/translate-primeng.d.ts +4 -4
  135. package/lib/api/models/menu/menu.model.d.ts +10 -10
  136. package/lib/api/models/menu/menucompleto.model.d.ts +6 -6
  137. package/lib/api/models/menu/sistemamenu.model.d.ts +8 -8
  138. package/lib/api/modules/primeng.module.d.ts +62 -61
  139. package/lib/api/pipes/codigofile.pipe.d.ts +7 -7
  140. package/lib/api/pipes/cpfcnpj.pipe.d.ts +7 -7
  141. package/lib/api/pipes/mask.pipe.d.ts +7 -7
  142. package/lib/api/pipes/pipes.module.d.ts +11 -11
  143. package/lib/api/pipes/telefone.pipe.d.ts +7 -7
  144. package/lib/api/services/base.api.service.d.ts +25 -25
  145. package/lib/api/services/breadcrumbs.service.d.ts +16 -16
  146. package/lib/api/services/component.service.d.ts +11 -11
  147. package/lib/api/services/form.service.d.ts +28 -28
  148. package/lib/api/services/imagens.service.d.ts +10 -10
  149. package/lib/api/services/notification.service.d.ts +25 -25
  150. package/lib/api/services/object.service.d.ts +9 -9
  151. package/lib/components/keevo-components.module.d.ts +24 -25
  152. package/lib/components/kv-avatar/kv-avatar.component.d.ts +22 -22
  153. package/lib/components/kv-avatar/kv-avatar.module.d.ts +10 -10
  154. package/lib/components/kv-buttons/kv-button-personalize/kv-button-personalize.component.d.ts +13 -13
  155. package/lib/components/kv-buttons/kv-button-popup/kv-button-popup.component.d.ts +13 -13
  156. package/lib/components/kv-buttons/kv-button-secondary/kv-button-secondary.component.d.ts +7 -7
  157. package/lib/components/kv-buttons/kv-button-success/kv-button-success.component.d.ts +7 -7
  158. package/lib/components/kv-buttons/kv-button.module.d.ts +11 -11
  159. package/lib/components/kv-carousel/kv-carousel.component.d.ts +16 -16
  160. package/lib/components/kv-carousel/kv-carousel.module.d.ts +9 -9
  161. package/lib/components/kv-chart/kv-chart.component.d.ts +56 -56
  162. package/lib/components/kv-chart/kv-chart.module.d.ts +10 -10
  163. package/lib/components/kv-error/kv-error.component.d.ts +12 -12
  164. package/lib/components/kv-error/kv-error.module.d.ts +10 -10
  165. package/lib/components/kv-inputs/kv-check/kv-check.component.d.ts +11 -11
  166. package/lib/components/kv-inputs/kv-dropdown/kv-dropdown.component.d.ts +14 -14
  167. package/lib/components/kv-inputs/kv-editor/kv-editor.component.d.ts +36 -36
  168. package/lib/components/kv-inputs/kv-input-calendar/kv-input-calendar.component.d.ts +27 -27
  169. package/lib/components/kv-inputs/kv-input-mask/kv-input-mask.component.d.ts +12 -12
  170. package/lib/components/kv-inputs/kv-input-number/kv-input-number.component.d.ts +19 -19
  171. package/lib/components/kv-inputs/kv-input-password/kv-input-password.component.d.ts +13 -13
  172. package/lib/components/kv-inputs/kv-input-text/kv-input-text.component.d.ts +9 -9
  173. package/lib/components/kv-inputs/kv-input-text-checkbox/kv-input-text-checkbox.component.d.ts +16 -16
  174. package/lib/components/kv-inputs/kv-input-textarea/kv-input-textarea.component.d.ts +16 -16
  175. package/lib/components/kv-inputs/kv-input-time/kv-input-time.component.d.ts +10 -10
  176. package/lib/components/kv-inputs/kv-inputs.module.d.ts +25 -25
  177. package/lib/components/kv-inputs/kv-multi-select/kv-multi-select.component.d.ts +15 -15
  178. package/lib/components/kv-inputs/kv-radio-group/kv-radio-group.component.d.ts +18 -18
  179. package/lib/components/kv-inputs/kv-switch/kv-switch.component.d.ts +14 -14
  180. package/lib/components/kv-label/kv-label.component.d.ts +7 -7
  181. package/lib/components/kv-label/kv-label.module.d.ts +8 -8
  182. package/lib/components/kv-loader/kv-loader.component.d.ts +8 -8
  183. package/lib/components/kv-loader/kv-loader.module.d.ts +9 -9
  184. package/lib/components/kv-loader/kv-loader.service.d.ts +10 -10
  185. package/lib/components/kv-login/kv-login.component.d.ts +30 -30
  186. package/lib/components/kv-login/kv-login.module.d.ts +13 -13
  187. package/lib/components/kv-menu/kv-menu.component.d.ts +60 -61
  188. package/lib/components/kv-menu/kv-menu.module.d.ts +13 -13
  189. package/lib/components/kv-modal/kv-modal.component.d.ts +20 -20
  190. package/lib/components/kv-modal/kv-modal.module.d.ts +10 -10
  191. package/lib/components/kv-orgchart/kv-orgchart.component.d.ts +27 -27
  192. package/lib/components/kv-orgchart/kv-orgchart.module.d.ts +9 -9
  193. package/lib/components/kv-page-form/kv-page-form.component.d.ts +70 -70
  194. package/lib/components/kv-page-form/kv-page-form.module.d.ts +11 -11
  195. package/lib/components/kv-pick-list/kv-pick-list.component.d.ts +20 -20
  196. package/lib/components/kv-pick-list/kv-pick-list.module.d.ts +10 -10
  197. package/lib/components/kv-progress-bar/kv-progress-bar.component.d.ts +67 -67
  198. package/lib/components/kv-progress-bar/kv-progress-bar.module.d.ts +9 -9
  199. package/lib/components/kv-table/kv-table.component.d.ts +113 -113
  200. package/lib/components/kv-table/kv-table.module.d.ts +11 -11
  201. package/lib/components/kv-table-edit/kv-table-edit.component.d.ts +116 -116
  202. package/lib/components/kv-table-edit/kv-table-edit.module.d.ts +12 -12
  203. package/lib/components/kv-tree-table/kv-tree-table.component.d.ts +42 -42
  204. package/lib/components/kv-tree-table/kv-tree-table.module.d.ts +9 -9
  205. package/lib/components/kv-tree-view/kv-tree-view.component.d.ts +14 -14
  206. package/lib/components/kv-tree-view/kv-tree-view.module.d.ts +9 -9
  207. package/lib/components/kv-workspace/kv-workspace.component.d.ts +46 -46
  208. package/lib/components/kv-workspace/kv-workspace.module.d.ts +14 -14
  209. package/package.json +2 -2
  210. package/public-api.d.ts +163 -165
  211. package/esm2022/lib/components/kv-treetable/kv-treetable.component.mjs +0 -371
  212. package/esm2022/lib/components/kv-treetable/kv-treetable.module.mjs +0 -32
  213. package/lib/components/kv-treetable/kv-treetable.component.d.ts +0 -85
  214. package/lib/components/kv-treetable/kv-treetable.module.d.ts +0 -11
@@ -1,567 +1,567 @@
1
- import { Component, EventEmitter, Input, Output, HostListener } from '@angular/core';
2
- import { FormControl } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "../../../public-api";
6
- import * as i3 from "primeng/api";
7
- import * as i4 from "primeng/autofocus";
8
- import * as i5 from "primeng/button";
9
- import * as i6 from "primeng/contextmenu";
10
- import * as i7 from "primeng/tooltip";
11
- import * as i8 from "primeng/dropdown";
12
- import * as i9 from "primeng/inputtext";
13
- import * as i10 from "primeng/menu";
14
- import * as i11 from "primeng/panel";
15
- import * as i12 from "primeng/ripple";
16
- import * as i13 from "primeng/table";
17
- import * as i14 from "primeng/toast";
18
- import * as i15 from "@angular/forms";
19
- import * as i16 from "../kv-inputs/kv-input-calendar/kv-input-calendar.component";
20
- import * as i17 from "../kv-inputs/kv-input-mask/kv-input-mask.component";
21
- import * as i18 from "../kv-inputs/kv-input-number/kv-input-number.component";
22
- import * as i19 from "../kv-inputs/kv-input-text/kv-input-text.component";
23
- import * as i20 from "../kv-inputs/kv-switch/kv-switch.component";
24
- import * as i21 from "../../api/pipes/mask.pipe";
25
- export class KvTableEditComponent {
26
- set setConfig(value) {
27
- this.config = {
28
- enableCation: value.enableCation || true,
29
- enableSelect: value.enableSelect || false,
30
- enableFilter: value.enableFilter || true,
31
- ...value,
32
- };
33
- // if (this.config.enableFilter) {
34
- // this.config.columns.forEach((col) => {
35
- // this.globalFilterFields.push(col.field);
36
- // });
37
- // }
38
- }
39
- constructor(datePipe, decimalPipe, codigoFipePipe, cpfCnpjPipe, telefonePipe, notificationService) {
40
- this.datePipe = datePipe;
41
- this.decimalPipe = decimalPipe;
42
- this.codigoFipePipe = codigoFipePipe;
43
- this.cpfCnpjPipe = cpfCnpjPipe;
44
- this.telefonePipe = telefonePipe;
45
- this.notificationService = notificationService;
46
- this.collapsed = false;
47
- this.globalFilterFields = [];
48
- this.editMode = 'cell';
49
- this.selectedItems = [];
50
- this.paginator = true;
51
- this.rows = 5;
52
- this.pageLinksOptions = 1;
53
- this.showFirstLastIcon = false;
54
- this.applyStyle = (rowData, col) => '';
55
- this.acoesLinhaTabela = true;
56
- this.filterColumnsBtn = false;
57
- this.filtrosAvancados = false;
58
- this.scrollHeight = '';
59
- this.isTableScrollable = false;
60
- this.rowTrackBy = (index, item) => item;
61
- this.responsiveLayout = true;
62
- this.espacamentoPai = '2px';
63
- this.espacamentoLateral = true;
64
- this.rightCollapse = false;
65
- this.onFilter = new EventEmitter();
66
- this.selectedSize = '';
67
- this.menuItems = [];
68
- this.imgDefault = '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';
69
- this.isExpanded = false;
70
- this.clonedDataSource = {};
71
- /** Emite evento de salvamento da linha */
72
- this.onRowSave = new EventEmitter();
73
- this.onActiveItem = new EventEmitter();
74
- this.onActiveItemLote = new EventEmitter();
75
- this.onPaginate = new EventEmitter();
76
- this.onSelectionChange = new EventEmitter();
77
- this.doubleClickEvent = new EventEmitter();
78
- this.filterField = new EventEmitter();
79
- this.onSwitchTableChange = new EventEmitter();
80
- this.selectedProduct = {
81
- rowData: {},
82
- editing: false
83
- };
84
- this.isRowSelectable = this.isRowSelectable.bind(this);
85
- }
86
- ngOnInit() {
87
- this.tamanhoTela = window.innerWidth;
88
- this.items = [
89
- {
90
- label: 'Editar linha', icon: 'pi pi-fw pi-pencil', command: () => {
91
- const element = document.getElementById('rowEdit' + this.selectedProduct.rowData[this.config.dataKey]);
92
- if (element && !this.config.disableEditRowFunction?.(this.selectedProduct.rowData)) {
93
- element.click();
94
- }
95
- else {
96
- this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
97
- }
98
- this.onRowEditInit(this.selectedProduct);
99
- }
100
- },
101
- {
102
- label: 'Cancelar edição', icon: 'pi pi-fw pi-times', command: (data) => {
103
- const element = document.getElementById('rowCancel' + this.selectedProduct.rowData[this.config.dataKey]);
104
- if (element) {
105
- element.click();
106
- }
107
- else {
108
- this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
109
- }
110
- }
111
- },
112
- {
113
- label: 'Salvar edição', icon: 'pi pi-fw pi-save', command: (data) => {
114
- const element = document.getElementById('rowSave' + this.selectedProduct.rowData[this.config.dataKey]);
115
- if (element) {
116
- element.click(); // Dispara um evento de clique no elemento com ID 'teste'
117
- }
118
- else {
119
- this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
120
- }
121
- }
122
- },
123
- ];
124
- }
125
- ngDoCheck() {
126
- this.items[0].visible = !this.selectedProduct.editing && this.isEditableTable() !== false;
127
- this.items[1].visible = this.selectedProduct.editing && this.isEditableTable() !== false;
128
- this.items[2].visible = this.selectedProduct.editing && this.isEditableTable() !== false;
129
- }
130
- dbClickEdit() {
131
- const element = document.getElementById('rowEdit' + this.selectedItem[this.config.dataKey]);
132
- if (element) {
133
- element.click();
134
- }
135
- else {
136
- this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
137
- }
138
- }
139
- isRowSelectable(event) {
140
- return !this.isDisabledCheckbox(event.data);
141
- }
142
- ngOnChanges(changes) {
143
- //Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
144
- //Add '${implements OnChanges}' to the class.
145
- if (changes['setConfig'] && this.config) {
146
- this.config.columns.forEach((e) => {
147
- if (e.fieldControlType == 'dropdown') {
148
- this.listarDrop(e.fieldDropDownControl?.fieldControlDropdownService, e);
149
- }
150
- });
151
- }
152
- }
153
- onRowEditInit(rowData) {
154
- this.clonedDataSource[rowData.id] = { ...rowData };
155
- }
156
- onRowEditSave(rowData, index) {
157
- let errors = [];
158
- //Validação do formulario fake
159
- this.config.columns.forEach((col) => {
160
- if (col.required ?? true) {
161
- if (!rowData[col.field])
162
- this.notificationService.toastWarn(`O campo ${col.header} e obrigatório! `);
163
- }
164
- if (col.validator) {
165
- const tempFormControl = new FormControl(rowData[col.field], col.validator);
166
- tempFormControl.markAllAsTouched();
167
- tempFormControl.valid;
168
- if (tempFormControl.invalid) {
169
- this.notificationService.toastWarn(`Erro ao validar dados do campo: ${col.header}! `);
170
- errors.push({ erro: "Campo invalido", campo: rowData[col.field] });
171
- }
172
- }
173
- });
174
- if (errors.length == 0) {
175
- this.onRowSave.emit(rowData);
176
- delete this.clonedDataSource[rowData.id];
177
- }
178
- else {
179
- this.notificationService.toastWarn(`Erro de validação de dados! `);
180
- // this.onRowEditCancel(rowData, index)
181
- // this.onRowEditInit(rowData)
182
- this.dataSource[index] = this.clonedDataSource[rowData.id];
183
- delete this.clonedDataSource[rowData.id];
184
- }
185
- }
186
- onRowEditCancel(product, index) {
187
- this.dataSource[index] = this.clonedDataSource[product.id];
188
- delete this.clonedDataSource[product.id];
189
- }
190
- async listarDrop(service, col, indtodos) {
191
- const column = this.config.columns?.indexOf(col);
192
- if (!col.fieldDropDownControl.fieldControlDropdownSource)
193
- await service.Listar(indtodos || '').subscribe({
194
- next: (data) => {
195
- if (column) {
196
- if (this.config && this.config.columns && column !== undefined) {
197
- // @ts-ignore
198
- this.config.columns[column].fieldDropDownControl.fieldControlDropdownSource = data;
199
- }
200
- return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
201
- }
202
- }
203
- });
204
- else
205
- return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
206
- }
207
- retornaDescricaoDrop(rowData, col) {
208
- const data = col.fieldDropDownControl?.fieldControlDropdownSource;
209
- const idobjeto = col.fieldDropDownControl?.idobjeto;
210
- const descricaoobjeto = col.fieldDropDownControl?.descricaoobjeto;
211
- // @ts-ignore
212
- const valorAtual = rowData[col.field];
213
- if (data && idobjeto && descricaoobjeto)
214
- return data?.find((item) => item[idobjeto] == valorAtual)[descricaoobjeto];
215
- else
216
- return 'Carregando';
217
- }
218
- onGlobalFilter(table, event) {
219
- this.onFilter.emit(event.target.value);
220
- table.filterGlobal(event.target.value, 'contains');
221
- }
222
- onWindowResize() {
223
- this.adjustTableSize();
224
- this.tamanhoTela = window.innerWidth;
225
- }
226
- adjustTableSize() {
227
- if (this.tableSize < 800) {
228
- this.selectedSize = 'p-datatable-sm';
229
- }
230
- else {
231
- this.selectedSize = '';
232
- }
233
- }
234
- paginate($event) {
235
- if ($event) {
236
- let paginaInicial = ($event?.first > 0 ? $event.first / $event.rows : $event.first) + 1;
237
- let termoPesquisa = '';
238
- let ordenacao = '';
239
- if ($event.globalFilter)
240
- termoPesquisa = $event.globalFilter;
241
- if ($event.sortField)
242
- ordenacao = `${$event.sortField} ${$event.sortOrder === 1 ? 'ASC' : 'DESC'}`;
243
- const objeto = {
244
- paginaInicial: paginaInicial,
245
- tamanhoPagina: $event.rows,
246
- termoPesquisa: termoPesquisa,
247
- ordenacao: ordenacao,
248
- };
249
- this.onPaginate.emit(objeto);
250
- }
251
- }
252
- isBooleanField(rowData, col) {
253
- return col.fieldType == 'boolean';
254
- }
255
- isChipField(col) {
256
- return col.fieldType == 'chip';
257
- }
258
- isImageField(col) {
259
- let retorno = col.fieldType && col.fieldType === 'image' ? true : false;
260
- return retorno;
261
- }
262
- returnRowClass(rowData, col) {
263
- let value = rowData[col.field];
264
- let rowClass;
265
- this.tableSize > 800 ? (rowClass = 'text-base') : (rowClass = 'text-sm');
266
- if (col.expiredDate == true) {
267
- new Date(value) < new Date()
268
- ? (rowClass = rowClass + ' text-red-400 font-semibold')
269
- : '';
270
- }
271
- return rowClass;
272
- }
273
- transformValue(rowData, col) {
274
- let value = rowData[col.field];
275
- if (value != null) {
276
- if (!col.pipe) {
277
- return value;
278
- }
279
- switch (col.pipe) {
280
- case 'date':
281
- return this.datePipe.transform(value, 'dd/MM/yyyy');
282
- case 'decimal':
283
- return this.decimalPipe.transform(value, '1.2-2', 'pt-BR');
284
- case 'cpfcnpj':
285
- return this.cpfCnpjPipe.transform(value);
286
- case 'telefone':
287
- return this.telefonePipe.transform(value);
288
- case 'codigofipe':
289
- return this.codigoFipePipe.transform(value);
290
- case 'money':
291
- return this.formatarValor(value);
292
- case 'percentage':
293
- return `${value} %`;
294
- default:
295
- break;
296
- }
297
- }
298
- }
299
- alignColunasHeader(col) {
300
- if (col.align) {
301
- if (col.align == 'right')
302
- return 'justify-content: end';
303
- else
304
- return '';
305
- }
306
- else
307
- return '';
308
- }
309
- centralizarColunas(col) {
310
- if (col.centralize) {
311
- return 'text-align: center; ';
312
- }
313
- else
314
- return '';
315
- }
316
- alignColunas(col) {
317
- if (col.align) {
318
- return `text-align: ${col.align}`;
319
- }
320
- else
321
- return '';
322
- }
323
- returnClassIcon(rowData, col) {
324
- return this.retornarRow(rowData, col, 'iconrow');
325
- }
326
- returnTooltipIcon(rowData, col) {
327
- return this.retornarRow(rowData, col, 'tooltipiconrow');
328
- }
329
- returnClassChip(rowData, col) {
330
- return `chip-style w-auto border-round-2xl p-2 text-${this.retornarRow(rowData, col, 'stylechip')} border-${this.retornarRow(rowData, col, 'stylechip')}`;
331
- }
332
- retornarRow(rowData, col, field) {
333
- const _rowaction = this.config.rows ? this.config.rows[col.field] : null;
334
- const _field = _rowaction && _rowaction[field]
335
- ? _rowaction[field].constructor === Function
336
- ? _rowaction[field].apply(this, [rowData])
337
- : _rowaction[field]
338
- : null;
339
- return _field;
340
- }
341
- selectionChange(value = []) {
342
- this.onSelectionChange.emit(value);
343
- }
344
- formatarValor(valor) {
345
- const formatter = new Intl.NumberFormat('pt-BR', {
346
- style: 'currency',
347
- currency: 'BRL',
348
- });
349
- return formatter.format(valor);
350
- }
351
- loadImage(rowData, col) {
352
- /*
353
- Nossa coluna de imagem trabalha com strings do tipo: base64 ou url
354
- */
355
- let retorno = `data:image/jpg;base64, ${this.imgDefault}`;
356
- if (rowData && col && rowData[col.field] && rowData[col.field] !== '') {
357
- if (rowData[col.field].includes('http'))
358
- retorno = rowData[col.field];
359
- else
360
- retorno = `data:image/jpg;base64, ${rowData[col.field]}`;
361
- }
362
- return retorno;
363
- }
364
- getCustomTemplate(templatename) {
365
- return this._templates[templatename];
366
- }
367
- exibirCampo(field, rowData) {
368
- let visible = field.visible ? field.visible(rowData) : true;
369
- return visible;
370
- }
371
- activeItem(rowData) {
372
- this.selectedItem = rowData;
373
- this.onActiveItem.emit({ rowData: rowData });
374
- }
375
- activeItemLote(rowData) {
376
- this.onActiveItemLote.emit(rowData);
377
- }
378
- retornarCampo(action, rowData, field) {
379
- const _function = action.dynamicfields
380
- ? action.dynamicfields[field]
381
- : null;
382
- const _field = _function
383
- ? _function.apply(action, [rowData])
384
- : action[field];
385
- return _field;
386
- }
387
- callDisabled(action, data) {
388
- if (action?.disabled) {
389
- return action.disabled(data);
390
- }
391
- return false;
392
- }
393
- criarMenusModal(data) {
394
- if (this.config.actions && data) {
395
- const items = this.config.actions.map((action) => {
396
- const icon = this.retornarCampo(action, data, 'icon');
397
- const tooltip = this.retornarCampo(action, data, 'tooltip');
398
- const label = this.retornarCampo(action, data, 'label');
399
- const command = this.retornarCampo(action, data, 'command');
400
- const visible = action.visible
401
- ? action.visible(data)
402
- : true;
403
- const disabled = action.disabled
404
- ? action.disabled(data)
405
- : false;
406
- const menuInsert = {
407
- label,
408
- icon,
409
- tooltip,
410
- command,
411
- disabled,
412
- visible,
413
- };
414
- let item = this.menuItems.filter((x) => x.command == menuInsert.command);
415
- if (item.length == 0)
416
- this.menuItems.push(menuInsert);
417
- else {
418
- if (menuInsert.label != item[0].label) {
419
- let index = this.menuItems.indexOf(item[0]);
420
- this.menuItems.splice(index, 1);
421
- }
422
- if (menuInsert.visible != item[0].visible) {
423
- let index = this.menuItems.indexOf(item[0]);
424
- this.menuItems.splice(index, 1);
425
- }
426
- if (menuInsert.disabled != item[0].disabled) {
427
- let index = this.menuItems.indexOf(item[0]);
428
- this.menuItems.splice(index, 1);
429
- }
430
- }
431
- });
432
- }
433
- }
434
- validaLinhaAcaoVazia(rowData) {
435
- var algumItemVisivel = this.config.actions.some((a) => {
436
- if (typeof a.visible === 'function') {
437
- return a.visible(rowData) === true;
438
- }
439
- else {
440
- return true; // Retorna true se a.visible(rowData) não existir
441
- }
442
- });
443
- return !algumItemVisivel;
444
- }
445
- doubleClick(e, rowData) {
446
- let eventDoubleClick = { event: e, rowData: rowData };
447
- let array = [];
448
- e.target.classList.forEach((x) => array.push(x));
449
- //if (array.find((x: any) => x == 'ng-star-inserted') != undefined)
450
- this.doubleClickEvent.emit(eventDoubleClick);
451
- }
452
- isDisabledCheckbox(rowData) {
453
- return this.config.disableControlCheckboxFunction
454
- ? this.config.disableControlCheckboxFunction(rowData)
455
- : false;
456
- }
457
- returnTooltipRow(rowData, col) {
458
- return this.retornarRow(rowData, col, 'tooltiprow');
459
- }
460
- isSwitchField(col) {
461
- let retorno = col.fieldType && col.fieldType === 'switch' ? true : false;
462
- return retorno;
463
- }
464
- onSwitchChange(estado, rowData, col) {
465
- this.onSwitchTableChange.emit({
466
- estado: estado,
467
- rowData: rowData,
468
- col: col
469
- });
470
- }
471
- isButtonDisable(action, rowData, commandEvent) {
472
- if (this.callDisabled(action, rowData)) {
473
- return '';
474
- }
475
- else
476
- return this.activeItem(rowData), action?.command(commandEvent);
477
- }
478
- isDisableEditRowFunction(rowData) {
479
- return this.config.disableEditRowFunction ? this.config.disableEditRowFunction(rowData) : false;
480
- }
481
- isDisableEditRowCellFunction(rowData, col) {
482
- return col.disableEditRowCellFunction ? col.disableEditRowCellFunction(rowData) : false;
483
- }
484
- isEditableTable() {
485
- if (!this.config.columns)
486
- return null;
487
- return this.config.columns.some((column) => 'fieldControlType' in column);
488
- }
489
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: KvTableEditComponent, deps: [{ token: i1.DatePipe }, { token: i1.DecimalPipe }, { token: i2.CodigoFipePipe }, { token: i2.CpfCnpjPipe }, { token: i2.TelefonePipe }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
490
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: KvTableEditComponent, selector: "kv-table-edit", inputs: { setConfig: ["config", "setConfig"], dataSource: "dataSource", editMode: "editMode", selectedItems: "selectedItems", totalRecords: "totalRecords", paginator: "paginator", rowsPerPageOptions: "rowsPerPageOptions", rows: "rows", pageLinksOptions: "pageLinksOptions", showFirstLastIcon: "showFirstLastIcon", tableSize: "tableSize", applyStyle: "applyStyle", acoesLinhaTabela: "acoesLinhaTabela", filterColumnsBtn: "filterColumnsBtn", filtrosAvancados: "filtrosAvancados", scrollHeight: "scrollHeight", isTableScrollable: "isTableScrollable", rowTrackBy: "rowTrackBy", responsiveLayout: "responsiveLayout", espacamentoPai: "espacamentoPai", espacamentoLateral: "espacamentoLateral", tamanhoTotalTabela: "tamanhoTotalTabela", rightCollapse: "rightCollapse", _templates: ["templates", "_templates"] }, outputs: { onFilter: "onFilter", onRowSave: "onRowSave", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", onPaginate: "onPaginate", onSelectionChange: "onSelectionChange", doubleClickEvent: "doubleClickEvent", filterField: "filterField", onSwitchTableChange: "onSwitchTableChange" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, usesOnChanges: true, ngImport: i0, template: "\r\n\r\n<div class=\"card\" >\r\n <p-toast></p-toast>\r\n\r\n <p-panel\r\n *ngIf=\"filtrosAvancados\"\r\n header=\"Filtros avan\u00E7ados\"\r\n [toggleable]=\"true\"\r\n [collapsed]=\"true\"\r\n (collapsedChange)=\"collapsed = !collapsed\"\r\n [style]=\"{ 'margin-bottom': '2px' }\"\r\n >\r\n <ng-template pTemplate=\"headericons\">\r\n <i\r\n *ngIf=\"!collapsed\"\r\n class=\"pi pi-filter\"\r\n ></i>\r\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\r\n <i\r\n *ngIf=\"collapsed\"\r\n class=\"pi pi-minus\"\r\n ></i>\r\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </p-panel>\r\n\r\n <p-contextMenu #cm [model]=\"items\"></p-contextMenu>\r\n <p-table\r\n #te\r\n [reorderableColumns]=\"config.reorderableColumns || false\"\r\n *ngIf=\"config\"\r\n [value]=\"dataSource\"\r\n [dataKey]=\"config.dataKey\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [columns]=\"config.columns\"\r\n [editMode]=\"'row'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"400px\"\r\n appendTo=\"body\"\r\n [styleClass]=\"'p-datatable-sm'\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [pageLinks]=\"pageLinksOptions\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy \"\r\n [(contextMenuSelection)]=\"selectedProduct\"\r\n [contextMenu]=\" isEditableTable() ? cm : null\"\r\n >\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n <ng-template\r\n pTemplate=\"caption\"\r\n *ngIf=\"config.enableCation\"\r\n >\r\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\r\n <div class=\"col-12 flex flex-column\">\r\n <div\r\n *ngIf=\"config.title\"\r\n class=\"text-md font-bold my-3\"\r\n >\r\n {{ config.title }}\r\n </div>\r\n <div\r\n *ngIf=\"config.subtitle\"\r\n class=\"text-sm mb-4 font-medium\"\r\n >\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n tamanhoTela < 768 ? 'col-10' : 'col-12'\r\n }} mt-1 mb-2 \">\r\n <span\r\n *ngIf=\"config.enableFilter\"\r\n class=\"p-input-icon-left\"\r\n >\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(te, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n />\r\n </span>\r\n\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end\">\r\n <div\r\n *ngFor=\"let action of config.actionsLote\"\r\n class=\"btns-options\"\r\n [style]=\"{ 'margin-right': '7px' }\"\r\n >\r\n <button\r\n id=\"actionLoteBtns\"\r\n pButton\r\n *ngIf=\"\r\n (selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)\r\n \"\r\n class=\"actionLoteBtns p-button-raised p-button-text\"\r\n (click)=\"\r\n action?.command(commandEvent); activeItemLote(selectedItems)\r\n \"\r\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.backgroundColor]=\"\r\n retornarCampo(action, selectedItems, 'btnColor')\r\n \"\r\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined md-22\"\r\n [style.color]=\"\r\n retornarCampo(action, selectedItems, 'iconBtnColor')\r\n \"\r\n >\r\n {{ retornarCampo(action, selectedItems, \"icon\") }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"header\"\r\n let-columns\r\n >\r\n <tr>\r\n <th\r\n style=\"width: 4rem; border-left: solid 4px transparent\"\r\n *ngIf=\"config.enableSelect\"\r\n >\r\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.min-width]=\"col.width\"\r\n pReorderableColumn\r\n class=\"text-sm\"\r\n >\r\n <div\r\n [class]=\"\r\n centralizarColunas(col) && alignColunasHeader(col) == ''\r\n ? 'flex flex-row justify-content-center'\r\n : 'flex flex-row'\r\n \"\r\n [style]=\"alignColunasHeader(col)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n <p-sortIcon\r\n *ngIf=\"col.sortable === true\"\r\n [field]=\"col.field\"\r\n style=\"font-size: 10px\"\r\n ></p-sortIcon>\r\n\r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\r\n <th *ngIf=\"isEditableTable()\" id=\"th-edit\" style=\"width: 20px\">Editar</th>\r\n </tr>\r\n </ng-template>\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\r\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\"\r\n [pContextMenuRow]=\"{rowData, editing}\"\r\n >\r\n\r\n\r\n <td\r\n *ngIf=\"config.enableSelect\"\r\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\r\n >\r\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n\r\n\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\r\n <td *ngIf=\"col.fieldControlType\"\r\n [id]=\"'rowTable'+ rowData[config.dataKey]\"\r\n pSelectableRowDblClick=\"\"\r\n (click)=\"activeItem(rowData)\"\r\n (dblclick)=\"dbClickEdit()\"\r\n pSelectableRowDblClick=\"\"\r\n class=\"rowTable\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\r\n <!-- Controle de edi\u00E7\u00E3o do campo -->\r\n <ng-template pTemplate=\"input\">\r\n\r\n <ng-container [ngSwitch]=\"col.fieldControlType\">\r\n\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-text [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-number [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-mask [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-switch [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <div [style.width]=\"col.width\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-calendar class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <p-dropdown\r\n [disabled]=\"isDisableEditRowCellFunction(rowData, col)\"\r\n class=\"cellControl col\"\r\n appendTo=\"body\"\r\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\r\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\r\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\r\n [(ngModel)]=\"rowData[col.field]\"\r\n >\r\n </p-dropdown>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n <!-- Valor atual do campo -->\r\n <ng-template pTemplate=\"output\">\r\n <ng-container [ngSwitch]=\"col.fieldControlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container *ngIf=\"rowData[col.field]\">\r\n {{\r\n retornaDescricaoDrop(\r\n rowData,\r\n col\r\n )\r\n }}\r\n <!-- {{rowData[col.field]}} -->\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n {{ rowData[col.field] | date }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n {{ rowData[col.field] | mask:col.mask }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ rowData[col.field] }}\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n class=\"rowTable\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n\r\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\r\n <span *ngIf=\"\r\n !isChipField(col) && !col.iconField && !isImageField(col)\r\n \">\r\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n\r\n <div *ngIf=\"isChipField(col) && !col.iconField\">\r\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\r\n transformValue(rowData, col) }}</span>\r\n </div>\r\n </span>\r\n\r\n <span *ngIf=\"isImageField(col)\">\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n\r\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n\r\n <ng-template #booleanField>\r\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"><span class=\"material-symbols-outlined\">\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n\r\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\r\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\r\n </kv-switch>\r\n </span>\r\n </ng-template>\r\n </td>\r\n\r\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n\r\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\r\n <span *ngIf=\"\r\n !isChipField(col) && !col.iconField && !isImageField(col)\r\n \">\r\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n\r\n <div *ngIf=\"isChipField(col) && !col.iconField\">\r\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ transformValue(rowData, col) }}</span>\r\n </div>\r\n </span>\r\n\r\n <span *ngIf=\"isImageField(col)\">\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n\r\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n\r\n <ng-template #booleanField>\r\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"><span class=\"material-symbols-outlined\">\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n\r\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\r\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\r\n </kv-switch>\r\n </span>\r\n </ng-template>\r\n </td>\r\n\r\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" class=\"rowTable\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\r\n </ng-container>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- Controle de a\u00E7\u00E3o -->\r\n <td [ngClass]=\"{'td-tools': isEditableTable(), 'td-tools-sticky': !isEditableTable() }\"\r\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\r\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\r\n >\r\n <div\r\n class=\"flex flex-row justify-content-end w-full gap-1\"\r\n *ngIf=\"acoesLinhaTabela\"\r\n >\r\n <div\r\n *ngFor=\"let action of config.actions\"\r\n class=\"mr-1\"\r\n >\r\n <!-- <button\r\n id=\"actionBtns\"\r\n pButton\r\n *ngIf=\"exibirCampo(action, rowData)\"\r\n class=\"actionBtns p-button-text p-button-raised\"\r\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\r\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\r\n [tooltipPosition]=\"\r\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\r\n \"\r\n [disabled]=\"callDisabled(action, rowData)\"\r\n >\r\n <span class=\"material-symbols-outlined md-19\">\r\n {{ retornarCampo(action, rowData, \"icon\") }}</span\r\n >\r\n </button> -->\r\n\r\n <span\r\n class=\"material-symbols-outlined {{\r\n callDisabled(action, rowData)\r\n ? 'text-gray-400 cursor-auto'\r\n : 'cursor-pointer'\r\n }}\"\r\n style=\"font-size: 20px\"\r\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\r\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\r\n [tooltipPosition]=\"\r\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\r\n \"\r\n >\r\n {{ retornarCampo(action, rowData, \"icon\") }}\r\n </span>\r\n </div>\r\n </div>\r\n <div\r\n class=\"flex flex-row justify-content-end w-full\"\r\n *ngIf=\"!acoesLinhaTabela\"\r\n >\r\n <!-- <button\r\n id=\"moreVertBtn\"\r\n pButton\r\n class=\"actionBtns p-button-text p-button-raised\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n > -->\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n <!-- </button> -->\r\n\r\n <div *ngFor=\"let action of config.actions\">\r\n {{ criarMenusModal(rowData) }}\r\n </div>\r\n\r\n <!-- <div *ngFor=\"let action of config.actions\">\r\n {{ criarMenusModal(rowData) }}\r\n </div> -->\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n </td>\r\n\r\n <td\r\n class=\"td-tools\"\r\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\r\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\r\n >\r\n <div\r\n class=\"flex flex-row justify-content-end w-full gap-1\"\r\n *ngIf=\"acoesLinhaTabela\"\r\n >\r\n\r\n </div>\r\n <div\r\n class=\"flex flex-row justify-content-end w-full\"\r\n *ngIf=\"!acoesLinhaTabela\"\r\n >\r\n </div>\r\n </td>\r\n\r\n\r\n\r\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- Controle de edi\u00E7\u00E3o -->\r\n <td class=\"td-edit\" *ngIf=\"this.isEditableTable()\" >\r\n <div class=\"flex align-items-center justify-content-center gap-2\">\r\n <button [style.height]=\"'28px'\" [id]=\"'rowEdit' + rowData[config.dataKey] \" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\r\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n (click)=\"onRowEditSave(rowData, ri)\" [id]=\"'rowSave' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\r\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n (click)=\"onRowEditCancel(rowData, ri)\" [id]=\"'rowCancel' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-danger\"></button>\r\n </div>\r\n </td>\r\n\r\n\r\n\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#fff;color:#5289b4}.td-tools{position:sticky;right:52px;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}.td-tools-sticky{position:sticky;right:0;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:15px}.material-symbols-outlined.md-22{font-size:19px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:.9;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.75rem}:host ::ng-deep .p-datatable-table{font-size:.75rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before{transform:translate(1.25rem);height:15px;margin-top:-8px;-webkit-transform:translateX(1.25rem);-moz-transform:translateX(1.25rem);-ms-transform:translateX(1.25rem);-o-transform:translateX(1.25rem)}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider:before{background:#fff;width:1rem;height:1.25rem;height:16px!important;left:.25rem;margin-top:-9px!important;margin-top:-.625rem;border-radius:50%;transition-duration:.2s}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch:not(.p-disabled) .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>div>kv-input-text>span>.inputs{height:15px!important}:host ::ng-deep p-celleditor>div>p-dropdown>.p-dropdown:not(.p-paginator-rpp-options){height:25px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider{height:21px!important}:host ::ng-deep input.p-inputtext.p-component.p-element.p-inputmask.inputs.p-filled{height:15px}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{font-size:.75rem;padding:.5rem 1rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i9.InputText, selector: "[pInputText]" }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i12.Ripple, selector: "[pRipple]" }, { kind: "component", type: i13.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i13.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i13.ContextMenuRow, selector: "[pContextMenuRow]", inputs: ["pContextMenuRow", "pContextMenuRowIndex", "pContextMenuRowDisabled"] }, { kind: "directive", type: i13.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i13.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i13.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i13.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i13.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i13.SelectableRowDblClick, selector: "[pSelectableRowDblClick]", inputs: ["pSelectableRowDblClick", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i13.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i13.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i13.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i13.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i14.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.KvInputCalendarComponent, selector: "kv-input-calendar", inputs: ["isYear", "isMonthYear", "minDate", "maxDate", "showButtonBar", "showIcon", "showTime", "selectionMode"], outputs: ["onSelectionChange", "onSelectionValue"] }, { kind: "component", type: i17.KvInputMaskComponent, selector: "kv-input-mask", inputs: ["mask"], outputs: ["onComplete"] }, { kind: "component", type: i18.KvInputNumberComponent, selector: "kv-input-number", inputs: ["mode", "digits", "min", "max", "suffix"] }, { kind: "component", type: i19.KvInputTextComponent, selector: "kv-input-text" }, { kind: "component", type: i20.KvSwitchComponent, selector: "kv-switch", inputs: ["readonly", "switchValue"], outputs: ["onSwitchChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i21.MaskPipe, name: "mask" }] }); }
491
- }
492
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: KvTableEditComponent, decorators: [{
493
- type: Component,
494
- args: [{ selector: 'kv-table-edit', template: "\r\n\r\n<div class=\"card\" >\r\n <p-toast></p-toast>\r\n\r\n <p-panel\r\n *ngIf=\"filtrosAvancados\"\r\n header=\"Filtros avan\u00E7ados\"\r\n [toggleable]=\"true\"\r\n [collapsed]=\"true\"\r\n (collapsedChange)=\"collapsed = !collapsed\"\r\n [style]=\"{ 'margin-bottom': '2px' }\"\r\n >\r\n <ng-template pTemplate=\"headericons\">\r\n <i\r\n *ngIf=\"!collapsed\"\r\n class=\"pi pi-filter\"\r\n ></i>\r\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\r\n <i\r\n *ngIf=\"collapsed\"\r\n class=\"pi pi-minus\"\r\n ></i>\r\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </p-panel>\r\n\r\n <p-contextMenu #cm [model]=\"items\"></p-contextMenu>\r\n <p-table\r\n #te\r\n [reorderableColumns]=\"config.reorderableColumns || false\"\r\n *ngIf=\"config\"\r\n [value]=\"dataSource\"\r\n [dataKey]=\"config.dataKey\"\r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [columns]=\"config.columns\"\r\n [editMode]=\"'row'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"400px\"\r\n appendTo=\"body\"\r\n [styleClass]=\"'p-datatable-sm'\"\r\n [(selection)]=\"selectedItems\"\r\n [rowSelectable]=\"isRowSelectable\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [rows]=\"rows\"\r\n [paginator]=\"paginator\"\r\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\r\n (selectionChange)=\"selectionChange($event)\"\r\n [rowHover]=\"true\"\r\n [totalRecords]=\"totalRecords\"\r\n [lazy]=\"config.lazy\"\r\n (onLazyLoad)=\"paginate($event)\"\r\n [groupRowsBy]=\"config.fieldGroup\"\r\n [showFirstLastIcon]=\"showFirstLastIcon\"\r\n [pageLinks]=\"pageLinksOptions\"\r\n [scrollable]=\"isTableScrollable\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [rowTrackBy]=\"rowTrackBy \"\r\n [(contextMenuSelection)]=\"selectedProduct\"\r\n [contextMenu]=\" isEditableTable() ? cm : null\"\r\n >\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n <ng-template\r\n pTemplate=\"caption\"\r\n *ngIf=\"config.enableCation\"\r\n >\r\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\r\n <div class=\"col-12 flex flex-column\">\r\n <div\r\n *ngIf=\"config.title\"\r\n class=\"text-md font-bold my-3\"\r\n >\r\n {{ config.title }}\r\n </div>\r\n <div\r\n *ngIf=\"config.subtitle\"\r\n class=\"text-sm mb-4 font-medium\"\r\n >\r\n {{ config.subtitle }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\r\n tamanhoTela < 768 ? 'col-10' : 'col-12'\r\n }} mt-1 mb-2 \">\r\n <span\r\n *ngIf=\"config.enableFilter\"\r\n class=\"p-input-icon-left\"\r\n >\r\n <i class=\"pi pi-search\"></i>\r\n\r\n <input\r\n pInputText\r\n pAutoFocus\r\n [autofocus]=\"true\"\r\n type=\"text\"\r\n (input)=\"onGlobalFilter(te, $event)\"\r\n placeholder=\"Pesquisar...\"\r\n class=\"h-2rem\"\r\n />\r\n </span>\r\n\r\n </div>\r\n\r\n <div class=\"flex flex-row col-1 justify-content-end\">\r\n <div\r\n *ngFor=\"let action of config.actionsLote\"\r\n class=\"btns-options\"\r\n [style]=\"{ 'margin-right': '7px' }\"\r\n >\r\n <button\r\n id=\"actionLoteBtns\"\r\n pButton\r\n *ngIf=\"\r\n (selectedItems.length > 0 || action.showAcoesLote) &&\r\n exibirCampo(action, this.action)\r\n \"\r\n class=\"actionLoteBtns p-button-raised p-button-text\"\r\n (click)=\"\r\n action?.command(commandEvent); activeItemLote(selectedItems)\r\n \"\r\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\r\n [tooltipPosition]=\"'bottom'\"\r\n [style.backgroundColor]=\"\r\n retornarCampo(action, selectedItems, 'btnColor')\r\n \"\r\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined md-22\"\r\n [style.color]=\"\r\n retornarCampo(action, selectedItems, 'iconBtnColor')\r\n \"\r\n >\r\n {{ retornarCampo(action, selectedItems, \"icon\") }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n pTemplate=\"header\"\r\n let-columns\r\n >\r\n <tr>\r\n <th\r\n style=\"width: 4rem; border-left: solid 4px transparent\"\r\n *ngIf=\"config.enableSelect\"\r\n >\r\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\r\n </th>\r\n\r\n <th\r\n *ngFor=\"let col of columns\"\r\n [pSortableColumn]=\"col.field\"\r\n [pSortableColumnDisabled]=\"col.sortable === false\"\r\n [style.min-width]=\"col.width\"\r\n pReorderableColumn\r\n class=\"text-sm\"\r\n >\r\n <div\r\n [class]=\"\r\n centralizarColunas(col) && alignColunasHeader(col) == ''\r\n ? 'flex flex-row justify-content-center'\r\n : 'flex flex-row'\r\n \"\r\n [style]=\"alignColunasHeader(col)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n <p-sortIcon\r\n *ngIf=\"col.sortable === true\"\r\n [field]=\"col.field\"\r\n style=\"font-size: 10px\"\r\n ></p-sortIcon>\r\n\r\n <span\r\n *ngIf=\"col.headerTooltip\"\r\n class=\"material-symbols-outlined flex align-items-center\"\r\n [pTooltip]=\"col.headerTooltip\"\r\n >info</span>\r\n </div>\r\n </th>\r\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\r\n <th *ngIf=\"isEditableTable()\" id=\"th-edit\" style=\"width: 20px\">Editar</th>\r\n </tr>\r\n </ng-template>\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\r\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\r\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\"\r\n [pContextMenuRow]=\"{rowData, editing}\"\r\n >\r\n\r\n\r\n <td\r\n *ngIf=\"config.enableSelect\"\r\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\r\n >\r\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\r\n <p-tableCheckbox\r\n [value]=\"rowData\"\r\n [disabled]=\"isDisabledCheckbox(rowData)\"\r\n (click)=\"activeItemLote(selectedItems)\"\r\n ></p-tableCheckbox>\r\n </td>\r\n\r\n\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\r\n <td *ngIf=\"col.fieldControlType\"\r\n [id]=\"'rowTable'+ rowData[config.dataKey]\"\r\n pSelectableRowDblClick=\"\"\r\n (click)=\"activeItem(rowData)\"\r\n (dblclick)=\"dbClickEdit()\"\r\n pSelectableRowDblClick=\"\"\r\n class=\"rowTable\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\r\n >\r\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\r\n <!-- Controle de edi\u00E7\u00E3o do campo -->\r\n <ng-template pTemplate=\"input\">\r\n\r\n <ng-container [ngSwitch]=\"col.fieldControlType\">\r\n\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-text [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-number [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-mask [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-switch [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <div [style.width]=\"col.width\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <kv-input-calendar class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\r\n <p-dropdown\r\n [disabled]=\"isDisableEditRowCellFunction(rowData, col)\"\r\n class=\"cellControl col\"\r\n appendTo=\"body\"\r\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\r\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\r\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\r\n [(ngModel)]=\"rowData[col.field]\"\r\n >\r\n </p-dropdown>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n <!-- Valor atual do campo -->\r\n <ng-template pTemplate=\"output\">\r\n <ng-container [ngSwitch]=\"col.fieldControlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container *ngIf=\"rowData[col.field]\">\r\n {{\r\n retornaDescricaoDrop(\r\n rowData,\r\n col\r\n )\r\n }}\r\n <!-- {{rowData[col.field]}} -->\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n {{ rowData[col.field] | date }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'mask'\">\r\n {{ rowData[col.field] | mask:col.mask }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n {{ rowData[col.field] }}\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\r\n class=\"rowTable\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n\r\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\r\n <span *ngIf=\"\r\n !isChipField(col) && !col.iconField && !isImageField(col)\r\n \">\r\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n\r\n <div *ngIf=\"isChipField(col) && !col.iconField\">\r\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\r\n transformValue(rowData, col) }}</span>\r\n </div>\r\n </span>\r\n\r\n <span *ngIf=\"isImageField(col)\">\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n\r\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n\r\n <ng-template #booleanField>\r\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"><span class=\"material-symbols-outlined\">\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n\r\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\r\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\r\n </kv-switch>\r\n </span>\r\n </ng-template>\r\n </td>\r\n\r\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n\r\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\r\n <span *ngIf=\"\r\n !isChipField(col) && !col.iconField && !isImageField(col)\r\n \">\r\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\r\n {{ transformValue(rowData, col) }}\r\n </span>\r\n\r\n <div *ngIf=\"isChipField(col) && !col.iconField\">\r\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ transformValue(rowData, col) }}</span>\r\n </div>\r\n </span>\r\n\r\n <span *ngIf=\"isImageField(col)\">\r\n <span>\r\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\r\n </span>\r\n </span>\r\n\r\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\r\n 'material-icons': col.indIconMaterial,\r\n 'material-symbols-outlined mr-2': !col.indIconMaterial\r\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\r\n {{ returnClassIcon(rowData, col) }}\r\n </i>\r\n\r\n <ng-template #booleanField>\r\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\r\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\r\n \"><span class=\"material-symbols-outlined\">\r\n {{ rowData[col.field] ? \"check\" : \"close\" }}\r\n </span>\r\n </i>\r\n\r\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\r\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\r\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\r\n </kv-switch>\r\n </span>\r\n </ng-template>\r\n </td>\r\n\r\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\r\n applyStyle(rowData, col) +\r\n centralizarColunas(col) +\r\n alignColunas(col)\r\n \" class=\"rowTable\">\r\n <span class=\"p-column-title\">{{ col.header }}:</span>\r\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\r\n </ng-container>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- Controle de a\u00E7\u00E3o -->\r\n <td [ngClass]=\"{'td-tools': isEditableTable(), 'td-tools-sticky': !isEditableTable() }\"\r\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\r\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\r\n >\r\n <div\r\n class=\"flex flex-row justify-content-end w-full gap-1\"\r\n *ngIf=\"acoesLinhaTabela\"\r\n >\r\n <div\r\n *ngFor=\"let action of config.actions\"\r\n class=\"mr-1\"\r\n >\r\n <!-- <button\r\n id=\"actionBtns\"\r\n pButton\r\n *ngIf=\"exibirCampo(action, rowData)\"\r\n class=\"actionBtns p-button-text p-button-raised\"\r\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\r\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\r\n [tooltipPosition]=\"\r\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\r\n \"\r\n [disabled]=\"callDisabled(action, rowData)\"\r\n >\r\n <span class=\"material-symbols-outlined md-19\">\r\n {{ retornarCampo(action, rowData, \"icon\") }}</span\r\n >\r\n </button> -->\r\n\r\n <span\r\n class=\"material-symbols-outlined {{\r\n callDisabled(action, rowData)\r\n ? 'text-gray-400 cursor-auto'\r\n : 'cursor-pointer'\r\n }}\"\r\n style=\"font-size: 20px\"\r\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\r\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\r\n [tooltipPosition]=\"\r\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\r\n \"\r\n >\r\n {{ retornarCampo(action, rowData, \"icon\") }}\r\n </span>\r\n </div>\r\n </div>\r\n <div\r\n class=\"flex flex-row justify-content-end w-full\"\r\n *ngIf=\"!acoesLinhaTabela\"\r\n >\r\n <!-- <button\r\n id=\"moreVertBtn\"\r\n pButton\r\n class=\"actionBtns p-button-text p-button-raised\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n > -->\r\n <span\r\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\r\n style=\"font-size: 20px\"\r\n (click)=\"menu.toggle($event); activeItem(rowData)\"\r\n >\r\n more_horiz\r\n </span>\r\n <!-- </button> -->\r\n\r\n <div *ngFor=\"let action of config.actions\">\r\n {{ criarMenusModal(rowData) }}\r\n </div>\r\n\r\n <!-- <div *ngFor=\"let action of config.actions\">\r\n {{ criarMenusModal(rowData) }}\r\n </div> -->\r\n\r\n <p-menu\r\n #menu\r\n [popup]=\"true\"\r\n [model]=\"menuItems\"\r\n appendTo=\"body\"\r\n ></p-menu>\r\n </div>\r\n </td>\r\n\r\n <td\r\n class=\"td-tools\"\r\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\r\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\r\n >\r\n <div\r\n class=\"flex flex-row justify-content-end w-full gap-1\"\r\n *ngIf=\"acoesLinhaTabela\"\r\n >\r\n\r\n </div>\r\n <div\r\n class=\"flex flex-row justify-content-end w-full\"\r\n *ngIf=\"!acoesLinhaTabela\"\r\n >\r\n </div>\r\n </td>\r\n\r\n\r\n\r\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\r\n <!-- Controle de edi\u00E7\u00E3o -->\r\n <td class=\"td-edit\" *ngIf=\"this.isEditableTable()\" >\r\n <div class=\"flex align-items-center justify-content-center gap-2\">\r\n <button [style.height]=\"'28px'\" [id]=\"'rowEdit' + rowData[config.dataKey] \" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\r\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n (click)=\"onRowEditSave(rowData, ri)\" [id]=\"'rowSave' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\r\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n (click)=\"onRowEditCancel(rowData, ri)\" [id]=\"'rowCancel' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-danger\"></button>\r\n </div>\r\n </td>\r\n\r\n\r\n\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#fff;color:#5289b4}.td-tools{position:sticky;right:52px;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}.td-tools-sticky{position:sticky;right:0;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:15px}.material-symbols-outlined.md-22{font-size:19px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:.9;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.75rem}:host ::ng-deep .p-datatable-table{font-size:.75rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before{transform:translate(1.25rem);height:15px;margin-top:-8px;-webkit-transform:translateX(1.25rem);-moz-transform:translateX(1.25rem);-ms-transform:translateX(1.25rem);-o-transform:translateX(1.25rem)}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider:before{background:#fff;width:1rem;height:1.25rem;height:16px!important;left:.25rem;margin-top:-9px!important;margin-top:-.625rem;border-radius:50%;transition-duration:.2s}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch:not(.p-disabled) .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>div>kv-input-text>span>.inputs{height:15px!important}:host ::ng-deep p-celleditor>div>p-dropdown>.p-dropdown:not(.p-paginator-rpp-options){height:25px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider{height:21px!important}:host ::ng-deep input.p-inputtext.p-component.p-element.p-inputmask.inputs.p-filled{height:15px}::ng-deep .p-dropdown-panel .p-dropdown-items .p-dropdown-item{font-size:.75rem;padding:.5rem 1rem}\n"] }]
495
- }], ctorParameters: function () { return [{ type: i1.DatePipe }, { type: i1.DecimalPipe }, { type: i2.CodigoFipePipe }, { type: i2.CpfCnpjPipe }, { type: i2.TelefonePipe }, { type: i2.NotificationService }]; }, propDecorators: { setConfig: [{
496
- type: Input,
497
- args: ['config']
498
- }], dataSource: [{
499
- type: Input
500
- }], editMode: [{
501
- type: Input
502
- }], selectedItems: [{
503
- type: Input
504
- }], totalRecords: [{
505
- type: Input
506
- }], paginator: [{
507
- type: Input
508
- }], rowsPerPageOptions: [{
509
- type: Input
510
- }], rows: [{
511
- type: Input
512
- }], pageLinksOptions: [{
513
- type: Input
514
- }], showFirstLastIcon: [{
515
- type: Input
516
- }], tableSize: [{
517
- type: Input
518
- }], applyStyle: [{
519
- type: Input
520
- }], acoesLinhaTabela: [{
521
- type: Input
522
- }], filterColumnsBtn: [{
523
- type: Input
524
- }], filtrosAvancados: [{
525
- type: Input
526
- }], scrollHeight: [{
527
- type: Input
528
- }], isTableScrollable: [{
529
- type: Input
530
- }], rowTrackBy: [{
531
- type: Input
532
- }], responsiveLayout: [{
533
- type: Input
534
- }], espacamentoPai: [{
535
- type: Input
536
- }], espacamentoLateral: [{
537
- type: Input
538
- }], tamanhoTotalTabela: [{
539
- type: Input
540
- }], rightCollapse: [{
541
- type: Input
542
- }], onFilter: [{
543
- type: Output
544
- }], _templates: [{
545
- type: Input,
546
- args: ['templates']
547
- }], onRowSave: [{
548
- type: Output
549
- }], onActiveItem: [{
550
- type: Output
551
- }], onActiveItemLote: [{
552
- type: Output
553
- }], onPaginate: [{
554
- type: Output
555
- }], onSelectionChange: [{
556
- type: Output
557
- }], doubleClickEvent: [{
558
- type: Output
559
- }], filterField: [{
560
- type: Output
561
- }], onSwitchTableChange: [{
562
- type: Output
563
- }], onWindowResize: [{
564
- type: HostListener,
565
- args: ['window:resize', ['$event']]
566
- }] } });
567
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdGFibGUtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10YWJsZS1lZGl0L2t2LXRhYmxlLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUtZWRpdC9rdi10YWJsZS1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFDTCxXQUFXLEVBRVosTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QnhCLE1BQU0sT0FBTyxvQkFBb0I7SUFNL0IsSUFBcUIsU0FBUyxDQUFDLEtBQXNCO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDekMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtZQUN4QyxHQUFHLEtBQUs7U0FDVCxDQUFDO1FBRUYsa0NBQWtDO1FBQ2xDLDJDQUEyQztRQUMzQywrQ0FBK0M7UUFDL0MsUUFBUTtRQUNSLElBQUk7SUFDTixDQUFDO0lBb0RELFlBQ21CLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLG1CQUF3QztRQUx4QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdB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QUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQStLUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIFRlbXBsYXRlUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIERhdGVQaXBlLFxyXG4gIERlY2ltYWxQaXBlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgVmFsaWRhdG9yRm5cclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE1lbnVJdGVtLFxyXG4gIE1lbnVJdGVtQ29tbWFuZEV2ZW50LFxyXG4gIFNlbGVjdEl0ZW1cclxufSBmcm9tICdwcmltZW5nL2FwaSc7XHJcblxyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBDb2RpZ29GaXBlUGlwZSxcclxuICBDcGZDbnBqUGlwZSxcclxuICBLdk1lbnVJdGVtLFxyXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgVGFibGVDb25maWdDb2x1bW4sXHJcbiAgVGFibGVQYWdpbmF0ZSxcclxuICBUZWxlZm9uZVBpcGVcclxufSBmcm9tICcuLi8uLi8uLi9wdWJsaWMtYXBpJztcclxuXHJcbmltcG9ydCB7IFRhYmxlRWRpdENvbmZpZ0NvbHVtbiB9IGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlZWRpdC5jb25maWcuY29sdW1uJztcclxuaW1wb3J0IFRhYmxlRWRpdENvbmZpZyBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90YWJsZS90YWJsZWRpdC5jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdrdi10YWJsZS1lZGl0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4va3YtdGFibGUtZWRpdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4va3YtdGFibGUtZWRpdC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdlRhYmxlRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uZmlnITogVGFibGVFZGl0Q29uZmlnO1xyXG4gIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCdjb25maWcnKSBzZXQgc2V0Q29uZmlnKHZhbHVlOiBUYWJsZUVkaXRDb25maWcpIHtcclxuICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICBlbmFibGVDYXRpb246IHZhbHVlLmVuYWJsZUNhdGlvbiB8fCB0cnVlLFxyXG4gICAgICBlbmFibGVTZWxlY3Q6IHZhbHVlLmVuYWJsZVNlbGVjdCB8fCBmYWxzZSxcclxuICAgICAgZW5hYmxlRmlsdGVyOiB2YWx1ZS5lbmFibGVGaWx0ZXIgfHwgdHJ1ZSxcclxuICAgICAgLi4udmFsdWUsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGlmICh0aGlzLmNvbmZpZy5lbmFibGVGaWx0ZXIpIHtcclxuICAgIC8vICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcclxuICAgIC8vICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZGF0YVNvdXJjZSE6IGFueVtdO1xyXG4gIEBJbnB1dCgpIGVkaXRNb2RlOiAncm93JyB8ICdjZWxsJyA9ICdjZWxsJztcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkSXRlbSE6IGFueTtcclxuICBASW5wdXQoKSB0b3RhbFJlY29yZHMhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgcGFnaW5hdG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSByb3dzUGVyUGFnZU9wdGlvbnMhOiBudW1iZXJbXTtcclxuICBASW5wdXQoKSByb3dzOiBudW1iZXIgPSA1O1xyXG4gIEBJbnB1dCgpIHBhZ2VMaW5rc09wdGlvbnM6IG51bWJlciA9IDE7XHJcbiAgQElucHV0KCkgc2hvd0ZpcnN0TGFzdEljb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0YWJsZVNpemUhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgYXBwbHlTdHlsZTogRnVuY3Rpb24gPSAocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSA9PiAnJztcclxuICBASW5wdXQoKSBhY29lc0xpbmhhVGFiZWxhOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zQnRuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZmlsdHJvc0F2YW5jYWRvczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaXNUYWJsZVNjcm9sbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSByb3dUcmFja0J5OiBGdW5jdGlvbiA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW07XHJcbiAgQElucHV0KCkgcmVzcG9uc2l2ZUxheW91dDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZXNwYWNhbWVudG9QYWk6IHN0cmluZyA9ICcycHgnO1xyXG4gIEBJbnB1dCgpIGVzcGFjYW1lbnRvTGF0ZXJhbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgdGFtYW5ob1RvdGFsVGFiZWxhITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHJpZ2h0Q29sbGFwc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgb25GaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBASW5wdXQoJ3RlbXBsYXRlcycpIF90ZW1wbGF0ZXMhOiBhbnk7XHJcbiAgdGFtYW5ob1RlbGEhOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRTaXplOiBzdHJpbmcgPSAnJztcclxuICBzZWxlY3RlSWVtcyE6IGFueVtdO1xyXG4gIG1lbnVJdGVtczogS3ZNZW51SXRlbVtdID0gW107XHJcbiAgaW1nRGVmYXVsdDogc3RyaW5nID1cclxuICAgICcvOWovNEFBUVNrWkpSZ0FCQVFJQWRnQjJBQUQvNFFCaVJYaHBaZ0FBVFUwQUtnQUFBQWdBQlFFU0FBTUFBQUFCQUFFQUFBRWFBQVVBQUFBQkFBQUFTZ0ViQUFVQUFBQUJBQUFBVWdFb0FBTUFBQUFCQUFNQUFBSVRBQU1BQUFBQkFBRUFBQUFBQUFBQUFBQjJBQUFBQVFBQUFIWUFBQUFCLzlzQVF3QURBZ0lDQWdJREFnSUNBd01EQXdRR0JBUUVCQVFJQmdZRkJna0lDZ29KQ0FrSkNnd1BEQW9MRGdzSkNRMFJEUTRQRUJBUkVBb01FaE1TRUJNUEVCQVEvOXNBUXdFREF3TUVBd1FJQkFRSUVBc0pDeEFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUS84QUFFUWdBa0FDUUF3RVJBQUlSQVFNUkFmL0VBQjBBQVFBQkJBTUJBQUFBQUFBQUFBQUFBQUFHQVFJSENBTUVDUVgveEFCQkVBQUNBUVFBQlFJQ0NBUURCQXNBQUFBQkFnTUFCQVVSQmdjU0lURVRRUWhSQ1JRVkdTSlZsZEV5WVlHUlFsSmlGaU0zT0ZOamNYTjFkcEtUc2JPMC84UUFHZ0VCQUFJREFRQUFBQUFBQUFBQUFBQUFBQUVGQXdRR0F2L0VBRElSQUFJQUJBTUZDQUVGQVFFQkFBQUFBQUFCQWdNRUVTRXhVUVVTUVpId0V4VXlZWEdCb2JIUklqTkN3ZUUwOFNQLzJnQU1Bd0VBQWhFREVRQS9BUEtxZ0ZBS0FVQmRERExjU3BCQkU4a3NqQkVSRkpabUowQUFQSkpxVW5FN0lodFFxN3lKNXc5eWR6MlZpK3M1ZTRYRlJNdTBWMDlTVTcwUnRBUjBqUlBrOVFJMFY5NnM1R3lwa3hYbVBkK1gvbjM1RmJPMnBLbDRRZnFmeHpKOWpPVS9CbU82V2tzWmI2UkpCSXIzVXBPdGEwcFZlbFNPM2dnNzJkN0hhck9YczJuZ3pWL1hwSXE0OXBWTWZHM292emRrbXNNVGlzWDEvWm1NdExQMWRkZm9RTEgxYTNyZlNCdld6L2V0dUNYQkx2dUpLK21CcHh6STVsdDl0MjF4TzNXUThDZ09wZjRuRlpUbyswOFphWG5wYjZQckVDeWRPOWIxMUE2M29mMnJISExnbWVOSitxUGNFeU9YZmNiVjlNQ001UGxQd1prZXBvN0dXeGtlUXlNOXJLUnZlOXFGYnFVTDM4QURXaHJRN1ZxVE5tMDhlU3Q2UC8xRzVCdEtvZzQzOVYrTE1nUEVQSjNQWXFMNnppTGhjckdxN2RFVDA1UnJaT2tKUFVOQWVEMUVuUVgzcXNuN0ttUzF2UzN2ZkQvMzc4aTBrN1VsVEh1eHJkZnh6L3dnYzBNMXZNOXZjUlBGTEV4UjBkU3JLd09pQ0Q0SVB0VlkwNFhabGttb2xkWkZ0UVNLQVVBb0JRQ2dGQVNqZy9sOW1lTFpSS0ZleXNPa3NidVNJbFc3a2FRZHVzN0JCMGREUjJkNkIzYVdobVZPT1VPdjQxTktzcllhVllZeGFkWC9BTitWbXpoN2hIQWNNUkJNVFlJa3BYcGU0ZjhBRksvWWIyeDlqMGc5STB1L1lWME1pbWxVNnRBc2RlSnpzMnBtei8zSXIvWFN5MTFaOW1zNWdLaFRVa1hLNkZCY2FGQ0xqUW9MalFvVGNvVk5CY3BVRW54dUllRWNCeFJDVXkxZ2pTaGVsTGhQd3lwMk90TU81QTZpZWs3WGZ0V0NmU3lxaGZyV092RXp5YWliSWY4QTg0cmVYRHA1WHowWmhQakhsL2wrRVpmVUlhOHNDb0l1NDR5RlU3QTA0NzlCMlJyWjBkalIzc0RuYXFpbVVydThWcitkRG9LU3ZsMUt0RmFHSytWODg4c3I0SzcwK1NMMXBtK0tBVUFvQlFFNTVkY3U1ZUpwbHl1V1I0OFRHM1liS3Rjc0QzVlQ3S0QyTGYwSGZaV3lvYUYxRDM0L0Q5OWNlclZ0ZFhLblhaeS9GOWY3cDFmT01NTVZ2RWx2YnhKSEZHb1JFUlFGVlFOQUFEd0FQYXVpU1VLc3NqblczRTd0NG5JQjg2OUhoc3JRZ3JVQVVBb0JRQ2dGQVVxUVVJb1RjNDVvWXA0bmduaVNTT1JTam82aGxaU05FRUhzUVI3VkRTaVZua2VrM0M3cDRtRGVZbkx1WGhpVnNyaWtlVEZTTjNIY3RiTVQyVmo3cVQ0YitoNzZMYzVYVUxwMzJrdncvWCtlZlQ2T2hybFVMczVuaSsvOTE2dEI2clN5RkFLQWxITC9BSU9sNHV5K3BDcTJGbXlTWFpKTzJVbnRHTkVIYmFJMzdBRStkQTdsRlN1cW1XZVN6L0h1YUZmVnFtbDdxdnZSWHQ1ZWVUV0Y4bm5wYTVzRkRGRkJFa0VFU1J4eHFFUkVVQlZVRFFBQThBRDJycVVrbFpITXR0NHM1UUtrOHRsYWdnVUFvQ2ZjcHVSUE5MbmJrbngvTHZoYTR5RWNEQmJtOWNpSzF0dC85SksybEIxMzZSdGlQQU5ZWjFSTHAxZVl6UElwcHRRN1MwYlA0VDZMYmp1NHRGazRoNXFZS3d1U05tS3pzWnJwQWZsMXNZLy9BSXF1aTJ2QW4rbUZsbERzZU5yOVVTSXJ6QitqYjUyOEsyY3VSNFN5ZUc0dGlpQlkyOXM3VzEyUVBjUnlmZ1AvQUdDVFo5Z2F5U3RxeVkzYUs2TVUzWk02QlhnYVpxdmxzVGxjRGtybkRadkczV1B2N09ReFhGcmRSTkZMRTQ4cXlNQVZQOGpWa21vbGRaRlpGQzRYYUxNNmxTUUtBVUJhUlU1a3BuSE5ERmNSUGIzRVNTUlNLVWRIVU1yS1JvZ2crUWFocE5OTTl3eE9GN3l6TmZlWUhCMHZDT1lJajZUWVhqUEphRUh1cWdqYUhaSjJ1d04rNDBmT3dPV3JhVjBzekR3dkw4ZXgwdEJWcXBsN3I4VUtWL1B6eVN4dGtzdVJGNjB6ZkxvWVpiaVZJSUlua2xrWUlpSXBMTXhPZ0FCNUpOU2s0blpFTnFGWGVSc3B3bmdJdUdlSDdURG9JekpFblZPNkFmN3lWdTdIWUFMRGZZRWpmU0ZIdFhXMDBoVThwUzE3K3ZYd2NoVVRlMm14VE1jWHEvVFYyeXhTd3ZkNXRuMkFLMkRBeTZvSUZBS0F5cDhOWEl6SmZFQnpRc3VDNEpaTFhGd0liM0wzaUFiZ3RFSURkTyszV3hLb3ZudTJ5Q0FhMTZxb1ZOTGNmSGdiTkpUT3BtcURoeFBZbmd6Z3ZoZmw3dzFZOEljSFlhM3htSng4WWpndDRWMEI4MlkrV1ludVdPeVNTU1NhNVdaTWlteE9LTjNaMWt1WERLaFVFQ3NqN2RlRDJLQTF5K01UNFc4Tnp6NE51dUkrSDhkRkR4emhyZHBiQzRqVUsxL0dnMmJXUS80dGpmUVQvQzJ1NEJiZS9RMWpwNDkyTHd2NDh6UXJxTlZNRzlDdjFMNThqeVZkSGpkbzVGS3NwSVpTTkVINUd1bU9XS1VBb0JRRnBIdlVrbytOeGR3OUR4UmdMckV5QlJLNjlkdTdhSFJLUDRUdlIwTjlqb2I2U1I3MXIxVWhWRXB5MzdlcHNVMDNzSnNNelQ2L3YzNDJaclpORE5ielBiM0VUeFN4TVVkSFVxeXNEb2dnK0NEN1Z5VFRoZG1kY21vbGRaRTg1TzhQUlpYUHk1YTVDdEZpbFYxUTZPNVgyRU9pRDJBVmp2WUlZS2FzdGx5Vk1tNzcvajk5ZkpXYlVxSExscVd2NWNmSlcrL3E1bSt1ak9kTHFIa3JVQVVBb0QwaStpNzRWczdUbHJ4ZHhyNlMvVzhsbTF4cGNqdUlyZUJKQUI4Z1d1Vy9zUGxWRHRlTnVaREJvcjljam9OandKUzRvOVg5ZittNjFWQmNDZ0ZBS0E4WS9pMjRWdE9EUGlQNDh3VmhFc1Z2OXAvWGtSUm9JTG1OTGpwQTlnUFcwQjhxNnlpamN5UkRFOVByQTVHdWdVdW9qaFd2M2lZanJaTlVVQW9DbFNDMm9QUmhEbkZ3OUZpcy9GbDdib1dQS3F6c2c3YWxUUWM2QUEwUXluZXlTeFluMnJudHFTRkxtS1l2NWZhL1AzYzZQWmM1ekpXNDg0ZnJoL1pQdVUrTSt6dURMYVJrbFNTK2trdW5XUWExczlLbFJyK0VvaWtlZDczNElxejJiTDNLZFBXNzY5a1ZlMG85K29mbFpmMzlzbVFGYjVvTXVxRHlLQVVBb0QwYitpNjR4czduZ1BqRGdGcFZGM2o4c21XVkNlN1JUd3BFU1BtQTF1Ti9Mckh6cWgydkxhamhqOHJIUWJIbUp3UlFhTzV1N1ZRWEFvQlFDZ1BGejRxT01iUGp6NGh1T3VKY2ZLc3RySmxHdElKRk8xa2p0MFczVndma1JFQ1A1R3VzbzVibHlJWVhwOTRuSTFzeFRLaUtKYS9XQmlxdGsxUlFDZ0ZBV2tWSktJZHpZeG4yandYY3lLa3p5V1VrZDBpeDkvQjZXTERSN0JIYysydGIzb0dxL2FVdHpLZDI0WTljeXcyZE1VdW9WK09IWHVrU1hFV0gyVmlyTEdlcjZ2MU8zamc2K25wNnVoUXU5Yk90NjhicmNsd2RuQW9ORlkwNWtmYVJ1UFYzNW5kSGlzaGpaV29JRkFLQVVCa2JrQnpvemZJWG1aanVQY1JHYmlDTUcyeVZuMWRJdTdOeVBVajM3SHNyS2Zaa1VuWTJEZ3FaQ3FaYmdac1UxUkZUVEZHajJKNWJjek9DK2JYQ2xyeGx3TG1vY2pqcnBSdnBJRWtFbXRtS1ZQS09OOTFQOGlOZ2dubFpzcU9URnVSckU2eVZPZ253NzhEdWlVMWpNZ29EVmo0MHZpenczS1BoZSs1ZThGNVNPNDQ0eTBCZ1BvUHY3SmhjYU16a2Z3eWxUK0JmSUpEbnNBR3NxQ2ljNkpUSTErbGZKVzE5YXBFTGdnZjZuOEhsZDVyb3ptUlFDZ0ZBS0FvM2lwSlIwc3RZREs0cTh4Wm05SVhsdkpCNm5UMWRIV3BYZXRqZXQrTjFqbVFkcEE0TlUxek1rdVBzNDFHbGV6dWR1c2g0UmNQRkR5eXRRQlFDZ0ZBS0FsUEx6bWp6QjVVWnIvYURsNXhWZllTOUlDeUdCd1k1bEIyRmtqWUZKRjM3TUNLeHpaTUU1YnN4WE1zcWRNa1BlbHV4c25oUHBOdWVlUHRGdHN2dzF3amxaRUd2ckQyczhNakg1c0VsQ2YyVVZYeGJKa3Q0Tm9zSWRyemtzVW1SVG1EOUlEOFJQSFZuTGpiTE00N2hhMW1CVnhnN1pvcG1YL3ZwR2VSVC9OQ3ByTEwyYklsdTdWL1V4VGRwMUV4V1R0Nkd1VnpjM0Y1Y1MzZDNQSlBQTTVra2xrWXM3c1Rzc3hQY2tuM05iNlZzRVY3YmVMT09nRkFLQVVBb0NoOFZJUmJROUNnUmNQRkR5eXRRQlFDZ0ZBU2ZnL2xmekg1Z3llbndQd0xuYzRPcnBaN0d3a2xqUS82blVkSy8xSXJISE9seXZIRWtaSmNtWk44RUxabURBL0FKOFQrYlJaWnVCclhGUnYzRFgrVXQxT3Y1cWpzdy9xQldyRnRLbmgvbGYyTnVIWmxURi9HM3VTdUg2TS80aEpVRFNaZmd1RS81WHlVNUkvOEFUQVJXUHZXUm8rdmN5clpNL1ZkZXgxYi9BT2piK0kyelF0YnR3cmZFRCtHM3lqZ24vd0J5TlJVcmFzaDY4aUhzbW9Xbk14OXhSOEczeEw4Skk4MlI1VDVXNmlRYjY4WThWL3NmTUxBenQvY1ZuZ3JxZVBLTCt2c3dSMEZSQm5EeXgrakVPVHhlVHd0N0pqc3hqcnF4dTRUcVNDNWhhS1JEL05XQUlyWlRVU3VqVWNMaGRtZGFwSUZBS0FVQlErS2tJdG9lanFZbS93RHRURldXVDlMMHZybHZIUDBkWFYwOWFodGIwTjYzNTFXT1hIMmtDajFTWjdtUWRuRzRMM3M3Y2p1anhXUXhzclVFQ2dNajhrT1FQTVBuN3hJY0R3UmpsRnZiZExYK1N1ZHJhMlNId1hZQTdZNk9rVUZqbzl0QWtZS2lwbDAwTzlHYkZQVFRLbUxkZzVubzl5YitBdmtqeXdnZ3Z1SXNXdkdtY1FBdmQ1YUlOYkszL1YydXlnSGorUHJiNUVlS29aKzBaMDdDRjdxOHZ5ZEJJMmJKazR4TGVmbitEWTYydGJheXQ0N1N6dDRvSUlsQ1J4UklGUkZIZ0FEc0JXZzIzaXl3U3RnamxxQUtBVUFvQ09jYTh1T0F1WStPT0s0NzRReFdjdHRFS3Q3YkxJMGUvZEhJNmtQODFJTlpKYzJPVTd3T3hqbVNvSnF0R3Jtay9QNzZOdTNqdExuaWJrSGZUZXJHR2tmaDYvbTZ1c2ZLM25idnY1TElUdjhBempzRGIwMjFjZDJmei9KVDFPeVZiZWtjdndhRlpISFpERDVDNXhXV3NwN085czVXZ3VMZWVNcEpGSXAweU1wN2dnZ2dnMWRKcUpYUlNOT0YyZVoxNkVDZ0tIeFVrbzZXV3Z4aXNWZVpRdytxTE8za245UHE2ZXZvVXRyZWpyZXZPcXh6SSt6Z2NlaWI1R1NYQTVrYWdUdGQyNWthNVQ1TVpIZ3Uxalo1bmtzWkpMVjJrTy9CNmxDblovQ0VkQVBHdGE4QVZwN05tT1pUcFBoaDF6TnphTXZzNmgyNDQ5ZTZaTVFhc0N2WmRVRUhaeG1PdTh2a3JURTJFZnFYTjdQSGJ3cHZYVkk3QlZIOXlLaHRRcTdKU2NUc2oyMjVMOHBlSE9Tbkx2RmNCY09XOFlXemlEWGx5RjA5NWRFRDFaM1BrbGo0MzRVS283QVZ5TlJPaXFKamppT3hwNUVOUExVRUpPYXdtWVVBb0JRQ2dGQUtBVUJvVjlKZnlWdzhXTXhYUEhDMmtjRisxMG1KelBwcnI2d3JJeGdtYi9VdlFVSjhrTWc4TFYxc3FvZDNKZnFpazJ2VHF5bkxQSm5uNVYyVVFvQzBtcEpSRHViR1QrenVDN3FOWG1TUzlranRVYU02MXM5VEJqc2ZoS0k0OTk3MXJSTlYrMHBqbDA3dHh3NjVHL3M2V3BsUXI4TWV2ZG9nSEozaUNMRlorWEUzSlZZc3Fxb3JuUTFNbXlnMlNPeERNUEJKWXFLck5sejFMbTdqeWkrK0JaN1ZrT1pMVXlIK1BEeWZ0dzVXdjVHYjY2STU0dXFUeVN6bEwveFY0TS84d1k3L0FQVEhXS2QrMUY2TXl5UDNZZlZIdWJYSEhaaWdGQUtBVUFvQlFDZ0ZBYXkvU0ovOHMrUy84VnNQL3NxdzJaLzBMMFpYYlUvNW42bzhvYTZVNWdvZTFTQzJvUFJoRG5GeEREbGM5RmliYm9hUEZLeU00N2t5dm91TmdrYUhTbzhBaHVvSDJybnRxejFNbUtYRC9IN2Y0KzduUjdMa3VYS2NjV2NYMXcvc2djTTB0dktrOEVyeHl4c0hSMFlobFlIWUlJOEVHcXhOd3U2TEpwUkt6eU5sT0VzL0h4TncvWjVkVEdKSlU2WjBVajhFcTltR2dTVjc5d0QzNlNwOTY2Mm1ucW9sS05lL3IxOEhJVkV2c1owVXJUMXl6WERIMVdGN3JOTSt3RDdWc0dCbmZ3ZVl2ZUhzMWo4L2pXUmJ2R1hVVjVibDE2bEVrYmgxSkh1TmdkcTh4UXFKT0Y4UkRFNFdvbHdOanZ2RlBpWC9BRG5CZnBNZjcxb2QyVStqNWxoM3JVYXJrUHZGUGlYL0FEbkJmcE1mNzA3c3A5SHpIZXRScXVRKzhVK0pmODV3WDZUSCs5TzdLZlI4eDNyVWFya1B2RlBpWC9PY0Yra3gvdlR1eW4wZk1kNjFHcTVEN3hUNGwvem5CZnBNZjcwN3NwOUh6SGV0UnF1USs4VStKZjhBT2NGK2t4L3ZUdXluMGZNZDYxR3E1RDd4VDRsL3puQmZwTWY3MDdzcDlIekhldFJxdVErOFUrSmY4NXdYNlRIKzlPN0tmUjh4M3JVYXJrUHZGUGlYL09jRitreC92VHV5bjBmTWQ2MUdxNUVQNXFmR0J6cDV5Y0lUY0Q4YjVIRnpZdWVhSzRkYmZIcEUvWEdkcitJZC9OWlpOREprUmI4R1ppblYwNm9nM0k4akNsYlpwbHBQdFVrcEh4ZUx1SVl1RjhCZFpaeWhsUmVpM1J2OGNwN0tOYkd4N25SMzBnMXIxTTlVOHB6SDdldlh3YkZQSzdlYkRMMSt2Njk4TDJOYlpwcGJpVjU1NVhrbGtZdTd1eExNeE95U1Q1Sk5jazI0bmQ1blhKS0ZXUmJVRWtvNWY4WXk4STVjR1RwTmhlTWtkMkNEdFZCT3BCb0U3WFpPdmNFanpvamNvcXAwc3pId3ZQOEFQc2FGZlNLcGw3eXZ2UTN0NStXT0dOcytHdHJtd1VNMFZ4RWx4YnlwSkZJb2RIUmd5c3BHd1FSNUJycVU3cTZPWmFhd1p5QTFPWjVhTHFnZ1VBb0JRQ2dGQUtBVUFvQlFGcE5Ua1NrY2MwMFZ2RTl4Y1NwSEZHcGQzZGdxcW9HeVNUNEFxRzBrMnozREM0bnVyTTE5NWdjWXk4WFpnbVBwRmhaczhkb0FPN0tTTnlIWUIyM1NEcjJHaDUyVHkxYlZPcW1YV1N5L0owdEJTS21sN3o4VVNWL0x5emF3dm1zK1JGNjB6ZkZBS0FuSEx2bUpMd3hLdUt5cnZKaXBHN0h1eld6RTkyVWU2aytWL3FPK3cxbFExenAzMmN6dy9YK2VYVHJhNmhWUXQrWDR2dnJoMWJPVU0wVnhFazhFcVNSU0tIUjBZRldVallJSThnaXVqVFRWMHpuR21uWm81QWZuVW5sb3JVRUZhQVVBb0JRQ2dGQVUzcXBCUW41VUpTT09hYUszaWU0dUpVamlqVXU3dXdDcW9HeVNUNEFGUTJsaXowbGQyUmczbUp6RWw0bWxiRllwM2p4VWJkejNEWExBOW1ZZXlqMlgrcDc2Qzg1WFZ6cUh1UWVINzY2OHVqb2FGVTY3U1B4ZlhYWG5CNnJTeUZBS0FVQW9DVThIOHc4MXduSXNKZDc3SGhDZ3M1WlNGVHVXM0dlL1FlcGlUb2FPenNiMFJ1VXRiTXBuYk9IVDhhRmZWYk9sMUY0b0xReE4zYnRua3NjcjRLeWZDeTRZR2JjQnhaZ09Kb2cySXlNY3NnUU84RGZobGo3S1R0VDNJQllBc05ydndUWFJTYW1WVUs4dCszSHI0T2ZtMDg2VCs1RGJGL2ZsZlBOWHh0bWs4RDY5WnpDVkRHcElzVjZoUVdHeDg2RVdHeDg2Q3c2aFFteFFzYUN4U29KUGtaL2kzaC9obU10bDhqSEZJVUxwQXY0cFpPekVhVWR4c3FRR09sMzVJckJQcVpWT3J6SDdjZXZnelNxZWJQOEEyNGI0cGNNT2RzczN4dGttOERDUEdQTURMOFhTK21TMW5ZQlFCYVJ5a3F4MkR0ejI2enNEV3hvYUdodlpQTzFWYk1xblo0TFQ4Nm5SVXRCTHBrbkZhS0xXM3JsbmJCMmV2d1JldE0zaFFDZ0ZBS0FVQW9DNkdhVzNsU2VDVjQ1WTJEbzZNUXlzRHNFRWVDRFVwdUYzUkRTaVZua1R6aDduRm44VkVMYkxRSmxZbFhTTTcrbktPd0EyNEI2aDJQa0ZpVHNtcktUdFNiTFZvMXZMNTYrZk1xNSt5cGN4M2x2ZDE0cmp5K3JLMWlmNHpteHdYa2VsWkw2V3lrZVQwMVM2aEs3OGFZc3ZVcWp2NUxEV2p2UTcxWnk5cFU4eDJ2YjE2Wld6Tm5WRXRYdGYwNlQrQ1MyR1d4V1ZFaHhlU3Rid1JhOVQwSmxrNk43MXZwSjF2Ui9zYTNJSmtFendOUDBkelRqbHh5N0tOTlgxTzNXUThDZ09wZjVmRTRybyswOG5hV2ZxN0tldk1zZlZyenJxSTM1SDk2eHh6SUpmamFYcXpKQkxqbWVCTitpSTFrK2EvQmVONmxTL2x2WkVsTWJKYXhGdkc5c0dicFJsN2VReDNzYTJPOWFjemFWUExkcjM5T2w4RzFMMmRVVEZlMXZYcHRjaUFjUWM0cy9sWWpiWW1CTVZFeTZka2YxSlRzRUhUa0FLTzQ4RHFCR3cxVmsvYWsyWmhCK2xmUE10Skd5cGN0NzB4NzJuQmNPZkh5eHk0a0RtbW11Sm51TGlWNVpaV0x1N3NXWm1KMlNTZTVKUHZWYTI0bmRsbWtvVlpaRnRRU0tBVUFvRC85az0nO1xyXG5cclxuICBpc0V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbW1hbmRFdmVudCE6IE1lbnVJdGVtQ29tbWFuZEV2ZW50O1xyXG5cclxuICBzdGF0dXNlcyE6IFNlbGVjdEl0ZW1bXTtcclxuICBjbG9uZWREYXRhU291cmNlOiB7IFtzOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICAvKiogIEVtaXRlIGV2ZW50byBkZSBzYWx2YW1lbnRvIGRhIGxpbmhhICovXHJcbiAgQE91dHB1dCgpIG9uUm93U2F2ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uQWN0aXZlSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uQWN0aXZlSXRlbUxvdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblBhZ2luYXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBkb3VibGVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyRmllbGQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvblN3aXRjaFRhYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb2RpZ29GaXBlUGlwZTogQ29kaWdvRmlwZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNwZkNucGpQaXBlOiBDcGZDbnBqUGlwZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVsZWZvbmVQaXBlOiBUZWxlZm9uZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2VcclxuXHJcbiAgKSB7XHJcbiAgICB0aGlzLmlzUm93U2VsZWN0YWJsZSA9IHRoaXMuaXNSb3dTZWxlY3RhYmxlLmJpbmQodGhpcyk7XHJcbiAgfVxyXG4gIHNlbGVjdGVkUHJvZHVjdDogYW55ID0ge1xyXG4gICAgcm93RGF0YToge30sXHJcbiAgICBlZGl0aW5nOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIGl0ZW1zITogTWVudUl0ZW1bXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XHJcblxyXG4gICAgdGhpcy5pdGVtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnRWRpdGFyIGxpbmhhJywgaWNvbjogJ3BpIHBpLWZ3IHBpLXBlbmNpbCcsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm93RWRpdCcgKyB0aGlzLnNlbGVjdGVkUHJvZHVjdC5yb3dEYXRhW3RoaXMuY29uZmlnLmRhdGFLZXldKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLmNvbmZpZy5kaXNhYmxlRWRpdFJvd0Z1bmN0aW9uPy4odGhpcy5zZWxlY3RlZFByb2R1Y3Qucm93RGF0YSkpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGljaygpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKFwiQSBlZGnDp8OjbyBkZXNzYSBsaW5oYSBlc3RhIGRlc2FiaWxpdGFkYVwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vblJvd0VkaXRJbml0KHRoaXMuc2VsZWN0ZWRQcm9kdWN0KVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0NhbmNlbGFyIGVkacOnw6NvJywgaWNvbjogJ3BpIHBpLWZ3IHBpLXRpbWVzJywgY29tbWFuZDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb3dDYW5jZWwnICsgdGhpcy5zZWxlY3RlZFByb2R1Y3Qucm93RGF0YVt0aGlzLmNvbmZpZy5kYXRhS2V5XSk7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsaWNrKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKFwiQSBlZGnDp8OjbyBkZXNzYSBsaW5oYSBlc3RhIGRlc2FiaWxpdGFkYVwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnU2FsdmFyIGVkacOnw6NvJywgaWNvbjogJ3BpIHBpLWZ3IHBpLXNhdmUnLCBjb21tYW5kOiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvd1NhdmUnICsgdGhpcy5zZWxlY3RlZFByb2R1Y3Qucm93RGF0YVt0aGlzLmNvbmZpZy5kYXRhS2V5XSk7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsaWNrKCk7IC8vIERpc3BhcmEgdW0gZXZlbnRvIGRlIGNsaXF1ZSBubyBlbGVtZW50byBjb20gSUQgJ3Rlc3RlJ1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0V2FybihcIkEgZWRpw6fDo28gZGVzc2EgbGluaGEgZXN0YSBkZXNhYmlsaXRhZGFcIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pdGVtc1swXS52aXNpYmxlID0gIXRoaXMuc2VsZWN0ZWRQcm9kdWN0LmVkaXRpbmcgJiYgdGhpcy5pc0VkaXRhYmxlVGFibGUoKSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLml0ZW1zWzFdLnZpc2libGUgPSB0aGlzLnNlbGVjdGVkUHJvZHVjdC5lZGl0aW5nICYmIHRoaXMuaXNFZGl0YWJsZVRhYmxlKCkgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5pdGVtc1syXS52aXNpYmxlID0gdGhpcy5zZWxlY3RlZFByb2R1Y3QuZWRpdGluZyAmJiB0aGlzLmlzRWRpdGFibGVUYWJsZSgpICE9PSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGRiQ2xpY2tFZGl0KCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb3dFZGl0JyArIHRoaXMuc2VsZWN0ZWRJdGVtW3RoaXMuY29uZmlnLmRhdGFLZXldKTtcclxuICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgIGVsZW1lbnQuY2xpY2soKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdFdhcm4oXCJBIGVkacOnw6NvIGRlc3NhIGxpbmhhIGVzdGEgZGVzYWJpbGl0YWRhXCIpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1Jvd1NlbGVjdGFibGUoZXZlbnQ6IGFueSkge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWRDaGVja2JveChldmVudC5kYXRhKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIC8vQ2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbGlmZWN5Y2xlIGhvb2suIFVzZSBpdCB0byBpbmplY3QgZGVwZW5kZW5jaWVzLCBidXQgYXZvaWQgYW55IHNlcmlvdXMgd29yayBoZXJlLlxyXG4gICAgLy9BZGQgJyR7aW1wbGVtZW50cyBPbkNoYW5nZXN9JyB0byB0aGUgY2xhc3MuXHJcbiAgICBpZiAoY2hhbmdlc1snc2V0Q29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnMuZm9yRWFjaCgoZTogVGFibGVFZGl0Q29uZmlnQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGUuZmllbGRDb250cm9sVHlwZSA9PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RhckRyb3AoZS5maWVsZERyb3BEb3duQ29udHJvbD8uZmllbGRDb250cm9sRHJvcGRvd25TZXJ2aWNlLCBlKVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJvd0VkaXRJbml0KHJvd0RhdGE6IGFueSkge1xyXG4gICAgdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXSA9IHsgLi4ucm93RGF0YSB9O1xyXG4gIH1cclxuXHJcbiAgb25Sb3dFZGl0U2F2ZShyb3dEYXRhOiBhbnksIGluZGV4OiBhbnkpIHtcclxuXHJcbiAgICBsZXQgZXJyb3JzID0gW11cclxuICAgIC8vVmFsaWRhw6fDo28gZG8gZm9ybXVsYXJpbyBmYWtlXHJcbiAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goKGNvbDogVGFibGVFZGl0Q29uZmlnQ29sdW1uKSA9PiB7XHJcblxyXG4gICAgICBpZiAoY29sLnJlcXVpcmVkID8/IHRydWUpIHtcclxuICAgICAgICBpZiAoIXJvd0RhdGFbY29sLmZpZWxkXSlcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdFdhcm4oYE8gY2FtcG8gJHtjb2wuaGVhZGVyfSBlIG9icmlnYXTDs3JpbyEgYClcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbC52YWxpZGF0b3IpIHtcclxuICAgICAgICBjb25zdCB0ZW1wRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wocm93RGF0YVtjb2wuZmllbGRdLCBjb2wudmFsaWRhdG9yIGFzIFZhbGlkYXRvckZuKTtcclxuICAgICAgICB0ZW1wRm9ybUNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpXHJcbiAgICAgICAgdGVtcEZvcm1Db250cm9sLnZhbGlkXHJcbiAgICAgICAgaWYgKHRlbXBGb3JtQ29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKGBFcnJvIGFvIHZhbGlkYXIgZGFkb3MgZG8gY2FtcG86ICR7Y29sLmhlYWRlcn0hIGApXHJcbiAgICAgICAgICBlcnJvcnMucHVzaCh7IGVycm86IFwiQ2FtcG8gaW52YWxpZG9cIiwgY2FtcG86IHJvd0RhdGFbY29sLmZpZWxkXSB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRoaXMub25Sb3dTYXZlLmVtaXQocm93RGF0YSlcclxuICAgICAgZGVsZXRlIHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtyb3dEYXRhLmlkIGFzIHN0cmluZ107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKGBFcnJvIGRlIHZhbGlkYcOnw6NvIGRlIGRhZG9zISBgKVxyXG4gICAgICAvLyB0aGlzLm9uUm93RWRpdENhbmNlbChyb3dEYXRhLCBpbmRleClcclxuICAgICAgLy8gdGhpcy5vblJvd0VkaXRJbml0KHJvd0RhdGEpXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVtpbmRleF0gPSB0aGlzLmNsb25lZERhdGFTb3VyY2Vbcm93RGF0YS5pZCBhcyBzdHJpbmddO1xyXG4gICAgICBkZWxldGUgdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUm93RWRpdENhbmNlbChwcm9kdWN0OiBhbnksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZVtpbmRleF0gPSB0aGlzLmNsb25lZERhdGFTb3VyY2VbcHJvZHVjdC5pZCBhcyBzdHJpbmddO1xyXG4gICAgZGVsZXRlIHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtwcm9kdWN0LmlkIGFzIHN0cmluZ107XHJcbiAgfVxyXG5cclxuICBhc3luYyBsaXN0YXJEcm9wKHNlcnZpY2U6IGFueSwgY29sOiBhbnksIGluZHRvZG9zPzogYm9vbGVhbikge1xyXG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb25maWcuY29sdW1ucz8uaW5kZXhPZihjb2wpO1xyXG5cclxuICAgIGlmICghY29sLmZpZWxkRHJvcERvd25Db250cm9sLmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlKVxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLkxpc3RhcihpbmR0b2RvcyB8fCAnJykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YTogYW55W10pID0+IHtcclxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jb2x1bW5zICYmIGNvbHVtbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnNbY29sdW1uXS5maWVsZERyb3BEb3duQ29udHJvbC5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZSA9IGRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5jb2x1bW5zW2NvbHVtbl0uZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBlbHNlIHJldHVybiB0aGlzLmNvbmZpZy5jb2x1bW5zW2NvbHVtbl0uZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlXHJcbiAgfVxyXG5cclxuICByZXRvcm5hRGVzY3JpY2FvRHJvcChyb3dEYXRhOiBhbnlbXSwgY29sOiBUYWJsZUVkaXRDb25maWdDb2x1bW4pIHtcclxuXHJcbiAgICBjb25zdCBkYXRhID0gY29sLmZpZWxkRHJvcERvd25Db250cm9sPy5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZVxyXG4gICAgY29uc3QgaWRvYmpldG8gPSBjb2wuZmllbGREcm9wRG93bkNvbnRyb2w/Lmlkb2JqZXRvXHJcbiAgICBjb25zdCBkZXNjcmljYW9vYmpldG8gPSBjb2wuZmllbGREcm9wRG93bkNvbnRyb2w/LmRlc2NyaWNhb29iamV0b1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY29uc3QgdmFsb3JBdHVhbCA9IHJvd0RhdGFbY29sLmZpZWxkXVxyXG5cclxuICAgIGlmIChkYXRhICYmIGlkb2JqZXRvICYmIGRlc2NyaWNhb29iamV0bylcclxuICAgICAgcmV0dXJuIGRhdGE/LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbVtpZG9iamV0b10gPT0gdmFsb3JBdHVhbClbZGVzY3JpY2Fvb2JqZXRvXVxyXG4gICAgZWxzZSByZXR1cm4gJ0NhcnJlZ2FuZG8nXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25HbG9iYWxGaWx0ZXIodGFibGU6IFRhYmxlLCBldmVudDogRXZlbnQpIHtcclxuICAgIHRoaXMub25GaWx0ZXIuZW1pdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcclxuICAgIHRhYmxlLmZpbHRlckdsb2JhbCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCAnY29udGFpbnMnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgdGhpcy5hZGp1c3RUYWJsZVNpemUoKTtcclxuICAgIHRoaXMudGFtYW5ob1RlbGEgPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICB9XHJcblxyXG4gIGFkanVzdFRhYmxlU2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLnRhYmxlU2l6ZSA8IDgwMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2l6ZSA9ICdwLWRhdGF0YWJsZS1zbSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2l6ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBhZ2luYXRlKCRldmVudDogYW55KSB7XHJcbiAgICBpZiAoJGV2ZW50KSB7XHJcbiAgICAgIGxldCBwYWdpbmFJbmljaWFsID1cclxuICAgICAgICAoJGV2ZW50Py5maXJzdCA+IDAgPyAkZXZlbnQuZmlyc3QgLyAkZXZlbnQucm93cyA6ICRldmVudC5maXJzdCkgKyAxO1xyXG4gICAgICBsZXQgdGVybW9QZXNxdWlzYSA9ICcnO1xyXG4gICAgICBsZXQgb3JkZW5hY2FvID0gJyc7XHJcblxyXG4gICAgICBpZiAoJGV2ZW50Lmdsb2JhbEZpbHRlcikgdGVybW9QZXNxdWlzYSA9ICRldmVudC5nbG9iYWxGaWx0ZXI7XHJcblxyXG4gICAgICBpZiAoJGV2ZW50LnNvcnRGaWVsZClcclxuICAgICAgICBvcmRlbmFjYW8gPSBgJHskZXZlbnQuc29ydEZpZWxkfSAkeyRldmVudC5zb3J0T3JkZXIgPT09IDEgPyAnQVNDJyA6ICdERVNDJ1xyXG4gICAgICAgICAgfWA7XHJcblxyXG4gICAgICBjb25zdCBvYmpldG86IFRhYmxlUGFnaW5hdGUgPSB7XHJcbiAgICAgICAgcGFnaW5hSW5pY2lhbDogcGFnaW5hSW5pY2lhbCxcclxuICAgICAgICB0YW1hbmhvUGFnaW5hOiAkZXZlbnQucm93cyxcclxuICAgICAgICB0ZXJtb1Blc3F1aXNhOiB0ZXJtb1Blc3F1aXNhLFxyXG4gICAgICAgIG9yZGVuYWNhbzogb3JkZW5hY2FvLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5vblBhZ2luYXRlLmVtaXQob2JqZXRvKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQm9vbGVhbkZpZWxkKHJvd0RhdGE6IGFueSwgY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvbC5maWVsZFR5cGUgPT0gJ2Jvb2xlYW4nO1xyXG4gIH1cclxuXHJcbiAgaXNDaGlwRmllbGQoY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvbC5maWVsZFR5cGUgPT0gJ2NoaXAnO1xyXG4gIH1cclxuXHJcbiAgaXNJbWFnZUZpZWxkKGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXRvcm5vID0gY29sLmZpZWxkVHlwZSAmJiBjb2wuZmllbGRUeXBlID09PSAnaW1hZ2UnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgcmV0dXJuIHJldG9ybm87XHJcbiAgfVxyXG5cclxuICByZXR1cm5Sb3dDbGFzcyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcclxuICAgIGxldCB2YWx1ZSA9IHJvd0RhdGFbY29sLmZpZWxkXTtcclxuICAgIGxldCByb3dDbGFzczogc3RyaW5nO1xyXG5cclxuICAgIHRoaXMudGFibGVTaXplID4gODAwID8gKHJvd0NsYXNzID0gJ3RleHQtYmFzZScpIDogKHJvd0NsYXNzID0gJ3RleHQtc20nKTtcclxuXHJcbiAgICBpZiAoY29sLmV4cGlyZWREYXRlID09IHRydWUpIHtcclxuICAgICAgbmV3IERhdGUodmFsdWUpIDwgbmV3IERhdGUoKVxyXG4gICAgICAgID8gKHJvd0NsYXNzID0gcm93Q2xhc3MgKyAnIHRleHQtcmVkLTQwMCBmb250LXNlbWlib2xkJylcclxuICAgICAgICA6ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvd0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVmFsdWUocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKSB7XHJcbiAgICBsZXQgdmFsdWUgPSByb3dEYXRhW2NvbC5maWVsZF07XHJcblxyXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgaWYgKCFjb2wucGlwZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3dpdGNoIChjb2wucGlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eScpO1xyXG4gICAgICAgIGNhc2UgJ2RlY2ltYWwnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVjaW1hbFBpcGUudHJhbnNmb3JtKHZhbHVlLCAnMS4yLTInLCAncHQtQlInKTtcclxuICAgICAgICBjYXNlICdjcGZjbnBqJzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNwZkNucGpQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAndGVsZWZvbmUnOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudGVsZWZvbmVQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XHJcbiAgICAgICAgY2FzZSAnY29kaWdvZmlwZSc6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb2RpZ29GaXBlUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ21vbmV5JzpcclxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdGFyVmFsb3IodmFsdWUpO1xyXG4gICAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOlxyXG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfSAlYDtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhbGlnbkNvbHVuYXNIZWFkZXIoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKGNvbC5hbGlnbikge1xyXG4gICAgICBpZiAoY29sLmFsaWduID09ICdyaWdodCcpIHJldHVybiAnanVzdGlmeS1jb250ZW50OiBlbmQnO1xyXG4gICAgICBlbHNlIHJldHVybiAnJztcclxuICAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBjZW50cmFsaXphckNvbHVuYXMoY29sOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKGNvbC5jZW50cmFsaXplKSB7XHJcbiAgICAgIHJldHVybiAndGV4dC1hbGlnbjogY2VudGVyOyAnO1xyXG4gICAgfSBlbHNlIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGFsaWduQ29sdW5hcyhjb2w6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoY29sLmFsaWduKSB7XHJcbiAgICAgIHJldHVybiBgdGV4dC1hbGlnbjogJHtjb2wuYWxpZ259YDtcclxuICAgIH0gZWxzZSByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICByZXR1cm5DbGFzc0ljb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXRvcm5hclJvdyhyb3dEYXRhLCBjb2wsICdpY29ucm93Jyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhOiBhbnksIGNvbDogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3Rvb2x0aXBpY29ucm93Jyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm5DbGFzc0NoaXAocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGNoaXAtc3R5bGUgdy1hdXRvIGJvcmRlci1yb3VuZC0yeGwgcC0yIHRleHQtJHt0aGlzLnJldG9ybmFyUm93KFxyXG4gICAgICByb3dEYXRhLFxyXG4gICAgICBjb2wsXHJcbiAgICAgICdzdHlsZWNoaXAnXHJcbiAgICApfSBib3JkZXItJHt0aGlzLnJldG9ybmFyUm93KHJvd0RhdGEsIGNvbCwgJ3N0eWxlY2hpcCcpfWA7XHJcbiAgfVxyXG5cclxuICByZXRvcm5hclJvdyhyb3dEYXRhOiBhbnksIGNvbDogYW55LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IF9yb3dhY3Rpb24gPSB0aGlzLmNvbmZpZy5yb3dzID8gdGhpcy5jb25maWcucm93c1tjb2wuZmllbGRdIDogbnVsbDtcclxuICAgIGNvbnN0IF9maWVsZDogc3RyaW5nID1cclxuICAgICAgX3Jvd2FjdGlvbiAmJiBfcm93YWN0aW9uW2ZpZWxkXVxyXG4gICAgICAgID8gX3Jvd2FjdGlvbltmaWVsZF0uY29uc3RydWN0b3IgPT09IEZ1bmN0aW9uXHJcbiAgICAgICAgICA/IF9yb3dhY3Rpb25bZmllbGRdLmFwcGx5KHRoaXMsIFtyb3dEYXRhXSlcclxuICAgICAgICAgIDogX3Jvd2FjdGlvbltmaWVsZF1cclxuICAgICAgICA6IG51bGw7XHJcbiAgICByZXR1cm4gX2ZpZWxkO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlKHZhbHVlID0gW10pIHtcclxuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRhclZhbG9yKHZhbG9yOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcclxuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXHJcbiAgICAgIGN1cnJlbmN5OiAnQlJMJyxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbG9yKTtcclxuICB9XHJcblxyXG4gIGxvYWRJbWFnZShyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgLypcclxuICAgICAgTm9zc2EgY29sdW5hIGRlIGltYWdlbSB0cmFiYWxoYSBjb20gc3RyaW5ncyBkbyB0aXBvOiBiYXNlNjQgb3UgdXJsXHJcbiAgICAqL1xyXG4gICAgbGV0IHJldG9ybm8gPSBgZGF0YTppbWFnZS9qcGc7YmFzZTY0LCAke3RoaXMuaW1nRGVmYXVsdH1gO1xyXG4gICAgaWYgKHJvd0RhdGEgJiYgY29sICYmIHJvd0RhdGFbY29sLmZpZWxkXSAmJiByb3dEYXRhW2NvbC5maWVsZF0gIT09ICcnKSB7XHJcbiAgICAgIGlmIChyb3dEYXRhW2NvbC5maWVsZF0uaW5jbHVkZXMoJ2h0dHAnKSkgcmV0b3JubyA9IHJvd0RhdGFbY29sLmZpZWxkXTtcclxuICAgICAgZWxzZSByZXRvcm5vID0gYGRhdGE6aW1hZ2UvanBnO2Jhc2U2NCwgJHtyb3dEYXRhW2NvbC5maWVsZF19YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0b3JubztcclxuICB9XHJcblxyXG4gIGdldEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlbmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVzW3RlbXBsYXRlbmFtZV07XHJcbiAgfVxyXG5cclxuICBleGliaXJDYW1wbyhmaWVsZDogYW55LCByb3dEYXRhOiBhbnkpIHtcclxuICAgIGxldCB2aXNpYmxlID0gZmllbGQudmlzaWJsZSA/IGZpZWxkLnZpc2libGUocm93RGF0YSkgOiB0cnVlO1xyXG4gICAgcmV0dXJuIHZpc2libGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aXZlSXRlbShyb3dEYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcclxuICAgIHRoaXMub25BY3RpdmVJdGVtLmVtaXQoeyByb3dEYXRhOiByb3dEYXRhIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdGl2ZUl0ZW1Mb3RlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgdGhpcy5vbkFjdGl2ZUl0ZW1Mb3RlLmVtaXQocm93RGF0YSk7XHJcbiAgfVxyXG5cclxuICByZXRvcm5hckNhbXBvKGFjdGlvbjogS3ZNZW51SXRlbSwgcm93RGF0YTogYW55LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IF9mdW5jdGlvbiA9IGFjdGlvbi5keW5hbWljZmllbGRzXHJcbiAgICAgID8gKGFjdGlvbi5keW5hbWljZmllbGRzW2ZpZWxkXSBhcyBGdW5jdGlvbilcclxuICAgICAgOiBudWxsO1xyXG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPSBfZnVuY3Rpb25cclxuICAgICAgPyBfZnVuY3Rpb24uYXBwbHkoYWN0aW9uLCBbcm93RGF0YV0pXHJcbiAgICAgIDogYWN0aW9uW2ZpZWxkXTtcclxuICAgIHJldHVybiBfZmllbGQ7XHJcbiAgfVxyXG5cclxuICBjYWxsRGlzYWJsZWQoYWN0aW9uOiBLdk1lbnVJdGVtLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChhY3Rpb24/LmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjcmlhck1lbnVzTW9kYWwoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWN0aW9ucyAmJiBkYXRhKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jb25maWcuYWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGljb24gPSB0aGlzLnJldG9ybmFyQ2FtcG8oYWN0aW9uLCBkYXRhLCAnaWNvbicpO1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLnJldG9ybmFyQ2FtcG8oYWN0aW9uLCBkYXRhLCAndG9vbHRpcCcpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ2xhYmVsJyk7XHJcbiAgICAgICAgY29uc3QgY29tbWFuZDogYW55ID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ2NvbW1hbmQnKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlOiBib29sZWFuID0gYWN0aW9uLnZpc2libGVcclxuICAgICAgICAgID8gYWN0aW9uLnZpc2libGUoZGF0YSlcclxuICAgICAgICAgIDogdHJ1ZTtcclxuICAgICAgICBjb25zdCBkaXNhYmxlZDogYm9vbGVhbiA9IGFjdGlvbi5kaXNhYmxlZFxyXG4gICAgICAgICAgPyBhY3Rpb24uZGlzYWJsZWQoZGF0YSlcclxuICAgICAgICAgIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lbnVJbnNlcnQ6IEt2TWVudUl0ZW0gPSB7XHJcbiAgICAgICAgICBsYWJlbCxcclxuICAgICAgICAgIGljb24sXHJcbiAgICAgICAgICB0b29sdGlwLFxyXG4gICAgICAgICAgY29tbWFuZCxcclxuICAgICAgICAgIGRpc2FibGVkLFxyXG4gICAgICAgICAgdmlzaWJsZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMubWVudUl0ZW1zLmZpbHRlcihcclxuICAgICAgICAgICh4KSA9PiB4LmNvbW1hbmQgPT0gbWVudUluc2VydC5jb21tYW5kXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID09IDApIHRoaXMubWVudUl0ZW1zLnB1c2gobWVudUluc2VydCk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAobWVudUluc2VydC5sYWJlbCAhPSBpdGVtWzBdLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMubWVudUl0ZW1zLmluZGV4T2YoaXRlbVswXSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKG1lbnVJbnNlcnQudmlzaWJsZSAhPSBpdGVtWzBdLnZpc2libGUpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWVudUluc2VydC5kaXNhYmxlZCAhPSBpdGVtWzBdLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMubWVudUl0ZW1zLmluZGV4T2YoaXRlbVswXSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYUxpbmhhQWNhb1ZhemlhKHJvd0RhdGE6IGFueSkge1xyXG4gICAgdmFyIGFsZ3VtSXRlbVZpc2l2ZWwgPSB0aGlzLmNvbmZpZy5hY3Rpb25zLnNvbWUoKGEpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiBhLnZpc2libGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICByZXR1cm4gYS52aXNpYmxlKHJvd0RhdGEpID09PSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBSZXRvcm5hIHRydWUgc2UgYS52aXNpYmxlKHJvd0RhdGEpIG7Do28gZXhpc3RpclxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gIWFsZ3VtSXRlbVZpc2l2ZWw7XHJcbiAgfVxyXG5cclxuICBkb3VibGVDbGljayhlOiBhbnksIHJvd0RhdGE6IGFueSkge1xyXG4gICAgbGV0IGV2ZW50RG91YmxlQ2xpY2sgPSB7IGV2ZW50OiBlLCByb3dEYXRhOiByb3dEYXRhIH07XHJcblxyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZS50YXJnZXQuY2xhc3NMaXN0LmZvckVhY2goKHg6IGFueSkgPT4gYXJyYXkucHVzaCh4KSk7XHJcblxyXG4gICAgLy9pZiAoYXJyYXkuZmluZCgoeDogYW55KSA9PiB4ID09ICduZy1zdGFyLWluc2VydGVkJykgIT0gdW5kZWZpbmVkKVxyXG4gICAgdGhpcy5kb3VibGVDbGlja0V2ZW50LmVtaXQoZXZlbnREb3VibGVDbGljayk7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXHJcbiAgICAgID8gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uKHJvd0RhdGEpXHJcbiAgICAgIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm5Ub29sdGlwUm93KHJvd0RhdGE6IGFueSwgY29sOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcHJvdycpO1xyXG4gIH1cclxuXHJcbiAgaXNTd2l0Y2hGaWVsZChjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0b3JubyA9IGNvbC5maWVsZFR5cGUgJiYgY29sLmZpZWxkVHlwZSA9PT0gJ3N3aXRjaCcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gcmV0b3JubztcclxuICB9XHJcblxyXG4gIG9uU3dpdGNoQ2hhbmdlKGVzdGFkbzogYW55LCByb3dEYXRhOiBib29sZWFuLCBjb2w6IGFueSkge1xyXG4gICAgdGhpcy5vblN3aXRjaFRhYmxlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBlc3RhZG86IGVzdGFkbyxcclxuICAgICAgcm93RGF0YTogcm93RGF0YSxcclxuICAgICAgY29sOiBjb2xcclxuICAgIH0pXHJcbiAgfVxyXG4gIGlzQnV0dG9uRGlzYWJsZShhY3Rpb246IGFueSwgcm93RGF0YTogYW55LCBjb21tYW5kRXZlbnQ6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5jYWxsRGlzYWJsZWQoYWN0aW9uLCByb3dEYXRhKSkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9IGVsc2UgcmV0dXJuIHRoaXMuYWN0aXZlSXRlbShyb3dEYXRhKSwgYWN0aW9uPy5jb21tYW5kKGNvbW1hbmRFdmVudCk7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVFZGl0Um93RnVuY3Rpb24ocm93RGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUVkaXRSb3dGdW5jdGlvbiA/IHRoaXMuY29uZmlnLmRpc2FibGVFZGl0Um93RnVuY3Rpb24ocm93RGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzRGlzYWJsZUVkaXRSb3dDZWxsRnVuY3Rpb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvbC5kaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbiA/IGNvbC5kaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNFZGl0YWJsZVRhYmxlKCk6IGJvb2xlYW4gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5jb25maWcuY29sdW1ucylcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbHVtbnMuc29tZSgoY29sdW1uOiBhbnkpID0+ICdmaWVsZENvbnRyb2xUeXBlJyBpbiBjb2x1bW4pO1xyXG4gIH1cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgY2xhc3M9XCJjYXJkXCIgPlxyXG4gIDxwLXRvYXN0PjwvcC10b2FzdD5cclxuXHJcbiAgPHAtcGFuZWxcclxuICAgICpuZ0lmPVwiZmlsdHJvc0F2YW5jYWRvc1wiXHJcbiAgICBoZWFkZXI9XCJGaWx0cm9zIGF2YW7Dp2Fkb3NcIlxyXG4gICAgW3RvZ2dsZWFibGVdPVwidHJ1ZVwiXHJcbiAgICBbY29sbGFwc2VkXT1cInRydWVcIlxyXG4gICAgKGNvbGxhcHNlZENoYW5nZSk9XCJjb2xsYXBzZWQgPSAhY29sbGFwc2VkXCJcclxuICAgIFtzdHlsZV09XCJ7ICdtYXJnaW4tYm90dG9tJzogJzJweCcgfVwiXHJcbiAgPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlcmljb25zXCI+XHJcbiAgICAgIDxpXHJcbiAgICAgICAgKm5nSWY9XCIhY29sbGFwc2VkXCJcclxuICAgICAgICBjbGFzcz1cInBpIHBpLWZpbHRlclwiXHJcbiAgICAgID48L2k+XHJcbiAgICAgIDwhLS0gw41jb25lIHF1YW5kbyBvIHBhaW5lbCBlc3TDoSBhYmVydG8gLS0+XHJcbiAgICAgIDxpXHJcbiAgICAgICAgKm5nSWY9XCJjb2xsYXBzZWRcIlxyXG4gICAgICAgIGNsYXNzPVwicGkgcGktbWludXNcIlxyXG4gICAgICA+PC9pPlxyXG4gICAgICA8IS0tIMONY29uZSBxdWFuZG8gbyBwYWluZWwgZXN0w6EgZmVjaGFkbyAtLT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgPC9wLXBhbmVsPlxyXG5cclxuICA8cC1jb250ZXh0TWVudSAjY20gW21vZGVsXT1cIml0ZW1zXCI+PC9wLWNvbnRleHRNZW51PlxyXG4gIDxwLXRhYmxlXHJcbiAgI3RlXHJcbiAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJjb25maWcucmVvcmRlcmFibGVDb2x1bW5zIHx8IGZhbHNlXCJcclxuICAqbmdJZj1cImNvbmZpZ1wiXHJcbiAgW3ZhbHVlXT1cImRhdGFTb3VyY2VcIlxyXG4gIFtkYXRhS2V5XT1cImNvbmZpZy5kYXRhS2V5XCJcclxuICBbdGFibGVTdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnNTByZW0nIH1cIlxyXG4gIFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCJcclxuICBbZWRpdE1vZGVdPVwiJ3JvdydcIlxyXG4gIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gIHNjcm9sbEhlaWdodD1cIjQwMHB4XCJcclxuICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gIFtzdHlsZUNsYXNzXT1cIidwLWRhdGF0YWJsZS1zbSdcIlxyXG4gIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcclxuICBbcm93U2VsZWN0YWJsZV09XCJpc1Jvd1NlbGVjdGFibGVcIlxyXG4gIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZ2xvYmFsRmlsdGVyRmllbGRzXCJcclxuICBbcm93c109XCJyb3dzXCJcclxuICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXHJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxyXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXHJcbiAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gLSB7bGFzdH0gZGUge3sgdG90YWxSZWNvcmRzIH19XCJcclxuICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICBbcm93SG92ZXJdPVwidHJ1ZVwiXHJcbiAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxyXG4gIFtsYXp5XT1cImNvbmZpZy5sYXp5XCJcclxuICAob25MYXp5TG9hZCk9XCJwYWdpbmF0ZSgkZXZlbnQpXCJcclxuICBbZ3JvdXBSb3dzQnldPVwiY29uZmlnLmZpZWxkR3JvdXBcIlxyXG4gIFtzaG93Rmlyc3RMYXN0SWNvbl09XCJzaG93Rmlyc3RMYXN0SWNvblwiXHJcbiAgW3BhZ2VMaW5rc109XCJwYWdlTGlua3NPcHRpb25zXCJcclxuICBbc2Nyb2xsYWJsZV09XCJpc1RhYmxlU2Nyb2xsYWJsZVwiXHJcbiAgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIlxyXG4gIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnkgXCJcclxuICBbKGNvbnRleHRNZW51U2VsZWN0aW9uKV09XCJzZWxlY3RlZFByb2R1Y3RcIlxyXG4gIFtjb250ZXh0TWVudV09XCIgaXNFZGl0YWJsZVRhYmxlKCkgPyBjbSA6IG51bGxcIlxyXG4gID5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGVcclxuICAgICAgcFRlbXBsYXRlPVwiY2FwdGlvblwiXHJcbiAgICAgICpuZ0lmPVwiY29uZmlnLmVuYWJsZUNhdGlvblwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZmxleCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy50aXRsZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgbXktM1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGNvbmZpZy50aXRsZSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnN1YnRpdGxlXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIG1iLTQgZm9udC1tZWRpdW1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VidGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWQ6Y29sLTYgbGc6Y29sLTQge3tcclxuICAgICAgICAgICAgdGFtYW5ob1RlbGEgPCA3NjggPyAnY29sLTEwJyA6ICdjb2wtMTInXHJcbiAgICAgICAgICB9fSBtdC0xIG1iLTIgXCI+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy5lbmFibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgcEF1dG9Gb2N1c1xyXG4gICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkdsb2JhbEZpbHRlcih0ZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQZXNxdWlzYXIuLi5cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC0ycmVtXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGNvbC0xIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc0xvdGVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0bnMtb3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtYXJnaW4tcmlnaHQnOiAnN3B4JyB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGlkPVwiYWN0aW9uTG90ZUJ0bnNcIlxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCB8fCBhY3Rpb24uc2hvd0Fjb2VzTG90ZSkgJiZcclxuICAgICAgICAgICAgICAgIGV4aWJpckNhbXBvKGFjdGlvbiwgdGhpcy5hY3Rpb24pXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbkxvdGVCdG5zIHAtYnV0dG9uLXJhaXNlZCBwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiXHJcbiAgICAgICAgICAgICAgICBhY3Rpb24/LmNvbW1hbmQoY29tbWFuZEV2ZW50KTsgYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgJ3Rvb2x0aXAnKVwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInYm90dG9tJ1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJcclxuICAgICAgICAgICAgICAgIHJldG9ybmFyQ2FtcG8oYWN0aW9uLCBzZWxlY3RlZEl0ZW1zLCAnYnRuQ29sb3InKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCBzZWxlY3RlZEl0ZW1zLCAnZGlzYWJsZWQnKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG1kLTIyXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHNlbGVjdGVkSXRlbXMsICdpY29uQnRuQ29sb3InKVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyByZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgXCJpY29uXCIpIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgIHBUZW1wbGF0ZT1cImhlYWRlclwiXHJcbiAgICAgIGxldC1jb2x1bW5zXHJcbiAgICA+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW07IGJvcmRlci1sZWZ0OiBzb2xpZCA0cHggdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuZW5hYmxlU2VsZWN0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IChjbGljayk9XCJhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVwiPjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCJjb2wuc29ydGFibGUgPT09IGZhbHNlXCJcclxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sLndpZHRoXCJcclxuICAgICAgICAgIHBSZW9yZGVyYWJsZUNvbHVtblxyXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSAmJiBhbGlnbkNvbHVuYXNIZWFkZXIoY29sKSA9PSAnJ1xyXG4gICAgICAgICAgICAgICAgPyAnZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xyXG4gICAgICAgICAgICAgICAgOiAnZmxleCBmbGV4LXJvdydcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cImFsaWduQ29sdW5hc0hlYWRlcihjb2wpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNwYW4+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHAtc29ydEljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cImNvbC5zb3J0YWJsZSA9PT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEwcHhcIlxyXG4gICAgICAgICAgICA+PC9wLXNvcnRJY29uPlxyXG5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oZWFkZXJUb29sdGlwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgID5pbmZvPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggKm5nSWY9XCJjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwXCI+PC90aD5cclxuICAgICAgICA8dGggKm5nSWY9XCJpc0VkaXRhYmxlVGFibGUoKVwiICBpZD1cInRoLWVkaXRcIiBzdHlsZT1cIndpZHRoOiAyMHB4XCI+RWRpdGFyPC90aD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XHJcblxyXG5cclxuXHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgIGxldC1yb3dncm91cD1cInJvd2dyb3VwXCIgbGV0LXJvd3NwYW49XCJyb3dzcGFuXCI+XHJcbiAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cInJvd0RhdGFcIiBbcEVkaXRhYmxlUm93RGlzYWJsZWRdPVwiZmFsc2VcIlxyXG4gICAgICBbcENvbnRleHRNZW51Um93XT1cIntyb3dEYXRhLCBlZGl0aW5nfVwiXHJcbiAgICAgID5cclxuXHJcblxyXG4gICAgICAgIDx0ZFxyXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcuZW5hYmxlU2VsZWN0XCJcclxuICAgICAgICAgIFtzdHlsZV09XCJhcHBseVN0eWxlKHJvd0RhdGEsIHsgZmllbGQ6ICdjaGVjay1ib3gnLCBoZWFkZXI6ICcnIH0pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8IS0tPHAtdGFibGVDaGVja2JveCAqbmdJZj1cImlzVmlzaWJsZUNoZWNrYm94KHJvd0RhdGEpXCItLT5cclxuICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInJvd0RhdGFcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZENoZWNrYm94KHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcclxuICAgICAgICAgID48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XHJcbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuXHJcbiAgICAgICAgICA8IS0tIENlbHVsYSBxdWUgYXJtYXplbmEgb3MgY29udHJvbGVzIGRlIGVkacOnw6NvIHBhcmEgb3MgY2FtcG9zIC0tPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiY29sLmZpZWxkQ29udHJvbFR5cGVcIlxyXG4gICAgICAgICAgW2lkXT1cIidyb3dUYWJsZScrIHJvd0RhdGFbY29uZmlnLmRhdGFLZXldXCJcclxuICAgICAgICAgIHBTZWxlY3RhYmxlUm93RGJsQ2xpY2s9XCJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW0ocm93RGF0YSlcIlxyXG4gICAgICAgICAgKGRibGNsaWNrKT1cImRiQ2xpY2tFZGl0KClcIlxyXG4gICAgICAgICAgcFNlbGVjdGFibGVSb3dEYmxDbGljaz1cIlwiXHJcbiAgICAgICAgICBjbGFzcz1cInJvd1RhYmxlXCIgW3N0eWxlXT1cIlxyXG4gICAgICAgICAgYXBwbHlTdHlsZShyb3dEYXRhLCBjb2wpICtcclxuICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICtcclxuICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpIFwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwUm93KHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8cC1jZWxsRWRpdG9yIFtuZ0NsYXNzXT1cInsnc3dpdGNoJzogY29sLmZpZWxkQ29udHJvbFR5cGUgPT0gJ3N3aXRjaCd9XCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBDb250cm9sZSBkZSBlZGnDp8OjbyBkbyBjYW1wbyAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRDb250cm9sVHlwZVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8a3YtaW5wdXQtdGV4dCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiIFtyZXF1aXJlZF09XCJjb2wucmVxdWlyZWQgPz8gdHJ1ZVwiPjwva3YtaW5wdXQtdGV4dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiIGNsYXNzPVwiZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LW51bWJlciBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiIFtyZXF1aXJlZF09XCJjb2wucmVxdWlyZWQgPz8gdHJ1ZVwiPjwva3YtaW5wdXQtbnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtYXNrJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiIGNsYXNzPVwiZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LW1hc2sgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUVkaXRSb3dDZWxsRnVuY3Rpb24ocm93RGF0YSwgY29sKVwiIGNsYXNzPVwiY2VsbENvbnRyb2wgY29sXCIgW21hc2tdPVwiY29sLm1hc2tcIiBbcmVxdWlyZWRdPVwiY29sLnJlcXVpcmVkID8/IHRydWVcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiPjwva3YtaW5wdXQtbWFzaz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3dpdGNoJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiIGNsYXNzPVwiZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGt2LXN3aXRjaCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiID48L2t2LXN3aXRjaD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8a3YtaW5wdXQtY2FsZW5kYXIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiPjwva3YtaW5wdXQtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiICBjbGFzcz1cImdyaWQgZm9ybWdyaWQgcC1mbHVpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVFZGl0Um93Q2VsbEZ1bmN0aW9uKHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxDb250cm9sIGNvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wuZmllbGREcm9wRG93bkNvbnRyb2wuZGVzY3JpY2Fvb2JqZXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImNvbC5maWVsZERyb3BEb3duQ29udHJvbC5pZG9iamV0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbC5maWVsZERyb3BEb3duQ29udHJvbC5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuXHJcblxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBWYWxvciBhdHVhbCBkbyBjYW1wbyAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wuZmllbGRDb250cm9sVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGFbY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgIHJldG9ybmFEZXNjcmljYW9Ecm9wKFxyXG4gICAgICAgICAgICAgICAgICAgICAgcm93RGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbFxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tyb3dEYXRhW2NvbC5maWVsZF19fSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3dpdGNoJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2ggWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5maWVsZF1cIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPjwva3Ytc3dpdGNoPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjYWxlbmRhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gfCBkYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21hc2snXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdIHwgbWFzazpjb2wubWFzayB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICA8L3RkPlxyXG5cclxuXHJcbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgIDx0ZCAqbmdJZj1cInJvd2dyb3VwICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW2F0dHIucm93c3Bhbl09XCJyb3dncm91cCAmJiBjb2wuZ3JvdXBlZCA/IHJvd3NwYW4gOiBudWxsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3dUYWJsZVwiIFtzdHlsZV09XCJcclxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xyXG4gICAgICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICtcclxuICAgICAgICAgICAgICBhbGlnbkNvbHVuYXMoY29sKVxyXG4gICAgICAgICAgICBcIiBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcFJvdyhyb3dEYXRhLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQm9vbGVhbkZpZWxkKHJvd0RhdGEsIGNvbCk7IGVsc2UgYm9vbGVhbkZpZWxkXCIgW2NsYXNzXT1cInJldHVyblJvd0NsYXNzKHJvd0RhdGEsIGNvbClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAhaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCAmJiAhaXNJbWFnZUZpZWxkKGNvbClcclxuICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2wuaWNvblwiIFtjbGFzc109XCJjb2wuaWNvbiArICcgbXItMidcIj48L2k+XHJcbiAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cInJldHVybkNsYXNzQ2hpcChyb3dEYXRhLCBjb2wpXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBJY29uKHJvd0RhdGEsIGNvbClcIj57e1xyXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzSW1hZ2VGaWVsZChjb2wpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sLmljb25GaWVsZFwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdtYXRlcmlhbC1pY29ucyc6IGNvbC5pbmRJY29uTWF0ZXJpYWwsXHJcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcclxuICAgICAgICAgICAgICB9XCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBJY29uKHJvd0RhdGEsIGNvbClcIj5cclxuICAgICAgICAgICAgICB7eyByZXR1cm5DbGFzc0ljb24ocm93RGF0YSwgY29sKSB9fVxyXG4gICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Jvb2xlYW5GaWVsZD5cclxuICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbClcIiBbbmdDbGFzc109XCJcclxuICAgICAgICAgICAgICAgICAgcm93RGF0YVtjb2wuZmllbGRdID8gJ3RleHQtZ3JlZW4tNTAwJyA6ICd0ZXh0LXJlZC01MDAnXHJcbiAgICAgICAgICAgICAgICBcIj48c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU3dpdGNoRmllbGQoY29sKVwiIFtjbGFzc109XCJyZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpXCI+XHJcbiAgICAgICAgICAgICAgICA8a3Ytc3dpdGNoIChvblN3aXRjaENoYW5nZSk9XCJvblN3aXRjaENoYW5nZSgkZXZlbnQsIHJvd0RhdGEsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIiBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9rdi1zd2l0Y2g+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICA8dGQgKm5nSWY9XCIhcm93Z3JvdXAgJiYgIWNvbC5ncm91cGVkICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW3N0eWxlXT1cIlxyXG4gICAgICAgICAgICAgIGFwcGx5U3R5bGUocm93RGF0YSwgY29sKSArXHJcbiAgICAgICAgICAgICAgY2VudHJhbGl6YXJDb2x1bmFzKGNvbCkgK1xyXG4gICAgICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpXHJcbiAgICAgICAgICAgIFwiIGNsYXNzPVwicm93VGFibGVcIiBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcFJvdyhyb3dEYXRhLCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQm9vbGVhbkZpZWxkKHJvd0RhdGEsIGNvbCk7IGVsc2UgYm9vbGVhbkZpZWxkXCIgW2NsYXNzXT1cInJldHVyblJvd0NsYXNzKHJvd0RhdGEsIGNvbClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAhaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCAmJiAhaXNJbWFnZUZpZWxkKGNvbClcclxuICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2wuaWNvblwiIFtjbGFzc109XCJjb2wuaWNvbiArICcgbXItMidcIj48L2k+XHJcbiAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cInJldHVybkNsYXNzQ2hpcChyb3dEYXRhLCBjb2wpXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBJY29uKHJvd0RhdGEsIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAge3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltYWdlXCIgW3NyY109XCJsb2FkSW1hZ2Uocm93RGF0YSwgY29sKVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uRmllbGRcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtaWNvbnMnOiBjb2wuaW5kSWNvbk1hdGVyaWFsLFxyXG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgbXItMic6ICFjb2wuaW5kSWNvbk1hdGVyaWFsXHJcbiAgICAgICAgICAgICAgfVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XHJcbiAgICAgICAgICAgICAge3sgcmV0dXJuQ2xhc3NJY29uKHJvd0RhdGEsIGNvbCkgfX1cclxuICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNib29sZWFuRmllbGQ+XHJcbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCIhY29sLmljb25GaWVsZCAmJiAhaXNTd2l0Y2hGaWVsZChjb2wpXCIgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xyXG4gICAgICAgICAgICAgICAgXCI+PHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmZpZWxkXSA/IFwiY2hlY2tcIiA6IFwiY2xvc2VcIiB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1N3aXRjaEZpZWxkKGNvbClcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPGt2LXN3aXRjaCAob25Td2l0Y2hDaGFuZ2UpPVwib25Td2l0Y2hDaGFuZ2UoJGV2ZW50LCByb3dEYXRhLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbD8ub25seVJlYWRGaWVsZCA/PyB0cnVlXCIgW3N3aXRjaFZhbHVlXT1cInRyYW5zZm9ybVZhbHVlKHJvd0RhdGEsIGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiY29sLnRlbXBsYXRlICYmICFjb2wuZmllbGRDb250cm9sVHlwZVwiIFtzdHlsZV09XCJcclxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xyXG4gICAgICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICtcclxuICAgICAgICAgICAgICBhbGlnbkNvbHVuYXMoY29sKVxyXG4gICAgICAgICAgICBcIiBjbGFzcz1cInJvd1RhYmxlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEN1c3RvbVRlbXBsYXRlKGNvbC50ZW1wbGF0ZS5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd0RhdGEgfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuICAgICAgPCEtLSBDb250cm9sZSBkZSBhw6fDo28gIC0tPlxyXG4gICAgICA8dGQgW25nQ2xhc3NdPVwieyd0ZC10b29scyc6IGlzRWRpdGFibGVUYWJsZSgpLCAndGQtdG9vbHMtc3RpY2t5JzogIWlzRWRpdGFibGVUYWJsZSgpIH1cIlxyXG4gICAgICAgICpuZ0lmPVwiY29uZmlnLmFjdGlvbnMgJiYgY29uZmlnLmFjdGlvbnMubGVuZ3RoID4gMCAmJiAhZWRpdGluZ1wiXHJcbiAgICAgICAgW3N0eWxlXT1cImFwcGx5U3R5bGUocm93RGF0YSwgeyBmaWVsZDogJ2J0bnMtb3B0aW9ucycsIGhlYWRlcjogJycgfSlcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsIGdhcC0xXCJcclxuICAgICAgICAgICpuZ0lmPVwiYWNvZXNMaW5oYVRhYmVsYVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJtci0xXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPCEtLSA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgaWQ9XCJhY3Rpb25CdG5zXCJcclxuICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJleGliaXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbkJ0bnMgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yYWlzZWRcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtKHJvd0RhdGEpOyBhY3Rpb24/LmNvbW1hbmQoY29tbWFuZEV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCByb3dEYXRhLCAndG9vbHRpcCcpXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIlxyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnRvb2x0aXBQb3NpdGlvbiA/IGFjdGlvbi50b29sdGlwUG9zaXRpb24gOiAnYm90dG9tJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNhbGxEaXNhYmxlZChhY3Rpb24sIHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtZC0xOVwiPlxyXG4gICAgICAgICAgICAgICAge3sgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEsIFwiaWNvblwiKSB9fTwvc3BhblxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9idXR0b24+IC0tPlxyXG5cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQge3tcclxuICAgICAgICAgICAgICAgIGNhbGxEaXNhYmxlZChhY3Rpb24sIHJvd0RhdGEpXHJcbiAgICAgICAgICAgICAgICAgID8gJ3RleHQtZ3JheS00MDAgY3Vyc29yLWF1dG8nXHJcbiAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJ1xyXG4gICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMjBweFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlzQnV0dG9uRGlzYWJsZShhY3Rpb24sIHJvd0RhdGEsIGNvbW1hbmRFdmVudClcIlxyXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXRvcm5hckNhbXBvKGFjdGlvbiwgcm93RGF0YSwgJ3Rvb2x0aXAnKVwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJcclxuICAgICAgICAgICAgICAgIGFjdGlvbi50b29sdGlwUG9zaXRpb24gPyBhY3Rpb24udG9vbHRpcFBvc2l0aW9uIDogJ2JvdHRvbSdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgcmV0b3JuYXJDYW1wbyhhY3Rpb24sIHJvd0RhdGEsIFwiaWNvblwiKSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGxcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhYWNvZXNMaW5oYVRhYmVsYVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwibW9yZVZlcnRCdG5cIlxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uQnRucyBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpOyBhY3RpdmVJdGVtKHJvd0RhdGEpXCJcclxuICAgICAgICAgID4gLS0+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3Vyc29yLXBvaW50ZXIgaWNvbi1tb3JlLWhvcml6XCJcclxuICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDIwcHhcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KTsgYWN0aXZlSXRlbShyb3dEYXRhKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIG1vcmVfaG9yaXpcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwhLS0gPC9idXR0b24+IC0tPlxyXG5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICB7eyBjcmlhck1lbnVzTW9kYWwocm93RGF0YSkgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIHt7IGNyaWFyTWVudXNNb2RhbChyb3dEYXRhKSB9fVxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICAgIDxwLW1lbnVcclxuICAgICAgICAgICAgI21lbnVcclxuICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbW9kZWxdPVwibWVudUl0ZW1zXCJcclxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgID48L3AtbWVudT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZD5cclxuXHJcbiAgICAgIDx0ZFxyXG4gICAgICBjbGFzcz1cInRkLXRvb2xzXCJcclxuICAgICAgKm5nSWY9XCJjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwICYmIGVkaXRpbmdcIlxyXG4gICAgICBbc3R5bGVdPVwiYXBwbHlTdHlsZShyb3dEYXRhLCB7IGZpZWxkOiAnYnRucy1vcHRpb25zJywgaGVhZGVyOiAnJyB9KVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGwgZ2FwLTFcIlxyXG4gICAgICAgICpuZ0lmPVwiYWNvZXNMaW5oYVRhYmVsYVwiXHJcbiAgICAgID5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCJcclxuICAgICAgICAqbmdJZj1cIiFhY29lc0xpbmhhVGFiZWxhXCJcclxuICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC90ZD5cclxuXHJcblxyXG5cclxuICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgICA8IS0tIENvbnRyb2xlIGRlIGVkacOnw6NvIC0tPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInRkLWVkaXRcIiAqbmdJZj1cInRoaXMuaXNFZGl0YWJsZVRhYmxlKClcIiA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFtzdHlsZS5oZWlnaHRdPVwiJzI4cHgnXCIgW2lkXT1cIidyb3dFZGl0JyArIHJvd0RhdGFbY29uZmlnLmRhdGFLZXldIFwiIFtzdHlsZS53aWR0aF09XCInMjhweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dFZGl0SW5pdChyb3dEYXRhKVwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gW3N0eWxlLmhlaWdodF09XCInMjhweCdcIiBbc3R5bGUud2lkdGhdPVwiJzI4cHgnXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUVkaXRSb3dGdW5jdGlvbihyb3dEYXRhKVwiICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktY2hlY2tcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0VkaXRTYXZlKHJvd0RhdGEsIHJpKVwiIFtpZF09XCIncm93U2F2ZScgKyByb3dEYXRhW2NvbmZpZy5kYXRhS2V5XSBcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTJcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuaGVpZ2h0XT1cIicyOHB4J1wiIFtzdHlsZS53aWR0aF09XCInMjhweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dFZGl0Q2FuY2VsKHJvd0RhdGEsIHJpKVwiIFtpZF09XCIncm93Q2FuY2VsJyArIHJvd0RhdGFbY29uZmlnLmRhdGFLZXldIFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==
1
+ import { Component, EventEmitter, Input, Output, HostListener } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "../../../public-api";
6
+ import * as i3 from "primeng/api";
7
+ import * as i4 from "primeng/autofocus";
8
+ import * as i5 from "primeng/button";
9
+ import * as i6 from "primeng/contextmenu";
10
+ import * as i7 from "primeng/tooltip";
11
+ import * as i8 from "primeng/dropdown";
12
+ import * as i9 from "primeng/inputtext";
13
+ import * as i10 from "primeng/menu";
14
+ import * as i11 from "primeng/panel";
15
+ import * as i12 from "primeng/ripple";
16
+ import * as i13 from "primeng/table";
17
+ import * as i14 from "primeng/toast";
18
+ import * as i15 from "@angular/forms";
19
+ import * as i16 from "../kv-inputs/kv-input-calendar/kv-input-calendar.component";
20
+ import * as i17 from "../kv-inputs/kv-input-mask/kv-input-mask.component";
21
+ import * as i18 from "../kv-inputs/kv-input-number/kv-input-number.component";
22
+ import * as i19 from "../kv-inputs/kv-input-text/kv-input-text.component";
23
+ import * as i20 from "../kv-inputs/kv-switch/kv-switch.component";
24
+ import * as i21 from "../../api/pipes/mask.pipe";
25
+ export class KvTableEditComponent {
26
+ set setConfig(value) {
27
+ this.config = {
28
+ enableCation: value.enableCation || true,
29
+ enableSelect: value.enableSelect || false,
30
+ enableFilter: value.enableFilter || true,
31
+ ...value,
32
+ };
33
+ // if (this.config.enableFilter) {
34
+ // this.config.columns.forEach((col) => {
35
+ // this.globalFilterFields.push(col.field);
36
+ // });
37
+ // }
38
+ }
39
+ constructor(datePipe, decimalPipe, codigoFipePipe, cpfCnpjPipe, telefonePipe, notificationService) {
40
+ this.datePipe = datePipe;
41
+ this.decimalPipe = decimalPipe;
42
+ this.codigoFipePipe = codigoFipePipe;
43
+ this.cpfCnpjPipe = cpfCnpjPipe;
44
+ this.telefonePipe = telefonePipe;
45
+ this.notificationService = notificationService;
46
+ this.collapsed = false;
47
+ this.globalFilterFields = [];
48
+ this.editMode = 'cell';
49
+ this.selectedItems = [];
50
+ this.paginator = true;
51
+ this.rows = 5;
52
+ this.pageLinksOptions = 1;
53
+ this.showFirstLastIcon = false;
54
+ this.applyStyle = (rowData, col) => '';
55
+ this.acoesLinhaTabela = true;
56
+ this.filterColumnsBtn = false;
57
+ this.filtrosAvancados = false;
58
+ this.scrollHeight = '';
59
+ this.isTableScrollable = false;
60
+ this.rowTrackBy = (index, item) => item;
61
+ this.responsiveLayout = true;
62
+ this.espacamentoPai = '2px';
63
+ this.espacamentoLateral = true;
64
+ this.rightCollapse = false;
65
+ this.onFilter = new EventEmitter();
66
+ this.selectedSize = '';
67
+ this.menuItems = [];
68
+ this.imgDefault = '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';
69
+ this.isExpanded = false;
70
+ this.clonedDataSource = {};
71
+ /** Emite evento de salvamento da linha */
72
+ this.onRowSave = new EventEmitter();
73
+ this.onActiveItem = new EventEmitter();
74
+ this.onActiveItemLote = new EventEmitter();
75
+ this.onPaginate = new EventEmitter();
76
+ this.onSelectionChange = new EventEmitter();
77
+ this.doubleClickEvent = new EventEmitter();
78
+ this.filterField = new EventEmitter();
79
+ this.onSwitchTableChange = new EventEmitter();
80
+ this.selectedProduct = {
81
+ rowData: {},
82
+ editing: false
83
+ };
84
+ this.isRowSelectable = this.isRowSelectable.bind(this);
85
+ }
86
+ ngOnInit() {
87
+ this.tamanhoTela = window.innerWidth;
88
+ this.items = [
89
+ {
90
+ label: 'Editar linha', icon: 'pi pi-fw pi-pencil', command: () => {
91
+ const element = document.getElementById('rowEdit' + this.selectedProduct.rowData[this.config.dataKey]);
92
+ if (element && !this.config.disableEditRowFunction?.(this.selectedProduct.rowData)) {
93
+ element.click();
94
+ }
95
+ else {
96
+ this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
97
+ }
98
+ this.onRowEditInit(this.selectedProduct);
99
+ }
100
+ },
101
+ {
102
+ label: 'Cancelar edição', icon: 'pi pi-fw pi-times', command: (data) => {
103
+ const element = document.getElementById('rowCancel' + this.selectedProduct.rowData[this.config.dataKey]);
104
+ if (element) {
105
+ element.click();
106
+ }
107
+ else {
108
+ this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
109
+ }
110
+ }
111
+ },
112
+ {
113
+ label: 'Salvar edição', icon: 'pi pi-fw pi-save', command: (data) => {
114
+ const element = document.getElementById('rowSave' + this.selectedProduct.rowData[this.config.dataKey]);
115
+ if (element) {
116
+ element.click(); // Dispara um evento de clique no elemento com ID 'teste'
117
+ }
118
+ else {
119
+ this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
120
+ }
121
+ }
122
+ },
123
+ ];
124
+ }
125
+ ngDoCheck() {
126
+ this.items[0].visible = !this.selectedProduct.editing && this.isEditableTable() !== false;
127
+ this.items[1].visible = this.selectedProduct.editing && this.isEditableTable() !== false;
128
+ this.items[2].visible = this.selectedProduct.editing && this.isEditableTable() !== false;
129
+ }
130
+ dbClickEdit() {
131
+ const element = document.getElementById('rowEdit' + this.selectedItem[this.config.dataKey]);
132
+ if (element) {
133
+ element.click();
134
+ }
135
+ else {
136
+ this.notificationService.toastWarn("A edição dessa linha esta desabilitada");
137
+ }
138
+ }
139
+ isRowSelectable(event) {
140
+ return !this.isDisabledCheckbox(event.data);
141
+ }
142
+ ngOnChanges(changes) {
143
+ //Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
144
+ //Add '${implements OnChanges}' to the class.
145
+ if (changes['setConfig'] && this.config) {
146
+ this.config.columns.forEach((e) => {
147
+ if (e.fieldControlType == 'dropdown') {
148
+ this.listarDrop(e.fieldDropDownControl?.fieldControlDropdownService, e);
149
+ }
150
+ });
151
+ }
152
+ }
153
+ onRowEditInit(rowData) {
154
+ this.clonedDataSource[rowData.id] = { ...rowData };
155
+ }
156
+ onRowEditSave(rowData, index) {
157
+ let errors = [];
158
+ //Validação do formulario fake
159
+ this.config.columns.forEach((col) => {
160
+ if (col.required ?? true) {
161
+ if (!rowData[col.field])
162
+ this.notificationService.toastWarn(`O campo ${col.header} e obrigatório! `);
163
+ }
164
+ if (col.validator) {
165
+ const tempFormControl = new FormControl(rowData[col.field], col.validator);
166
+ tempFormControl.markAllAsTouched();
167
+ tempFormControl.valid;
168
+ if (tempFormControl.invalid) {
169
+ this.notificationService.toastWarn(`Erro ao validar dados do campo: ${col.header}! `);
170
+ errors.push({ erro: "Campo invalido", campo: rowData[col.field] });
171
+ }
172
+ }
173
+ });
174
+ if (errors.length == 0) {
175
+ this.onRowSave.emit(rowData);
176
+ delete this.clonedDataSource[rowData.id];
177
+ }
178
+ else {
179
+ this.notificationService.toastWarn(`Erro de validação de dados! `);
180
+ // this.onRowEditCancel(rowData, index)
181
+ // this.onRowEditInit(rowData)
182
+ this.dataSource[index] = this.clonedDataSource[rowData.id];
183
+ delete this.clonedDataSource[rowData.id];
184
+ }
185
+ }
186
+ onRowEditCancel(product, index) {
187
+ this.dataSource[index] = this.clonedDataSource[product.id];
188
+ delete this.clonedDataSource[product.id];
189
+ }
190
+ async listarDrop(service, col, indtodos) {
191
+ const column = this.config.columns?.indexOf(col);
192
+ if (!col.fieldDropDownControl.fieldControlDropdownSource)
193
+ await service.Listar(indtodos || '').subscribe({
194
+ next: (data) => {
195
+ if (column) {
196
+ if (this.config && this.config.columns && column !== undefined) {
197
+ // @ts-ignore
198
+ this.config.columns[column].fieldDropDownControl.fieldControlDropdownSource = data;
199
+ }
200
+ return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
201
+ }
202
+ }
203
+ });
204
+ else
205
+ return this.config.columns[column].fieldDropDownControl?.fieldControlDropdownSource;
206
+ }
207
+ retornaDescricaoDrop(rowData, col) {
208
+ const data = col.fieldDropDownControl?.fieldControlDropdownSource;
209
+ const idobjeto = col.fieldDropDownControl?.idobjeto;
210
+ const descricaoobjeto = col.fieldDropDownControl?.descricaoobjeto;
211
+ // @ts-ignore
212
+ const valorAtual = rowData[col.field];
213
+ if (data && idobjeto && descricaoobjeto)
214
+ return data?.find((item) => item[idobjeto] == valorAtual)[descricaoobjeto];
215
+ else
216
+ return 'Carregando';
217
+ }
218
+ onGlobalFilter(table, event) {
219
+ this.onFilter.emit(event.target.value);
220
+ table.filterGlobal(event.target.value, 'contains');
221
+ }
222
+ onWindowResize() {
223
+ this.adjustTableSize();
224
+ this.tamanhoTela = window.innerWidth;
225
+ }
226
+ adjustTableSize() {
227
+ if (this.tableSize < 800) {
228
+ this.selectedSize = 'p-datatable-sm';
229
+ }
230
+ else {
231
+ this.selectedSize = '';
232
+ }
233
+ }
234
+ paginate($event) {
235
+ if ($event) {
236
+ let paginaInicial = ($event?.first > 0 ? $event.first / $event.rows : $event.first) + 1;
237
+ let termoPesquisa = '';
238
+ let ordenacao = '';
239
+ if ($event.globalFilter)
240
+ termoPesquisa = $event.globalFilter;
241
+ if ($event.sortField)
242
+ ordenacao = `${$event.sortField} ${$event.sortOrder === 1 ? 'ASC' : 'DESC'}`;
243
+ const objeto = {
244
+ paginaInicial: paginaInicial,
245
+ tamanhoPagina: $event.rows,
246
+ termoPesquisa: termoPesquisa,
247
+ ordenacao: ordenacao,
248
+ };
249
+ this.onPaginate.emit(objeto);
250
+ }
251
+ }
252
+ isBooleanField(rowData, col) {
253
+ return col.fieldType == 'boolean';
254
+ }
255
+ isChipField(col) {
256
+ return col.fieldType == 'chip';
257
+ }
258
+ isImageField(col) {
259
+ let retorno = col.fieldType && col.fieldType === 'image' ? true : false;
260
+ return retorno;
261
+ }
262
+ returnRowClass(rowData, col) {
263
+ let value = rowData[col.field];
264
+ let rowClass;
265
+ this.tableSize > 800 ? (rowClass = 'text-base') : (rowClass = 'text-sm');
266
+ if (col.expiredDate == true) {
267
+ new Date(value) < new Date()
268
+ ? (rowClass = rowClass + ' text-red-400 font-semibold')
269
+ : '';
270
+ }
271
+ return rowClass;
272
+ }
273
+ transformValue(rowData, col) {
274
+ let value = rowData[col.field];
275
+ if (value != null) {
276
+ if (!col.pipe) {
277
+ return value;
278
+ }
279
+ switch (col.pipe) {
280
+ case 'date':
281
+ return this.datePipe.transform(value, 'dd/MM/yyyy');
282
+ case 'decimal':
283
+ return this.decimalPipe.transform(value, '1.2-2', 'pt-BR');
284
+ case 'cpfcnpj':
285
+ return this.cpfCnpjPipe.transform(value);
286
+ case 'telefone':
287
+ return this.telefonePipe.transform(value);
288
+ case 'codigofipe':
289
+ return this.codigoFipePipe.transform(value);
290
+ case 'money':
291
+ return this.formatarValor(value);
292
+ case 'percentage':
293
+ return `${value} %`;
294
+ default:
295
+ break;
296
+ }
297
+ }
298
+ }
299
+ alignColunasHeader(col) {
300
+ if (col.align) {
301
+ if (col.align == 'right')
302
+ return 'justify-content: end';
303
+ else
304
+ return '';
305
+ }
306
+ else
307
+ return '';
308
+ }
309
+ centralizarColunas(col) {
310
+ if (col.centralize) {
311
+ return 'text-align: center; ';
312
+ }
313
+ else
314
+ return '';
315
+ }
316
+ alignColunas(col) {
317
+ if (col.align) {
318
+ return `text-align: ${col.align}`;
319
+ }
320
+ else
321
+ return '';
322
+ }
323
+ returnClassIcon(rowData, col) {
324
+ return this.retornarRow(rowData, col, 'iconrow');
325
+ }
326
+ returnTooltipIcon(rowData, col) {
327
+ return this.retornarRow(rowData, col, 'tooltipiconrow');
328
+ }
329
+ returnClassChip(rowData, col) {
330
+ return `chip-style w-auto border-round-2xl p-2 text-${this.retornarRow(rowData, col, 'stylechip')} border-${this.retornarRow(rowData, col, 'stylechip')}`;
331
+ }
332
+ retornarRow(rowData, col, field) {
333
+ const _rowaction = this.config.rows ? this.config.rows[col.field] : null;
334
+ const _field = _rowaction && _rowaction[field]
335
+ ? _rowaction[field].constructor === Function
336
+ ? _rowaction[field].apply(this, [rowData])
337
+ : _rowaction[field]
338
+ : null;
339
+ return _field;
340
+ }
341
+ selectionChange(value = []) {
342
+ this.onSelectionChange.emit(value);
343
+ }
344
+ formatarValor(valor) {
345
+ const formatter = new Intl.NumberFormat('pt-BR', {
346
+ style: 'currency',
347
+ currency: 'BRL',
348
+ });
349
+ return formatter.format(valor);
350
+ }
351
+ loadImage(rowData, col) {
352
+ /*
353
+ Nossa coluna de imagem trabalha com strings do tipo: base64 ou url
354
+ */
355
+ let retorno = `data:image/jpg;base64, ${this.imgDefault}`;
356
+ if (rowData && col && rowData[col.field] && rowData[col.field] !== '') {
357
+ if (rowData[col.field].includes('http'))
358
+ retorno = rowData[col.field];
359
+ else
360
+ retorno = `data:image/jpg;base64, ${rowData[col.field]}`;
361
+ }
362
+ return retorno;
363
+ }
364
+ getCustomTemplate(templatename) {
365
+ return this._templates[templatename];
366
+ }
367
+ exibirCampo(field, rowData) {
368
+ let visible = field.visible ? field.visible(rowData) : true;
369
+ return visible;
370
+ }
371
+ activeItem(rowData) {
372
+ this.selectedItem = rowData;
373
+ this.onActiveItem.emit({ rowData: rowData });
374
+ }
375
+ activeItemLote(rowData) {
376
+ this.onActiveItemLote.emit(rowData);
377
+ }
378
+ retornarCampo(action, rowData, field) {
379
+ const _function = action.dynamicfields
380
+ ? action.dynamicfields[field]
381
+ : null;
382
+ const _field = _function
383
+ ? _function.apply(action, [rowData])
384
+ : action[field];
385
+ return _field;
386
+ }
387
+ callDisabled(action, data) {
388
+ if (action?.disabled) {
389
+ return action.disabled(data);
390
+ }
391
+ return false;
392
+ }
393
+ criarMenusModal(data) {
394
+ if (this.config.actions && data) {
395
+ const items = this.config.actions.map((action) => {
396
+ const icon = this.retornarCampo(action, data, 'icon');
397
+ const tooltip = this.retornarCampo(action, data, 'tooltip');
398
+ const label = this.retornarCampo(action, data, 'label');
399
+ const command = this.retornarCampo(action, data, 'command');
400
+ const visible = action.visible
401
+ ? action.visible(data)
402
+ : true;
403
+ const disabled = action.disabled
404
+ ? action.disabled(data)
405
+ : false;
406
+ const menuInsert = {
407
+ label,
408
+ icon,
409
+ tooltip,
410
+ command,
411
+ disabled,
412
+ visible,
413
+ };
414
+ let item = this.menuItems.filter((x) => x.command == menuInsert.command);
415
+ if (item.length == 0)
416
+ this.menuItems.push(menuInsert);
417
+ else {
418
+ if (menuInsert.label != item[0].label) {
419
+ let index = this.menuItems.indexOf(item[0]);
420
+ this.menuItems.splice(index, 1);
421
+ }
422
+ if (menuInsert.visible != item[0].visible) {
423
+ let index = this.menuItems.indexOf(item[0]);
424
+ this.menuItems.splice(index, 1);
425
+ }
426
+ if (menuInsert.disabled != item[0].disabled) {
427
+ let index = this.menuItems.indexOf(item[0]);
428
+ this.menuItems.splice(index, 1);
429
+ }
430
+ }
431
+ });
432
+ }
433
+ }
434
+ validaLinhaAcaoVazia(rowData) {
435
+ var algumItemVisivel = this.config.actions.some((a) => {
436
+ if (typeof a.visible === 'function') {
437
+ return a.visible(rowData) === true;
438
+ }
439
+ else {
440
+ return true; // Retorna true se a.visible(rowData) não existir
441
+ }
442
+ });
443
+ return !algumItemVisivel;
444
+ }
445
+ doubleClick(e, rowData) {
446
+ let eventDoubleClick = { event: e, rowData: rowData };
447
+ let array = [];
448
+ e.target.classList.forEach((x) => array.push(x));
449
+ //if (array.find((x: any) => x == 'ng-star-inserted') != undefined)
450
+ this.doubleClickEvent.emit(eventDoubleClick);
451
+ }
452
+ isDisabledCheckbox(rowData) {
453
+ return this.config.disableControlCheckboxFunction
454
+ ? this.config.disableControlCheckboxFunction(rowData)
455
+ : false;
456
+ }
457
+ returnTooltipRow(rowData, col) {
458
+ return this.retornarRow(rowData, col, 'tooltiprow');
459
+ }
460
+ isSwitchField(col) {
461
+ let retorno = col.fieldType && col.fieldType === 'switch' ? true : false;
462
+ return retorno;
463
+ }
464
+ onSwitchChange(estado, rowData, col) {
465
+ this.onSwitchTableChange.emit({
466
+ estado: estado,
467
+ rowData: rowData,
468
+ col: col
469
+ });
470
+ }
471
+ isButtonDisable(action, rowData, commandEvent) {
472
+ if (this.callDisabled(action, rowData)) {
473
+ return '';
474
+ }
475
+ else
476
+ return this.activeItem(rowData), action?.command(commandEvent);
477
+ }
478
+ isDisableEditRowFunction(rowData) {
479
+ return this.config.disableEditRowFunction ? this.config.disableEditRowFunction(rowData) : false;
480
+ }
481
+ isDisableEditRowCellFunction(rowData, col) {
482
+ return col.disableEditRowCellFunction ? col.disableEditRowCellFunction(rowData) : false;
483
+ }
484
+ isEditableTable() {
485
+ if (!this.config.columns)
486
+ return null;
487
+ return this.config.columns.some((column) => 'fieldControlType' in column);
488
+ }
489
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: KvTableEditComponent, deps: [{ token: i1.DatePipe }, { token: i1.DecimalPipe }, { token: i2.CodigoFipePipe }, { token: i2.CpfCnpjPipe }, { token: i2.TelefonePipe }, { token: i2.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
490
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: KvTableEditComponent, selector: "kv-table-edit", inputs: { setConfig: ["config", "setConfig"], dataSource: "dataSource", editMode: "editMode", selectedItems: "selectedItems", totalRecords: "totalRecords", paginator: "paginator", rowsPerPageOptions: "rowsPerPageOptions", rows: "rows", pageLinksOptions: "pageLinksOptions", showFirstLastIcon: "showFirstLastIcon", tableSize: "tableSize", applyStyle: "applyStyle", acoesLinhaTabela: "acoesLinhaTabela", filterColumnsBtn: "filterColumnsBtn", filtrosAvancados: "filtrosAvancados", scrollHeight: "scrollHeight", isTableScrollable: "isTableScrollable", rowTrackBy: "rowTrackBy", responsiveLayout: "responsiveLayout", espacamentoPai: "espacamentoPai", espacamentoLateral: "espacamentoLateral", tamanhoTotalTabela: "tamanhoTotalTabela", rightCollapse: "rightCollapse", _templates: ["templates", "_templates"] }, outputs: { onFilter: "onFilter", onRowSave: "onRowSave", onActiveItem: "onActiveItem", onActiveItemLote: "onActiveItemLote", onPaginate: "onPaginate", onSelectionChange: "onSelectionChange", doubleClickEvent: "doubleClickEvent", filterField: "filterField", onSwitchTableChange: "onSwitchTableChange" }, host: { listeners: { "window:resize": "onWindowResize($event)" } }, usesOnChanges: true, ngImport: i0, template: "\n\n<div class=\"card\" >\n <p-toast></p-toast>\n\n <p-panel\n *ngIf=\"filtrosAvancados\"\n header=\"Filtros avan\u00E7ados\"\n [toggleable]=\"true\"\n [collapsed]=\"true\"\n (collapsedChange)=\"collapsed = !collapsed\"\n [style]=\"{ 'margin-bottom': '2px' }\"\n >\n <ng-template pTemplate=\"headericons\">\n <i\n *ngIf=\"!collapsed\"\n class=\"pi pi-filter\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\n <i\n *ngIf=\"collapsed\"\n class=\"pi pi-minus\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\n </ng-template>\n <ng-content></ng-content>\n </p-panel>\n\n <p-contextMenu #cm [model]=\"items\"></p-contextMenu>\n <p-table\n #te\n [reorderableColumns]=\"config.reorderableColumns || false\"\n *ngIf=\"config\"\n [value]=\"dataSource\"\n [dataKey]=\"config.dataKey\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n [columns]=\"config.columns\"\n [editMode]=\"'row'\"\n [scrollable]=\"true\"\n scrollHeight=\"400px\"\n appendTo=\"body\"\n [styleClass]=\"'p-datatable-sm'\"\n [(selection)]=\"selectedItems\"\n [rowSelectable]=\"isRowSelectable\"\n [globalFilterFields]=\"globalFilterFields\"\n [rows]=\"rows\"\n [paginator]=\"paginator\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\n (selectionChange)=\"selectionChange($event)\"\n [rowHover]=\"true\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"config.lazy\"\n (onLazyLoad)=\"paginate($event)\"\n [groupRowsBy]=\"config.fieldGroup\"\n [showFirstLastIcon]=\"showFirstLastIcon\"\n [pageLinks]=\"pageLinksOptions\"\n [scrollable]=\"isTableScrollable\"\n [scrollHeight]=\"scrollHeight\"\n [rowTrackBy]=\"rowTrackBy \"\n [(contextMenuSelection)]=\"selectedProduct\"\n [contextMenu]=\" isEditableTable() ? cm : null\"\n >\n\n\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <ng-template\n pTemplate=\"caption\"\n *ngIf=\"config.enableCation\"\n >\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\n <div class=\"col-12 flex flex-column\">\n <div\n *ngIf=\"config.title\"\n class=\"text-md font-bold my-3\"\n >\n {{ config.title }}\n </div>\n <div\n *ngIf=\"config.subtitle\"\n class=\"text-sm mb-4 font-medium\"\n >\n {{ config.subtitle }}\n </div>\n </div>\n\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\n tamanhoTela < 768 ? 'col-10' : 'col-12'\n }} mt-1 mb-2 \">\n <span\n *ngIf=\"config.enableFilter\"\n class=\"p-input-icon-left\"\n >\n <i class=\"pi pi-search\"></i>\n\n <input\n pInputText\n pAutoFocus\n [autofocus]=\"true\"\n type=\"text\"\n (input)=\"onGlobalFilter(te, $event)\"\n placeholder=\"Pesquisar...\"\n class=\"h-2rem\"\n />\n </span>\n\n </div>\n\n <div class=\"flex flex-row col-1 justify-content-end\">\n <div\n *ngFor=\"let action of config.actionsLote\"\n class=\"btns-options\"\n [style]=\"{ 'margin-right': '7px' }\"\n >\n <button\n id=\"actionLoteBtns\"\n pButton\n *ngIf=\"\n (selectedItems.length > 0 || action.showAcoesLote) &&\n exibirCampo(action, this.action)\n \"\n class=\"actionLoteBtns p-button-raised p-button-text\"\n (click)=\"\n action?.command(commandEvent); activeItemLote(selectedItems)\n \"\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\n [tooltipPosition]=\"'bottom'\"\n [style.backgroundColor]=\"\n retornarCampo(action, selectedItems, 'btnColor')\n \"\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\n >\n <span\n class=\"material-symbols-outlined md-22\"\n [style.color]=\"\n retornarCampo(action, selectedItems, 'iconBtnColor')\n \"\n >\n {{ retornarCampo(action, selectedItems, \"icon\") }}\n </span>\n </button>\n </div>\n </div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n <th\n style=\"width: 4rem; border-left: solid 4px transparent\"\n *ngIf=\"config.enableSelect\"\n >\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\n </th>\n\n <th\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"col.sortable === false\"\n [style.min-width]=\"col.width\"\n pReorderableColumn\n class=\"text-sm\"\n >\n <div\n [class]=\"\n centralizarColunas(col) && alignColunasHeader(col) == ''\n ? 'flex flex-row justify-content-center'\n : 'flex flex-row'\n \"\n [style]=\"alignColunasHeader(col)\"\n >\n <span>{{ col.header }}</span>\n <p-sortIcon\n *ngIf=\"col.sortable === true\"\n [field]=\"col.field\"\n style=\"font-size: 10px\"\n ></p-sortIcon>\n\n <span\n *ngIf=\"col.headerTooltip\"\n class=\"material-symbols-outlined flex align-items-center\"\n [pTooltip]=\"col.headerTooltip\"\n >info</span>\n </div>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\n <th *ngIf=\"isEditableTable()\" id=\"th-edit\" style=\"width: 20px\">Editar</th>\n </tr>\n </ng-template>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\"\n [pContextMenuRow]=\"{rowData, editing}\"\n >\n\n\n <td\n *ngIf=\"config.enableSelect\"\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\n >\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\n <p-tableCheckbox\n [value]=\"rowData\"\n [disabled]=\"isDisabledCheckbox(rowData)\"\n (click)=\"activeItemLote(selectedItems)\"\n ></p-tableCheckbox>\n </td>\n\n\n <ng-container *ngFor=\"let col of columns; let i = index\">\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\n <td *ngIf=\"col.fieldControlType\"\n [id]=\"'rowTable'+ rowData[config.dataKey]\"\n pSelectableRowDblClick=\"\"\n (click)=\"activeItem(rowData)\"\n (dblclick)=\"dbClickEdit()\"\n pSelectableRowDblClick=\"\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\n >\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\n <!-- Controle de edi\u00E7\u00E3o do campo -->\n <ng-template pTemplate=\"input\">\n\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n\n <ng-container *ngSwitchCase=\"'text'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-text [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-number [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-mask [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-switch [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n <div [style.width]=\"col.width\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-calendar class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <p-dropdown\n [disabled]=\"isDisableEditRowCellFunction(rowData, col)\"\n class=\"cellControl col\"\n appendTo=\"body\"\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\n [(ngModel)]=\"rowData[col.field]\"\n >\n </p-dropdown>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <!-- Valor atual do campo -->\n <ng-template pTemplate=\"output\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container *ngIf=\"rowData[col.field]\">\n {{\n retornaDescricaoDrop(\n rowData,\n col\n )\n }}\n <!-- {{rowData[col.field]}} -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n {{ rowData[col.field] | date }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n {{ rowData[col.field] | mask:col.mask }}\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ rowData[col.field] }}\n </ng-container>\n\n </ng-container>\n </ng-template>\n </p-cellEditor>\n </td>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\n transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\n </ng-container>\n </td>\n\n </ng-container>\n\n\n\n\n\n\n\n\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de a\u00E7\u00E3o -->\n <td [ngClass]=\"{'td-tools': isEditableTable(), 'td-tools-sticky': !isEditableTable() }\"\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n <div\n *ngFor=\"let action of config.actions\"\n class=\"mr-1\"\n >\n <!-- <button\n id=\"actionBtns\"\n pButton\n *ngIf=\"exibirCampo(action, rowData)\"\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n [disabled]=\"callDisabled(action, rowData)\"\n >\n <span class=\"material-symbols-outlined md-19\">\n {{ retornarCampo(action, rowData, \"icon\") }}</span\n >\n </button> -->\n\n <span\n class=\"material-symbols-outlined {{\n callDisabled(action, rowData)\n ? 'text-gray-400 cursor-auto'\n : 'cursor-pointer'\n }}\"\n style=\"font-size: 20px\"\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n >\n {{ retornarCampo(action, rowData, \"icon\") }}\n </span>\n </div>\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n <!-- <button\n id=\"moreVertBtn\"\n pButton\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n > -->\n <span\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\n style=\"font-size: 20px\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n >\n more_horiz\n </span>\n <!-- </button> -->\n\n <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div>\n\n <!-- <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div> -->\n\n <p-menu\n #menu\n [popup]=\"true\"\n [model]=\"menuItems\"\n appendTo=\"body\"\n ></p-menu>\n </div>\n </td>\n\n <td\n class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n </div>\n </td>\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de edi\u00E7\u00E3o -->\n <td class=\"td-edit\" *ngIf=\"this.isEditableTable()\" >\n <div class=\"flex align-items-center justify-content-center gap-2\">\n <button [style.height]=\"'28px'\" [id]=\"'rowEdit' + rowData[config.dataKey] \" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\n (click)=\"onRowEditSave(rowData, ri)\" [id]=\"'rowSave' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\n (click)=\"onRowEditCancel(rowData, ri)\" [id]=\"'rowCancel' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-danger\"></button>\n </div>\n </td>\n\n\n\n\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#fff;color:#5289b4}.td-tools{position:sticky;right:52px;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}.td-tools-sticky{position:sticky;right:0;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:15px}.material-symbols-outlined.md-22{font-size:19px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:.9;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.75rem}:host ::ng-deep .p-datatable-table{font-size:.75rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before{transform:translate(1.25rem);height:15px;margin-top:-8px;-webkit-transform:translateX(1.25rem);-moz-transform:translateX(1.25rem);-ms-transform:translateX(1.25rem);-o-transform:translateX(1.25rem)}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider:before{background:#fff;width:1rem;height:1.25rem;height:16px!important;left:.25rem;margin-top:-9px!important;margin-top:-.625rem;border-radius:50%;transition-duration:.2s}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch:not(.p-disabled) .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>div>kv-input-text>span>.inputs{height:15px!important}:host ::ng-deep p-celleditor>div>p-dropdown>.p-dropdown:not(.p-paginator-rpp-options){height:25px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider{height:21px!important}:host ::ng-deep input.p-inputtext.p-component.p-element.p-inputmask.inputs.p-filled{height:15px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.AutoFocus, selector: "[pAutoFocus]", inputs: ["autofocus"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.ContextMenu, selector: "p-contextMenu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "id", "ariaLabel", "ariaLabelledBy"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i9.InputText, selector: "[pInputText]" }, { kind: "component", type: i10.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i11.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i12.Ripple, selector: "[pRipple]" }, { kind: "component", type: i13.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i13.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i13.ContextMenuRow, selector: "[pContextMenuRow]", inputs: ["pContextMenuRow", "pContextMenuRowIndex", "pContextMenuRowDisabled"] }, { kind: "directive", type: i13.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i13.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i13.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i13.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i13.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i13.SelectableRowDblClick, selector: "[pSelectableRowDblClick]", inputs: ["pSelectableRowDblClick", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i13.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i13.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i13.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i13.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i14.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.KvInputCalendarComponent, selector: "kv-input-calendar", inputs: ["isYear", "isMonthYear", "minDate", "maxDate", "showButtonBar", "showIcon", "showTime", "selectionMode"], outputs: ["onSelectionChange", "onSelectionValue"] }, { kind: "component", type: i17.KvInputMaskComponent, selector: "kv-input-mask", inputs: ["mask"], outputs: ["onComplete"] }, { kind: "component", type: i18.KvInputNumberComponent, selector: "kv-input-number", inputs: ["mode", "digits", "min", "max", "suffix"] }, { kind: "component", type: i19.KvInputTextComponent, selector: "kv-input-text" }, { kind: "component", type: i20.KvSwitchComponent, selector: "kv-switch", inputs: ["readonly", "switchValue"], outputs: ["onSwitchChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i21.MaskPipe, name: "mask" }] }); }
491
+ }
492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: KvTableEditComponent, decorators: [{
493
+ type: Component,
494
+ args: [{ selector: 'kv-table-edit', template: "\n\n<div class=\"card\" >\n <p-toast></p-toast>\n\n <p-panel\n *ngIf=\"filtrosAvancados\"\n header=\"Filtros avan\u00E7ados\"\n [toggleable]=\"true\"\n [collapsed]=\"true\"\n (collapsedChange)=\"collapsed = !collapsed\"\n [style]=\"{ 'margin-bottom': '2px' }\"\n >\n <ng-template pTemplate=\"headericons\">\n <i\n *ngIf=\"!collapsed\"\n class=\"pi pi-filter\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 aberto -->\n <i\n *ngIf=\"collapsed\"\n class=\"pi pi-minus\"\n ></i>\n <!-- \u00CDcone quando o painel est\u00E1 fechado -->\n </ng-template>\n <ng-content></ng-content>\n </p-panel>\n\n <p-contextMenu #cm [model]=\"items\"></p-contextMenu>\n <p-table\n #te\n [reorderableColumns]=\"config.reorderableColumns || false\"\n *ngIf=\"config\"\n [value]=\"dataSource\"\n [dataKey]=\"config.dataKey\"\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n [columns]=\"config.columns\"\n [editMode]=\"'row'\"\n [scrollable]=\"true\"\n scrollHeight=\"400px\"\n appendTo=\"body\"\n [styleClass]=\"'p-datatable-sm'\"\n [(selection)]=\"selectedItems\"\n [rowSelectable]=\"isRowSelectable\"\n [globalFilterFields]=\"globalFilterFields\"\n [rows]=\"rows\"\n [paginator]=\"paginator\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{first} - {last} de {{ totalRecords }}\"\n (selectionChange)=\"selectionChange($event)\"\n [rowHover]=\"true\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"config.lazy\"\n (onLazyLoad)=\"paginate($event)\"\n [groupRowsBy]=\"config.fieldGroup\"\n [showFirstLastIcon]=\"showFirstLastIcon\"\n [pageLinks]=\"pageLinksOptions\"\n [scrollable]=\"isTableScrollable\"\n [scrollHeight]=\"scrollHeight\"\n [rowTrackBy]=\"rowTrackBy \"\n [(contextMenuSelection)]=\"selectedProduct\"\n [contextMenu]=\" isEditableTable() ? cm : null\"\n >\n\n\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <ng-template\n pTemplate=\"caption\"\n *ngIf=\"config.enableCation\"\n >\n <div class=\"flex flex-row flex-wrap justify-content-between align-items-center grid formgrid p-fluid col-12\">\n <div class=\"col-12 flex flex-column\">\n <div\n *ngIf=\"config.title\"\n class=\"text-md font-bold my-3\"\n >\n {{ config.title }}\n </div>\n <div\n *ngIf=\"config.subtitle\"\n class=\"text-sm mb-4 font-medium\"\n >\n {{ config.subtitle }}\n </div>\n </div>\n\n <div class=\"flex flex-row align-items-center md:col-6 lg:col-4 {{\n tamanhoTela < 768 ? 'col-10' : 'col-12'\n }} mt-1 mb-2 \">\n <span\n *ngIf=\"config.enableFilter\"\n class=\"p-input-icon-left\"\n >\n <i class=\"pi pi-search\"></i>\n\n <input\n pInputText\n pAutoFocus\n [autofocus]=\"true\"\n type=\"text\"\n (input)=\"onGlobalFilter(te, $event)\"\n placeholder=\"Pesquisar...\"\n class=\"h-2rem\"\n />\n </span>\n\n </div>\n\n <div class=\"flex flex-row col-1 justify-content-end\">\n <div\n *ngFor=\"let action of config.actionsLote\"\n class=\"btns-options\"\n [style]=\"{ 'margin-right': '7px' }\"\n >\n <button\n id=\"actionLoteBtns\"\n pButton\n *ngIf=\"\n (selectedItems.length > 0 || action.showAcoesLote) &&\n exibirCampo(action, this.action)\n \"\n class=\"actionLoteBtns p-button-raised p-button-text\"\n (click)=\"\n action?.command(commandEvent); activeItemLote(selectedItems)\n \"\n [pTooltip]=\"retornarCampo(action, selectedItems, 'tooltip')\"\n [tooltipPosition]=\"'bottom'\"\n [style.backgroundColor]=\"\n retornarCampo(action, selectedItems, 'btnColor')\n \"\n [disabled]=\"retornarCampo(action, selectedItems, 'disabled')\"\n >\n <span\n class=\"material-symbols-outlined md-22\"\n [style.color]=\"\n retornarCampo(action, selectedItems, 'iconBtnColor')\n \"\n >\n {{ retornarCampo(action, selectedItems, \"icon\") }}\n </span>\n </button>\n </div>\n </div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n <th\n style=\"width: 4rem; border-left: solid 4px transparent\"\n *ngIf=\"config.enableSelect\"\n >\n <p-tableHeaderCheckbox (click)=\"activeItemLote(selectedItems)\"></p-tableHeaderCheckbox>\n </th>\n\n <th\n *ngFor=\"let col of columns\"\n [pSortableColumn]=\"col.field\"\n [pSortableColumnDisabled]=\"col.sortable === false\"\n [style.min-width]=\"col.width\"\n pReorderableColumn\n class=\"text-sm\"\n >\n <div\n [class]=\"\n centralizarColunas(col) && alignColunasHeader(col) == ''\n ? 'flex flex-row justify-content-center'\n : 'flex flex-row'\n \"\n [style]=\"alignColunasHeader(col)\"\n >\n <span>{{ col.header }}</span>\n <p-sortIcon\n *ngIf=\"col.sortable === true\"\n [field]=\"col.field\"\n style=\"font-size: 10px\"\n ></p-sortIcon>\n\n <span\n *ngIf=\"col.headerTooltip\"\n class=\"material-symbols-outlined flex align-items-center\"\n [pTooltip]=\"col.headerTooltip\"\n >info</span>\n </div>\n </th>\n <th *ngIf=\"config.actions && config.actions.length > 0\"></th>\n <th *ngIf=\"isEditableTable()\" id=\"th-edit\" style=\"width: 20px\">Editar</th>\n </tr>\n </ng-template>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <ng-template pTemplate=\"body\" let-rowData let-editing=\"editing\" let-ri=\"rowIndex\" let-columns=\"columns\"\n let-rowgroup=\"rowgroup\" let-rowspan=\"rowspan\">\n <tr [pEditableRow]=\"rowData\" [pEditableRowDisabled]=\"false\"\n [pContextMenuRow]=\"{rowData, editing}\"\n >\n\n\n <td\n *ngIf=\"config.enableSelect\"\n [style]=\"applyStyle(rowData, { field: 'check-box', header: '' })\"\n >\n <!--<p-tableCheckbox *ngIf=\"isVisibleCheckbox(rowData)\"-->\n <p-tableCheckbox\n [value]=\"rowData\"\n [disabled]=\"isDisabledCheckbox(rowData)\"\n (click)=\"activeItemLote(selectedItems)\"\n ></p-tableCheckbox>\n </td>\n\n\n <ng-container *ngFor=\"let col of columns; let i = index\">\n\n\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n <!-- Celula que armazena os controles de edi\u00E7\u00E3o para os campos -->\n <td *ngIf=\"col.fieldControlType\"\n [id]=\"'rowTable'+ rowData[config.dataKey]\"\n pSelectableRowDblClick=\"\"\n (click)=\"activeItem(rowData)\"\n (dblclick)=\"dbClickEdit()\"\n pSelectableRowDblClick=\"\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col) \" [pTooltip]=\"returnTooltipRow(rowData, col)\"\n >\n <p-cellEditor [ngClass]=\"{'switch': col.fieldControlType == 'switch'}\">\n <!-- Controle de edi\u00E7\u00E3o do campo -->\n <ng-template pTemplate=\"input\">\n\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n\n <ng-container *ngSwitchCase=\"'text'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-text [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-text>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-number [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" [required]=\"col.required ?? true\"></kv-input-number>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-mask [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [mask]=\"col.mask\" [required]=\"col.required ?? true\" [(ngModel)]=\"rowData[col.field]\"></kv-input-mask>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-switch [disabled]=\"isDisableEditRowCellFunction(rowData, col)\" class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\" ></kv-switch>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n <div [style.width]=\"col.width\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <kv-input-calendar class=\"cellControl col\" [(ngModel)]=\"rowData[col.field]\"></kv-input-calendar>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <div [style.width]=\"col.width\" class=\"grid formgrid p-fluid\" >\n <p-dropdown\n [disabled]=\"isDisableEditRowCellFunction(rowData, col)\"\n class=\"cellControl col\"\n appendTo=\"body\"\n [optionLabel]=\"col.fieldDropDownControl.descricaoobjeto\"\n [optionValue]=\"col.fieldDropDownControl.idobjeto\"\n [options]=\"col.fieldDropDownControl.fieldControlDropdownSource\"\n [(ngModel)]=\"rowData[col.field]\"\n >\n </p-dropdown>\n </div>\n </ng-container>\n </ng-container>\n </ng-template>\n\n\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n <!-- Valor atual do campo -->\n <ng-template pTemplate=\"output\">\n <ng-container [ngSwitch]=\"col.fieldControlType\">\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <ng-container *ngIf=\"rowData[col.field]\">\n {{\n retornaDescricaoDrop(\n rowData,\n col\n )\n }}\n <!-- {{rowData[col.field]}} -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'switch'\">\n <kv-switch [(ngModel)]=\"rowData[col.field]\" [disabled]=\"true\"></kv-switch>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'calendar'\">\n {{ rowData[col.field] | date }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mask'\">\n {{ rowData[col.field] | mask:col.mask }}\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ rowData[col.field] }}\n </ng-container>\n\n </ng-container>\n </ng-template>\n </p-cellEditor>\n </td>\n\n\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- ----------------------------------------------------------------------------------------------------------------------------------- -->\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n <td *ngIf=\"rowgroup && !col.template && !col.fieldControlType\" [attr.rowspan]=\"rowgroup && col.grouped ? rowspan : null\"\n class=\"rowTable\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">{{\n transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"!rowgroup && !col.grouped && !col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\" [pTooltip]=\"returnTooltipRow(rowData, col)\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n\n <span *ngIf=\"!isBooleanField(rowData, col); else booleanField\" [class]=\"returnRowClass(rowData, col)\">\n <span *ngIf=\"\n !isChipField(col) && !col.iconField && !isImageField(col)\n \">\n <i *ngIf=\"col.icon\" [class]=\"col.icon + ' mr-2'\"></i>\n {{ transformValue(rowData, col) }}\n </span>\n\n <div *ngIf=\"isChipField(col) && !col.iconField\">\n <span [class]=\"returnClassChip(rowData, col)\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ transformValue(rowData, col) }}</span>\n </div>\n </span>\n\n <span *ngIf=\"isImageField(col)\">\n <span>\n <img class=\"image\" [src]=\"loadImage(rowData, col)\" />\n </span>\n </span>\n\n <i *ngIf=\"col.iconField\" [ngClass]=\"{\n 'material-icons': col.indIconMaterial,\n 'material-symbols-outlined mr-2': !col.indIconMaterial\n }\" [pTooltip]=\"returnTooltipIcon(rowData, col)\">\n {{ returnClassIcon(rowData, col) }}\n </i>\n\n <ng-template #booleanField>\n <i *ngIf=\"!col.iconField && !isSwitchField(col)\" [ngClass]=\"\n rowData[col.field] ? 'text-green-500' : 'text-red-500'\n \"><span class=\"material-symbols-outlined\">\n {{ rowData[col.field] ? \"check\" : \"close\" }}\n </span>\n </i>\n\n <span *ngIf=\"isSwitchField(col)\" [class]=\"returnRowClass(rowData, col)\">\n <kv-switch (onSwitchChange)=\"onSwitchChange($event, rowData, col)\"\n [disabled]=\"col?.onlyReadField ?? true\" [switchValue]=\"transformValue(rowData, col)\">\n </kv-switch>\n </span>\n </ng-template>\n </td>\n\n <td *ngIf=\"col.template && !col.fieldControlType\" [style]=\"\n applyStyle(rowData, col) +\n centralizarColunas(col) +\n alignColunas(col)\n \" class=\"rowTable\">\n <span class=\"p-column-title\">{{ col.header }}:</span>\n <ng-container *ngIf=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutlet]=\"getCustomTemplate(col.template.name)\"\n [ngTemplateOutletContext]=\"{ $implicit: rowData }\">\n </ng-container>\n </td>\n\n </ng-container>\n\n\n\n\n\n\n\n\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de a\u00E7\u00E3o -->\n <td [ngClass]=\"{'td-tools': isEditableTable(), 'td-tools-sticky': !isEditableTable() }\"\n *ngIf=\"config.actions && config.actions.length > 0 && !editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n <div\n *ngFor=\"let action of config.actions\"\n class=\"mr-1\"\n >\n <!-- <button\n id=\"actionBtns\"\n pButton\n *ngIf=\"exibirCampo(action, rowData)\"\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"activeItem(rowData); action?.command(commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n [disabled]=\"callDisabled(action, rowData)\"\n >\n <span class=\"material-symbols-outlined md-19\">\n {{ retornarCampo(action, rowData, \"icon\") }}</span\n >\n </button> -->\n\n <span\n class=\"material-symbols-outlined {{\n callDisabled(action, rowData)\n ? 'text-gray-400 cursor-auto'\n : 'cursor-pointer'\n }}\"\n style=\"font-size: 20px\"\n (click)=\"isButtonDisable(action, rowData, commandEvent)\"\n [pTooltip]=\"retornarCampo(action, rowData, 'tooltip')\"\n [tooltipPosition]=\"\n action.tooltipPosition ? action.tooltipPosition : 'bottom'\n \"\n >\n {{ retornarCampo(action, rowData, \"icon\") }}\n </span>\n </div>\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n <!-- <button\n id=\"moreVertBtn\"\n pButton\n class=\"actionBtns p-button-text p-button-raised\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n > -->\n <span\n class=\"material-symbols-outlined cursor-pointer icon-more-horiz\"\n style=\"font-size: 20px\"\n (click)=\"menu.toggle($event); activeItem(rowData)\"\n >\n more_horiz\n </span>\n <!-- </button> -->\n\n <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div>\n\n <!-- <div *ngFor=\"let action of config.actions\">\n {{ criarMenusModal(rowData) }}\n </div> -->\n\n <p-menu\n #menu\n [popup]=\"true\"\n [model]=\"menuItems\"\n appendTo=\"body\"\n ></p-menu>\n </div>\n </td>\n\n <td\n class=\"td-tools\"\n *ngIf=\"config.actions && config.actions.length > 0 && editing\"\n [style]=\"applyStyle(rowData, { field: 'btns-options', header: '' })\"\n >\n <div\n class=\"flex flex-row justify-content-end w-full gap-1\"\n *ngIf=\"acoesLinhaTabela\"\n >\n\n </div>\n <div\n class=\"flex flex-row justify-content-end w-full\"\n *ngIf=\"!acoesLinhaTabela\"\n >\n </div>\n </td>\n\n\n\n <!-- ------------------------------------------------------------------------------------------------------------------------------------------- -->\n <!-- Controle de edi\u00E7\u00E3o -->\n <td class=\"td-edit\" *ngIf=\"this.isEditableTable()\" >\n <div class=\"flex align-items-center justify-content-center gap-2\">\n <button [style.height]=\"'28px'\" [id]=\"'rowEdit' + rowData[config.dataKey] \" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\n (click)=\"onRowEditInit(rowData)\" class=\"p-button-rounded p-button-text\"></button>\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\n (click)=\"onRowEditSave(rowData, ri)\" [id]=\"'rowSave' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-success mr-2\"></button>\n <button [style.height]=\"'28px'\" [style.width]=\"'28px'\" [disabled]=\"isDisableEditRowFunction(rowData)\" *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\n (click)=\"onRowEditCancel(rowData, ri)\" [id]=\"'rowCancel' + rowData[config.dataKey] \" class=\"p-button-rounded p-button-text p-button-danger\"></button>\n </div>\n </td>\n\n\n\n\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: ["@charset \"UTF-8\";.td-edit{position:sticky;right:-1px;background-color:#fff;color:#5289b4}.td-tools{position:sticky;right:52px;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}.td-tools-sticky{position:sticky;right:0;border-right:3px solid #fff!important;background-color:#fff;box-shadow:-5px 0 20px -10px #000000bf}#th-edit{position:sticky;right:0;background-color:#eaeaea}:host ::ng-deep .p-datatable .p-datatable-tbody>tr>td{text-align:center;border:1px solid #eaeaea;border-width:1px 1px;padding:0rem .5rem}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th{text-align:center;padding:0rem .5rem;border:1px solid #dee2e6;border-width:1px 1px;font-weight:700;color:#343a40;background:#eaeaea;transition:box-shadow .2s}.error-show{background-color:red;width:5px;height:10px}.btns-options{position:relative;left:20px}.chip-style{border:solid 1px}:host::ng-deep .p-card .p-card-content{padding:0}.material-symbols-outlined.md-19{font-size:15px}.material-symbols-outlined.md-22{font-size:19px}.checkbox-container{display:flex;align-items:center;gap:2px;margin-top:5px}#botaoFiltro:hover{color:#a9a9a9}.actionLoteBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;font-size:16px;width:2rem;height:2rem;top:2px;margin-left:.5rem;justify-content:center;text-decoration:none;text-align:justify;padding:12px}:host ::ng-deep .center{display:flex;align-items:center;justify-content:center}#actionLoteBtns:hover,.actionLoteBtns:hover{background-color:#29b92d!important}.actionBtns{align-items:center;background-color:transparent;color:#a9a9a9;display:flex;width:.8rem;height:.8rem;margin-left:.22rem;justify-content:center;text-decoration:none;text-align:justify;padding:11px}:host::ng-deep .material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;line-height:.9;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-smoothing:antialiased}#actionBtns:hover{color:#a9a9a9}.image{border-style:solid;border-width:3.5px;border-color:#5289b4;border-radius:100%;height:55px;width:55px;padding:0;margin:0;vertical-align:middle}:host ::ng-deep .p-inputtext{font-size:.75rem}:host ::ng-deep .p-datatable-table{font-size:.75rem}:host ::ng-deep .p-datatable-header{background-color:#eaeaea!important;padding:2px 13px 0!important;border-radius:5px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th{background-color:#eaeaea!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:5px 0 0 5px}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-child{border-radius:0 5px 5px 0}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{border-bottom:1px solid #ddd!important;border-top:1px solid #ddd!important}:host ::ng-deep .actionBtns,:host ::ng-deep .actionLoteBtns{border-radius:50%;width:2.5rem!important;height:2.5rem!important;box-shadow:#0000003d 0 3px 8px}.icon-more-horiz:hover,.icon-more-horiz:focus{color:#5e5e5e;transform:scale(1.1);transition:color .3s,transform .3s}@media only screen and (min-width: 768px){.actionLoteBtns{top:-1px}}@media only screen and (max-width: 960px){:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(p-tablecheckbox){border-bottom:0px!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img){justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:has(img) .p-column-title{display:none!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child{border-bottom:1px solid #ddd!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td:last-child div{justify-content:center!important;align-items:center!important}:host ::ng-deep .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td .p-column-title{font-weight:600}}::ng-deep .p-panel.p-panel-toggleable .p-panel-header{background-color:#eaeaea!important}::ng-deep .field.grid,.formgrid.grid{padding:0rem!important}@media screen and (min-width: 961px){.moreVertBtn{position:relative;right:3px}}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:last-of-type{border-radius:0 0 5px!important}::ng-deep .p-datatable.p-datatable-sm .p-datatable-thead>tr>th:first-of-type{border-radius:0 0 0 5px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before{transform:translate(1.25rem);height:15px;margin-top:-8px;-webkit-transform:translateX(1.25rem);-moz-transform:translateX(1.25rem);-ms-transform:translateX(1.25rem);-o-transform:translateX(1.25rem)}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch{height:21px}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider:before{background:#fff;width:1rem;height:1.25rem;height:16px!important;left:.25rem;margin-top:-9px!important;margin-top:-.625rem;border-radius:50%;transition-duration:.2s}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch:not(.p-disabled) .p-inputswitch-slider{height:21px}:host ::ng-deep p-celleditor>div>kv-input-text>span>.inputs{height:15px!important}:host ::ng-deep p-celleditor>div>p-dropdown>.p-dropdown:not(.p-paginator-rpp-options){height:25px!important}:host ::ng-deep p-celleditor>kv-switch>div>p-inputswitch .p-inputswitch-slider{height:21px!important}:host ::ng-deep input.p-inputtext.p-component.p-element.p-inputmask.inputs.p-filled{height:15px}\n"] }]
495
+ }], ctorParameters: function () { return [{ type: i1.DatePipe }, { type: i1.DecimalPipe }, { type: i2.CodigoFipePipe }, { type: i2.CpfCnpjPipe }, { type: i2.TelefonePipe }, { type: i2.NotificationService }]; }, propDecorators: { setConfig: [{
496
+ type: Input,
497
+ args: ['config']
498
+ }], dataSource: [{
499
+ type: Input
500
+ }], editMode: [{
501
+ type: Input
502
+ }], selectedItems: [{
503
+ type: Input
504
+ }], totalRecords: [{
505
+ type: Input
506
+ }], paginator: [{
507
+ type: Input
508
+ }], rowsPerPageOptions: [{
509
+ type: Input
510
+ }], rows: [{
511
+ type: Input
512
+ }], pageLinksOptions: [{
513
+ type: Input
514
+ }], showFirstLastIcon: [{
515
+ type: Input
516
+ }], tableSize: [{
517
+ type: Input
518
+ }], applyStyle: [{
519
+ type: Input
520
+ }], acoesLinhaTabela: [{
521
+ type: Input
522
+ }], filterColumnsBtn: [{
523
+ type: Input
524
+ }], filtrosAvancados: [{
525
+ type: Input
526
+ }], scrollHeight: [{
527
+ type: Input
528
+ }], isTableScrollable: [{
529
+ type: Input
530
+ }], rowTrackBy: [{
531
+ type: Input
532
+ }], responsiveLayout: [{
533
+ type: Input
534
+ }], espacamentoPai: [{
535
+ type: Input
536
+ }], espacamentoLateral: [{
537
+ type: Input
538
+ }], tamanhoTotalTabela: [{
539
+ type: Input
540
+ }], rightCollapse: [{
541
+ type: Input
542
+ }], onFilter: [{
543
+ type: Output
544
+ }], _templates: [{
545
+ type: Input,
546
+ args: ['templates']
547
+ }], onRowSave: [{
548
+ type: Output
549
+ }], onActiveItem: [{
550
+ type: Output
551
+ }], onActiveItemLote: [{
552
+ type: Output
553
+ }], onPaginate: [{
554
+ type: Output
555
+ }], onSelectionChange: [{
556
+ type: Output
557
+ }], doubleClickEvent: [{
558
+ type: Output
559
+ }], filterField: [{
560
+ type: Output
561
+ }], onSwitchTableChange: [{
562
+ type: Output
563
+ }], onWindowResize: [{
564
+ type: HostListener,
565
+ args: ['window:resize', ['$event']]
566
+ }] } });
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdGFibGUtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10YWJsZS1lZGl0L2t2LXRhYmxlLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2Vldm8tY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMva3YtdGFibGUtZWRpdC9rdi10YWJsZS1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFDTCxXQUFXLEVBRVosTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QnhCLE1BQU0sT0FBTyxvQkFBb0I7SUFNL0IsSUFBcUIsU0FBUyxDQUFDLEtBQXNCO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQ3hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDekMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtZQUN4QyxHQUFHLEtBQUs7U0FDVCxDQUFDO1FBRUYsa0NBQWtDO1FBQ2xDLDJDQUEyQztRQUMzQywrQ0FBK0M7UUFDL0MsUUFBUTtRQUNSLElBQUk7SUFDTixDQUFDO0lBb0RELFlBQ21CLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLG1CQUF3QztRQUx4QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdB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QUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQStLUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0TGlzdGVuZXIsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBEYXRlUGlwZSxcbiAgRGVjaW1hbFBpcGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2wsXG4gIFZhbGlkYXRvckZuXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgTWVudUl0ZW0sXG4gIE1lbnVJdGVtQ29tbWFuZEV2ZW50LFxuICBTZWxlY3RJdGVtXG59IGZyb20gJ3ByaW1lbmcvYXBpJztcblxuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuaW1wb3J0IHtcbiAgQ29kaWdvRmlwZVBpcGUsXG4gIENwZkNucGpQaXBlLFxuICBLdk1lbnVJdGVtLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBUYWJsZUNvbmZpZ0NvbHVtbixcbiAgVGFibGVQYWdpbmF0ZSxcbiAgVGVsZWZvbmVQaXBlXG59IGZyb20gJy4uLy4uLy4uL3B1YmxpYy1hcGknO1xuXG5pbXBvcnQgeyBUYWJsZUVkaXRDb25maWdDb2x1bW4gfSBmcm9tICcuLi8uLi9hcGkvY29tcG9uZW50cy90YWJsZS90YWJsZWVkaXQuY29uZmlnLmNvbHVtbic7XG5pbXBvcnQgVGFibGVFZGl0Q29uZmlnIGZyb20gJy4uLy4uL2FwaS9jb21wb25lbnRzL3RhYmxlL3RhYmxlZGl0LmNvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2t2LXRhYmxlLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4va3YtdGFibGUtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2t2LXRhYmxlLWVkaXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBLdlRhYmxlRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBjb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uZmlnITogVGFibGVFZGl0Q29uZmlnO1xuICBnbG9iYWxGaWx0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgQElucHV0KCdjb25maWcnKSBzZXQgc2V0Q29uZmlnKHZhbHVlOiBUYWJsZUVkaXRDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGVuYWJsZUNhdGlvbjogdmFsdWUuZW5hYmxlQ2F0aW9uIHx8IHRydWUsXG4gICAgICBlbmFibGVTZWxlY3Q6IHZhbHVlLmVuYWJsZVNlbGVjdCB8fCBmYWxzZSxcbiAgICAgIGVuYWJsZUZpbHRlcjogdmFsdWUuZW5hYmxlRmlsdGVyIHx8IHRydWUsXG4gICAgICAuLi52YWx1ZSxcbiAgICB9O1xuXG4gICAgLy8gaWYgKHRoaXMuY29uZmlnLmVuYWJsZUZpbHRlcikge1xuICAgIC8vICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAvLyAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMucHVzaChjb2wuZmllbGQpO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgQElucHV0KCkgZGF0YVNvdXJjZSE6IGFueVtdO1xuICBASW5wdXQoKSBlZGl0TW9kZTogJ3JvdycgfCAnY2VsbCcgPSAnY2VsbCc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG4gIHNlbGVjdGVkSXRlbSE6IGFueTtcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzITogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSByb3dzUGVyUGFnZU9wdGlvbnMhOiBudW1iZXJbXTtcbiAgQElucHV0KCkgcm93czogbnVtYmVyID0gNTtcbiAgQElucHV0KCkgcGFnZUxpbmtzT3B0aW9uczogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgc2hvd0ZpcnN0TGFzdEljb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdGFibGVTaXplITogbnVtYmVyO1xuICBASW5wdXQoKSBhcHBseVN0eWxlOiBGdW5jdGlvbiA9IChyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pID0+ICcnO1xuICBASW5wdXQoKSBhY29lc0xpbmhhVGFiZWxhOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZmlsdGVyQ29sdW1uc0J0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmaWx0cm9zQXZhbmNhZG9zOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNjcm9sbEhlaWdodDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzVGFibGVTY3JvbGxhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJvd1RyYWNrQnk6IEZ1bmN0aW9uID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbTtcbiAgQElucHV0KCkgcmVzcG9uc2l2ZUxheW91dDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVzcGFjYW1lbnRvUGFpOiBzdHJpbmcgPSAnMnB4JztcbiAgQElucHV0KCkgZXNwYWNhbWVudG9MYXRlcmFsOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgdGFtYW5ob1RvdGFsVGFiZWxhITogbnVtYmVyO1xuICBASW5wdXQoKSByaWdodENvbGxhcHNlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQElucHV0KCd0ZW1wbGF0ZXMnKSBfdGVtcGxhdGVzITogYW55O1xuICB0YW1hbmhvVGVsYSE6IG51bWJlcjtcbiAgc2VsZWN0ZWRTaXplOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZUllbXMhOiBhbnlbXTtcbiAgbWVudUl0ZW1zOiBLdk1lbnVJdGVtW10gPSBbXTtcbiAgaW1nRGVmYXVsdDogc3RyaW5nID1cbiAgICAnLzlqLzRBQVFTa1pKUmdBQkFRSUFkZ0IyQUFELzRRQmlSWGhwWmdBQVRVMEFLZ0FBQUFnQUJRRVNBQU1BQUFBQkFBRUFBQUVhQUFVQUFBQUJBQUFBU2dFYkFBVUFBQUFCQUFBQVVnRW9BQU1BQUFBQkFBTUFBQUlUQUFNQUFBQUJBQUVBQUFBQUFBQUFBQUIyQUFBQUFRQUFBSFlBQUFBQi85c0FRd0FEQWdJQ0FnSURBZ0lDQXdNREF3UUdCQVFFQkFRSUJnWUZCZ2tJQ2dvSkNBa0pDZ3dQREFvTERnc0pDUTBSRFE0UEVCQVJFQW9NRWhNU0VCTVBFQkFRLzlzQVF3RURBd01FQXdRSUJBUUlFQXNKQ3hBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVEvOEFBRVFnQWtBQ1FBd0VSQUFJUkFRTVJBZi9FQUIwQUFRQUJCQU1CQUFBQUFBQUFBQUFBQUFBR0FRSUhDQU1FQ1FYL3hBQkJFQUFDQVFRQUJRSUNDQVFEQkFzQUFBQUJBZ01BQkFVUkJnY1NJVEVUUVFoUkNSUVZHU0pWbGRFeVlZR1JRbEppRmlNM09GTmpjWE4xZHBLVHNiTzAvOFFBR2dFQkFBSURBUUFBQUFBQUFBQUFBQUFBQUFFRkF3UUdBdi9FQURJUkFBSUFCQU1GQ0FFRkFRRUJBQUFBQUFBQkFnTUVFU0V4VVFVU1FaSHdFeFV5WVhHQm9iSFJJak5Dd2VFMDhTUC8yZ0FNQXdFQUFoRURFUUEvQVBLcWdGQUtBVUJkRERMY1NwQkJFOGtzakJFUkZKWm1KMEFBUEpKcVVuRTdJaHRRcTd5SjV3OXlkejJWaStzNWU0WEZSTXUwVjA5U1U3MFJ0QVIwalJQazlRSTBWOTZzNUd5cGt4WG1QZCtYL24zNUZiTzJwS2w0UWZxZnh6SjlqT1UvQm1PNldrc1piNlJKQklyM1VwT3RhMHBWZWxTTzNnZzcyZDdIYXJPWHMybmd6Vi9YcElxNDlwVk1mRzNvdnpka21zTVRpc1gxL1ptTXRMUDFkZGZvUUxIMWEzcmZTQnZXei9ldHVDWEJMdnVKSyttQnB4ekk1bHQ5dDIxeE8zV1E4Q2dPcGY0bkZaVG8rMDhaYVhucGI2UHJFQ3lkTzliMTFBNjNvZjJySEhMZ21lTkorcVBjRXlPWGZjYlY5TUNNNVBsUHdaa2VwbzdHV3hrZVF5TTlyS1J2ZTlxRmJxVUwzOEFEV2hyUTdWcVRObTA4ZVN0NlAvMUc1QnRLb2c0MzlWK0xNZ1BFUEozUFlxTDZ6aUxoY3JHcTdkRVQwNVJyWk9rSlBVTkFlRDFFblFYM3FzbjdLbVMxdlMzdmZELzM3OGkwazdVbFRIdXhyZGZ4ei93Z2MwTTF2TTl2Y1JQRkxFeFIwZFNyS3dPaUNENElQdFZZMDRYWmxrbW9sZFpGdFFTS0FVQW9CUUNnRkFTamcvbDltZUxaUktGZXlzT2tzYnVTSWxXN2thUWR1czdCQjBkRFIyZDZCM2FXaG1WT09VT3Y0MU5Lc3JZYVZZWXhhZFgvQU4rVm16aDdoSEFjTVJCTVRZSWtwWHBlNGY4QUZLL1liMng5ajBnOUkwdS9ZVjBNaW1sVTZ0QXNkZUp6czJwbXovM0lyL1hTeTExWjltczVnS2hUVWtYSzZGQmNhRkNMalFvTGpRb1Rjb1ZOQmNwVUVueHVJZUVjQnhSQ1V5MWdqU2hlbExoUHd5cDJPdE1PNUE2aWVrN1hmdFdDZlN5cWhmcldPdkV6eWFpYklmOEE4NHJlWERwNVh6MFpoUGpIbC9sK0VaZlVJYThzQ29JdTQ0eUZVN0EwNDc5QjJSclowZGpSM3NEbmFxaW1VcnU4VnIrZERvS1N2bDFLdEZhR0srVjg4OHNyNEs3MCtTTDFwbStLQVVBb0JRRTU1ZGN1NWVKcGx5dVdSNDhURzNZYkt0Y3NEM1ZUN0tEMkxmMEhmWld5b2FGMUQzNC9EOTljZXJWdGRYS25YWnkvRjlmN3AxZk9NTU1WdkVsdmJ4SkhGR29SRVJRRlZRTkFBRHdBUGF1aVNVS3Nzam5XM0U3dDRuSUI4NjlIaHNyUWdyVUFVQW9CUUNnRkFVcVFVSW9UYzQ1b1lwNG5nbmlTU09SU2pvNmhsWlNORUVIc1FSN1ZEU2lWbmtlazNDN3A0bURlWW5MdVhoaVZzcmlrZVRGU04zSGN0Yk1UMlZqN3FUNGIraDc2TGM1WFVMcDMya3Z3L1grZWZUNk9ocmxVTHM1bmkrLzkxNnRCNnJTeUZBS0FsSEwvQUlPbDR1eStwQ3EyRm15U1haSk8yVW50R05FSGJhSTM3QUUrZEE3bEZTdXFtV2VTei9IdWFGZlZxbWw3cXZ2Ulh0NWVlVFdGOG5ucGE1c0ZERkZCRWtFRVNSeHhxRVJFVUJWVURRQUE4QUQycnFVa2xaSE10dDRzNVFLazh0bGFnZ1VBb0NmY3B1UlBOTG5ia254L0x2aGE0eUVjREJibTljaUsxdHQvOUpLMmxCMTM2UnRpUEFOWVoxUkxwMWVZelBJcHB0UTdTMGJQNFQ2TGJqdTR0Rms0aDVxWUt3dVNObUt6c1pycEFmbDFzWS8vQUlxdWkydkFuK21GbGxEc2VOcjlVU0lyekIramI1MjhLMmN1UjRTeWVHNHRpaUJZMjlzN1cxMlFQY1J5ZmdQL0FHQ1RaOWdheVN0cXlZM2FLNk1VM1pNNkJYZ2FacXZsc1RsY0Rrcm5EWnZHM1dQdjdPUXhYRnJkUk5GTEU0OHF5TUFWUDhqVmttb2xkWkZaRkM0WGFMTTZsU1FLQVVCYVJVNWtwbkhOREZjUlBiM0VTU1JTS1VkSFVNcktSb2dnK1FhaHBOTk05d3hPRjd5ek5mZVlIQjB2Q09ZSWo2VFlYalBKYUVIdXFnamFIWkoydXdOKzQwZk93T1dyYVYwc3pEd3ZMOGV4MHRCVnFwbDdyOFVLVi9QenlTeHRrc3VSRjYwemZMb1laYmlWSUlJbmtsa1lJaUlwTE14T2dBQjVKTlNrNG5aRU5xRlhlUnNwd25nSXVHZUg3VERvSXpKRW5WTzZBZjd5VnU3SFlBTERmWUVqZlNGSHRYVzAwaFU4cFMxNyt2WHdjaFVUZTJteFRNY1hxL1RWMnl4U3d2ZDV0bjJBSzJEQXk2b0lGQUtBeXA4TlhJekpmRUJ6UXN1QzRKWkxYRndJYjNMM2lBYmd0RUlEZE8rM1d4S292bnUyeUNBYTE2cW9WTkxjZkhnYk5KVE9wbXFEaHhQWW5nemd2aGZsN3cxWThJY0hZYTN4bUp4OFlqZ3Q0VjBCODJZK1dZbnVXT3lTU1NTYTVXWk1pbXhPS04zWjFrdVhES2hVRUNzajdkZUQyS0ExeStNVDRXOE56ejROdXVJK0g4ZEZEeHpocmRwYkM0alVLMS9HZzJiV1EvNHRqZlFUL0MydTRCYmUvUTFqcDQ5Mkx3djQ4elFycU5WTUc5Q3YxTDU4anlWZEhqZG81RktzcElaU05FSDVHdW1PV0tVQW9CUUZwSHZVa28rTnhkdzlEeFJnTHJFeUJSSzY5ZHU3YUhSS1A0VHZSME45am9iNlNSNzFyMVVoVkVweTM3ZXBzVTAzc0pzTXpUNi92MzQyWnJaTkROYnpQYjNFVHhTeE1VZEhVcXlzRG9nZytDRDdWeVRUaGRtZGNtb2xkWkU4NU84UFJaWFB5NWE1Q3RGaWxWMVE2TzVYMkVPaUQyQVZqdllJWUthc3RseVZNbTc3L2o5OWZKV2JVcUhMbHFXdjVjZkpXKy9xNW0rdWpPZExxSGtyVUFVQW9EMGkraTc0VnM3VGxyeGR4cjZTL1c4bG0xeHBjanVJcmVCSkFCOGdXdVcvc1BsVkR0ZU51WkRCb3I5Y2pvTmp3SlM0bzlYOWYrbTYxVkJjQ2dGQUtBOFkvaTI0VnRPRFBpUDQ4d1ZoRXNWdjlwL1hrUlJvSUxtTkxqcEE5Z1BXMEI4cTZ5aWpjeVJERTlQckE1R3VnVXVvamhXdjNpWWpyWk5VVUFvQ2xTQzJvUFJoRG5GdzlGaXMvRmw3Ym9XUEtxenNnN2FsVFFjNkFBMFF5bmV5U3hZbjJybnRxU0ZMbUtZdjVmYS9QM2M2UFpjNXpKVzQ4NGZyaC9aUHVVK00renVETGFSa2xTUytra3VuV1FhMXM5S2xScitFb2lrZWQ3MzRJcXoyYkwzS2RQVzc2OWtWZTBvOStvZmxaZjM5c21RRmI1b011cUR5S0FVQW9EMGIraTY0eHM3bmdQakRnRnBWRjNqOHNtV1ZDZTdSVHdwRVNQbUExdU4vTHJIenFoMnZMYWpoajhySFFiSG1Kd1JRYU81dTdWUVhBb0JRQ2dQRno0cU9NYlBqejRodU91SmNmS3N0ckpsR3RJSkZPMWtqdDBXM1Z3ZmtSRUNQNUd1c281Ymx5SVlYcDk0bkkxc3hUS2lLSmEvV0JpcXRrMVJRQ2dGQVdrVkpLSWR6WXhuMmp3WGN5S2t6eVdVa2QwaXg5L0I2V0xEUjdCSGMrMnRiM29HcS9hVXR6S2QyNFk5Y3l3MmRNVXVvVitPSFh1a1NYRVdIMlZpckxHZXI2djFPM2pnNitucDZ1aFF1OWJPdDY4YnJjbHdkbkFvTkZZMDVrZmFSdVBWMzVuZEhpc2hqWldvSUZBS0FVQmtia0J6b3pmSVhtWmp1UGNSR2JpQ01HMnlWbjFkSXU3TnlQVWozN0hzcktmWmtVblkyRGdxWkNxWmJnWnNVMVJGVFRGR2oySjViY3pPQytiWENscnhsd0xtb2NqanJwUnZwSUVrRW10bUtWUEtPTjkxUDhpTmdnbmxac3FPVEZ1UnJFNnlWT2dudzc4RHVpVTFqTWdvRFZqNDB2aXp3M0tQaGUrNWU4RjVTTzQ0NHkwQmdQb1B2N0poY2FNemtmd3lsVCtCZklKRG5zQUdzcUNpYzZKVEkxK2xmSlcxOWFwRUxnZ2Y2bjhIbGQ1cm96bVJRQ2dGQUtBbzNpcEpSMHN0WURLNHE4eFptOUlYbHZKQjZuVDFkSFdwWGV0amV0K04xam1RZHBBNE5VMXpNa3VQczQxR2xlenVkdXNoNFJjUEZEeXl0UUJRQ2dGQUtBbFBMem1qekI1VVpyL2FEbDV4VmZZUzlJQ3lHQndZNWxCMkZrallGSkYzN01DS3h6Wk1FNWJzeFhNc3FkTWtQZWx1eHNuaFBwTnVlZVB0RnRzdncxd2psWkVHdnJEMnM4TWpINXNFbENmMlVWWHhiSmt0NE5vc0lkcnprc1VtUlRtRDlJRDhSUEhWbkxqYkxNNDdoYTFtQlZ4Zzdab3BtWC92cEdlUlQvTkNwckxMMmJJbHU3Vi9VeFRkcDFFeFdUdDZHdVZ6YzNGNWNTM2QzUEpQUE01a2tsa1lzN3NUc3N4UGNrbjNOYjZWc0VWN2JlTE9PZ0ZBS0FVQW9DaDhWSVJiUTlDZ1JjUEZEeXl0UUJRQ2dGQVNmZy9sZnpINWd5ZW53UHdMbmM0T3JwWjdHd2tsalEvNm5VZEsvMUlySEhPbHl2SEVrWkpjbVpOOEVMWm1EQS9BSjhUK2JSWlp1QnJYRlJ2M0RYK1V0MU92NXFqc3cvcUJXckZ0S25oL2xmMk51SFpsVEYvRzN1U3VINk0vNGhKVURTWmZndUUvNVh5VTVJLzhBVEFSV1B2V1JvK3ZjeXJaTS9WZGV4MWIvQU9qYitJMnpRdGJ0d3JmRUQrRzN5amduL3dCeU5SVXJhc2g2OGlIc21vV25NeDl4UjhHM3hMOEpJODJSNVQ1VzZpUWI2OFk4Vi9zZk1MQXp0L2NWbmdycWVQS0wrdnN3UjBGUkJuRHl4K2pFT1R4ZVR3dDdKanN4anJxeHU0VHFTQzVoYUtSRC9OV0FJclpUVVN1alVjTGhkbWRhcElGQUtBVUJRK0trSXRvZWpxWW0vd0R0VEZXV1Q5TDB2cmx2SFAwZFhWMDlhaHRiME42MzUxV09YSDJrQ2oxU1o3bVFkbkc0TDNzN2NqdWp4V1F4c3JVRUNnTWo4a09RUE1Qbjd4SWNEd1JqbEZ2YmRMWCtTdWRyYTJTSHdYWUE3WTZPa1VGam85dEFrWUtpcGwwME85R2JGUFRUS21MZGc1bm85eWIrQXZranl3Z2d2dUlzV3ZHbWNRQXZkNWFJTmJLMy9WMnV5Z0hqK1ByYjVFZUtvWiswWjA3Q0Y3cTh2eWRCSTJiSms0eExlZm4rRFk2MnRiYXl0NDdTenQ0b0lJbENSeFJJRlJGSGdBRHNCV2cyM2l5d1N0Z2pscUFLQVVBb0NPY2E4dU9BdVkrT09LNDc0UXhXY3R0RUt0N2JMSTBlL2RISTZrUDgxSU5aSmMyT1U3d094am1Tb0pxdEdybWsvUDc2TnUzanRMbmlia0hmVGVyR0drZmg2L202dXNmSzNuYnZ2NUxJVHY4QXpqc0RiMDIxY2QyZnovSlQxT3lWYmVrY3Z3YUZaSEhaREQ1QzV4V1dzcDdPOXM1V2d1TGVlTXBKRklwMHlNcDdnZ2dnZzFkSnFKWFJTTk9GMmVaMTZFQ2dLSHhVa282V1d2eGlzVmVaUXcrcUxPM2tuOVBxNmV2b1V0cmVqcmV2T3F4ekkremdjZWliNUdTWEE1a2FnVHRkMjVrYTVUNU1aSGd1MWpaNW5rc1pKTFYya08vQjZsQ25aL0NFZEFQR3RhOEFWcDdObU9aVHBQaGgxek56YU12czZoMjQ0OWU2Wk1RYXNDdlpkVUVIWnhtT3U4dmtyVEUyRWZxWE43UEhid3B2WFZJN0JWSDl5S2h0UXE3SlNjVHNqMjI1TDhwZUhPU25MdkZjQmNPVzhZV3ppRFhseUYwOTVkRUQxWjNQa2xqNDM0VUtvN0FWeU5ST2lxSmpqaU94cDVFTlBMVUVKT2F3bVlVQW9CUUNnRkFLQVVCb1Y5SmZ5Vnc4V014WFBIQzJrY0YrMTBtSnpQcHJyNndySXhnbWIvVXZRVUo4a01nOExWMXNxb2QzSmZxaWsydlRxeW5MUEpubjVWMlVRb0MwbXBKUkR1YkdUK3p1QzdxTlhtU1M5a2p0VWFNNjFzOVRCanNmaEtJNDk5NzFyUk5WKzBwamwwN3R4dzY1Ry9zNldwbFFyOE1ldmRvZ0hKM2lDTEZaK1hFM0pWWXNxcW9yblExTW15ZzJTT3hETVBCSllxS3JObHoxTG03anlpKytCWjdWa09aTFV5SCtQRHlmdHc1V3Y1R2I2Nkk1NHVxVHlTemxML3hWNE0vOHdZNy9BUFRIV0tkKzFGNk15eVAzWWZWSHViWEhIWmlnRkFLQVVBb0JRQ2dGQWF5L1NKLzhzK1MvOFZzUC9zcXcyWi8wTDBaWGJVLzVuNm84b2E2VTVnb2UxU0Myb1BSaERuRnhERGxjOUZpYmJvYVBGS3lNNDdreXZvdU5na2FIU284QWh1b0gycm50cXoxTW1LWEQvSDdmNCs3blI3TGt1WEtjY1djWDF3L3NnY00wdHZLazhFcnh5eHNIUjBZaGxZSFlJSThFR3F4Tnd1NkxKcFJLenlObE9Fcy9IeE53L1o1ZFRHSkpVNlowVWo4RXE5bUdnU1Y3OXdEMzZTcDk2NjJtbnFvbEtOZS9yMThISVZFdnNaMFVyVDF5elhESDFXRjdyTk0rd0Q3VnNHQm5md2VZdmVIczFqOC9qV1JidkdYVVY1YmwxNmxFa2JoMUpIdU5nZHE4eFFxSk9GOFJERTRXb2x3Tmp2dkZQaVgvQURuQmZwTWY3MW9kMlUrajVsaDNyVWFya1B2RlBpWC9BRG5CZnBNZjcwN3NwOUh6SGV0UnF1USs4VStKZjg1d1g2VEgrOU83S2ZSOHgzclVhcmtQdkZQaVgvT2NGK2t4L3ZUdXluMGZNZDYxR3E1RDd4VDRsL3puQmZwTWY3MDdzcDlIekhldFJxdVErOFUrSmY4QU9jRitreC92VHV5bjBmTWQ2MUdxNUQ3eFQ0bC96bkJmcE1mNzA3c3A5SHpIZXRScXVRKzhVK0pmODV3WDZUSCs5TzdLZlI4eDNyVWFya1B2RlBpWC9PY0Yra3gvdlR1eW4wZk1kNjFHcTVFUDVxZkdCenA1eWNJVGNEOGI1SEZ6WXVlYUs0ZGJmSHBFL1hHZHIrSWQvTlpaTkRKa1JiOEdaaW5WMDZvZzNJOGpDbGJacGxwUHRVa3BIeGVMdUlZdUY4QmRaWnlobFJlaTNSdjhjcDdLTmJHeDduUjMwZzFyMU05VThwekg3ZXZYd2JGUEs3ZWJETDErdjY5OEwyTmJacHBiaVY1NTVYa2xrWXU3dXhMTXhPeVNUNUpOY2syNG5kNW5YSktGV1JiVUVrbzVmOFl5OEk1Y0dUcE5oZU1rZDJDRHRWQk9wQm9FN1haT3ZjRWp6b2pjb3FwMHN6SHd2UDhBUHNhRmZTS3BsN3l2dlEzdDUrV09HTnMrR3RybXdVTTBWeEVseGJ5cEpGSW9kSFJneXNwR3dRUjVCcnFVN3E2T1phYXdaeUExT1o1YUxxZ2dVQW9CUUNnRkFLQVVBb0JRRnBOVGtTa2NjMDBWdkU5eGNTcEhGR3BkM2RncXFvR3lTVDRBcUcwazJ6M0RDNG51ck0xOTVnY1l5OFhaZ21QcEZoWnM4ZG9BTzdLU055SFlCMjNTRHIyR2g1MlR5MWJWT3FtWFdTeS9KMHRCU0ttbDd6OFVTVi9MeXphd3ZtcytSRjYwemZGQUtBbkhMdm1KTHd4S3VLeXJ2SmlwRzdIdXpXekU5MlVlNmsrVi9xTyt3MWxRMXpwMzJjencvWCtlWFRyYTZoVlF0K1g0dnZyaDFiT1VNMFZ4RWs4RXFTUlNLSFIwWUZXVWpZSUk4Z2l1alRUVjB6bkdtblpvNUFmblVubG9yVUVGYUFVQW9CUUNnRkFVM3FwQlFuNVVKU09PYWFLM2llNHVKVWppalV1N3V3Q3FvR3lTVDRBRlEybGl6MGxkMlJnM21KekVsNG1sYkZZcDNqeFViZHozRFhMQTltWWV5ajJYK3A3NkM4NVhWenFIdVFlSDc2Njh1am9hRlU2N1NQeGZYWFhuQjZyU3lGQUtBVUFvQ1U4SDh3ODF3bklzSmQ3N0hoQ2dzNVpTRlR1VzNHZS9RZXBpVG9hT3pzYjBSdVV0Yk1wbmJPSFQ4YUZmVmJPbDFGNG9MUXhOM2J0bmtzY3I0S3lmQ3k0WUdiY0J4WmdPSm9nMkl5TWNzZ1FPOERmaGxqN0tUdFQzSUJZQXNOcnZ3VFhSU2FtVlVLOHQrM0hyNE9mbTA4NlQrNURiRi9mbGZQTlh4dG1rOEQ2OVp6Q1ZER3BJc1Y2aFFXR3g4NkVXR3g4NkN3NmhRbXhRc2FDeFNvSlBrWi9pM2gvaG1NdGw4akhGSVVMcEF2NHBaT3pFYVVkeHNxUUdPbDM1SXJCUHFaVk9yekg3Y2V2Z3pTcWViUDhBMjRiNHBjTU9kc3MzeHRrbThEQ1BHUE1ETDhYUyttUzFuWUJRQmFSeWtxeDJEdHoyNnpzRFd4b2FHaHZaUE8xVmJNcW5aNExUODZuUlV0Qkxwa25GYUtMVzNybG5iQjJldndSZXRNM2hRQ2dGQUtBVUFvQzZHYVczbFNlQ1Y0NVkyRG82TVF5c0RzRUVlQ0RVcHVGM1JEU2lWbmtUemg3bkZuOFZFTGJMUUpsWWxYU003K25LT3dBMjRCNmgyUGtGaVRzbXJLVHRTYkxWbzF2TDU2K2ZNcTUreXBjeDNsdmQxNHJqeStySzFpZjR6bXh3WGtlbFpMNld5a2VUMDFTNmhLNzhhWXN2VXFqdjVMRFdqdlE3MVp5OXBVOHgydmIxNlpXek5uVkV0WHRmMDZUK0NTMkdXeFdWRWh4ZVN0YndSYTlUMEpsazZONzF2cEoxdlIvc2EzSUprRXp3TlAwZHpUamx4eTdLTk5YMU8zV1E4Q2dPcGY1ZkU0cm8rMDhuYVdmcTdLZXZNc2ZWcnpycUkzNUg5Nnh4eklKZmphWHF6SkJMam1lQk4raUkxaythL0JlTjZsUy9sdlpFbE1iSmF4RnZHOXNHYnBSbDdlUXgzc2EyTzlhY3phVlBMZHIzOU9sOEcxTDJkVVRGZTF2WHB0Y2lBY1FjNHMvbFlqYlltQk1WRXk2ZGtmMUpUc0VIVGtBS080OERxQkd3MVZrL2FrMlpoQitsZlBNdEpHeXBjdDcweDcybkJjT2ZIeXh5NGtEbW1tdUpudUxpVjVaWldMdTdzV1ptSjJTU2U1SlB2VmEyNG5kbG1rb1ZaWkZ0UVNLQVVBb0QvOWs9JztcblxuICBpc0V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29tbWFuZEV2ZW50ITogTWVudUl0ZW1Db21tYW5kRXZlbnQ7XG5cbiAgc3RhdHVzZXMhOiBTZWxlY3RJdGVtW107XG4gIGNsb25lZERhdGFTb3VyY2U6IHsgW3M6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgLyoqICBFbWl0ZSBldmVudG8gZGUgc2FsdmFtZW50byBkYSBsaW5oYSAqL1xuICBAT3V0cHV0KCkgb25Sb3dTYXZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uQWN0aXZlSXRlbTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkFjdGl2ZUl0ZW1Mb3RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uUGFnaW5hdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZG91YmxlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJGaWVsZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblN3aXRjaFRhYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvZGlnb0ZpcGVQaXBlOiBDb2RpZ29GaXBlUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNwZkNucGpQaXBlOiBDcGZDbnBqUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbGVmb25lUGlwZTogVGVsZWZvbmVQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZVxuXG4gICkge1xuICAgIHRoaXMuaXNSb3dTZWxlY3RhYmxlID0gdGhpcy5pc1Jvd1NlbGVjdGFibGUuYmluZCh0aGlzKTtcbiAgfVxuICBzZWxlY3RlZFByb2R1Y3Q6IGFueSA9IHtcbiAgICByb3dEYXRhOiB7fSxcbiAgICBlZGl0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGl0ZW1zITogTWVudUl0ZW1bXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRhbWFuaG9UZWxhID0gd2luZG93LmlubmVyV2lkdGg7XG5cbiAgICB0aGlzLml0ZW1zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ0VkaXRhciBsaW5oYScsIGljb246ICdwaSBwaS1mdyBwaS1wZW5jaWwnLCBjb21tYW5kOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb3dFZGl0JyArIHRoaXMuc2VsZWN0ZWRQcm9kdWN0LnJvd0RhdGFbdGhpcy5jb25maWcuZGF0YUtleV0pO1xuICAgICAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLmNvbmZpZy5kaXNhYmxlRWRpdFJvd0Z1bmN0aW9uPy4odGhpcy5zZWxlY3RlZFByb2R1Y3Qucm93RGF0YSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKFwiQSBlZGnDp8OjbyBkZXNzYSBsaW5oYSBlc3RhIGRlc2FiaWxpdGFkYVwiKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uUm93RWRpdEluaXQodGhpcy5zZWxlY3RlZFByb2R1Y3QpXG5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdDYW5jZWxhciBlZGnDp8OjbycsIGljb246ICdwaSBwaS1mdyBwaS10aW1lcycsIGNvbW1hbmQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvd0NhbmNlbCcgKyB0aGlzLnNlbGVjdGVkUHJvZHVjdC5yb3dEYXRhW3RoaXMuY29uZmlnLmRhdGFLZXldKTtcbiAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKFwiQSBlZGnDp8OjbyBkZXNzYSBsaW5oYSBlc3RhIGRlc2FiaWxpdGFkYVwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdTYWx2YXIgZWRpw6fDo28nLCBpY29uOiAncGkgcGktZncgcGktc2F2ZScsIGNvbW1hbmQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvd1NhdmUnICsgdGhpcy5zZWxlY3RlZFByb2R1Y3Qucm93RGF0YVt0aGlzLmNvbmZpZy5kYXRhS2V5XSk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTsgLy8gRGlzcGFyYSB1bSBldmVudG8gZGUgY2xpcXVlIG5vIGVsZW1lbnRvIGNvbSBJRCAndGVzdGUnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdFdhcm4oXCJBIGVkacOnw6NvIGRlc3NhIGxpbmhhIGVzdGEgZGVzYWJpbGl0YWRhXCIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtc1swXS52aXNpYmxlID0gIXRoaXMuc2VsZWN0ZWRQcm9kdWN0LmVkaXRpbmcgJiYgdGhpcy5pc0VkaXRhYmxlVGFibGUoKSAhPT0gZmFsc2U7XG4gICAgdGhpcy5pdGVtc1sxXS52aXNpYmxlID0gdGhpcy5zZWxlY3RlZFByb2R1Y3QuZWRpdGluZyAmJiB0aGlzLmlzRWRpdGFibGVUYWJsZSgpICE9PSBmYWxzZTtcbiAgICB0aGlzLml0ZW1zWzJdLnZpc2libGUgPSB0aGlzLnNlbGVjdGVkUHJvZHVjdC5lZGl0aW5nICYmIHRoaXMuaXNFZGl0YWJsZVRhYmxlKCkgIT09IGZhbHNlO1xuICB9XG5cbiAgZGJDbGlja0VkaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb3dFZGl0JyArIHRoaXMuc2VsZWN0ZWRJdGVtW3RoaXMuY29uZmlnLmRhdGFLZXldKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UudG9hc3RXYXJuKFwiQSBlZGnDp8OjbyBkZXNzYSBsaW5oYSBlc3RhIGRlc2FiaWxpdGFkYVwiKVxuICAgIH1cbiAgfVxuXG4gIGlzUm93U2VsZWN0YWJsZShldmVudDogYW55KSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWRDaGVja2JveChldmVudC5kYXRhKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICBpZiAoY2hhbmdlc1snc2V0Q29uZmlnJ10gJiYgdGhpcy5jb25maWcpIHtcblxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChlOiBUYWJsZUVkaXRDb25maWdDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGUuZmllbGRDb250cm9sVHlwZSA9PSAnZHJvcGRvd24nKSB7XG4gICAgICAgICAgdGhpcy5saXN0YXJEcm9wKGUuZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU2VydmljZSwgZSlcblxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9uUm93RWRpdEluaXQocm93RGF0YTogYW55KSB7XG4gICAgdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXSA9IHsgLi4ucm93RGF0YSB9O1xuICB9XG5cbiAgb25Sb3dFZGl0U2F2ZShyb3dEYXRhOiBhbnksIGluZGV4OiBhbnkpIHtcblxuICAgIGxldCBlcnJvcnMgPSBbXVxuICAgIC8vVmFsaWRhw6fDo28gZG8gZm9ybXVsYXJpbyBmYWtlXG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKChjb2w6IFRhYmxlRWRpdENvbmZpZ0NvbHVtbikgPT4ge1xuXG4gICAgICBpZiAoY29sLnJlcXVpcmVkID8/IHRydWUpIHtcbiAgICAgICAgaWYgKCFyb3dEYXRhW2NvbC5maWVsZF0pXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0V2FybihgTyBjYW1wbyAke2NvbC5oZWFkZXJ9IGUgb2JyaWdhdMOzcmlvISBgKVxuICAgICAgfVxuXG4gICAgICBpZiAoY29sLnZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCB0ZW1wRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wocm93RGF0YVtjb2wuZmllbGRdLCBjb2wudmFsaWRhdG9yIGFzIFZhbGlkYXRvckZuKTtcbiAgICAgICAgdGVtcEZvcm1Db250cm9sLm1hcmtBbGxBc1RvdWNoZWQoKVxuICAgICAgICB0ZW1wRm9ybUNvbnRyb2wudmFsaWRcbiAgICAgICAgaWYgKHRlbXBGb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnRvYXN0V2FybihgRXJybyBhbyB2YWxpZGFyIGRhZG9zIGRvIGNhbXBvOiAke2NvbC5oZWFkZXJ9ISBgKVxuICAgICAgICAgIGVycm9ycy5wdXNoKHsgZXJybzogXCJDYW1wbyBpbnZhbGlkb1wiLCBjYW1wbzogcm93RGF0YVtjb2wuZmllbGRdIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5vblJvd1NhdmUuZW1pdChyb3dEYXRhKVxuICAgICAgZGVsZXRlIHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtyb3dEYXRhLmlkIGFzIHN0cmluZ107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS50b2FzdFdhcm4oYEVycm8gZGUgdmFsaWRhw6fDo28gZGUgZGFkb3MhIGApXG4gICAgICAvLyB0aGlzLm9uUm93RWRpdENhbmNlbChyb3dEYXRhLCBpbmRleClcbiAgICAgIC8vIHRoaXMub25Sb3dFZGl0SW5pdChyb3dEYXRhKVxuICAgICAgdGhpcy5kYXRhU291cmNlW2luZGV4XSA9IHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtyb3dEYXRhLmlkIGFzIHN0cmluZ107XG4gICAgICBkZWxldGUgdGhpcy5jbG9uZWREYXRhU291cmNlW3Jvd0RhdGEuaWQgYXMgc3RyaW5nXTtcbiAgICB9XG4gIH1cblxuICBvblJvd0VkaXRDYW5jZWwocHJvZHVjdDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5kYXRhU291cmNlW2luZGV4XSA9IHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtwcm9kdWN0LmlkIGFzIHN0cmluZ107XG4gICAgZGVsZXRlIHRoaXMuY2xvbmVkRGF0YVNvdXJjZVtwcm9kdWN0LmlkIGFzIHN0cmluZ107XG4gIH1cblxuICBhc3luYyBsaXN0YXJEcm9wKHNlcnZpY2U6IGFueSwgY29sOiBhbnksIGluZHRvZG9zPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnM/LmluZGV4T2YoY29sKTtcblxuICAgIGlmICghY29sLmZpZWxkRHJvcERvd25Db250cm9sLmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlKVxuICAgICAgYXdhaXQgc2VydmljZS5MaXN0YXIoaW5kdG9kb3MgfHwgJycpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4pIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmNvbHVtbnMgJiYgY29sdW1uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zW2NvbHVtbl0uZmllbGREcm9wRG93bkNvbnRyb2wuZmllbGRDb250cm9sRHJvcGRvd25Tb3VyY2UgPSBkYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1uc1tjb2x1bW5dLmZpZWxkRHJvcERvd25Db250cm9sPy5maWVsZENvbnRyb2xEcm9wZG93blNvdXJjZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBlbHNlIHJldHVybiB0aGlzLmNvbmZpZy5jb2x1bW5zW2NvbHVtbl0uZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlXG4gIH1cblxuICByZXRvcm5hRGVzY3JpY2FvRHJvcChyb3dEYXRhOiBhbnlbXSwgY29sOiBUYWJsZUVkaXRDb25maWdDb2x1bW4pIHtcblxuICAgIGNvbnN0IGRhdGEgPSBjb2wuZmllbGREcm9wRG93bkNvbnRyb2w/LmZpZWxkQ29udHJvbERyb3Bkb3duU291cmNlXG4gICAgY29uc3QgaWRvYmpldG8gPSBjb2wuZmllbGREcm9wRG93bkNvbnRyb2w/Lmlkb2JqZXRvXG4gICAgY29uc3QgZGVzY3JpY2Fvb2JqZXRvID0gY29sLmZpZWxkRHJvcERvd25Db250cm9sPy5kZXNjcmljYW9vYmpldG9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgdmFsb3JBdHVhbCA9IHJvd0RhdGFbY29sLmZpZWxkXVxuXG4gICAgaWYgKGRhdGEgJiYgaWRvYmpldG8gJiYgZGVzY3JpY2Fvb2JqZXRvKVxuICAgICAgcmV0dXJuIGRhdGE/LmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbVtpZG9iamV0b10gPT0gdmFsb3JBdHVhbClbZGVzY3JpY2Fvb2JqZXRvXVxuICAgIGVsc2UgcmV0dXJuICdDYXJyZWdhbmRvJ1xuICB9XG5cbiAgcHVibGljIG9uR2xvYmFsRmlsdGVyKHRhYmxlOiBUYWJsZSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpO1xuICAgIHRhYmxlLmZpbHRlckdsb2JhbCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlLCAnY29udGFpbnMnKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLmFkanVzdFRhYmxlU2l6ZSgpO1xuICAgIHRoaXMudGFtYW5ob1RlbGEgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgfVxuXG4gIGFkanVzdFRhYmxlU2l6ZSgpIHtcbiAgICBpZiAodGhpcy50YWJsZVNpemUgPCA4MDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaXplID0gJ3AtZGF0YXRhYmxlLXNtJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNpemUgPSAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFnaW5hdGUoJGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICBsZXQgcGFnaW5hSW5pY2lhbCA9XG4gICAgICAgICgkZXZlbnQ/LmZpcnN0ID4gMCA/ICRldmVudC5maXJzdCAvICRldmVudC5yb3dzIDogJGV2ZW50LmZpcnN0KSArIDE7XG4gICAgICBsZXQgdGVybW9QZXNxdWlzYSA9ICcnO1xuICAgICAgbGV0IG9yZGVuYWNhbyA9ICcnO1xuXG4gICAgICBpZiAoJGV2ZW50Lmdsb2JhbEZpbHRlcikgdGVybW9QZXNxdWlzYSA9ICRldmVudC5nbG9iYWxGaWx0ZXI7XG5cbiAgICAgIGlmICgkZXZlbnQuc29ydEZpZWxkKVxuICAgICAgICBvcmRlbmFjYW8gPSBgJHskZXZlbnQuc29ydEZpZWxkfSAkeyRldmVudC5zb3J0T3JkZXIgPT09IDEgPyAnQVNDJyA6ICdERVNDJ1xuICAgICAgICAgIH1gO1xuXG4gICAgICBjb25zdCBvYmpldG86IFRhYmxlUGFnaW5hdGUgPSB7XG4gICAgICAgIHBhZ2luYUluaWNpYWw6IHBhZ2luYUluaWNpYWwsXG4gICAgICAgIHRhbWFuaG9QYWdpbmE6ICRldmVudC5yb3dzLFxuICAgICAgICB0ZXJtb1Blc3F1aXNhOiB0ZXJtb1Blc3F1aXNhLFxuICAgICAgICBvcmRlbmFjYW86IG9yZGVuYWNhbyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMub25QYWdpbmF0ZS5lbWl0KG9iamV0byk7XG4gICAgfVxuICB9XG5cbiAgaXNCb29sZWFuRmllbGQocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbC5maWVsZFR5cGUgPT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgaXNDaGlwRmllbGQoY29sOiBUYWJsZUNvbmZpZ0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wuZmllbGRUeXBlID09ICdjaGlwJztcbiAgfVxuXG4gIGlzSW1hZ2VGaWVsZChjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldG9ybm8gPSBjb2wuZmllbGRUeXBlICYmIGNvbC5maWVsZFR5cGUgPT09ICdpbWFnZScgPyB0cnVlIDogZmFsc2U7XG4gICAgcmV0dXJuIHJldG9ybm87XG4gIH1cblxuICByZXR1cm5Sb3dDbGFzcyhyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcbiAgICBsZXQgdmFsdWUgPSByb3dEYXRhW2NvbC5maWVsZF07XG4gICAgbGV0IHJvd0NsYXNzOiBzdHJpbmc7XG5cbiAgICB0aGlzLnRhYmxlU2l6ZSA+IDgwMCA/IChyb3dDbGFzcyA9ICd0ZXh0LWJhc2UnKSA6IChyb3dDbGFzcyA9ICd0ZXh0LXNtJyk7XG5cbiAgICBpZiAoY29sLmV4cGlyZWREYXRlID09IHRydWUpIHtcbiAgICAgIG5ldyBEYXRlKHZhbHVlKSA8IG5ldyBEYXRlKClcbiAgICAgICAgPyAocm93Q2xhc3MgPSByb3dDbGFzcyArICcgdGV4dC1yZWQtNDAwIGZvbnQtc2VtaWJvbGQnKVxuICAgICAgICA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gcm93Q2xhc3M7XG4gIH1cblxuICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhOiBhbnksIGNvbDogVGFibGVDb25maWdDb2x1bW4pIHtcbiAgICBsZXQgdmFsdWUgPSByb3dEYXRhW2NvbC5maWVsZF07XG5cbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKCFjb2wucGlwZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoY29sLnBpcGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLCAnZGQvTU0veXl5eScpO1xuICAgICAgICBjYXNlICdkZWNpbWFsJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWNpbWFsUGlwZS50cmFuc2Zvcm0odmFsdWUsICcxLjItMicsICdwdC1CUicpO1xuICAgICAgICBjYXNlICdjcGZjbnBqJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcGZDbnBqUGlwZS50cmFuc2Zvcm0odmFsdWUpO1xuICAgICAgICBjYXNlICd0ZWxlZm9uZSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGVsZWZvbmVQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgICAgIGNhc2UgJ2NvZGlnb2ZpcGUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmNvZGlnb0ZpcGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgICAgIGNhc2UgJ21vbmV5JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRhclZhbG9yKHZhbHVlKTtcbiAgICAgICAgY2FzZSAncGVyY2VudGFnZSc6XG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfSAlYDtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFsaWduQ29sdW5hc0hlYWRlcihjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5hbGlnbikge1xuICAgICAgaWYgKGNvbC5hbGlnbiA9PSAncmlnaHQnKSByZXR1cm4gJ2p1c3RpZnktY29udGVudDogZW5kJztcbiAgICAgIGVsc2UgcmV0dXJuICcnO1xuICAgIH0gZWxzZSByZXR1cm4gJyc7XG4gIH1cblxuICBjZW50cmFsaXphckNvbHVuYXMoY29sOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChjb2wuY2VudHJhbGl6ZSkge1xuICAgICAgcmV0dXJuICd0ZXh0LWFsaWduOiBjZW50ZXI7ICc7XG4gICAgfSBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGFsaWduQ29sdW5hcyhjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5hbGlnbikge1xuICAgICAgcmV0dXJuIGB0ZXh0LWFsaWduOiAke2NvbC5hbGlnbn1gO1xuICAgIH0gZWxzZSByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm5DbGFzc0ljb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAnaWNvbnJvdycpO1xuICB9XG5cbiAgcmV0dXJuVG9vbHRpcEljb24ocm93RGF0YTogYW55LCBjb2w6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcGljb25yb3cnKTtcbiAgfVxuXG4gIHJldHVybkNsYXNzQ2hpcChyb3dEYXRhOiBhbnksIGNvbDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGNoaXAtc3R5bGUgdy1hdXRvIGJvcmRlci1yb3VuZC0yeGwgcC0yIHRleHQtJHt0aGlzLnJldG9ybmFyUm93KFxuICAgICAgcm93RGF0YSxcbiAgICAgIGNvbCxcbiAgICAgICdzdHlsZWNoaXAnXG4gICAgKX0gYm9yZGVyLSR7dGhpcy5yZXRvcm5hclJvdyhyb3dEYXRhLCBjb2wsICdzdHlsZWNoaXAnKX1gO1xuICB9XG5cbiAgcmV0b3JuYXJSb3cocm93RGF0YTogYW55LCBjb2w6IGFueSwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgX3Jvd2FjdGlvbiA9IHRoaXMuY29uZmlnLnJvd3MgPyB0aGlzLmNvbmZpZy5yb3dzW2NvbC5maWVsZF0gOiBudWxsO1xuICAgIGNvbnN0IF9maWVsZDogc3RyaW5nID1cbiAgICAgIF9yb3dhY3Rpb24gJiYgX3Jvd2FjdGlvbltmaWVsZF1cbiAgICAgICAgPyBfcm93YWN0aW9uW2ZpZWxkXS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb25cbiAgICAgICAgICA/IF9yb3dhY3Rpb25bZmllbGRdLmFwcGx5KHRoaXMsIFtyb3dEYXRhXSlcbiAgICAgICAgICA6IF9yb3dhY3Rpb25bZmllbGRdXG4gICAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gX2ZpZWxkO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHZhbHVlID0gW10pIHtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZm9ybWF0YXJWYWxvcih2YWxvcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXG4gICAgICBjdXJyZW5jeTogJ0JSTCcsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdCh2YWxvcik7XG4gIH1cblxuICBsb2FkSW1hZ2Uocm93RGF0YTogYW55LCBjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogc3RyaW5nIHtcbiAgICAvKlxuICAgICAgTm9zc2EgY29sdW5hIGRlIGltYWdlbSB0cmFiYWxoYSBjb20gc3RyaW5ncyBkbyB0aXBvOiBiYXNlNjQgb3UgdXJsXG4gICAgKi9cbiAgICBsZXQgcmV0b3JubyA9IGBkYXRhOmltYWdlL2pwZztiYXNlNjQsICR7dGhpcy5pbWdEZWZhdWx0fWA7XG4gICAgaWYgKHJvd0RhdGEgJiYgY29sICYmIHJvd0RhdGFbY29sLmZpZWxkXSAmJiByb3dEYXRhW2NvbC5maWVsZF0gIT09ICcnKSB7XG4gICAgICBpZiAocm93RGF0YVtjb2wuZmllbGRdLmluY2x1ZGVzKCdodHRwJykpIHJldG9ybm8gPSByb3dEYXRhW2NvbC5maWVsZF07XG4gICAgICBlbHNlIHJldG9ybm8gPSBgZGF0YTppbWFnZS9qcGc7YmFzZTY0LCAke3Jvd0RhdGFbY29sLmZpZWxkXX1gO1xuICAgIH1cblxuICAgIHJldHVybiByZXRvcm5vO1xuICB9XG5cbiAgZ2V0Q3VzdG9tVGVtcGxhdGUodGVtcGxhdGVuYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVzW3RlbXBsYXRlbmFtZV07XG4gIH1cblxuICBleGliaXJDYW1wbyhmaWVsZDogYW55LCByb3dEYXRhOiBhbnkpIHtcbiAgICBsZXQgdmlzaWJsZSA9IGZpZWxkLnZpc2libGUgPyBmaWVsZC52aXNpYmxlKHJvd0RhdGEpIDogdHJ1ZTtcbiAgICByZXR1cm4gdmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmVJdGVtKHJvd0RhdGE6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcbiAgICB0aGlzLm9uQWN0aXZlSXRlbS5lbWl0KHsgcm93RGF0YTogcm93RGF0YSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmVJdGVtTG90ZShyb3dEYXRhOiBhbnkpIHtcbiAgICB0aGlzLm9uQWN0aXZlSXRlbUxvdGUuZW1pdChyb3dEYXRhKTtcbiAgfVxuXG4gIHJldG9ybmFyQ2FtcG8oYWN0aW9uOiBLdk1lbnVJdGVtLCByb3dEYXRhOiBhbnksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IF9mdW5jdGlvbiA9IGFjdGlvbi5keW5hbWljZmllbGRzXG4gICAgICA/IChhY3Rpb24uZHluYW1pY2ZpZWxkc1tmaWVsZF0gYXMgRnVuY3Rpb24pXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgX2ZpZWxkOiBzdHJpbmcgPSBfZnVuY3Rpb25cbiAgICAgID8gX2Z1bmN0aW9uLmFwcGx5KGFjdGlvbiwgW3Jvd0RhdGFdKVxuICAgICAgOiBhY3Rpb25bZmllbGRdO1xuICAgIHJldHVybiBfZmllbGQ7XG4gIH1cblxuICBjYWxsRGlzYWJsZWQoYWN0aW9uOiBLdk1lbnVJdGVtLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoYWN0aW9uPy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIGFjdGlvbi5kaXNhYmxlZChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY3JpYXJNZW51c01vZGFsKGRhdGE6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hY3Rpb25zICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jb25maWcuYWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBpY29uID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ2ljb24nKTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMucmV0b3JuYXJDYW1wbyhhY3Rpb24sIGRhdGEsICd0b29sdGlwJyk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5yZXRvcm5hckNhbXBvKGFjdGlvbiwgZGF0YSwgJ2xhYmVsJyk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQ6IGFueSA9IHRoaXMucmV0b3JuYXJDYW1wbyhhY3Rpb24sIGRhdGEsICdjb21tYW5kJyk7XG4gICAgICAgIGNvbnN0IHZpc2libGU6IGJvb2xlYW4gPSBhY3Rpb24udmlzaWJsZVxuICAgICAgICAgID8gYWN0aW9uLnZpc2libGUoZGF0YSlcbiAgICAgICAgICA6IHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkOiBib29sZWFuID0gYWN0aW9uLmRpc2FibGVkXG4gICAgICAgICAgPyBhY3Rpb24uZGlzYWJsZWQoZGF0YSlcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG1lbnVJbnNlcnQ6IEt2TWVudUl0ZW0gPSB7XG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICB0b29sdGlwLFxuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMubWVudUl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAoeCkgPT4geC5jb21tYW5kID09IG1lbnVJbnNlcnQuY29tbWFuZFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PSAwKSB0aGlzLm1lbnVJdGVtcy5wdXNoKG1lbnVJbnNlcnQpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAobWVudUluc2VydC5sYWJlbCAhPSBpdGVtWzBdLmxhYmVsKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLm1lbnVJdGVtcy5pbmRleE9mKGl0ZW1bMF0pO1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWVudUluc2VydC52aXNpYmxlICE9IGl0ZW1bMF0udmlzaWJsZSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lbnVJbnNlcnQuZGlzYWJsZWQgIT0gaXRlbVswXS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5tZW51SXRlbXMuaW5kZXhPZihpdGVtWzBdKTtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGFMaW5oYUFjYW9WYXppYShyb3dEYXRhOiBhbnkpIHtcbiAgICB2YXIgYWxndW1JdGVtVmlzaXZlbCA9IHRoaXMuY29uZmlnLmFjdGlvbnMuc29tZSgoYSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhLnZpc2libGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGEudmlzaWJsZShyb3dEYXRhKSA9PT0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBSZXRvcm5hIHRydWUgc2UgYS52aXNpYmxlKHJvd0RhdGEpIG7Do28gZXhpc3RpclxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICFhbGd1bUl0ZW1WaXNpdmVsO1xuICB9XG5cbiAgZG91YmxlQ2xpY2soZTogYW55LCByb3dEYXRhOiBhbnkpIHtcbiAgICBsZXQgZXZlbnREb3VibGVDbGljayA9IHsgZXZlbnQ6IGUsIHJvd0RhdGE6IHJvd0RhdGEgfTtcblxuICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICBlLnRhcmdldC5jbGFzc0xpc3QuZm9yRWFjaCgoeDogYW55KSA9PiBhcnJheS5wdXNoKHgpKTtcblxuICAgIC8vaWYgKGFycmF5LmZpbmQoKHg6IGFueSkgPT4geCA9PSAnbmctc3Rhci1pbnNlcnRlZCcpICE9IHVuZGVmaW5lZClcbiAgICB0aGlzLmRvdWJsZUNsaWNrRXZlbnQuZW1pdChldmVudERvdWJsZUNsaWNrKTtcbiAgfVxuXG4gIGlzRGlzYWJsZWRDaGVja2JveChyb3dEYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZUNvbnRyb2xDaGVja2JveEZ1bmN0aW9uXG4gICAgICA/IHRoaXMuY29uZmlnLmRpc2FibGVDb250cm9sQ2hlY2tib3hGdW5jdGlvbihyb3dEYXRhKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHJldHVyblRvb2x0aXBSb3cocm93RGF0YTogYW55LCBjb2w6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmV0b3JuYXJSb3cocm93RGF0YSwgY29sLCAndG9vbHRpcHJvdycpO1xuICB9XG5cbiAgaXNTd2l0Y2hGaWVsZChjb2w6IFRhYmxlQ29uZmlnQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgbGV0IHJldG9ybm8gPSBjb2wuZmllbGRUeXBlICYmIGNvbC5maWVsZFR5cGUgPT09ICdzd2l0Y2gnID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHJldHVybiByZXRvcm5vO1xuICB9XG5cbiAgb25Td2l0Y2hDaGFuZ2UoZXN0YWRvOiBhbnksIHJvd0RhdGE6IGJvb2xlYW4sIGNvbDogYW55KSB7XG4gICAgdGhpcy5vblN3aXRjaFRhYmxlQ2hhbmdlLmVtaXQoe1xuICAgICAgZXN0YWRvOiBlc3RhZG8sXG4gICAgICByb3dEYXRhOiByb3dEYXRhLFxuICAgICAgY29sOiBjb2xcbiAgICB9KVxuICB9XG4gIGlzQnV0dG9uRGlzYWJsZShhY3Rpb246IGFueSwgcm93RGF0YTogYW55LCBjb21tYW5kRXZlbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuY2FsbERpc2FibGVkKGFjdGlvbiwgcm93RGF0YSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2UgcmV0dXJuIHRoaXMuYWN0aXZlSXRlbShyb3dEYXRhKSwgYWN0aW9uPy5jb21tYW5kKGNvbW1hbmRFdmVudCk7XG4gIH1cblxuICBpc0Rpc2FibGVFZGl0Um93RnVuY3Rpb24ocm93RGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVFZGl0Um93RnVuY3Rpb24gPyB0aGlzLmNvbmZpZy5kaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpIDogZmFsc2U7XG4gIH1cblxuICBpc0Rpc2FibGVFZGl0Um93Q2VsbEZ1bmN0aW9uKHJvd0RhdGE6IGFueSwgY29sOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sLmRpc2FibGVFZGl0Um93Q2VsbEZ1bmN0aW9uID8gY29sLmRpc2FibGVFZGl0Um93Q2VsbEZ1bmN0aW9uKHJvd0RhdGEpIDogZmFsc2U7XG4gIH1cblxuICBpc0VkaXRhYmxlVGFibGUoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWcuY29sdW1ucylcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbHVtbnMuc29tZSgoY29sdW1uOiBhbnkpID0+ICdmaWVsZENvbnRyb2xUeXBlJyBpbiBjb2x1bW4pO1xuICB9XG59XG4iLCJcblxuPGRpdiBjbGFzcz1cImNhcmRcIiA+XG4gIDxwLXRvYXN0PjwvcC10b2FzdD5cblxuICA8cC1wYW5lbFxuICAgICpuZ0lmPVwiZmlsdHJvc0F2YW5jYWRvc1wiXG4gICAgaGVhZGVyPVwiRmlsdHJvcyBhdmFuw6dhZG9zXCJcbiAgICBbdG9nZ2xlYWJsZV09XCJ0cnVlXCJcbiAgICBbY29sbGFwc2VkXT1cInRydWVcIlxuICAgIChjb2xsYXBzZWRDaGFuZ2UpPVwiY29sbGFwc2VkID0gIWNvbGxhcHNlZFwiXG4gICAgW3N0eWxlXT1cInsgJ21hcmdpbi1ib3R0b20nOiAnMnB4JyB9XCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJpY29uc1wiPlxuICAgICAgPGlcbiAgICAgICAgKm5nSWY9XCIhY29sbGFwc2VkXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1maWx0ZXJcIlxuICAgICAgPjwvaT5cbiAgICAgIDwhLS0gw41jb25lIHF1YW5kbyBvIHBhaW5lbCBlc3TDoSBhYmVydG8gLS0+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cImNvbGxhcHNlZFwiXG4gICAgICAgIGNsYXNzPVwicGkgcGktbWludXNcIlxuICAgICAgPjwvaT5cbiAgICAgIDwhLS0gw41jb25lIHF1YW5kbyBvIHBhaW5lbCBlc3TDoSBmZWNoYWRvIC0tPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3AtcGFuZWw+XG5cbiAgPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJpdGVtc1wiPjwvcC1jb250ZXh0TWVudT5cbiAgPHAtdGFibGVcbiAgI3RlXG4gIFtyZW9yZGVyYWJsZUNvbHVtbnNdPVwiY29uZmlnLnJlb3JkZXJhYmxlQ29sdW1ucyB8fCBmYWxzZVwiXG4gICpuZ0lmPVwiY29uZmlnXCJcbiAgW3ZhbHVlXT1cImRhdGFTb3VyY2VcIlxuICBbZGF0YUtleV09XCJjb25maWcuZGF0YUtleVwiXG4gIFt0YWJsZVN0eWxlXT1cInsgJ21pbi13aWR0aCc6ICc1MHJlbScgfVwiXG4gIFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCJcbiAgW2VkaXRNb2RlXT1cIidyb3cnXCJcbiAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gIHNjcm9sbEhlaWdodD1cIjQwMHB4XCJcbiAgYXBwZW5kVG89XCJib2R5XCJcbiAgW3N0eWxlQ2xhc3NdPVwiJ3AtZGF0YXRhYmxlLXNtJ1wiXG4gIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZEl0ZW1zXCJcbiAgW3Jvd1NlbGVjdGFibGVdPVwiaXNSb3dTZWxlY3RhYmxlXCJcbiAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJnbG9iYWxGaWx0ZXJGaWVsZHNcIlxuICBbcm93c109XCJyb3dzXCJcbiAgW3BhZ2luYXRvcl09XCJwYWdpbmF0b3JcIlxuICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd3NQZXJQYWdlT3B0aW9uc1wiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IGRlIHt7IHRvdGFsUmVjb3JkcyB9fVwiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICBbcm93SG92ZXJdPVwidHJ1ZVwiXG4gIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgW2xhenldPVwiY29uZmlnLmxhenlcIlxuICAob25MYXp5TG9hZCk9XCJwYWdpbmF0ZSgkZXZlbnQpXCJcbiAgW2dyb3VwUm93c0J5XT1cImNvbmZpZy5maWVsZEdyb3VwXCJcbiAgW3Nob3dGaXJzdExhc3RJY29uXT1cInNob3dGaXJzdExhc3RJY29uXCJcbiAgW3BhZ2VMaW5rc109XCJwYWdlTGlua3NPcHRpb25zXCJcbiAgW3Njcm9sbGFibGVdPVwiaXNUYWJsZVNjcm9sbGFibGVcIlxuICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnkgXCJcbiAgWyhjb250ZXh0TWVudVNlbGVjdGlvbildPVwic2VsZWN0ZWRQcm9kdWN0XCJcbiAgW2NvbnRleHRNZW51XT1cIiBpc0VkaXRhYmxlVGFibGUoKSA/IGNtIDogbnVsbFwiXG4gID5cblxuXG5cblxuXG5cblxuXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cblxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgcFRlbXBsYXRlPVwiY2FwdGlvblwiXG4gICAgICAqbmdJZj1cImNvbmZpZy5lbmFibGVDYXRpb25cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ3JpZCBmb3JtZ3JpZCBwLWZsdWlkIGNvbC0xMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkIG15LTNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGNvbmZpZy50aXRsZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnN1YnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSBtYi00IGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBjb25maWcuc3VidGl0bGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIG1kOmNvbC02IGxnOmNvbC00IHt7XG4gICAgICAgICAgICB0YW1hbmhvVGVsYSA8IDc2OCA/ICdjb2wtMTAnIDogJ2NvbC0xMidcbiAgICAgICAgICB9fSBtdC0xIG1iLTIgXCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLmVuYWJsZUZpbHRlclwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNlYXJjaFwiPjwvaT5cblxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgcEF1dG9Gb2N1c1xuICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInRydWVcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbkdsb2JhbEZpbHRlcih0ZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGVzcXVpc2FyLi4uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoLTJyZW1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgY29sLTEganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29uZmlnLmFjdGlvbnNMb3RlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRucy1vcHRpb25zXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtYXJnaW4tcmlnaHQnOiAnN3B4JyB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGlkPVwiYWN0aW9uTG90ZUJ0bnNcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCB8fCBhY3Rpb24uc2hvd0Fjb2VzTG90ZSkgJiZcbiAgICAgICAgICAgICAgICBleGliaXJDYW1wbyhhY3Rpb24sIHRoaXMuYWN0aW9uKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbkxvdGVCdG5zIHAtYnV0dG9uLXJhaXNlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgIGFjdGlvbj8uY29tbWFuZChjb21tYW5kRXZlbnQpOyBhY3RpdmVJdGVtTG90ZShzZWxlY3RlZEl0ZW1zKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicmV0b3JuYXJDYW1wbyhhY3Rpb24sIHNlbGVjdGVkSXRlbXMsICd0b29sdGlwJylcIlxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidib3R0b20nXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJcbiAgICAgICAgICAgICAgICByZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgJ2J0bkNvbG9yJylcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCBzZWxlY3RlZEl0ZW1zLCAnZGlzYWJsZWQnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIG1kLTIyXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiXG4gICAgICAgICAgICAgICAgICByZXRvcm5hckNhbXBvKGFjdGlvbiwgc2VsZWN0ZWRJdGVtcywgJ2ljb25CdG5Db2xvcicpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHJldG9ybmFyQ2FtcG8oYWN0aW9uLCBzZWxlY3RlZEl0ZW1zLCBcImljb25cIikgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgcFRlbXBsYXRlPVwiaGVhZGVyXCJcbiAgICAgIGxldC1jb2x1bW5zXG4gICAgPlxuICAgICAgPHRyPlxuICAgICAgICA8dGhcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtOyBib3JkZXItbGVmdDogc29saWQgNHB4IHRyYW5zcGFyZW50XCJcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZy5lbmFibGVTZWxlY3RcIlxuICAgICAgICA+XG4gICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAoY2xpY2spPVwiYWN0aXZlSXRlbUxvdGUoc2VsZWN0ZWRJdGVtcylcIj48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgPC90aD5cblxuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxuICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCJcbiAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLnNvcnRhYmxlID09PSBmYWxzZVwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJjb2wud2lkdGhcIlxuICAgICAgICAgIHBSZW9yZGVyYWJsZUNvbHVtblxuICAgICAgICAgIGNsYXNzPVwidGV4dC1zbVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICYmIGFsaWduQ29sdW5hc0hlYWRlcihjb2wpID09ICcnXG4gICAgICAgICAgICAgICAgPyAnZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJ1xuICAgICAgICAgICAgICAgIDogJ2ZsZXggZmxleC1yb3cnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW3N0eWxlXT1cImFsaWduQ29sdW5hc0hlYWRlcihjb2wpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3Bhbj57eyBjb2wuaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgPHAtc29ydEljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuc29ydGFibGUgPT09IHRydWVcIlxuICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEwcHhcIlxuICAgICAgICAgICAgPjwvcC1zb3J0SWNvbj5cblxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGVhZGVyVG9vbHRpcFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXG4gICAgICAgICAgICA+aW5mbzwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoICpuZ0lmPVwiY29uZmlnLmFjdGlvbnMgJiYgY29uZmlnLmFjdGlvbnMubGVuZ3RoID4gMFwiPjwvdGg+XG4gICAgICAgIDx0aCAqbmdJZj1cImlzRWRpdGFibGVUYWJsZSgpXCIgIGlkPVwidGgtZWRpdFwiIHN0eWxlPVwid2lkdGg6IDIwcHhcIj5FZGl0YXI8L3RoPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuXG5cblxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICBsZXQtcm93Z3JvdXA9XCJyb3dncm91cFwiIGxldC1yb3dzcGFuPVwicm93c3BhblwiPlxuICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwicm93RGF0YVwiIFtwRWRpdGFibGVSb3dEaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICBbcENvbnRleHRNZW51Um93XT1cIntyb3dEYXRhLCBlZGl0aW5nfVwiXG4gICAgICA+XG5cblxuICAgICAgICA8dGRcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZy5lbmFibGVTZWxlY3RcIlxuICAgICAgICAgIFtzdHlsZV09XCJhcHBseVN0eWxlKHJvd0RhdGEsIHsgZmllbGQ6ICdjaGVjay1ib3gnLCBoZWFkZXI6ICcnIH0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS08cC10YWJsZUNoZWNrYm94ICpuZ0lmPVwiaXNWaXNpYmxlQ2hlY2tib3gocm93RGF0YSlcIi0tPlxuICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcbiAgICAgICAgICAgIFt2YWx1ZV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkQ2hlY2tib3gocm93RGF0YSlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZUl0ZW1Mb3RlKHNlbGVjdGVkSXRlbXMpXCJcbiAgICAgICAgICA+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxuXG5cblxuXG5cblxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuXG4gICAgICAgICAgPCEtLSBDZWx1bGEgcXVlIGFybWF6ZW5hIG9zIGNvbnRyb2xlcyBkZSBlZGnDp8OjbyBwYXJhIG9zIGNhbXBvcyAtLT5cbiAgICAgICAgICA8dGQgKm5nSWY9XCJjb2wuZmllbGRDb250cm9sVHlwZVwiXG4gICAgICAgICAgW2lkXT1cIidyb3dUYWJsZScrIHJvd0RhdGFbY29uZmlnLmRhdGFLZXldXCJcbiAgICAgICAgICBwU2VsZWN0YWJsZVJvd0RibENsaWNrPVwiXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlSXRlbShyb3dEYXRhKVwiXG4gICAgICAgICAgKGRibGNsaWNrKT1cImRiQ2xpY2tFZGl0KClcIlxuICAgICAgICAgIHBTZWxlY3RhYmxlUm93RGJsQ2xpY2s9XCJcIlxuICAgICAgICAgIGNsYXNzPVwicm93VGFibGVcIiBbc3R5bGVdPVwiXG4gICAgICAgICAgYXBwbHlTdHlsZShyb3dEYXRhLCBjb2wpICtcbiAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgYWxpZ25Db2x1bmFzKGNvbCkgXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAtY2VsbEVkaXRvciBbbmdDbGFzc109XCJ7J3N3aXRjaCc6IGNvbC5maWVsZENvbnRyb2xUeXBlID09ICdzd2l0Y2gnfVwiPlxuICAgICAgICAgICAgICA8IS0tIENvbnRyb2xlIGRlIGVkacOnw6NvIGRvIGNhbXBvIC0tPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbC5maWVsZENvbnRyb2xUeXBlXCI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIiBjbGFzcz1cImdyaWQgZm9ybWdyaWQgcC1mbHVpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICA8a3YtaW5wdXQtdGV4dCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiIFtyZXF1aXJlZF09XCJjb2wucmVxdWlyZWQgPz8gdHJ1ZVwiPjwva3YtaW5wdXQtdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LW51bWJlciBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiIFtyZXF1aXJlZF09XCJjb2wucmVxdWlyZWQgPz8gdHJ1ZVwiPjwva3YtaW5wdXQtbnVtYmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWFzaydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LW1hc2sgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUVkaXRSb3dDZWxsRnVuY3Rpb24ocm93RGF0YSwgY29sKVwiIGNsYXNzPVwiY2VsbENvbnRyb2wgY29sXCIgW21hc2tdPVwiY29sLm1hc2tcIiBbcmVxdWlyZWRdPVwiY29sLnJlcXVpcmVkID8/IHRydWVcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiPjwva3YtaW5wdXQtbWFzaz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgPGt2LXN3aXRjaCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0NlbGxGdW5jdGlvbihyb3dEYXRhLCBjb2wpXCIgY2xhc3M9XCJjZWxsQ29udHJvbCBjb2xcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmZpZWxkXVwiID48L2t2LXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NhbGVuZGFyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgY2xhc3M9XCJncmlkIGZvcm1ncmlkIHAtZmx1aWRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgPGt2LWlucHV0LWNhbGVuZGFyIGNsYXNzPVwiY2VsbENvbnRyb2wgY29sXCIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5maWVsZF1cIj48L2t2LWlucHV0LWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiICBjbGFzcz1cImdyaWQgZm9ybWdyaWQgcC1mbHVpZFwiID5cbiAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUVkaXRSb3dDZWxsRnVuY3Rpb24ocm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxDb250cm9sIGNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImNvbC5maWVsZERyb3BEb3duQ29udHJvbC5kZXNjcmljYW9vYmpldG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImNvbC5maWVsZERyb3BEb3duQ29udHJvbC5pZG9iamV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2wuZmllbGREcm9wRG93bkNvbnRyb2wuZmllbGRDb250cm9sRHJvcGRvd25Tb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuXG5cblxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG5cblxuXG5cbiAgICAgICAgICAgICAgPCEtLSBWYWxvciBhdHVhbCBkbyBjYW1wbyAtLT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbC5maWVsZENvbnRyb2xUeXBlXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dEYXRhW2NvbC5maWVsZF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIHJldG9ybmFEZXNjcmljYW9Ecm9wKFxuICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgY29sXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e3Jvd0RhdGFbY29sLmZpZWxkXX19IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3dpdGNoJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8a3Ytc3dpdGNoIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuZmllbGRdXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2t2LXN3aXRjaD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmZpZWxkXSB8IGRhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWFzaydcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdIHwgbWFzazpjb2wubWFzayB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgPC90ZD5cblxuXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgIDx0ZCAqbmdJZj1cInJvd2dyb3VwICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW2F0dHIucm93c3Bhbl09XCJyb3dncm91cCAmJiBjb2wuZ3JvdXBlZCA/IHJvd3NwYW4gOiBudWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwicm93VGFibGVcIiBbc3R5bGVdPVwiXG4gICAgICAgICAgICAgIGFwcGx5U3R5bGUocm93RGF0YSwgY29sKSArXG4gICAgICAgICAgICAgIGNlbnRyYWxpemFyQ29sdW5hcyhjb2wpICtcbiAgICAgICAgICAgICAgYWxpZ25Db2x1bmFzKGNvbClcbiAgICAgICAgICAgIFwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwUm93KHJvd0RhdGEsIGNvbClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuaGVhZGVyIH19Ojwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCb29sZWFuRmllbGQocm93RGF0YSwgY29sKTsgZWxzZSBib29sZWFuRmllbGRcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgIWlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGQgJiYgIWlzSW1hZ2VGaWVsZChjb2wpXG4gICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2wuaWNvblwiIFtjbGFzc109XCJjb2wuaWNvbiArICcgbXItMidcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hpcEZpZWxkKGNvbCkgJiYgIWNvbC5pY29uRmllbGRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwicmV0dXJuQ2xhc3NDaGlwKHJvd0RhdGEsIGNvbClcIiBbcFRvb2x0aXBdPVwicmV0dXJuVG9vbHRpcEljb24ocm93RGF0YSwgY29sKVwiPnt7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uRmllbGRcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcbiAgICAgICAgICAgICAgfVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYm9vbGVhbkZpZWxkPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbClcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xuICAgICAgICAgICAgICAgIFwiPjxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1N3aXRjaEZpZWxkKGNvbClcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2ggKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIiBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICA8dGQgKm5nSWY9XCIhcm93Z3JvdXAgJiYgIWNvbC5ncm91cGVkICYmICFjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpXG4gICAgICAgICAgICBcIiBjbGFzcz1cInJvd1RhYmxlXCIgW3BUb29sdGlwXT1cInJldHVyblRvb2x0aXBSb3cocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5oZWFkZXIgfX06PC9zcGFuPlxuXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0Jvb2xlYW5GaWVsZChyb3dEYXRhLCBjb2wpOyBlbHNlIGJvb2xlYW5GaWVsZFwiIFtjbGFzc109XCJyZXR1cm5Sb3dDbGFzcyhyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAhaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZCAmJiAhaXNJbWFnZUZpZWxkKGNvbClcbiAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uXCIgW2NsYXNzXT1cImNvbC5pY29uICsgJyBtci0yJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGlwRmllbGQoY29sKSAmJiAhY29sLmljb25GaWVsZFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJyZXR1cm5DbGFzc0NoaXAocm93RGF0YSwgY29sKVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cmFuc2Zvcm1WYWx1ZShyb3dEYXRhLCBjb2wpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2VcIiBbc3JjXT1cImxvYWRJbWFnZShyb3dEYXRhLCBjb2wpXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8aSAqbmdJZj1cImNvbC5pY29uRmllbGRcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ21hdGVyaWFsLWljb25zJzogY29sLmluZEljb25NYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtci0yJzogIWNvbC5pbmRJY29uTWF0ZXJpYWxcbiAgICAgICAgICAgICAgfVwiIFtwVG9vbHRpcF09XCJyZXR1cm5Ub29sdGlwSWNvbihyb3dEYXRhLCBjb2wpXCI+XG4gICAgICAgICAgICAgIHt7IHJldHVybkNsYXNzSWNvbihyb3dEYXRhLCBjb2wpIH19XG4gICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYm9vbGVhbkZpZWxkPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjb2wuaWNvbkZpZWxkICYmICFpc1N3aXRjaEZpZWxkKGNvbClcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIHJvd0RhdGFbY29sLmZpZWxkXSA/ICd0ZXh0LWdyZWVuLTUwMCcgOiAndGV4dC1yZWQtNTAwJ1xuICAgICAgICAgICAgICAgIFwiPjxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAge3sgcm93RGF0YVtjb2wuZmllbGRdID8gXCJjaGVja1wiIDogXCJjbG9zZVwiIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1N3aXRjaEZpZWxkKGNvbClcIiBbY2xhc3NdPVwicmV0dXJuUm93Q2xhc3Mocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDxrdi1zd2l0Y2ggKG9uU3dpdGNoQ2hhbmdlKT1cIm9uU3dpdGNoQ2hhbmdlKCRldmVudCwgcm93RGF0YSwgY29sKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sPy5vbmx5UmVhZEZpZWxkID8/IHRydWVcIiBbc3dpdGNoVmFsdWVdPVwidHJhbnNmb3JtVmFsdWUocm93RGF0YSwgY29sKVwiPlxuICAgICAgICAgICAgICAgIDwva3Ytc3dpdGNoPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICA8dGQgKm5nSWY9XCJjb2wudGVtcGxhdGUgJiYgIWNvbC5maWVsZENvbnRyb2xUeXBlXCIgW3N0eWxlXT1cIlxuICAgICAgICAgICAgICBhcHBseVN0eWxlKHJvd0RhdGEsIGNvbCkgK1xuICAgICAgICAgICAgICBjZW50cmFsaXphckNvbHVuYXMoY29sKSArXG4gICAgICAgICAgICAgIGFsaWduQ29sdW5hcyhjb2wpXG4gICAgICAgICAgICBcIiBjbGFzcz1cInJvd1RhYmxlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmhlYWRlciB9fTo8L3NwYW4+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0Q3VzdG9tVGVtcGxhdGUoY29sLnRlbXBsYXRlLm5hbWUpXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dEYXRhIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxuICAgICAgPCEtLSBDb250cm9sZSBkZSBhw6fDo28gIC0tPlxuICAgICAgPHRkIFtuZ0NsYXNzXT1cInsndGQtdG9vbHMnOiBpc0VkaXRhYmxlVGFibGUoKSwgJ3RkLXRvb2xzLXN0aWNreSc6ICFpc0VkaXRhYmxlVGFibGUoKSB9XCJcbiAgICAgICAgKm5nSWY9XCJjb25maWcuYWN0aW9ucyAmJiBjb25maWcuYWN0aW9ucy5sZW5ndGggPiAwICYmICFlZGl0aW5nXCJcbiAgICAgICAgW3N0eWxlXT1cImFwcGx5U3R5bGUocm93RGF0YSwgeyBmaWVsZDogJ2J0bnMtb3B0aW9ucycsIGhlYWRlcjogJycgfSlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsIGdhcC0xXCJcbiAgICAgICAgICAqbmdJZj1cImFjb2VzTGluaGFUYWJlbGFcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc1wiXG4gICAgICAgICAgICBjbGFzcz1cIm1yLTFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvblxuICAgICAgICAgICAgICBpZD1cImFjdGlvbkJ0bnNcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiZXhpYmlyQ2FtcG8oYWN0aW9uLCByb3dEYXRhKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uQnRucyBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXJhaXNlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVJdGVtKHJvd0RhdGEpOyBhY3Rpb24/LmNvbW1hbmQoY29tbWFuZEV2ZW50KVwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyZXRvcm5hckNhbXBvKGFjdGlvbiwgcm93RGF0YSwgJ3Rvb2x0aXAnKVwiXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiXG4gICAgICAgICAgICAgICAgYWN0aW9uLnRvb2x0aXBQb3NpdGlvbiA/IGFjdGlvbi50b29sdGlwUG9zaXRpb24gOiAnYm90dG9tJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FsbERpc2FibGVkKGFjdGlvbiwgcm93RGF0YSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgbWQtMTlcIj5cbiAgICAgICAgICAgICAgICB7eyByZXRvcm5hckNhbXBvKGFjdGlvbiwgcm93RGF0YSwgXCJpY29uXCIpIH19PC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cblxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHt7XG4gICAgICAgICAgICAgICAgY2FsbERpc2FibGVkKGFjdGlvbiwgcm93RGF0YSlcbiAgICAgICAgICAgICAgICAgID8gJ3RleHQtZ3JheS00MDAgY3Vyc29yLWF1dG8nXG4gICAgICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcidcbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMjBweFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpc0J1dHRvbkRpc2FibGUoYWN0aW9uLCByb3dEYXRhLCBjb21tYW5kRXZlbnQpXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJldG9ybmFyQ2FtcG8oYWN0aW9uLCByb3dEYXRhLCAndG9vbHRpcCcpXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJcbiAgICAgICAgICAgICAgICBhY3Rpb24udG9vbHRpcFBvc2l0aW9uID8gYWN0aW9uLnRvb2x0aXBQb3NpdGlvbiA6ICdib3R0b20nXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHJldG9ybmFyQ2FtcG8oYWN0aW9uLCByb3dEYXRhLCBcImljb25cIikgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGxcIlxuICAgICAgICAgICpuZ0lmPVwiIWFjb2VzTGluaGFUYWJlbGFcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSA8YnV0dG9uXG4gICAgICAgICAgICBpZD1cIm1vcmVWZXJ0QnRuXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uQnRucyBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXJhaXNlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KTsgYWN0aXZlSXRlbShyb3dEYXRhKVwiXG4gICAgICAgICAgPiAtLT5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyIGljb24tbW9yZS1ob3JpelwiXG4gICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMjBweFwiXG4gICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KTsgYWN0aXZlSXRlbShyb3dEYXRhKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgbW9yZV9ob3JpelxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8IS0tIDwvYnV0dG9uPiAtLT5cblxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc1wiPlxuICAgICAgICAgICAge3sgY3JpYXJNZW51c01vZGFsKHJvd0RhdGEpIH19XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBjb25maWcuYWN0aW9uc1wiPlxuICAgICAgICAgICAge3sgY3JpYXJNZW51c01vZGFsKHJvd0RhdGEpIH19XG4gICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgPHAtbWVudVxuICAgICAgICAgICAgI21lbnVcbiAgICAgICAgICAgIFtwb3B1cF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFttb2RlbF09XCJtZW51SXRlbXNcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICA+PC9wLW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cblxuICAgICAgPHRkXG4gICAgICBjbGFzcz1cInRkLXRvb2xzXCJcbiAgICAgICpuZ0lmPVwiY29uZmlnLmFjdGlvbnMgJiYgY29uZmlnLmFjdGlvbnMubGVuZ3RoID4gMCAmJiBlZGl0aW5nXCJcbiAgICAgIFtzdHlsZV09XCJhcHBseVN0eWxlKHJvd0RhdGEsIHsgZmllbGQ6ICdidG5zLW9wdGlvbnMnLCBoZWFkZXI6ICcnIH0pXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbCBnYXAtMVwiXG4gICAgICAgICpuZ0lmPVwiYWNvZXNMaW5oYVRhYmVsYVwiXG4gICAgICA+XG5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWVuZCB3LWZ1bGxcIlxuICAgICAgICAqbmdJZj1cIiFhY29lc0xpbmhhVGFiZWxhXCJcbiAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cblxuXG5cbiAgICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbiAgICAgIDwhLS0gQ29udHJvbGUgZGUgZWRpw6fDo28gLS0+XG4gICAgICAgIDx0ZCBjbGFzcz1cInRkLWVkaXRcIiAqbmdJZj1cInRoaXMuaXNFZGl0YWJsZVRhYmxlKClcIiA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gW3N0eWxlLmhlaWdodF09XCInMjhweCdcIiBbaWRdPVwiJ3Jvd0VkaXQnICsgcm93RGF0YVtjb25maWcuZGF0YUtleV0gXCIgW3N0eWxlLndpZHRoXT1cIicyOHB4J1wiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVFZGl0Um93RnVuY3Rpb24ocm93RGF0YSlcIiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dFZGl0SW5pdChyb3dEYXRhKVwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIFtzdHlsZS5oZWlnaHRdPVwiJzI4cHgnXCIgW3N0eWxlLndpZHRoXT1cIicyOHB4J1wiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVFZGl0Um93RnVuY3Rpb24ocm93RGF0YSlcIiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RWRpdFNhdmUocm93RGF0YSwgcmkpXCIgW2lkXT1cIidyb3dTYXZlJyArIHJvd0RhdGFbY29uZmlnLmRhdGFLZXldIFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXN1Y2Nlc3MgbXItMlwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBbc3R5bGUuaGVpZ2h0XT1cIicyOHB4J1wiIFtzdHlsZS53aWR0aF09XCInMjhweCdcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlRWRpdFJvd0Z1bmN0aW9uKHJvd0RhdGEpXCIgKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RWRpdENhbmNlbChyb3dEYXRhLCByaSlcIiBbaWRdPVwiJ3Jvd0NhbmNlbCcgKyByb3dEYXRhW2NvbmZpZy5kYXRhS2V5XSBcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXJcIj48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cblxuXG5cblxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==