shared-ui-test-1 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/constants/breadcrumbs.const.d.ts +1 -0
  2. package/constants/query-design-custom-class.constant.d.ts +1 -0
  3. package/core/directive/authorize.directive.d.ts +14 -0
  4. package/core/interfaces/filters.api.interface.d.ts +32 -0
  5. package/core/models/menu-elements-dto.d.ts +21 -0
  6. package/core/services/local-storage.service.d.ts +34 -0
  7. package/core/services/user-management.service.d.ts +39 -0
  8. package/core/site/services/support-util.service.d.ts +18 -0
  9. package/core/token/client-injection-token.d.ts +2 -0
  10. package/core/utils/sql-to-filter-datatype-converter.d.ts +2 -0
  11. package/core/utils/type-checks.utils.d.ts +10 -0
  12. package/core/utils/uuid-generator.utils.d.ts +1 -0
  13. package/directives/let.directive.d.ts +25 -0
  14. package/directives/remove-cancel-button.directive.d.ts +10 -0
  15. package/enums/action-types.enum.d.ts +16 -0
  16. package/enums/sort-direction.enum.d.ts +4 -0
  17. package/enums/source-types.enum.d.ts +4 -0
  18. package/enums/tooltips-prop.enum.d.ts +31 -0
  19. package/esm2022/constants/breadcrumbs.const.mjs +2 -0
  20. package/esm2022/constants/query-design-custom-class.constant.mjs +2 -0
  21. package/esm2022/core/directive/authorize.directive.mjs +37 -0
  22. package/esm2022/core/interfaces/filters.api.interface.mjs +12 -0
  23. package/esm2022/core/models/menu-elements-dto.mjs +2 -0
  24. package/esm2022/core/services/local-storage.service.mjs +55 -0
  25. package/esm2022/core/services/user-management.service.mjs +97 -0
  26. package/esm2022/core/site/services/support-util.service.mjs +55 -0
  27. package/esm2022/core/token/client-injection-token.mjs +3 -0
  28. package/esm2022/core/utils/sql-to-filter-datatype-converter.mjs +37 -0
  29. package/esm2022/core/utils/type-checks.utils.mjs +34 -0
  30. package/esm2022/core/utils/uuid-generator.utils.mjs +8 -0
  31. package/esm2022/directives/let.directive.mjs +48 -0
  32. package/esm2022/directives/remove-cancel-button.directive.mjs +23 -0
  33. package/esm2022/enums/action-types.enum.mjs +18 -0
  34. package/esm2022/enums/sort-direction.enum.mjs +6 -0
  35. package/esm2022/enums/source-types.enum.mjs +6 -0
  36. package/esm2022/enums/tooltips-prop.enum.mjs +33 -0
  37. package/esm2022/modules/dynamic-cards/directives/flip-card.directive.mjs +44 -0
  38. package/esm2022/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.mjs +20 -0
  39. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.mjs +19 -0
  40. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.mjs +16 -0
  41. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.mjs +21 -0
  42. package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.mjs +18 -0
  43. package/esm2022/modules/dynamic-cards/dynamic-cards.module.mjs +60 -0
  44. package/esm2022/modules/dynamic-cards/interface/card-list.interface.mjs +2 -0
  45. package/esm2022/modules/dynamic-cards/interface/card.interface.mjs +2 -0
  46. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.mjs +27 -0
  47. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.mjs +19 -0
  48. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.mjs +14 -0
  49. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.mjs +43 -0
  50. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.mjs +48 -0
  51. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.mjs +96 -0
  52. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.mjs +9 -0
  53. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.mjs +22 -0
  54. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.mjs +27 -0
  55. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.mjs +31 -0
  56. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.mjs +6 -0
  57. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.mjs +29 -0
  58. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.mjs +18 -0
  59. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.mjs +22 -0
  60. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.mjs +74 -0
  61. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.mjs +30 -0
  62. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.mjs +47 -0
  63. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.mjs +7 -0
  64. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.mjs +2 -0
  65. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.mjs +64 -0
  66. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.mjs +26 -0
  67. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.mjs +26 -0
  68. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.mjs +65 -0
  69. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.mjs +33 -0
  70. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.mjs +9 -0
  71. package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.mjs +25 -0
  72. package/esm2022/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.mjs +117 -0
  73. package/esm2022/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.mjs +47 -0
  74. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.mjs +16 -0
  75. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.mjs +82 -0
  76. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.mjs +189 -0
  77. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.mjs +112 -0
  78. package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.mjs +34 -0
  79. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.mjs +34 -0
  80. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.mjs +27 -0
  81. package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.mjs +10 -0
  82. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.mjs +24 -0
  83. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.mjs +26 -0
  84. package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.mjs +29 -0
  85. package/esm2022/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.mjs +49 -0
  86. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.mjs +6 -0
  87. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.mjs +22 -0
  88. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.mjs +8 -0
  89. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.mjs +7 -0
  90. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.mjs +20 -0
  91. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.mjs +10 -0
  92. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.mjs +6 -0
  93. package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.mjs +6 -0
  94. package/esm2022/modules/dynamic-forms/dynamic-forms-core/index.mjs +39 -0
  95. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.mjs +2 -0
  96. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.mjs +2 -0
  97. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.mjs +2 -0
  98. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.mjs +2 -0
  99. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.mjs +2 -0
  100. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.mjs +2 -0
  101. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.mjs +2 -0
  102. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.mjs +2 -0
  103. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.mjs +2 -0
  104. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.mjs +2 -0
  105. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.mjs +2 -0
  106. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.mjs +2 -0
  107. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.mjs +2 -0
  108. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.mjs +2 -0
  109. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.mjs +2 -0
  110. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.mjs +2 -0
  111. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.mjs +2 -0
  112. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.mjs +2 -0
  113. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.mjs +2 -0
  114. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.mjs +2 -0
  115. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.mjs +2 -0
  116. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.mjs +2 -0
  117. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.mjs +2 -0
  118. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.mjs +2 -0
  119. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.mjs +2 -0
  120. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.mjs +2 -0
  121. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.mjs +2 -0
  122. package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.mjs +2 -0
  123. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.mjs +51 -0
  124. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.mjs +15 -0
  125. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.mjs +19 -0
  126. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.mjs +19 -0
  127. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.mjs +23 -0
  128. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.mjs +11 -0
  129. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.mjs +37 -0
  130. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.mjs +20 -0
  131. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.mjs +15 -0
  132. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.mjs +15 -0
  133. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.mjs +52 -0
  134. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.mjs +7 -0
  135. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.mjs +13 -0
  136. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.mjs +12 -0
  137. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.mjs +11 -0
  138. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.mjs +18 -0
  139. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.mjs +13 -0
  140. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.mjs +13 -0
  141. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.mjs +18 -0
  142. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.mjs +11 -0
  143. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.mjs +14 -0
  144. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.mjs +25 -0
  145. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.mjs +7 -0
  146. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.mjs +8 -0
  147. package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.mjs +19 -0
  148. package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.mjs +38 -0
  149. package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.mjs +20 -0
  150. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.mjs +37 -0
  151. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.mjs +35 -0
  152. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.mjs +35 -0
  153. package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.mjs +239 -0
  154. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.mjs +3 -0
  155. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.mjs +3 -0
  156. package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.mjs +3 -0
  157. package/esm2022/modules/dynamic-forms/dynamic-forms.module.mjs +32 -0
  158. package/esm2022/modules/material/mat-cdk-module.mjs +17 -0
  159. package/esm2022/modules/material/material.module.mjs +201 -0
  160. package/esm2022/modules/query-builder/components/query-design/query-design.component.mjs +103 -0
  161. package/esm2022/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.mjs +150 -0
  162. package/esm2022/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.mjs +102 -0
  163. package/esm2022/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.mjs +76 -0
  164. package/esm2022/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.mjs +168 -0
  165. package/esm2022/modules/query-builder/components/query-design/rule-line/constants/operators-sets.mjs +108 -0
  166. package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.mjs +8 -0
  167. package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.mjs +78 -0
  168. package/esm2022/modules/query-builder/components/query-design/rule-line/rule-line.component.mjs +234 -0
  169. package/esm2022/modules/query-builder/directive/auto-complete-position.directive.mjs +30 -0
  170. package/esm2022/modules/query-builder/interfaces/query-builder.interface.mjs +39 -0
  171. package/esm2022/modules/query-builder/interfaces/select-custom-css-object.mjs +2 -0
  172. package/esm2022/modules/query-builder/query-builder.module.mjs +66 -0
  173. package/esm2022/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.mjs +16 -0
  174. package/esm2022/modules/ui-kit/components/accordion/accordion-trigger.directive.mjs +30 -0
  175. package/esm2022/modules/ui-kit/components/accordion/accordion.directive.mjs +19 -0
  176. package/esm2022/modules/ui-kit/components/banner/banner.component.mjs +53 -0
  177. package/esm2022/modules/ui-kit/components/banner/banner.service.mjs +64 -0
  178. package/esm2022/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.mjs +25 -0
  179. package/esm2022/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.mjs +2 -0
  180. package/esm2022/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.mjs +63 -0
  181. package/esm2022/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.mjs +8 -0
  182. package/esm2022/modules/ui-kit/components/buttons/button-control/button-control.component.mjs +46 -0
  183. package/esm2022/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.mjs +11 -0
  184. package/esm2022/modules/ui-kit/components/buttons/circle-button/circle-button.component.mjs +37 -0
  185. package/esm2022/modules/ui-kit/components/card-container/card-container.component.mjs +11 -0
  186. package/esm2022/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.mjs +30 -0
  187. package/esm2022/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.mjs +2 -0
  188. package/esm2022/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.mjs +65 -0
  189. package/esm2022/modules/ui-kit/components/data-pagination/data-pagination.component.mjs +155 -0
  190. package/esm2022/modules/ui-kit/components/data-table/api-classes/filter-manager.mjs +50 -0
  191. package/esm2022/modules/ui-kit/components/data-table/api-classes/grid-api.mjs +73 -0
  192. package/esm2022/modules/ui-kit/components/data-table/constants/change-type.enum.mjs +8 -0
  193. package/esm2022/modules/ui-kit/components/data-table/constants/column-id.mjs +13 -0
  194. package/esm2022/modules/ui-kit/components/data-table/constants/row.mjs +4 -0
  195. package/esm2022/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.mjs +93 -0
  196. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.mjs +17 -0
  197. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.mjs +27 -0
  198. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.mjs +20 -0
  199. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.mjs +18 -0
  200. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.mjs +31 -0
  201. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.mjs +96 -0
  202. package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.mjs +75 -0
  203. package/esm2022/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.mjs +248 -0
  204. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.mjs +323 -0
  205. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.mjs +68 -0
  206. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.mjs +25 -0
  207. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.mjs +64 -0
  208. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.mjs +42 -0
  209. package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.mjs +42 -0
  210. package/esm2022/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.mjs +69 -0
  211. package/esm2022/modules/ui-kit/components/data-table/data-row/data-row.component.mjs +251 -0
  212. package/esm2022/modules/ui-kit/components/data-table/data-table/data-table.component.mjs +1534 -0
  213. package/esm2022/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.mjs +153 -0
  214. package/esm2022/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.mjs +205 -0
  215. package/esm2022/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.mjs +61 -0
  216. package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.mjs +8 -0
  217. package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.mjs +120 -0
  218. package/esm2022/modules/ui-kit/components/data-table/enums/col-filter-types.mjs +17 -0
  219. package/esm2022/modules/ui-kit/components/data-table/header-row/header-row.component.mjs +14 -0
  220. package/esm2022/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.mjs +2 -0
  221. package/esm2022/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.mjs +2 -0
  222. package/esm2022/modules/ui-kit/components/data-table/services/data-table-context.service.mjs +26 -0
  223. package/esm2022/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.mjs +38 -0
  224. package/esm2022/modules/ui-kit/components/excel-table/excel-table.component.mjs +164 -0
  225. package/esm2022/modules/ui-kit/components/excel-table/interface/excel-table.interface.mjs +44 -0
  226. package/esm2022/modules/ui-kit/components/form/base-form-control/base-form-control.component.mjs +41 -0
  227. package/esm2022/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.mjs +21 -0
  228. package/esm2022/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.mjs +66 -0
  229. package/esm2022/modules/ui-kit/components/form/form-container/form-container.component.mjs +133 -0
  230. package/esm2022/modules/ui-kit/components/form/form-group-container/form-group-container.component.mjs +11 -0
  231. package/esm2022/modules/ui-kit/components/form/input-form-control/input-form-control.component.mjs +20 -0
  232. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.mjs +35 -0
  233. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.mjs +2 -0
  234. package/esm2022/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.mjs +66 -0
  235. package/esm2022/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.mjs +19 -0
  236. package/esm2022/modules/ui-kit/components/form/select-form-control/select-form-control.component.mjs +78 -0
  237. package/esm2022/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.mjs +18 -0
  238. package/esm2022/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.mjs +20 -0
  239. package/esm2022/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.mjs +26 -0
  240. package/esm2022/modules/ui-kit/components/icon/icon/icon.component.mjs +35 -0
  241. package/esm2022/modules/ui-kit/components/icon/text-icon/text-icon.component.mjs +22 -0
  242. package/esm2022/modules/ui-kit/components/layouts/form-layout/form-layout.component.mjs +56 -0
  243. package/esm2022/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.mjs +11 -0
  244. package/esm2022/modules/ui-kit/components/loader/loader.component.mjs +27 -0
  245. package/esm2022/modules/ui-kit/components/mat-actions-button/mat-actions-button.mjs +34 -0
  246. package/esm2022/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.mjs +53 -0
  247. package/esm2022/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.mjs +37 -0
  248. package/esm2022/modules/ui-kit/components/modals/delete-modal/delete-modal.component.mjs +41 -0
  249. package/esm2022/modules/ui-kit/components/modals/enums/confirmation-modal.enum.mjs +13 -0
  250. package/esm2022/modules/ui-kit/components/snackbar/snackbar.component.mjs +21 -0
  251. package/esm2022/modules/ui-kit/components/tabs/constants/index.mjs +2 -0
  252. package/esm2022/modules/ui-kit/components/tabs/interfaces/index.mjs +2 -0
  253. package/esm2022/modules/ui-kit/components/tabs/tab-group/tab-group.component.mjs +77 -0
  254. package/esm2022/modules/ui-kit/components/tabs/tab.directive.mjs +60 -0
  255. package/esm2022/modules/ui-kit/components/tree-view/tree-view.component.mjs +374 -0
  256. package/esm2022/modules/ui-kit/constants/data-table.constants.mjs +7 -0
  257. package/esm2022/modules/ui-kit/constants/snackbar.constants.mjs +4 -0
  258. package/esm2022/modules/ui-kit/enums/coderefs-prop.enum.mjs +26 -0
  259. package/esm2022/modules/ui-kit/enums/color-schemes.enum.mjs +13 -0
  260. package/esm2022/modules/ui-kit/enums/column-disable-mode.enum.mjs +7 -0
  261. package/esm2022/modules/ui-kit/enums/column-types.enum.mjs +10 -0
  262. package/esm2022/modules/ui-kit/enums/component-sizes.enum.mjs +6 -0
  263. package/esm2022/modules/ui-kit/enums/form-item-type.mjs +7 -0
  264. package/esm2022/modules/ui-kit/enums/form-types.enum.mjs +7 -0
  265. package/esm2022/modules/ui-kit/enums/form-url-params.enum.mjs +6 -0
  266. package/esm2022/modules/ui-kit/enums/icons.enum.mjs +24 -0
  267. package/esm2022/modules/ui-kit/enums/position.enum.mjs +6 -0
  268. package/esm2022/modules/ui-kit/enums/select-option.enum.mjs +10 -0
  269. package/esm2022/modules/ui-kit/enums/snackbar.enum.mjs +8 -0
  270. package/esm2022/modules/ui-kit/enums/url-param-action.enum.mjs +6 -0
  271. package/esm2022/modules/ui-kit/enums/viewType.enum.mjs +7 -0
  272. package/esm2022/modules/ui-kit/interfaces/api.interface.mjs +2 -0
  273. package/esm2022/modules/ui-kit/interfaces/confirm-modal-data.interface.mjs +2 -0
  274. package/esm2022/modules/ui-kit/interfaces/constants.interface.mjs +2 -0
  275. package/esm2022/modules/ui-kit/interfaces/data-table.interface.mjs +2 -0
  276. package/esm2022/modules/ui-kit/interfaces/form.interface.mjs +2 -0
  277. package/esm2022/modules/ui-kit/interfaces/generic.interface.mjs +2 -0
  278. package/esm2022/modules/ui-kit/interfaces/list-item.interface.mjs +2 -0
  279. package/esm2022/modules/ui-kit/interfaces/mat-action-buttons.interface.mjs +2 -0
  280. package/esm2022/modules/ui-kit/interfaces/row-selection-info.interface.mjs +2 -0
  281. package/esm2022/modules/ui-kit/interfaces/select.interface.mjs +2 -0
  282. package/esm2022/modules/ui-kit/interfaces/snackbar.interface.mjs +2 -0
  283. package/esm2022/modules/ui-kit/interfaces/tree-view.interface.mjs +2 -0
  284. package/esm2022/modules/ui-kit/pipes/column-filter.pipe.mjs +21 -0
  285. package/esm2022/modules/ui-kit/pipes/filter-by-prop.pipe.mjs +27 -0
  286. package/esm2022/modules/ui-kit/pipes/first-letter-text.pipe.mjs +17 -0
  287. package/esm2022/modules/ui-kit/pipes/keys.pipe.mjs +17 -0
  288. package/esm2022/modules/ui-kit/pipes/paginate.pipe.mjs +29 -0
  289. package/esm2022/modules/ui-kit/pipes/search.pipe.mjs +50 -0
  290. package/esm2022/modules/ui-kit/services/data-table.service.mjs +202 -0
  291. package/esm2022/modules/ui-kit/services/form.service.mjs +91 -0
  292. package/esm2022/modules/ui-kit/services/mappers/form-data-table-mapper.service.mjs +19 -0
  293. package/esm2022/modules/ui-kit/services/snackbar.service.mjs +43 -0
  294. package/esm2022/modules/ui-kit/services/url.service.mjs +17 -0
  295. package/esm2022/modules/ui-kit/types/basic.type.mjs +2 -0
  296. package/esm2022/modules/ui-kit/types/function.type.mjs +2 -0
  297. package/esm2022/modules/ui-kit/types/select.type.mjs +2 -0
  298. package/esm2022/modules/ui-kit/ui-kit.module.mjs +370 -0
  299. package/esm2022/public-api.mjs +85 -0
  300. package/esm2022/shared-pipes/pipes/search.pipe.mjs +48 -0
  301. package/esm2022/shared-ui-test-1.mjs +5 -0
  302. package/esm2022/shared.module.mjs +57 -0
  303. package/fesm2022/shared-ui-test-1.mjs +10516 -0
  304. package/fesm2022/shared-ui-test-1.mjs.map +1 -0
  305. package/index.d.ts +5 -0
  306. package/modules/dynamic-cards/directives/flip-card.directive.d.ts +15 -0
  307. package/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.d.ts +10 -0
  308. package/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.d.ts +7 -0
  309. package/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.d.ts +7 -0
  310. package/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.d.ts +10 -0
  311. package/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.d.ts +8 -0
  312. package/modules/dynamic-cards/dynamic-cards.module.d.ts +18 -0
  313. package/modules/dynamic-cards/interface/card-list.interface.d.ts +9 -0
  314. package/modules/dynamic-cards/interface/card.interface.d.ts +12 -0
  315. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.d.ts +11 -0
  316. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.d.ts +9 -0
  317. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.d.ts +7 -0
  318. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.d.ts +13 -0
  319. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.d.ts +13 -0
  320. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.d.ts +34 -0
  321. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.d.ts +8 -0
  322. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.d.ts +8 -0
  323. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.d.ts +11 -0
  324. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.d.ts +12 -0
  325. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.d.ts +4 -0
  326. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.d.ts +10 -0
  327. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.d.ts +9 -0
  328. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.d.ts +9 -0
  329. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.d.ts +26 -0
  330. package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.d.ts +14 -0
  331. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.d.ts +19 -0
  332. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.d.ts +5 -0
  333. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.d.ts +5 -0
  334. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.d.ts +26 -0
  335. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.d.ts +9 -0
  336. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.d.ts +11 -0
  337. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.d.ts +23 -0
  338. package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.d.ts +21 -0
  339. package/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.d.ts +7 -0
  340. package/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.d.ts +11 -0
  341. package/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.d.ts +32 -0
  342. package/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.d.ts +6 -0
  343. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.d.ts +10 -0
  344. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.d.ts +26 -0
  345. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.d.ts +57 -0
  346. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.d.ts +42 -0
  347. package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.d.ts +28 -0
  348. package/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.d.ts +6 -0
  349. package/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.d.ts +6 -0
  350. package/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.d.ts +9 -0
  351. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.d.ts +11 -0
  352. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.d.ts +11 -0
  353. package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.d.ts +13 -0
  354. package/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.d.ts +12 -0
  355. package/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.d.ts +4 -0
  356. package/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.d.ts +20 -0
  357. package/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.d.ts +6 -0
  358. package/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.d.ts +5 -0
  359. package/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.d.ts +18 -0
  360. package/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.d.ts +8 -0
  361. package/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.d.ts +4 -0
  362. package/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.d.ts +4 -0
  363. package/modules/dynamic-forms/dynamic-forms-core/index.d.ts +38 -0
  364. package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.d.ts +15 -0
  365. package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.d.ts +19 -0
  366. package/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.d.ts +4 -0
  367. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.d.ts +3 -0
  368. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.d.ts +6 -0
  369. package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.d.ts +2 -0
  370. package/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.d.ts +8 -0
  371. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.d.ts +7 -0
  372. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.d.ts +4 -0
  373. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.d.ts +4 -0
  374. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.d.ts +16 -0
  375. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.d.ts +8 -0
  376. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.d.ts +8 -0
  377. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.d.ts +6 -0
  378. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.d.ts +14 -0
  379. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.d.ts +7 -0
  380. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.d.ts +5 -0
  381. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.d.ts +6 -0
  382. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.d.ts +6 -0
  383. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.d.ts +5 -0
  384. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.d.ts +11 -0
  385. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.d.ts +9 -0
  386. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.d.ts +4 -0
  387. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.d.ts +8 -0
  388. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.d.ts +5 -0
  389. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.d.ts +6 -0
  390. package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.d.ts +10 -0
  391. package/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.d.ts +5 -0
  392. package/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.d.ts +19 -0
  393. package/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.d.ts +12 -0
  394. package/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.d.ts +9 -0
  395. package/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.d.ts +9 -0
  396. package/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.d.ts +24 -0
  397. package/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.d.ts +9 -0
  398. package/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.d.ts +17 -0
  399. package/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.d.ts +16 -0
  400. package/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.d.ts +12 -0
  401. package/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.d.ts +9 -0
  402. package/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.d.ts +19 -0
  403. package/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.d.ts +7 -0
  404. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.d.ts +10 -0
  405. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.d.ts +8 -0
  406. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.d.ts +7 -0
  407. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.d.ts +15 -0
  408. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.d.ts +10 -0
  409. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.d.ts +8 -0
  410. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.d.ts +11 -0
  411. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.d.ts +8 -0
  412. package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.d.ts +9 -0
  413. package/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.d.ts +17 -0
  414. package/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.d.ts +5 -0
  415. package/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.d.ts +9 -0
  416. package/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.d.ts +12 -0
  417. package/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.d.ts +20 -0
  418. package/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.d.ts +8 -0
  419. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.d.ts +14 -0
  420. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.d.ts +14 -0
  421. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.d.ts +11 -0
  422. package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.d.ts +30 -0
  423. package/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.d.ts +3 -0
  424. package/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.d.ts +3 -0
  425. package/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.d.ts +3 -0
  426. package/modules/dynamic-forms/dynamic-forms.module.d.ts +9 -0
  427. package/modules/material/mat-cdk-module.d.ts +7 -0
  428. package/modules/material/material.module.d.ts +50 -0
  429. package/modules/query-builder/components/query-design/query-design.component.d.ts +35 -0
  430. package/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.d.ts +46 -0
  431. package/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.d.ts +29 -0
  432. package/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.d.ts +21 -0
  433. package/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.d.ts +46 -0
  434. package/modules/query-builder/components/query-design/rule-line/constants/operators-sets.d.ts +12 -0
  435. package/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.d.ts +6 -0
  436. package/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.d.ts +7 -0
  437. package/modules/query-builder/components/query-design/rule-line/rule-line.component.d.ts +64 -0
  438. package/modules/query-builder/directive/auto-complete-position.directive.d.ts +11 -0
  439. package/modules/query-builder/interfaces/query-builder.interface.d.ts +61 -0
  440. package/modules/query-builder/interfaces/select-custom-css-object.d.ts +7 -0
  441. package/modules/query-builder/query-builder.module.d.ts +18 -0
  442. package/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.d.ts +8 -0
  443. package/modules/ui-kit/components/accordion/accordion-trigger.directive.d.ts +10 -0
  444. package/modules/ui-kit/components/accordion/accordion.directive.d.ts +7 -0
  445. package/modules/ui-kit/components/banner/banner.component.d.ts +14 -0
  446. package/modules/ui-kit/components/banner/banner.service.d.ts +27 -0
  447. package/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.d.ts +15 -0
  448. package/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.d.ts +4 -0
  449. package/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.d.ts +19 -0
  450. package/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.d.ts +6 -0
  451. package/modules/ui-kit/components/buttons/button-control/button-control.component.d.ts +16 -0
  452. package/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.d.ts +5 -0
  453. package/modules/ui-kit/components/buttons/circle-button/circle-button.component.d.ts +20 -0
  454. package/modules/ui-kit/components/card-container/card-container.component.d.ts +5 -0
  455. package/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.d.ts +20 -0
  456. package/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.d.ts +6 -0
  457. package/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.d.ts +21 -0
  458. package/modules/ui-kit/components/data-pagination/data-pagination.component.d.ts +54 -0
  459. package/modules/ui-kit/components/data-table/api-classes/filter-manager.d.ts +13 -0
  460. package/modules/ui-kit/components/data-table/api-classes/grid-api.d.ts +31 -0
  461. package/modules/ui-kit/components/data-table/constants/change-type.enum.d.ts +6 -0
  462. package/modules/ui-kit/components/data-table/constants/column-id.d.ts +2 -0
  463. package/modules/ui-kit/components/data-table/constants/row.d.ts +2 -0
  464. package/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.d.ts +28 -0
  465. package/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.d.ts +7 -0
  466. package/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.d.ts +12 -0
  467. package/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.d.ts +8 -0
  468. package/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.d.ts +8 -0
  469. package/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.d.ts +13 -0
  470. package/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.d.ts +29 -0
  471. package/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.d.ts +27 -0
  472. package/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.d.ts +60 -0
  473. package/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.d.ts +85 -0
  474. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.d.ts +12 -0
  475. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.d.ts +9 -0
  476. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.d.ts +13 -0
  477. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.d.ts +10 -0
  478. package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.d.ts +11 -0
  479. package/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.d.ts +29 -0
  480. package/modules/ui-kit/components/data-table/data-row/data-row.component.d.ts +81 -0
  481. package/modules/ui-kit/components/data-table/data-table/data-table.component.d.ts +302 -0
  482. package/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.d.ts +53 -0
  483. package/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.d.ts +75 -0
  484. package/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.d.ts +25 -0
  485. package/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.d.ts +6 -0
  486. package/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.d.ts +42 -0
  487. package/modules/ui-kit/components/data-table/enums/col-filter-types.d.ts +14 -0
  488. package/modules/ui-kit/components/data-table/header-row/header-row.component.d.ts +7 -0
  489. package/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.d.ts +28 -0
  490. package/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.d.ts +12 -0
  491. package/modules/ui-kit/components/data-table/services/data-table-context.service.d.ts +12 -0
  492. package/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.d.ts +13 -0
  493. package/modules/ui-kit/components/excel-table/excel-table.component.d.ts +28 -0
  494. package/modules/ui-kit/components/excel-table/interface/excel-table.interface.d.ts +29 -0
  495. package/modules/ui-kit/components/form/base-form-control/base-form-control.component.d.ts +17 -0
  496. package/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.d.ts +8 -0
  497. package/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.d.ts +21 -0
  498. package/modules/ui-kit/components/form/form-container/form-container.component.d.ts +45 -0
  499. package/modules/ui-kit/components/form/form-group-container/form-group-container.component.d.ts +5 -0
  500. package/modules/ui-kit/components/form/input-form-control/input-form-control.component.d.ts +8 -0
  501. package/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.d.ts +15 -0
  502. package/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.d.ts +4 -0
  503. package/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.d.ts +26 -0
  504. package/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.d.ts +8 -0
  505. package/modules/ui-kit/components/form/select-form-control/select-form-control.component.d.ts +32 -0
  506. package/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.d.ts +7 -0
  507. package/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.d.ts +8 -0
  508. package/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.d.ts +11 -0
  509. package/modules/ui-kit/components/icon/icon/icon.component.d.ts +14 -0
  510. package/modules/ui-kit/components/icon/text-icon/text-icon.component.d.ts +10 -0
  511. package/modules/ui-kit/components/layouts/form-layout/form-layout.component.d.ts +29 -0
  512. package/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.d.ts +5 -0
  513. package/modules/ui-kit/components/loader/loader.component.d.ts +12 -0
  514. package/modules/ui-kit/components/mat-actions-button/mat-actions-button.d.ts +14 -0
  515. package/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.d.ts +17 -0
  516. package/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.d.ts +13 -0
  517. package/modules/ui-kit/components/modals/delete-modal/delete-modal.component.d.ts +17 -0
  518. package/modules/ui-kit/components/modals/enums/confirmation-modal.enum.d.ts +11 -0
  519. package/modules/ui-kit/components/snackbar/snackbar.component.d.ts +10 -0
  520. package/modules/ui-kit/components/tabs/constants/index.d.ts +1 -0
  521. package/modules/ui-kit/components/tabs/interfaces/index.d.ts +3 -0
  522. package/modules/ui-kit/components/tabs/tab-group/tab-group.component.d.ts +25 -0
  523. package/modules/ui-kit/components/tabs/tab.directive.d.ts +16 -0
  524. package/modules/ui-kit/components/tree-view/tree-view.component.d.ts +67 -0
  525. package/modules/ui-kit/constants/data-table.constants.d.ts +6 -0
  526. package/modules/ui-kit/constants/snackbar.constants.d.ts +3 -0
  527. package/modules/ui-kit/enums/coderefs-prop.enum.d.ts +24 -0
  528. package/modules/ui-kit/enums/color-schemes.enum.d.ts +11 -0
  529. package/modules/ui-kit/enums/column-disable-mode.enum.d.ts +5 -0
  530. package/modules/ui-kit/enums/column-types.enum.d.ts +8 -0
  531. package/modules/ui-kit/enums/component-sizes.enum.d.ts +4 -0
  532. package/modules/ui-kit/enums/form-item-type.d.ts +5 -0
  533. package/modules/ui-kit/enums/form-types.enum.d.ts +5 -0
  534. package/modules/ui-kit/enums/form-url-params.enum.d.ts +4 -0
  535. package/modules/ui-kit/enums/icons.enum.d.ts +22 -0
  536. package/modules/ui-kit/enums/position.enum.d.ts +4 -0
  537. package/modules/ui-kit/enums/select-option.enum.d.ts +8 -0
  538. package/modules/ui-kit/enums/snackbar.enum.d.ts +6 -0
  539. package/modules/ui-kit/enums/url-param-action.enum.d.ts +4 -0
  540. package/modules/ui-kit/enums/viewType.enum.d.ts +5 -0
  541. package/modules/ui-kit/interfaces/api.interface.d.ts +45 -0
  542. package/modules/ui-kit/interfaces/confirm-modal-data.interface.d.ts +7 -0
  543. package/modules/ui-kit/interfaces/constants.interface.d.ts +4 -0
  544. package/modules/ui-kit/interfaces/data-table.interface.d.ts +253 -0
  545. package/modules/ui-kit/interfaces/form.interface.d.ts +21 -0
  546. package/modules/ui-kit/interfaces/generic.interface.d.ts +7 -0
  547. package/modules/ui-kit/interfaces/list-item.interface.d.ts +5 -0
  548. package/modules/ui-kit/interfaces/mat-action-buttons.interface.d.ts +14 -0
  549. package/modules/ui-kit/interfaces/row-selection-info.interface.d.ts +7 -0
  550. package/modules/ui-kit/interfaces/select.interface.d.ts +8 -0
  551. package/modules/ui-kit/interfaces/snackbar.interface.d.ts +4 -0
  552. package/modules/ui-kit/interfaces/tree-view.interface.d.ts +49 -0
  553. package/modules/ui-kit/pipes/column-filter.pipe.d.ts +12 -0
  554. package/modules/ui-kit/pipes/filter-by-prop.pipe.d.ts +9 -0
  555. package/modules/ui-kit/pipes/first-letter-text.pipe.d.ts +7 -0
  556. package/modules/ui-kit/pipes/keys.pipe.d.ts +7 -0
  557. package/modules/ui-kit/pipes/paginate.pipe.d.ts +12 -0
  558. package/modules/ui-kit/pipes/search.pipe.d.ts +16 -0
  559. package/modules/ui-kit/services/data-table.service.d.ts +37 -0
  560. package/modules/ui-kit/services/form.service.d.ts +26 -0
  561. package/modules/ui-kit/services/mappers/form-data-table-mapper.service.d.ts +8 -0
  562. package/modules/ui-kit/services/snackbar.service.d.ts +15 -0
  563. package/modules/ui-kit/services/url.service.d.ts +7 -0
  564. package/modules/ui-kit/types/basic.type.d.ts +2 -0
  565. package/modules/ui-kit/types/function.type.d.ts +20 -0
  566. package/modules/ui-kit/types/select.type.d.ts +2 -0
  567. package/modules/ui-kit/ui-kit.module.d.ts +79 -0
  568. package/package.json +45 -0
  569. package/public-api.d.ts +84 -0
  570. package/shared-pipes/pipes/search.pipe.d.ts +15 -0
  571. package/shared.module.d.ts +13 -0
