@smartbit4all/ng-client 6.0.32 → 7.0.0

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 (985) hide show
  1. package/MIGRATION-7.0.md +1641 -0
  2. package/README.md +199 -386
  3. package/WIDGETS.md +206 -0
  4. package/fesm2022/smartbit4all-ng-client.mjs +13661 -16214
  5. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  6. package/package.json +15 -18
  7. package/smartbit4all-ng-client-7.0.0.tgz +0 -0
  8. package/types/smartbit4all-ng-client.d.ts +10328 -0
  9. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
  10. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
  11. package/esm2022/lib/component-factory-service/projects.mjs +0 -6
  12. package/esm2022/lib/session/api/api/api.mjs +0 -4
  13. package/esm2022/lib/session/api/api/session.service.mjs +0 -306
  14. package/esm2022/lib/session/api/configuration.mjs +0 -91
  15. package/esm2022/lib/session/api/encoder.mjs +0 -19
  16. package/esm2022/lib/session/api/index.mjs +0 -3
  17. package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
  18. package/esm2022/lib/session/api/model/apiError.mjs +0 -13
  19. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
  20. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
  21. package/esm2022/lib/session/api/model/models.mjs +0 -9
  22. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
  23. package/esm2022/lib/session/api/model/session.mjs +0 -2
  24. package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
  25. package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
  26. package/esm2022/lib/session/api/param.mjs +0 -2
  27. package/esm2022/lib/session/api/variables.mjs +0 -9
  28. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
  29. package/esm2022/lib/session/projects.mjs +0 -12
  30. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +0 -2
  31. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +0 -217
  32. package/esm2022/lib/session/smart-default-error-ui.service.mjs +0 -134
  33. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -109
  34. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -44
  35. package/esm2022/lib/session/smart-session-handler.service.mjs +0 -7
  36. package/esm2022/lib/session/smart-session.module.mjs +0 -58
  37. package/esm2022/lib/session/smart-session.service.mjs +0 -309
  38. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -59
  39. package/esm2022/lib/shared/projects.mjs +0 -4
  40. package/esm2022/lib/shared/shared.module.mjs +0 -19
  41. package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
  42. package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
  43. package/esm2022/lib/smart-client/projects.mjs +0 -4
  44. package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -935
  45. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -79
  46. package/esm2022/lib/smart-client/smart.component.mjs +0 -88
  47. package/esm2022/lib/smart-client/smart.service.mjs +0 -71
  48. package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
  49. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
  50. package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
  51. package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
  52. package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
  53. package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
  54. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
  55. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -22
  56. package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +0 -2
  57. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
  58. package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -10
  59. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
  60. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
  61. package/esm2022/lib/smart-component-layout/api/model/toolbarAlignment.mjs +0 -17
  62. package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +0 -17
  63. package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +0 -2
  64. package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
  65. package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
  66. package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
  67. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -169
  68. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -438
  69. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -57
  70. package/esm2022/lib/smart-diagram/api/api/api.mjs +0 -4
  71. package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +0 -141
  72. package/esm2022/lib/smart-diagram/api/api.module.mjs +0 -40
  73. package/esm2022/lib/smart-diagram/api/configuration.mjs +0 -91
  74. package/esm2022/lib/smart-diagram/api/encoder.mjs +0 -19
  75. package/esm2022/lib/smart-diagram/api/index.mjs +0 -7
  76. package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +0 -13
  77. package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +0 -2
  78. package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +0 -13
  79. package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +0 -2
  80. package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +0 -2
  81. package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +0 -2
  82. package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +0 -2
  83. package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +0 -18
  84. package/esm2022/lib/smart-diagram/api/model/labelText.mjs +0 -2
  85. package/esm2022/lib/smart-diagram/api/model/models.mjs +0 -10
  86. package/esm2022/lib/smart-diagram/api/param.mjs +0 -2
  87. package/esm2022/lib/smart-diagram/api/variables.mjs +0 -9
  88. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +0 -312
  89. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +0 -359
  90. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +0 -40
  91. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +0 -10
  92. package/esm2022/lib/smart-diagram/projects.mjs +0 -5
  93. package/esm2022/lib/smart-dialog/projects.mjs +0 -8
  94. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
  95. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
  96. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
  97. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -86
  98. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -101
  99. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
  100. package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
  101. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -57
  102. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
  103. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
  104. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
  105. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
  106. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
  107. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
  108. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
  109. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
  110. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
  111. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
  112. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
  113. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
  114. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
  115. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
  116. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
  117. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
  118. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
  119. package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
  120. package/esm2022/lib/smart-filter/projects.mjs +0 -9
  121. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
  122. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -166
  123. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
  124. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
  125. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
  126. package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
  127. package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
  128. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
  129. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
  130. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
  131. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
  132. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
  133. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
  134. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
  135. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
  136. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
  137. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
  138. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
  139. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
  140. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
  141. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
  142. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
  143. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
  144. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
  145. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
  146. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
  147. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
  148. package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
  149. package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
  150. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
  151. package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
  152. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
  153. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
  154. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -294
  155. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
  156. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
  157. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -63
  158. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
  159. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
  160. package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
  161. package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
  162. package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
  163. package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
  164. package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
  165. package/esm2022/lib/smart-form/api/index.mjs +0 -7
  166. package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +0 -13
  167. package/esm2022/lib/smart-form/api/model/divProperties.mjs +0 -2
  168. package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +0 -2
  169. package/esm2022/lib/smart-form/api/model/imageProperties.mjs +0 -2
  170. package/esm2022/lib/smart-form/api/model/models.mjs +0 -20
  171. package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +0 -2
  172. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
  173. package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +0 -7
  174. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -14
  175. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
  176. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
  177. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -49
  178. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
  179. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
  180. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
  181. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
  182. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
  183. package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +0 -13
  184. package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +0 -13
  185. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -21
  186. package/esm2022/lib/smart-form/api/param.mjs +0 -2
  187. package/esm2022/lib/smart-form/api/variables.mjs +0 -9
  188. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
  189. package/esm2022/lib/smart-form/projects.mjs +0 -18
  190. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -754
  191. package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -683
  192. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
  193. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -193
  194. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
  195. package/esm2022/lib/smart-form/smartform.component.mjs +0 -190
  196. package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
  197. package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
  198. package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +0 -179
  199. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -83
  200. package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +0 -170
  201. package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +0 -151
  202. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -35
  203. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
  204. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -1050
  205. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
  206. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
  207. package/esm2022/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.mjs +0 -98
  208. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +0 -2
  209. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +0 -18
  210. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +0 -19
  211. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +0 -13
  212. package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +0 -2
  213. package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +0 -2
  214. package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +0 -13
  215. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +0 -2
  216. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +0 -2
  217. package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +0 -54
  218. package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +0 -40
  219. package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +0 -40
  220. package/esm2022/lib/smart-generic-pages/projects.mjs +0 -13
  221. package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +0 -81
  222. package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +0 -116
  223. package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +0 -78
  224. package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +0 -93
  225. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
  226. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -514
  227. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
  228. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
  229. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
  230. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
  231. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
  232. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
  233. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
  234. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +0 -2
  235. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
  236. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
  237. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
  238. package/esm2022/lib/smart-grid/api/grid-api/model/gridRowLayoutDescriptor.mjs +0 -2
  239. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
  240. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
  241. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
  242. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
  243. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
  244. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
  245. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
  246. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -16
  247. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
  248. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
  249. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
  250. package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +0 -47
  251. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -92
  252. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -200
  253. package/esm2022/lib/smart-grid/models/model.mjs +0 -29
  254. package/esm2022/lib/smart-grid/projects.mjs +0 -9
  255. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +0 -76
  256. package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -1074
  257. package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -103
  258. package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -92
  259. package/esm2022/lib/smart-icon/projects.mjs +0 -9
  260. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -95
  261. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +0 -33
  262. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +0 -37
  263. package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -26
  264. package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -93
  265. package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
  266. package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
  267. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
  268. package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
  269. package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
  270. package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
  271. package/esm2022/lib/smart-map/api/index.mjs +0 -7
  272. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
  273. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
  274. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
  275. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
  276. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
  277. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
  278. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
  279. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
  280. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
  281. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
  282. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
  283. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
  284. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
  285. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
  286. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
  287. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
  288. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
  289. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
  290. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
  291. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
  292. package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
  293. package/esm2022/lib/smart-map/api/param.mjs +0 -2
  294. package/esm2022/lib/smart-map/api/variables.mjs +0 -9
  295. package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
  296. package/esm2022/lib/smart-map/impl/google-map.mjs +0 -224
  297. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -422
  298. package/esm2022/lib/smart-map/projects.mjs +0 -9
  299. package/esm2022/lib/smart-map/smart-map.component.mjs +0 -222
  300. package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
  301. package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
  302. package/esm2022/lib/smart-navbar/projects.mjs +0 -8
  303. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
  304. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
  305. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
  306. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
  307. package/esm2022/lib/smart-navigation/projects.mjs +0 -6
  308. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
  309. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
  310. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -27
  311. package/esm2022/lib/smart-ng-client.module.mjs +0 -131
  312. package/esm2022/lib/smart-ng-client.service.mjs +0 -19
  313. package/esm2022/lib/smart-subject/projects.mjs +0 -5
  314. package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
  315. package/esm2022/lib/smart-tab-group/projects.mjs +0 -5
  316. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -22
  317. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
  318. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
  319. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
  320. package/esm2022/lib/smart-table/projects.mjs +0 -8
  321. package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
  322. package/esm2022/lib/smart-table/smarttable.model.mjs +0 -177
  323. package/esm2022/lib/smart-table/smarttable.module.mjs +0 -109
  324. package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
  325. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -40
  326. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
  327. package/esm2022/lib/smart-table/tables/table.mjs +0 -614
  328. package/esm2022/lib/smart-tree/projects.mjs +0 -9
  329. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -292
  330. package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -188
  331. package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
  332. package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -64
  333. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
  334. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
  335. package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
  336. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
  337. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
  338. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
  339. package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
  340. package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
  341. package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
  342. package/esm2022/lib/smart-validation/projects.mjs +0 -4
  343. package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
  344. package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
  345. package/esm2022/lib/theme/theme.service.mjs +0 -48
  346. package/esm2022/lib/view-context/api/api/api.mjs +0 -4
  347. package/esm2022/lib/view-context/api/api/view.service.mjs +0 -1113
  348. package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +0 -2
  349. package/esm2022/lib/view-context/api/api-default/binaryData.mjs +0 -2
  350. package/esm2022/lib/view-context/api/api-default/invocationError.mjs +0 -2
  351. package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +0 -2
  352. package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +0 -2
  353. package/esm2022/lib/view-context/api/api.module.mjs +0 -40
  354. package/esm2022/lib/view-context/api/configuration.mjs +0 -91
  355. package/esm2022/lib/view-context/api/encoder.mjs +0 -19
  356. package/esm2022/lib/view-context/api/index.mjs +0 -7
  357. package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +0 -2
  358. package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +0 -13
  359. package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
  360. package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
  361. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
  362. package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
  363. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
  364. package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
  365. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
  366. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
  367. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
  368. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
  369. package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
  370. package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
  371. package/esm2022/lib/view-context/api/model/link.mjs +0 -20
  372. package/esm2022/lib/view-context/api/model/menuDescriptor.mjs +0 -2
  373. package/esm2022/lib/view-context/api/model/menuOpenDirection.mjs +0 -23
  374. package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +0 -17
  375. package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
  376. package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
  377. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
  378. package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
  379. package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
  380. package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
  381. package/esm2022/lib/view-context/api/model/models.mjs +0 -71
  382. package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +0 -13
  383. package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +0 -2
  384. package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
  385. package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
  386. package/esm2022/lib/view-context/api/model/publishedViewData.mjs +0 -13
  387. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
  388. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
  389. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
  390. package/esm2022/lib/view-context/api/model/shellProperty.mjs +0 -13
  391. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
  392. package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +0 -8
  393. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
  394. package/esm2022/lib/view-context/api/model/style.mjs +0 -13
  395. package/esm2022/lib/view-context/api/model/themeDefinition.mjs +0 -2
  396. package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +0 -2
  397. package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +0 -2
  398. package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
  399. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
  400. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
  401. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
  402. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +0 -2
  403. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +0 -2
  404. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
  405. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
  406. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
  407. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
  408. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
  409. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +0 -13
  410. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
  411. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -2
  412. package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +0 -18
  413. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -2
  414. package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
  415. package/esm2022/lib/view-context/api/model/view.mjs +0 -2
  416. package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
  417. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
  418. package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
  419. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
  420. package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
  421. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
  422. package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
  423. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -8
  424. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
  425. package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
  426. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
  427. package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
  428. package/esm2022/lib/view-context/api/param.mjs +0 -2
  429. package/esm2022/lib/view-context/api/variables.mjs +0 -9
  430. package/esm2022/lib/view-context/default-view-components.token.mjs +0 -9
  431. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
  432. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -93
  433. package/esm2022/lib/view-context/projects.mjs +0 -30
  434. package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
  435. package/esm2022/lib/view-context/reuse-router-slot.token.mjs +0 -4
  436. package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +0 -57
  437. package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +0 -254
  438. package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +0 -256
  439. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +0 -62
  440. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +0 -29
  441. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
  442. package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +0 -35
  443. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +0 -198
  444. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +0 -95
  445. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +0 -134
  446. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +0 -12
  447. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +0 -256
  448. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -77
  449. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -54
  450. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
  451. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -106
  452. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
  453. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
  454. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -58
  455. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +0 -35
  456. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.mjs +0 -7
  457. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +0 -258
  458. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -348
  459. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -185
  460. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
  461. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -250
  462. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -77
  463. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -35
  464. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -74
  465. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -63
  466. package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
  467. package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -405
  468. package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -1079
  469. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -41
  470. package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
  471. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
  472. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
  473. package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
  474. package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
  475. package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
  476. package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
  477. package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
  478. package/esm2022/lib/view-context/value-api/index.mjs +0 -7
  479. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
  480. package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
  481. package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
  482. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
  483. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
  484. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
  485. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
  486. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
  487. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
  488. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
  489. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
  490. package/esm2022/lib/view-context/value-api/param.mjs +0 -2
  491. package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
  492. package/esm2022/lib/view-context/view-handler-resolution.mjs +0 -21
  493. package/esm2022/lib/view-context/view-op.mjs +0 -41
  494. package/esm2022/lib/view-context/view-slot-resolution.mjs +0 -28
  495. package/esm2022/projects.mjs +0 -31
  496. package/esm2022/smartbit4all-ng-client.mjs +0 -5
  497. package/index.d.ts +0 -5
  498. package/lib/component-factory-service/component-factory-service.module.d.ts +0 -6
  499. package/lib/component-factory-service/component-factory-service.service.d.ts +0 -13
  500. package/lib/component-factory-service/projects.d.ts +0 -2
  501. package/lib/session/api/api/api.d.ts +0 -3
  502. package/lib/session/api/api/session.service.d.ts +0 -107
  503. package/lib/session/api/configuration.d.ts +0 -104
  504. package/lib/session/api/encoder.d.ts +0 -11
  505. package/lib/session/api/index.d.ts +0 -2
  506. package/lib/session/api/model/accountInfo.d.ts +0 -24
  507. package/lib/session/api/model/apiError.d.ts +0 -15
  508. package/lib/session/api/model/authenticationProviderData.d.ts +0 -17
  509. package/lib/session/api/model/getAuthenticationProvidersResponse.d.ts +0 -15
  510. package/lib/session/api/model/models.d.ts +0 -8
  511. package/lib/session/api/model/refreshSessionRequest.d.ts +0 -14
  512. package/lib/session/api/model/session.d.ts +0 -32
  513. package/lib/session/api/model/sessionInfoData.d.ts +0 -26
  514. package/lib/session/api/model/userActivityLog.d.ts +0 -33
  515. package/lib/session/api/param.d.ts +0 -37
  516. package/lib/session/api/variables.d.ts +0 -8
  517. package/lib/session/cookie-service/smart-cookie.service.d.ts +0 -129
  518. package/lib/session/projects.d.ts +0 -8
  519. package/lib/session/smart-backend-bootstrap.config.d.ts +0 -73
  520. package/lib/session/smart-backend-bootstrap.service.d.ts +0 -57
  521. package/lib/session/smart-default-error-ui.service.d.ts +0 -90
  522. package/lib/session/smart-error-catching.interceptor.d.ts +0 -21
  523. package/lib/session/smart-header-maintainer.interceptor.d.ts +0 -11
  524. package/lib/session/smart-session-handler.service.d.ts +0 -22
  525. package/lib/session/smart-session.module.d.ts +0 -12
  526. package/lib/session/smart-session.service.d.ts +0 -88
  527. package/lib/session/smart-timer/smart-session-timer.component.d.ts +0 -19
  528. package/lib/shared/projects.d.ts +0 -3
  529. package/lib/shared/shared.module.d.ts +0 -9
  530. package/lib/shared/smart-tooltip.directive.d.ts +0 -16
  531. package/lib/shared/smarttable.date-pipe.d.ts +0 -18
  532. package/lib/smart-client/projects.d.ts +0 -3
  533. package/lib/smart-client/smart-component-api-client.d.ts +0 -143
  534. package/lib/smart-client/smart-file-uploader/smart-file-uploader.component.d.ts +0 -25
  535. package/lib/smart-client/smart.component.d.ts +0 -35
  536. package/lib/smart-client/smart.service.d.ts +0 -29
  537. package/lib/smart-component-layout/api/api/api.d.ts +0 -3
  538. package/lib/smart-component-layout/api/api/default.service.d.ts +0 -33
  539. package/lib/smart-component-layout/api/api.module.d.ts +0 -11
  540. package/lib/smart-component-layout/api/configuration.d.ts +0 -104
  541. package/lib/smart-component-layout/api/encoder.d.ts +0 -11
  542. package/lib/smart-component-layout/api/index.d.ts +0 -6
  543. package/lib/smart-component-layout/api/model/componentType.d.ts +0 -16
  544. package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +0 -20
  545. package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +0 -19
  546. package/lib/smart-component-layout/api/model/layoutDirection.d.ts +0 -15
  547. package/lib/smart-component-layout/api/model/models.d.ts +0 -9
  548. package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +0 -32
  549. package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +0 -26
  550. package/lib/smart-component-layout/api/model/toolbarAlignment.d.ts +0 -15
  551. package/lib/smart-component-layout/api/model/toolbarDirection.d.ts +0 -15
  552. package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +0 -18
  553. package/lib/smart-component-layout/api/param.d.ts +0 -37
  554. package/lib/smart-component-layout/api/variables.d.ts +0 -8
  555. package/lib/smart-component-layout/projects.d.ts +0 -4
  556. package/lib/smart-component-layout/smart-component-layout-utility.d.ts +0 -25
  557. package/lib/smart-component-layout/smart-component-layout.component.d.ts +0 -93
  558. package/lib/smart-component-layout/smart-component-layout.module.d.ts +0 -17
  559. package/lib/smart-diagram/api/api/api.d.ts +0 -3
  560. package/lib/smart-diagram/api/api/diagramService.service.d.ts +0 -36
  561. package/lib/smart-diagram/api/api.module.d.ts +0 -11
  562. package/lib/smart-diagram/api/configuration.d.ts +0 -104
  563. package/lib/smart-diagram/api/encoder.d.ts +0 -11
  564. package/lib/smart-diagram/api/index.d.ts +0 -6
  565. package/lib/smart-diagram/api/model/diagramColor.d.ts +0 -17
  566. package/lib/smart-diagram/api/model/diagramDataContainer.d.ts +0 -19
  567. package/lib/smart-diagram/api/model/diagramDataItem.d.ts +0 -25
  568. package/lib/smart-diagram/api/model/diagramDataSet.d.ts +0 -22
  569. package/lib/smart-diagram/api/model/diagramDescriptor.d.ts +0 -57
  570. package/lib/smart-diagram/api/model/diagramModel.d.ts +0 -19
  571. package/lib/smart-diagram/api/model/diagramShape.d.ts +0 -30
  572. package/lib/smart-diagram/api/model/drawTime.d.ts +0 -18
  573. package/lib/smart-diagram/api/model/labelText.d.ts +0 -21
  574. package/lib/smart-diagram/api/model/models.d.ts +0 -9
  575. package/lib/smart-diagram/api/param.d.ts +0 -37
  576. package/lib/smart-diagram/api/variables.d.ts +0 -8
  577. package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +0 -33
  578. package/lib/smart-diagram/component/smart-diagram.component.d.ts +0 -43
  579. package/lib/smart-diagram/component/smart-diagram.module.d.ts +0 -11
  580. package/lib/smart-diagram/component/smart-diagram.util.d.ts +0 -1
  581. package/lib/smart-diagram/projects.d.ts +0 -4
  582. package/lib/smart-dialog/projects.d.ts +0 -4
  583. package/lib/smart-dialog/smartdialog.component.d.ts +0 -19
  584. package/lib/smart-dialog/smartdialog.model.d.ts +0 -68
  585. package/lib/smart-dialog/smartdialog.module.d.ts +0 -14
  586. package/lib/smart-dialog/smartdialog.service.d.ts +0 -28
  587. package/lib/smart-expandable-section/expandable-section.component.d.ts +0 -30
  588. package/lib/smart-expandable-section/expandable-section.model.d.ts +0 -43
  589. package/lib/smart-expandable-section/projects.d.ts +0 -4
  590. package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +0 -17
  591. package/lib/smart-expandable-section/smart-expandable-section.service.d.ts +0 -6
  592. package/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.d.ts +0 -15
  593. package/lib/smart-filter/api/filter/model/filterExpressionBuilderField.d.ts +0 -27
  594. package/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.d.ts +0 -36
  595. package/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.d.ts +0 -27
  596. package/lib/smart-filter/api/filter/model/filterExpressionData.d.ts +0 -27
  597. package/lib/smart-filter/api/filter/model/filterExpressionDataType.d.ts +0 -18
  598. package/lib/smart-filter/api/filter/model/filterExpressionField.d.ts +0 -44
  599. package/lib/smart-filter/api/filter/model/filterExpressionFieldList.d.ts +0 -21
  600. package/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.d.ts +0 -26
  601. package/lib/smart-filter/api/filter/model/filterExpressionList.d.ts +0 -18
  602. package/lib/smart-filter/api/filter/model/filterExpressionOperandData.d.ts +0 -25
  603. package/lib/smart-filter/api/filter/model/filterExpressionOperation.d.ts +0 -30
  604. package/lib/smart-filter/api/filter/model/filterExpressionOrderBy.d.ts +0 -25
  605. package/lib/smart-filter/api/filter/model/model.d.ts +0 -15
  606. package/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.d.ts +0 -19
  607. package/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.d.ts +0 -18
  608. package/lib/smart-filter/api/value/model/value.d.ts +0 -29
  609. package/lib/smart-filter/projects.d.ts +0 -5
  610. package/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.d.ts +0 -8
  611. package/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.d.ts +0 -31
  612. package/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.d.ts +0 -18
  613. package/lib/smart-filter/smart-filter/smart-filter.component.d.ts +0 -15
  614. package/lib/smart-filter/smart-filter/smart-filter.service.d.ts +0 -16
  615. package/lib/smart-filter/smart-filter.model.d.ts +0 -25
  616. package/lib/smart-filter/smart-filter.module.d.ts +0 -15
  617. package/lib/smart-filter-editor/api/api/filter.service.d.ts +0 -57
  618. package/lib/smart-filter-editor/api/configuration.d.ts +0 -104
  619. package/lib/smart-filter-editor/api/encoder.d.ts +0 -11
  620. package/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.d.ts +0 -15
  621. package/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.d.ts +0 -16
  622. package/lib/smart-filter-editor/api/model/filterExpressionBuilderField.d.ts +0 -27
  623. package/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.d.ts +0 -36
  624. package/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.d.ts +0 -27
  625. package/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.d.ts +0 -38
  626. package/lib/smart-filter-editor/api/model/filterExpressionData.d.ts +0 -27
  627. package/lib/smart-filter-editor/api/model/filterExpressionDataType.d.ts +0 -18
  628. package/lib/smart-filter-editor/api/model/filterExpressionField.d.ts +0 -44
  629. package/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.d.ts +0 -17
  630. package/lib/smart-filter-editor/api/model/filterExpressionFieldList.d.ts +0 -21
  631. package/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.d.ts +0 -26
  632. package/lib/smart-filter-editor/api/model/filterExpressionList.d.ts +0 -18
  633. package/lib/smart-filter-editor/api/model/filterExpressionOperandData.d.ts +0 -25
  634. package/lib/smart-filter-editor/api/model/filterExpressionOperation.d.ts +0 -30
  635. package/lib/smart-filter-editor/api/model/filterExpressionOrderBy.d.ts +0 -28
  636. package/lib/smart-filter-editor/api/model/smartFilterType.d.ts +0 -15
  637. package/lib/smart-filter-editor/api/param.d.ts +0 -37
  638. package/lib/smart-filter-editor/api/variables.d.ts +0 -8
  639. package/lib/smart-filter-editor/filterExpressionBuilderApiActions.d.ts +0 -13
  640. package/lib/smart-filter-editor/project.d.ts +0 -7
  641. package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.d.ts +0 -19
  642. package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.d.ts +0 -17
  643. package/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.d.ts +0 -44
  644. package/lib/smart-filter-editor/smart-filter-editor.model.d.ts +0 -4
  645. package/lib/smart-filter-editor/smart-filter-editor.module.d.ts +0 -18
  646. package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +0 -45
  647. package/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.d.ts +0 -9
  648. package/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.d.ts +0 -21
  649. package/lib/smart-form/api/api/api.d.ts +0 -3
  650. package/lib/smart-form/api/api/default.service.d.ts +0 -33
  651. package/lib/smart-form/api/api.module.d.ts +0 -11
  652. package/lib/smart-form/api/configuration.d.ts +0 -104
  653. package/lib/smart-form/api/encoder.d.ts +0 -11
  654. package/lib/smart-form/api/index.d.ts +0 -6
  655. package/lib/smart-form/api/model/dateFieldProperties.d.ts +0 -15
  656. package/lib/smart-form/api/model/divProperties.d.ts +0 -15
  657. package/lib/smart-form/api/model/fileUploaderProperties.d.ts +0 -20
  658. package/lib/smart-form/api/model/imageProperties.d.ts +0 -15
  659. package/lib/smart-form/api/model/models.d.ts +0 -19
  660. package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +0 -19
  661. package/lib/smart-form/api/model/propertyMapping.d.ts +0 -24
  662. package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +0 -20
  663. package/lib/smart-form/api/model/selectionDefinition.d.ts +0 -58
  664. package/lib/smart-form/api/model/smartFormInputMode.d.ts +0 -20
  665. package/lib/smart-form/api/model/smartFormWidgetDirection.d.ts +0 -15
  666. package/lib/smart-form/api/model/smartFormWidgetType.d.ts +0 -47
  667. package/lib/smart-form/api/model/smartLayoutDefinition.d.ts +0 -15
  668. package/lib/smart-form/api/model/smartMatrixModel.d.ts +0 -29
  669. package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +0 -125
  670. package/lib/smart-form/api/model/smartWidgetHint.d.ts +0 -19
  671. package/lib/smart-form/api/model/sortDefinition.d.ts +0 -15
  672. package/lib/smart-form/api/model/textBoxProperties.d.ts +0 -15
  673. package/lib/smart-form/api/model/textFieldProperties.d.ts +0 -14
  674. package/lib/smart-form/api/model/valueChangeMode.d.ts +0 -19
  675. package/lib/smart-form/api/param.d.ts +0 -37
  676. package/lib/smart-form/api/variables.d.ts +0 -8
  677. package/lib/smart-form/highlightMacthingString-pipe.d.ts +0 -7
  678. package/lib/smart-form/projects.d.ts +0 -14
  679. package/lib/smart-form/services/smartform.layout-definition.service.d.ts +0 -50
  680. package/lib/smart-form/services/smartform.service.d.ts +0 -52
  681. package/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.d.ts +0 -8
  682. package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +0 -38
  683. package/lib/smart-form/smartfileuploader/smartfileuploader.model.d.ts +0 -7
  684. package/lib/smart-form/smartform.component.d.ts +0 -43
  685. package/lib/smart-form/smartform.form-model.d.ts +0 -864
  686. package/lib/smart-form/smartform.model.d.ts +0 -126
  687. package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +0 -54
  688. package/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.d.ts +0 -29
  689. package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +0 -57
  690. package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +0 -50
  691. package/lib/smart-form/widgets/directives/comparable-dropdown.directive.d.ts +0 -10
  692. package/lib/smart-form/widgets/directives/comparable-multiselect.directive.d.ts +0 -10
  693. package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +0 -173
  694. package/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.d.ts +0 -24
  695. package/lib/smart-form/widgets/smartformwidget/trackCaps.directive.d.ts +0 -9
  696. package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +0 -21
  697. package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +0 -18
  698. package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +0 -54
  699. package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +0 -19
  700. package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +0 -24
  701. package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +0 -2
  702. package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +0 -27
  703. package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +0 -14
  704. package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +0 -17
  705. package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +0 -18
  706. package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +0 -12
  707. package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +0 -11
  708. package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +0 -11
  709. package/lib/smart-generic-pages/projects.d.ts +0 -9
  710. package/lib/smart-generic-pages/search-page/search-page.component.d.ts +0 -25
  711. package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +0 -19
  712. package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +0 -17
  713. package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +0 -25
  714. package/lib/smart-grid/api/grid-api/api/api.d.ts +0 -3
  715. package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +0 -182
  716. package/lib/smart-grid/api/grid-api/api.module.d.ts +0 -11
  717. package/lib/smart-grid/api/grid-api/configuration.d.ts +0 -104
  718. package/lib/smart-grid/api/grid-api/encoder.d.ts +0 -11
  719. package/lib/smart-grid/api/grid-api/index.d.ts +0 -6
  720. package/lib/smart-grid/api/grid-api/model/gridColumnContentType.d.ts +0 -15
  721. package/lib/smart-grid/api/grid-api/model/gridColumnMeta.d.ts +0 -34
  722. package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +0 -44
  723. package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +0 -19
  724. package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +0 -36
  725. package/lib/smart-grid/api/grid-api/model/gridPage.d.ts +0 -26
  726. package/lib/smart-grid/api/grid-api/model/gridRow.d.ts +0 -47
  727. package/lib/smart-grid/api/grid-api/model/gridRowLayoutDescriptor.d.ts +0 -20
  728. package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +0 -24
  729. package/lib/smart-grid/api/grid-api/model/gridSelectionMode.d.ts +0 -16
  730. package/lib/smart-grid/api/grid-api/model/gridSelectionType.d.ts +0 -15
  731. package/lib/smart-grid/api/grid-api/model/gridServerModel.d.ts +0 -22
  732. package/lib/smart-grid/api/grid-api/model/gridUpdateData.d.ts +0 -20
  733. package/lib/smart-grid/api/grid-api/model/gridView.d.ts +0 -21
  734. package/lib/smart-grid/api/grid-api/model/gridViewDescriptor.d.ts +0 -39
  735. package/lib/smart-grid/api/grid-api/model/models.d.ts +0 -15
  736. package/lib/smart-grid/api/grid-api/param.d.ts +0 -37
  737. package/lib/smart-grid/api/grid-api/variables.d.ts +0 -8
  738. package/lib/smart-grid/components/expandable-grid/expandable-grid.component.d.ts +0 -10
  739. package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +0 -21
  740. package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +0 -26
  741. package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +0 -47
  742. package/lib/smart-grid/models/model.d.ts +0 -73
  743. package/lib/smart-grid/projects.d.ts +0 -5
  744. package/lib/smart-grid/smart-grid-toolbar-util.d.ts +0 -12
  745. package/lib/smart-grid/smart-grid.component.d.ts +0 -157
  746. package/lib/smart-grid/smart-grid.module.d.ts +0 -29
  747. package/lib/smart-grid/smart-grid.service.d.ts +0 -26
  748. package/lib/smart-icon/projects.d.ts +0 -5
  749. package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +0 -34
  750. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +0 -10
  751. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +0 -14
  752. package/lib/smart-icon/smart-icon.module.d.ts +0 -14
  753. package/lib/smart-icon/smart-icon.service.d.ts +0 -29
  754. package/lib/smart-map/abstract-map.d.ts +0 -37
  755. package/lib/smart-map/api/api/api.d.ts +0 -3
  756. package/lib/smart-map/api/api/geoMap.service.d.ts +0 -101
  757. package/lib/smart-map/api/api.module.d.ts +0 -11
  758. package/lib/smart-map/api/configuration.d.ts +0 -104
  759. package/lib/smart-map/api/encoder.d.ts +0 -11
  760. package/lib/smart-map/api/index.d.ts +0 -6
  761. package/lib/smart-map/api/model/gPSPosition.d.ts +0 -32
  762. package/lib/smart-map/api/model/gPSRoute.d.ts +0 -21
  763. package/lib/smart-map/api/model/geoMapChange.d.ts +0 -21
  764. package/lib/smart-map/api/model/geoMapDataLoadingMode.d.ts +0 -15
  765. package/lib/smart-map/api/model/geoMapDataSourceDescriptor.d.ts +0 -52
  766. package/lib/smart-map/api/model/geoMapDataSourceType.d.ts +0 -17
  767. package/lib/smart-map/api/model/geoMapEditingSession.d.ts +0 -17
  768. package/lib/smart-map/api/model/geoMapInteraction.d.ts +0 -24
  769. package/lib/smart-map/api/model/geoMapItem.d.ts +0 -41
  770. package/lib/smart-map/api/model/geoMapItemKind.d.ts +0 -16
  771. package/lib/smart-map/api/model/geoMapLayer.d.ts +0 -19
  772. package/lib/smart-map/api/model/geoMapLayerChange.d.ts +0 -20
  773. package/lib/smart-map/api/model/geoMapLayerDescriptor.d.ts +0 -28
  774. package/lib/smart-map/api/model/geoMapModel.d.ts +0 -26
  775. package/lib/smart-map/api/model/geoMapOperationMode.d.ts +0 -15
  776. package/lib/smart-map/api/model/geoMapSelectionMode.d.ts +0 -16
  777. package/lib/smart-map/api/model/geoMapServerModel.d.ts +0 -25
  778. package/lib/smart-map/api/model/geoMapTextType.d.ts +0 -15
  779. package/lib/smart-map/api/model/geoMapViewState.d.ts +0 -27
  780. package/lib/smart-map/api/model/geoMapViewport.d.ts +0 -20
  781. package/lib/smart-map/api/model/models.d.ts +0 -20
  782. package/lib/smart-map/api/param.d.ts +0 -37
  783. package/lib/smart-map/api/variables.d.ts +0 -8
  784. package/lib/smart-map/api-default/api-default.d.ts +0 -2
  785. package/lib/smart-map/impl/google-map.d.ts +0 -23
  786. package/lib/smart-map/impl/leaflet-map.d.ts +0 -22
  787. package/lib/smart-map/projects.d.ts +0 -8
  788. package/lib/smart-map/smart-map.component.d.ts +0 -39
  789. package/lib/smart-map/smart-map.module.d.ts +0 -11
  790. package/lib/smart-map/smart-map.types.d.ts +0 -34
  791. package/lib/smart-navbar/projects.d.ts +0 -4
  792. package/lib/smart-navbar/smart-navbar.component.d.ts +0 -20
  793. package/lib/smart-navbar/smart-navbar.model.d.ts +0 -48
  794. package/lib/smart-navbar/smart-navbar.module.d.ts +0 -18
  795. package/lib/smart-navbar/smart-navbar.service.d.ts +0 -6
  796. package/lib/smart-navigation/projects.d.ts +0 -2
  797. package/lib/smart-navigation/smart-navigation.interface.d.ts +0 -5
  798. package/lib/smart-navigation/smart-navigation.module.d.ts +0 -6
  799. package/lib/smart-navigation/smart-navigation.service.d.ts +0 -12
  800. package/lib/smart-ng-client.module.d.ts +0 -25
  801. package/lib/smart-ng-client.service.d.ts +0 -10
  802. package/lib/smart-subject/projects.d.ts +0 -1
  803. package/lib/smart-subject/smart-subject.d.ts +0 -6
  804. package/lib/smart-tab-group/projects.d.ts +0 -1
  805. package/lib/smart-tab-group/smart-tab-group.module.d.ts +0 -10
  806. package/lib/smart-table/components/default-actions-popup/default-actions-popup.component.d.ts +0 -19
  807. package/lib/smart-table/components/loading/loading.component.d.ts +0 -8
  808. package/lib/smart-table/directives/mat-context-menu-trigger-for.directive.d.ts +0 -10
  809. package/lib/smart-table/projects.d.ts +0 -4
  810. package/lib/smart-table/smarttable.component.d.ts +0 -34
  811. package/lib/smart-table/smarttable.model.d.ts +0 -202
  812. package/lib/smart-table/smarttable.module.d.ts +0 -29
  813. package/lib/smart-table/smarttable.service.d.ts +0 -6
  814. package/lib/smart-table/tables/material-table/material-table.component.d.ts +0 -8
  815. package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +0 -8
  816. package/lib/smart-table/tables/table.d.ts +0 -98
  817. package/lib/smart-tree/projects.d.ts +0 -5
  818. package/lib/smart-tree/smarttree-generic.service.d.ts +0 -48
  819. package/lib/smart-tree/smarttree.component.d.ts +0 -43
  820. package/lib/smart-tree/smarttree.model.d.ts +0 -42
  821. package/lib/smart-tree/smarttree.module.d.ts +0 -16
  822. package/lib/smart-tree/smarttree.node.model.d.ts +0 -13
  823. package/lib/smart-tree/smarttree.service.d.ts +0 -25
  824. package/lib/smart-tree/smarttree.service.interface.d.ts +0 -43
  825. package/lib/smart-tree/tree-api/api/tree.service.d.ts +0 -336
  826. package/lib/smart-tree/tree-api/configuration.d.ts +0 -104
  827. package/lib/smart-tree/tree-api/encoder.d.ts +0 -11
  828. package/lib/smart-tree/tree-api/param.d.ts +0 -37
  829. package/lib/smart-tree/tree-api/variables.d.ts +0 -8
  830. package/lib/smart-validation/named-validator.service.d.ts +0 -17
  831. package/lib/smart-validation/projects.d.ts +0 -3
  832. package/lib/smart-validation/smart-validation.module.d.ts +0 -8
  833. package/lib/smart-validation/smart-validation.types.d.ts +0 -12
  834. package/lib/theme/theme.service.d.ts +0 -17
  835. package/lib/view-context/api/api/api.d.ts +0 -3
  836. package/lib/view-context/api/api/view.service.d.ts +0 -426
  837. package/lib/view-context/api/api-default/binaryContentData.d.ts +0 -2
  838. package/lib/view-context/api/api-default/binaryData.d.ts +0 -2
  839. package/lib/view-context/api/api-default/invocationError.d.ts +0 -2
  840. package/lib/view-context/api/api-default/invocationRequest.d.ts +0 -2
  841. package/lib/view-context/api/api-default/invocationRun.d.ts +0 -2
  842. package/lib/view-context/api/api.module.d.ts +0 -11
  843. package/lib/view-context/api/configuration.d.ts +0 -104
  844. package/lib/view-context/api/encoder.d.ts +0 -11
  845. package/lib/view-context/api/index.d.ts +0 -6
  846. package/lib/view-context/api/model/backgroundProcessInfo.d.ts +0 -25
  847. package/lib/view-context/api/model/badgeDescriptor.d.ts +0 -15
  848. package/lib/view-context/api/model/clipboardData.d.ts +0 -20
  849. package/lib/view-context/api/model/closeResult.d.ts +0 -16
  850. package/lib/view-context/api/model/componentConstraint.d.ts +0 -31
  851. package/lib/view-context/api/model/componentModel.d.ts +0 -47
  852. package/lib/view-context/api/model/componentModelChange.d.ts +0 -29
  853. package/lib/view-context/api/model/dataChange.d.ts +0 -25
  854. package/lib/view-context/api/model/dataChangeEvent.d.ts +0 -31
  855. package/lib/view-context/api/model/dataChangeKind.d.ts +0 -19
  856. package/lib/view-context/api/model/deviceInfo.d.ts +0 -43
  857. package/lib/view-context/api/model/downloadedFile.d.ts +0 -19
  858. package/lib/view-context/api/model/iconPosition.d.ts +0 -18
  859. package/lib/view-context/api/model/imageResource.d.ts +0 -28
  860. package/lib/view-context/api/model/link.d.ts +0 -35
  861. package/lib/view-context/api/model/menuDescriptor.d.ts +0 -17
  862. package/lib/view-context/api/model/menuOpenDirection.d.ts +0 -21
  863. package/lib/view-context/api/model/menuTriggerType.d.ts +0 -15
  864. package/lib/view-context/api/model/messageData.d.ts +0 -29
  865. package/lib/view-context/api/model/messageOption.d.ts +0 -20
  866. package/lib/view-context/api/model/messageOptionType.d.ts +0 -16
  867. package/lib/view-context/api/model/messageResult.d.ts +0 -16
  868. package/lib/view-context/api/model/messageTextType.d.ts +0 -15
  869. package/lib/view-context/api/model/messageType.d.ts +0 -17
  870. package/lib/view-context/api/model/models.d.ts +0 -70
  871. package/lib/view-context/api/model/multiComboBoxElement.d.ts +0 -16
  872. package/lib/view-context/api/model/multiComboBoxModel.d.ts +0 -16
  873. package/lib/view-context/api/model/namedValidator.d.ts +0 -27
  874. package/lib/view-context/api/model/openPendingData.d.ts +0 -29
  875. package/lib/view-context/api/model/publishedViewData.d.ts +0 -14
  876. package/lib/view-context/api/model/serverRequestExecutionStat.d.ts +0 -40
  877. package/lib/view-context/api/model/serverRequestTrack.d.ts +0 -60
  878. package/lib/view-context/api/model/serverRequestType.d.ts +0 -22
  879. package/lib/view-context/api/model/shellProperty.d.ts +0 -15
  880. package/lib/view-context/api/model/smartLinkData.d.ts +0 -29
  881. package/lib/view-context/api/model/smartLinkMigrationStatus.d.ts +0 -39
  882. package/lib/view-context/api/model/statisticRecord.d.ts +0 -36
  883. package/lib/view-context/api/model/style.d.ts +0 -21
  884. package/lib/view-context/api/model/themeDefinition.d.ts +0 -22
  885. package/lib/view-context/api/model/themeDescriptor.d.ts +0 -16
  886. package/lib/view-context/api/model/themeShellDescriptor.d.ts +0 -17
  887. package/lib/view-context/api/model/uiAction.d.ts +0 -68
  888. package/lib/view-context/api/model/uiActionButtonDescriptor.d.ts +0 -25
  889. package/lib/view-context/api/model/uiActionButtonType.d.ts +0 -25
  890. package/lib/view-context/api/model/uiActionConstraint.d.ts +0 -22
  891. package/lib/view-context/api/model/uiActionDefinition.d.ts +0 -19
  892. package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +0 -18
  893. package/lib/view-context/api/model/uiActionDescriptor.d.ts +0 -44
  894. package/lib/view-context/api/model/uiActionDialogDescriptor.d.ts +0 -23
  895. package/lib/view-context/api/model/uiActionFeedbackType.d.ts +0 -18
  896. package/lib/view-context/api/model/uiActionInputType.d.ts +0 -19
  897. package/lib/view-context/api/model/uiActionRequest.d.ts +0 -31
  898. package/lib/view-context/api/model/uiActionSchedule.d.ts +0 -14
  899. package/lib/view-context/api/model/uiActionTooltip.d.ts +0 -25
  900. package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +0 -27
  901. package/lib/view-context/api/model/uploadWidgetType.d.ts +0 -16
  902. package/lib/view-context/api/model/uploadedFile.d.ts +0 -20
  903. package/lib/view-context/api/model/valueSet.d.ts +0 -20
  904. package/lib/view-context/api/model/view.d.ts +0 -88
  905. package/lib/view-context/api/model/viewApiError.d.ts +0 -18
  906. package/lib/view-context/api/model/viewConstraint.d.ts +0 -18
  907. package/lib/view-context/api/model/viewContext.d.ts +0 -33
  908. package/lib/view-context/api/model/viewContextChange.d.ts +0 -24
  909. package/lib/view-context/api/model/viewContextData.d.ts +0 -25
  910. package/lib/view-context/api/model/viewContextUpdate.d.ts +0 -24
  911. package/lib/view-context/api/model/viewData.d.ts +0 -28
  912. package/lib/view-context/api/model/viewEventHandler.d.ts +0 -36
  913. package/lib/view-context/api/model/viewPlaceholder.d.ts +0 -22
  914. package/lib/view-context/api/model/viewState.d.ts +0 -20
  915. package/lib/view-context/api/model/viewStateUpdate.d.ts +0 -22
  916. package/lib/view-context/api/model/viewType.d.ts +0 -16
  917. package/lib/view-context/api/param.d.ts +0 -37
  918. package/lib/view-context/api/variables.d.ts +0 -8
  919. package/lib/view-context/default-view-components.token.d.ts +0 -18
  920. package/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.d.ts +0 -9
  921. package/lib/view-context/message-dialog/message-dialog.component.d.ts +0 -27
  922. package/lib/view-context/projects.d.ts +0 -26
  923. package/lib/view-context/property-definition-data.d.ts +0 -5
  924. package/lib/view-context/reuse-router-slot.token.d.ts +0 -3
  925. package/lib/view-context/smart-embedded-slot.directive.d.ts +0 -20
  926. package/lib/view-context/smart-ui-action/components/menu/click/menu.component.d.ts +0 -49
  927. package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +0 -50
  928. package/lib/view-context/smart-ui-action/components/menu/menu.constants.d.ts +0 -7
  929. package/lib/view-context/smart-ui-action/components/menu/menu.service.d.ts +0 -11
  930. package/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.d.ts +0 -13
  931. package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +0 -16
  932. package/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.d.ts +0 -30
  933. package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +0 -32
  934. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +0 -40
  935. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +0 -3
  936. package/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.d.ts +0 -43
  937. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +0 -29
  938. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +0 -21
  939. package/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.d.ts +0 -15
  940. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +0 -36
  941. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +0 -26
  942. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.d.ts +0 -31
  943. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +0 -28
  944. package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +0 -13
  945. package/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.d.ts +0 -5
  946. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +0 -55
  947. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +0 -73
  948. package/lib/view-context/smart-ui-action/ui-action.descriptor.service.d.ts +0 -23
  949. package/lib/view-context/smart-ui-action/ui-action.model.d.ts +0 -43
  950. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +0 -42
  951. package/lib/view-context/smart-view-context-dialog.service.d.ts +0 -21
  952. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.d.ts +0 -15
  953. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +0 -21
  954. package/lib/view-context/smart-view-context.interceptor.d.ts +0 -17
  955. package/lib/view-context/smart-view-context.model.d.ts +0 -37
  956. package/lib/view-context/smart-view-context.module.d.ts +0 -86
  957. package/lib/view-context/smart-view-context.service.d.ts +0 -172
  958. package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +0 -16
  959. package/lib/view-context/utility/componentLibrary.d.ts +0 -6
  960. package/lib/view-context/utility/smart-object-utility.d.ts +0 -5
  961. package/lib/view-context/utility/smart-style-utility.d.ts +0 -12
  962. package/lib/view-context/value-api/api/api.d.ts +0 -3
  963. package/lib/view-context/value-api/api/value.service.d.ts +0 -35
  964. package/lib/view-context/value-api/api.module.d.ts +0 -11
  965. package/lib/view-context/value-api/configuration.d.ts +0 -104
  966. package/lib/view-context/value-api/encoder.d.ts +0 -11
  967. package/lib/view-context/value-api/index.d.ts +0 -6
  968. package/lib/view-context/value-api/model/genericValue.d.ts +0 -33
  969. package/lib/view-context/value-api/model/models.d.ts +0 -10
  970. package/lib/view-context/value-api/model/value.d.ts +0 -29
  971. package/lib/view-context/value-api/model/valueSetData.d.ts +0 -41
  972. package/lib/view-context/value-api/model/valueSetDefinition.d.ts +0 -16
  973. package/lib/view-context/value-api/model/valueSetDefinitionData.d.ts +0 -53
  974. package/lib/view-context/value-api/model/valueSetDefinitionIdentifier.d.ts +0 -21
  975. package/lib/view-context/value-api/model/valueSetDefinitionKind.d.ts +0 -22
  976. package/lib/view-context/value-api/model/valueSetExpression.d.ts +0 -18
  977. package/lib/view-context/value-api/model/valueSetOperand.d.ts +0 -25
  978. package/lib/view-context/value-api/model/valueSetOperation.d.ts +0 -17
  979. package/lib/view-context/value-api/param.d.ts +0 -37
  980. package/lib/view-context/value-api/variables.d.ts +0 -8
  981. package/lib/view-context/view-handler-resolution.d.ts +0 -11
  982. package/lib/view-context/view-op.d.ts +0 -18
  983. package/lib/view-context/view-slot-resolution.d.ts +0 -27
  984. package/projects.d.ts +0 -27
  985. package/smartbit4all-ng-client-6.0.32.tgz +0 -0
@@ -1,1074 +0,0 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { FlatTreeControl } from '@angular/cdk/tree';
3
- import { Component, HostBinding, Inject, Input, ViewChild, ViewChildren, ViewContainerRef, } from '@angular/core';
4
- import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
5
- import { Subject, takeUntil } from 'rxjs';
6
- import { FilterExpressionOrderBy } from '../smart-filter-editor/api/model/filterExpressionOrderBy';
7
- import { SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOrder, SmartTableType, SmarttableComponent, } from '../smart-table/projects';
8
- import { UiActionButtonType, } from '../view-context/api';
9
- import { COMPONENT_LIBRARY, ComponentLibrary, } from '../view-context/projects';
10
- import { GridSelectionMode, GridSelectionType, GridViewDescriptorKindEnum, } from './api/grid-api';
11
- import { TableLayoutDefinerComponent } from './components/table-layout-definer/table-layout-definer.component';
12
- import { GridUiActionType, SmartGridDataLayout, SmartGridType, SmartLayoutDef, } from './models/model';
13
- import { SmartGridService } from './smart-grid.service';
14
- import { FilterExpressionOrderByOrderEnum } from '../smart-filter/projects';
15
- import { SmartGridToolbarActionsUtil } from './smart-grid-toolbar-util';
16
- import { ExpandedRowRendererComponent } from './components/generic-component/expanded-row-renderer.component';
17
- import { SmartDatePipe, SmartDateTimePipe, SmartTimePipe } from '../shared/smarttable.date-pipe';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "./smart-grid.service";
20
- import * as i2 from "../component-factory-service/projects";
21
- import * as i3 from "@angular/material/dialog";
22
- import * as i4 from "../view-context/projects";
23
- import * as i5 from "../shared/smarttable.date-pipe";
24
- import * as i6 from "@angular/common";
25
- import * as i7 from "../smart-icon/smart-icon/smart-icon.component";
26
- import * as i8 from "@angular/material/icon";
27
- import * as i9 from "@angular/material/button";
28
- import * as i10 from "@angular/material/paginator";
29
- import * as i11 from "@angular/material/tree";
30
- import * as i12 from "@angular/material/checkbox";
31
- import * as i13 from "../smart-expandable-section/expandable-section.component";
32
- import * as i14 from "../view-context/smart-ui-action/ui-action-toolbar.component";
33
- import * as i15 from "../smart-form/widgets/directives/comparable-multiselect.directive";
34
- import * as i16 from "primeng/table";
35
- import * as i17 from "primeng/api";
36
- import * as i18 from "primeng/button";
37
- import * as i19 from "primeng/menu";
38
- import * as i20 from "primeng/tooltip";
39
- import * as i21 from "primeng/paginator";
40
- import * as i22 from "@angular/forms";
41
- import * as i23 from "primeng/multiselect";
42
- import * as i24 from "./components/smart-grid-card/smart-grid-card.component";
43
- import * as i25 from "./components/generic-component/expanded-row-renderer.component";
44
- export class SmartGridComponent {
45
- get testId() {
46
- return this.smartGrid?.gridModel?.identifier ?? null;
47
- }
48
- constructor(service, cfService, dialog, injector, uiActionDescriptorService, smartDatePipe, smartDateTimePipe, smartTimePipe, compLib, gridMenuIcon) {
49
- this.service = service;
50
- this.cfService = cfService;
51
- this.dialog = dialog;
52
- this.injector = injector;
53
- this.uiActionDescriptorService = uiActionDescriptorService;
54
- this.smartDatePipe = smartDatePipe;
55
- this.smartDateTimePipe = smartDateTimePipe;
56
- this.smartTimePipe = smartTimePipe;
57
- this.compLib = compLib;
58
- this.gridMenuIcon = gridMenuIcon;
59
- // private readonly defaultPageSize: number = 10;
60
- this.defaultPageSizeOptions = [5, 10, 25, 50];
61
- this.componentLibrary = ComponentLibrary;
62
- this._destroy$ = new Subject();
63
- this.dev = false;
64
- this.defaultActionToolbarId = SmartGridToolbarActionsUtil.defaultActionToolbarId;
65
- this.expandedRows = {};
66
- this.selectedRows = [];
67
- this.pageSizeOptions = this.defaultPageSizeOptions;
68
- this.selectionChanges = new Subject();
69
- this.uiActionDescriptors = new Map();
70
- this.cellToActionMap = {};
71
- this.afterViewInitExecuted = false;
72
- this.isBlocked = true;
73
- this.getLevel = (node) => node.level ?? 0;
74
- this.isExpandable = (node) => (node.children && node.children.length > 0 ? true : false);
75
- this.getChildren = (node) => {
76
- if (node.children) {
77
- let rows = this.smartGrid?.gridModel.page.rows?.filter((row) => node.children?.some((child) => child === row.id));
78
- if (rows) {
79
- return rows;
80
- }
81
- }
82
- return [];
83
- };
84
- this.hasChild = (_, _nodeData) => this.isExpandable(_nodeData);
85
- this.transformer = (row, level) => {
86
- row.level = level;
87
- return row;
88
- };
89
- //PRIMENG
90
- this.columns = [];
91
- this.rowMenuActionModelCache = new Map();
92
- this.rowMenuActionModelArrayCache = new Map();
93
- this.service.gridModelChanged.subscribe(() => {
94
- // called after every service call (load, save, refresh, etc.)
95
- this.smartGrid.gridModel = this.service.gridModel;
96
- this.render();
97
- //Refresh expanded sections data
98
- if (this.smartGrid.expandable) {
99
- this.expandedRowsComps.forEach((rowComp) => rowComp.refreshRowData());
100
- }
101
- });
102
- }
103
- ngOnChanges(changes) {
104
- if (changes['smartGrid']) {
105
- this.smartGrid = changes['smartGrid'].currentValue;
106
- this.service.paginator = this.smartGrid?.paginator;
107
- this.setupToolbar();
108
- }
109
- if (changes['uuid']) {
110
- if (changes['uuid'] && this.uuid === changes['uuid'].currentValue) {
111
- this.expandedRows = {};
112
- }
113
- this.uuid = changes['uuid'].currentValue;
114
- }
115
- if (this.afterViewInitExecuted && this.uuid && this.smartGrid) {
116
- this.refresh();
117
- }
118
- }
119
- ngOnDestroy() {
120
- this._destroy$.next();
121
- this._destroy$.complete();
122
- }
123
- ngAfterViewInit() {
124
- if (this.uuid && this.smartGrid) {
125
- this.refresh();
126
- }
127
- this.afterViewInitExecuted = true;
128
- }
129
- /**
130
- *
131
- * @returns the selected rows of the table
132
- */
133
- getSelectedRows() {
134
- if (!this.smartTable.selection)
135
- throw new Error();
136
- return this.smartTable.selection;
137
- }
138
- /**
139
- * This method sends a GET request to the generic GridAPI and refreshes the presented
140
- * grid with the newest one.
141
- */
142
- async refresh() {
143
- this.setupToolbar();
144
- // will cause this.service.gridModelChanged to fire
145
- if (this.uuid) {
146
- await this.service.load(this.uuid, this.smartGrid.gridIdentifier);
147
- }
148
- }
149
- getStyle(row) {
150
- if (row && row.style) {
151
- let style = row.style;
152
- let classesToAdd = [];
153
- if (style.classesToAdd) {
154
- style.classesToAdd.forEach((cl) => classesToAdd.push(cl));
155
- }
156
- if (!style.classesToRemove) {
157
- return classesToAdd;
158
- }
159
- return classesToAdd.filter((cls) => !style.classesToRemove.includes(cls));
160
- }
161
- return [];
162
- }
163
- setupToolbar() {
164
- // check if toolbar is available _and_ need set up
165
- if (this.toolbar && this.smartGrid) {
166
- let toolbarId = this.smartGrid?.gridIdentifier + '_toolbar';
167
- if (toolbarId !== this.toolbar.id) {
168
- this.toolbar.id = toolbarId;
169
- }
170
- }
171
- if (this._headerToolbar && this.smartGrid) {
172
- let headerToolbarId = this.smartGrid?.gridIdentifier + '_headerToolbar';
173
- if (headerToolbarId !== this._headerToolbar.id) {
174
- this._headerToolbar.id = headerToolbarId;
175
- }
176
- }
177
- }
178
- get headerToolbar() {
179
- if (this.compLib === ComponentLibrary.PRIMENG) {
180
- return this._headerToolbar;
181
- }
182
- else {
183
- return this.componentRefTable?.instance.componentRefTable?.instance.headerToolbar;
184
- }
185
- }
186
- async render() {
187
- const gridModel = this.smartGrid?.gridModel;
188
- if (gridModel) {
189
- this.length = gridModel.totalRowCount;
190
- this.pageSize = gridModel.pageSize;
191
- this.pageIndex = gridModel.pageIndex ?? 0;
192
- if (gridModel.pageSizeOptions && gridModel.pageSizeOptions.length > 0) {
193
- this.pageSizeOptions = gridModel.pageSizeOptions;
194
- }
195
- else {
196
- this.pageSizeOptions = this.defaultPageSizeOptions;
197
- }
198
- if (gridModel?.view?.descriptor?.showEditColumns) {
199
- this.smartGrid.showEditColumns = gridModel?.view?.descriptor?.showEditColumns;
200
- }
201
- if (gridModel?.view?.descriptor?.columns) {
202
- this.columnMetaByName = new Map(gridModel?.view?.descriptor?.columns.map((col) => [col.propertyName, col]));
203
- }
204
- else {
205
- this.columnMetaByName = undefined;
206
- }
207
- let kind = gridModel?.view?.descriptor?.kind;
208
- if (kind) {
209
- let layoutDef;
210
- if (kind === GridViewDescriptorKindEnum.TABLE) {
211
- layoutDef = SmartLayoutDef.TABLE;
212
- }
213
- else if (kind === GridViewDescriptorKindEnum.TREE) {
214
- layoutDef = SmartLayoutDef.TREE;
215
- }
216
- else if (kind === GridViewDescriptorKindEnum.CARDS) {
217
- layoutDef = SmartLayoutDef.CARD;
218
- }
219
- if (layoutDef) {
220
- this.smartGrid.layoutDef = layoutDef;
221
- }
222
- }
223
- if (gridModel?.paginator === true || gridModel?.paginator === false) {
224
- this.smartGrid.paginator = gridModel.paginator;
225
- this.service.paginator = this.smartGrid.paginator;
226
- }
227
- }
228
- else {
229
- console.error('GridModel is undefined in component!');
230
- }
231
- if (!this.smartGrid.layoutDef) {
232
- // fallback, default TABLE
233
- this.smartGrid.layoutDef = SmartLayoutDef.TABLE;
234
- }
235
- if (this.smartGrid.layoutDef === SmartLayoutDef.TABLE) {
236
- this.renderTable();
237
- }
238
- else if (this.smartGrid.layoutDef === SmartLayoutDef.EXPANDABLE) {
239
- this.renderExpandableSections();
240
- }
241
- else if (this.smartGrid.layoutDef === SmartLayoutDef.CARD) {
242
- this.renderCards();
243
- }
244
- else if (this.smartGrid.layoutDef === SmartLayoutDef.TREE) {
245
- this.renderTree();
246
- }
247
- this.isBlocked = false;
248
- }
249
- clearTable() {
250
- this.vcRefTable?.clear();
251
- this.componentRefTable = undefined;
252
- }
253
- async renderTable() {
254
- this.clearTree();
255
- if (this.compLib === this.componentLibrary.PRIMENG) {
256
- this.pageIndex = this.smartGrid?.gridModel.pageSize * this.smartGrid?.gridModel.pageIndex;
257
- this.columns = [];
258
- this.smartGrid?.gridModel.view?.orderedColumnNames.map((orderedCol) => {
259
- this.smartGrid?.gridModel.view?.descriptor?.columns.map((colum) => {
260
- if (orderedCol === colum.propertyName) {
261
- this.columns.push(colum);
262
- }
263
- });
264
- });
265
- }
266
- let tableRow = this.smartGrid.gridModel.page.rows.map((item) => {
267
- this.createCellToActionMap();
268
- return item;
269
- });
270
- if (!tableRow.length) {
271
- let placeHolderRow = {};
272
- this.smartGrid.gridModel.view?.descriptor?.columns.map((meta) => {
273
- placeHolderRow[meta.propertyName] = undefined;
274
- });
275
- this.smartGrid.gridModel.page.rows = [placeHolderRow];
276
- }
277
- if (this.smartGrid.tableConfig?.tableType) {
278
- this.tableType = this.smartGrid.tableConfig.tableType;
279
- }
280
- else if (this.service.gridModel?.view?.descriptor?.selectionType) {
281
- this.tableType =
282
- this.service.gridModel.view.descriptor.selectionType === GridSelectionType.CHECKBOX
283
- ? SmartTableType.CHECK_BOX
284
- : SmartTableType.ROW_SELECT;
285
- }
286
- else {
287
- this.tableType = SmartTableType.INHERITED;
288
- }
289
- if (this.smartGrid.layoutDef === SmartLayoutDef.TABLE) {
290
- let tableConfig = {
291
- ...this.smartGrid.tableConfig,
292
- title: this.smartGrid?.gridModel.title,
293
- tableRows: tableRow,
294
- tableType: this.tableType,
295
- customSmartTableHeaders: await this.constructHeader(),
296
- expandable: this.smartGrid.expandable,
297
- asyncOnExpand: this.smartGrid.expandable,
298
- expandedComponent: this.smartGrid.expandedComponent,
299
- type: SmartTableInterfaceTypeEnum.NORMAL,
300
- sortable: true,
301
- defaultActionCodes: this.smartGrid?.gridModel.defaultRowActions,
302
- defaultActions: this.smartGrid?.gridModel.defaultRowActions?.map((code) => {
303
- return {
304
- type: code === '_actionSeparator_'
305
- ? SmartTableButtonType.SEPARATOR
306
- : SmartTableButtonType.NORMAL,
307
- callback: this.execute.bind(this),
308
- code: code,
309
- // label: this.buttonTranslator({ code: code }),
310
- translator: this.buttonTranslator.bind(this),
311
- // args: [
312
- // {
313
- // code: code,
314
- // },
315
- // ],
316
- };
317
- }),
318
- };
319
- if (this.smartGrid?.gridModel.view?.descriptor?.highlightProperty &&
320
- this.smartGrid?.gridModel.view?.descriptor?.highlightClass) {
321
- tableConfig.highlightClass = this.smartGrid.gridModel.view.descriptor.highlightClass;
322
- tableConfig.highlightProperty = this.smartGrid.gridModel.view.descriptor.highlightProperty;
323
- }
324
- if (this.smartGrid.uiActionService &&
325
- this.smartGrid.uiActionDescriptorService &&
326
- this.smartGrid.serviceToUse &&
327
- this.smartGrid.viewContextService) {
328
- tableConfig.onSelection = this.onSelect.bind(this);
329
- tableConfig.onAllSelection = this.onSelectAll.bind(this);
330
- }
331
- // Prepared for simple clicks
332
- // if (!tableConfig.onRowClick) {
333
- // tableConfig.onRowClick = this.onClick.bind(this);
334
- // }
335
- if (!tableConfig.onRowDoubleClick) {
336
- tableConfig.onRowDoubleClick = this.onDoubleClick.bind(this);
337
- }
338
- if (!tableConfig.isRowDisabledPropertyName) {
339
- tableConfig.selectablePropertyName = 'selectable';
340
- }
341
- if (tableConfig.asyncOnExpand) {
342
- tableConfig.rowExpander = this;
343
- }
344
- const selectionMode = this.service.gridModel.view?.descriptor?.selectionMode;
345
- if (!tableConfig.selection &&
346
- !tableConfig.selectionProperty &&
347
- selectionMode !== GridSelectionMode.NONE) {
348
- this.isMultiple = selectionMode === GridSelectionMode.MULTIPLE;
349
- tableConfig.selectionProperty = 'id';
350
- let selectedIds;
351
- this.selectedRows = this.service.gridModel.page.rows.filter((gridRow) => gridRow.selected);
352
- selectedIds = this.selectedRows.map((gridRow) => gridRow.id);
353
- tableConfig.selection = new SelectionModel(this.isMultiple, selectedIds);
354
- tableConfig.showCheckboxInHeader =
355
- typeof tableConfig.showCheckboxInHeader !== 'undefined'
356
- ? tableConfig.showCheckboxInHeader // keep if set
357
- : this.isMultiple; //if unset, turn it on for multiple selection
358
- }
359
- this.smartTable = new SmartTable(tableConfig, this.smartGrid?.gridIdentifier, this.smartGrid?.serviceToUse);
360
- if (this.componentRefTable) {
361
- this.componentRefTable.instance.updateSmartTable(this.smartTable);
362
- }
363
- else {
364
- this.vcRefTable?.clear();
365
- if (!this.vcRefTable) {
366
- return;
367
- }
368
- this.componentRefTable = this.cfService.createComponent(this.vcRefTable, SmarttableComponent, new Map([['smartTable', this.smartTable]]));
369
- let subscription = this.componentRefTable.instance.sortEvent
370
- .pipe(takeUntil(this.componentRefTable.instance._destroy$))
371
- .subscribe((header) => {
372
- header.propertyName = header.propertyName.substring(5);
373
- switch (header.order) {
374
- case undefined:
375
- header.order = SmartTableOrder.ASC;
376
- break;
377
- case SmartTableOrder.ASC:
378
- header.order = SmartTableOrder.DESC;
379
- break;
380
- case SmartTableOrder.DESC:
381
- header.order = undefined;
382
- break;
383
- }
384
- let filter = this.smartGrid.gridModel.view.orderByList.find((filterExpression) => filterExpression.propertyName === header.propertyName);
385
- if (filter && !header.order) {
386
- let index = this.smartGrid.gridModel.view?.orderByList.indexOf(filter);
387
- this.smartGrid.gridModel.view?.orderByList.splice(index, 1);
388
- }
389
- else if (filter) {
390
- filter.order = header.order;
391
- }
392
- else {
393
- this.smartGrid.gridModel.view.orderByList.push({
394
- order: header.order,
395
- propertyName: header.propertyName,
396
- });
397
- }
398
- let gridUpdateData = {
399
- orderByList: this.smartGrid.gridModel.view.orderByList,
400
- orderedColumnNames: this.smartGrid.gridModel.view.orderedColumnNames,
401
- };
402
- this.service.sort(this.smartGrid, gridUpdateData);
403
- });
404
- this.componentRefTable.instance.smartTable.selection?.changed
405
- .pipe(takeUntil(this.componentRefTable.instance._destroy$))
406
- .subscribe((row) => {
407
- this.selectionChanges.next(row);
408
- });
409
- }
410
- }
411
- }
412
- expand(rowId) { }
413
- async expandAsync(rowIndex) {
414
- if (this.smartGrid.gridModel.page.rows) {
415
- let row = this.smartGrid.gridModel.page.rows[rowIndex];
416
- if (row && row.id) {
417
- return await this.service.expand(this.smartGrid, row.id);
418
- }
419
- }
420
- return await this.service.expand(this.smartGrid, rowIndex.toString());
421
- }
422
- renderExpandableSections() {
423
- this.expandableSections = this.smartGrid.gridModel.page.rows.map((item) => {
424
- return {
425
- title: '',
426
- headerComponent: this.smartGrid.headerComponent,
427
- headerInputName: this.smartGrid.headerComponentInputName,
428
- headerData: item,
429
- customComponent: this.smartGrid.expandableComponent,
430
- inputName: this.smartGrid.expandableComponentInputName,
431
- data: item,
432
- };
433
- });
434
- }
435
- renderCards() {
436
- if (this.compLib === this.componentLibrary.PRIMENG) {
437
- this.pageIndex = this.smartGrid?.gridModel.pageSize * this.smartGrid?.gridModel.pageIndex;
438
- this.columns = [];
439
- this.smartGrid?.gridModel.view?.orderedColumnNames.map((orderedCol) => {
440
- this.smartGrid?.gridModel.view?.descriptor?.columns.map((colum) => {
441
- if (orderedCol === colum.propertyName) {
442
- this.columns.push(colum);
443
- }
444
- });
445
- });
446
- }
447
- if (!this.smartGrid.customComponent) {
448
- let datalayoutDef = {
449
- dataLayout: SmartGridDataLayout.COLUMN,
450
- gridLayout: SmartGridDataLayout.COLUMN,
451
- type: SmartGridType.CUSTOM,
452
- };
453
- this.smartGrid.dataLayoutDef = datalayoutDef;
454
- const token = this.smartGrid.gridIdentifier + 'Card';
455
- this.smartGrid.customComponent = this.injector.get(token, null);
456
- }
457
- }
458
- isMultipleSelection() {
459
- const selectionMode = this.service.gridModel.view?.descriptor?.selectionMode;
460
- return selectionMode === GridSelectionMode.MULTIPLE;
461
- }
462
- clearTree() {
463
- this.treeControl = undefined;
464
- this.treeDataSource = undefined;
465
- this.treeFlattener = undefined;
466
- this.treeChecklistSelection = undefined;
467
- }
468
- renderTree() {
469
- this.clearTable();
470
- if (!this.treeDataSource) {
471
- this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, this.isExpandable, this.getChildren);
472
- this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
473
- this.treeDataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
474
- this.treeChecklistSelection = new SelectionModel(this.isMultipleSelection());
475
- }
476
- let nodes = this.treeControl?.dataNodes;
477
- let expandedNodes;
478
- if (nodes) {
479
- expandedNodes = nodes
480
- .filter((node) => this.treeControl?.isExpandable(node))
481
- .filter((node) => this.treeControl?.isExpanded(node))
482
- .map((node) => node.id);
483
- }
484
- else {
485
- expandedNodes = [];
486
- }
487
- this.smartGrid.gridModel.page.rows.forEach((row) => (row.level = undefined));
488
- this.treeDataSource.data = this.smartGrid.gridModel.page.rows.filter((row) => !row.parent);
489
- this.treeChecklistSelection?.clear();
490
- this.treeControl?.dataNodes.forEach((node) => {
491
- if (node.selected) {
492
- this.treeChecklistSelection?.select(node);
493
- }
494
- });
495
- this.treeControl?.collapseAll();
496
- expandedNodes.forEach((rowId) => {
497
- let row = this.treeControl?.dataNodes.find((row) => rowId === row.id);
498
- if (row) {
499
- this.treeControl?.expand(row);
500
- }
501
- });
502
- }
503
- getTreeItem(row) {
504
- let columns = this.smartGrid?.gridModel.view?.orderedColumnNames;
505
- let data = row.data;
506
- if (columns && columns.length > 0) {
507
- return columns.map((col) => data[col]).join(' ');
508
- }
509
- return row.id;
510
- }
511
- /** Toggle the treeNode selection. Select/deselect all the descendants node */
512
- treeNodeSelectionToggle(node) {
513
- if (!this.treeChecklistSelection) {
514
- return;
515
- }
516
- let selectionBefore = this.treeChecklistSelection.selected.map((row) => row.id);
517
- this.treeChecklistSelection.toggle(node);
518
- if (this.isMultipleSelection()) {
519
- const descendants = this.treeControl.getDescendants(node);
520
- this.treeChecklistSelection.isSelected(node)
521
- ? this.treeChecklistSelection.select(...descendants)
522
- : this.treeChecklistSelection.deselect(...descendants);
523
- this.checkAllParentsSelection(node);
524
- }
525
- let selectionAfter = this.treeChecklistSelection.selected.map((row) => row.id);
526
- let selectedIds = selectionAfter.filter((s) => !selectionBefore.includes(s));
527
- let unselectedIds = selectionBefore.filter((s) => !selectionAfter.includes(s));
528
- this.onSelectRows(selectedIds, unselectedIds);
529
- }
530
- checkAllParentsSelection(node) {
531
- let parent = this.getParentNode(node);
532
- while (parent) {
533
- this.checkParentNodeSelection(parent);
534
- parent = this.getParentNode(parent);
535
- }
536
- }
537
- checkParentNodeSelection(node) {
538
- if (!this.treeChecklistSelection) {
539
- return;
540
- }
541
- const nodeSelected = this.treeChecklistSelection.isSelected(node);
542
- const descAllSelected = this.descendantsAllSelected(node);
543
- if (nodeSelected && !descAllSelected) {
544
- this.treeChecklistSelection.deselect(node);
545
- }
546
- else if (!nodeSelected && descAllSelected) {
547
- this.treeChecklistSelection.select(node);
548
- }
549
- }
550
- /* Get the parent node of a node */
551
- getParentNode(node) {
552
- const currentLevel = this.getLevel(node);
553
- if (currentLevel < 1) {
554
- return null;
555
- }
556
- const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
557
- for (let i = startIndex; i >= 0; i--) {
558
- const currentNode = this.treeControl.dataNodes[i];
559
- if (this.getLevel(currentNode) < currentLevel) {
560
- return currentNode;
561
- }
562
- }
563
- return null;
564
- }
565
- /** Whether all the descendants of the node are selected. */
566
- descendantsAllSelected(node) {
567
- if (!this.treeControl || !this.treeChecklistSelection) {
568
- return false;
569
- }
570
- const descendants = this.treeControl.getDescendants(node);
571
- const descAllSelected = descendants.length > 0 &&
572
- descendants.every((child) => {
573
- return this.treeChecklistSelection.isSelected(child);
574
- });
575
- return descAllSelected;
576
- }
577
- /** Whether part of the descendants are selected */
578
- descendantsPartiallySelected(node) {
579
- if (!this.treeControl || !this.treeChecklistSelection) {
580
- return false;
581
- }
582
- const descendants = this.treeControl.getDescendants(node);
583
- let result = descendants.some((child) => this.treeChecklistSelection.isSelected(child));
584
- if (this.isMultipleSelection()) {
585
- result = result && !this.descendantsAllSelected(node);
586
- }
587
- return result;
588
- }
589
- async constructHeader() {
590
- if (this.smartGrid.gridModel.page.rows && this.smartGrid.gridModel.page.rows.length) {
591
- await Promise.all(this.smartGrid.gridModel.page.rows.map(async (gridRow) => {
592
- let newUiActions = gridRow.actions?.filter((uiAction) => !this.uiActionDescriptors.get(uiAction.code));
593
- if (newUiActions) {
594
- await Promise.all(newUiActions.map(async (uiAction) => {
595
- let descriptor = await this.smartGrid.uiActionDescriptorService?.getActionDescriptor(uiAction);
596
- if (!descriptor) {
597
- descriptor = {
598
- title: uiAction.code ?? 'CODE',
599
- color: 'primary',
600
- type: UiActionButtonType.NORMAL,
601
- };
602
- }
603
- this.uiActionDescriptors.set(uiAction.code, structuredClone(descriptor));
604
- }));
605
- }
606
- }));
607
- }
608
- let orederedDescColumns = this.smartGrid.gridModel.view.orderedColumnNames.map((propertyName) => this.smartGrid.gridModel.view.descriptor.columns.find((colDescriptor) => colDescriptor.propertyName === propertyName)).flatMap((f) => f ?? []);
609
- let header = await Promise.all(orederedDescColumns.map(async (descColumn) => {
610
- let customTableHeader = this.smartGrid.tableConfig?.customSmartTableHeaders?.find((header) => header.propertyName === descColumn.propertyName);
611
- let filterExpressionOrderByItem = this.smartGrid.gridModel.view?.orderByList?.find((filterExpression) => filterExpression.propertyName === descColumn.propertyName);
612
- let order;
613
- let orderNumber;
614
- if (filterExpressionOrderByItem) {
615
- order =
616
- filterExpressionOrderByItem.order === FilterExpressionOrderBy.OrderEnum.Asc
617
- ? SmartTableOrder.ASC
618
- : SmartTableOrder.DESC;
619
- if (this.service.gridModel.view.orderByList.length > 1) {
620
- orderNumber = this.service.gridModel.view.orderByList.findIndex((filter) => filter.propertyName === descColumn.propertyName);
621
- orderNumber++;
622
- }
623
- }
624
- const orignalLabel = customTableHeader?.label ?? descColumn.label;
625
- let label = '';
626
- if (!descColumn.hideLabel) {
627
- if (this.smartGrid.translateService) {
628
- label = await this.smartGrid.translateService?.get(orignalLabel).toPromise();
629
- }
630
- else {
631
- label = orignalLabel;
632
- }
633
- }
634
- let properties = customTableHeader?.properties;
635
- if (!properties) {
636
- properties = this.getSmartTableProperty(descColumn);
637
- }
638
- return {
639
- ...customTableHeader,
640
- label: label,
641
- propertyName: 'data.' + descColumn.propertyName,
642
- order,
643
- orderNumber,
644
- properties,
645
- style: descColumn.style,
646
- };
647
- }));
648
- let complement = this.smartGrid.tableConfig?.customSmartTableHeaders?.filter((tableHeader) => !header.some((tH) => tH.propertyName.includes(tableHeader.propertyName)));
649
- if (complement) {
650
- header.push(...complement);
651
- }
652
- if (this.smartGrid.options?.simpleButtons) {
653
- this.smartGrid.options.simpleButtons.forEach((uiActionCode) => {
654
- header.push({
655
- label: '',
656
- propertyName: 'simple_buttons',
657
- buttons: [
658
- {
659
- type: SmartTableButtonType.RAISED,
660
- callback: this.execute.bind(this),
661
- // label: this.buttonTranslator({ code: uiActionCode }),
662
- args: [
663
- {
664
- code: uiActionCode,
665
- },
666
- ],
667
- color: 'primary',
668
- showButtonIf: (row) => row.actions.some((item) => {
669
- return item.code === uiActionCode;
670
- }),
671
- },
672
- ],
673
- });
674
- });
675
- }
676
- if (!header.some((header) => header.propertyName === 'my_menu')) {
677
- if (this.smartGrid.options?.rowUiActionType === GridUiActionType.POPUP_MENU) {
678
- let icon = this.gridMenuIcon ?? 'more_vert';
679
- header.push({
680
- label: '',
681
- propertyName: 'my_menu',
682
- buttons: [
683
- {
684
- type: SmartTableButtonType.MENU,
685
- callback: this.execute.bind(this),
686
- icon: icon,
687
- menuItemButtonsPropertyName: 'actions',
688
- translator: this.buttonTranslator.bind(this),
689
- args: [],
690
- },
691
- ],
692
- isSortable: false,
693
- });
694
- }
695
- }
696
- return header;
697
- }
698
- getSmartTableProperty(descColumn) {
699
- if (descColumn.typeClass === 'java.time.OffsetDateTime' ||
700
- descColumn.typeClass === 'java.time.LocalDateTime') {
701
- let dateFormat = descColumn.typeFormat ?? 'yyyy.MM.dd H:mm';
702
- return {
703
- type: SmartTableHeaderPropertyType.DATETIME,
704
- dateFormat,
705
- };
706
- }
707
- else if (descColumn.typeClass === 'java.time.LocalDate') {
708
- let dateFormat = descColumn.typeFormat ?? 'yyyy.MM.dd';
709
- return {
710
- type: SmartTableHeaderPropertyType.DATE,
711
- dateFormat,
712
- };
713
- }
714
- else if (descColumn.typeClass === 'java.time.LocalTime') {
715
- let dateFormat = descColumn.typeFormat ?? 'H:mm';
716
- return {
717
- type: SmartTableHeaderPropertyType.TIME,
718
- dateFormat,
719
- };
720
- }
721
- else if (descColumn.typeClass === 'java.lang.Boolean') {
722
- return {
723
- type: SmartTableHeaderPropertyType.CHECKBOX,
724
- };
725
- }
726
- return undefined;
727
- }
728
- async onChangePage(event) {
729
- let offset = event.pageSize * event.pageIndex;
730
- let limit = event.pageSize;
731
- this.pageIndex = event.pageIndex;
732
- await this.service.setPage(this.smartGrid.gridModel.viewUuid, this.smartGrid.gridIdentifier, offset.toString(), limit.toString());
733
- }
734
- async onPrimeChangePage(event) {
735
- let offset = event.first;
736
- let limit = event.rows;
737
- this.pageIndex = event.first;
738
- await this.service.setPage(this.smartGrid.gridModel.viewUuid, this.smartGrid.gridIdentifier, offset.toString(), limit.toString());
739
- }
740
- async refreshPartialResults() {
741
- await this.service.refresh(this.smartGrid.gridModel.viewUuid, this.smartGrid.gridIdentifier);
742
- }
743
- async execute(args, row, uiAction) {
744
- let _uiAction;
745
- if (!uiAction) {
746
- uiAction = row.actions.filter((action) => action.code === args[0].code)[0];
747
- }
748
- _uiAction = { ...uiAction };
749
- if (_uiAction.disabled) {
750
- return;
751
- }
752
- _uiAction.params = {
753
- ...uiAction.params,
754
- model: row,
755
- };
756
- let uiActionModel = {
757
- serviceToUse: this.smartGrid.serviceToUse,
758
- uiAction: _uiAction,
759
- };
760
- if (this.smartGrid.options?.uiActionModelCallback) {
761
- uiActionModel = this.smartGrid.options.uiActionModelCallback(uiActionModel);
762
- }
763
- this.smartGrid.uiActionService.execute(_uiAction, uiActionModel, {
764
- widgetId: this.smartGrid.gridIdentifier,
765
- nodeId: row.id,
766
- });
767
- }
768
- buttonTranslator(uiAction) {
769
- let desc = this.uiActionDescriptors.get(uiAction.code);
770
- if (!desc) {
771
- desc = {
772
- title: uiAction.code,
773
- type: UiActionButtonType.FLAT,
774
- color: 'primary',
775
- };
776
- }
777
- if (uiAction.descriptor) {
778
- this.uiActionDescriptorService.mergeActionDescriptorIntoClient(uiAction.descriptor, desc);
779
- }
780
- return desc;
781
- }
782
- layoutDef() {
783
- return SmartLayoutDef;
784
- }
785
- onClick(gridRow) {
786
- this.handleOnClick(gridRow);
787
- }
788
- onDoubleClick(gridRow) {
789
- this.handleOnClick(gridRow);
790
- }
791
- handleOnClick(gridRow) {
792
- let defaultRowAction;
793
- if (this.service.gridModel?.defaultRowActions) {
794
- for (let index = 0; index < this.service.gridModel.defaultRowActions.length; index++) {
795
- const defaultRowActionCode = this.service.gridModel.defaultRowActions[index];
796
- defaultRowAction = gridRow.actions.find((uiAction) => uiAction.code === defaultRowActionCode);
797
- if (defaultRowAction) {
798
- this.execute([], gridRow, defaultRowAction);
799
- return;
800
- }
801
- }
802
- }
803
- }
804
- async onSelect(rowId) {
805
- this.isBlocked = true;
806
- const row = this.service.gridModel.page.rows?.find((gridRow) => gridRow.id === rowId);
807
- const viewContextChange = await this.service.select(this.smartGrid, row);
808
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
809
- this.refresh();
810
- console.log('in refresjhj');
811
- }
812
- async onSelectAll(selected) {
813
- this.isBlocked = true;
814
- const viewContextChange = await this.service.selectAll(this.smartGrid, selected);
815
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
816
- this.refresh();
817
- }
818
- async onSelectRows(selectedIds, unselectedIds) {
819
- this.isBlocked = true;
820
- let selected = selectedIds.filter((item) => item !== undefined);
821
- let unselected = unselectedIds.filter((item) => item !== undefined);
822
- const viewContextChange = await this.service.selectRows(this.smartGrid, selected, unselected);
823
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
824
- this.refresh();
825
- }
826
- async onRowSelect(event) {
827
- await this.onSelect(event.data.id);
828
- }
829
- async onRowUnselect(event) {
830
- await this.onSelect(event.data.id);
831
- }
832
- async onSelectAllRow(event) {
833
- await this.onSelectAll(event.checked);
834
- }
835
- editColumns() {
836
- let dialogData = {
837
- content: {
838
- title: 'Oszlopok testreszabása',
839
- },
840
- size: {},
841
- customComponent: TableLayoutDefinerComponent,
842
- customComponentInputs: {
843
- config: {
844
- uuid: this.uuid,
845
- identifier: this.smartGrid.gridIdentifier,
846
- view: this.service.gridModel.view,
847
- service: this.service,
848
- },
849
- },
850
- };
851
- this.dialog.open(TableLayoutDefinerComponent, { data: dialogData });
852
- }
853
- onOptionsClick(event, row) {
854
- this.menuButtons = [];
855
- let menuActions = this.calculateMenuActions(row);
856
- menuActions?.map(async (uiAction) => {
857
- let desc = await this.uiActionDescriptorService.getActionDescriptor(uiAction);
858
- this.menuButtons.push({
859
- label: desc?.title ?? uiAction.code,
860
- icon: desc?.icon,
861
- automationId: uiAction.code,
862
- command: () => {
863
- this.execute([], row, uiAction);
864
- },
865
- });
866
- });
867
- this.menu.toggle(event);
868
- }
869
- async gridSort(event) {
870
- let orderByList = [];
871
- event.multisortmeta?.map((meta, index) => {
872
- if (this.previousmultiSortMeta && this.previousmultiSortMeta.length > 0) {
873
- this.previousmultiSortMeta.map((order) => {
874
- if (meta.field === order.field && order.order != meta.order) {
875
- switch (order.order) {
876
- case -1:
877
- event.multisortmeta.splice(index, 1);
878
- break;
879
- }
880
- }
881
- });
882
- }
883
- else {
884
- this.previousmultiSortMeta = event.multisortmeta;
885
- }
886
- });
887
- event.multisortmeta?.map((meta) => {
888
- orderByList.push({
889
- propertyName: meta.field,
890
- order: meta.order === 1
891
- ? FilterExpressionOrderByOrderEnum.ASC
892
- : meta.order === -1
893
- ? FilterExpressionOrderByOrderEnum.DESC
894
- : undefined,
895
- });
896
- });
897
- await this.service.sort(this.smartGrid, {
898
- orderByList: orderByList,
899
- orderedColumnNames: this.smartGrid?.gridModel.view?.orderedColumnNames,
900
- });
901
- }
902
- lazyLoad(event) {
903
- this.previousmultiSortMeta = [];
904
- this.smartGrid?.gridModel.view?.orderByList.map((order) => {
905
- this.previousmultiSortMeta?.push({
906
- field: order.propertyName,
907
- order: order.order === FilterExpressionOrderByOrderEnum.ASC ? 1 : -1,
908
- });
909
- });
910
- event.multiSortMeta = this.previousmultiSortMeta;
911
- }
912
- async headerChange(event) {
913
- let gridUpdateData = {
914
- orderByList: this.smartGrid.gridModel.view.orderByList,
915
- orderedColumnNames: this.getOrderColumNames(event.value),
916
- };
917
- await this.service.update(this.uuid, this.smartGrid?.gridIdentifier, gridUpdateData);
918
- }
919
- async onColOrder(event) {
920
- let gridUpdateData = {
921
- orderByList: this.smartGrid.gridModel.view.orderByList,
922
- orderedColumnNames: this.getOrderColumNames(event.columns),
923
- };
924
- await this.service.update(this.uuid, this.smartGrid.gridIdentifier, gridUpdateData);
925
- }
926
- getOrderColumNames(columns) {
927
- return columns.map((colum) => {
928
- return colum.propertyName;
929
- });
930
- }
931
- getColValue(col, row) {
932
- if (row.icons[col]) {
933
- return;
934
- }
935
- let retValue = '';
936
- if (col.includes('.')) {
937
- let pathArray = col.split('.');
938
- let colValue = row.data;
939
- pathArray.map((path) => {
940
- if (colValue == undefined) {
941
- colValue = row.data[col];
942
- return;
943
- }
944
- else {
945
- colValue = colValue[path];
946
- }
947
- });
948
- retValue = colValue;
949
- }
950
- else {
951
- retValue = row.data[col];
952
- }
953
- if (this.columnMetaByName) {
954
- let columnMeta = this.columnMetaByName.get(col);
955
- if (columnMeta) {
956
- let property = this.getSmartTableProperty(columnMeta);
957
- switch (property?.type) {
958
- case SmartTableHeaderPropertyType.DATE:
959
- retValue = this.smartDatePipe.transform(retValue, property.dateFormat);
960
- break;
961
- case SmartTableHeaderPropertyType.DATETIME:
962
- retValue = this.smartDateTimePipe.transform(retValue, property.dateFormat);
963
- break;
964
- case SmartTableHeaderPropertyType.TIME:
965
- retValue = this.smartTimePipe.transform(retValue, property.dateFormat);
966
- break;
967
- }
968
- }
969
- }
970
- return retValue;
971
- }
972
- getImageResourceIcons(row, header) {
973
- if (row?.icons) {
974
- let iconCodes = row?.icons[header];
975
- return iconCodes;
976
- }
977
- return [];
978
- }
979
- getImageResourceStyle(resource) {
980
- return resource.style ? resource.style : {};
981
- }
982
- getRowColumnAction(row, columnName) {
983
- return SmartGridToolbarActionsUtil.getActionModelsFromMap(this.cellToActionMap, row, columnName);
984
- }
985
- showCellToolbar(row, columnName) {
986
- return SmartGridToolbarActionsUtil.showToolbar(row, columnName);
987
- }
988
- shouldShowOptionsButton(row) {
989
- return SmartGridToolbarActionsUtil.showMenu(row, this.smartGrid?.gridModel.view?.orderedColumnNames);
990
- }
991
- calculateMenuActions(row) {
992
- return SmartGridToolbarActionsUtil.calculateMenuActions(row, this.smartGrid?.gridModel.view?.orderedColumnNames);
993
- }
994
- createCellToActionMap() {
995
- if (this.compLib === this.componentLibrary.PRIMENG && this.smartGrid?.gridModel.page.rows) {
996
- this.rowMenuActionModelCache.clear();
997
- this.rowMenuActionModelArrayCache.clear();
998
- this.cellToActionMap = SmartGridToolbarActionsUtil.calculateCellToActionMap(this.smartGrid?.gridModel.page.rows, this.smartGrid.serviceToUse, this.smartGrid.gridIdentifier);
999
- }
1000
- }
1001
- rowTrackByFn(index, row) {
1002
- return row.id;
1003
- }
1004
- getRowMenuActionModelArray(row) {
1005
- const cacheKey = row.id;
1006
- if (this.rowMenuActionModelArrayCache.has(cacheKey)) {
1007
- return this.rowMenuActionModelArrayCache.get(cacheKey);
1008
- }
1009
- if (!this.rowMenuActionModelCache.has(cacheKey)) {
1010
- const leftoverActionModels = SmartGridToolbarActionsUtil.calculateMenuActionModels(row, this.smartGrid.gridModel.view?.orderedColumnNames, this.smartGrid.serviceToUse, this.smartGrid.gridIdentifier);
1011
- const menuUiAction = {
1012
- code: 'rowMenu',
1013
- descriptor: {
1014
- icon: 'ellipsis-v',
1015
- title: '',
1016
- type: UiActionButtonType.ICON,
1017
- color: 'primary',
1018
- },
1019
- subActions: leftoverActionModels.map((m) => m.uiAction),
1020
- };
1021
- const model = {
1022
- serviceToUse: this.smartGrid.serviceToUse,
1023
- uiAction: menuUiAction,
1024
- nodeId: row.id,
1025
- widgetId: this.smartGrid.gridIdentifier,
1026
- };
1027
- this.rowMenuActionModelCache.set(cacheKey, model);
1028
- }
1029
- const arr = [this.rowMenuActionModelCache.get(cacheKey)];
1030
- this.rowMenuActionModelArrayCache.set(cacheKey, arr);
1031
- return arr;
1032
- }
1033
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, deps: [{ token: i1.SmartGridService }, { token: i2.ComponentFactoryService }, { token: i3.MatDialog }, { token: i0.Injector }, { token: i4.UiActionDescriptorService }, { token: i5.SmartDatePipe }, { token: i5.SmartDateTimePipe }, { token: i5.SmartTimePipe }, { token: COMPONENT_LIBRARY }, { token: 'gridMenuIcon' }], target: i0.ɵɵFactoryTarget.Component }); }
1034
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", parent: "parent", parentLayoutComponent: "parentLayoutComponent", dev: "dev" }, host: { properties: { "attr.data-testid": "this.testId" } }, providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "_headerToolbar", first: true, predicate: ["headerToolbar"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }, { propertyName: "expandedRowsComps", predicate: ExpandedRowRendererComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}.clickable-row{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i11.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i11.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "component", type: i14.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "directive", type: i15.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i16.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i17.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i16.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i16.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i16.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i16.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i16.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i16.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i16.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i18.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i19.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i20.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i21.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i22.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i23.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i24.SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "parent", "parentLayoutComponent"] }, { kind: "component", type: i25.ExpandedRowRendererComponent, selector: "lib-expanded-row-renderer-component", inputs: ["rowId", "rowExpander", "expandedComponent", "smartGrid"] }] }); }
1035
- }
1036
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, decorators: [{
1037
- type: Component,
1038
- args: [{ selector: 'smart-grid', providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n [expandedRowKeys]=\"expandedRows\"\r\n [rowExpandMode]=\"'multiple'\"\r\n [rowTrackBy]=\"rowTrackByFn\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"tableCaption\">\r\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\r\n {{ smartGrid.gridModel.title }}\r\n </div>\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n pReorderableColumn\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n } @else {\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th\r\n [pSortableColumn]=\"col.propertyName\"\r\n *ngFor=\"let col of columns\"\r\n [attr.data-testid]=\"col.propertyName\"\r\n >\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n }\r\n\r\n <th>\r\n <smart-ui-action-toolbar\r\n class=\"headerToolbar\"\r\n #headerToolbar\r\n [id]=\"'header_not_initialized'\"\r\n ></smart-ui-action-toolbar>\r\n </th>\r\n <th *ngIf=\"smartGrid.expandable\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\r\n <tr\r\n [ngClass]=\"getStyle(row)\"\r\n [class.rowExpanded]=\"expanded\"\r\n (dblclick)=\"onDoubleClick(row)\"\r\n *ngIf=\"row && row.data\"\r\n [attr.data-testid]=\"row.id ?? null\"\r\n >\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, col)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td>\r\n <div class=\"menu-button\">\r\n @if (showCellToolbar(row, defaultActionToolbarId)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n @if (shouldShowOptionsButton(row)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(row)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n </td>\r\n <td *ngIf=\"smartGrid.expandable\">\r\n <p-button\r\n type=\"button\"\r\n pRipple\r\n [pRowToggler]=\"row\"\r\n [text]=\"true\"\r\n severity=\"secondary\"\r\n [rounded]=\"true\"\r\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\r\n />\r\n </td>\r\n </tr>\r\n </ng-template>\r\n @if (smartGrid.expandable) {\r\n <ng-template pTemplate=\"rowexpansion\" let-row>\r\n <tr>\r\n <td colspan=\"100%\">\r\n <lib-expanded-row-renderer-component\r\n [rowId]=\"row.id\"\r\n [rowExpander]=\"this\"\r\n [expandedComponent]=\"smartGrid.expandedComponent\"\r\n [smartGrid]=\"this.smartGrid\"\r\n ></lib-expanded-row-renderer-component>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n }\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\r\n <div class=\"paginator-wrap\">\r\n <p-paginator\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n ></p-paginator>\r\n </div>\r\n\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n </div>\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n </div>\r\n} @else {\r\n <div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let row of smartGrid.gridModel.page.rows\"\r\n [class.clickable-row]=\"row.layoutDescriptor\"\r\n (click)=\"row.layoutDescriptor && onClick(row)\"\r\n [item]=\"row\"\r\n [smartGrid]=\"smartGrid\"\r\n [parent]=\"this.parent\"\r\n [parentLayoutComponent]=\"this.parentLayoutComponent\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : '',\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n class=\"p-button-text\"\r\n pTooltip=\"Friss\u00EDt\u00E9s\"\r\n (click)=\"refreshPartialResults()\"\r\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\r\n ></button>\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.headerToolbar ::ng-deep .uiActionButtonsContainer{justify-content:flex-end}.tableCaption{display:flex;flex-direction:row;justify-content:space-between}.tableCaption:has(*){padding:.5rem;border-top:1px solid #e9ecef;border-bottom:1px solid #e9ecef}:host ::ng-deep .p-datatable .p-datatable-thead>tr>th,:host ::ng-deep .p-datatable .p-datatable-header{padding:.5rem}.captionTitle{font-size:1.5rem;align-content:center}:host ::ng-deep .p-datatable-header:has(.tableCaption){padding:0;border:unset}.paginator-row{display:flex;align-items:center;align-self:center;gap:.25rem}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.paginator-wrap{flex:0 0 auto;min-width:0}:host ::ng-deep .paginator-wrap .p-paginator{width:auto}.clickable-row{cursor:pointer}\n"] }]
1039
- }], ctorParameters: () => [{ type: i1.SmartGridService }, { type: i2.ComponentFactoryService }, { type: i3.MatDialog }, { type: i0.Injector }, { type: i4.UiActionDescriptorService }, { type: i5.SmartDatePipe }, { type: i5.SmartDateTimePipe }, { type: i5.SmartTimePipe }, { type: i4.ComponentLibrary, decorators: [{
1040
- type: Inject,
1041
- args: [COMPONENT_LIBRARY]
1042
- }] }, { type: undefined, decorators: [{
1043
- type: Inject,
1044
- args: ['gridMenuIcon']
1045
- }] }], propDecorators: { smartGrid: [{
1046
- type: Input
1047
- }], uuid: [{
1048
- type: Input
1049
- }], parent: [{
1050
- type: Input
1051
- }], parentLayoutComponent: [{
1052
- type: Input
1053
- }], testId: [{
1054
- type: HostBinding,
1055
- args: ['attr.data-testid']
1056
- }], dev: [{
1057
- type: Input
1058
- }], vcRefTable: [{
1059
- type: ViewChild,
1060
- args: ['table', { read: ViewContainerRef }]
1061
- }], toolbar: [{
1062
- type: ViewChild,
1063
- args: ['toolbar']
1064
- }], _headerToolbar: [{
1065
- type: ViewChild,
1066
- args: ['headerToolbar']
1067
- }], expandedRowsComps: [{
1068
- type: ViewChildren,
1069
- args: [ExpandedRowRendererComponent]
1070
- }], menu: [{
1071
- type: ViewChild,
1072
- args: ['menu']
1073
- }] } });
1074
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFFVCxXQUFXLEVBQ1gsTUFBTSxFQUVOLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUVwQiw0QkFBNEIsRUFFNUIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZixjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUdMLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBSWpCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sZ0JBQWdCLENB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QUFpQixhQUNqQixjQUFjO21HQXZFYixrQkFBa0Isa09BRmxCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQywwR0FtQmxELGdCQUFnQiwwVEFVOUIsNEJBQTRCLHFFQ3BINUMscy9hQTJWQTs7NEZEbFFhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxZQUFZLGFBR1gsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxDQUFDOzswQkF3RTNFLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxjQUFjO3lDQWxFZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdGLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBSXRCLEdBQUc7c0JBQVgsS0FBSztnQkFHMEMsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3hCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDUSxjQUFjO3NCQUF6QyxTQUFTO3VCQUFDLGVBQWU7Z0JBSzFCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyw0QkFBNEI7Z0JBKzhCdkIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBzaWduYWwsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vc21hcnQtZGlhbG9nL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3IvYXBpL21vZGVsL2ZpbHRlckV4cHJlc3Npb25PcmRlckJ5JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRhYmxlLFxyXG4gIFNtYXJ0VGFibGVCdXR0b25UeXBlLFxyXG4gIFNtYXJ0VGFibGVIZWFkZXIsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZSxcclxuICBTbWFydFRhYmxlSW50ZXJmYWNlLFxyXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcclxuICBTbWFydFRhYmxlT3JkZXIsXHJcbiAgU21hcnRUYWJsZVR5cGUsXHJcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSW1hZ2VSZXNvdXJjZSxcclxuICBVaUFjdGlvbixcclxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQge1xyXG4gIENPTVBPTkVOVF9MSUJSQVJZLFxyXG4gIENvbXBvbmVudExpYnJhcnksXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICBVaUFjdGlvbk1vZGVsLFxyXG4gIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCxcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRDb2x1bW5NZXRhLFxyXG4gIEdyaWRSb3csXHJcbiAgR3JpZFNlbGVjdGlvbk1vZGUsXHJcbiAgR3JpZFNlbGVjdGlvblR5cGUsXHJcbiAgR3JpZFVwZGF0ZURhdGEsXHJcbiAgR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0sXHJcbn0gZnJvbSAnLi9hcGkvZ3JpZC1hcGknO1xyXG5pbXBvcnQgeyBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtbGF5b3V0LWRlZmluZXIvdGFibGUtbGF5b3V0LWRlZmluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHcmlkVWlBY3Rpb25UeXBlLFxyXG4gIFNtYXJ0R3JpZCxcclxuICBTbWFydEdyaWREYXRhTGF5b3V0LFxyXG4gIFNtYXJ0R3JpZFR5cGUsXHJcbiAgU21hcnRMYXlvdXREZWYsXHJcbn0gZnJvbSAnLi9tb2RlbHMvbW9kZWwnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC1ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQge1xyXG4gIFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50LFxyXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCxcclxuICBUYWJsZUxhenlMb2FkRXZlbnQsXHJcbiAgVGFibGVSb3dTZWxlY3RFdmVudCxcclxuICBUYWJsZVJvd1VuU2VsZWN0RXZlbnQsXHJcbn0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtIH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyL3Byb2plY3RzJztcclxuaW1wb3J0IHsgTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwgfSBmcm9tICcuL3NtYXJ0LWdyaWQtdG9vbGJhci11dGlsJztcclxuaW1wb3J0IHsgRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9nZW5lcmljLWNvbXBvbmVudC9leHBhbmRlZC1yb3ctcmVuZGVyZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGUgfSBmcm9tICcuLi9zaGFyZWQvc21hcnR0YWJsZS5kYXRlLXBpcGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbU21hcnRHcmlkU2VydmljZSwgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyNSwgNTBdO1xyXG4gIGNvbXBvbmVudExpYnJhcnkgPSBDb21wb25lbnRMaWJyYXJ5O1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBASW5wdXQoKSBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XHJcbiAgQElucHV0KCkgdXVpZD86IHN0cmluZztcclxuICBASW5wdXQoKSBwYXJlbnQ/OiBhbnk7XHJcbiAgQElucHV0KCkgcGFyZW50TGF5b3V0Q29tcG9uZW50PzogYW55O1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10ZXN0aWQnKVxyXG4gIGdldCB0ZXN0SWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbD8uaWRlbnRpZmllciA/PyBudWxsO1xyXG4gIH1cclxuICBASW5wdXQoKSBkZXY6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gdGFibGVcclxuICBAVmlld0NoaWxkKCd0YWJsZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSB2Y1JlZlRhYmxlPzogVmlld0NvbnRhaW5lclJlZjtcclxuICBjb21wb25lbnRSZWZUYWJsZT86IENvbXBvbmVudFJlZjxTbWFydHRhYmxlQ29tcG9uZW50PjtcclxuICBzbWFydFRhYmxlITogU21hcnRUYWJsZTxHcmlkUm93PjtcclxuXHJcbiAgLy8gdG9vbGJhclxyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlclRvb2xiYXInKSBfaGVhZGVyVG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuICBkZWZhdWx0QWN0aW9uVG9vbGJhcklkOiBzdHJpbmcgPSBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuZGVmYXVsdEFjdGlvblRvb2xiYXJJZDtcclxuXHJcbiAgLy8gZXhwYW5kYWJsZVxyXG4gIEBWaWV3Q2hpbGRyZW4oRXhwYW5kZWRSb3dSZW5kZXJlckNvbXBvbmVudClcclxuICBleHBhbmRlZFJvd3NDb21wcyE6IFF1ZXJ5TGlzdDxFeHBhbmRlZFJvd1JlbmRlcmVyQ29tcG9uZW50PjtcclxuXHJcbiAgZXhwYW5kYWJsZVNlY3Rpb25zPzogRXhwYW5kYWJsZVNlY3Rpb248YW55PltdO1xyXG4gIGV4cGFuZGVkUm93cyA9IHt9O1xyXG5cclxuICAvLyBncmlkRGF0YVxyXG4gIHBhZ2VFdmVudD86IFBhZ2VFdmVudDtcclxuICBkYXRhc291cmNlPzogbnVsbDtcclxuICBwYWdlU2l6ZT86IG51bWJlcjtcclxuICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgcGFnZUluZGV4PzogbnVtYmVyO1xyXG4gIHZhbHVlczogYW55O1xyXG4gIGdyaWRUYWJsZSE6IFNtYXJ0VGFibGU8YW55PjtcclxuICBpc011bHRpcGxlPzogYm9vbGVhbjtcclxuICBzZWxlY3RlZFJvd3M6IEdyaWRSb3dbXSA9IFtdO1xyXG4gIHRhYmxlVHlwZT86IGFueTtcclxuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gdGhpcy5kZWZhdWx0UGFnZVNpemVPcHRpb25zO1xyXG4gIGNvbHVtbk1ldGFCeU5hbWU/OiBNYXA8c3RyaW5nLCBHcmlkQ29sdW1uTWV0YT47XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHVpQWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gPSBuZXcgTWFwKCk7XHJcbiAgY2VsbFRvQWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBVaUFjdGlvbk1vZGVsW10+ID0ge307XHJcblxyXG4gIGFmdGVyVmlld0luaXRFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQmxvY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIHRyZWVcclxuICB0cmVlQ29udHJvbD86IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93PjtcclxuICB0cmVlRmxhdHRlbmVyPzogTWF0VHJlZUZsYXR0ZW5lcjxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlRGF0YVNvdXJjZT86IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPzogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVQaXBlOiBTbWFydERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBzbWFydERhdGVUaW1lUGlwZTogU21hcnREYXRlVGltZVBpcGUsXHJcbiAgICBwcml2YXRlIHNtYXJ0VGltZVBpcGU6IFNtYXJ0VGltZVBpcGUsXHJcbiAgICBASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBwdWJsaWMgY29tcExpYjogQ29tcG9uZW50TGlicmFyeSxcclxuICAgIEBJbmplY3QoJ2dyaWRNZW51SWNvbicpIHByaXZhdGUgZ3JpZE1lbnVJY29uPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyBjYWxsZWQgYWZ0ZXIgZXZlcnkgc2VydmljZSBjYWxsIChsb2FkLCBzYXZlLCByZWZyZXNoLCBldGMuKVxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbDtcclxuICAgICAgdGhpcy5yZW5kZXIoKTtcclxuXHJcbiAgICAgIC8vUmVmcmVzaCBleHBhbmRlZCBzZWN0aW9ucyBkYXRhXHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzQ29tcHMuZm9yRWFjaCgocm93Q29tcCkgPT4gcm93Q29tcC5yZWZyZXNoUm93RGF0YSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc21hcnRHcmlkJ10pIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQgPSBjaGFuZ2VzWydzbWFydEdyaWQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMuc2VydmljZS5wYWdpbmF0b3IgPSB0aGlzLnNtYXJ0R3JpZD8ucGFnaW5hdG9yO1xyXG4gICAgICB0aGlzLnNldHVwVG9vbGJhcigpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ3V1aWQnXSkge1xyXG4gICAgICBpZiAoY2hhbmdlc1sndXVpZCddICYmIHRoaXMudXVpZCA9PT0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51dWlkID0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFmdGVyVmlld0luaXRFeGVjdXRlZCAmJiB0aGlzLnV1aWQgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51dWlkICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZnRlclZpZXdJbml0RXhlY3V0ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgcm93cyBvZiB0aGUgdGFibGVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dzKCk6IFNlbGVjdGlvbk1vZGVsPEdyaWRSb3c+IHtcclxuICAgIGlmICghdGhpcy5zbWFydFRhYmxlLnNlbGVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydFRhYmxlIS5zZWxlY3Rpb24hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgZ2VuZXJpYyBHcmlkQVBJIGFuZCByZWZyZXNoZXMgdGhlIHByZXNlbnRlZFxyXG4gICAqIGdyaWQgd2l0aCB0aGUgbmV3ZXN0IG9uZS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XHJcbiAgICAvLyB3aWxsIGNhdXNlIHRoaXMuc2VydmljZS5ncmlkTW9kZWxDaGFuZ2VkIHRvIGZpcmVcclxuICAgIGlmICh0aGlzLnV1aWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmxvYWQodGhpcy51dWlkLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3R5bGUocm93OiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAocm93ICYmIHJvdy5zdHlsZSkge1xyXG4gICAgICBsZXQgc3R5bGUgPSByb3cuc3R5bGU7XHJcbiAgICAgIGxldCBjbGFzc2VzVG9BZGQ6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgIGlmIChzdHlsZS5jbGFzc2VzVG9BZGQpIHtcclxuICAgICAgICBzdHlsZS5jbGFzc2VzVG9BZGQuZm9yRWFjaCgoY2w6IHN0cmluZykgPT4gY2xhc3Nlc1RvQWRkLnB1c2goY2wpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzdHlsZS5jbGFzc2VzVG9SZW1vdmUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3Nlc1RvQWRkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjbGFzc2VzVG9BZGQuZmlsdGVyKChjbHMpID0+ICFzdHlsZS5jbGFzc2VzVG9SZW1vdmUuaW5jbHVkZXMoY2xzKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBUb29sYmFyKCkge1xyXG4gICAgLy8gY2hlY2sgaWYgdG9vbGJhciBpcyBhdmFpbGFibGUgX2FuZF8gbmVlZCBzZXQgdXBcclxuICAgIGlmICh0aGlzLnRvb2xiYXIgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgbGV0IHRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfdG9vbGJhcic7XHJcbiAgICAgIGlmICh0b29sYmFySWQgIT09IHRoaXMudG9vbGJhci5pZCkge1xyXG4gICAgICAgIHRoaXMudG9vbGJhci5pZCA9IHRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9oZWFkZXJUb29sYmFyICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIGxldCBoZWFkZXJUb29sYmFySWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIgKyAnX2hlYWRlclRvb2xiYXInO1xyXG4gICAgICBpZiAoaGVhZGVyVG9vbGJhcklkICE9PSB0aGlzLl9oZWFkZXJUb29sYmFyLmlkKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyVG9vbGJhci5pZCA9IGhlYWRlclRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlYWRlclRvb2xiYXIoKTogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICByZXR1cm4gdGhpcy5faGVhZGVyVG9vbGJhcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZlRhYmxlPy5pbnN0YW5jZS5jb21wb25lbnRSZWZUYWJsZT8uaW5zdGFuY2UuaGVhZGVyVG9vbGJhcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JpZE1vZGVsID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbDtcclxuICAgIGlmIChncmlkTW9kZWwpIHtcclxuICAgICAgdGhpcy5sZW5ndGggPSBncmlkTW9kZWwudG90YWxSb3dDb3VudDtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IGdyaWRNb2RlbC5wYWdlU2l6ZTtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBncmlkTW9kZWwucGFnZUluZGV4ID8/IDA7XHJcbiAgICAgIGlmIChncmlkTW9kZWwucGFnZVNpemVPcHRpb25zICYmIGdyaWRNb2RlbC5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMuZGVmYXVsdFBhZ2VTaXplT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2hvd0VkaXRDb2x1bW5zID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YUJ5TmFtZSA9IG5ldyBNYXAoXHJcbiAgICAgICAgICBncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2wpID0+IFtjb2wucHJvcGVydHlOYW1lLCBjb2xdKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhQnlOYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQga2luZCA9IGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8ua2luZDtcclxuICAgICAgaWYgKGtpbmQpIHtcclxuICAgICAgICBsZXQgbGF5b3V0RGVmO1xyXG4gICAgICAgIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UQUJMRSkge1xyXG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5UUkVFKSB7XHJcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UUkVFO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0uQ0FSRFMpIHtcclxuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLkNBUkQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsYXlvdXREZWYpIHtcclxuICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPSBsYXlvdXREZWY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gdHJ1ZSB8fCBncmlkTW9kZWw/LnBhZ2luYXRvciA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEucGFnaW5hdG9yID0gZ3JpZE1vZGVsLnBhZ2luYXRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpY2UucGFnaW5hdG9yID0gdGhpcy5zbWFydEdyaWQhLnBhZ2luYXRvcjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignR3JpZE1vZGVsIGlzIHVuZGVmaW5lZCBpbiBjb21wb25lbnQhJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYpIHtcclxuICAgICAgLy8gZmFsbGJhY2ssIGRlZmF1bHQgVEFCTEVcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRBQkxFO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVGFibGUoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuRVhQQU5EQUJMRSkge1xyXG4gICAgICB0aGlzLnJlbmRlckV4cGFuZGFibGVTZWN0aW9ucygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5DQVJEKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ2FyZHMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVFJFRSkge1xyXG4gICAgICB0aGlzLnJlbmRlclRyZWUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNCbG9ja2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGFibGUoKSB7XHJcbiAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJUYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY2xlYXJUcmVlKCk7XHJcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZVNpemUhICogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlSW5kZXghO1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMubWFwKChvcmRlcmVkQ29sOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2x1bTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGFibGVSb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsIS5wYWdlLnJvd3MhLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY3JlYXRlQ2VsbFRvQWN0aW9uTWFwKCk7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0YWJsZVJvdy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHBsYWNlSG9sZGVyUm93OiBhbnkgPSB7fTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgobWV0YTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICBwbGFjZUhvbGRlclJvd1ttZXRhLnByb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyA9IFtwbGFjZUhvbGRlclJvd107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8udGFibGVUeXBlKSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID0gdGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLnRhYmxlVHlwZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uVHlwZSkge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3Iuc2VsZWN0aW9uVHlwZSA9PT0gR3JpZFNlbGVjdGlvblR5cGUuQ0hFQ0tCT1hcclxuICAgICAgICAgID8gU21hcnRUYWJsZVR5cGUuQ0hFQ0tfQk9YXHJcbiAgICAgICAgICA6IFNtYXJ0VGFibGVUeXBlLlJPV19TRUxFQ1Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhYmxlVHlwZSA9IFNtYXJ0VGFibGVUeXBlLklOSEVSSVRFRDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UQUJMRSkge1xyXG4gICAgICBsZXQgdGFibGVDb25maWc6IFNtYXJ0VGFibGVJbnRlcmZhY2U8R3JpZFJvdz4gPSB7XHJcbiAgICAgICAgLi4udGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnRpdGxlLFxyXG4gICAgICAgIHRhYmxlUm93czogdGFibGVSb3csXHJcbiAgICAgICAgdGFibGVUeXBlOiB0aGlzLnRhYmxlVHlwZSxcclxuICAgICAgICBjdXN0b21TbWFydFRhYmxlSGVhZGVyczogYXdhaXQgdGhpcy5jb25zdHJ1Y3RIZWFkZXIoKSEsXHJcbiAgICAgICAgZXhwYW5kYWJsZTogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgYXN5bmNPbkV4cGFuZDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGUsXHJcbiAgICAgICAgZXhwYW5kZWRDb21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRlZENvbXBvbmVudCxcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSW50ZXJmYWNlVHlwZUVudW0uTk9STUFMLFxyXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRBY3Rpb25Db2RlczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucyEsXHJcbiAgICAgICAgZGVmYXVsdEFjdGlvbnM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnM/Lm1hcCgoY29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOlxyXG4gICAgICAgICAgICAgIGNvZGUgPT09ICdfYWN0aW9uU2VwYXJhdG9yXydcclxuICAgICAgICAgICAgICAgID8gU21hcnRUYWJsZUJ1dHRvblR5cGUuU0VQQVJBVE9SXHJcbiAgICAgICAgICAgICAgICA6IFNtYXJ0VGFibGVCdXR0b25UeXBlLk5PUk1BTCxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuZXhlY3V0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyBsYWJlbDogdGhpcy5idXR0b25UcmFuc2xhdG9yKHsgY29kZTogY29kZSB9KSxcclxuICAgICAgICAgICAgdHJhbnNsYXRvcjogdGhpcy5idXR0b25UcmFuc2xhdG9yLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIC8vIGFyZ3M6IFtcclxuICAgICAgICAgICAgLy8gICB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgICAgIC8vIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0UHJvcGVydHkgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmhpZ2hsaWdodENsYXNzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodENsYXNzID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRDbGFzcztcclxuICAgICAgICB0YWJsZUNvbmZpZy5oaWdobGlnaHRQcm9wZXJ0eSA9IHRoaXMuc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3IuaGlnaGxpZ2h0UHJvcGVydHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlICYmXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZVxyXG4gICAgICApIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3QuYmluZCh0aGlzKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vbkFsbFNlbGVjdGlvbiA9IHRoaXMub25TZWxlY3RBbGwuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJlcGFyZWQgZm9yIHNpbXBsZSBjbGlja3NcclxuICAgICAgLy8gaWYgKCF0YWJsZUNvbmZpZy5vblJvd0NsaWNrKSB7XHJcbiAgICAgIC8vICAgdGFibGVDb25maWcub25Sb3dDbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoIXRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2spIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5vblJvd0RvdWJsZUNsaWNrID0gdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGFibGVDb25maWcuaXNSb3dEaXNhYmxlZFByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLnNlbGVjdGFibGVQcm9wZXJ0eU5hbWUgPSAnc2VsZWN0YWJsZSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0YWJsZUNvbmZpZy5hc3luY09uRXhwYW5kKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcucm93RXhwYW5kZXIgPSB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZXJ2aWNlIS5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uTW9kZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uICYmXHJcbiAgICAgICAgIXRhYmxlQ29uZmlnLnNlbGVjdGlvblByb3BlcnR5ICYmXHJcbiAgICAgICAgc2VsZWN0aW9uTW9kZSAhPT0gR3JpZFNlbGVjdGlvbk1vZGUuTk9ORVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmlzTXVsdGlwbGUgPSBzZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NVUxUSVBMRTtcclxuXHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgPSAnaWQnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZElkcztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoXHJcbiAgICAgICAgICAoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5zZWxlY3RlZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHNlbGVjdGVkSWRzID0gdGhpcy5zZWxlY3RlZFJvd3MubWFwKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkISk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odGhpcy5pc011bHRpcGxlLCBzZWxlY3RlZElkcyk7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgPVxyXG4gICAgICAgICAgdHlwZW9mIHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgICAgICA/IHRhYmxlQ29uZmlnLnNob3dDaGVja2JveEluSGVhZGVyIC8vIGtlZXAgaWYgc2V0XHJcbiAgICAgICAgICAgIDogdGhpcy5pc011bHRpcGxlOyAvL2lmIHVuc2V0LCB0dXJuIGl0IG9uIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zbWFydFRhYmxlID0gbmV3IFNtYXJ0VGFibGU8YW55PihcclxuICAgICAgICB0YWJsZUNvbmZpZyxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LnNlcnZpY2VUb1VzZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmVGFibGUpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnVwZGF0ZVNtYXJ0VGFibGUodGhpcy5zbWFydFRhYmxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52Y1JlZlRhYmxlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB0aGlzLmNmU2VydmljZS5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgICB0aGlzLnZjUmVmVGFibGUhLFxyXG4gICAgICAgICAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxuICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBhbnk+KFtbJ3NtYXJ0VGFibGUnLCB0aGlzLnNtYXJ0VGFibGVdXSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5zb3J0RXZlbnRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHtcclxuICAgICAgICAgICAgaGVhZGVyLnByb3BlcnR5TmFtZSA9IGhlYWRlci5wcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDUpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IFNtYXJ0VGFibGVPcmRlci5BU0M7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVPcmRlci5BU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgU21hcnRUYWJsZU9yZGVyLkRFU0M6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QuZmluZChcclxuICAgICAgICAgICAgICAoZmlsdGVyRXhwcmVzc2lvbjogRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkpID0+XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gaGVhZGVyLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyICYmICFoZWFkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LmluZGV4T2YoZmlsdGVyKTtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LnNwbGljZShpbmRleCEsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xyXG4gICAgICAgICAgICAgIGZpbHRlci5vcmRlciA9IGhlYWRlci5vcmRlcjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgb3JkZXI6IGhlYWRlci5vcmRlcixcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogaGVhZGVyLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgICAgICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgICAgICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNtYXJ0VGFibGUuc2VsZWN0aW9uPy5jaGFuZ2VkXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocm93OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLm5leHQocm93KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kKHJvd0lkOiBudW1iZXIpOiBhbnkge31cclxuXHJcbiAgcHVibGljIGFzeW5jIGV4cGFuZEFzeW5jKHJvd0luZGV4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIGxldCByb3cgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93c1tyb3dJbmRleF07XHJcbiAgICAgIGlmIChyb3cgJiYgcm93LmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leHBhbmQodGhpcy5zbWFydEdyaWQhLCByb3cuaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cGFuZCh0aGlzLnNtYXJ0R3JpZCEsIHJvd0luZGV4LnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJFeHBhbmRhYmxlU2VjdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGFibGVTZWN0aW9ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwhLnBhZ2Uucm93cyEubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0aXRsZTogJycsXHJcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50OiB0aGlzLnNtYXJ0R3JpZCEuaGVhZGVyQ29tcG9uZW50LFxyXG4gICAgICAgIGhlYWRlcklucHV0TmFtZTogdGhpcy5zbWFydEdyaWQhLmhlYWRlckNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBoZWFkZXJEYXRhOiBpdGVtLFxyXG4gICAgICAgIGN1c3RvbUNvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGVDb21wb25lbnQsXHJcbiAgICAgICAgaW5wdXROYW1lOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZUNvbXBvbmVudElucHV0TmFtZSxcclxuICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckNhcmRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VTaXplISAqIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZUluZGV4ITtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gW107XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzLm1hcCgob3JkZXJlZENvbDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3JkZXJlZENvbCA9PT0gY29sdW0ucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21hcnRHcmlkIS5jdXN0b21Db21wb25lbnQpIHtcclxuICAgICAgbGV0IGRhdGFsYXlvdXREZWYgPSB7XHJcbiAgICAgICAgZGF0YUxheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgZ3JpZExheW91dDogU21hcnRHcmlkRGF0YUxheW91dC5DT0xVTU4sXHJcbiAgICAgICAgdHlwZTogU21hcnRHcmlkVHlwZS5DVVNUT00sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZGF0YUxheW91dERlZiA9IGRhdGFsYXlvdXREZWY7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyICsgJ0NhcmQnO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuY3VzdG9tQ29tcG9uZW50ID0gdGhpcy5pbmplY3Rvci5nZXQodG9rZW4sIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc011bHRpcGxlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VydmljZSEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZSA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuTVVMVElQTEU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVHJlZSgpIHtcclxuICAgIHRoaXMudHJlZUNvbnRyb2wgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlRmxhdHRlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUcmVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclRhYmxlKCk7XHJcbiAgICBpZiAoIXRoaXMudHJlZURhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy50cmVlRmxhdHRlbmVyID0gbmV3IE1hdFRyZWVGbGF0dGVuZXIoXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1lcixcclxuICAgICAgICB0aGlzLmdldExldmVsLFxyXG4gICAgICAgIHRoaXMuaXNFeHBhbmRhYmxlLFxyXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5cclxuICAgICAgKTtcclxuICAgICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8R3JpZFJvdz4odGhpcy5nZXRMZXZlbCwgdGhpcy5pc0V4cGFuZGFibGUpO1xyXG4gICAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4odGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzO1xyXG4gICAgbGV0IGV4cGFuZGVkTm9kZXM6IChzdHJpbmcgfCB1bmRlZmluZWQpW107XHJcbiAgICBpZiAobm9kZXMpIHtcclxuICAgICAgZXhwYW5kZWROb2RlcyA9IG5vZGVzXHJcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRhYmxlKG5vZGUpKVxyXG4gICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IHRoaXMudHJlZUNvbnRyb2w/LmlzRXhwYW5kZWQobm9kZSkpXHJcbiAgICAgICAgLm1hcCgobm9kZSkgPT4gbm9kZS5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleHBhbmRlZE5vZGVzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyEuZm9yRWFjaCgocm93OiBhbnkpID0+IChyb3cubGV2ZWwgPSB1bmRlZmluZWQpKTtcclxuICAgIHRoaXMudHJlZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoKHJvdykgPT4gIXJvdy5wYXJlbnQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPy5jbGVhcigpO1xyXG4gICAgdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuc2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LnNlbGVjdChub2RlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyZWVDb250cm9sPy5jb2xsYXBzZUFsbCgpO1xyXG4gICAgZXhwYW5kZWROb2Rlcy5mb3JFYWNoKChyb3dJZCkgPT4ge1xyXG4gICAgICBsZXQgcm93ID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzLmZpbmQoKHJvdykgPT4gcm93SWQgPT09IHJvdy5pZCk7XHJcbiAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICB0aGlzLnRyZWVDb250cm9sPy5leHBhbmQocm93KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMZXZlbCA9IChub2RlOiBhbnkpID0+IG5vZGUubGV2ZWwgPz8gMDtcclxuXHJcbiAgaXNFeHBhbmRhYmxlID0gKG5vZGU6IEdyaWRSb3cpID0+IChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZSk7XHJcblxyXG4gIGdldENoaWxkcmVuID0gKG5vZGU6IEdyaWRSb3cpOiBHcmlkUm93W10gPT4ge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IHJvd3MgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmlsdGVyKChyb3cpID0+XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbj8uc29tZSgoY2hpbGQpID0+IGNoaWxkID09PSByb3cuaWQhKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAocm93cykge1xyXG4gICAgICAgIHJldHVybiByb3dzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfTtcclxuXHJcbiAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IEdyaWRSb3cpID0+IHRoaXMuaXNFeHBhbmRhYmxlKF9ub2RlRGF0YSk7XHJcblxyXG4gIHRyYW5zZm9ybWVyID0gKHJvdzogR3JpZFJvdywgbGV2ZWw6IG51bWJlcikgPT4ge1xyXG4gICAgKHJvdyBhcyBhbnkpLmxldmVsID0gbGV2ZWw7XHJcbiAgICByZXR1cm4gcm93O1xyXG4gIH07XHJcblxyXG4gIGdldFRyZWVJdGVtKHJvdzogR3JpZFJvdyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcztcclxuICAgIGxldCBkYXRhOiBhbnkgPSByb3cuZGF0YSE7XHJcbiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2wpID0+IGRhdGFbY29sXSkuam9pbignICcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdy5pZCE7XHJcbiAgfVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSB0cmVlTm9kZSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cclxuICB0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlOiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgc2VsZWN0aW9uQmVmb3JlID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2whLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVxyXG4gICAgICAgID8gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcclxuICAgICAgICA6IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcbiAgICAgIHRoaXMuY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgbGV0IHNlbGVjdGlvbkFmdGVyID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkLm1hcCgocm93KSA9PiByb3cuaWQpO1xyXG5cclxuICAgIGxldCBzZWxlY3RlZElkcyA9IHNlbGVjdGlvbkFmdGVyLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkJlZm9yZS5pbmNsdWRlcyhzKSk7XHJcbiAgICBsZXQgdW5zZWxlY3RlZElkcyA9IHNlbGVjdGlvbkJlZm9yZS5maWx0ZXIoKHMpID0+ICFzZWxlY3Rpb25BZnRlci5pbmNsdWRlcyhzKSk7XHJcbiAgICB0aGlzLm9uU2VsZWN0Um93cyhzZWxlY3RlZElkcywgdW5zZWxlY3RlZElkcyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZTogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgbGV0IHBhcmVudDogR3JpZFJvdyB8IG51bGwgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XHJcbiAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgIHRoaXMuY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKHBhcmVudCk7XHJcbiAgICAgIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tQYXJlbnROb2RlU2VsZWN0aW9uKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVTZWxlY3RlZCA9IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID0gdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xyXG4gICAgaWYgKG5vZGVTZWxlY3RlZCAmJiAhZGVzY0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdChub2RlKTtcclxuICAgIH0gZWxzZSBpZiAoIW5vZGVTZWxlY3RlZCAmJiBkZXNjQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdChub2RlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qIEdldCB0aGUgcGFyZW50IG5vZGUgb2YgYSBub2RlICovXHJcbiAgZ2V0UGFyZW50Tm9kZShub2RlOiBHcmlkUm93KTogR3JpZFJvdyB8IG51bGwge1xyXG4gICAgY29uc3QgY3VycmVudExldmVsID0gdGhpcy5nZXRMZXZlbChub2RlKTtcclxuXHJcbiAgICBpZiAoY3VycmVudExldmVsIDwgMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy50cmVlQ29udHJvbCEuZGF0YU5vZGVzLmluZGV4T2Yobm9kZSkgLSAxO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHRoaXMudHJlZUNvbnRyb2whLmRhdGFOb2Rlc1tpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cclxuICBkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGU6IEdyaWRSb3cpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCB8fCAhdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9XHJcbiAgICAgIGRlc2NlbmRhbnRzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiEuaXNTZWxlY3RlZChjaGlsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIGRlc2NBbGxTZWxlY3RlZDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xyXG4gIGRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZTogR3JpZFJvdyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sIHx8ICF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgbGV0IHJlc3VsdCA9IGRlc2NlbmRhbnRzLnNvbWUoKGNoaWxkKSA9PiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvbnN0cnVjdEhlYWRlcigpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXJbXT4ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzICYmIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzLmxlbmd0aCkge1xyXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cy5tYXAoYXN5bmMgKGdyaWRSb3c6IEdyaWRSb3cpID0+IHtcclxuICAgICAgICAgIGxldCBuZXdVaUFjdGlvbnMgPSBncmlkUm93LmFjdGlvbnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHVpQWN0aW9uOiBhbnkpID0+ICF0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3VWlBY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIG5ld1VpQWN0aW9ucy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0b3I6IFVpQWN0aW9uRGVzY3JpcHRvciA9XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc21hcnRHcmlkIS51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlPy5nZXRBY3Rpb25EZXNjcmlwdG9yKHVpQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcikge1xyXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlID8/ICdDT0RFJyxcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5OT1JNQUwsXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuc2V0KHVpQWN0aW9uLmNvZGUhLCBzdHJ1Y3R1cmVkQ2xvbmUoZGVzY3JpcHRvcikpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JlZGVyZWREZXNjQ29sdW1ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLm1hcChcclxuICAgICAgKHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEuZGVzY3JpcHRvciEuY29sdW1ucyEuZmluZChcclxuICAgICAgICAgIChjb2xEZXNjcmlwdG9yOiBHcmlkQ29sdW1uTWV0YSkgPT4gY29sRGVzY3JpcHRvci5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZVxyXG4gICAgICAgIClcclxuICAgICkuZmxhdE1hcCgoZikgPT4gZiA/PyBbXSk7XHJcblxyXG4gICAgbGV0IGhlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvcmVkZXJlZERlc2NDb2x1bW5zLm1hcChhc3luYyAoZGVzY0NvbHVtbjogR3JpZENvbHVtbk1ldGEpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXI+ID0+IHtcclxuICAgICAgICBsZXQgY3VzdG9tVGFibGVIZWFkZXIgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWc/LmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzPy5maW5kKFxyXG4gICAgICAgICAgKGhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT4gaGVhZGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbi5wcm9wZXJ0eU5hbWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0gPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Py5maW5kKFxyXG4gICAgICAgICAgKGZpbHRlckV4cHJlc3Npb246IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PlxyXG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgb3JkZXI7XHJcbiAgICAgICAgbGV0IG9yZGVyTnVtYmVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0pIHtcclxuICAgICAgICAgIG9yZGVyID1cclxuICAgICAgICAgICAgZmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlJdGVtLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeS5PcmRlckVudW0uQXNjXHJcbiAgICAgICAgICAgICAgPyBTbWFydFRhYmxlT3JkZXIuQVNDXHJcbiAgICAgICAgICAgICAgOiBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXIgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAoZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT4gZmlsdGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWduYWxMYWJlbCA9IGN1c3RvbVRhYmxlSGVhZGVyPy5sYWJlbCA/PyBkZXNjQ29sdW1uLmxhYmVsO1xyXG4gICAgICAgIGxldCBsYWJlbCA9ICcnO1xyXG4gICAgICAgIGlmICghZGVzY0NvbHVtbi5oaWRlTGFiZWwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICAgICAgICBsYWJlbCA9IGF3YWl0IHRoaXMuc21hcnRHcmlkIS50cmFuc2xhdGVTZXJ2aWNlPy5nZXQob3JpZ25hbExhYmVsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gb3JpZ25hbExhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBjdXN0b21UYWJsZUhlYWRlcj8ucHJvcGVydGllcztcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jdXN0b21UYWJsZUhlYWRlcixcclxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGEuJyArIGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgb3JkZXIsXHJcbiAgICAgICAgICBvcmRlck51bWJlcixcclxuICAgICAgICAgIHByb3BlcnRpZXMsXHJcbiAgICAgICAgICBzdHlsZTogZGVzY0NvbHVtbi5zdHlsZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY29tcGxlbWVudCA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbHRlcihcclxuICAgICAgKHRhYmxlSGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PlxyXG4gICAgICAgICFoZWFkZXIuc29tZSgodEg6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHRILnByb3BlcnR5TmFtZS5pbmNsdWRlcyh0YWJsZUhlYWRlci5wcm9wZXJ0eU5hbWUpKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29tcGxlbWVudCkge1xyXG4gICAgICBoZWFkZXIucHVzaCguLi5jb21wbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnNpbXBsZUJ1dHRvbnMpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLm9wdGlvbnMuc2ltcGxlQnV0dG9ucy5mb3JFYWNoKCh1aUFjdGlvbkNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ3NpbXBsZV9idXR0b25zJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVCdXR0b25UeXBlLlJBSVNFRCxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgLy8gbGFiZWw6IHRoaXMuYnV0dG9uVHJhbnNsYXRvcih7IGNvZGU6IHVpQWN0aW9uQ29kZSB9KSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IHVpQWN0aW9uQ29kZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgIHNob3dCdXR0b25JZjogKHJvdzogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgcm93LmFjdGlvbnMuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvZGUgPT09IHVpQWN0aW9uQ29kZTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFoZWFkZXIuc29tZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiBoZWFkZXIucHJvcGVydHlOYW1lID09PSAnbXlfbWVudScpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8ucm93VWlBY3Rpb25UeXBlID09PSBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUpIHtcclxuICAgICAgICBsZXQgaWNvbiA9IHRoaXMuZ3JpZE1lbnVJY29uID8/ICdtb3JlX3ZlcnQnO1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ215X21lbnUnLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogU21hcnRUYWJsZUJ1dHRvblR5cGUuTUVOVSxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICBtZW51SXRlbUJ1dHRvbnNQcm9wZXJ0eU5hbWU6ICdhY3Rpb25zJyxcclxuICAgICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5PZmZzZXREYXRlVGltZScgfHxcclxuICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuTG9jYWxEYXRlVGltZSdcclxuICAgICkge1xyXG4gICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAneXl5eS5NTS5kZCBIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxyXG4gICAgICAgIGRhdGVGb3JtYXQsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcclxuICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQnO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcclxuICAgICAgICBkYXRlRm9ybWF0LFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XHJcbiAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICdIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXHJcbiAgICAgICAgZGF0ZUZvcm1hdCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkNIRUNLQk9YLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VQYWdlKGV2ZW50OiBQYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvZmZzZXQgPSBldmVudC5wYWdlU2l6ZSAqIGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIGxldCBsaW1pdCA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25QcmltZUNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucm93cztcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQuZmlyc3Q7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWZyZXNoUGFydGlhbFJlc3VsdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVmcmVzaCh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBhbnlbXSwgcm93OiBhbnksIHVpQWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBfdWlBY3Rpb246IFVpQWN0aW9uO1xyXG5cclxuICAgIGlmICghdWlBY3Rpb24pIHtcclxuICAgICAgdWlBY3Rpb24gPSByb3cuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbjogVWlBY3Rpb24pID0+IGFjdGlvbi5jb2RlID09PSBhcmdzWzBdLmNvZGUpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIF91aUFjdGlvbiA9IHsgLi4udWlBY3Rpb24gfTtcclxuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcclxuICAgICAgLi4udWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBtb2RlbDogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgdWlBY3Rpb25Nb2RlbDogYW55ID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXHJcbiAgICAgIHVpQWN0aW9uOiBfdWlBY3Rpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8udWlBY3Rpb25Nb2RlbENhbGxiYWNrKSB7XHJcbiAgICAgIHVpQWN0aW9uTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucyEudWlBY3Rpb25Nb2RlbENhbGxiYWNrKHVpQWN0aW9uTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UuZXhlY3V0ZShfdWlBY3Rpb24sIHVpQWN0aW9uTW9kZWwsIHtcclxuICAgICAgd2lkZ2V0SWQ6IHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgbm9kZUlkOiByb3cuaWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnV0dG9uVHJhbnNsYXRvcih1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkRlc2NyaXB0b3Ige1xyXG4gICAgbGV0IGRlc2MgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKTtcclxuICAgIGlmICghZGVzYykge1xyXG4gICAgICBkZXNjID0ge1xyXG4gICAgICAgIHRpdGxlOiB1aUFjdGlvbi5jb2RlISxcclxuICAgICAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuRkxBVCxcclxuICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHVpQWN0aW9uLmRlc2NyaXB0b3IpIHtcclxuICAgICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLm1lcmdlQWN0aW9uRGVzY3JpcHRvckludG9DbGllbnQodWlBY3Rpb24uZGVzY3JpcHRvciEsIGRlc2MpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlc2M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGF5b3V0RGVmKCk6IHR5cGVvZiBTbWFydExheW91dERlZiB7XHJcbiAgICByZXR1cm4gU21hcnRMYXlvdXREZWY7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrKGdyaWRSb3c6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlT25DbGljayhncmlkUm93KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlT25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBsZXQgZGVmYXVsdFJvd0FjdGlvbjogVWlBY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5zZXJ2aWNlLmdyaWRNb2RlbD8uZGVmYXVsdFJvd0FjdGlvbnMpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc2VydmljZS5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFJvd0FjdGlvbkNvZGUgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zW2luZGV4XTtcclxuXHJcbiAgICAgICAgZGVmYXVsdFJvd0FjdGlvbiA9IGdyaWRSb3cuYWN0aW9ucy5maW5kKFxyXG4gICAgICAgICAgKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4gdWlBY3Rpb24uY29kZSA9PT0gZGVmYXVsdFJvd0FjdGlvbkNvZGVcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChkZWZhdWx0Um93QWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoW10sIGdyaWRSb3csIGRlZmF1bHRSb3dBY3Rpb24pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uU2VsZWN0KHJvd0lkOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHJvdyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzPy5maW5kKChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkID09PSByb3dJZCk7XHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3QodGhpcy5zbWFydEdyaWQhLCByb3chKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgY29uc29sZS5sb2coJ2luIHJlZnJlc2poaicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdEFsbChzZWxlY3RlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdEFsbCh0aGlzLnNtYXJ0R3JpZCEsIHNlbGVjdGVkKTtcclxuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RSb3dzKFxyXG4gICAgc2VsZWN0ZWRJZHM6IChzdHJpbmcgfCB1bmRlZmluZWQpW10sXHJcbiAgICB1bnNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XHJcbiAgICBsZXQgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGxldCB1bnNlbGVjdGVkOiBzdHJpbmdbXSA9IHVuc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdFJvd3ModGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCwgdW5zZWxlY3RlZCk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUm93U2VsZWN0KGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25Sb3dVbnNlbGVjdChldmVudDogVGFibGVSb3dVblNlbGVjdEV2ZW50KSB7XHJcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TZWxlY3RBbGxSb3coZXZlbnQ6IFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdEFsbChldmVudC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIGVkaXRDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgbGV0IGRpYWxvZ0RhdGE6IFNtYXJ0RGlhbG9nRGF0YSA9IHtcclxuICAgICAgY29udGVudDoge1xyXG4gICAgICAgIHRpdGxlOiAnT3N6bG9wb2sgdGVzdHJlc3phYsOhc2EnLFxyXG4gICAgICB9LFxyXG4gICAgICBzaXplOiB7fSxcclxuICAgICAgY3VzdG9tQ29tcG9uZW50OiBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudElucHV0czoge1xyXG4gICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgdXVpZDogdGhpcy51dWlkLFxyXG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxyXG4gICAgICAgICAgdmlldzogdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LFxyXG4gICAgICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcclxuICB9XHJcblxyXG4gIC8vUFJJTUVOR1xyXG4gIGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10gPSBbXTtcclxuICBtZW51QnV0dG9ucyE6IE1lbnVJdGVtW107XHJcbiAgQFZpZXdDaGlsZCgnbWVudScpIG1lbnUhOiBNZW51O1xyXG4gIG9uT3B0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCwgcm93OiBHcmlkUm93KSB7XHJcbiAgICB0aGlzLm1lbnVCdXR0b25zID0gW107XHJcblxyXG4gICAgbGV0IG1lbnVBY3Rpb25zID0gdGhpcy5jYWxjdWxhdGVNZW51QWN0aW9ucyhyb3cpO1xyXG5cclxuICAgIG1lbnVBY3Rpb25zPy5tYXAoYXN5bmMgKHVpQWN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGRlc2MgPSBhd2FpdCB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UuZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XHJcblxyXG4gICAgICB0aGlzLm1lbnVCdXR0b25zLnB1c2goe1xyXG4gICAgICAgIGxhYmVsOiBkZXNjPy50aXRsZSA/PyB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGljb246IGRlc2M/Lmljb24sXHJcbiAgICAgICAgYXV0b21hdGlvbklkOiB1aUFjdGlvbi5jb2RlLFxyXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXhlY3V0ZShbXSwgcm93LCB1aUFjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNtdWx0aVNvcnRNZXRhPzogU29ydE1ldGFbXTtcclxuICBhc3luYyBncmlkU29ydChldmVudDogYW55KSB7XHJcbiAgICBsZXQgb3JkZXJCeUxpc3Q6IEFycmF5PEZpbHRlckV4cHJlc3Npb25PcmRlckJ5PiA9IFtdO1xyXG5cclxuICAgIGV2ZW50Lm11bHRpc29ydG1ldGE/Lm1hcCgobWV0YTogU29ydE1ldGEsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhICYmIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YS5tYXAoKG9yZGVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAobWV0YS5maWVsZCA9PT0gb3JkZXIuZmllbGQgJiYgb3JkZXIub3JkZXIgIT0gbWV0YS5vcmRlcikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9yZGVyLm9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm11bHRpc29ydG1ldGEhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gZXZlbnQubXVsdGlzb3J0bWV0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBldmVudC5tdWx0aXNvcnRtZXRhPy5tYXAoKG1ldGE6IGFueSkgPT4ge1xyXG4gICAgICBvcmRlckJ5TGlzdC5wdXNoKHtcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6IG1ldGEuZmllbGQsXHJcbiAgICAgICAgb3JkZXI6XHJcbiAgICAgICAgICBtZXRhLm9yZGVyID09PSAxXHJcbiAgICAgICAgICAgID8gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDXHJcbiAgICAgICAgICAgIDogbWV0YS5vcmRlciA9PT0gLTFcclxuICAgICAgICAgICAgICA/IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtLkRFU0NcclxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IG9yZGVyQnlMaXN0LFxyXG4gICAgICBvcmRlcmVkQ29sdW1uTmFtZXM6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgIH0pO1xyXG4gIH1cclxuICBsYXp5TG9hZChldmVudD86IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgPSBbXTtcclxuICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3QubWFwKChvcmRlcikgPT4ge1xyXG4gICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YT8ucHVzaCh7XHJcbiAgICAgICAgZmllbGQ6IG9yZGVyLnByb3BlcnR5TmFtZSEsXHJcbiAgICAgICAgb3JkZXI6IG9yZGVyLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5BU0MgPyAxIDogLTEsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBldmVudCEubXVsdGlTb3J0TWV0YSA9IHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGVhZGVyQ2hhbmdlKGV2ZW50OiBNdWx0aVNlbGVjdENoYW5nZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC52YWx1ZSEpLFxyXG4gICAgfTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UudXBkYXRlKHRoaXMudXVpZCEsIHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciEsIGdyaWRVcGRhdGVEYXRhKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ29sT3JkZXIoZXZlbnQ6IFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLmdldE9yZGVyQ29sdW1OYW1lcyhldmVudC5jb2x1bW5zISksXHJcbiAgICB9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRlckNvbHVtTmFtZXMoY29sdW1uczogR3JpZENvbHVtbk1ldGFbXSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW06IEdyaWRDb2x1bW5NZXRhKSA9PiB7XHJcbiAgICAgIHJldHVybiBjb2x1bS5wcm9wZXJ0eU5hbWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENvbFZhbHVlKGNvbDogc3RyaW5nLCByb3c6IGFueSkge1xyXG4gICAgaWYgKHJvdy5pY29uc1tjb2xdKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmV0VmFsdWUgPSAnJztcclxuICAgIGlmIChjb2wuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICBsZXQgcGF0aEFycmF5ID0gY29sLnNwbGl0KCcuJyk7XHJcbiAgICAgIGxldCBjb2xWYWx1ZSA9IHJvdy5kYXRhO1xyXG4gICAgICBwYXRoQXJyYXkubWFwKChwYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbFZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29sVmFsdWUgPSByb3cuZGF0YVtjb2xdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xWYWx1ZSA9IGNvbFZhbHVlW3BhdGhdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldFZhbHVlID0gY29sVmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXRWYWx1ZSA9IHJvdy5kYXRhW2NvbF07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1uTWV0YUJ5TmFtZSkge1xyXG4gICAgICBsZXQgY29sdW1uTWV0YSA9IHRoaXMuY29sdW1uTWV0YUJ5TmFtZSEuZ2V0KGNvbCk7XHJcbiAgICAgIGlmIChjb2x1bW5NZXRhKSB7XHJcbiAgICAgICAgbGV0IHByb3BlcnR5ID0gdGhpcy5nZXRTbWFydFRhYmxlUHJvcGVydHkoY29sdW1uTWV0YSk7XHJcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eT8udHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEU6XHJcbiAgICAgICAgICAgIHJldFZhbHVlID0gdGhpcy5zbWFydERhdGVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxyXG4gICAgICAgICAgICByZXRWYWx1ZSA9IHRoaXMuc21hcnREYXRlVGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuVElNRTpcclxuICAgICAgICAgICAgcmV0VmFsdWUgPSB0aGlzLnNtYXJ0VGltZVBpcGUudHJhbnNmb3JtKHJldFZhbHVlLCBwcm9wZXJ0eS5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93OiBhbnksIGhlYWRlcjogc3RyaW5nKTogSW1hZ2VSZXNvdXJjZVtdIHtcclxuICAgIGlmIChyb3c/Lmljb25zKSB7XHJcbiAgICAgIGxldCBpY29uQ29kZXMgPSByb3c/Lmljb25zW2hlYWRlcl07XHJcbiAgICAgIHJldHVybiBpY29uQ29kZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIGdldEltYWdlUmVzb3VyY2VTdHlsZShyZXNvdXJjZTogSW1hZ2VSZXNvdXJjZSk6IGFueSB7XHJcbiAgICByZXR1cm4gcmVzb3VyY2Uuc3R5bGUgPyByZXNvdXJjZS5zdHlsZSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Um93Q29sdW1uQWN0aW9uKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBVaUFjdGlvbk1vZGVsW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5nZXRBY3Rpb25Nb2RlbHNGcm9tTWFwKFxyXG4gICAgICB0aGlzLmNlbGxUb0FjdGlvbk1hcCxcclxuICAgICAgcm93LFxyXG4gICAgICBjb2x1bW5OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2hvd0NlbGxUb29sYmFyKHJvdzogYW55LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuc2hvd1Rvb2xiYXIocm93LCBjb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dPcHRpb25zQnV0dG9uKHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLnNob3dNZW51KFxyXG4gICAgICByb3csXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzIVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZU1lbnVBY3Rpb25zKHJvdzogR3JpZFJvdyk6IFVpQWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5jYWxjdWxhdGVNZW51QWN0aW9ucyhcclxuICAgICAgcm93LFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyFcclxuICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNlbGxUb0FjdGlvbk1hcCgpIHtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HICYmIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XHJcbiAgICAgIHRoaXMucm93TWVudUFjdGlvbk1vZGVsQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuY2VsbFRvQWN0aW9uTWFwID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZUNlbGxUb0FjdGlvbk1hcChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cyEsXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkLmdyaWRJZGVudGlmaWVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByb3dUcmFja0J5Rm4oaW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcclxuICAgIHJldHVybiByb3cuaWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICBwcml2YXRlIHJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XHJcblxyXG4gIGdldFJvd01lbnVBY3Rpb25Nb2RlbEFycmF5KHJvdzogR3JpZFJvdyk6IGFueVtdIHtcclxuICAgIGNvbnN0IGNhY2hlS2V5ID0gcm93LmlkITtcclxuICAgIGlmICh0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbEFycmF5Q2FjaGUuaGFzKGNhY2hlS2V5KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLmdldChjYWNoZUtleSkhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGxlZnRvdmVyQWN0aW9uTW9kZWxzID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmNhbGN1bGF0ZU1lbnVBY3Rpb25Nb2RlbHMoXHJcbiAgICAgICAgcm93LFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzISxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEuc2VydmljZVRvVXNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllclxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbWVudVVpQWN0aW9uOiBVaUFjdGlvbiA9IHtcclxuICAgICAgICBjb2RlOiAncm93TWVudScsXHJcbiAgICAgICAgZGVzY3JpcHRvcjoge1xyXG4gICAgICAgICAgaWNvbjogJ2VsbGlwc2lzLXYnLFxyXG4gICAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3ViQWN0aW9uczogbGVmdG92ZXJBY3Rpb25Nb2RlbHMubWFwKChtKSA9PiBtLnVpQWN0aW9uKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IG1vZGVsID0ge1xyXG4gICAgICAgIHNlcnZpY2VUb1VzZTogdGhpcy5zbWFydEdyaWQhLnNlcnZpY2VUb1VzZSxcclxuICAgICAgICB1aUFjdGlvbjogbWVudVVpQWN0aW9uLFxyXG4gICAgICAgIG5vZGVJZDogcm93LmlkLFxyXG4gICAgICAgIHdpZGdldElkOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLnNldChjYWNoZUtleSwgbW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFyciA9IFt0aGlzLnJvd01lbnVBY3Rpb25Nb2RlbENhY2hlLmdldChjYWNoZUtleSldO1xyXG4gICAgdGhpcy5yb3dNZW51QWN0aW9uTW9kZWxBcnJheUNhY2hlLnNldChjYWNoZUtleSwgYXJyKTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwicHJpbWVTbWFydEdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10b29sYmFyXCI+XHJcbiAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwLXRhYmxlXHJcbiAgICAgICpuZ0lmPVwiIXNtYXJ0R3JpZC5sYXlvdXREZWYgfHwgc21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVEFCTEVcIlxyXG4gICAgICAjcFRhYmxlXHJcbiAgICAgIFt2YWx1ZV09XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93cyFcIlxyXG4gICAgICAob25Tb3J0KT1cImdyaWRTb3J0KCRldmVudClcIlxyXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCJcclxuICAgICAgW3NvcnRNb2RlXT1cIidtdWx0aXBsZSdcIlxyXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcclxuICAgICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWQoJGV2ZW50KVwiXHJcbiAgICAgIFtyZW9yZGVyYWJsZUNvbHVtbnNdPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnNcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgKG9uQ29sUmVvcmRlcik9XCJvbkNvbE9yZGVyKCRldmVudClcIlxyXG4gICAgICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgKG9uSGVhZGVyQ2hlY2tib3hUb2dnbGUpPVwib25TZWxlY3RBbGxSb3coJGV2ZW50KVwiXHJcbiAgICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICAgIFtleHBhbmRlZFJvd0tleXNdPVwiZXhwYW5kZWRSb3dzXCJcclxuICAgICAgW3Jvd0V4cGFuZE1vZGVdPVwiJ211bHRpcGxlJ1wiXHJcbiAgICAgIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlGblwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlQ2FwdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGVcIiBjbGFzcz1cImNhcHRpb25UaXRsZVwiPlxyXG4gICAgICAgICAgICB7eyBzbWFydEdyaWQuZ3JpZE1vZGVsLnRpdGxlIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMjAwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIENvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoZWFkZXJDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIEBpZiAoc21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IC8+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlOYW1lXCIgLz5cclxuICAgICAgICAgICAgICB7eyBjb2wubGFiZWwgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgICAgICA+PC90aD5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wucHJvcGVydHlOYW1lXCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAvPlxyXG4gICAgICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXJUb29sYmFyXCJcclxuICAgICAgICAgICAgICAjaGVhZGVyVG9vbGJhclxyXG4gICAgICAgICAgICAgIFtpZF09XCInaGVhZGVyX25vdF9pbml0aWFsaXplZCdcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGggKm5nSWY9XCJzbWFydEdyaWQuZXhwYW5kYWJsZVwiPiA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgICAgIDx0clxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3R5bGUocm93KVwiXHJcbiAgICAgICAgICBbY2xhc3Mucm93RXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxyXG4gICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2socm93KVwiXHJcbiAgICAgICAgICAqbmdJZj1cInJvdyAmJiByb3cuZGF0YVwiXHJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJyb3cuaWQgPz8gbnVsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIj5cclxuICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCAqbmdJZj1cInJvdy5zZWxlY3RhYmxlICE9IGZhbHNlXCIgW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cInJvd1wiIC8+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygc21hcnRHcmlkPy5ncmlkTW9kZWw/LnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lc1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93Lmljb25zW2NvbF1cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnQtdGFibGUtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhyb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYXJ0LWljb24gW2ltYWdlUmVzb3VyY2VdPVwiaXJcIj4gPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NlbGxUb29sYmFyKHJvdywgY29sKVwiPlxyXG4gICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGNvbClcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhcm93Lmljb25zW2NvbF1cIiBbaW5uZXJIdG1sXT1cImdldENvbFZhbHVlKGNvbCwgcm93KVwiPiA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvd0NlbGxUb29sYmFyKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZCkpIHtcclxuICAgICAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICAgICBbdWlBY3Rpb25Nb2RlbHNdPVwiZ2V0Um93Q29sdW1uQWN0aW9uKHJvdywgZGVmYXVsdEFjdGlvblRvb2xiYXJJZClcIlxyXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBpZiAoc2hvdWxkU2hvd09wdGlvbnNCdXR0b24ocm93KSkge1xyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dNZW51QWN0aW9uTW9kZWxBcnJheShyb3cpXCJcclxuICAgICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPHRkICpuZ0lmPVwic21hcnRHcmlkLmV4cGFuZGFibGVcIj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIFtwUm93VG9nZ2xlcl09XCJyb3dcIlxyXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLXVwJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgQGlmIChzbWFydEdyaWQuZXhwYW5kYWJsZSkge1xyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJyb3dleHBhbnNpb25cIiBsZXQtcm93PlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICA8bGliLWV4cGFuZGVkLXJvdy1yZW5kZXJlci1jb21wb25lbnRcclxuICAgICAgICAgICAgICAgIFtyb3dJZF09XCJyb3cuaWRcIlxyXG4gICAgICAgICAgICAgICAgW3Jvd0V4cGFuZGVyXT1cInRoaXNcIlxyXG4gICAgICAgICAgICAgICAgW2V4cGFuZGVkQ29tcG9uZW50XT1cInNtYXJ0R3JpZC5leHBhbmRlZENvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICBbc21hcnRHcmlkXT1cInRoaXMuc21hcnRHcmlkXCJcclxuICAgICAgICAgICAgICA+PC9saWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgfVxyXG4gICAgPC9wLXRhYmxlPlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkNBUkQgJiYgc21hcnRHcmlkLmRhdGFMYXlvdXREZWZcIlxyXG4gICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgOiAnJyxcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXHJcbiAgICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgIFtjbGFzcy5jbGlja2FibGUtcm93XT1cInJvdy5sYXlvdXREZXNjcmlwdG9yXCJcclxuICAgICAgICAoY2xpY2spPVwicm93LmxheW91dERlc2NyaXB0b3IgJiYgb25DbGljayhyb3cpXCJcclxuICAgICAgICBbaXRlbV09XCJyb3dcIlxyXG4gICAgICAgIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCJcclxuICAgICAgICBbcGFyZW50XT1cInRoaXMucGFyZW50XCJcclxuICAgICAgICBbcGFyZW50TGF5b3V0Q29tcG9uZW50XT1cInRoaXMucGFyZW50TGF5b3V0Q29tcG9uZW50XCJcclxuICAgICAgPjwvYXBwLXNtYXJ0LWdyaWQtY2FyZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIiBjbGFzcz1cInBhZ2luYXRvci1yb3dcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvci13cmFwXCI+XHJcbiAgICAgICAgPHAtcGFnaW5hdG9yXHJcbiAgICAgICAgICBbZmlyc3RdPVwicGFnZUluZGV4IVwiXHJcbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxlbmd0aCFcIlxyXG4gICAgICAgICAgW3Jvd3NdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICAgICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cIntmaXJzdH0gLSB7bGFzdH0gLyB7dG90YWxSZWNvcmRzfVwiXHJcbiAgICAgICAgICAob25QYWdlQ2hhbmdlKT1cIm9uUHJpbWVDaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgICAgICAgIGRyb3Bkb3duQXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICA+PC9wLXBhZ2luYXRvcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgIHBUb29sdGlwPVwiRnJpc3PDrXTDqXNcIlxyXG4gICAgICAgIChjbGljayk9XCJyZWZyZXNoUGFydGlhbFJlc3VsdHMoKVwiXHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsPy5yZWZyZXNoRW5hYmxlZFwiXHJcbiAgICAgID48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwibWVudUJ1dHRvbnNcIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPiA8L3AtbWVudT5cclxuICA8L2Rpdj5cclxufSBAZWxzZSB7XHJcbiAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwic21hcnRHcmlkLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtYXJ0LWdyaWQtdG9vbGJhclwiPlxyXG4gICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgI3Rvb2xiYXIgW2lkXT1cIidncmlkX25vdF9pbml0aWFsaXplZCdcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImVkaXRDb2x1bW5zKClcIlxyXG4gICAgICAgIG1hdC1taW5pLWZhYlxyXG4gICAgICAgIGNvbG9yPVwidGV4dC1wcmltYXJ5XCJcclxuICAgICAgICAqbmdJZj1cInNtYXJ0R3JpZC5zaG93RWRpdENvbHVtbnNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiQ29sdW1uc1wiIGNsYXNzPVwic21hcnQtZ3JpZC1lZGl0LWljb25cIlxyXG4gICAgICAgICAgPnZpZXdfY29sdW1uczwvbWF0LWljb25cclxuICAgICAgICA+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIDxkaXYgW25nQ2xhc3NdPVwiaXNCbG9ja2VkID8gJ2Jsb2NrZWQnIDogJydcIj48L2Rpdj4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkQ29udGVudFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuc2hvd1Jlc3VsdENvdW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkLWRhdGEtbnVtYmVyXCI+XHJcbiAgICAgICAgICAgIHt7IHNtYXJ0R3JpZC5ncmlkTW9kZWwudG90YWxSb3dDb3VudCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0LWdyaWQtdGFibGUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZT48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5FWFBBTkRBQkxFXCI+XHJcbiAgICAgICAgPHNtYXJ0LWV4cGFuZGFibGUtc2VjdGlvblxyXG4gICAgICAgICAgI2dyaWRFeHBhbmRhYmxlU2VjdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGV4cGFuZGFibGVTZWN0aW9uIG9mIGV4cGFuZGFibGVTZWN0aW9uc1wiXHJcbiAgICAgICAgICBbZGF0YV09XCJleHBhbmRhYmxlU2VjdGlvblwiXHJcbiAgICAgICAgPjwvc21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuQ0FSRCAmJiBzbWFydEdyaWQuZGF0YUxheW91dERlZlwiXHJcbiAgICAgICAgY2xhc3M9XCJjYXJkcy1jb250YWluZXJcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOlxyXG4gICAgICAgICAgICBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgICA6ICcnLFxyXG4gICAgICAgIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGFwcC1zbWFydC1ncmlkLWNhcmRcclxuICAgICAgICAgIGNsYXNzPVwic21hcnRHcmlkLWNhcmQtY29udGFpbmVyXCJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgICAgW2NsYXNzLmNsaWNrYWJsZS1yb3ddPVwicm93LmxheW91dERlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJvdy5sYXlvdXREZXNjcmlwdG9yICYmIG9uQ2xpY2socm93KVwiXHJcbiAgICAgICAgICBbaXRlbV09XCJyb3dcIlxyXG4gICAgICAgICAgW3NtYXJ0R3JpZF09XCJzbWFydEdyaWRcIlxyXG4gICAgICAgICAgW3BhcmVudF09XCJ0aGlzLnBhcmVudFwiXHJcbiAgICAgICAgICBbcGFyZW50TGF5b3V0Q29tcG9uZW50XT1cInRoaXMucGFyZW50TGF5b3V0Q29tcG9uZW50XCJcclxuICAgICAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVFJFRSAmJiB0cmVlQ29udHJvbFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgPyAncmVwZWF0KCcgKyBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gKyAnLCAxZnIpJ1xyXG4gICAgICAgICAgICAgIDogJycsXHJcbiAgICAgICAgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LXRyZWUgW2RhdGFTb3VyY2VdPVwidHJlZURhdGFTb3VyY2UhXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sIVwiPlxyXG4gICAgICAgICAgPG1hdC10cmVlLW5vZGVcclxuICAgICAgICAgICAgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIlxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50PVwiMjRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cInRyZWUtYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGVcIlxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidHJlZU5vZGVTZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuXHJcbiAgICAgICAgICA8bWF0LXRyZWUtbm9kZVxyXG4gICAgICAgICAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIlxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50PVwiMjRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgICAgICAgICAgICBjbGFzcz1cInRyZWUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIG5vZGUuaXRlbVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+XHJcbiAgICAgICAgICAgICAgICB7eyB0cmVlQ29udHJvbCEuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX1cclxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidHJlZU5vZGVTZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuICAgICAgICA8L21hdC10cmVlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIiBjbGFzcz1cInBhZ2luYXRvci1yb3ctbWF0ZXJpYWxcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHBCdXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBpY29uPVwicGkgcGktcmVmcmVzaFwiXHJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICBwVG9vbHRpcD1cIkZyaXNzw610w6lzXCJcclxuICAgICAgICAoY2xpY2spPVwicmVmcmVzaFBhcnRpYWxSZXN1bHRzKClcIlxyXG4gICAgICAgICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbD8ucmVmcmVzaEVuYWJsZWRcIlxyXG4gICAgICA+PC9idXR0b24+XHJcbiAgICAgIDxtYXQtcGFnaW5hdG9yXHJcbiAgICAgICAgKm5nSWY9XCJzbWFydEdyaWQucGFnaW5hdG9yICYmICF0cmVlQ29udHJvbFwiXHJcbiAgICAgICAgI3BhZ2luYXRvclxyXG4gICAgICAgIFtsZW5ndGhdPVwibGVuZ3RoXCJcclxuICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgICAgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICA+PC9tYXQtcGFnaW5hdG9yPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19