@@ -0,0 +1,1534 @@
1
+ /* eslint-disable @angular-eslint/no-output-on-prefix */
2
+ /* eslint-disable sort-class-members/sort-class-members */
3
+ import { SelectionModel } from '@angular/cdk/collections';
4
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
5
+ import { FormControl } from '@angular/forms';
6
+ import { MatDialogConfig } from '@angular/material/dialog';
7
+ import { ActionTypesEnum } from 'idp-apps-shared-ui/enums/action-types.enum';
8
+ import { SortDirectionEnum } from 'idp-apps-shared-ui/enums/sort-direction.enum';
9
+ import { SourceTypesEnum } from 'idp-apps-shared-ui/enums/source-types.enum';
10
+ import { ToolTipsProp, tooltipsDefaultValue } from 'idp-apps-shared-ui/enums/tooltips-prop.enum';
11
+ import { CommonConfirmModalComponent } from 'idp-apps-shared-ui/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component';
12
+ import { clone, isFunction, isUndefined, merge } from 'lodash';
13
+ import cloneDeep from 'lodash/cloneDeep';
14
+ import { BehaviorSubject, Subject } from 'rxjs';
15
+ import { debounceTime, distinctUntilChanged, filter, first, takeUntil } from 'rxjs/operators';
16
+ import { ChangeType } from '../../../../../modules/ui-kit/components/data-table/constants/change-type.enum';
17
+ import { DataTableConstants } from '../../../constants/data-table.constants';
18
+ import { ColumnDisableModes } from '../../../enums/column-disable-mode.enum';
19
+ import { ColumnTypes } from '../../../enums/column-types.enum';
20
+ import { FormTypes } from '../../../enums/form-types.enum';
21
+ import { Icons } from '../../../enums/icons.enum';
22
+ import { SnackbarTypes } from '../../../enums/snackbar.enum';
23
+ import { DeleteModalComponent } from '../../modals/delete-modal/delete-modal.component';
24
+ import { FilterManager } from '../api-classes/filter-manager';
25
+ import { GridApi } from '../api-classes/grid-api';
26
+ import { COLUMN_ID } from '../constants/column-id';
27
+ import { ROW } from '../constants/row';
28
+ import { DataColDispComponent } from '../data-col-disp/data-col-disp.component';
29
+ import { DataTableBodyComponent } from '../data-table-body/data-table-body.component';
30
+ import { DATA_TABLE_CONTEXT } from '../services/data-table-context.service';
31
+ import * as i0 from "@angular/core";
32
+ import * as i1 from "../../../services/data-table.service";
33
+ import * as i2 from "@angular/router";
34
+ import * as i3 from "@angular/material/dialog";
35
+ import * as i4 from "../../../services/snackbar.service";
36
+ import * as i5 from "idp-apps-shared-ui/core/services/user-management.service";
37
+ import * as i6 from "idp-apps-shared-ui/modules/ui-kit/pipes/column-filter.pipe";
38
+ import * as i7 from "idp-apps-shared-ui/modules/ui-kit/pipes/search.pipe";
39
+ import * as i8 from "idp-apps-shared-ui/core/services/local-storage.service";
40
+ import * as i9 from "../../../services/form.service";
41
+ import * as i10 from "../services/data-table-context.service";
42
+ import * as i11 from "@angular/common";
43
+ import * as i12 from "@angular/material/input";
44
+ import * as i13 from "@angular/material/button";
45
+ import * as i14 from "@angular/material/card";
46
+ import * as i15 from "@angular/material/checkbox";
47
+ import * as i16 from "@angular/material/expansion";
48
+ import * as i17 from "@angular/material/progress-spinner";
49
+ import * as i18 from "@angular/forms";
50
+ import * as i19 from "@angular/flex-layout/extended";
51
+ import * as i20 from "../../data-pagination/data-pagination.component";
52
+ import * as i21 from "../../loader/loader.component";
53
+ import * as i22 from "../data-table-actions/data-table-actions.component";
54
+ import * as i23 from "../../icon/icon/icon.component";
55
+ import * as i24 from "../data-table-body/data-table-body.component";
56
+ import * as i25 from "../data-col-filter/data-col-filter.component";
57
+ import * as i26 from "../../../../../core/directive/authorize.directive";
58
+ import * as i27 from "../../../pipes/column-filter.pipe";
59
+ export class DataTableComponent {
60
+ // Inline edit settings
61
+ get canInlineEdit() {
62
+ return this.gridOptions.canInlineEdit;
63
+ }
64
+ set setDataTableBody(tableBody) {
65
+ this.dataTableBody = tableBody;
66
+ }
67
+ get columnShowhideStoragekey() {
68
+ return this.gridOptions.columnShowhideStoragekey;
69
+ }
70
+ get allowSaveColumnVisibilitySettings() {
71
+ return this.gridOptions.allowSaveColumnVisibilitySettings;
72
+ }
73
+ get addActionTitle() {
74
+ return `${this.gridOptions.actionAddTitle}`;
75
+ }
76
+ get isViewActionVisible() {
77
+ return this.gridOptions.isRowLevelViewActionVisible;
78
+ }
79
+ get searchPlaceholder() {
80
+ return this.gridOptions.searchboxPlaceholder ? this.gridOptions.searchboxPlaceholder : this.header;
81
+ }
82
+ get isTableInEditState() {
83
+ return this.isEditing || this.hasEmptyRow;
84
+ }
85
+ get apiReqParams() {
86
+ return {
87
+ page: this.currentPage,
88
+ itemsOnPage: this.pageSize,
89
+ filterParams: this.populateFilterParams(),
90
+ searchText: this.searchValue.value,
91
+ ...this.getSortParams,
92
+ };
93
+ }
94
+ get getSortParams() {
95
+ const parmas = [];
96
+ Object.keys(this.sortedColumn).forEach((x) => {
97
+ parmas.push({ sortBy: x, sortDirection: this.sortedColumn[x] });
98
+ });
99
+ return parmas.length ? parmas[0] : {};
100
+ }
101
+ constructor(dataTableService, router, activatedRoute, matDialog, changeDetectorRef, snackbarService, userManagementService, filterPipe, searchPipe, localStorageService, dialog, formService, dataTableContext) {
102
+ this.dataTableService = dataTableService;
103
+ this.router = router;
104
+ this.activatedRoute = activatedRoute;
105
+ this.matDialog = matDialog;
106
+ this.changeDetectorRef = changeDetectorRef;
107
+ this.snackbarService = snackbarService;
108
+ this.userManagementService = userManagementService;
109
+ this.filterPipe = filterPipe;
110
+ this.searchPipe = searchPipe;
111
+ this.localStorageService = localStorageService;
112
+ this.dialog = dialog;
113
+ this.formService = formService;
114
+ this.dataTableContext = dataTableContext;
115
+ this.ICONS = Icons;
116
+ this.sortDirectionEnum = SortDirectionEnum;
117
+ this.toolTips = ToolTipsProp;
118
+ this.actionTypes = ActionTypesEnum;
119
+ this.DEFAULT_PAGE_SIZE = DataTableConstants.DEFAULT_PAGE_SIZE;
120
+ this.DEFAULT_INIT_PAGE = DataTableConstants.DEFAULT_INIT_PAGE;
121
+ this.confirmationMsgPagination = `Selected checkbox will be lost `;
122
+ this.defaultRowValues = {};
123
+ this.header = '';
124
+ this.isIdColVisible = false;
125
+ this.hasPagination = true;
126
+ this.isOnlyView = false;
127
+ this.isEditable = true;
128
+ this.isCloneVisible = true;
129
+ this.isLazyInitialization = false;
130
+ this.isRowSelectionEnable = false;
131
+ this.isSaveDataLocal = false;
132
+ // Tree grid settings
133
+ this.isTreeGrid = false;
134
+ this.changeLocalData = new EventEmitter();
135
+ this.actionClick = new EventEmitter();
136
+ this.onInitCompleted = new EventEmitter();
137
+ this.onComplexDetailClicked = new EventEmitter();
138
+ this.onEditClicked = new EventEmitter();
139
+ this.onAddClicked = new EventEmitter();
140
+ this.onRowClicked = new EventEmitter();
141
+ this.onPageChanged = new EventEmitter();
142
+ this.matExpansionPanelClicked = new EventEmitter();
143
+ this.onUpdateCompleted = new EventEmitter();
144
+ this.onDeleteCompleted = new EventEmitter();
145
+ this.onScrolled = new EventEmitter();
146
+ this.CheckboxSelect = new EventEmitter();
147
+ this.isTableDataLoad = new EventEmitter();
148
+ this.searchValue = new FormControl();
149
+ this.isSearchDisabled = false;
150
+ this.sourceTypes = SourceTypesEnum;
151
+ this.masterSelection = new FormControl(false);
152
+ this.paginationParams = {
153
+ currentPage: this.DEFAULT_INIT_PAGE,
154
+ pageSize: this.DEFAULT_PAGE_SIZE,
155
+ };
156
+ this.searchedRowCount$ = new Subject();
157
+ this.isClearFilter$ = new BehaviorSubject(false);
158
+ this.isFilterView = false;
159
+ this.excludedRows = [];
160
+ this.sortedColumn = {};
161
+ this.count = 0;
162
+ this.isLoading$ = new BehaviorSubject(false);
163
+ this.hasEmptyRow = false;
164
+ this.isEditing = false;
165
+ this.isSaving = false;
166
+ this.map = new Map();
167
+ this.numberOfTableRefresh = 0;
168
+ this.clearSubs$ = new Subject();
169
+ this.totalItems = 0;
170
+ this.startX = 0;
171
+ this.startWidth = 0;
172
+ this.resizingTh = null;
173
+ this.apolloDataTable = null;
174
+ this.resizingTd = null;
175
+ this.defaultGridOptions = {
176
+ addIdColumn: true,
177
+ actionAddTitle: '',
178
+ allowSaveColumnVisibilitySettings: false,
179
+ isRowLevelViewActionVisible: true,
180
+ isOnlyView: false,
181
+ isRowSelectionEnable: false,
182
+ idProperty: COLUMN_ID.PROP,
183
+ isClientSidePagination: true,
184
+ canInlineAdd: true,
185
+ canInlineEdit: true,
186
+ isSaveDataLocal: false,
187
+ isSearchBoxVisible: true,
188
+ isFilterEnabled: false,
189
+ filterableColumns: [],
190
+ defaultSortProperty: {},
191
+ cloneOptions: {
192
+ copyOfClonableProperties: [],
193
+ emptyValueProperties: [],
194
+ },
195
+ searchableProperties: [],
196
+ sortableProperties: [],
197
+ isRowActionVisible: true,
198
+ topRightActions: [],
199
+ deleteOptions: {},
200
+ searchboxPlaceholder: this.header,
201
+ refreshOnAdd: true,
202
+ topLeftAdditionalActions: [],
203
+ isSortEnabled: false,
204
+ disableIcons: {
205
+ add: false,
206
+ edit: false,
207
+ delete: false,
208
+ clone: false,
209
+ add$: new BehaviorSubject(false),
210
+ edit$: new BehaviorSubject(false),
211
+ delete$: new BehaviorSubject(false),
212
+ copy$: new BehaviorSubject(false),
213
+ },
214
+ gridMenuOptions: {
215
+ isMenuEnabled: false,
216
+ menuItems: [],
217
+ },
218
+ actionLoading$: {
219
+ copy$: new BehaviorSubject(false),
220
+ edit$: new BehaviorSubject(false),
221
+ delete$: new BehaviorSubject(false),
222
+ },
223
+ };
224
+ this.onMouseMove = (event) => {
225
+ const width = this.startWidth + (event.pageX - this.startX);
226
+ if (this.resizingTh) {
227
+ this.setWidthToElement(width, width, this.resizingTh.offsetWidth);
228
+ }
229
+ };
230
+ this.onMouseUp = () => {
231
+ document.removeEventListener('mousemove', this.onMouseMove);
232
+ document.removeEventListener('mouseup', this.onMouseUp);
233
+ document.body.classList.remove('no-select-resize');
234
+ this.resizingTh = null;
235
+ this.resizingTd = null;
236
+ };
237
+ this.filterManager = new FilterManager();
238
+ this.gridApi = new GridApi(this, this.formService);
239
+ this.dataTableContext.setDataTableComponent(this);
240
+ }
241
+ get getSelectedRows() {
242
+ return this.getFilteredDataRow(this.selection.selected);
243
+ }
244
+ get getAllCheckedRows() {
245
+ return this.selection.selected;
246
+ }
247
+ get isActionsDisabled() {
248
+ return this.filteredRows.length === 0;
249
+ }
250
+ get getRows() {
251
+ return this.getFilteredDataRow(this.rows);
252
+ }
253
+ get getCustomTableStyle() {
254
+ if (this.gridOptions.isInnerScroll) {
255
+ return this.gridOptions.customTableStyle ? this.gridOptions.customTableStyle : { height: '30vh' };
256
+ }
257
+ return {};
258
+ }
259
+ onTableScrolled(e) {
260
+ const htmlElement = this.customDataTable.nativeElement;
261
+ const event = {
262
+ ...e,
263
+ currentElement: this.customDataTable,
264
+ currentScrollPosition: { x: htmlElement.scrollLeft, y: htmlElement.scrollTop },
265
+ };
266
+ this.onScrolled.emit(event);
267
+ }
268
+ changeScrollPosition(position) {
269
+ const htmlElement = this.customDataTable.nativeElement;
270
+ htmlElement.scroll(position.x, position.y);
271
+ }
272
+ ngOnInit() {
273
+ if (!this.isLazyInitialization) {
274
+ this.init();
275
+ }
276
+ else {
277
+ this.isLoading$.next(true);
278
+ }
279
+ if (!this.gridOptions.isClientSidePagination) {
280
+ this.searchTable();
281
+ }
282
+ }
283
+ isDisabledMainAction(actionProp) {
284
+ return this.gridOptions.disableIcons && this.gridOptions.disableIcons[actionProp];
285
+ }
286
+ nonFilterClassName(columnProp) {
287
+ if (!this.isFilterEnable(columnProp) && this.isRowSelectionEnable) {
288
+ return 'row-selection-non-filter-cell';
289
+ }
290
+ if (!this.isFilterEnable(columnProp)) {
291
+ return 'non-filter-cell';
292
+ }
293
+ return '';
294
+ }
295
+ isFilterEnable(columnProp) {
296
+ if (this.isTableInEditState) {
297
+ return false;
298
+ }
299
+ return this.gridOptions.isFilterEnabled && (!this.gridOptions.filterableColumns.length || this.isFilterableColumn(columnProp));
300
+ }
301
+ isFilterableColumn(columnProp) {
302
+ return this.gridOptions.filterableColumns.findIndex((item) => item === columnProp) !== -1;
303
+ }
304
+ get isFilterApplied() {
305
+ return this.filterManager.getFilterParams().length > 0;
306
+ }
307
+ get nonDisabledRows() {
308
+ if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn)) {
309
+ return this.rows.filter((row) => !this.gridOptions.rowDisableFn(row));
310
+ }
311
+ return this.rows;
312
+ }
313
+ ngAfterViewInit() {
314
+ this.fireInitCompleted();
315
+ if (this.scrollPosition) {
316
+ const htmlElement = this.customDataTable.nativeElement;
317
+ htmlElement.scrollTop = this.scrollPosition.y;
318
+ htmlElement.scrollLeft = this.scrollPosition.x;
319
+ }
320
+ }
321
+ checkDeleteDisabled() {
322
+ if (isFunction(this.isDeleteDisabled) && !isUndefined(this.selectedRow)) {
323
+ return this.isDeleteDisabled(this.selectedRow);
324
+ }
325
+ if (this.isDeleteDisabled && typeof this.isDeleteDisabled !== 'function') {
326
+ return true;
327
+ }
328
+ return false;
329
+ }
330
+ isAllSelected() {
331
+ if (this.gridOptions.isClientSidePagination) {
332
+ return this.nonDisabledRows.length === this.selection.selected.length;
333
+ }
334
+ return (this.masterSelection.value && this.excludedRows.length === 0) || this.totalItems === this.selection.selected.length;
335
+ }
336
+ isSortColumn(viewColumn) {
337
+ return !!(this.gridOptions.sortableProperties && this.gridOptions.sortableProperties.find((x) => x === viewColumn.prop));
338
+ }
339
+ openColumnShowHideDialogue() {
340
+ let dialogConfig = new MatDialogConfig();
341
+ dialogConfig = this.configureDialog(dialogConfig);
342
+ const dialogRef = this.dialog.open(DataColDispComponent, dialogConfig);
343
+ dialogRef.afterClosed().subscribe((result) => {
344
+ if (result && result.status === 'OK') {
345
+ this.viewColumns = result.columns;
346
+ this.changeDetectorRef.detectChanges();
347
+ }
348
+ });
349
+ }
350
+ masterToggle() {
351
+ this.excludedRows = [];
352
+ if (!this.masterSelection.pristine && !this.masterSelection.value) {
353
+ this.selection.clear();
354
+ this.changeDetectorRef.detectChanges();
355
+ this.gridApi.detectRowChanges();
356
+ this.masterSelection.reset();
357
+ this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: false });
358
+ return;
359
+ }
360
+ if (!this.gridOptions.isClientSidePagination) {
361
+ this.checkedAllExceptExcludedRows();
362
+ this.changeDetectorRef.detectChanges();
363
+ this.gridApi.detectRowChanges();
364
+ this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: true });
365
+ }
366
+ else {
367
+ this.masterToggleClientSide();
368
+ this.CheckboxSelect.emit({ rows: this.rows, gridApi: this.getGridApi(), checked: true });
369
+ }
370
+ }
371
+ isCheckboxSelect(row) {
372
+ const isSelected = this.selection.isSelected(row);
373
+ if (this.masterSelection.value && !isSelected) {
374
+ this.excludedRows.push(row);
375
+ }
376
+ else if (this.masterSelection.value && isSelected) {
377
+ const findIndex = this.excludedRows.findIndex((x) => JSON.stringify(x) === JSON.stringify(row));
378
+ if (findIndex > -1) {
379
+ this.excludedRows.splice(findIndex, 1);
380
+ }
381
+ }
382
+ this.CheckboxSelect.emit({ rows: [row], gridApi: this.getGridApi(), checked: isSelected });
383
+ if (isSelected) {
384
+ this.rows.forEach((row) => (row.isSelected = false));
385
+ }
386
+ const checkedRows = this.gridApi.getAllCheckedRows();
387
+ if (!this.selectedRow && checkedRows.length > 0) {
388
+ this.selectedRow = checkedRows[checkedRows.length - 1];
389
+ }
390
+ }
391
+ refresh() {
392
+ this.setData();
393
+ }
394
+ onClickAction(action) {
395
+ this.actionClick.emit(action);
396
+ }
397
+ onClickAdd() {
398
+ this.onAddClicked.emit();
399
+ if (isFunction(this.onAddClick) && !this.onAddClick(undefined, undefined)) {
400
+ return;
401
+ }
402
+ this.addActionHandler();
403
+ }
404
+ addActionHandler() {
405
+ this.setIdColumn();
406
+ this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
407
+ this.isSearchDisabled = true;
408
+ this.searchValue.setValue(DataTableConstants.EMPTY);
409
+ if (this.gridOptions.canInlineAdd) {
410
+ if (!this.hasEmptyRow) {
411
+ this.addEmptyRow();
412
+ }
413
+ }
414
+ else {
415
+ this.navigatePage(FormTypes.Add);
416
+ }
417
+ }
418
+ onClickRow(eventData) {
419
+ const checkedRows = this.gridApi.getAllCheckedRows();
420
+ if (checkedRows?.length > 0) {
421
+ return;
422
+ }
423
+ if (this.isDefaultFirstRowSelected()) {
424
+ this.rows.forEach((x) => (x.isSelected = false));
425
+ }
426
+ if (this.selectedRow) {
427
+ this.selectedRow.isSelected = false;
428
+ }
429
+ this.selectedRow = eventData.row;
430
+ eventData.row.isSelected = true;
431
+ const emitIndex = this.gridOptions.isClientSidePagination
432
+ ? eventData.row.rowIndex + this.pageSize * (this.currentPage - 1)
433
+ : eventData.row.rowIndex;
434
+ this.selectedRow.rowIndex = emitIndex;
435
+ this.onRowClicked.emit(eventData.row);
436
+ }
437
+ onClickRowAdd(eventData) {
438
+ if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
439
+ this.addEmptyRow(eventData.row.depth + 1, this.dataTableService.getRowId(eventData.row));
440
+ }
441
+ }
442
+ onClickEdit(eventData) {
443
+ if (isFunction(this.onBeforeEdit) && !this.onBeforeEdit(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
444
+ return;
445
+ }
446
+ this.onEditClicked.emit(eventData);
447
+ if (this.gridOptions.canInlineEdit) {
448
+ if (!this.isEditing) {
449
+ this.toggleRowEditing(eventData.row, true);
450
+ }
451
+ }
452
+ else {
453
+ this.navigateToItem(FormTypes.Edit, this.dataTableService.getRowId(eventData.row));
454
+ }
455
+ }
456
+ onClickClone(eventData) {
457
+ if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
458
+ const newEventData = cloneDeep(eventData);
459
+ this.addCloneRow(newEventData.row);
460
+ }
461
+ }
462
+ onClickView(eventData) {
463
+ this.navigateToItem(FormTypes.View, this.getNavigateItemValue(eventData));
464
+ }
465
+ ComplexDetailClicked(eventData) {
466
+ this.onComplexDetailClicked.emit(eventData);
467
+ }
468
+ ActionClickHandler(action) {
469
+ if (action.clicked) {
470
+ action.clicked(this.selectedRow);
471
+ }
472
+ }
473
+ showHideFilterView() {
474
+ this.isFilterView = !this.isFilterView;
475
+ }
476
+ clearGlobalFilter() {
477
+ this.isClearFilter$.next(true);
478
+ this.searchValue.setValue('');
479
+ this.changeDetectorRef.detectChanges();
480
+ this.filterManager.clearFilterParams();
481
+ this.setData();
482
+ }
483
+ onChangePage(paginationParams, selectableIndex) {
484
+ this.setPaginationData(paginationParams);
485
+ if (!this.isClientSidePagination()) {
486
+ this.setData(selectableIndex);
487
+ }
488
+ else if (this.isDefaultFirstRowSelected() && this.isClientSidePagination()) {
489
+ if (selectableIndex) {
490
+ this.emitNextRow(this.pageSize * (this.currentPage - 1) + this.getSelectableValidIndex(selectableIndex));
491
+ }
492
+ else {
493
+ this.emitNextRow(this.pageSize * (this.currentPage - 1));
494
+ }
495
+ }
496
+ this.onPageChanged.emit();
497
+ }
498
+ onExpansionPanelClick(eventData) {
499
+ this.matExpansionPanelClicked.emit(eventData);
500
+ }
501
+ onChangePageSize(pageSize) {
502
+ this.setPaginationDataOnSizeChanged(pageSize);
503
+ if (!this.isClientSidePagination()) {
504
+ this.setData();
505
+ }
506
+ }
507
+ getFilterParam(column) {
508
+ return this.filterManager.getFilterParam(column);
509
+ }
510
+ isFilteredColumn(columnProp) {
511
+ return this.filterManager.getFilterParams().findIndex((item) => item.filterColumn.prop === columnProp) !== -1;
512
+ }
513
+ onFilterClicked(filterParam) {
514
+ this.filterManager.setFilterParams(filterParam);
515
+ this.filteredRows = this.filterPipe.transform(this.rows, this.filterManager.getFilterParams(), this.columns, this.gridOptions.isClientSidePagination);
516
+ this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
517
+ if (!this.isClientSidePagination()) {
518
+ this.setData();
519
+ }
520
+ else {
521
+ // this.numberOfTableRefresh = 1.5; // to skip init filter value assign
522
+ }
523
+ }
524
+ onClickEditCancel(eventData) {
525
+ this.isSearchDisabled = false;
526
+ if (this.dataTableService.isEmptyRow(eventData.row)) {
527
+ this.removeEmptyRow();
528
+ }
529
+ else {
530
+ this.toggleRowEditing(eventData.row, false);
531
+ }
532
+ }
533
+ onClickEditSave(eventData) {
534
+ this.isSearchDisabled = false;
535
+ if (isFunction(this.beforeSaveFn) && !this.beforeSaveFn(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
536
+ return;
537
+ }
538
+ if (this.isSaveDataLocal) {
539
+ this.onSaveLocalRow(eventData);
540
+ }
541
+ else {
542
+ this.saveRow(eventData);
543
+ }
544
+ }
545
+ onChangeExpandCollapse(eventData) {
546
+ this.toggleRowExpandCollapse(eventData.row, eventData.shouldExpand);
547
+ }
548
+ getNavigateItemValue(eventData) {
549
+ if (this.gridOptions && this.gridOptions.rowNavigationProperty) {
550
+ return this.dataTableService.getValueByPropertyName(eventData.row, this.gridOptions.rowNavigationProperty);
551
+ }
552
+ return this.dataTableService.getRowId(eventData.row);
553
+ }
554
+ navigateToItem(type, id) {
555
+ const url = this.gridOptions.editExtraRouteParam ? `${type}/${id}/${this.gridOptions.editExtraRouteParam}` : `${type}/${id}`;
556
+ this.navigatePage(url);
557
+ }
558
+ onClickDeleteRow(eventData) {
559
+ this.openDeleteModal(eventData.row);
560
+ }
561
+ onClickDeleteModal(shouldDelete) {
562
+ if (shouldDelete) {
563
+ this.gridOptions?.actionLoading$?.delete$.next(true);
564
+ if (this.isSaveDataLocal) {
565
+ this.removeLocalRow(this.dataTableService.getRowId(this.rowToDelete));
566
+ this.onChangeLocalData(ChangeType.ROW_DELETED);
567
+ this.gridOptions?.actionLoading$?.delete$.next(false);
568
+ }
569
+ else {
570
+ this.deleteRow(this.rowToDelete);
571
+ }
572
+ }
573
+ }
574
+ VisibleColumnListChanged(columnList) {
575
+ this.viewColumns = columnList;
576
+ }
577
+ ngOnDestroy() {
578
+ this.clearSubs$.next(null);
579
+ this.clearSubs$.complete();
580
+ this.isClearFilter$.next(false);
581
+ this.isClearFilter$.complete();
582
+ this.dataTableContext.clearDataTableComponent();
583
+ }
584
+ init() {
585
+ this.gridOptions = merge(this.defaultGridOptions, this.gridOptions);
586
+ this.setPaginationData({
587
+ currentPage: isUndefined(this.initialPage) ? this.DEFAULT_INIT_PAGE : this.initialPage,
588
+ pageSize: this.pageSize,
589
+ });
590
+ this.selection = new SelectionModel(!this.isSingleSelect, []);
591
+ if (!this.gridOptions.isAutoColumn) {
592
+ this.setIdColumn();
593
+ this.initColumns();
594
+ this.defaultSortedColumns = clone(this.viewColumns);
595
+ }
596
+ this.getConfiguredColumns();
597
+ this.setData();
598
+ }
599
+ sortTable(viewColumn) {
600
+ if (this.isTableInEditState) {
601
+ return;
602
+ }
603
+ if (!this.gridOptions.sortableProperties.find((item) => item === viewColumn.prop) && !this.gridOptions.isSortEnabled) {
604
+ return;
605
+ }
606
+ if (this.sortedColumn[viewColumn.prop] === undefined) {
607
+ this.sortedColumn = {};
608
+ this.sortedColumn[viewColumn.prop] = SortDirectionEnum.ASC;
609
+ this.sortData(viewColumn, true);
610
+ }
611
+ else if (this.sortedColumn[viewColumn.prop] === SortDirectionEnum.ASC) {
612
+ this.sortedColumn[viewColumn.prop] = SortDirectionEnum.DESC;
613
+ this.sortData(viewColumn, false);
614
+ }
615
+ else {
616
+ this.sortedColumn = {};
617
+ this.sortData(viewColumn, false, true);
618
+ }
619
+ }
620
+ deleteRow(row) {
621
+ this.setIdColumn();
622
+ const rowId = this.dataTableService.getRowId(row);
623
+ this.deleteItemFn(rowId, row.data)
624
+ .pipe(first(), takeUntil(this.clearSubs$))
625
+ .subscribe({
626
+ next: () => {
627
+ this.gridOptions?.actionLoading$?.delete$.next(false);
628
+ this.snackbarService.success(SnackbarTypes.Deleted, SnackbarTypes.Deleted);
629
+ if (this.isClientSidePagination()) {
630
+ this.removeLocalRow(rowId);
631
+ }
632
+ else {
633
+ this.setData();
634
+ }
635
+ if (!this.isDefaultFirstRowSelected()) {
636
+ this.selectedRow = undefined;
637
+ }
638
+ this.onDeleteCompleted.emit({ row: this.selectedRow });
639
+ },
640
+ error: () => {
641
+ // Empty method block.
642
+ },
643
+ });
644
+ }
645
+ searchModelChanged() {
646
+ if (this.gridOptions.isClientSidePagination) {
647
+ this.filteredRows = this.searchPipe.transform(this.rows, this.searchValue.value, this.searchColumns, this.gridOptions.isClientSidePagination, this.searchedRowCount$);
648
+ this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
649
+ this.changeDetectorRef.detectChanges();
650
+ }
651
+ }
652
+ getTooltipText(text) {
653
+ if (this.gridOptions.iconTooltips && this.gridOptions.iconTooltips[text]) {
654
+ return this.gridOptions.iconTooltips[text];
655
+ }
656
+ return tooltipsDefaultValue[text];
657
+ }
658
+ getActionName(prop) {
659
+ return this.userManagementService.getActionName(this.gridOptions, prop);
660
+ }
661
+ getLeftActionName(prop) {
662
+ return this.userManagementService.getLeftActionName(this.gridOptions, prop);
663
+ }
664
+ getLeftRightActionText(data) {
665
+ if (data.title) {
666
+ return data.title;
667
+ }
668
+ return tooltipsDefaultValue[data.title];
669
+ }
670
+ get isSingleSelect() {
671
+ return this.gridOptions && this.gridOptions.isSingleSelect === true;
672
+ }
673
+ get pageSize() {
674
+ return this.paginationParams.pageSize;
675
+ }
676
+ get currentPage() {
677
+ return this.paginationParams.currentPage;
678
+ }
679
+ detectChange() {
680
+ this.changeDetectorRef.detectChanges();
681
+ }
682
+ selectNextRow() {
683
+ if (this.isLastRowInPage()) {
684
+ this.paginationParams.currentPage = this.isLastRowInLastPage() ? 1 : this.paginationParams.currentPage + 1;
685
+ this.onChangePage(this.paginationParams);
686
+ }
687
+ else {
688
+ this.emitNextRow(this.selectedRow.rowIndex + 1);
689
+ }
690
+ }
691
+ selectPreviousRow() {
692
+ if (this.isFirstRowInPage()) {
693
+ this.paginationParams.currentPage = this.isFirstRowInFirstPage() ? this.pagesCount : this.paginationParams.currentPage - 1;
694
+ this.onChangePage(this.paginationParams, 'last');
695
+ }
696
+ else {
697
+ this.emitNextRow(this.selectedRow.rowIndex - 1);
698
+ }
699
+ }
700
+ uncheckSelectedSource() {
701
+ this.selection.clear();
702
+ this.changeDetectorRef.detectChanges();
703
+ this.gridApi.detectRowChanges();
704
+ }
705
+ onDoubleClickSeparator(index, viewColumn) {
706
+ if (!this.gridOptions.draggable || !viewColumn.draggable) {
707
+ return;
708
+ }
709
+ clearTimeout(this.clickTimeout);
710
+ this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
711
+ this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
712
+ if (!this.resizingTh || !this.resizingTd) {
713
+ return;
714
+ }
715
+ viewColumn.doubleClicked = !viewColumn.doubleClicked;
716
+ viewColumn.dragged = false;
717
+ this.formatTableData(viewColumn);
718
+ this.formatTableHeader();
719
+ }
720
+ getHeaderStyle(index, viewColumn) {
721
+ let classes = [];
722
+ if (this.viewColumns[index].dragged || viewColumn?.doubleClicked === true) {
723
+ classes.push('drag-column');
724
+ }
725
+ else if (this.gridOptions.fixedWidthData) {
726
+ classes.push('header-max-width');
727
+ }
728
+ return classes;
729
+ }
730
+ onSeparatorMouseDown(event, index, viewColumn) {
731
+ clearTimeout(this.clickTimeout);
732
+ this.clickTimeout = setTimeout(() => {
733
+ if (!this.gridOptions.draggable || !viewColumn.draggable) {
734
+ return;
735
+ }
736
+ if (!viewColumn.dragged) {
737
+ viewColumn.dragged = true;
738
+ this.changeDetectorRef.detectChanges();
739
+ }
740
+ this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
741
+ this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
742
+ const tdDiv = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"] div`);
743
+ this.apolloDataTable = document.querySelector('.apollo-design-new-data-table');
744
+ if (this.resizingTh) {
745
+ this.startX = event.pageX;
746
+ this.startWidth = this.getActualWidth(this.resizingTh, this.startX);
747
+ const tdDivWidth = this.getActualWidth(tdDiv, this.startX);
748
+ if (this.resizingTd) {
749
+ this.resizingTd.forEach((cell) => {
750
+ const tdDiv = cell.querySelector('div');
751
+ tdDiv.classList.remove('data-max-width');
752
+ tdDiv.classList.add('drag-column');
753
+ });
754
+ }
755
+ this.setWidthToElement(this.startWidth, tdDivWidth, this.resizingTh.offsetWidth);
756
+ }
757
+ }, 250);
758
+ document.body.classList.add('no-select-resize');
759
+ if (this.gridOptions.draggable && viewColumn.draggable) {
760
+ document.addEventListener('mousemove', this.onMouseMove);
761
+ }
762
+ document.addEventListener('mouseup', this.onMouseUp);
763
+ }
764
+ getSelectedHtml(selector, isSelectAll = false) {
765
+ if (isSelectAll) {
766
+ return this.customDataTable.nativeElement.querySelectorAll(selector);
767
+ }
768
+ return this.customDataTable.nativeElement.querySelector(selector);
769
+ }
770
+ formatTableData(viewColumn) {
771
+ if (!viewColumn.doubleClicked) {
772
+ this.resizingTd.forEach((cell) => {
773
+ const tdDiv = cell.querySelector('div');
774
+ tdDiv.classList.remove('drag-column');
775
+ if (this.gridOptions.fixedWidthData) {
776
+ tdDiv.classList.add('data-max-width');
777
+ }
778
+ });
779
+ }
780
+ else {
781
+ this.resizingTd.forEach((cell) => {
782
+ const tdDiv = cell.querySelector('div');
783
+ tdDiv.classList.remove('data-max-width');
784
+ tdDiv.classList.add('drag-column');
785
+ });
786
+ }
787
+ }
788
+ formatTableHeader() {
789
+ this.resizingTh.style.width = '';
790
+ this.resizingTd.forEach((cell) => {
791
+ const tdDiv = cell.querySelector('div');
792
+ tdDiv.style.width = '';
793
+ });
794
+ }
795
+ setWidthToElement(thWidth, tdWidth, previousThWidth) {
796
+ if (this.resizingTh) {
797
+ this.resizingTh.style.width = `${thWidth}px`;
798
+ }
799
+ if (this.resizingTd) {
800
+ this.resizingTd.forEach((cell) => {
801
+ const div = cell.querySelector('div.drag-column');
802
+ if (div) {
803
+ div.style.width = `${tdWidth}px`;
804
+ }
805
+ });
806
+ }
807
+ if (this.resizingTh && this.apolloDataTable) {
808
+ const updatedTableWidth = this.apolloDataTable.offsetWidth + (this.resizingTh.offsetWidth - previousThWidth);
809
+ this.apolloDataTable.style.width = `${updatedTableWidth}px`;
810
+ }
811
+ }
812
+ getActualWidth(element, startX) {
813
+ let width;
814
+ const boundingRect = element.getBoundingClientRect();
815
+ width = boundingRect.width;
816
+ const offset = startX - boundingRect.left;
817
+ if (offset < boundingRect.width) {
818
+ width = offset;
819
+ }
820
+ return width;
821
+ }
822
+ get pagesCount() {
823
+ return Math.ceil(this.count / this.pageSize);
824
+ }
825
+ get rowsCountInCurrentPage() {
826
+ if (!this.gridOptions.isClientSidePagination) {
827
+ return this.rows.length;
828
+ }
829
+ const leftRows = this.rows.length - this.pageSize * (this.currentPage - 1);
830
+ return leftRows >= this.pageSize ? this.pageSize : leftRows;
831
+ }
832
+ isLastRowInPage() {
833
+ if (this.selectedRow && this.gridOptions.isClientSidePagination) {
834
+ return ((this.selectedRow.rowIndex + 1) / this.currentPage === this.rowsCountInCurrentPage || this.selectedRow.rowIndex + 1 === this.count);
835
+ }
836
+ return this.selectedRow && this.selectedRow.rowIndex + 1 === this.rowsCountInCurrentPage;
837
+ }
838
+ isFirstRowInPage() {
839
+ return this.selectedRow && this.selectedRow.rowIndex % this.pageSize === 0;
840
+ }
841
+ isFirstRowInFirstPage() {
842
+ return this.isFirstRowInPage() && this.currentPage === 1;
843
+ }
844
+ isLastRowInLastPage() {
845
+ return this.isLastRowInPage() && this.currentPage === this.pagesCount;
846
+ }
847
+ detectRowChange() {
848
+ this.rows = clone(this.rows);
849
+ this.changeDetectorRef.detectChanges();
850
+ }
851
+ isClientSidePagination() {
852
+ return this.gridOptions.isClientSidePagination;
853
+ }
854
+ setIdColumn() {
855
+ // To do improve
856
+ if (this.gridOptions && this.gridOptions.idProperty) {
857
+ COLUMN_ID.PROP = this.gridOptions.idProperty;
858
+ }
859
+ else {
860
+ COLUMN_ID.PROP = 'id';
861
+ }
862
+ }
863
+ initColumns() {
864
+ this.initViewColumns();
865
+ if (this.gridOptions && this.gridOptions.addIdColumn) {
866
+ this.addIdColumn();
867
+ }
868
+ }
869
+ configureDialog(dialogConfig) {
870
+ dialogConfig.position = {
871
+ top: '15vh',
872
+ left: '20vw',
873
+ };
874
+ dialogConfig.height = '80vh';
875
+ dialogConfig.width = '60vw';
876
+ dialogConfig.panelClass = 'columnshowhide-panel';
877
+ dialogConfig.data = {
878
+ defaultSortedColumns: this.defaultSortedColumns,
879
+ columns: this.viewColumns,
880
+ storageKey: this.storageKey,
881
+ metaDataColumns: this.gridOptions.metaDataColumns,
882
+ };
883
+ dialogConfig.disableClose = false;
884
+ return dialogConfig;
885
+ }
886
+ initViewColumns() {
887
+ this.viewColumns = clone(this.columns.filter((x) => x != undefined));
888
+ this.viewColumns.forEach((viewColumn) => {
889
+ if (viewColumn.isVisible === undefined) {
890
+ viewColumn.isVisible = true;
891
+ }
892
+ if (viewColumn.isDisplayValueAsFormControl === undefined) {
893
+ viewColumn.isDisplayValueAsFormControl = false;
894
+ }
895
+ });
896
+ this.searchColumns = this.getSearchableColumns(this.viewColumns);
897
+ }
898
+ addIdColumn() {
899
+ this.viewColumns.unshift({
900
+ header: COLUMN_ID.HEADER,
901
+ prop: COLUMN_ID.PROP,
902
+ type: ColumnTypes.Integer,
903
+ isReadOnly: true,
904
+ isVisible: false, // this.isIdColVisible,
905
+ isDisplayValueAsFormControl: false,
906
+ editDisabledMode: ColumnDisableModes.AlwaysDisabled,
907
+ });
908
+ }
909
+ setData(selectableIndex) {
910
+ this.numberOfTableRefresh += 1;
911
+ this.isLoading$.next(true);
912
+ if (!this.gridOptions.isAutoColumn) {
913
+ this.setInitApiParams();
914
+ }
915
+ this.applyDefaultSortingParams();
916
+ this.getListFn(this.apiReqParams)
917
+ .pipe(first(), takeUntil(this.clearSubs$))
918
+ .subscribe((response) => {
919
+ // TODO: add error handling
920
+ this.totalItems = response.itemsTotal;
921
+ this.initGetFunc(response, selectableIndex);
922
+ if (this.gridOptions.isDefaultAllRowSelected && this.gridOptions.isClientSidePagination) {
923
+ this.masterSelection.setValue(true);
924
+ this.masterToggle();
925
+ }
926
+ this.isTableDataLoad.emit(true);
927
+ }, (err) => {
928
+ if (err) {
929
+ this.isLoading$.next(false);
930
+ this.rows = this.rows || [];
931
+ this.changeDetectorRef.detectChanges();
932
+ }
933
+ }, () => {
934
+ // Empty Method block
935
+ });
936
+ }
937
+ setInitApiParams() {
938
+ if (this.numberOfTableRefresh > 1) {
939
+ return;
940
+ }
941
+ this.setInitFilterParams();
942
+ }
943
+ setInitFilterParams() {
944
+ this.filterManager.setInitFilterParams(this.columns);
945
+ }
946
+ initGetFunc(response, selectableIndex) {
947
+ this.count = this.gridOptions.isClientSidePagination ? response.resultSet.length : response.itemsTotal;
948
+ this.searchedRowCount$.next(response.itemsTotal);
949
+ if (this.gridOptions.isAutoColumn) {
950
+ this.generateColumns(response.resultSet);
951
+ }
952
+ this.rows = this.dataTableService.getRowsFromRowsData(response.resultSet);
953
+ if (this.gridOptions.editable) {
954
+ this.rows.forEach((x) => (x.isEditing = true));
955
+ }
956
+ if (this.gridOptions.isClientSidePagination) {
957
+ this.originalUnsortedRows = cloneDeep(this.rows);
958
+ }
959
+ this.filteredRows = cloneDeep(this.rows);
960
+ this.selectedRow = undefined;
961
+ this.isLoading$.next(false);
962
+ this.isClearFilter$.next(false);
963
+ this.isEditing = false;
964
+ this.hasEmptyRow = false;
965
+ if (this.gridOptions.defaultSortProperty.prop) {
966
+ this.applyDefaultSort();
967
+ }
968
+ if (this.isEligibleForAllCheck()) {
969
+ this.checkedAllExceptExcludedRows();
970
+ }
971
+ else if (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination) {
972
+ this.setRowChecked();
973
+ }
974
+ if (this.isDefaultFirstRowSelected()) {
975
+ // TODO - refactor
976
+ this.emitNextRow(this.getSelectableValidIndex(selectableIndex));
977
+ }
978
+ this.changeDetectorRef.detectChanges();
979
+ }
980
+ isEligibleForAllCheck() {
981
+ return (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination && !this.masterSelection.pristine && this.masterSelection.value);
982
+ }
983
+ getSelectableValidIndex(selectableIndex) {
984
+ if (selectableIndex === 'last') {
985
+ selectableIndex = this.pageSize;
986
+ }
987
+ return Number(selectableIndex) > this.rowsCountInCurrentPage - 1 ? this.rowsCountInCurrentPage - 1 : selectableIndex;
988
+ }
989
+ setPaginationData(paginationParams) {
990
+ this.paginationParams = paginationParams;
991
+ }
992
+ checkedAllExceptExcludedRows() {
993
+ this.clearPropertyWhenSelectionEnable(this.excludedRows);
994
+ this.selection.clear();
995
+ const excludedCurrentPageRows = this.rows.filter((x) => this.excludedRows.map((e) => JSON.stringify(e)).includes(JSON.stringify(x)));
996
+ this.rows
997
+ .filter((x) => !excludedCurrentPageRows.some((y) => JSON.stringify(x) === JSON.stringify(y)))
998
+ .forEach((row) => {
999
+ if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn) && !this.gridOptions.rowDisableFn(row)) {
1000
+ this.selection.select(row);
1001
+ }
1002
+ else if (!this.gridOptions.rowDisableFn) {
1003
+ this.selection.select(row);
1004
+ }
1005
+ });
1006
+ }
1007
+ applyDefaultSort() {
1008
+ if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
1009
+ this.downSort(this.gridOptions.defaultSortProperty);
1010
+ }
1011
+ else {
1012
+ this.upSort(this.gridOptions.defaultSortProperty);
1013
+ }
1014
+ }
1015
+ applyDefaultSortingParams() {
1016
+ if (!this.gridOptions.defaultSortProperty.prop) {
1017
+ return;
1018
+ }
1019
+ this.sortedColumn = {};
1020
+ if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
1021
+ this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.DESC;
1022
+ }
1023
+ else {
1024
+ this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.ASC;
1025
+ }
1026
+ }
1027
+ setPaginationDataOnSizeChanged(pageSize) {
1028
+ this.paginationParams.pageSize = pageSize;
1029
+ }
1030
+ navigatePage(url) {
1031
+ this.router.navigate([url], { relativeTo: this.activatedRoute });
1032
+ }
1033
+ openDeleteModal(row) {
1034
+ this.rowToDelete = row;
1035
+ const dialogConfig = new MatDialogConfig();
1036
+ dialogConfig.data = {
1037
+ message: this.gridOptions.deleteOptions.confirmationMessage,
1038
+ };
1039
+ dialogConfig.position = {
1040
+ top: '7%',
1041
+ };
1042
+ dialogConfig.panelClass = 'delete-modal-panel';
1043
+ const dialogRef = this.matDialog.open(DeleteModalComponent, dialogConfig);
1044
+ dialogRef
1045
+ .afterClosed()
1046
+ .pipe(first(), takeUntil(this.clearSubs$))
1047
+ .subscribe((result) => this.onClickDeleteModal(result));
1048
+ this.changeDetectorRef.detectChanges();
1049
+ }
1050
+ saveRow(eventData) {
1051
+ this.setIdColumn();
1052
+ const row = eventData.row, saveData = eventData.saveData;
1053
+ if (saveData[COLUMN_ID.PROP] === COLUMN_ID.EMPTY_ROW_VAL) {
1054
+ this.postDataForAdd(saveData, row);
1055
+ }
1056
+ else {
1057
+ this.putDataForEdit(saveData, row);
1058
+ }
1059
+ }
1060
+ postDataForAdd(saveData, row) {
1061
+ this.isSaving = true;
1062
+ row.isSaving = true;
1063
+ this.postItemFn(saveData)
1064
+ .pipe(first(), takeUntil(this.clearSubs$))
1065
+ .subscribe((result) => {
1066
+ this.isSaving = false;
1067
+ row.isSaving = false;
1068
+ this.snackbarService.success(SnackbarTypes.Success, SnackbarTypes.Success);
1069
+ if (this.gridOptions.refreshOnAdd) {
1070
+ this.setData();
1071
+ }
1072
+ else {
1073
+ this.hasEmptyRow = false;
1074
+ saveData[COLUMN_ID.PROP] = result[COLUMN_ID.PROP];
1075
+ this.saveLocalRow(row, saveData);
1076
+ }
1077
+ }, () => {
1078
+ this.isSaving = false;
1079
+ row.isSaving = false;
1080
+ this.changeDetectorRef.detectChanges();
1081
+ });
1082
+ }
1083
+ putDataForEdit(saveData, row) {
1084
+ this.isSaving = true;
1085
+ row.isSaving = true;
1086
+ this.putItemFn(this.dataTableService.getRowId(row), saveData)
1087
+ .pipe(first(), takeUntil(this.clearSubs$))
1088
+ .subscribe((returnData) => {
1089
+ if (returnData) {
1090
+ saveData = merge(saveData, returnData);
1091
+ }
1092
+ this.isSaving = false;
1093
+ row.isSaving = false;
1094
+ this.snackbarService.info(SnackbarTypes.Update, SnackbarTypes.Update);
1095
+ if (!this.isClientSidePagination()) {
1096
+ this.setData();
1097
+ }
1098
+ else {
1099
+ this.saveLocalRow(row, saveData);
1100
+ this.onUpdateCompleted.emit({ row });
1101
+ }
1102
+ }, () => {
1103
+ this.isSaving = false;
1104
+ row.isSaving = false;
1105
+ this.changeDetectorRef.detectChanges();
1106
+ });
1107
+ }
1108
+ downSort(viewColumn) {
1109
+ this.rows.sort((item1, item2) => {
1110
+ return item1.data[viewColumn.prop] <= item2.data[viewColumn.prop] ? 1 : -1;
1111
+ });
1112
+ this.detectRowChange();
1113
+ }
1114
+ upSort(viewColumn) {
1115
+ this.rows.sort((item1, item2) => {
1116
+ return item1.data[viewColumn.prop] >= item2.data[viewColumn.prop] ? 1 : -1;
1117
+ });
1118
+ this.detectRowChange();
1119
+ }
1120
+ unsort() {
1121
+ this.rows = this.originalUnsortedRows.filter((original) => {
1122
+ return this.rows.filter((row) => JSON.stringify(row.data) === JSON.stringify(original.data));
1123
+ });
1124
+ }
1125
+ sortData(viewColumn, isAscending, isUnsort = false) {
1126
+ if (!this.gridOptions.isClientSidePagination) {
1127
+ this.setData();
1128
+ return;
1129
+ }
1130
+ if (isUnsort) {
1131
+ this.unsort();
1132
+ }
1133
+ else {
1134
+ isAscending ? this.upSort(viewColumn) : this.downSort(viewColumn);
1135
+ }
1136
+ }
1137
+ addEmptyRow(depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
1138
+ this.hasEmptyRow = true;
1139
+ this.filterManager.clearFilterParams();
1140
+ const newRow = this.getEmptyRow(depth, parentId);
1141
+ this.selectedRow = newRow;
1142
+ this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, newRow);
1143
+ }
1144
+ removeEmptyRow() {
1145
+ this.hasEmptyRow = false;
1146
+ this.selectedRow = undefined;
1147
+ this.removeLocalRow(COLUMN_ID.EMPTY_ROW_VAL);
1148
+ }
1149
+ onSaveLocalRow(eventData) {
1150
+ if (this.dataTableService.isEmptyRow(eventData.row)) {
1151
+ this.addLocalRow(eventData.row, eventData.saveData);
1152
+ this.onChangeLocalData(ChangeType.ROW_ADDED);
1153
+ }
1154
+ else {
1155
+ this.editLocalRow(eventData.row, eventData.saveData);
1156
+ this.onChangeLocalData(ChangeType.ROW_UPDATED);
1157
+ }
1158
+ }
1159
+ addLocalRow(row, saveData) {
1160
+ this.hasEmptyRow = false;
1161
+ this.saveLocalRow(row, { ...saveData, id: this.dataTableService.getNewRowId() });
1162
+ }
1163
+ editLocalRow(row, saveData) {
1164
+ this.saveLocalRow(row, saveData);
1165
+ }
1166
+ saveLocalRow(row, saveData) {
1167
+ this.isEditing = false;
1168
+ this.updateRowData(row, saveData);
1169
+ row.isEditing = false;
1170
+ this.detectRowChange();
1171
+ }
1172
+ updateRowData(row, saveData) {
1173
+ Object.assign(row.data, saveData);
1174
+ if (!isUndefined(row.formGroup)) {
1175
+ this.formService.fillForm(row.formGroup, row.data);
1176
+ }
1177
+ }
1178
+ removeLocalRow(removeRowId) {
1179
+ const index = this.rows.findIndex((x) => x.data[COLUMN_ID.PROP] === removeRowId);
1180
+ this.rows = this.dataTableService.getRowsWithRemovedRow(removeRowId, this.rows);
1181
+ if (this.isDefaultFirstRowSelected()) {
1182
+ this.selectAutoNextRow(index);
1183
+ }
1184
+ else if (this.gridOptions.defaultFirstRowSelection && this.rows.length === 0) {
1185
+ this.onRowClicked.emit();
1186
+ }
1187
+ if (this.rows.length && this.rows.length % this.paginationParams.pageSize === 0) {
1188
+ this.paginationParams.currentPage--;
1189
+ this.searchedRowCount$.next(this.rows.length);
1190
+ }
1191
+ this.changeDetectorRef.detectChanges();
1192
+ }
1193
+ selectAutoNextRow(index) {
1194
+ if (index !== -1) {
1195
+ this.emitNextRow(this.rows.length === index ? this.rows.length - 1 : index);
1196
+ }
1197
+ }
1198
+ isDefaultFirstRowSelected() {
1199
+ return this.gridOptions.defaultFirstRowSelection;
1200
+ }
1201
+ emitNextRow(index = 0) {
1202
+ if (this.rows.length > 0) {
1203
+ this.rows.forEach((x) => (x.isSelected = false));
1204
+ this.selectedRow = this.rows[index];
1205
+ this.selectedRow.rowIndex = index;
1206
+ this.rows[index].isSelected = true;
1207
+ this.changeDetectorRef.detectChanges();
1208
+ this.dataTableBody.detectChange();
1209
+ this.onRowClicked.emit(this.rows[index]);
1210
+ }
1211
+ else {
1212
+ this.onRowClicked.emit();
1213
+ }
1214
+ }
1215
+ toggleRowEditing(row, isEditing) {
1216
+ this.isEditing = isEditing;
1217
+ row.isEditing = isEditing;
1218
+ this.rows = [...this.rows];
1219
+ this.changeDetectorRef.detectChanges();
1220
+ }
1221
+ toggleRowExpandCollapse(row, shouldExpand) {
1222
+ row.isExpanded = shouldExpand;
1223
+ this.rows = [...this.rows];
1224
+ this.changeDetectorRef.detectChanges();
1225
+ }
1226
+ getEmptyRow(depth, parentId) {
1227
+ return this.dataTableService.getRow(this.dataTableService.getEmptyRowData(this.viewColumns, this.defaultRowValues), depth, parentId, true);
1228
+ }
1229
+ onChangeLocalData(changeType = ChangeType.OTHER) {
1230
+ this.changeLocalData.emit({
1231
+ rowsData: this.dataTableService.getRowsDataFromRows(this.rows),
1232
+ changeType,
1233
+ });
1234
+ }
1235
+ fireInitCompleted() {
1236
+ this.onInitCompleted.emit(this.getGridApi());
1237
+ }
1238
+ addCloneRow(row, depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
1239
+ this.hasEmptyRow = true;
1240
+ row.data[COLUMN_ID.PROP] = COLUMN_ID.EMPTY_ROW_VAL;
1241
+ this.gridOptions.cloneOptions.copyOfClonableProperties.forEach((property) => {
1242
+ row.data[property] = DataTableConstants.COPY_OF + row.data[property];
1243
+ });
1244
+ const emptyValueColumns = this.viewColumns.filter((col) => {
1245
+ return this.gridOptions.cloneOptions.emptyValueProperties.includes(col.prop);
1246
+ });
1247
+ this.dataTableService.setEmptyValuesInRowData(row, emptyValueColumns);
1248
+ const clonedRow = this.dataTableService.getRow(row.data, depth, parentId, true);
1249
+ this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, clonedRow);
1250
+ this.selectedRow = clonedRow;
1251
+ }
1252
+ getGridApi() {
1253
+ return this.gridApi;
1254
+ }
1255
+ getSearchableColumns(columns) {
1256
+ const searchableColumns = columns.filter((item) => Object.hasOwnProperty.call(item, 'prop') && this.gridOptions.searchableProperties.includes(item.prop));
1257
+ return searchableColumns.length === 0 ? columns : searchableColumns;
1258
+ }
1259
+ masterToggleClientSide() {
1260
+ this.isAllSelected() ? this.selection.clear() : this.nonDisabledRows.forEach((row) => this.selection.select(row));
1261
+ this.changeDetectorRef.detectChanges();
1262
+ this.gridApi.detectRowChanges();
1263
+ }
1264
+ clearPropertyWhenSelectionEnable(checkedRows) {
1265
+ if (this.isRowSelectionEnable && checkedRows.length) {
1266
+ checkedRows.forEach((s) => {
1267
+ if (s.hasOwnProperty('isSelected')) {
1268
+ delete s.isSelected;
1269
+ }
1270
+ if (s.hasOwnProperty('rowIndex')) {
1271
+ delete s.rowIndex;
1272
+ }
1273
+ });
1274
+ }
1275
+ }
1276
+ getCheckedRows() {
1277
+ const checkedRows = this.selection.selected;
1278
+ this.clearPropertyWhenSelectionEnable(checkedRows);
1279
+ const pageMatchedPreviousCheckedRows = this.rows.filter((row) => {
1280
+ return checkedRows.some((item) => JSON.stringify(row) === JSON.stringify(item));
1281
+ });
1282
+ const pageUnmatchedCheckedRows = checkedRows.filter((e) => {
1283
+ return pageMatchedPreviousCheckedRows.findIndex((m) => JSON.stringify(e) === JSON.stringify(m)) < 0;
1284
+ });
1285
+ return { pageMatchedPreviousCheckedRows: pageMatchedPreviousCheckedRows, pageUnmatchedCheckedRows: pageUnmatchedCheckedRows };
1286
+ }
1287
+ masterToggleServerSide() {
1288
+ const previousCheckedRows = this.getCheckedRows();
1289
+ this.selection.clear();
1290
+ this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
1291
+ if (this.rows.length !== previousCheckedRows.pageMatchedPreviousCheckedRows.length) {
1292
+ this.rows.forEach((row) => this.selection.select(row));
1293
+ }
1294
+ this.changeDetectorRef.detectChanges();
1295
+ this.gridApi.detectRowChanges();
1296
+ }
1297
+ addUnmatchedRowToSelection(rows) {
1298
+ rows.forEach((row) => this.selection.select(row));
1299
+ }
1300
+ setRowChecked() {
1301
+ const previousCheckedRows = this.getCheckedRows();
1302
+ this.selection.clear();
1303
+ this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
1304
+ this.rows
1305
+ .filter((e) => {
1306
+ return previousCheckedRows.pageMatchedPreviousCheckedRows.some((item) => JSON.stringify(e) === JSON.stringify(item));
1307
+ })
1308
+ .forEach((row) => {
1309
+ this.selection.select(row);
1310
+ });
1311
+ this.changeDetectorRef.detectChanges();
1312
+ this.gridApi.detectRowChanges();
1313
+ }
1314
+ getFilteredDataRow(dataRows) {
1315
+ return dataRows.filter((e) => {
1316
+ return this.filteredRows.some((item) => JSON.stringify(e.data) === JSON.stringify(item.data));
1317
+ });
1318
+ }
1319
+ setColumnSource(property) {
1320
+ let source;
1321
+ const index = this.gridOptions.metaDataColumns.findIndex((value) => value === property);
1322
+ if (index > -1) {
1323
+ source = this.sourceTypes.METADATA;
1324
+ }
1325
+ else {
1326
+ source = this.sourceTypes.DATA_SOURCE;
1327
+ }
1328
+ return source;
1329
+ }
1330
+ setColumnsUsingStoredData(defaultColumns) {
1331
+ let tempCollection = [];
1332
+ tempCollection = defaultColumns.filter((x) => x != undefined);
1333
+ if (!this.storageKey) {
1334
+ return tempCollection;
1335
+ }
1336
+ let storedColumns = this.localStorageService.getItem(this.storageKey);
1337
+ if (storedColumns && storedColumns.length) {
1338
+ var index = 0;
1339
+ storedColumns
1340
+ .filter((x) => x != undefined)
1341
+ .forEach((item) => {
1342
+ const existingColumnIndex = tempCollection.findIndex((x) => x.prop === item.prop);
1343
+ if (existingColumnIndex > -1) {
1344
+ const existingColumn = tempCollection.find((x) => x.prop === item.prop);
1345
+ if (existingColumn) {
1346
+ existingColumn.isVisible = true;
1347
+ var tempcolumn = tempCollection[index];
1348
+ tempCollection[index] = existingColumn;
1349
+ tempCollection[existingColumnIndex] = tempcolumn;
1350
+ }
1351
+ }
1352
+ index++;
1353
+ });
1354
+ // added invisible columns at the end to complete the set
1355
+ tempCollection
1356
+ .filter((item) => item && storedColumns.findIndex((x) => x.prop === item.prop) < 0)
1357
+ .forEach((item) => {
1358
+ if (item) {
1359
+ item.isVisible = false;
1360
+ }
1361
+ });
1362
+ }
1363
+ return tempCollection;
1364
+ }
1365
+ selectedCheckboxPagingConfirmation(selectableIndex) {
1366
+ const dialogRef = this.matDialog.open(CommonConfirmModalComponent, {
1367
+ width: '450px',
1368
+ data: {
1369
+ body: this.confirmationMsgPagination,
1370
+ },
1371
+ });
1372
+ dialogRef
1373
+ .afterClosed()
1374
+ .pipe()
1375
+ .subscribe((confirmation) => {
1376
+ if (confirmation) {
1377
+ this.setData(selectableIndex);
1378
+ }
1379
+ });
1380
+ }
1381
+ isSelectedRow() {
1382
+ return this.gridApi.getSelectedRows().map((x) => x.data).length;
1383
+ }
1384
+ searchTable() {
1385
+ this.searchValue.valueChanges
1386
+ .pipe(filter((res) => res.length >= 2 || res === ''), debounceTime(500), distinctUntilChanged(), takeUntil(this.clearSubs$))
1387
+ .subscribe(() => {
1388
+ if (!this.isSearchDisabled) {
1389
+ this.paginationParams.currentPage = 1;
1390
+ this.changeDetectorRef.detectChanges();
1391
+ this.setData();
1392
+ }
1393
+ });
1394
+ }
1395
+ populateFilterParams() {
1396
+ if (!this.gridOptions.isClientSidePagination && this.gridOptions.isSearchBoxVisible && !this.gridOptions.isUpdatedTableDesign) {
1397
+ return [{ columnName: 'searchText', filterValue: this.searchValue.value }, ...this.filterManager.getFilterParams()];
1398
+ }
1399
+ return this.filterManager.getFilterParams();
1400
+ }
1401
+ getConfiguredColumns() {
1402
+ if (isFunction(this.gridOptions.storageFn)) {
1403
+ this.storageKey = this.gridOptions.storageFn();
1404
+ let columns = this.setColumnsUsingStoredData(this.columns);
1405
+ this.viewColumns = columns.filter((x) => x != undefined);
1406
+ }
1407
+ }
1408
+ generateColumns(rowData) {
1409
+ this.columns = Object.keys(rowData[0]).map((x) => {
1410
+ return {
1411
+ header: x.toUpperCase(),
1412
+ prop: x,
1413
+ type: ColumnTypes.String,
1414
+ rendererTemplate: this.gridOptions.renderTemplatesProp ? this.gridOptions.renderTemplatesProp[x] : undefined,
1415
+ };
1416
+ });
1417
+ this.initColumns();
1418
+ this.defaultSortedColumns = clone(this.viewColumns);
1419
+ this.changeDetectorRef.detectChanges();
1420
+ }
1421
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.DataTableService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.MatDialog }, { token: i0.ChangeDetectorRef }, { token: i4.SnackbarService }, { token: i5.UserManagementService }, { token: i6.ColumnFilterPipe }, { token: i7.SearchPipe }, { token: i8.LocalStorageService }, { token: i3.MatDialog }, { token: i9.FormService }, { token: i10.DataTableContextService }], target: i0.ɵɵFactoryTarget.Component }); }
1422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DataTableComponent, selector: "app-data-table", inputs: { defaultRowValues: "defaultRowValues", columns: "columns", getListFn: "getListFn", postItemFn: "postItemFn", putItemFn: "putItemFn", deleteItemFn: "deleteItemFn", header: "header", description: "description", actionAddTitle: "actionAddTitle", isIdColVisible: "isIdColVisible", hasPagination: "hasPagination", isOnlyView: "isOnlyView", isOnlyViewRow: "isOnlyViewRow", isDeleteDisabled: "isDeleteDisabled", isEditable: "isEditable", isCloneVisible: "isCloneVisible", isLazyInitialization: "isLazyInitialization", objectName: "objectName", gridOptions: "gridOptions", isRowSelectionEnable: "isRowSelectionEnable", beforeSaveFn: "beforeSaveFn", onBeforeEdit: "onBeforeEdit", onAddClick: "onAddClick", isRowUnchecked: "isRowUnchecked", isSaveDataLocal: "isSaveDataLocal", scrollPosition: "scrollPosition", isTreeGrid: "isTreeGrid", initialPage: "initialPage" }, outputs: { changeLocalData: "changeLocalData", actionClick: "actionClick", onInitCompleted: "onInitCompleted", onComplexDetailClicked: "onComplexDetailClicked", onEditClicked: "onEditClicked", onAddClicked: "onAddClicked", onRowClicked: "onRowClicked", onPageChanged: "onPageChanged", matExpansionPanelClicked: "matExpansionPanelClicked", onUpdateCompleted: "onUpdateCompleted", onDeleteCompleted: "onDeleteCompleted", onScrolled: "onScrolled", CheckboxSelect: "CheckboxSelect", isTableDataLoad: "isTableDataLoad" }, providers: [
1423
+ {
1424
+ provide: DATA_TABLE_CONTEXT,
1425
+ useExisting: DataTableComponent,
1426
+ },
1427
+ ], viewQueries: [{ propertyName: "setDataTableBody", first: true, predicate: DataTableBodyComponent, descendants: true }, { propertyName: "deleteModal", first: true, predicate: ["deleteModal"], descendants: true, read: TemplateRef, static: true }, { propertyName: "customDataTable", first: true, predicate: ["customDataTable"], descendants: true }, { propertyName: "sliderTemplate", first: true, predicate: ["sliderTemplate"], descendants: true }], ngImport: i0, template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n &nbsp;\n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i14.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i16.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i16.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i16.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: i17.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i18.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i18.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i18.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i18.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i18.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i19.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i19.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i20.DataPaginationComponent, selector: "app-data-pagination", inputs: ["totalRowCount$", "count", "page", "pageSizeOptions", "size", "selectionCount", "numberOfLinks", "hasDropdownStylePageSize"], outputs: ["changePage", "changePageSize"] }, { kind: "component", type: i21.LoaderComponent, selector: "app-loader", inputs: ["colorScheme", "componentSize"] }, { kind: "component", type: i22.DataTableActionsComponent, selector: "app-data-table-actions", inputs: ["canInlineEdit", "isEditable", "isEditing", "isSaving", "isTreeGrid", "isOnlyView", "hasEmptyRow", "isCloneVisible", "isDeleteVisible", "selectedRow", "gridApi", "gridOptions", "isIconsDisabled"], outputs: ["clickAdd"] }, { kind: "component", type: i23.IconComponent, selector: "app-icon", inputs: ["name", "title", "colorScheme", "hasStyleOnHover", "isDisabled"] }, { kind: "component", type: i24.DataTableBodyComponent, selector: "[app-data-table-body]", inputs: ["rows", "viewColumns", "canInlineEdit", "isTreeGrid", "isOnlyView", "isOnlyViewRow", "isDeleteDisabled", "isEditable", "searchedRowCount$", "gridOptions", "search", "paginationParams", "hasEmptyRow", "isEditing", "isSaving", "isRowSelectionEnable", "isCloneVisible", "searchColumns", "selection", "isRowUnchecked", "onAddClick"], outputs: ["clickAction", "clickEdit", "clickEditCancel", "clickEditSave", "clickView", "clickDelete", "clickAdd", "clickRow", "changeExpandCollapse", "complexDetailClicked", "clickClone", "matExpansionPanelClicked", "CheckboxSelect"] }, { kind: "component", type: i25.DataColFilterComponent, selector: "app-data-col-filter", inputs: ["isClearFilter$", "isUpdatedFilterDesign", "columnName", "filterParam", "numberOfTableRefresh", "filterOption"], outputs: ["onFilterClicked"] }, { kind: "directive", type: i26.AuthorizedDirective, selector: "[hasPermission]", inputs: ["hasPermission", "hasPermissionElse"] }, { kind: "pipe", type: i11.AsyncPipe, name: "async" }, { kind: "pipe", type: i27.ColumnFilterPipe, name: "columnFilter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1428
+ }
1429
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
1430
+ type: Component,
1431
+ args: [{ selector: 'app-data-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
1432
+ {
1433
+ provide: DATA_TABLE_CONTEXT,
1434
+ useExisting: DataTableComponent,
1435
+ },
1436
+ ], template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n &nbsp;\n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"] }]
1437
+ }], ctorParameters: () => [{ type: i1.DataTableService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i4.SnackbarService }, { type: i5.UserManagementService }, { type: i6.ColumnFilterPipe }, { type: i7.SearchPipe }, { type: i8.LocalStorageService }, { type: i3.MatDialog }, { type: i9.FormService }, { type: i10.DataTableContextService }], propDecorators: { setDataTableBody: [{
1438
+ type: ViewChild,
1439
+ args: [DataTableBodyComponent, { static: false }]
1440
+ }], defaultRowValues: [{
1441
+ type: Input
1442
+ }], columns: [{
1443
+ type: Input
1444
+ }], getListFn: [{
1445
+ type: Input
1446
+ }], postItemFn: [{
1447
+ type: Input
1448
+ }], putItemFn: [{
1449
+ type: Input
1450
+ }], deleteItemFn: [{
1451
+ type: Input
1452
+ }], header: [{
1453
+ type: Input
1454
+ }], description: [{
1455
+ type: Input
1456
+ }], actionAddTitle: [{
1457
+ type: Input
1458
+ }], isIdColVisible: [{
1459
+ type: Input
1460
+ }], hasPagination: [{
1461
+ type: Input
1462
+ }], isOnlyView: [{
1463
+ type: Input
1464
+ }], isOnlyViewRow: [{
1465
+ type: Input
1466
+ }], isDeleteDisabled: [{
1467
+ type: Input
1468
+ }], isEditable: [{
1469
+ type: Input
1470
+ }], isCloneVisible: [{
1471
+ type: Input
1472
+ }], isLazyInitialization: [{
1473
+ type: Input
1474
+ }], objectName: [{
1475
+ type: Input
1476
+ }], gridOptions: [{
1477
+ type: Input
1478
+ }], isRowSelectionEnable: [{
1479
+ type: Input
1480
+ }], beforeSaveFn: [{
1481
+ type: Input
1482
+ }], onBeforeEdit: [{
1483
+ type: Input
1484
+ }], onAddClick: [{
1485
+ type: Input
1486
+ }], isRowUnchecked: [{
1487
+ type: Input
1488
+ }], isSaveDataLocal: [{
1489
+ type: Input
1490
+ }], scrollPosition: [{
1491
+ type: Input
1492
+ }], isTreeGrid: [{
1493
+ type: Input
1494
+ }], initialPage: [{
1495
+ type: Input
1496
+ }], changeLocalData: [{
1497
+ type: Output
1498
+ }], actionClick: [{
1499
+ type: Output
1500
+ }], onInitCompleted: [{
1501
+ type: Output
1502
+ }], onComplexDetailClicked: [{
1503
+ type: Output
1504
+ }], onEditClicked: [{
1505
+ type: Output
1506
+ }], onAddClicked: [{
1507
+ type: Output
1508
+ }], onRowClicked: [{
1509
+ type: Output
1510
+ }], onPageChanged: [{
1511
+ type: Output
1512
+ }], matExpansionPanelClicked: [{
1513
+ type: Output
1514
+ }], onUpdateCompleted: [{
1515
+ type: Output
1516
+ }], onDeleteCompleted: [{
1517
+ type: Output
1518
+ }], onScrolled: [{
1519
+ type: Output
1520
+ }], CheckboxSelect: [{
1521
+ type: Output
1522
+ }], isTableDataLoad: [{
1523
+ type: Output
1524
+ }], deleteModal: [{
1525
+ type: ViewChild,
1526
+ args: ['deleteModal', { read: TemplateRef, static: true }]
1527
+ }], customDataTable: [{
1528
+ type: ViewChild,
1529
+ args: ['customDataTable']
1530
+ }], sliderTemplate: [{
1531
+ type: ViewChild,
1532
+ args: ['sliderTemplate']
1533
+ }] } });
1534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDtBQUN4RCwwREFBMEQ7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFJcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUdBQXlHLENBQUM7QUFJdEosT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvRCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztB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QkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxXQUFXO3NCQUExQixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFlBQVk7c0JBQTVCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLHdCQUF3QjtzQkFBeEMsTUFBTTtnQkFDVSxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBQ1UsaUJBQWlCO3NCQUFqQyxNQUFNO2dCQUNVLFVBQVU7c0JBQTFCLE1BQU07Z0JBQ1UsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQU9BLFdBQVc7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUd0RCxlQUFlO3NCQURyQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFHckIsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29ydC1jbGFzcy1tZW1iZXJzL3NvcnQtY2xhc3MtbWVtYmVycyAqL1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9jb3JlL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvY29yZS9zZXJ2aWNlcy91c2VyLW1hbmFnZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25UeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvYWN0aW9uLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbkVudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc29ydC1kaXJlY3Rpb24uZW51bSc7XG5pbXBvcnQgeyBTb3VyY2VUeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc291cmNlLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgVG9vbFRpcHNQcm9wLCB0b29sdGlwc0RlZmF1bHRWYWx1ZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9lbnVtcy90b29sdGlwcy1wcm9wLmVudW0nO1xuaW1wb3J0IHsgQ29tbW9uQ29uZmlybU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnaWRwLWFwcHMtc2hhcmVkLXVpL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvbW9kYWxzL2NvbW1vbi1jb25maXJtLW1vZGFsL2NvbW1vbi1jb25maXJtLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUm93U2VsZWN0aW9uSW5mbyB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9pbnRlcmZhY2VzL3Jvdy1zZWxlY3Rpb24taW5mby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uRmlsdGVyUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9jb2x1bW4tZmlsdGVyLnBpcGUnO1xuaW1wb3J0IHsgU2VhcmNoUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9zZWFyY2gucGlwZSc7XG5pbXBvcnQgeyBjbG9uZSwgaXNGdW5jdGlvbiwgaXNVbmRlZmluZWQsIG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENoYW5nZVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvY29uc3RhbnRzL2NoYW5nZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2RhdGEtdGFibGUuY29uc3RhbnRzJztcbmltcG9ydCB7IENvbHVtbkRpc2FibGVNb2RlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi1kaXNhYmxlLW1vZGUuZW51bSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi10eXBlcy5lbnVtJztcbmltcG9ydCB7IEZvcm1UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2Zvcm0tdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2ljb25zLmVudW0nO1xuaW1wb3J0IHsgU25hY2tiYXJUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL3NuYWNrYmFyLmVudW0nO1xuaW1wb3J0IHsgSUZpbHRlclBhcmFtLCBJTGlzdFJlcVBhcmFtc0FwaSwgSUxpc3RSZXNBcGkgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2FwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgR3JpZE9wdGlvbnMsXG4gIElDaGVja2VkUm93RXZlbnQsXG4gIElDbGlja2VkRXZlbnREYXRhLFxuICBJRGF0YVRhYmxlQWN0aW9uLFxuICBJRGF0YVRhYmxlQ2hhbmdlTG9jYWxEYXRhRXZlbnQsXG4gIElEYXRhVGFibGVDb2x1bW4sXG4gIElEYXRhVGFibGVFeHBhbmRDb2xsYXBzZUV2ZW50LFxuICBJRGF0YVRhYmxlUm93LFxuICBJRGF0YVRhYmxlUm93RXZlbnQsXG4gIElEYXRhVGFibGVSb3dTYXZlRXZlbnQsXG4gIElSb3dEYXRhLFxuICBJVG9wUmlnaHRBY3Rpb24sXG59IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUtleVZhbHVlLCBJUGFnaW5hdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZ2VuZXJpYy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IERlbGV0ZUl0ZW1GbiwgR2V0TGlzdEZuLCBQb3N0SXRlbUZuLCBQdXRJdGVtRm4gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IERlbGV0ZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9kYWxzL2RlbGV0ZS1tb2RhbC9kZWxldGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbHRlck1hbmFnZXIgfSBmcm9tICcuLi9hcGktY2xhc3Nlcy9maWx0ZXItbWFuYWdlcic7XG5pbXBvcnQgeyBHcmlkQXBpIH0gZnJvbSAnLi4vYXBpLWNsYXNzZXMvZ3JpZC1hcGknO1xuaW1wb3J0IHsgQ09MVU1OX0lEIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbHVtbi1pZCc7XG5pbXBvcnQgeyBST1cgfSBmcm9tICcuLi9jb25zdGFudHMvcm93JztcbmltcG9ydCB7IERhdGFDb2xEaXNwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS1jb2wtZGlzcC9kYXRhLWNvbC1kaXNwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS10YWJsZS1ib2R5L2RhdGEtdGFibGUtYm9keS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSURhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERBVEFfVEFCTEVfQ09OVEVYVCwgRGF0YVRhYmxlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLXRhYmxlLWNvbnRleHQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsUG9zaXRpb24ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgaXNUcnVzdGVkOiBib29sZWFuO1xuICBjdXJyZW50U2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuICBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX1RBQkxFX0NPTlRFWFQsXG4gICAgICB1c2VFeGlzdGluZzogRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJRGF0YVRhYmxlQ29tcG9uZW50IHtcbiAgLy8gSW5saW5lIGVkaXQgc2V0dGluZ3NcbiAgcHVibGljIGdldCBjYW5JbmxpbmVFZGl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQ7XG4gIH1cblxuICBAVmlld0NoaWxkKERhdGFUYWJsZUJvZHlDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgc2V0IHNldERhdGFUYWJsZUJvZHkodGFibGVCb2R5OiBEYXRhVGFibGVCb2R5Q29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRhVGFibGVCb2R5ID0gdGFibGVCb2R5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93U2F2ZUNvbHVtblZpc2liaWxpdHlTZXR0aW5ncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFkZEFjdGlvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ3JpZE9wdGlvbnMuYWN0aW9uQWRkVGl0bGV9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaWV3QWN0aW9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5pc1Jvd0xldmVsVmlld0FjdGlvblZpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYm94UGxhY2Vob2xkZXIgPyB0aGlzLmdyaWRPcHRpb25zLnNlYXJjaGJveFBsYWNlaG9sZGVyIDogdGhpcy5oZWFkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVGFibGVJbkVkaXRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRpbmcgfHwgdGhpcy5oYXNFbXB0eVJvdztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFwaVJlcVBhcmFtcygpOiBJTGlzdFJlcVBhcmFtc0FwaSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBpdGVtc09uUGFnZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGZpbHRlclBhcmFtczogdGhpcy5wb3B1bGF0ZUZpbHRlclBhcmFtcygpLFxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0U29ydFBhcmFtcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGdldFNvcnRQYXJhbXMoKTogeyBzb3J0Qnk6IHN0cmluZzsgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbkVudW0gfSB7XG4gICAgY29uc3QgcGFybWFzID0gW107XG4gICAgT2JqZWN0LmtleXModGhpcy5zb3J0ZWRDb2x1bW4pLmZvckVhY2goKHgpID0+IHtcbiAgICAgIHBhcm1hcy5wdXNoKHsgc29ydEJ5OiB4LCBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnRlZENvbHVtblt4XSB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFybWFzLmxlbmd0aCA/IHBhcm1hc1swXSA6IHt9O1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IElDT05TOiB0eXBlb2YgSWNvbnMgPSBJY29ucztcbiAgcHVibGljIHJlYWRvbmx5IHNvcnREaXJlY3Rpb25FbnVtOiB0eXBlb2YgU29ydERpcmVjdGlvbkVudW0gPSBTb3J0RGlyZWN0aW9uRW51bTtcbiAgcHVibGljIHJlYWRvbmx5IHRvb2xUaXBzOiB0eXBlb2YgVG9vbFRpcHNQcm9wID0gVG9vbFRpcHNQcm9wO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uVHlwZXM6IHR5cGVvZiBBY3Rpb25UeXBlc0VudW0gPSBBY3Rpb25UeXBlc0VudW07XG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBR0VfU0laRTogbnVtYmVyID0gRGF0YVRhYmxlQ29uc3RhbnRzLkRFRkFVTFRfUEFHRV9TSVpFO1xuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9JTklUX1BBR0U6IG51bWJlciA9IERhdGFUYWJsZUNvbnN0YW50cy5ERUZBVUxUX0lOSVRfUEFHRTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlybWF0aW9uTXNnUGFnaW5hdGlvbjogc3RyaW5nID0gYFNlbGVjdGVkIGNoZWNrYm94IHdpbGwgYmUgbG9zdCBgO1xuICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdFJvd1ZhbHVlczogSUtleVZhbHVlID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRMaXN0Rm46IEdldExpc3RGbjtcbiAgQElucHV0KCkgcHVibGljIHBvc3RJdGVtRm46IFBvc3RJdGVtRm47XG4gIEBJbnB1dCgpIHB1YmxpYyBwdXRJdGVtRm46IFB1dEl0ZW1GbjtcbiAgQElucHV0KCkgcHVibGljIGRlbGV0ZUl0ZW1GbjogRGVsZXRlSXRlbUZuO1xuICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25BZGRUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgaXNJZENvbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGhhc1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5VmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5Vmlld1Jvdz86IChyb3c6IElEYXRhVGFibGVSb3cpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBpc0RlbGV0ZURpc2FibGVkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzRWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNDbG9uZVZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNMYXp5SW5pdGlhbGl6YXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIG9iamVjdE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucztcbiAgQElucHV0KCkgcHVibGljIGlzUm93U2VsZWN0aW9uRW5hYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBiZWZvcmVTYXZlRm4/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBvbkJlZm9yZUVkaXQ/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIG9uQWRkQ2xpY2s/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzUm93VW5jaGVja2VkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzU2F2ZURhdGFMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuXG4gIC8vIFRyZWUgZ3JpZCBzZXR0aW5nc1xuICBASW5wdXQoKSBwdWJsaWMgaXNUcmVlR3JpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBpbml0aWFsUGFnZTogbnVtYmVyO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlTG9jYWxEYXRhOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZUNoYW5nZUxvY2FsRGF0YUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBhY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVBY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uSW5pdENvbXBsZXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25Db21wbGV4RGV0YWlsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPElDbGlja2VkRXZlbnREYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNsaWNrZWRFdmVudERhdGE+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25FZGl0Q2xpY2tlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvbkFkZENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uUm93Q2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25QYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgbWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZVJvd0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvblVwZGF0ZUNvbXBsZXRlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25EZWxldGVDb21wbGV0ZWQ6IEV2ZW50RW1pdHRlcjxJRGF0YVRhYmxlUm93RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uU2Nyb2xsZWQ6IEV2ZW50RW1pdHRlcjxTY3JvbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcHVibGljIENoZWNrYm94U2VsZWN0OiBFdmVudEVtaXR0ZXI8SVJvd1NlbGVjdGlvbkluZm8+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGlzVGFibGVEYXRhTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHVibGljIHNlYXJjaFZhbHVlOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwdWJsaWMgc2VhcmNoQ29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdO1xuICBwdWJsaWMgaXNTZWFyY2hEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2VsZWN0ZWRSb3c6IElEYXRhVGFibGVSb3c7XG4gIHB1YmxpYyBmaWx0ZXJlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgQFZpZXdDaGlsZCgnZGVsZXRlTW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRlbGV0ZU1vZGFsOiBUZW1wbGF0ZVJlZjxEZWxldGVNb2RhbENvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbURhdGFUYWJsZScpXG4gIHB1YmxpYyBjdXN0b21EYXRhVGFibGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdzbGlkZXJUZW1wbGF0ZScpXG4gIHB1YmxpYyBzbGlkZXJUZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZjtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZVR5cGVzOiB0eXBlb2YgU291cmNlVHlwZXNFbnVtID0gU291cmNlVHlwZXNFbnVtO1xuICBwdWJsaWMgZGF0YVRhYmxlQm9keTogRGF0YVRhYmxlQm9keUNvbXBvbmVudDtcbiAgcHVibGljIGdyaWRBcGk6IEdyaWRBcGk7XG4gIHB1YmxpYyBtYXN0ZXJTZWxlY3Rpb246IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlKTtcbiAgcHVibGljIHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zID0ge1xuICAgIGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLFxuICAgIHBhZ2VTaXplOiB0aGlzLkRFRkFVTFRfUEFHRV9TSVpFLFxuICB9O1xuICBwdWJsaWMgc2VhcmNoZWRSb3dDb3VudCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHB1YmxpYyBpc0NsZWFyRmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHB1YmxpYyBpc0ZpbHRlclZpZXcgPSBmYWxzZTtcbiAgcHVibGljIHZpZXdDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHB1YmxpYyByb3dzOiBJRGF0YVRhYmxlUm93W107XG4gIHB1YmxpYyBleGNsdWRlZFJvd3M6IElEYXRhVGFibGVSb3dbXSA9IFtdO1xuICBwdWJsaWMgc29ydGVkQ29sdW1uID0ge307XG4gIHB1YmxpYyBjb3VudDogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgZmlsdGVyTWFuYWdlcjogRmlsdGVyTWFuYWdlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBoYXNFbXB0eVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNFZGl0aW5nID0gZmFsc2U7XG4gIHB1YmxpYyBpc1NhdmluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyByb3dUb0RlbGV0ZTogSURhdGFUYWJsZVJvdztcbiAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8SURhdGFUYWJsZVJvdz47XG5cbiAgcHVibGljIG1hcCA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgbnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAwO1xuICBwcml2YXRlIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgb3JpZ2luYWxVbnNvcnRlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgcHJpdmF0ZSBjbGVhclN1YnMkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgdG90YWxJdGVtczogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlc2l6aW5nVGg6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXBvbGxvRGF0YVRhYmxlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc2l6aW5nVGQ6IE5vZGVMaXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2xpY2tUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0R3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zID0ge1xuICAgIGFkZElkQ29sdW1uOiB0cnVlLFxuICAgIGFjdGlvbkFkZFRpdGxlOiAnJyxcbiAgICBhbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M6IGZhbHNlLFxuICAgIGlzUm93TGV2ZWxWaWV3QWN0aW9uVmlzaWJsZTogdHJ1ZSxcbiAgICBpc09ubHlWaWV3OiBmYWxzZSxcbiAgICBpc1Jvd1NlbGVjdGlvbkVuYWJsZTogZmFsc2UsXG4gICAgaWRQcm9wZXJ0eTogQ09MVU1OX0lELlBST1AsXG4gICAgaXNDbGllbnRTaWRlUGFnaW5hdGlvbjogdHJ1ZSxcbiAgICBjYW5JbmxpbmVBZGQ6IHRydWUsXG4gICAgY2FuSW5saW5lRWRpdDogdHJ1ZSxcbiAgICBpc1NhdmVEYXRhTG9jYWw6IGZhbHNlLFxuICAgIGlzU2VhcmNoQm94VmlzaWJsZTogdHJ1ZSxcbiAgICBpc0ZpbHRlckVuYWJsZWQ6IGZhbHNlLFxuICAgIGZpbHRlcmFibGVDb2x1bW5zOiBbXSxcbiAgICBkZWZhdWx0U29ydFByb3BlcnR5OiB7fSxcbiAgICBjbG9uZU9wdGlvbnM6IHtcbiAgICAgIGNvcHlPZkNsb25hYmxlUHJvcGVydGllczogW10sXG4gICAgICBlbXB0eVZhbHVlUHJvcGVydGllczogW10sXG4gICAgfSxcbiAgICBzZWFyY2hhYmxlUHJvcGVydGllczogW10sXG4gICAgc29ydGFibGVQcm9wZXJ0aWVzOiBbXSxcbiAgICBpc1Jvd0FjdGlvblZpc2libGU6IHRydWUsXG4gICAgdG9wUmlnaHRBY3Rpb25zOiBbXSxcbiAgICBkZWxldGVPcHRpb25zOiB7fSxcbiAgICBzZWFyY2hib3hQbGFjZWhvbGRlcjogdGhpcy5oZWFkZXIsXG4gICAgcmVmcmVzaE9uQWRkOiB0cnVlLFxuICAgIHRvcExlZnRBZGRpdGlvbmFsQWN0aW9uczogW10sXG4gICAgaXNTb3J0RW5hYmxlZDogZmFsc2UsXG4gICAgZGlzYWJsZUljb25zOiB7XG4gICAgICBhZGQ6IGZhbHNlLFxuICAgICAgZWRpdDogZmFsc2UsXG4gICAgICBkZWxldGU6IGZhbHNlLFxuICAgICAgY2xvbmU6IGZhbHNlLFxuICAgICAgYWRkJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBlZGl0JDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBkZWxldGUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICB9LFxuICAgIGdyaWRNZW51T3B0aW9uczoge1xuICAgICAgaXNNZW51RW5hYmxlZDogZmFsc2UsXG4gICAgICBtZW51SXRlbXM6IFtdLFxuICAgIH0sXG4gICAgYWN0aW9uTG9hZGluZyQ6IHtcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGVkaXQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGRlbGV0ZSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGFUYWJsZVNlcnZpY2U6IERhdGFUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzbmFja2JhclNlcnZpY2U6IFNuYWNrYmFyU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJNYW5hZ2VtZW50U2VydmljZTogVXNlck1hbmFnZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyUGlwZTogQ29sdW1uRmlsdGVyUGlwZSxcbiAgICBwcml2YXRlIHNlYXJjaFBpcGU6IFNlYXJjaFBpcGUsXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVRhYmxlQ29udGV4dDogRGF0YVRhYmxlQ29udGV4dFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyID0gbmV3IEZpbHRlck1hbmFnZXIoKTtcbiAgICB0aGlzLmdyaWRBcGkgPSBuZXcgR3JpZEFwaSh0aGlzLCB0aGlzLmZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuc2V0RGF0YVRhYmxlQ29tcG9uZW50KHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRTZWxlY3RlZFJvd3MoKTogSURhdGFUYWJsZVJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZERhdGFSb3codGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRBbGxDaGVja2VkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3Rpb25zRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ2V0Um93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkRGF0YVJvdyh0aGlzLnJvd3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRDdXN0b21UYWJsZVN0eWxlKCk6IElLZXlWYWx1ZSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNJbm5lclNjcm9sbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA/IHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA6IHsgaGVpZ2h0OiAnMzB2aCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIG9uVGFibGVTY3JvbGxlZChlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBldmVudDogU2Nyb2xsRXZlbnQgPSB7XG4gICAgICAuLi5lLFxuICAgICAgY3VycmVudEVsZW1lbnQ6IHRoaXMuY3VzdG9tRGF0YVRhYmxlLFxuICAgICAgY3VycmVudFNjcm9sbFBvc2l0aW9uOiB7IHg6IGh0bWxFbGVtZW50LnNjcm9sbExlZnQsIHk6IGh0bWxFbGVtZW50LnNjcm9sbFRvcCB9LFxuICAgIH07XG4gICAgdGhpcy5vblNjcm9sbGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVNjcm9sbFBvc2l0aW9uKHBvc2l0aW9uOiBTY3JvbGxQb3NpdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBodG1sRWxlbWVudC5zY3JvbGwocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF6eUluaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnNlYXJjaFRhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRGlzYWJsZWRNYWluQWN0aW9uKGFjdGlvblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29uc1thY3Rpb25Qcm9wXTtcbiAgfVxuXG4gIHB1YmxpYyBub25GaWx0ZXJDbGFzc05hbWUoY29sdW1uUHJvcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcCkgJiYgdGhpcy5pc1Jvd1NlbGVjdGlvbkVuYWJsZSkge1xuICAgICAgcmV0dXJuICdyb3ctc2VsZWN0aW9uLW5vbi1maWx0ZXItY2VsbCc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0ZpbHRlckVuYWJsZShjb2x1bW5Qcm9wKSkge1xuICAgICAgcmV0dXJuICdub24tZmlsdGVyLWNlbGwnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUluRWRpdFN0YXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZCAmJiAoIXRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMubGVuZ3RoIHx8IHRoaXMuaXNGaWx0ZXJhYmxlQ29sdW1uKGNvbHVtblByb3ApKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmFibGVDb2x1bW4oY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmlsdGVyQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5vbkRpc2FibGVkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSkge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gIXRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKHJvdykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlyZUluaXRDb21wbGV0ZWQoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxQb3NpdGlvbikge1xuICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSB0aGlzLmN1c3RvbURhdGFUYWJsZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxQb3NpdGlvbi55O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsUG9zaXRpb24ueDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hlY2tEZWxldGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmlzRGVsZXRlRGlzYWJsZWQpICYmICFpc1VuZGVmaW5lZCh0aGlzLnNlbGVjdGVkUm93KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEZWxldGVEaXNhYmxlZCh0aGlzLnNlbGVjdGVkUm93KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWxldGVEaXNhYmxlZCAmJiB0eXBlb2YgdGhpcy5pc0RlbGV0ZURpc2FibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubm9uRGlzYWJsZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmIHRoaXMuZXhjbHVkZWRSb3dzLmxlbmd0aCA9PT0gMCkgfHwgdGhpcy50b3RhbEl0ZW1zID09PSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMgJiYgdGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMuZmluZCgoeCkgPT4geCA9PT0gdmlld0NvbHVtbi5wcm9wKSk7XG4gIH1cblxuICBwdWJsaWMgb3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKTogdm9pZCB7XG4gICAgbGV0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcbiAgICBkaWFsb2dDb25maWcgPSB0aGlzLmNvbmZpZ3VyZURpYWxvZyhkaWFsb2dDb25maWcpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGF0YUNvbERpc3BDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnN0YXR1cyA9PT0gJ09LJykge1xuICAgICAgICB0aGlzLnZpZXdDb2x1bW5zID0gcmVzdWx0LmNvbHVtbnM7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1hc3RlclRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4Y2x1ZGVkUm93cyA9IFtdO1xuICAgIGlmICghdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgIXRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmNoZWNrZWRBbGxFeGNlcHRFeGNsdWRlZFJvd3MoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXN0ZXJUb2dnbGVDbGllbnRTaWRlKCk7XG4gICAgICB0aGlzLkNoZWNrYm94U2VsZWN0LmVtaXQoeyByb3dzOiB0aGlzLnJvd3MsIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0NoZWNrYm94U2VsZWN0KHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gICAgaWYgKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmICFpc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5wdXNoKHJvdyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlclNlbGVjdGlvbi52YWx1ZSAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmV4Y2x1ZGVkUm93cy5maW5kSW5kZXgoKHgpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeShyb3cpKTtcbiAgICAgIGlmIChmaW5kSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5DaGVja2JveFNlbGVjdC5lbWl0KHsgcm93czogW3Jvd10sIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiBpc1NlbGVjdGVkIH0pO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IChyb3cuaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrZWRSb3dzID0gdGhpcy5ncmlkQXBpLmdldEFsbENoZWNrZWRSb3dzKCk7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm93ICYmIGNoZWNrZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBjaGVja2VkUm93c1tjaGVja2VkUm93cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQWN0aW9uKGFjdGlvbjogSURhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChhY3Rpb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tBZGQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkFkZENsaWNrZWQuZW1pdCgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMub25BZGRDbGljaykgJiYgIXRoaXMub25BZGRDbGljayh1bmRlZmluZWQsIHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25IYW5kbGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQWN0aW9uSGFuZGxlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldElkQ29sdW1uKCk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7IGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLCBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSB9KTtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0VmFsdWUoRGF0YVRhYmxlQ29uc3RhbnRzLkVNUFRZKTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQpIHtcbiAgICAgIGlmICghdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgICB0aGlzLmFkZEVtcHR5Um93KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2aWdhdGVQYWdlKEZvcm1UeXBlcy5BZGQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrUm93KGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLmdyaWRBcGkuZ2V0QWxsQ2hlY2tlZFJvd3MoKTtcbiAgICBpZiAoY2hlY2tlZFJvd3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IGV2ZW50RGF0YS5yb3c7XG4gICAgZXZlbnREYXRhLnJvdy5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICBjb25zdCBlbWl0SW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICAgID8gZXZlbnREYXRhLnJvdy5yb3dJbmRleCArIHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpXG4gICAgICA6IGV2ZW50RGF0YS5yb3cucm93SW5kZXg7XG5cbiAgICB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ID0gZW1pdEluZGV4O1xuICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoZXZlbnREYXRhLnJvdyk7XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1Jvd0FkZChldmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUFkZCAmJiAhdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgdGhpcy5hZGRFbXB0eVJvdyhldmVudERhdGEucm93LmRlcHRoICsgMSwgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja0VkaXQoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLm9uQmVmb3JlRWRpdCkgJiYgIXRoaXMub25CZWZvcmVFZGl0KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uRWRpdENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQpIHtcbiAgICAgIGlmICghdGhpcy5pc0VkaXRpbmcpIHtcbiAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nKGV2ZW50RGF0YS5yb3csIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5FZGl0LCB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0Um93SWQoZXZlbnREYXRhLnJvdykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQ2xvbmUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQgJiYgIXRoaXMuaGFzRW1wdHlSb3cpIHtcbiAgICAgIGNvbnN0IG5ld0V2ZW50RGF0YSA9IGNsb25lRGVlcChldmVudERhdGEpO1xuICAgICAgdGhpcy5hZGRDbG9uZVJvdyhuZXdFdmVudERhdGEucm93KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1ZpZXcoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5WaWV3LCB0aGlzLmdldE5hdmlnYXRlSXRlbVZhbHVlKGV2ZW50RGF0YSkpO1xuICB9XG5cbiAgcHVibGljIENvbXBsZXhEZXRhaWxDbGlja2VkKGV2ZW50RGF0YTogSUNsaWNrZWRFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ29tcGxleERldGFpbENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICB9XG5cbiAgcHVibGljIEFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb246IElUb3BSaWdodEFjdGlvbik6IHZvaWQge1xuICAgIGlmIChhY3Rpb24uY2xpY2tlZCkge1xuICAgICAgYWN0aW9uLmNsaWNrZWQodGhpcy5zZWxlY3RlZFJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dIaWRlRmlsdGVyVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmlzRmlsdGVyVmlldyA9ICF0aGlzLmlzRmlsdGVyVmlldztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckdsb2JhbEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyLmNsZWFyRmlsdGVyUGFyYW1zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlKHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zLCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhZ2luYXRpb25EYXRhKHBhZ2luYXRpb25QYXJhbXMpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YShzZWxlY3RhYmxlSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkgJiYgdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIGlmIChzZWxlY3RhYmxlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKSArIHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblBhZ2VDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkV4cGFuc2lvblBhbmVsQ2xpY2soZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1hdEV4cGFuc2lvblBhbmVsQ2xpY2tlZC5lbWl0KGV2ZW50RGF0YSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlU2l6ZShwYWdlU2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemUpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJQYXJhbShjb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBJRmlsdGVyUGFyYW0ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW0oY29sdW1uKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmVkQ29sdW1uKGNvbHVtblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmZpbHRlckNvbHVtbi5wcm9wID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDbGlja2VkKGZpbHRlclBhcmFtOiBJRmlsdGVyUGFyYW0pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1hbmFnZXIuc2V0RmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZmlsdGVyUGlwZS50cmFuc2Zvcm0oXG4gICAgICB0aGlzLnJvd3MsXG4gICAgICB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCksXG4gICAgICB0aGlzLmNvbHVtbnMsXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICApO1xuICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAxLjU7IC8vIHRvIHNraXAgaW5pdCBmaWx0ZXIgdmFsdWUgYXNzaWduXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0Q2FuY2VsKGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pc1NlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlU2VydmljZS5pc0VtcHR5Um93KGV2ZW50RGF0YS5yb3cpKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Um93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZyhldmVudERhdGEucm93LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0U2F2ZShldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmJlZm9yZVNhdmVGbikgJiYgIXRoaXMuYmVmb3JlU2F2ZUZuKHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NhdmVEYXRhTG9jYWwpIHtcbiAgICAgIHRoaXMub25TYXZlTG9jYWxSb3coZXZlbnREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZlUm93KGV2ZW50RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhOiBJRGF0YVRhYmxlRXhwYW5kQ29sbGFwc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlUm93RXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNob3VsZEV4cGFuZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmF2aWdhdGVJdGVtVmFsdWUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvblByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFZhbHVlQnlQcm9wZXJ0eU5hbWUoZXZlbnREYXRhLnJvdywgdGhpcy5ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uUHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpO1xuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9JdGVtKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5ncmlkT3B0aW9ucy5lZGl0RXh0cmFSb3V0ZVBhcmFtID8gYCR7dHlwZX0vJHtpZH0vJHt0aGlzLmdyaWRPcHRpb25zLmVkaXRFeHRyYVJvdXRlUGFyYW19YCA6IGAke3R5cGV9LyR7aWR9YDtcbiAgICB0aGlzLm5hdmlnYXRlUGFnZSh1cmwpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tEZWxldGVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5EZWxldGVNb2RhbChldmVudERhdGEucm93KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrRGVsZXRlTW9kYWwoc2hvdWxkRGVsZXRlKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZERlbGV0ZSkge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucz8uYWN0aW9uTG9hZGluZyQ/LmRlbGV0ZSQubmV4dCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmlzU2F2ZURhdGFMb2NhbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUxvY2FsUm93KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dJZCh0aGlzLnJvd1RvRGVsZXRlKSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfREVMRVRFRCk7XG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZWxldGVSb3codGhpcy5yb3dUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFZpc2libGVDb2x1bW5MaXN0Q2hhbmdlZChjb2x1bW5MaXN0OiBJRGF0YVRhYmxlQ29sdW1uW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zID0gY29sdW1uTGlzdDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyU3VicyQubmV4dChudWxsKTtcbiAgICB0aGlzLmNsZWFyU3VicyQuY29tcGxldGUoKTtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuaXNDbGVhckZpbHRlciQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuY2xlYXJEYXRhVGFibGVDb21wb25lbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSBtZXJnZSh0aGlzLmRlZmF1bHRHcmlkT3B0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7XG4gICAgICBjdXJyZW50UGFnZTogaXNVbmRlZmluZWQodGhpcy5pbml0aWFsUGFnZSkgPyB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFIDogdGhpcy5pbml0aWFsUGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPElEYXRhVGFibGVSb3c+KCF0aGlzLmlzU2luZ2xlU2VsZWN0LCBbXSk7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydGVkQ29sdW1ucyA9IGNsb25lKHRoaXMudmlld0NvbHVtbnMpO1xuICAgIH1cbiAgICB0aGlzLmdldENvbmZpZ3VyZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgc29ydFRhYmxlKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1RhYmxlSW5FZGl0U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuc29ydGFibGVQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT09IHZpZXdDb2x1bW4ucHJvcCkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNTb3J0RW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0ge307XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID0gU29ydERpcmVjdGlvbkVudW0uQVNDO1xuICAgICAgdGhpcy5zb3J0RGF0YSh2aWV3Q29sdW1uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF0gPT09IFNvcnREaXJlY3Rpb25FbnVtLkFTQykge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXSA9IFNvcnREaXJlY3Rpb25FbnVtLkRFU0M7XG4gICAgICB0aGlzLnNvcnREYXRhKHZpZXdDb2x1bW4sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICAgIHRoaXMuc29ydERhdGEodmlld0NvbHVtbiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVSb3cocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyk7XG4gICAgdGhpcy5kZWxldGVJdGVtRm4ocm93SWQsIHJvdy5kYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXJTZXJ2aWNlLnN1Y2Nlc3MoU25hY2tiYXJUeXBlcy5EZWxldGVkLCBTbmFja2JhclR5cGVzLkRlbGV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVMb2NhbFJvdyhyb3dJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uRGVsZXRlQ29tcGxldGVkLmVtaXQoeyByb3c6IHRoaXMuc2VsZWN0ZWRSb3cgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgbWV0aG9kIGJsb2NrLlxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoTW9kZWxDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gdGhpcy5zZWFyY2hQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgdGhpcy5yb3dzLFxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlLFxuICAgICAgICB0aGlzLnNlYXJjaENvbHVtbnMsXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbixcbiAgICAgICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHMgJiYgdGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHNbdGV4dF0pIHtcbiAgICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmljb25Ub29sdGlwc1t0ZXh0XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvb2x0aXBzRGVmYXVsdFZhbHVlW3RleHRdO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGlvbk5hbWUocHJvcDogQWN0aW9uVHlwZXNFbnVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51c2VyTWFuYWdlbWVudFNlcnZpY2UuZ2V0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0QWN0aW9uTmFtZShwcm9wOiBBY3Rpb25UeXBlc0VudW0pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VtZW50U2VydmljZS5nZXRMZWZ0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGRhdGE6IElLZXlWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEudGl0bGUpIHtcbiAgICAgIHJldHVybiBkYXRhLnRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gdG9vbHRpcHNEZWZhdWx0VmFsdWVbZGF0YS50aXRsZV07XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU2luZ2xlU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTaW5nbGVTZWxlY3QgPT09IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlO1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3ROZXh0Um93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTGFzdFJvd0luUGFnZSgpKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSB0aGlzLmlzTGFzdFJvd0luTGFzdFBhZ2UoKSA/IDEgOiB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgKyAxO1xuICAgICAgdGhpcy5vbkNoYW5nZVBhZ2UodGhpcy5wYWdpbmF0aW9uUGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdFByZXZpb3VzUm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlID0gdGhpcy5pc0ZpcnN0Um93SW5GaXJzdFBhZ2UoKSA/IHRoaXMucGFnZXNDb3VudCA6IHRoaXMucGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZSAtIDE7XG4gICAgICB0aGlzLm9uQ2hhbmdlUGFnZSh0aGlzLnBhZ2luYXRpb25QYXJhbXMsICdsYXN0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdE5leHRSb3codGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmNoZWNrU2VsZWN0ZWRTb3VyY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIG9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaW5kZXg6IG51bWJlciwgdmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kcmFnZ2FibGUgfHwgIXZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGhbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgIGlmICghdGhpcy5yZXNpemluZ1RoIHx8ICF0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQgPSAhdmlld0NvbHVtbi5kb3VibGVDbGlja2VkO1xuICAgIHZpZXdDb2x1bW4uZHJhZ2dlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybWF0VGFibGVEYXRhKHZpZXdDb2x1bW4pO1xuICAgIHRoaXMuZm9ybWF0VGFibGVIZWFkZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWFkZXJTdHlsZShpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZpZXdDb2x1bW5zW2luZGV4XS5kcmFnZ2VkIHx8IHZpZXdDb2x1bW4/LmRvdWJsZUNsaWNrZWQgPT09IHRydWUpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZHJhZy1jb2x1bW4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnaGVhZGVyLW1heC13aWR0aCcpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgcHVibGljIG9uU2VwYXJhdG9yTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLmNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZSB8fCAhdmlld0NvbHVtbi5kcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZpZXdDb2x1bW4uZHJhZ2dlZCkge1xuICAgICAgICB2aWV3Q29sdW1uLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNpemluZ1RoID0gdGhpcy5nZXRTZWxlY3RlZEh0bWwoYHRoW2RhdGEtY29sdW1uLXByb3A9XCIke3ZpZXdDb2x1bW4ucHJvcH1cIl0gZGl2YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgICAgY29uc3QgdGREaXYgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuYXBvbGxvRGF0YVRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGUnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKHRoaXMucmVzaXppbmdUaCkge1xuICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnBhZ2VYO1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSB0aGlzLmdldEFjdHVhbFdpZHRoKHRoaXMucmVzaXppbmdUaCwgdGhpcy5zdGFydFgpO1xuICAgICAgICBjb25zdCB0ZERpdldpZHRoID0gdGhpcy5nZXRBY3R1YWxXaWR0aCh0ZERpdiwgdGhpcy5zdGFydFgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZGF0YS1tYXgtd2lkdGgnKTtcbiAgICAgICAgICAgIHRkRGl2LmNsYXNzTGlzdC5hZGQoJ2RyYWctY29sdW1uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHRoaXMuc3RhcnRXaWR0aCwgdGREaXZXaWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICAgIH1cbiAgICB9LCAyNTApO1xuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCduby1zZWxlY3QtcmVzaXplJyk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZHJhZ2dhYmxlICYmIHZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEh0bWwoc2VsZWN0b3I6IHN0cmluZywgaXNTZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChpc1NlbGVjdEFsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRhYmxlRGF0YSh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgaWYgKCF2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQpIHtcbiAgICAgIHRoaXMucmVzaXppbmdUZC5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRkRGl2ID0gKDxIVE1MRWxlbWVudD5jZWxsKS5xdWVyeVNlbGVjdG9yKCdkaXYnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1jb2x1bW4nKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNpemluZ1RkLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QucmVtb3ZlKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkcmFnLWNvbHVtbicpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUYWJsZUhlYWRlcigpIHtcbiAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSAnJztcbiAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGREaXYuc3R5bGUud2lkdGggPSAnJztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIChldmVudC5wYWdlWCAtIHRoaXMuc3RhcnRYKTtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHdpZHRoLCB3aWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ25vLXNlbGVjdC1yZXNpemUnKTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSBudWxsO1xuICAgIHRoaXMucmVzaXppbmdUZCA9IG51bGw7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRXaWR0aFRvRWxlbWVudCh0aFdpZHRoOiBudW1iZXIsIHRkV2lkdGg6IG51bWJlciwgcHJldmlvdXNUaFdpZHRoOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSBgJHt0aFdpZHRofXB4YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemluZ1RkKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5kcmFnLWNvbHVtbicpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChkaXYpIHtcbiAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSBgJHt0ZFdpZHRofXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzaXppbmdUaCAmJiB0aGlzLmFwb2xsb0RhdGFUYWJsZSkge1xuICAgICAgY29uc3QgdXBkYXRlZFRhYmxlV2lkdGggPSB0aGlzLmFwb2xsb0RhdGFUYWJsZS5vZmZzZXRXaWR0aCArICh0aGlzLnJlc2l6aW5nVGgub2Zmc2V0V2lkdGggLSBwcmV2aW91c1RoV2lkdGgpO1xuICAgICAgdGhpcy5hcG9sbG9EYXRhVGFibGUuc3R5bGUud2lkdGggPSBgJHt1cGRhdGVkVGFibGVXaWR0aH1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3R1YWxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCwgc3RhcnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCB3aWR0aDogbnVtYmVyO1xuICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgd2lkdGggPSBib3VuZGluZ1JlY3Qud2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICBpZiAob2Zmc2V0IDwgYm91bmRpbmdSZWN0LndpZHRoKSB7XG4gICAgICB3aWR0aCA9IG9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldCBwYWdlc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmNvdW50IC8gdGhpcy5wYWdlU2l6ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dzQ291bnRJbkN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Um93cyA9IHRoaXMucm93cy5sZW5ndGggLSB0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKTtcbiAgICByZXR1cm4gbGVmdFJvd3MgPj0gdGhpcy5wYWdlU2l6ZSA/IHRoaXMucGFnZVNpemUgOiBsZWZ0Um93cztcbiAgfVxuXG4gIHByaXZhdGUgaXNMYXN0Um93SW5QYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93ICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggKyAxKSAvIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZSB8fCB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSA9PT0gdGhpcy5jb3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3cgJiYgdGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCArIDEgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvdyAmJiB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICUgdGhpcy5wYWdlU2l6ZSA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSAmJiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xhc3RSb3dJbkxhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTGFzdFJvd0luUGFnZSgpICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnZXNDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Um93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IGNsb25lKHRoaXMucm93cyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SWRDb2x1bW4oKTogdm9pZCB7XG4gICAgLy8gVG8gZG8gaW1wcm92ZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSkge1xuICAgICAgQ09MVU1OX0lELlBST1AgPSB0aGlzLmdyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENPTFVNTl9JRC5QUk9QID0gJ2lkJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFZpZXdDb2x1bW5zKCk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5hZGRJZENvbHVtbikge1xuICAgICAgdGhpcy5hZGRJZENvbHVtbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGlhbG9nKGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnKTogTWF0RGlhbG9nQ29uZmlnIHtcbiAgICBkaWFsb2dDb25maWcucG9zaXRpb24gPSB7XG4gICAgICB0b3A6ICcxNXZoJyxcbiAgICAgIGxlZnQ6ICcyMHZ3JyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5oZWlnaHQgPSAnODB2aCc7XG4gICAgZGlhbG9nQ29uZmlnLndpZHRoID0gJzYwdncnO1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2NvbHVtbnNob3doaWRlLXBhbmVsJztcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcbiAgICAgIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiB0aGlzLmRlZmF1bHRTb3J0ZWRDb2x1bW5zLFxuICAgICAgY29sdW1uczogdGhpcy52aWV3Q29sdW1ucyxcbiAgICAgIHN0b3JhZ2VLZXk6IHRoaXMuc3RvcmFnZUtleSxcbiAgICAgIG1ldGFEYXRhQ29sdW1uczogdGhpcy5ncmlkT3B0aW9ucy5tZXRhRGF0YUNvbHVtbnMsXG4gICAgfTtcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gZmFsc2U7XG4gICAgcmV0dXJuIGRpYWxvZ0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZpZXdDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMudmlld0NvbHVtbnMgPSBjbG9uZSh0aGlzLmNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCkpO1xuICAgIHRoaXMudmlld0NvbHVtbnMuZm9yRWFjaCgodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNWaXNpYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNEaXNwbGF5VmFsdWVBc0Zvcm1Db250cm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2wgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNlYXJjaENvbHVtbnMgPSB0aGlzLmdldFNlYXJjaGFibGVDb2x1bW5zKHRoaXMudmlld0NvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zLnVuc2hpZnQoe1xuICAgICAgaGVhZGVyOiBDT0xVTU5fSUQuSEVBREVSLFxuICAgICAgcHJvcDogQ09MVU1OX0lELlBST1AsXG4gICAgICB0eXBlOiBDb2x1bW5UeXBlcy5JbnRlZ2VyLFxuICAgICAgaXNSZWFkT25seTogdHJ1ZSxcbiAgICAgIGlzVmlzaWJsZTogZmFsc2UsIC8vIHRoaXMuaXNJZENvbFZpc2libGUsXG4gICAgICBpc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2w6IGZhbHNlLFxuICAgICAgZWRpdERpc2FibGVkTW9kZTogQ29sdW1uRGlzYWJsZU1vZGVzLkFsd2F5c0Rpc2FibGVkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhKHNlbGVjdGFibGVJbmRleD86IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggKz0gMTtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuaXNBdXRvQ29sdW1uKSB7XG4gICAgICB0aGlzLnNldEluaXRBcGlQYXJhbXMoKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk7XG4gICAgdGhpcy5nZXRMaXN0Rm4odGhpcy5hcGlSZXFQYXJhbXMpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gVE9ETzogYWRkIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzcG9uc2UuaXRlbXNUb3RhbDtcbiAgICAgICAgICB0aGlzLmluaXRHZXRGdW5jKHJlc3BvbnNlLCBzZWxlY3RhYmxlSW5kZXgpO1xuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzRGVmYXVsdEFsbFJvd1NlbGVjdGVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24uc2V0VmFsdWUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm1hc3RlclRvZ2dsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzVGFibGVEYXRhTG9hZC5lbWl0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgTWV0aG9kIGJsb2NrXG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRBcGlQYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SW5pdEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0RmlsdGVyUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5zZXRJbml0RmlsdGVyUGFyYW1zKHRoaXMuY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRHZXRGdW5jKHJlc3BvbnNlOiBJTGlzdFJlc0FwaTxJS2V5VmFsdWU+LCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ID0gdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uID8gcmVzcG9uc2UucmVzdWx0U2V0Lmxlbmd0aCA6IHJlc3BvbnNlLml0ZW1zVG90YWw7XG4gICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JC5uZXh0KHJlc3BvbnNlLml0ZW1zVG90YWwpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNvbHVtbnMocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICB9XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NGcm9tUm93c0RhdGEocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lZGl0YWJsZSkge1xuICAgICAgdGhpcy5yb3dzLmZvckVhY2goKHgpID0+ICh4LmlzRWRpdGluZyA9IHRydWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5vcmlnaW5hbFVuc29ydGVkUm93cyA9IGNsb25lRGVlcCh0aGlzLnJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gY2xvbmVEZWVwKHRoaXMucm93cyk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc0NsZWFyRmlsdGVyJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHRoaXMuYXBwbHlEZWZhdWx0U29ydCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0VsaWdpYmxlRm9yQWxsQ2hlY2soKSkge1xuICAgICAgdGhpcy5jaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUm93U2VsZWN0aW9uRW5hYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0Um93Q2hlY2tlZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgIC8vIFRPRE8gLSByZWZhY3RvclxuXG4gICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VsaWdpYmxlRm9yQWxsQ2hlY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbiAmJiAhdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgdGhpcy5tYXN0ZXJTZWxlY3Rpb24udmFsdWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlVmFsaWRJbmRleChzZWxlY3RhYmxlSW5kZXg6IG51bWJlciB8IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHNlbGVjdGFibGVJbmRleCA9PT0gJ2xhc3QnKSB7XG4gICAgICBzZWxlY3RhYmxlSW5kZXggPSB0aGlzLnBhZ2VTaXplO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyKHNlbGVjdGFibGVJbmRleCkgPiB0aGlzLnJvd3NDb3VudEluQ3VycmVudFBhZ2UgLSAxID8gdGhpcy5yb3dzQ291bnRJbkN1cnJlbnRQYWdlIC0gMSA6IHNlbGVjdGFibGVJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFnaW5hdGlvbkRhdGEocGFnaW5hdGlvblBhcmFtczogSVBhZ2luYXRpb25QYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMgPSBwYWdpbmF0aW9uUGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0eVdoZW5TZWxlY3Rpb25FbmFibGUodGhpcy5leGNsdWRlZFJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgY29uc3QgZXhjbHVkZWRDdXJyZW50UGFnZVJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKCh4KSA9PiB0aGlzLmV4Y2x1ZGVkUm93cy5tYXAoKGUpID0+IEpTT04uc3RyaW5naWZ5KGUpKS5pbmNsdWRlcyhKU09OLnN0cmluZ2lmeSh4KSkpO1xuICAgIHRoaXMucm93c1xuICAgICAgLmZpbHRlcigoeCkgPT4gIWV4Y2x1ZGVkQ3VycmVudFBhZ2VSb3dzLnNvbWUoKHkpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeSh5KSkpXG4gICAgICAuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5yb3dEaXNhYmxlRm4ocm93KSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlEZWZhdWx0U29ydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLmRvd25Tb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBTb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5BU0M7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVBhZ2UodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwgeyByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRGVsZXRlTW9kYWwocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5yb3dUb0RlbGV0ZSA9IHJvdztcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XG4gICAgICBtZXNzYWdlOiB0aGlzLmdyaWRPcHRpb25zLmRlbGV0ZU9wdGlvbnMuY29uZmlybWF0aW9uTWVzc2FnZSxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wb3NpdGlvbiA9IHtcbiAgICAgIHRvcDogJzclJyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2RlbGV0ZS1tb2RhbC1wYW5lbCc7XG4gICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RGVsZXRlTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihEZWxldGVNb2RhbENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICBkaWFsb2dSZWZcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4gdGhpcy5vbkNsaWNrRGVsZXRlTW9kYWwocmVzdWx0KSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93U2F2ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvdyA9IGV2ZW50RGF0YS5yb3csXG4gICAgICBzYXZlRGF0YSA9IGV2ZW50RGF0YS5zYXZlRGF0YTtcbiAgICBpZiAoc2F2ZURhdGFbQ09MVU1OX0lELlBST1BdID09PSBDT0xVTU5fSUQuRU1QVFlfUk9XX1ZBTCkge1xuICAgICAgdGhpcy5wb3N0RGF0YUZvckFkZChzYXZlRGF0YSwgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXREYXRhRm9yRWRpdChzYXZlRGF0YSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REYXRhRm9yQWRkKHNhdmVEYXRhOiBJUm93RGF0YSwgcm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG4gICAgcm93LmlzU2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RJdGVtRm4oc2F2ZURhdGEpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXN1bHQ6IElLZXlWYWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5zdWNjZXNzKFNuYWNrYmFyVHlwZXMuU3VjY2VzcywgU25hY2tiYXJUeXBlcy5TdWNjZXNzKTtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5yZWZyZXNoT25BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhc0VtcHR5Um93ID0gZmFsc2U7XG4gICAgICAgICAgICBzYXZlRGF0YVtDT0xVTU5fSUQuUFJPUF0gPSByZXN1bHRbQ09MVU1OX0lELlBST1BdO1xuICAgICAgICAgICAgdGhpcy5zYXZlTG9jYWxSb3cocm93LCBzYXZlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJvdy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXREYXRhRm9yRWRpdChzYXZlRGF0YTogSVJvd0RhdGEsIHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIHJvdy5pc1NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5wdXRJdGVtRm4odGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyksIHNhdmVEYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmV0dXJuRGF0YTogSVJvd0RhdGEpID0+IHtcbiAgICAgICAgICBpZiAocmV0dXJuRGF0YSkge1xuICAgICAgICAgICAgc2F2ZURhdGEgPSBtZXJnZShzYXZlRGF0YSwgcmV0dXJuRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5pbmZvKFNuYWNrYmFyVHlwZXMuVXBkYXRlLCBTbmFja2JhclR5cGVzLlVwZGF0ZSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZUNvbXBsZXRlZC5lbWl0KHsgcm93IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93blNvcnQodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMucm93cy5zb3J0KChpdGVtMSwgaXRlbTIpID0+IHtcbiAgICAgIHJldHVybiBpdGVtMS5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPD0gaXRlbTIuZGF0YVt2aWV3Q29sdW1uLnByb3BdID8gMSA6IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwU29ydCh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzLnNvcnQoKGl0ZW0xLCBpdGVtMikgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW0xLmRhdGFbdmlld0NvbHVtbi5wcm9wXSA+PSBpdGVtMi5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPyAxIDogLTE7XG4gICAgfSk7XG4gICAgdGhpcy5kZXRlY3RSb3dDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zb3J0KCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMub3JpZ2luYWxVbnNvcnRlZFJvd3MuZmlsdGVyKChvcmlnaW5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gSlNPTi5zdHJpbmdpZnkocm93LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbC5kYXRhKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNvcnREYXRhKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4sIGlzQXNjZW5kaW5nOiBib29sZWFuLCBpc1Vuc29ydDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc29ydCkge1xuICAgICAgdGhpcy51bnNvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBc2NlbmRpbmcgPyB0aGlzLnVwU29ydCh2aWV3Q29sdW1uKSA6IHRoaXMuZG93blNvcnQodmlld0NvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFbXB0eVJvdyhkZXB0aDogbnVtYmVyID0gUk9XLlJPT1RfREVQVEgsIHBhcmVudElkOiBzdHJpbmcgPSBDT0xVTU5fSUQuTk9fUEFSRU5UX1ZBTCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5jbGVhckZpbHRlclBhcmFtcygpO1xuICAgIGNvbnN0IG5ld1JvdyA9IHRoaXMuZ2V0RW1wdHlSb3coZGVwdGgsIHBhcmVudElkKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gbmV3Um93O1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aEluc2VydGVkUm93KHBhcmVudElkLCB0aGlzLnJvd3MsIG5ld1Jvdyk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVtcHR5Um93KCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVtb3ZlTG9jYWxSb3coQ09MVU1OX0lELkVNUFRZX1JPV19WQUwpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNhdmVMb2NhbFJvdyhldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGVTZXJ2aWNlLmlzRW1wdHlSb3coZXZlbnREYXRhLnJvdykpIHtcbiAgICAgIHRoaXMuYWRkTG9jYWxSb3coZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNhdmVEYXRhKTtcbiAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfQURERUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRMb2NhbFJvdyhldmVudERhdGEucm93LCBldmVudERhdGEuc2F2ZURhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZUxvY2FsRGF0YShDaGFuZ2VUeXBlLlJPV19VUERBVEVEKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVMb2NhbFJvdyhyb3csIHsgLi4uc2F2ZURhdGEsIGlkOiB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0TmV3Um93SWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZWRpdExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlTG9jYWxSb3cocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVJvd0RhdGEocm93LCBzYXZlRGF0YSk7XG4gICAgcm93LmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJvd0RhdGEocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbihyb3cuZGF0YSwgc2F2ZURhdGEpO1xuICAgIGlmICghaXNVbmRlZmluZWQocm93LmZvcm1Hcm91cCkpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmlsbEZvcm0ocm93LmZvcm1Hcm91cCwgcm93LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTG9jYWxSb3cocmVtb3ZlUm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgoeCkgPT4geC5kYXRhW0NPTFVNTl9JRC5QUk9QXSA9PT0gcmVtb3ZlUm93SWQpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aFJlbW92ZWRSb3cocmVtb3ZlUm93SWQsIHRoaXMucm93cyk7XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEF1dG9OZXh0Um93KGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdEZpcnN0Um93U2VsZWN0aW9uICYmIHRoaXMucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggJiYgdGhpcy5yb3dzLmxlbmd0aCAlIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlLS07XG4gICAgICB0aGlzLnNlYXJjaGVkUm93Q291bnQkLm5leHQodGhpcy5yb3dzLmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBdXRvTmV4dFJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnJvd3MubGVuZ3RoID09PSBpbmRleCA/IHRoaXMucm93cy5sZW5ndGggLSAxIDogaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0Rmlyc3RSb3dTZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGVtaXROZXh0Um93KGluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdGhpcy5yb3dzW2luZGV4XTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMucm93c1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlQm9keS5kZXRlY3RDaGFuZ2UoKTtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQodGhpcy5yb3dzW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZVJvd0VkaXRpbmcocm93OiBJRGF0YVRhYmxlUm93LCBpc0VkaXRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGlzRWRpdGluZztcbiAgICByb3cuaXNFZGl0aW5nID0gaXNFZGl0aW5nO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVSb3dFeHBhbmRDb2xsYXBzZShyb3c6IElEYXRhVGFibGVSb3csIHNob3VsZEV4cGFuZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHJvdy5pc0V4cGFuZGVkID0gc2hvdWxkRXhwYW5kO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbXB0eVJvdyhkZXB0aDogbnVtYmVyLCBwYXJlbnRJZDogc3RyaW5nKTogSURhdGFUYWJsZVJvdyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3coXG4gICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0RW1wdHlSb3dEYXRhKHRoaXMudmlld0NvbHVtbnMsIHRoaXMuZGVmYXVsdFJvd1ZhbHVlcyksXG4gICAgICBkZXB0aCxcbiAgICAgIHBhcmVudElkLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlTG9jYWxEYXRhKGNoYW5nZVR5cGU6IENoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLk9USEVSKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VMb2NhbERhdGEuZW1pdCh7XG4gICAgICByb3dzRGF0YTogdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NEYXRhRnJvbVJvd3ModGhpcy5yb3dzKSxcbiAgICAgIGNoYW5nZVR5cGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpcmVJbml0Q29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMub25Jbml0Q29tcGxldGVkLmVtaXQodGhpcy5nZXRHcmlkQXBpKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDbG9uZVJvdyhyb3c6IElEYXRhVGFibGVSb3csIGRlcHRoOiBudW1iZXIgPSBST1cuUk9PVF9ERVBUSCwgcGFyZW50SWQ6IHN0cmluZyA9IENPTFVNTl9JRC5OT19QQVJFTlRfVkFMKTogdm9pZCB7XG4gICAgdGhpcy5oYXNFbXB0eVJvdyA9IHRydWU7XG4gICAgcm93LmRhdGFbQ09MVU1OX0lELlBST1BdID0gQ09MVU1OX0lELkVNUFRZX1JPV19WQUw7XG4gICAgdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuY29weU9mQ2xvbmFibGVQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJvdy5kYXRhW3Byb3BlcnR5XSA9IERhdGFUYWJsZUNvbnN0YW50cy5DT1BZX09GICsgcm93LmRhdGFbcHJvcGVydHldO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZW1wdHlWYWx1ZUNvbHVtbnMgPSB0aGlzLnZpZXdDb2x1bW5zLmZpbHRlcigoY29sKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuZW1wdHlWYWx1ZVByb3BlcnRpZXMuaW5jbHVkZXMoY29sLnByb3ApO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5zZXRFbXB0eVZhbHVlc0luUm93RGF0YShyb3csIGVtcHR5VmFsdWVDb2x1bW5zKTtcblxuICAgIGNvbnN0IGNsb25lZFJvdyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3cocm93LmRhdGEsIGRlcHRoLCBwYXJlbnRJZCwgdHJ1ZSk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NXaXRoSW5zZXJ0ZWRSb3cocGFyZW50SWQsIHRoaXMucm93cywgY2xvbmVkUm93KTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gY2xvbmVkUm93O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkQXBpKCk6IEdyaWRBcGkge1xuICAgIHJldHVybiB0aGlzLmdyaWRBcGk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlYXJjaGFibGVDb2x1bW5zKGNvbHVtbnM6IElEYXRhVGFibGVDb2x1bW5bXSk6IElEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCAncHJvcCcpICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoaXRlbS5wcm9wKVxuICAgICk7XG4gICAgcmV0dXJuIHNlYXJjaGFibGVDb2x1bW5zLmxlbmd0aCA9PT0gMCA/IGNvbHVtbnMgOiBzZWFyY2hhYmxlQ29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgbWFzdGVyVG9nZ2xlQ2xpZW50U2lkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKSA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKCkgOiB0aGlzLm5vbkRpc2FibGVkUm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclByb3BlcnR5V2hlblNlbGVjdGlvbkVuYWJsZShjaGVja2VkUm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgY2hlY2tlZFJvd3MubGVuZ3RoKSB7XG4gICAgICBjaGVja2VkUm93cy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdpc1NlbGVjdGVkJykpIHtcbiAgICAgICAgICBkZWxldGUgcy5pc1NlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdyb3dJbmRleCcpKSB7XG4gICAgICAgICAgZGVsZXRlIHMucm93SW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2hlY2tlZFJvd3MoKTogSUNoZWNrZWRSb3dFdmVudCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICB0aGlzLmNsZWFyUHJvcGVydHlXaGVuU2VsZWN0aW9uRW5hYmxlKGNoZWNrZWRSb3dzKTtcbiAgICBjb25zdCBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIHJldHVybiBjaGVja2VkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShyb3cpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzID0gY2hlY2tlZFJvd3MuZmlsdGVyKChlKSA9PiB7XG4gICAgICByZXR1cm4gcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLmZpbmRJbmRleCgobSkgPT4gSlNPTi5zdHJpbmdpZnkoZSkgPT09IEpTT04uc3RyaW5naWZ5KG0pKSA8IDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzOiBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MsIHBhZ2VVbm1hdGNoZWRDaGVja2VkUm93czogcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzIH07XG4gIH1cblxuICBwcml2YXRlIG1hc3RlclRvZ2dsZVNlcnZlclNpZGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja2VkUm93czogSUNoZWNrZWRSb3dFdmVudCA9IHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMuYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocHJldmlvdXNDaGVja2VkUm93cy5wYWdlVW5tYXRjaGVkQ2hlY2tlZFJvd3MpO1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoICE9PSBwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VNYXRjaGVkUHJldmlvdXNDaGVja2VkUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Um93Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0NoZWNrZWRSb3dzOiBJQ2hlY2tlZFJvd0V2ZW50ID0gdGhpcy5nZXRDaGVja2VkUm93cygpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRVbm1hdGNoZWRSb3dUb1NlbGVjdGlvbihwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VVbm1hdGNoZWRDaGVja2VkUm93cyk7XG5cbiAgICB0aGlzLnJvd3NcbiAgICAgIC5maWx0ZXIoKGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tlZFJvd3MucGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLnNvbWUoKGl0ZW0pID0+IEpTT04uc3RyaW5naWZ5KGUpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgICB9KVxuICAgICAgLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWREYXRhUm93KGRhdGFSb3dzOiBJRGF0YVRhYmxlUm93W10pOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiBkYXRhUm93cy5maWx0ZXIoKGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShlLmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShpdGVtLmRhdGEpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uU291cmNlKHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMubWV0YURhdGFDb2x1bW5zLmZpbmRJbmRleCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUgPT09IHByb3BlcnR5KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5NRVRBREFUQTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5EQVRBX1NPVVJDRTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YShkZWZhdWx0Q29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdKTogSURhdGFUYWJsZUNvbHVtbltdIHtcbiAgICBsZXQgdGVtcENvbGxlY3Rpb246IElEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICAgIHRlbXBDb2xsZWN0aW9uID0gZGVmYXVsdENvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VLZXkpIHtcbiAgICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgICB9XG4gICAgbGV0IHN0b3JlZENvbHVtbnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkpO1xuICAgIGlmIChzdG9yZWRDb2x1bW5zICYmIHN0b3JlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgc3RvcmVkQ29sdW1uc1xuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IExpc3RJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRlbXBDb2xsZWN0aW9uLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0NvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uID0gdGVtcENvbGxlY3Rpb24uZmluZCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nQ29sdW1uLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZhciB0ZW1wY29sdW1uID0gdGVtcENvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICAgICAgICB0ZW1wQ29sbGVjdGlvbltpbmRleF0gPSBleGlzdGluZ0NvbHVtbjtcbiAgICAgICAgICAgICAgdGVtcENvbGxlY3Rpb25bZXhpc3RpbmdDb2x1bW5JbmRleF0gPSB0ZW1wY29sdW1uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGFkZGVkIGludmlzaWJsZSBjb2x1bW5zIGF0IHRoZSBlbmQgdG8gY29tcGxldGUgdGhlIHNldFxuICAgICAgdGVtcENvbGxlY3Rpb25cbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAmJiBzdG9yZWRDb2x1bW5zLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApIDwgMClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IElEYXRhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0ZWRDaGVja2JveFBhZ2luZ0NvbmZpcm1hdGlvbihzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNDUwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBib2R5OiB0aGlzLmNvbmZpcm1hdGlvbk1zZ1BhZ2luYXRpb24sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbmZpcm1hdGlvbikgPT4ge1xuICAgICAgICBpZiAoY29uZmlybWF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHNlbGVjdGFibGVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlbGVjdGVkUm93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZFJvd3MoKS5tYXAoKHgpID0+IHguZGF0YSkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hUYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPj0gMiB8fCByZXMgPT09ICcnKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmNsZWFyU3VicyQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VhcmNoRGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJQYXJhbXMoKTogSUZpbHRlclBhcmFtW10ge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTZWFyY2hCb3hWaXNpYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduKSB7XG4gICAgICByZXR1cm4gW3sgY29sdW1uTmFtZTogJ3NlYXJjaFRleHQnLCBmaWx0ZXJWYWx1ZTogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSB9LCAuLi50aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWd1cmVkQ29sdW1ucygpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmdyaWRPcHRpb25zLnN0b3JhZ2VGbikpIHtcbiAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHRoaXMuZ3JpZE9wdGlvbnMuc3RvcmFnZUZuKCk7XG4gICAgICBsZXQgY29sdW1ucyA9IHRoaXMuc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YSh0aGlzLmNvbHVtbnMpO1xuICAgICAgdGhpcy52aWV3Q29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbHVtbnMocm93RGF0YTogSUtleVZhbHVlW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dEYXRhWzBdKS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiA8SURhdGFUYWJsZUNvbHVtbj57XG4gICAgICAgIGhlYWRlcjogeC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBwcm9wOiB4LFxuICAgICAgICB0eXBlOiBDb2x1bW5UeXBlcy5TdHJpbmcsXG4gICAgICAgIHJlbmRlcmVyVGVtcGxhdGU6IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcCA/IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcFt4XSA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRlZENvbHVtbnMgPSBjbG9uZSh0aGlzLnZpZXdDb2x1bW5zKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZWFyY2hcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzU2VhcmNoQm94VmlzaWJsZSAmJiAhZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgIDxmb3JtIG5nRm9ybT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoYmFyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCB7eyBzZWFyY2hQbGFjZWhvbGRlciB9fVwiIG5hbWU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgW2Rpc2FibGVkXT1cImlzU2VhcmNoRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCIgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRvcFRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiIWlzT25seVZpZXdcIiBjbGFzcz1cImFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInJvdy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmhhc1Blcm1pc3Npb249XCJnZXRBY3Rpb25OYW1lKGFjdGlvblR5cGVzLkFERClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5hZGRCdXR0b25UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzVGFibGVJbkVkaXRTdGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib25DbGlja0FkZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwie3tnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5BREQpfX1cIiBjbGFzcz1cInRvb2xiYXItaWNvbiBpY29uLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKSk/ICdpY29uLWluYWN0aXZlJzogJ2ljb24tYWN0aXZlJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGU7XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nJC5nZXRWYWx1ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtZGF0YS10YWJsZS1hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoaXNPbmx5VmlldyAmJiAhaXNWaWV3QWN0aW9uVmlzaWJsZSkgJiYgIWdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZEFwaV09XCJncmlkQXBpXCIgW2NhbklubGluZUVkaXRdPVwiY2FuSW5saW5lRWRpdFwiIFtpc1RyZWVHcmlkXT1cImlzVHJlZUdyaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCIgW3NlbGVjdGVkUm93XT1cInNlbGVjdGVkUm93XCIgW2lzSWNvbnNEaXNhYmxlZF09XCJpc0FjdGlvbnNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNFZGl0aW5nXT1cInNlbGVjdGVkUm93Py5pc0VkaXRpbmdcIiBbaXNTYXZpbmddPVwic2VsZWN0ZWRSb3c/LmlzU2F2aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbaXNFZGl0YWJsZV09XCJpc0VkaXRhYmxlXCIgKGNsaWNrQWRkKT1cIm9uQ2xpY2tBZGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNDbG9uZVZpc2libGVdPVwiaXNDbG9uZVZpc2libGVcIiBbaXNEZWxldGVWaXNpYmxlXT1cIiFjaGVja0RlbGV0ZURpc2FibGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS10YWJsZS1hY3Rpb25zPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIiAqbmdJZj1cIiFpc09ubHlWaWV3IHx8IGdyaWRPcHRpb25zLmlzVG9wTGVmdEFjdGlvbnNGb3JjZURpc3BseVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BMZWZ0QWRkaXRpb25hbEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKmhhc1Blcm1pc3Npb249XCJnZXRMZWZ0QWN0aW9uTmFtZShhY3Rpb24uYWN0aW9uTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBhY3Rpb24uaXNEaXNhYmxlZH1cIiAoY2xpY2spPVwiQWN0aW9uQ2xpY2tIYW5kbGVyKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaWNvbiAqbmdJZj1cIiFhY3Rpb24uaXNDbGFzc1wiIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhY3Rpb24uaWNvbk9yQ2xhc3NOYW1lXCI+PC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGlvbi5pc0NsYXNzXCIgdGl0bGU9XCJ7e2dldExlZnRSaWdodEFjdGlvblRleHQoYWN0aW9uKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sYmFyLWljb24ge3sgYWN0aW9uLmljb25PckNsYXNzTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihhY3Rpb24uYWN0aW9uTmFtZT09PWFjdGlvblR5cGVzLlVQTE9BRCAmJiBhY3Rpb24uaXNEaXNhYmxlZCk/ICdpY29uLWluYWN0aXZlJzogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImFjdGlvbi5sb2FkaW5nJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJtci0xIGFjdGlvbi1sb2FkZXJcIiBbZGlhbWV0ZXJdPVwiMjVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmxlZnRBY3Rpb25CdG5UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkT3B0aW9ucy5sZWZ0QWN0aW9uQnRuVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BSaWdodEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIkFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb24pXCIgY2xhc3M9XCJmb250SWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIiBbbmFtZV09XCJhY3Rpb24uaWNvblwiPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VhcmNoXCIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc1NlYXJjaEJveFZpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbmdGb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaGJhci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgbmFtZT1cInNlYXJjaFwiIFtmb3JtQ29udHJvbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NlYXJjaERpc2FibGVkXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2hvd0hpZGVGaWx0ZXJWaWV3KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaW5hY3RpdmUtZmlsdGVyXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtZmlsdGVyJzogaXNGaWx0ZXJBcHBsaWVkIH1cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFt0aXRsZV09XCInQ2xlYXInXCIgKGNsaWNrKT1cImNsZWFyR2xvYmFsRmlsdGVyKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJmYXMgZmEtYnJvb21cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJyb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlQ29sdW1uQ29uZmlndXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKVwiIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5DT0xVTU5fQ09ORklHVVJBVElPTilcIiBbbmFtZV09XCJJQ09OUy5Db2x1bW5TZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbjwvZGl2PlxuXG48bWF0LWNhcmQgY2xhc3M9XCJ0YWJsZS1jYXJkXCIgW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudC10YWJsZS1kZXNpZ24nOiBncmlkT3B0aW9ucy5pc1RyYW5zcGFyZW50VGFibGVEZXNpZ259XCI+XG4gICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmckIHwgYXN5bmNcIiBjbGFzcz1cImxvYWRlci1taWRkbGVcIj48L2FwcC1sb2FkZXI+XG5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRhLXRhYmxlXCIgW25nQ2xhc3NdPVwieydkZWZhdWx0LXRhYmxlLWhlaWdodCc6IGlzTG9hZGluZyQuZ2V0VmFsdWUoKSwgJ292ZXJmbG93LXZpc2libGUnOiBncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlIH1cIlxuICAgICAgICAgICAgKHNjcm9sbCk9XCJvblRhYmxlU2Nyb2xsZWQoJGV2ZW50KVwiICNjdXN0b21EYXRhVGFibGUgW25nU3R5bGVdPVwiZ2V0Q3VzdG9tVGFibGVTdHlsZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGFyaWEtZGVzY3JpYmVkYnk9XCJHZW5lcmljIGRhdGEgdGFibGVcIiAqbmdJZj1cIiFncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlIGFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGVcIiBbbmdDbGFzc109XCJ7ICctdHJlZSc6IGlzVHJlZUdyaWQgfVwiIG1kYlRhYmxlPlxuICAgICAgICAgICAgICAgIDx0aGVhZCAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlVGFibGVIZWFkZXJcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJWaWV3XCIgY2xhc3M9XCJ0YWJsZS1maXJzdC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInZpZXdDb2x1bW4uaXNWaXNpYmxlXCIgc2NvcGU9XCJjb2xcIiBjbGFzcz1cImhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQnOiAhdmlld0NvbHVtbi5pc01ldGFEYXRhQ29sdW1uICYmIGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWRhdGEtY29sLWZpbHRlciAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcClcIiBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmlsdGVyZWRDb2x1bW4nOiBpc0ZpbHRlcmVkQ29sdW1uKHZpZXdDb2x1bW4ucHJvcCl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZpbHRlckNsaWNrZWQpPVwib25GaWx0ZXJDbGlja2VkKCRldmVudClcIiBbZmlsdGVyT3B0aW9uXT1cInZpZXdDb2x1bW4uZmlsdGVyT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtudW1iZXJPZlRhYmxlUmVmcmVzaF09XCJudW1iZXJPZlRhYmxlUmVmcmVzaFwiIFtpc1VwZGF0ZWRGaWx0ZXJEZXNpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNDbGVhckZpbHRlciRdPVwiaXNDbGVhckZpbHRlciRcIiBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS1jb2wtZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtc2Vjb25kLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJoYXNTZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwidGFibGUtaGVhZGVyLWNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibWFzdGVyU2VsZWN0aW9uXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgaXNTaW5nbGVTZWxlY3RcIiBjbGFzcz1cImhhc1NlbGVjdGlvblwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwidmlld0NvbHVtbi5pc1Zpc2libGVcIiBzY29wZT1cImNvbFwiIGNsYXNzPVwiaGVhZGVyXCIgW2F0dHIuZGF0YS1jb2x1bW4tcHJvcF09XCJ2aWV3Q29sdW1uLnByb3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RyYW5zcGFyZW50JzogIXZpZXdDb2x1bW4uaXNNZXRhRGF0YUNvbHVtbiAmJiBncmlkT3B0aW9ucy5pc1VwZGF0ZWRUYWJsZURlc2lnbn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRIZWFkZXJTdHlsZShpLCB2aWV3Q29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcCkgJiYgIWdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCIgW2lzQ2xlYXJGaWx0ZXIkXT1cImlzQ2xlYXJGaWx0ZXIkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXJcIiBbbmdDbGFzc109XCJ7J3NvcnQtY29sdW1uJzogaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW4pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRUYWJsZSh2aWV3Q29sdW1uKVwiPnt7IHZpZXdDb2x1bW4uaGVhZGVyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdDb2x1bW4uaGVhZGVySWNvbkNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIiBbbmdDbGFzc109XCJ2aWV3Q29sdW1uLmhlYWRlckljb25DbGFzc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PT0gc29ydERpcmVjdGlvbkVudW0uREVTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfZG93bndhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdPT09IHNvcnREaXJlY3Rpb25FbnVtLkFTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfdXB3YXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBhY3RpdmUtZmlsdGVyXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyaWRPcHRpb25zLmRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGVhZGVyLXNlcGFyYXRvcic6IHRydWUsICdjb2wtcmVzaXplLWN1cnNvcic6IHZpZXdDb2x1bW4uZHJhZ2dhYmxlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25TZXBhcmF0b3JNb3VzZURvd24oJGV2ZW50LCBpLCB2aWV3Q29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaSwgdmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhKGlzT25seVZpZXcgJiYgIWlzVmlld0FjdGlvblZpc2libGUpICYmIGdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uczwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudCc6IGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkT3B0aW9ucy5ncmlkTWVudU9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuZ3JpZE1lbnVPcHRpb25zLmlzTWVudUVuYWJsZWRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaGFzRml4ZWRGaXJzdFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIShpc0xvYWRpbmckIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIGNsYXNzPVwidHJhbnNwYXJlbnRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICYmIGlzU2luZ2xlU2VsZWN0XCIgY2xhc3M9XCJ0cmFuc3BhcmVudFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlld0NvbHVtbi5maXhlZEZpcnN0Um93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGNvbDogdmlld0NvbHVtbiB9IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCJyb3dzIHwgY29sdW1uRmlsdGVyIDogZmlsdGVyTWFuYWdlci5nZXRGaWx0ZXJQYXJhbXMoKSA6IGNvbHVtbnM6IGdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbc2VhcmNoZWRSb3dDb3VudCRdPVwic2VhcmNoZWRSb3dDb3VudCRcIiBbb25BZGRDbGlja109XCJvbkFkZENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIiBbc2VhcmNoXT1cInNlYXJjaFZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25QYXJhbXNdPVwicGFnaW5hdGlvblBhcmFtc1wiIFtoYXNFbXB0eVJvd109XCJoYXNFbXB0eVJvd1wiIFtpc0VkaXRpbmddPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpc0Nsb25lVmlzaWJsZV09XCJpc0Nsb25lVmlzaWJsZVwiIChjbGlja0VkaXQpPVwib25DbGlja0VkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0Nsb25lKT1cIm9uQ2xpY2tDbG9uZSgkZXZlbnQpXCIgKGNsaWNrQWN0aW9uKT1cIm9uQ2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrRGVsZXRlKT1cIm9uQ2xpY2tEZWxldGVSb3coJGV2ZW50KVwiIChjbGlja1ZpZXcpPVwib25DbGlja1ZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0FkZCk9XCJvbkNsaWNrUm93QWRkKCRldmVudClcIiAoY2xpY2tSb3cpPVwib25DbGlja1JvdygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjb21wbGV4RGV0YWlsQ2xpY2tlZCk9XCJDb21wbGV4RGV0YWlsQ2xpY2tlZCgkZXZlbnQpXCIgW2lzUm93VW5jaGVja2VkXT1cImlzUm93VW5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgKENoZWNrYm94U2VsZWN0KT1cImlzQ2hlY2tib3hTZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG5cbiAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZGlzcGxheU1vZGU9XCJmbGF0XCIgbXVsdGkgY2xhc3M9XCJtYXQtdGFibGVcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzQWNjb3JkaW9uVGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRhYmxlSGVhZGVyXCIgY2xhc3M9XCJtYXNrLWJvZHkgaGVhZGVyLXBhbmVsXCIgaGlkZVRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciAoa2V5ZG93bi5FbnRlcik9XCIkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sbGFwc2VkSGVpZ2h0XT1cIidhdXRvJ1wiIFtleHBhbmRlZEhlaWdodF09XCInYXV0bydcIiBjbGFzcz1cIm1hdC1yb3cgaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtY2hlY2tib3hSb3dcIiAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICAmJiAhaXNTaW5nbGVTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIiBbKG5nTW9kZWwpXT1cIm1hc3RlclNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2aWV3Q29sdW1uLmlzVmlzaWJsZVwiIHNjb3BlPVwiY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsIGQtaW5saW5lLWJsb2NrXCIgW25nQ2xhc3NdPVwidmlld0NvbHVtbi5jdXN0b21Dc3NDbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXIgY2xhc3M9XCJmaWx0ZXItY29sdW1uXCIgKm5nSWY9XCJpc0ZpbHRlckVuYWJsZSh2aWV3Q29sdW1uLnByb3ApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwibm9uRmlsdGVyQ2xhc3NOYW1lKHZpZXdDb2x1bW4ucHJvcClcIiBjbGFzcz1cInRhYmxlIC5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0VGFibGUodmlld0NvbHVtbilcIj57eyB2aWV3Q29sdW1uLmhlYWRlciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydC1pY29uXCIgKm5nSWY9XCJzb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXT09J0Rvd25Tb3J0ZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd19kb3dud2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PSdVcFNvcnRlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93X3Vwd2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwicm93cyB8IGNvbHVtbkZpbHRlciA6IGZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkgOiBjb2x1bW5zOiBncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXddPVwiaXNPbmx5Vmlld1wiIFtzZWFyY2hlZFJvd0NvdW50JF09XCJzZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwic2VhcmNoVmFsdWUudmFsdWVcIiBbcGFnaW5hdGlvblBhcmFtc109XCJwYWdpbmF0aW9uUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2xvbmVWaXNpYmxlXT1cImlzQ2xvbmVWaXNpYmxlXCIgKGNsaWNrRWRpdCk9XCJvbkNsaWNrRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkKT1cIm9uRXhwYW5zaW9uUGFuZWxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tDbG9uZSk9XCJvbkNsaWNrQ2xvbmUoJGV2ZW50KVwiIChjbGlja0FjdGlvbik9XCJvbkNsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tEZWxldGUpPVwib25DbGlja0RlbGV0ZVJvdygkZXZlbnQpXCIgKGNsaWNrVmlldyk9XCJvbkNsaWNrVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tBZGQpPVwib25DbGlja1Jvd0FkZCgkZXZlbnQpXCIgKGNsaWNrUm93KT1cIm9uQ2xpY2tSb3coJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXhEZXRhaWxDbGlja2VkKT1cIkNvbXBsZXhEZXRhaWxDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDaGVja2JveFNlbGVjdCk9XCJpc0NoZWNrYm94U2VsZWN0KCRldmVudClcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiaGFzUGFnaW5hdGlvbiAmJiBzZWxlY3Rpb25cIiBjbGFzcz1cInBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgIDxhcHAtZGF0YS1wYWdpbmF0aW9uIFtzZWxlY3Rpb25Db3VudF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCIgY2xhc3M9XCJ0YWJsZS1wYWdpbmF0aW9uLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQtdGFibGUtZGVzaWduJzogZ3JpZE9wdGlvbnMuaXNUcmFuc3BhcmVudFRhYmxlRGVzaWdufVwiICBbdG90YWxSb3dDb3VudCRdPVwidGhpcy5zZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgW2NvdW50XT1cImNvdW50XCIgW3BhZ2VdPVwicGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZVwiIFtzaXplXT1cInBhZ2luYXRpb25QYXJhbXMucGFnZVNpemVcIiBbaGFzRHJvcGRvd25TdHlsZVBhZ2VTaXplXT1cImdyaWRPcHRpb25zLmhhc0Ryb3Bkb3duU3R5bGVQYWdlU2l6ZSA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlUGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtZGF0YS1wYWdpbmF0aW9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD4iXX0=