@smartbit4all/ng-client 4.3.26 → 4.3.28

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 (313) hide show
  1. package/README.md +386 -386
  2. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +1 -1
  3. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +1 -1
  4. package/esm2022/lib/component-factory-service/projects.mjs +1 -1
  5. package/esm2022/lib/session/api/api/api.mjs +1 -1
  6. package/esm2022/lib/session/api/api/session.service.mjs +1 -1
  7. package/esm2022/lib/session/api/configuration.mjs +1 -1
  8. package/esm2022/lib/session/api/encoder.mjs +1 -1
  9. package/esm2022/lib/session/api/index.mjs +1 -1
  10. package/esm2022/lib/session/api/model/accountInfo.mjs +1 -1
  11. package/esm2022/lib/session/api/model/apiError.mjs +1 -1
  12. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +1 -1
  13. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +1 -1
  14. package/esm2022/lib/session/api/model/models.mjs +1 -1
  15. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +1 -1
  16. package/esm2022/lib/session/api/model/session.mjs +1 -1
  17. package/esm2022/lib/session/api/model/sessionInfoData.mjs +1 -1
  18. package/esm2022/lib/session/api/model/userActivityLog.mjs +1 -1
  19. package/esm2022/lib/session/api/param.mjs +1 -1
  20. package/esm2022/lib/session/api/variables.mjs +1 -1
  21. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +1 -1
  22. package/esm2022/lib/session/projects.mjs +1 -1
  23. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +1 -1
  24. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +1 -1
  25. package/esm2022/lib/session/smart-session-handler.service.mjs +1 -1
  26. package/esm2022/lib/session/smart-session.module.mjs +1 -1
  27. package/esm2022/lib/session/smart-session.service.mjs +1 -1
  28. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +3 -3
  29. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +1 -1
  30. package/esm2022/lib/shared/projects.mjs +1 -1
  31. package/esm2022/lib/shared/shared.module.mjs +1 -1
  32. package/esm2022/lib/shared/smart-tooltip.directive.mjs +1 -1
  33. package/esm2022/lib/shared/smarttable.date-pipe.mjs +1 -1
  34. package/esm2022/lib/smart-client/projects.mjs +1 -1
  35. package/esm2022/lib/smart-client/smart-authentication.service.mjs +1 -1
  36. package/esm2022/lib/smart-client/smart-component-api-client.mjs +1 -1
  37. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +3 -3
  38. package/esm2022/lib/smart-client/smart.component.mjs +1 -1
  39. package/esm2022/lib/smart-client/smart.service.mjs +1 -1
  40. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +1 -1
  41. package/esm2022/lib/smart-component-layout/api/model/models.mjs +1 -1
  42. package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +1 -1
  43. package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +1 -1
  44. package/esm2022/lib/smart-component-layout/projects.mjs +1 -1
  45. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +1 -1
  46. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +3 -3
  47. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +1 -1
  48. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +1 -1
  49. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +22 -22
  50. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +1 -1
  51. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +1 -1
  52. package/esm2022/lib/smart-diagram/projects.mjs +1 -1
  53. package/esm2022/lib/smart-dialog/projects.mjs +1 -1
  54. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +3 -3
  55. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +1 -1
  56. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +1 -1
  57. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +1 -1
  58. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +3 -3
  59. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +1 -1
  60. package/esm2022/lib/smart-expandable-section/projects.mjs +1 -1
  61. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +1 -1
  62. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +1 -1
  63. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +1 -1
  64. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +1 -1
  65. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +1 -1
  66. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +1 -1
  67. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +1 -1
  68. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +1 -1
  69. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +1 -1
  70. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +1 -1
  71. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +1 -1
  72. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +1 -1
  73. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +1 -1
  74. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +1 -1
  75. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +1 -1
  76. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +1 -1
  77. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +1 -1
  78. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +1 -1
  79. package/esm2022/lib/smart-filter/api/value/model/value.mjs +1 -1
  80. package/esm2022/lib/smart-filter/projects.mjs +1 -1
  81. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +1 -1
  82. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +3 -3
  83. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +3 -3
  84. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +3 -3
  85. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +1 -1
  86. package/esm2022/lib/smart-filter/smart-filter.model.mjs +1 -1
  87. package/esm2022/lib/smart-filter/smart-filter.module.mjs +1 -1
  88. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +1 -1
  89. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +1 -1
  90. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +1 -1
  91. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +1 -1
  92. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +1 -1
  93. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +1 -1
  94. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +1 -1
  95. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +1 -1
  96. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +1 -1
  97. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +1 -1
  98. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +1 -1
  99. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +1 -1
  100. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +1 -1
  101. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +1 -1
  102. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +1 -1
  103. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +1 -1
  104. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +1 -1
  105. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +1 -1
  106. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +1 -1
  107. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +1 -1
  108. package/esm2022/lib/smart-filter-editor/api/param.mjs +1 -1
  109. package/esm2022/lib/smart-filter-editor/api/variables.mjs +1 -1
  110. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +1 -1
  111. package/esm2022/lib/smart-filter-editor/project.mjs +1 -1
  112. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +3 -3
  113. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +3 -3
  114. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +3 -3
  115. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +1 -1
  116. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +1 -1
  117. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +1 -1
  118. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +3 -3
  119. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +3 -3
  120. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +1 -1
  121. package/esm2022/lib/smart-form/projects.mjs +1 -1
  122. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +1 -1
  123. package/esm2022/lib/smart-form/services/smartform.service.mjs +1 -1
  124. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +3 -3
  125. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +3 -3
  126. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +1 -1
  127. package/esm2022/lib/smart-form/smartform.component.mjs +3 -3
  128. package/esm2022/lib/smart-form/smartform.form-model.mjs +1 -1
  129. package/esm2022/lib/smart-form/smartform.model.mjs +1 -1
  130. package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +3 -3
  131. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +3 -3
  132. package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +3 -3
  133. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +1 -1
  134. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +1 -1
  135. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +3 -3
  136. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +3 -3
  137. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +1 -1
  138. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +1 -1
  139. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +1 -1
  140. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +1 -1
  141. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +1 -1
  142. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +1 -1
  143. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +1 -1
  144. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +1 -1
  145. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +1 -1
  146. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +1 -1
  147. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +1 -1
  148. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +1 -1
  149. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +1 -1
  150. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +1 -1
  151. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +1 -1
  152. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +1 -1
  153. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +1 -1
  154. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +1 -1
  155. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +1 -1
  156. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +1 -1
  157. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +1 -1
  158. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +1 -1
  159. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +1 -1
  160. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +1 -1
  161. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +3 -3
  162. package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +3 -3
  163. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +3 -3
  164. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +3 -3
  165. package/esm2022/lib/smart-grid/models/model.mjs +1 -1
  166. package/esm2022/lib/smart-grid/projects.mjs +1 -1
  167. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +1 -1
  168. package/esm2022/lib/smart-grid/smart-grid.component.mjs +10 -4
  169. package/esm2022/lib/smart-grid/smart-grid.module.mjs +1 -1
  170. package/esm2022/lib/smart-grid/smart-grid.service.mjs +1 -1
  171. package/esm2022/lib/smart-icon/projects.mjs +1 -1
  172. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +3 -3
  173. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +3 -3
  174. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +1 -1
  175. package/esm2022/lib/smart-icon/smart-icon.module.mjs +1 -1
  176. package/esm2022/lib/smart-icon/smart-icon.service.mjs +1 -1
  177. package/esm2022/lib/smart-map/abstract-map.mjs +1 -1
  178. package/esm2022/lib/smart-map/api-default/api-default.mjs +1 -1
  179. package/esm2022/lib/smart-map/impl/google-map.mjs +1 -1
  180. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +1 -1
  181. package/esm2022/lib/smart-map/projects.mjs +1 -1
  182. package/esm2022/lib/smart-map/smart-map.component.mjs +3 -3
  183. package/esm2022/lib/smart-map/smart-map.module.mjs +1 -1
  184. package/esm2022/lib/smart-map/smart-map.types.mjs +1 -1
  185. package/esm2022/lib/smart-navbar/projects.mjs +1 -1
  186. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +3 -3
  187. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +1 -1
  188. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +1 -1
  189. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +1 -1
  190. package/esm2022/lib/smart-navigation/projects.mjs +1 -1
  191. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +1 -1
  192. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +1 -1
  193. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +1 -1
  194. package/esm2022/lib/smart-ng-client.module.mjs +1 -1
  195. package/esm2022/lib/smart-ng-client.service.mjs +1 -1
  196. package/esm2022/lib/smart-subject/projects.mjs +1 -1
  197. package/esm2022/lib/smart-subject/smart-subject.mjs +1 -1
  198. package/esm2022/lib/smart-tab-group/projects.mjs +1 -1
  199. package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +3 -3
  200. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +1 -1
  201. package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +1 -1
  202. package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +3 -3
  203. package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +3 -3
  204. package/esm2022/lib/smart-tab-group/tabTile.model.mjs +1 -1
  205. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +3 -3
  206. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +3 -3
  207. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +1 -1
  208. package/esm2022/lib/smart-table/projects.mjs +1 -1
  209. package/esm2022/lib/smart-table/smarttable.component.mjs +3 -3
  210. package/esm2022/lib/smart-table/smarttable.model.mjs +1 -1
  211. package/esm2022/lib/smart-table/smarttable.module.mjs +1 -1
  212. package/esm2022/lib/smart-table/smarttable.service.mjs +1 -1
  213. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +3 -3
  214. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +3 -3
  215. package/esm2022/lib/smart-table/tables/table.mjs +1 -1
  216. package/esm2022/lib/smart-tree/projects.mjs +1 -1
  217. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +2 -2
  218. package/esm2022/lib/smart-tree/smarttree.component.mjs +10 -4
  219. package/esm2022/lib/smart-tree/smarttree.model.mjs +1 -1
  220. package/esm2022/lib/smart-tree/smarttree.module.mjs +1 -1
  221. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +1 -1
  222. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +1 -1
  223. package/esm2022/lib/smart-tree/smarttree.service.mjs +1 -1
  224. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +1 -1
  225. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +1 -1
  226. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +1 -1
  227. package/esm2022/lib/smart-tree/tree-api/param.mjs +1 -1
  228. package/esm2022/lib/smart-tree/tree-api/variables.mjs +1 -1
  229. package/esm2022/lib/smart-validation/named-validator.service.mjs +1 -1
  230. package/esm2022/lib/smart-validation/projects.mjs +1 -1
  231. package/esm2022/lib/smart-validation/smart-validation.module.mjs +1 -1
  232. package/esm2022/lib/smart-validation/smart-validation.types.mjs +1 -1
  233. package/esm2022/lib/view-context/api/api/view.service.mjs +1 -1
  234. package/esm2022/lib/view-context/api/api-default/binaryData.mjs +1 -1
  235. package/esm2022/lib/view-context/api/api-default/invocationError.mjs +1 -1
  236. package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +1 -1
  237. package/esm2022/lib/view-context/api/model/models.mjs +1 -1
  238. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
  239. package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
  240. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
  241. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
  242. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
  243. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
  244. package/esm2022/lib/view-context/api/model/view.mjs +1 -1
  245. package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
  246. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +3 -3
  247. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +3 -3
  248. package/esm2022/lib/view-context/projects.mjs +1 -1
  249. package/esm2022/lib/view-context/property-definition-data.mjs +1 -1
  250. package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +1 -1
  251. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +37 -49
  252. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +1 -1
  253. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +1 -1
  254. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +3 -3
  255. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +3 -3
  256. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +3 -3
  257. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +3 -3
  258. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +1 -1
  259. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +3 -3
  260. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +3 -3
  261. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +1 -1
  262. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +3 -3
  263. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +3 -3
  264. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +1 -1
  265. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +3 -3
  266. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +1 -1
  267. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +3 -3
  268. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +3 -3
  269. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +6 -3
  270. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +1 -1
  271. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +1 -1
  272. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +1 -1
  273. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +1 -1
  274. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +3 -3
  275. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +1 -1
  276. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +1 -1
  277. package/esm2022/lib/view-context/smart-view-context.model.mjs +1 -1
  278. package/esm2022/lib/view-context/smart-view-context.module.mjs +1 -1
  279. package/esm2022/lib/view-context/smart-view-context.service.mjs +1 -1
  280. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +1 -1
  281. package/esm2022/lib/view-context/utility/componentLibrary.mjs +1 -1
  282. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +1 -1
  283. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +1 -1
  284. package/esm2022/lib/view-context/value-api/api/api.mjs +1 -1
  285. package/esm2022/lib/view-context/value-api/api/value.service.mjs +1 -1
  286. package/esm2022/lib/view-context/value-api/api.module.mjs +1 -1
  287. package/esm2022/lib/view-context/value-api/configuration.mjs +1 -1
  288. package/esm2022/lib/view-context/value-api/encoder.mjs +1 -1
  289. package/esm2022/lib/view-context/value-api/index.mjs +1 -1
  290. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +1 -1
  291. package/esm2022/lib/view-context/value-api/model/models.mjs +1 -1
  292. package/esm2022/lib/view-context/value-api/model/value.mjs +1 -1
  293. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +1 -1
  294. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +1 -1
  295. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +1 -1
  296. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +1 -1
  297. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +1 -1
  298. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +1 -1
  299. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +1 -1
  300. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +1 -1
  301. package/esm2022/lib/view-context/value-api/param.mjs +1 -1
  302. package/esm2022/lib/view-context/value-api/variables.mjs +1 -1
  303. package/esm2022/projects.mjs +1 -1
  304. package/fesm2022/smartbit4all-ng-client.mjs +181 -178
  305. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  306. package/lib/smart-grid/smart-grid.component.d.ts +1 -0
  307. package/lib/smart-tree/smarttree-generic.service.d.ts +0 -1
  308. package/lib/smart-tree/smarttree.component.d.ts +1 -0
  309. package/lib/smart-tree/smarttree.service.d.ts +1 -0
  310. package/lib/view-context/smart-ui-action/components/menu/menu.component.d.ts +8 -10
  311. package/package.json +1 -1
  312. package/smartbit4all-ng-client-4.3.28.tgz +0 -0
  313. package/smartbit4all-ng-client-4.3.26.tgz +0 -0
@@ -1,6 +1,6 @@
1
1
  import { SelectionModel } from '@angular/cdk/collections';
2
2
  import { FlatTreeControl } from '@angular/cdk/tree';
3
- import { Component, Inject, Input, ViewChild, ViewChildren, ViewContainerRef, } from '@angular/core';
3
+ import { Component, HostBinding, Inject, Input, ViewChild, ViewChildren, ViewContainerRef, } from '@angular/core';
4
4
  import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
5
5
  import { Subject, takeUntil } from 'rxjs';
6
6
  import { FilterExpressionOrderBy } from '../smart-filter-editor/api/model/filterExpressionOrderBy';
@@ -42,6 +42,9 @@ import * as i23 from "primeng/multiselect";
42
42
  import * as i24 from "./components/smart-grid-card/smart-grid-card.component";
43
43
  import * as i25 from "./components/generic-component/expanded-row-renderer.component";
44
44
  export class SmartGridComponent {
45
+ get testId() {
46
+ return this.smartGrid?.gridModel?.identifier ?? null;
47
+ }
45
48
  constructor(service, cfService, dialog, injector, uiActionDescriptorService, smartDatePipe, smartDateTimePipe, smartTimePipe, compLib, gridMenuIcon) {
46
49
  this.service = service;
47
50
  this.cfService = cfService;
@@ -994,11 +997,11 @@ export class SmartGridComponent {
994
997
  return row.id;
995
998
  }
996
999
  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 }); }
997
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", dev: "dev" }, 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) {\n\n<div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\n </div>\n <p-table\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\n #pTable\n [value]=\"smartGrid.gridModel.page.rows!\"\n (onSort)=\"gridSort($event)\"\n [customSort]=\"true\"\n [sortMode]=\"'multiple'\"\n [lazy]=\"true\"\n (onLazyLoad)=\"lazyLoad($event)\"\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\n [columns]=\"columns\"\n (onColReorder)=\"onColOrder($event)\"\n (onRowSelect)=\"onRowSelect($event)\"\n (onRowUnselect)=\"onRowUnselect($event)\"\n [selection]=\"selectedRows\"\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\n dataKey=\"id\"\n [expandedRowKeys]=\"expandedRows\"\n [rowExpandMode]=\"'multiple'\"\n [rowTrackBy]=\"rowTrackByFn\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"tableCaption\">\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\n {{ smartGrid.gridModel.title }}\n </div>\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\n <p-multiSelect\n display=\"chip\"\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\n optionLabel=\"label\"\n [(ngModel)]=\"columns\"\n selectedItemsLabel=\"{0} columns selected\"\n [style]=\"{ 'min-width': '200px' }\"\n placeholder=\"Choose Columns\"\n (onChange)=\"headerChange($event)\"\n />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\n <th\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n >\n <p-tableHeaderCheckbox />\n </th>\n <th\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n ></th>\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\n <p-sortIcon [field]=\"col.propertyName\" />\n {{ col.label }}\n </th>\n } @else {\n <th\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n >\n <p-tableHeaderCheckbox />\n </th>\n <th\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n ></th>\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\n <p-sortIcon [field]=\"col.propertyName\" />\n {{ col.label }}\n </th>\n }\n\n <th>\n <smart-ui-action-toolbar\n class=\"headerToolbar\"\n #headerToolbar\n [id]=\"'header_not_initialized'\"\n ></smart-ui-action-toolbar>\n </th>\n <th *ngIf=\"smartGrid.expandable\"> </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\n <tr\n [ngClass]=\"getStyle(row)\"\n [class.rowExpanded]=\"expanded\"\n (dblclick)=\"onDoubleClick(row)\"\n *ngIf=\"row && row.data\"\n >\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\n </td>\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\n <p-tableRadioButton [value]=\"row\" />\n </td>\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\n <div *ngIf=\"row.icons[col]\">\n <div class=\"smart-table-icon-container\">\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\n <smart-ui-action-toolbar\n [uiActionModels]=\"getRowColumnAction(row, col)\"\n ></smart-ui-action-toolbar>\n </ng-container>\n\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\n </td>\n <td>\n <div class=\"menu-button\">\n @if(showCellToolbar(row, defaultActionToolbarId)){\n <smart-ui-action-toolbar\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\n ></smart-ui-action-toolbar>\n }\n <p-button\n [rounded]=\"true\"\n [text]=\"true\"\n *ngIf=\"shouldShowOptionsButton(row)\"\n (onClick)=\"onOptionsClick($event, row)\"\n >\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\n </p-button>\n </div>\n </td>\n <td *ngIf=\"smartGrid.expandable\">\n <p-button\n type=\"button\"\n pRipple\n [pRowToggler]=\"row\"\n [text]=\"true\"\n severity=\"secondary\"\n [rounded]=\"true\"\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\n />\n </td>\n </tr>\n </ng-template>\n @if(smartGrid.expandable){\n <ng-template pTemplate=\"rowexpansion\" let-row>\n <tr>\n <td colspan=\"100%\">\n <lib-expanded-row-renderer-component\n [rowId]=\"row.id\"\n [rowExpander]=\"this\"\n [expandedComponent]=\"smartGrid.expandedComponent\"\n [smartGrid]=\"this.smartGrid\"\n ></lib-expanded-row-renderer-component>\n </td>\n </tr>\n </ng-template>\n }\n </p-table>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\n class=\"cards-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <app-smart-grid-card\n class=\"smartGrid-card-container\"\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\n [item]=\"task\"\n [smartGrid]=\"smartGrid\"\n [onSelect]=\"onSelect.bind(this)\"\n ></app-smart-grid-card>\n </div>\n<div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\n <div class=\"paginator-wrap\">\n <p-paginator\n [first]=\"pageIndex!\"\n [totalRecords]=\"length!\"\n [rows]=\"pageSize\"\n [rowsPerPageOptions]=\"pageSizeOptions\"\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\n (onPageChange)=\"onPrimeChangePage($event)\"\n [showCurrentPageReport]=\"true\"\n dropdownAppendTo=\"body\"\n ></p-paginator>\n </div>\n\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n class=\"p-button-text\"\n pTooltip=\"Friss\u00EDt\u00E9s\"\n (click)=\"refreshPartialResults()\"\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\n ></button>\n</div>\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\n</div>\n}@else {\n<div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\n <button\n (click)=\"editColumns()\"\n mat-mini-fab\n color=\"text-primary\"\n *ngIf=\"smartGrid.showEditColumns\"\n >\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\n >view_columns</mat-icon\n >\n </button>\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n <div *ngIf=\"smartGrid.showResultCount\">\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n </div>\n\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\n <smart-expandable-section\n #gridExpandableSection\n *ngFor=\"let expandableSection of expandableSections\"\n [data]=\"expandableSection\"\n ></smart-expandable-section>\n </div>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\n class=\"cards-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <app-smart-grid-card\n class=\"smartGrid-card-container\"\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\n [item]=\"task\"\n [smartGrid]=\"smartGrid\"\n [onSelect]=\"onSelect.bind(this)\"\n ></app-smart-grid-card>\n </div>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\n class=\"tree-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n matTreeNodeToggle\n matTreeNodePadding\n matTreeNodePaddingIndent=\"24\"\n >\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox\n class=\"checklist-leaf-node\"\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\n (change)=\"treeNodeSelectionToggle(node)\"\n >{{ getTreeItem(node) }}</mat-checkbox\n >\n </mat-tree-node>\n\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n matTreeNodePadding\n matTreeNodePaddingIndent=\"24\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"tree-button\"\n [attr.aria-label]=\"'Toggle ' + node.item\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\n [indeterminate]=\"descendantsPartiallySelected(node)\"\n (change)=\"treeNodeSelectionToggle(node)\"\n >{{ getTreeItem(node) }}</mat-checkbox\n >\n </mat-tree-node>\n </mat-tree>\n </div>\n </div>\n<div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n class=\"p-button-text\"\n pTooltip=\"Friss\u00EDt\u00E9s\"\n (click)=\"refreshPartialResults()\"\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\n ></button>\n <mat-paginator\n *ngIf=\"smartGrid.paginator && !treeControl\"\n #paginator\n [length]=\"length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onChangePage($event)\"\n ></mat-paginator>\n </div>\n</div>\n}\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-card-container{height:auto;border:1px solid black;border-radius:8px}.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}\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", "onSelect"] }, { kind: "component", type: i25.ExpandedRowRendererComponent, selector: "lib-expanded-row-renderer-component", inputs: ["rowId", "rowExpander", "expandedComponent", "smartGrid"] }] }); }
1000
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", 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\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 [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\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 [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\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 >\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 <p-button\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n *ngIf=\"shouldShowOptionsButton(row)\"\r\n (onClick)=\"onOptionsClick($event, row)\"\r\n >\r\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\r\n </p-button>\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 task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\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 task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\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-card-container{height:auto;border:1px solid black;border-radius:8px}.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}\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", "onSelect"] }, { kind: "component", type: i25.ExpandedRowRendererComponent, selector: "lib-expanded-row-renderer-component", inputs: ["rowId", "rowExpander", "expandedComponent", "smartGrid"] }] }); }
998
1001
  }
999
1002
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, decorators: [{
1000
1003
  type: Component,
1001
- args: [{ selector: 'smart-grid', providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], template: "@if(compLib === componentLibrary.PRIMENG) {\n\n<div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\n </div>\n <p-table\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\n #pTable\n [value]=\"smartGrid.gridModel.page.rows!\"\n (onSort)=\"gridSort($event)\"\n [customSort]=\"true\"\n [sortMode]=\"'multiple'\"\n [lazy]=\"true\"\n (onLazyLoad)=\"lazyLoad($event)\"\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\n [columns]=\"columns\"\n (onColReorder)=\"onColOrder($event)\"\n (onRowSelect)=\"onRowSelect($event)\"\n (onRowUnselect)=\"onRowUnselect($event)\"\n [selection]=\"selectedRows\"\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\n dataKey=\"id\"\n [expandedRowKeys]=\"expandedRows\"\n [rowExpandMode]=\"'multiple'\"\n [rowTrackBy]=\"rowTrackByFn\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"tableCaption\">\n <div *ngIf=\"smartGrid.gridModel.title\" class=\"captionTitle\">\n {{ smartGrid.gridModel.title }}\n </div>\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\n <p-multiSelect\n display=\"chip\"\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\n optionLabel=\"label\"\n [(ngModel)]=\"columns\"\n selectedItemsLabel=\"{0} columns selected\"\n [style]=\"{ 'min-width': '200px' }\"\n placeholder=\"Choose Columns\"\n (onChange)=\"headerChange($event)\"\n />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n @if (smartGrid.gridModel.view?.descriptor?.showEditColumns) {\n <th\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n >\n <p-tableHeaderCheckbox />\n </th>\n <th\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n ></th>\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\n <p-sortIcon [field]=\"col.propertyName\" />\n {{ col.label }}\n </th>\n } @else {\n <th\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n >\n <p-tableHeaderCheckbox />\n </th>\n <th\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\n style=\"width: 4rem\"\n ></th>\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\n <p-sortIcon [field]=\"col.propertyName\" />\n {{ col.label }}\n </th>\n }\n\n <th>\n <smart-ui-action-toolbar\n class=\"headerToolbar\"\n #headerToolbar\n [id]=\"'header_not_initialized'\"\n ></smart-ui-action-toolbar>\n </th>\n <th *ngIf=\"smartGrid.expandable\"> </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-expanded=\"expanded\">\n <tr\n [ngClass]=\"getStyle(row)\"\n [class.rowExpanded]=\"expanded\"\n (dblclick)=\"onDoubleClick(row)\"\n *ngIf=\"row && row.data\"\n >\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\n </td>\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\n <p-tableRadioButton [value]=\"row\" />\n </td>\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\n <div *ngIf=\"row.icons[col]\">\n <div class=\"smart-table-icon-container\">\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"showCellToolbar(row, col)\">\n <smart-ui-action-toolbar\n [uiActionModels]=\"getRowColumnAction(row, col)\"\n ></smart-ui-action-toolbar>\n </ng-container>\n\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\n </td>\n <td>\n <div class=\"menu-button\">\n @if(showCellToolbar(row, defaultActionToolbarId)){\n <smart-ui-action-toolbar\n [uiActionModels]=\"getRowColumnAction(row, defaultActionToolbarId)\"\n ></smart-ui-action-toolbar>\n }\n <p-button\n [rounded]=\"true\"\n [text]=\"true\"\n *ngIf=\"shouldShowOptionsButton(row)\"\n (onClick)=\"onOptionsClick($event, row)\"\n >\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\n </p-button>\n </div>\n </td>\n <td *ngIf=\"smartGrid.expandable\">\n <p-button\n type=\"button\"\n pRipple\n [pRowToggler]=\"row\"\n [text]=\"true\"\n severity=\"secondary\"\n [rounded]=\"true\"\n [icon]=\"expanded ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\n />\n </td>\n </tr>\n </ng-template>\n @if(smartGrid.expandable){\n <ng-template pTemplate=\"rowexpansion\" let-row>\n <tr>\n <td colspan=\"100%\">\n <lib-expanded-row-renderer-component\n [rowId]=\"row.id\"\n [rowExpander]=\"this\"\n [expandedComponent]=\"smartGrid.expandedComponent\"\n [smartGrid]=\"this.smartGrid\"\n ></lib-expanded-row-renderer-component>\n </td>\n </tr>\n </ng-template>\n }\n </p-table>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\n class=\"cards-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <app-smart-grid-card\n class=\"smartGrid-card-container\"\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\n [item]=\"task\"\n [smartGrid]=\"smartGrid\"\n [onSelect]=\"onSelect.bind(this)\"\n ></app-smart-grid-card>\n </div>\n<div *ngIf=\"smartGrid.paginator\" class=\"paginator-row\">\n <div class=\"paginator-wrap\">\n <p-paginator\n [first]=\"pageIndex!\"\n [totalRecords]=\"length!\"\n [rows]=\"pageSize\"\n [rowsPerPageOptions]=\"pageSizeOptions\"\n currentPageReportTemplate=\"{first} - {last} / {totalRecords}\"\n (onPageChange)=\"onPrimeChangePage($event)\"\n [showCurrentPageReport]=\"true\"\n dropdownAppendTo=\"body\"\n ></p-paginator>\n </div>\n\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n class=\"p-button-text\"\n pTooltip=\"Friss\u00EDt\u00E9s\"\n (click)=\"refreshPartialResults()\"\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\n ></button>\n</div>\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\n</div>\n}@else {\n<div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\n <button\n (click)=\"editColumns()\"\n mat-mini-fab\n color=\"text-primary\"\n *ngIf=\"smartGrid.showEditColumns\"\n >\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\n >view_columns</mat-icon\n >\n </button>\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n <div *ngIf=\"smartGrid.showResultCount\">\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n </div>\n\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\n <smart-expandable-section\n #gridExpandableSection\n *ngFor=\"let expandableSection of expandableSections\"\n [data]=\"expandableSection\"\n ></smart-expandable-section>\n </div>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\n class=\"cards-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <app-smart-grid-card\n class=\"smartGrid-card-container\"\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\n [item]=\"task\"\n [smartGrid]=\"smartGrid\"\n [onSelect]=\"onSelect.bind(this)\"\n ></app-smart-grid-card>\n </div>\n <div\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\n class=\"tree-container\"\n [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : ''\n }\"\n >\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n matTreeNodeToggle\n matTreeNodePadding\n matTreeNodePaddingIndent=\"24\"\n >\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox\n class=\"checklist-leaf-node\"\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\n (change)=\"treeNodeSelectionToggle(node)\"\n >{{ getTreeItem(node) }}</mat-checkbox\n >\n </mat-tree-node>\n\n <mat-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n matTreeNodePadding\n matTreeNodePaddingIndent=\"24\"\n >\n <button\n mat-icon-button\n matTreeNodeToggle\n class=\"tree-button\"\n [attr.aria-label]=\"'Toggle ' + node.item\"\n >\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\n [indeterminate]=\"descendantsPartiallySelected(node)\"\n (change)=\"treeNodeSelectionToggle(node)\"\n >{{ getTreeItem(node) }}</mat-checkbox\n >\n </mat-tree-node>\n </mat-tree>\n </div>\n </div>\n<div *ngIf=\"smartGrid.paginator\" class=\"paginator-row-material\">\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n class=\"p-button-text\"\n pTooltip=\"Friss\u00EDt\u00E9s\"\n (click)=\"refreshPartialResults()\"\n *ngIf=\"smartGrid.gridModel?.refreshEnabled\"\n ></button>\n <mat-paginator\n *ngIf=\"smartGrid.paginator && !treeControl\"\n #paginator\n [length]=\"length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onChangePage($event)\"\n ></mat-paginator>\n </div>\n</div>\n}\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-card-container{height:auto;border:1px solid black;border-radius:8px}.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}\n"] }]
1004
+ args: [{ selector: 'smart-grid', providers: [SmartGridService, SmartDatePipe, SmartDateTimePipe, SmartTimePipe], template: "@if(compLib === componentLibrary.PRIMENG) {\r\n\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 [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\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 [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\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 >\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 <p-button\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n *ngIf=\"shouldShowOptionsButton(row)\"\r\n (onClick)=\"onOptionsClick($event, row)\"\r\n >\r\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\r\n </p-button>\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 task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\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 task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\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-card-container{height:auto;border:1px solid black;border-radius:8px}.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}\n"] }]
1002
1005
  }], 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: [{
1003
1006
  type: Inject,
1004
1007
  args: [COMPONENT_LIBRARY]
@@ -1009,6 +1012,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
1009
1012
  type: Input
1010
1013
  }], uuid: [{
1011
1014
  type: Input
1015
+ }], testId: [{
1016
+ type: HostBinding,
1017
+ args: ['attr.data-testid']
1012
1018
  }], dev: [{
1013
1019
  type: Input
1014
1020
  }], vcRefTable: [{
@@ -1027,4 +1033,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
1027
1033
  type: ViewChild,
1028
1034
  args: ['menu']
1029
1035
  }] } });
1030
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFHVCxNQUFNLEVBRU4sS0FBSyxFQU1MLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFDTCxVQUFVLEVBQ1Ysb0JBQW9CLEVBR3BCLDRCQUE0QixFQUU1QiwyQkFBMkIsRUFDM0IsZUFBZSxFQUNmLGNBQWMsRUFDZCxtQkFBbUIsR0FDcEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBR0wsa0JBQWtCLEdBRW5CLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsR0FJakIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBR0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUVqQiwwQkFBMEIsR0FDM0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixP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QTg4QnZCLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEZsYXRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0VHJlZUZsYXREYXRhU291cmNlLCBNYXRUcmVlRmxhdHRlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50LWZhY3Rvcnktc2VydmljZS9wcm9qZWN0cyc7XG5pbXBvcnQgeyBTbWFydERpYWxvZ0RhdGEgfSBmcm9tICcuLi9zbWFydC1kaWFsb2cvcHJvamVjdHMnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkgfSBmcm9tICcuLi9zbWFydC1maWx0ZXItZWRpdG9yL2FwaS9tb2RlbC9maWx0ZXJFeHByZXNzaW9uT3JkZXJCeSc7XG5pbXBvcnQge1xuICBTbWFydFRhYmxlLFxuICBTbWFydFRhYmxlQnV0dG9uVHlwZSxcbiAgU21hcnRUYWJsZUhlYWRlcixcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnRpZXMsXG4gIFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUsXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2UsXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcbiAgU21hcnRUYWJsZU9yZGVyLFxuICBTbWFydFRhYmxlVHlwZSxcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcbn0gZnJvbSAnLi4vc21hcnQtdGFibGUvcHJvamVjdHMnO1xuaW1wb3J0IHtcbiAgSW1hZ2VSZXNvdXJjZSxcbiAgVWlBY3Rpb24sXG4gIFVpQWN0aW9uQnV0dG9uVHlwZSxcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvYXBpJztcbmltcG9ydCB7XG4gIENPTVBPTkVOVF9MSUJSQVJZLFxuICBDb21wb25lbnRMaWJyYXJ5LFxuICBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxuICBVaUFjdGlvbk1vZGVsLFxuICBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQsXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9wcm9qZWN0cyc7XG5pbXBvcnQge1xuICBHcmlkQ29sdW1uTWV0YSxcbiAgR3JpZFJvdyxcbiAgR3JpZFNlbGVjdGlvbk1vZGUsXG4gIEdyaWRTZWxlY3Rpb25UeXBlLFxuICBHcmlkVXBkYXRlRGF0YSxcbiAgR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0sXG59IGZyb20gJy4vYXBpL2dyaWQtYXBpJztcbmltcG9ydCB7IFRhYmxlTGF5b3V0RGVmaW5lckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1sYXlvdXQtZGVmaW5lci90YWJsZS1sYXlvdXQtZGVmaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgR3JpZFVpQWN0aW9uVHlwZSxcbiAgU21hcnRHcmlkLFxuICBTbWFydEdyaWREYXRhTGF5b3V0LFxuICBTbWFydEdyaWRUeXBlLFxuICBTbWFydExheW91dERlZixcbn0gZnJvbSAnLi9tb2RlbHMvbW9kZWwnO1xuaW1wb3J0IHsgU21hcnRHcmlkU2VydmljZSB9IGZyb20gJy4vc21hcnQtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1lbnVJdGVtLCBTb3J0TWV0YSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xuaW1wb3J0IHtcbiAgUm93VG9nZ2xlcixcbiAgVGFibGVDb2x1bW5SZW9yZGVyRXZlbnQsXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCxcbiAgVGFibGVMYXp5TG9hZEV2ZW50LFxuICBUYWJsZVJvd0V4cGFuZEV2ZW50LFxuICBUYWJsZVJvd1NlbGVjdEV2ZW50LFxuICBUYWJsZVJvd1VuU2VsZWN0RXZlbnQsXG59IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0gfSBmcm9tICcuLi9zbWFydC1maWx0ZXIvcHJvamVjdHMnO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHsgU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsIH0gZnJvbSAnLi9zbWFydC1ncmlkLXRvb2xiYXItdXRpbCc7XG5pbXBvcnQgeyBFeHBhbmRlZFJvd1JlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2dlbmVyaWMtY29tcG9uZW50L2V4cGFuZGVkLXJvdy1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGUgfSBmcm9tICcuLi9zaGFyZWQvc21hcnR0YWJsZS5kYXRlLXBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzbWFydC1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zbWFydC1ncmlkLmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbU21hcnRHcmlkU2VydmljZSwgU21hcnREYXRlUGlwZSwgU21hcnREYXRlVGltZVBpcGUsIFNtYXJ0VGltZVBpcGVdLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjUsIDUwXTtcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgQElucHV0KCkgc21hcnRHcmlkPzogU21hcnRHcmlkO1xuICBASW5wdXQoKSB1dWlkPzogc3RyaW5nO1xuICBASW5wdXQoKSBkZXY6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyB0YWJsZVxuICBAVmlld0NoaWxkKCd0YWJsZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSB2Y1JlZlRhYmxlPzogVmlld0NvbnRhaW5lclJlZjtcbiAgY29tcG9uZW50UmVmVGFibGU/OiBDb21wb25lbnRSZWY8U21hcnR0YWJsZUNvbXBvbmVudD47XG4gIHNtYXJ0VGFibGUhOiBTbWFydFRhYmxlPEdyaWRSb3c+O1xuXG4gIC8vIHRvb2xiYXJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicpIHRvb2xiYXI/OiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2hlYWRlclRvb2xiYXInKSBfaGVhZGVyVG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcbiAgZGVmYXVsdEFjdGlvblRvb2xiYXJJZDogc3RyaW5nID0gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLmRlZmF1bHRBY3Rpb25Ub29sYmFySWQ7XG5cbiAgLy8gZXhwYW5kYWJsZVxuICBAVmlld0NoaWxkcmVuKEV4cGFuZGVkUm93UmVuZGVyZXJDb21wb25lbnQpXG4gIGV4cGFuZGVkUm93c0NvbXBzITogUXVlcnlMaXN0PEV4cGFuZGVkUm93UmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIGV4cGFuZGFibGVTZWN0aW9ucz86IEV4cGFuZGFibGVTZWN0aW9uPGFueT5bXTtcbiAgZXhwYW5kZWRSb3dzID0ge307XG5cbiAgLy8gZ3JpZERhdGFcbiAgcGFnZUV2ZW50PzogUGFnZUV2ZW50O1xuICBkYXRhc291cmNlPzogbnVsbDtcbiAgcGFnZVNpemU/OiBudW1iZXI7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgcGFnZUluZGV4PzogbnVtYmVyO1xuICB2YWx1ZXM6IGFueTtcbiAgZ3JpZFRhYmxlITogU21hcnRUYWJsZTxhbnk+O1xuICBpc011bHRpcGxlPzogYm9vbGVhbjtcbiAgc2VsZWN0ZWRSb3dzOiBHcmlkUm93W10gPSBbXTtcbiAgdGFibGVUeXBlPzogYW55O1xuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gdGhpcy5kZWZhdWx0UGFnZVNpemVPcHRpb25zO1xuICBjb2x1bW5NZXRhQnlOYW1lPzogTWFwPHN0cmluZywgR3JpZENvbHVtbk1ldGE+O1xuXG4gIHNlbGVjdGlvbkNoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgdWlBY3Rpb25EZXNjcmlwdG9yczogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPiA9IG5ldyBNYXAoKTtcbiAgY2VsbFRvQWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBVaUFjdGlvbk1vZGVsW10+ID0ge307XG5cbiAgYWZ0ZXJWaWV3SW5pdEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQmxvY2tlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gdHJlZVxuICB0cmVlQ29udHJvbD86IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93PjtcbiAgdHJlZUZsYXR0ZW5lcj86IE1hdFRyZWVGbGF0dGVuZXI8R3JpZFJvdywgR3JpZFJvdz47XG4gIHRyZWVEYXRhU291cmNlPzogTWF0VHJlZUZsYXREYXRhU291cmNlPEdyaWRSb3csIEdyaWRSb3c+O1xuICB0cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPzogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2ZTZXJ2aWNlOiBDb21wb25lbnRGYWN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgdWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZTogVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHNtYXJ0RGF0ZVBpcGU6IFNtYXJ0RGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSBzbWFydERhdGVUaW1lUGlwZTogU21hcnREYXRlVGltZVBpcGUsXG4gICAgcHJpdmF0ZSBzbWFydFRpbWVQaXBlOiBTbWFydFRpbWVQaXBlLFxuICAgIEBJbmplY3QoQ09NUE9ORU5UX0xJQlJBUlkpIHB1YmxpYyBjb21wTGliOiBDb21wb25lbnRMaWJyYXJ5LFxuICAgIEBJbmplY3QoJ2dyaWRNZW51SWNvbicpIHByaXZhdGUgZ3JpZE1lbnVJY29uPzogc3RyaW5nXG4gICkge1xuICAgIHRoaXMuc2VydmljZS5ncmlkTW9kZWxDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBjYWxsZWQgYWZ0ZXIgZXZlcnkgc2VydmljZSBjYWxsIChsb2FkLCBzYXZlLCByZWZyZXNoLCBldGMuKVxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbCA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWw7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAvL1JlZnJlc2ggZXhwYW5kZWQgc2VjdGlvbnMgZGF0YVxuICAgICAgaWYgKHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dzQ29tcHMuZm9yRWFjaCgocm93Q29tcCkgPT4gcm93Q29tcC5yZWZyZXNoUm93RGF0YSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc21hcnRHcmlkJ10pIHtcbiAgICAgIHRoaXMuc21hcnRHcmlkID0gY2hhbmdlc1snc21hcnRHcmlkJ10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5zZXJ2aWNlLnBhZ2luYXRvciA9IHRoaXMuc21hcnRHcmlkPy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLnNldHVwVG9vbGJhcigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndXVpZCddKSB7XG4gICAgICBpZiAoY2hhbmdlc1sndXVpZCddICYmIHRoaXMudXVpZCA9PT0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkUm93cyA9IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy51dWlkID0gY2hhbmdlc1sndXVpZCddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWZ0ZXJWaWV3SW5pdEV4ZWN1dGVkICYmIHRoaXMudXVpZCAmJiB0aGlzLnNtYXJ0R3JpZCkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnNtYXJ0R3JpZCkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICAgIHRoaXMuYWZ0ZXJWaWV3SW5pdEV4ZWN1dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgc2VsZWN0ZWQgcm93cyBvZiB0aGUgdGFibGVcbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3MoKTogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4ge1xuICAgIGlmICghdGhpcy5zbWFydFRhYmxlLnNlbGVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgcmV0dXJuIHRoaXMuc21hcnRUYWJsZSEuc2VsZWN0aW9uITtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBnZW5lcmljIEdyaWRBUEkgYW5kIHJlZnJlc2hlcyB0aGUgcHJlc2VudGVkXG4gICAqIGdyaWQgd2l0aCB0aGUgbmV3ZXN0IG9uZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XG4gICAgLy8gd2lsbCBjYXVzZSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsQ2hhbmdlZCB0byBmaXJlXG4gICAgaWYgKHRoaXMudXVpZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlLmxvYWQodGhpcy51dWlkLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0eWxlKHJvdzogYW55KTogc3RyaW5nW10ge1xuICAgIGlmIChyb3cgJiYgcm93LnN0eWxlKSB7XG4gICAgICBsZXQgc3R5bGUgPSByb3cuc3R5bGU7XG4gICAgICBsZXQgY2xhc3Nlc1RvQWRkOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAgIGlmIChzdHlsZS5jbGFzc2VzVG9BZGQpIHtcbiAgICAgICAgc3R5bGUuY2xhc3Nlc1RvQWRkLmZvckVhY2goKGNsOiBzdHJpbmcpID0+IGNsYXNzZXNUb0FkZC5wdXNoKGNsKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3R5bGUuY2xhc3Nlc1RvUmVtb3ZlKSB7XG4gICAgICAgIHJldHVybiBjbGFzc2VzVG9BZGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1RvQWRkLmZpbHRlcigoY2xzKSA9PiAhc3R5bGUuY2xhc3Nlc1RvUmVtb3ZlLmluY2x1ZGVzKGNscykpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwdWJsaWMgc2V0dXBUb29sYmFyKCkge1xuICAgIC8vIGNoZWNrIGlmIHRvb2xiYXIgaXMgYXZhaWxhYmxlIF9hbmRfIG5lZWQgc2V0IHVwXG4gICAgaWYgKHRoaXMudG9vbGJhciAmJiB0aGlzLnNtYXJ0R3JpZCkge1xuICAgICAgbGV0IHRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfdG9vbGJhcic7XG4gICAgICBpZiAodG9vbGJhcklkICE9PSB0aGlzLnRvb2xiYXIuaWQpIHtcbiAgICAgICAgdGhpcy50b29sYmFyLmlkID0gdG9vbGJhcklkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9oZWFkZXJUb29sYmFyICYmIHRoaXMuc21hcnRHcmlkKSB7XG4gICAgICBsZXQgaGVhZGVyVG9vbGJhcklkID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRJZGVudGlmaWVyICsgJ19oZWFkZXJUb29sYmFyJztcbiAgICAgIGlmIChoZWFkZXJUb29sYmFySWQgIT09IHRoaXMuX2hlYWRlclRvb2xiYXIuaWQpIHtcbiAgICAgICAgdGhpcy5faGVhZGVyVG9vbGJhci5pZCA9IGhlYWRlclRvb2xiYXJJZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaGVhZGVyVG9vbGJhcigpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xuICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlclRvb2xiYXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZlRhYmxlPy5pbnN0YW5jZS5jb21wb25lbnRSZWZUYWJsZT8uaW5zdGFuY2UuaGVhZGVyVG9vbGJhcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBncmlkTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsO1xuICAgIGlmIChncmlkTW9kZWwpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gZ3JpZE1vZGVsLnRvdGFsUm93Q291bnQ7XG4gICAgICB0aGlzLnBhZ2VTaXplID0gZ3JpZE1vZGVsLnBhZ2VTaXplO1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSBncmlkTW9kZWwucGFnZUluZGV4ID8/IDA7XG4gICAgICBpZiAoZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucyAmJiBncmlkTW9kZWwucGFnZVNpemVPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSBncmlkTW9kZWwucGFnZVNpemVPcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLmRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM7XG4gICAgICB9XG4gICAgICBpZiAoZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnNob3dFZGl0Q29sdW1ucyA9IGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucykge1xuICAgICAgICB0aGlzLmNvbHVtbk1ldGFCeU5hbWUgPSBuZXcgTWFwKFxuICAgICAgICAgIGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbCkgPT4gW2NvbC5wcm9wZXJ0eU5hbWUsIGNvbF0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbk1ldGFCeU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCBraW5kID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5raW5kO1xuICAgICAgaWYgKGtpbmQpIHtcbiAgICAgICAgbGV0IGxheW91dERlZjtcbiAgICAgICAgaWYgKGtpbmQgPT09IEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLlRBQkxFKSB7XG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0uVFJFRSkge1xuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRSRUU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0uQ0FSRFMpIHtcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5DQVJEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXlvdXREZWYpIHtcbiAgICAgICAgICB0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID0gbGF5b3V0RGVmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ3JpZE1vZGVsPy5wYWdpbmF0b3IgPT09IHRydWUgfHwgZ3JpZE1vZGVsPy5wYWdpbmF0b3IgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5wYWdpbmF0b3IgPSBncmlkTW9kZWwucGFnaW5hdG9yO1xuICAgICAgICB0aGlzLnNlcnZpY2UucGFnaW5hdG9yID0gdGhpcy5zbWFydEdyaWQhLnBhZ2luYXRvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignR3JpZE1vZGVsIGlzIHVuZGVmaW5lZCBpbiBjb21wb25lbnQhJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmxheW91dERlZikge1xuICAgICAgLy8gZmFsbGJhY2ssIGRlZmF1bHQgVEFCTEVcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UQUJMRTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XG4gICAgICB0aGlzLnJlbmRlclRhYmxlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5FWFBBTkRBQkxFKSB7XG4gICAgICB0aGlzLnJlbmRlckV4cGFuZGFibGVTZWN0aW9ucygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuQ0FSRCkge1xuICAgICAgdGhpcy5yZW5kZXJDYXJkcygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVFJFRSkge1xuICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgfVxuICAgIHRoaXMuaXNCbG9ja2VkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVGFibGUoKSB7XG4gICAgdGhpcy52Y1JlZlRhYmxlPy5jbGVhcigpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmRlclRhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xlYXJUcmVlKCk7XG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlU2l6ZSEgKiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VJbmRleCE7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzLm1hcCgob3JkZXJlZENvbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHRhYmxlUm93ID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbCEucGFnZS5yb3dzIS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgdGhpcy5jcmVhdGVDZWxsVG9BY3Rpb25NYXAoKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG4gICAgaWYgKCF0YWJsZVJvdy5sZW5ndGgpIHtcbiAgICAgIGxldCBwbGFjZUhvbGRlclJvdzogYW55ID0ge307XG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChtZXRhOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xuICAgICAgICBwbGFjZUhvbGRlclJvd1ttZXRhLnByb3BlcnR5TmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzID0gW3BsYWNlSG9sZGVyUm93XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnPy50YWJsZVR5cGUpIHtcbiAgICAgIHRoaXMudGFibGVUeXBlID0gdGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnLnRhYmxlVHlwZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VydmljZS5ncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMudGFibGVUeXBlID1cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LmRlc2NyaXB0b3Iuc2VsZWN0aW9uVHlwZSA9PT0gR3JpZFNlbGVjdGlvblR5cGUuQ0hFQ0tCT1hcbiAgICAgICAgICA/IFNtYXJ0VGFibGVUeXBlLkNIRUNLX0JPWFxuICAgICAgICAgIDogU21hcnRUYWJsZVR5cGUuUk9XX1NFTEVDVDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZVR5cGUgPSBTbWFydFRhYmxlVHlwZS5JTkhFUklURUQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UQUJMRSkge1xuICAgICAgbGV0IHRhYmxlQ29uZmlnOiBTbWFydFRhYmxlSW50ZXJmYWNlPEdyaWRSb3c+ID0ge1xuICAgICAgICAuLi50aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWcsXG4gICAgICAgIHRpdGxlOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnRpdGxlLFxuICAgICAgICB0YWJsZVJvd3M6IHRhYmxlUm93LFxuICAgICAgICB0YWJsZVR5cGU6IHRoaXMudGFibGVUeXBlLFxuICAgICAgICBjdXN0b21TbWFydFRhYmxlSGVhZGVyczogYXdhaXQgdGhpcy5jb25zdHJ1Y3RIZWFkZXIoKSEsXG4gICAgICAgIGV4cGFuZGFibGU6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlLFxuICAgICAgICBhc3luY09uRXhwYW5kOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSxcbiAgICAgICAgZXhwYW5kZWRDb21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRlZENvbXBvbmVudCxcbiAgICAgICAgdHlwZTogU21hcnRUYWJsZUludGVyZmFjZVR5cGVFbnVtLk5PUk1BTCxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHRBY3Rpb25Db2RlczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucyEsXG4gICAgICAgIGRlZmF1bHRBY3Rpb25zOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zPy5tYXAoKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOlxuICAgICAgICAgICAgICBjb2RlID09PSAnX2FjdGlvblNlcGFyYXRvcl8nXG4gICAgICAgICAgICAgICAgPyBTbWFydFRhYmxlQnV0dG9uVHlwZS5TRVBBUkFUT1JcbiAgICAgICAgICAgICAgICA6IFNtYXJ0VGFibGVCdXR0b25UeXBlLk5PUk1BTCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmV4ZWN1dGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgICAvLyBsYWJlbDogdGhpcy5idXR0b25UcmFuc2xhdG9yKHsgY29kZTogY29kZSB9KSxcbiAgICAgICAgICAgIHRyYW5zbGF0b3I6IHRoaXMuYnV0dG9uVHJhbnNsYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgLy8gYXJnczogW1xuICAgICAgICAgICAgLy8gICB7XG4gICAgICAgICAgICAvLyAgICAgY29kZTogY29kZSxcbiAgICAgICAgICAgIC8vICAgfSxcbiAgICAgICAgICAgIC8vIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0UHJvcGVydHkgJiZcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5oaWdobGlnaHRDbGFzc1xuICAgICAgKSB7XG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodENsYXNzID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRDbGFzcztcbiAgICAgICAgdGFibGVDb25maWcuaGlnaGxpZ2h0UHJvcGVydHkgPSB0aGlzLnNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldy5kZXNjcmlwdG9yLmhpZ2hsaWdodFByb3BlcnR5O1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UgJiZcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgJiZcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnNlcnZpY2VUb1VzZSAmJlxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlXG4gICAgICApIHtcbiAgICAgICAgdGFibGVDb25maWcub25TZWxlY3Rpb24gPSB0aGlzLm9uU2VsZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRhYmxlQ29uZmlnLm9uQWxsU2VsZWN0aW9uID0gdGhpcy5vblNlbGVjdEFsbC5iaW5kKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlZCBmb3Igc2ltcGxlIGNsaWNrc1xuICAgICAgLy8gaWYgKCF0YWJsZUNvbmZpZy5vblJvd0NsaWNrKSB7XG4gICAgICAvLyAgIHRhYmxlQ29uZmlnLm9uUm93Q2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgIC8vIH1cblxuICAgICAgaWYgKCF0YWJsZUNvbmZpZy5vblJvd0RvdWJsZUNsaWNrKSB7XG4gICAgICAgIHRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2sgPSB0aGlzLm9uRG91YmxlQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0YWJsZUNvbmZpZy5pc1Jvd0Rpc2FibGVkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHRhYmxlQ29uZmlnLnNlbGVjdGFibGVQcm9wZXJ0eU5hbWUgPSAnc2VsZWN0YWJsZSc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YWJsZUNvbmZpZy5hc3luY09uRXhwYW5kKSB7XG4gICAgICAgIHRhYmxlQ29uZmlnLnJvd0V4cGFuZGVyID0gdGhpcztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VydmljZSEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvbk1vZGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRhYmxlQ29uZmlnLnNlbGVjdGlvbiAmJlxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgJiZcbiAgICAgICAgc2VsZWN0aW9uTW9kZSAhPT0gR3JpZFNlbGVjdGlvbk1vZGUuTk9ORVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZSA9IHNlbGVjdGlvbk1vZGUgPT09IEdyaWRTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xuXG4gICAgICAgIHRhYmxlQ29uZmlnLnNlbGVjdGlvblByb3BlcnR5ID0gJ2lkJztcbiAgICAgICAgbGV0IHNlbGVjdGVkSWRzO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzIS5maWx0ZXIoXG4gICAgICAgICAgKGdyaWRSb3c6IEdyaWRSb3cpID0+IGdyaWRSb3cuc2VsZWN0ZWRcbiAgICAgICAgKTtcblxuICAgICAgICBzZWxlY3RlZElkcyA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcCgoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5pZCEpO1xuICAgICAgICB0YWJsZUNvbmZpZy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0aGlzLmlzTXVsdGlwbGUsIHNlbGVjdGVkSWRzKTtcbiAgICAgICAgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgPVxuICAgICAgICAgIHR5cGVvZiB0YWJsZUNvbmZpZy5zaG93Q2hlY2tib3hJbkhlYWRlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgLy8ga2VlcCBpZiBzZXRcbiAgICAgICAgICAgIDogdGhpcy5pc011bHRpcGxlOyAvL2lmIHVuc2V0LCB0dXJuIGl0IG9uIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAgICAgIH1cblxuICAgICAgdGhpcy5zbWFydFRhYmxlID0gbmV3IFNtYXJ0VGFibGU8YW55PihcbiAgICAgICAgdGFibGVDb25maWcsXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LnNlcnZpY2VUb1VzZVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmVGFibGUpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS51cGRhdGVTbWFydFRhYmxlKHRoaXMuc21hcnRUYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZjUmVmVGFibGU/LmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZjUmVmVGFibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZUYWJsZSA9IHRoaXMuY2ZTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgICB0aGlzLnZjUmVmVGFibGUhLFxuICAgICAgICAgIFNtYXJ0dGFibGVDb21wb25lbnQsXG4gICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIGFueT4oW1snc21hcnRUYWJsZScsIHRoaXMuc21hcnRUYWJsZV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNvcnRFdmVudFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLl9kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICAgICAgICBoZWFkZXIucHJvcGVydHlOYW1lID0gaGVhZGVyLnByb3BlcnR5TmFtZS5zdWJzdHJpbmcoNSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoaGVhZGVyLm9yZGVyKSB7XG4gICAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IFNtYXJ0VGFibGVPcmRlci5BU0M7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgU21hcnRUYWJsZU9yZGVyLkFTQzpcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSBTbWFydFRhYmxlT3JkZXIuREVTQztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBTbWFydFRhYmxlT3JkZXIuREVTQzpcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmaWx0ZXIgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmQoXG4gICAgICAgICAgICAgIChmaWx0ZXJFeHByZXNzaW9uOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT5cbiAgICAgICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gaGVhZGVyLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgJiYgIWhlYWRlci5vcmRlcikge1xuICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0LmluZGV4T2YoZmlsdGVyKTtcbiAgICAgICAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5vcmRlckJ5TGlzdC5zcGxpY2UoaW5kZXghLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgIGZpbHRlci5vcmRlciA9IGhlYWRlci5vcmRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgb3JkZXI6IGhlYWRlci5vcmRlcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGhlYWRlci5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xuICAgICAgICAgICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcbiAgICAgICAgICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyZWRDb2x1bW5OYW1lcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIGdyaWRVcGRhdGVEYXRhKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNtYXJ0VGFibGUuc2VsZWN0aW9uPy5jaGFuZ2VkXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2UuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChyb3c6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLm5leHQocm93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXhwYW5kKHJvd0lkOiBudW1iZXIpOiBhbnkge31cblxuICBwdWJsaWMgYXN5bmMgZXhwYW5kQXN5bmMocm93SW5kZXg6IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzKSB7XG4gICAgICBsZXQgcm93ID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3Nbcm93SW5kZXhdO1xuICAgICAgaWYgKHJvdyAmJiByb3cuaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leHBhbmQodGhpcy5zbWFydEdyaWQhLCByb3cuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cGFuZCh0aGlzLnNtYXJ0R3JpZCEsIHJvd0luZGV4LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFeHBhbmRhYmxlU2VjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRhYmxlU2VjdGlvbnMgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsIS5wYWdlLnJvd3MhLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogJycsXG4gICAgICAgIGhlYWRlckNvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmhlYWRlckNvbXBvbmVudCxcbiAgICAgICAgaGVhZGVySW5wdXROYW1lOiB0aGlzLnNtYXJ0R3JpZCEuaGVhZGVyQ29tcG9uZW50SW5wdXROYW1lLFxuICAgICAgICBoZWFkZXJEYXRhOiBpdGVtLFxuICAgICAgICBjdXN0b21Db21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlQ29tcG9uZW50LFxuICAgICAgICBpbnB1dE5hbWU6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlQ29tcG9uZW50SW5wdXROYW1lLFxuICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2FyZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlU2l6ZSEgKiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VJbmRleCE7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzLm1hcCgob3JkZXJlZENvbDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmN1c3RvbUNvbXBvbmVudCkge1xuICAgICAgbGV0IGRhdGFsYXlvdXREZWYgPSB7XG4gICAgICAgIGRhdGFMYXlvdXQ6IFNtYXJ0R3JpZERhdGFMYXlvdXQuQ09MVU1OLFxuICAgICAgICBncmlkTGF5b3V0OiBTbWFydEdyaWREYXRhTGF5b3V0LkNPTFVNTixcbiAgICAgICAgdHlwZTogU21hcnRHcmlkVHlwZS5DVVNUT00sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZGF0YUxheW91dERlZiA9IGRhdGFsYXlvdXREZWY7XG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuY3VzdG9tQ29tcG9uZW50ID0gdGhpcy5pbmplY3Rvci5nZXQodGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyICsgJ0NhcmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzTXVsdGlwbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VydmljZSEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNlbGVjdGlvbk1vZGU7XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGUgPT09IEdyaWRTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclRyZWUoKSB7XG4gICAgdGhpcy50cmVlQ29udHJvbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudHJlZUZsYXR0ZW5lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRyZWUoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclRhYmxlKCk7XG4gICAgaWYgKCF0aGlzLnRyZWVEYXRhU291cmNlKSB7XG4gICAgICB0aGlzLnRyZWVGbGF0dGVuZXIgPSBuZXcgTWF0VHJlZUZsYXR0ZW5lcihcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1lcixcbiAgICAgICAgdGhpcy5nZXRMZXZlbCxcbiAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUsXG4gICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5cbiAgICAgICk7XG4gICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93Pih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XG4gICAgICB0aGlzLnRyZWVEYXRhU291cmNlID0gbmV3IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSh0aGlzLnRyZWVDb250cm9sLCB0aGlzLnRyZWVGbGF0dGVuZXIpO1xuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPEdyaWRSb3c+KHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKTtcbiAgICB9XG4gICAgbGV0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbD8uZGF0YU5vZGVzO1xuICAgIGxldCBleHBhbmRlZE5vZGVzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdO1xuICAgIGlmIChub2Rlcykge1xuICAgICAgZXhwYW5kZWROb2RlcyA9IG5vZGVzXG4gICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IHRoaXMudHJlZUNvbnRyb2w/LmlzRXhwYW5kYWJsZShub2RlKSlcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRlZChub2RlKSlcbiAgICAgICAgLm1hcCgobm9kZSkgPT4gbm9kZS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkTm9kZXMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZvckVhY2goKHJvdzogYW55KSA9PiAocm93LmxldmVsID0gdW5kZWZpbmVkKSk7XG4gICAgdGhpcy50cmVlRGF0YVNvdXJjZS5kYXRhID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZpbHRlcigocm93KSA9PiAhcm93LnBhcmVudCk7XG4gICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPy5jbGVhcigpO1xuICAgIHRoaXMudHJlZUNvbnRyb2w/LmRhdGFOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAobm9kZS5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LnNlbGVjdChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRyZWVDb250cm9sPy5jb2xsYXBzZUFsbCgpO1xuICAgIGV4cGFuZGVkTm9kZXMuZm9yRWFjaCgocm93SWQpID0+IHtcbiAgICAgIGxldCByb3cgPSB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXMuZmluZCgocm93KSA9PiByb3dJZCA9PT0gcm93LmlkKTtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbD8uZXhwYW5kKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMZXZlbCA9IChub2RlOiBhbnkpID0+IG5vZGUubGV2ZWwgPz8gMDtcblxuICBpc0V4cGFuZGFibGUgPSAobm9kZTogR3JpZFJvdykgPT4gKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlKTtcblxuICBnZXRDaGlsZHJlbiA9IChub2RlOiBHcmlkUm93KTogR3JpZFJvd1tdID0+IHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgbGV0IHJvd3MgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmlsdGVyKChyb3cpID0+XG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LnNvbWUoKGNoaWxkKSA9PiBjaGlsZCA9PT0gcm93LmlkISlcbiAgICAgICk7XG4gICAgICBpZiAocm93cykge1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIGhhc0NoaWxkID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBHcmlkUm93KSA9PiB0aGlzLmlzRXhwYW5kYWJsZShfbm9kZURhdGEpO1xuXG4gIHRyYW5zZm9ybWVyID0gKHJvdzogR3JpZFJvdywgbGV2ZWw6IG51bWJlcikgPT4ge1xuICAgIChyb3cgYXMgYW55KS5sZXZlbCA9IGxldmVsO1xuICAgIHJldHVybiByb3c7XG4gIH07XG5cbiAgZ2V0VHJlZUl0ZW0ocm93OiBHcmlkUm93KTogc3RyaW5nIHtcbiAgICBsZXQgY29sdW1uczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcztcbiAgICBsZXQgZGF0YTogYW55ID0gcm93LmRhdGEhO1xuICAgIGlmIChjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2wpID0+IGRhdGFbY29sXSkuam9pbignICcpO1xuICAgIH1cbiAgICByZXR1cm4gcm93LmlkITtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIHRyZWVOb2RlIHNlbGVjdGlvbi4gU2VsZWN0L2Rlc2VsZWN0IGFsbCB0aGUgZGVzY2VuZGFudHMgbm9kZSAqL1xuICB0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlOiBHcmlkUm93KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlbGVjdGlvbkJlZm9yZSA9IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5tYXAoKHJvdykgPT4gcm93LmlkKTtcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKG5vZGUpO1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSkge1xuICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sIS5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXG4gICAgICAgID8gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcbiAgICAgICAgOiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoLi4uZGVzY2VuZGFudHMpO1xuICAgICAgdGhpcy5jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZSk7XG4gICAgfVxuICAgIGxldCBzZWxlY3Rpb25BZnRlciA9IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5tYXAoKHJvdykgPT4gcm93LmlkKTtcblxuICAgIGxldCBzZWxlY3RlZElkcyA9IHNlbGVjdGlvbkFmdGVyLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkJlZm9yZS5pbmNsdWRlcyhzKSk7XG4gICAgbGV0IHVuc2VsZWN0ZWRJZHMgPSBzZWxlY3Rpb25CZWZvcmUuZmlsdGVyKChzKSA9PiAhc2VsZWN0aW9uQWZ0ZXIuaW5jbHVkZXMocykpO1xuICAgIHRoaXMub25TZWxlY3RSb3dzKHNlbGVjdGVkSWRzLCB1bnNlbGVjdGVkSWRzKTtcbiAgfVxuXG4gIGNoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlOiBHcmlkUm93KTogdm9pZCB7XG4gICAgbGV0IHBhcmVudDogR3JpZFJvdyB8IG51bGwgPSB0aGlzLmdldFBhcmVudE5vZGUobm9kZSk7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgdGhpcy5jaGVja1BhcmVudE5vZGVTZWxlY3Rpb24ocGFyZW50KTtcbiAgICAgIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrUGFyZW50Tm9kZVNlbGVjdGlvbihub2RlOiBHcmlkUm93KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZVNlbGVjdGVkID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk7XG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID0gdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xuICAgIGlmIChub2RlU2VsZWN0ZWQgJiYgIWRlc2NBbGxTZWxlY3RlZCkge1xuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KG5vZGUpO1xuICAgIH0gZWxzZSBpZiAoIW5vZGVTZWxlY3RlZCAmJiBkZXNjQWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyogR2V0IHRoZSBwYXJlbnQgbm9kZSBvZiBhIG5vZGUgKi9cbiAgZ2V0UGFyZW50Tm9kZShub2RlOiBHcmlkUm93KTogR3JpZFJvdyB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGV2ZWwobm9kZSk7XG5cbiAgICBpZiAoY3VycmVudExldmVsIDwgMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMudHJlZUNvbnRyb2whLmRhdGFOb2Rlcy5pbmRleE9mKG5vZGUpIC0gMTtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLnRyZWVDb250cm9sIS5kYXRhTm9kZXNbaV07XG5cbiAgICAgIGlmICh0aGlzLmdldExldmVsKGN1cnJlbnROb2RlKSA8IGN1cnJlbnRMZXZlbCkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgbm9kZSBhcmUgc2VsZWN0ZWQuICovXG4gIGRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZTogR3JpZFJvdyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCB8fCAhdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICBjb25zdCBkZXNjQWxsU2VsZWN0ZWQgPVxuICAgICAgZGVzY2VuZGFudHMubGVuZ3RoID4gMCAmJlxuICAgICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIGRlc2NBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xuICBkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGU6IEdyaWRSb3cpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudHJlZUNvbnRyb2wgfHwgIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XG4gICAgbGV0IHJlc3VsdCA9IGRlc2NlbmRhbnRzLnNvbWUoKGNoaWxkKSA9PiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpKTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25zdHJ1Y3RIZWFkZXIoKTogUHJvbWlzZTxTbWFydFRhYmxlSGVhZGVyW10+IHtcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MgJiYgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MubGVuZ3RoKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MubWFwKGFzeW5jIChncmlkUm93OiBHcmlkUm93KSA9PiB7XG4gICAgICAgICAgbGV0IG5ld1VpQWN0aW9ucyA9IGdyaWRSb3cuYWN0aW9ucz8uZmlsdGVyKFxuICAgICAgICAgICAgKHVpQWN0aW9uOiBhbnkpID0+ICF0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuZ2V0KHVpQWN0aW9uLmNvZGUhKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobmV3VWlBY3Rpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgbmV3VWlBY3Rpb25zLm1hcChhc3luYyAodWlBY3Rpb246IFVpQWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2NyaXB0b3I6IFVpQWN0aW9uRGVzY3JpcHRvciA9XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZT8uZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdWlBY3Rpb24uY29kZSA/PyAnQ09ERScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5OT1JNQUwsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvcnMuc2V0KHVpQWN0aW9uLmNvZGUhLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgb3JlZGVyZWREZXNjQ29sdW1ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLm1hcChcbiAgICAgIChwcm9wZXJ0eU5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5kZXNjcmlwdG9yIS5jb2x1bW5zIS5maW5kKFxuICAgICAgICAgIChjb2xEZXNjcmlwdG9yOiBHcmlkQ29sdW1uTWV0YSkgPT4gY29sRGVzY3JpcHRvci5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZVxuICAgICAgICApXG4gICAgKS5mbGF0TWFwKChmKSA9PiBmID8/IFtdKTtcblxuICAgIGxldCBoZWFkZXIgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG9yZWRlcmVkRGVzY0NvbHVtbnMubWFwKGFzeW5jIChkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSk6IFByb21pc2U8U21hcnRUYWJsZUhlYWRlcj4gPT4ge1xuICAgICAgICBsZXQgY3VzdG9tVGFibGVIZWFkZXIgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWc/LmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzPy5maW5kKFxuICAgICAgICAgIChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IGhlYWRlci5wcm9wZXJ0eU5hbWUgPT09IGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lXG4gICAgICAgICk7XG4gICAgICAgIGxldCBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0gPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Py5maW5kKFxuICAgICAgICAgIChmaWx0ZXJFeHByZXNzaW9uOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT5cbiAgICAgICAgICAgIGZpbHRlckV4cHJlc3Npb24ucHJvcGVydHlOYW1lID09PSBkZXNjQ29sdW1uIS5wcm9wZXJ0eU5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IG9yZGVyO1xuICAgICAgICBsZXQgb3JkZXJOdW1iZXI7XG4gICAgICAgIGlmIChmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0pIHtcbiAgICAgICAgICBvcmRlciA9XG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0ub3JkZXIgPT09IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5Lk9yZGVyRW51bS5Bc2NcbiAgICAgICAgICAgICAgPyBTbWFydFRhYmxlT3JkZXIuQVNDXG4gICAgICAgICAgICAgIDogU21hcnRUYWJsZU9yZGVyLkRFU0M7XG4gICAgICAgICAgaWYgKHRoaXMuc2VydmljZS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgb3JkZXJOdW1iZXIgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgICAgKGZpbHRlcjogRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkpID0+IGZpbHRlci5wcm9wZXJ0eU5hbWUgPT09IGRlc2NDb2x1bW4hLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWduYWxMYWJlbCA9IGN1c3RvbVRhYmxlSGVhZGVyPy5sYWJlbCA/PyBkZXNjQ29sdW1uLmxhYmVsO1xuICAgICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgICAgaWYgKCFkZXNjQ29sdW1uLmhpZGVMYWJlbCkge1xuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZSkge1xuICAgICAgICAgICAgbGFiZWwgPSBhd2FpdCB0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZT8uZ2V0KG9yaWduYWxMYWJlbCkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsID0gb3JpZ25hbExhYmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0gY3VzdG9tVGFibGVIZWFkZXI/LnByb3BlcnRpZXM7XG4gICAgICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY3VzdG9tVGFibGVIZWFkZXIsXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGEuJyArIGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lLFxuICAgICAgICAgIG9yZGVyLFxuICAgICAgICAgIG9yZGVyTnVtYmVyLFxuICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgc3R5bGU6IGRlc2NDb2x1bW4uc3R5bGUsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBsZXQgY29tcGxlbWVudCA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbHRlcihcbiAgICAgICh0YWJsZUhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT5cbiAgICAgICAgIWhlYWRlci5zb21lKCh0SDogU21hcnRUYWJsZUhlYWRlcikgPT4gdEgucHJvcGVydHlOYW1lLmluY2x1ZGVzKHRhYmxlSGVhZGVyLnByb3BlcnR5TmFtZSkpXG4gICAgKTtcblxuICAgIGlmIChjb21wbGVtZW50KSB7XG4gICAgICBoZWFkZXIucHVzaCguLi5jb21wbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnNpbXBsZUJ1dHRvbnMpIHtcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5vcHRpb25zLnNpbXBsZUJ1dHRvbnMuZm9yRWFjaCgodWlBY3Rpb25Db2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaGVhZGVyLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6ICdzaW1wbGVfYnV0dG9ucycsXG4gICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBTbWFydFRhYmxlQnV0dG9uVHlwZS5SQUlTRUQsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmV4ZWN1dGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgLy8gbGFiZWw6IHRoaXMuYnV0dG9uVHJhbnNsYXRvcih7IGNvZGU6IHVpQWN0aW9uQ29kZSB9KSxcbiAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6IHVpQWN0aW9uQ29kZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICBzaG93QnV0dG9uSWY6IChyb3c6IGFueSkgPT5cbiAgICAgICAgICAgICAgICByb3cuYWN0aW9ucy5zb21lKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvZGUgPT09IHVpQWN0aW9uQ29kZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWhlYWRlci5zb21lKChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IGhlYWRlci5wcm9wZXJ0eU5hbWUgPT09ICdteV9tZW51JykpIHtcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8ucm93VWlBY3Rpb25UeXBlID09PSBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUpIHtcbiAgICAgICAgbGV0IGljb24gPSB0aGlzLmdyaWRNZW51SWNvbiA/PyAnbW9yZV92ZXJ0JztcbiAgICAgICAgaGVhZGVyLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6ICdteV9tZW51JyxcbiAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVCdXR0b25UeXBlLk1FTlUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmV4ZWN1dGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgaWNvbjogaWNvbixcbiAgICAgICAgICAgICAgbWVudUl0ZW1CdXR0b25zUHJvcGVydHlOYW1lOiAnYWN0aW9ucycsXG4gICAgICAgICAgICAgIHRyYW5zbGF0b3I6IHRoaXMuYnV0dG9uVHJhbnNsYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U21hcnRUYWJsZVByb3BlcnR5KGRlc2NDb2x1bW46IEdyaWRDb2x1bW5NZXRhKSB7XG4gICAgaWYgKFxuICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuT2Zmc2V0RGF0ZVRpbWUnIHx8XG4gICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbERhdGVUaW1lJ1xuICAgICkge1xuICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQgSDptbSc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxuICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcbiAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICd5eXl5Lk1NLmRkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcbiAgICAgICAgZGF0ZUZvcm1hdCxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XG4gICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAnSDptbSc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXG4gICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuQ0hFQ0tCT1gsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VQYWdlKGV2ZW50OiBQYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgb2Zmc2V0ID0gZXZlbnQucGFnZVNpemUgKiBldmVudC5wYWdlSW5kZXg7XG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucGFnZVNpemU7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnNldFBhZ2UoXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISxcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcbiAgICAgIG9mZnNldC50b1N0cmluZygpLFxuICAgICAgbGltaXQudG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgb25QcmltZUNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBvZmZzZXQgPSBldmVudC5maXJzdDtcbiAgICBsZXQgbGltaXQgPSBldmVudC5yb3dzO1xuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQuZmlyc3Q7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnNldFBhZ2UoXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISxcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcbiAgICAgIG9mZnNldC50b1N0cmluZygpLFxuICAgICAgbGltaXQudG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoUGFydGlhbFJlc3VsdHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnJlZnJlc2godGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGUoYXJnczogYW55W10sIHJvdzogYW55LCB1aUFjdGlvbjogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IF91aUFjdGlvbjogVWlBY3Rpb247XG5cbiAgICBpZiAoIXVpQWN0aW9uKSB7XG4gICAgICB1aUFjdGlvbiA9IHJvdy5hY3Rpb25zLmZpbHRlcigoYWN0aW9uOiBVaUFjdGlvbikgPT4gYWN0aW9uLmNvZGUgPT09IGFyZ3NbMF0uY29kZSlbMF07XG4gICAgfVxuXG4gICAgX3VpQWN0aW9uID0geyAuLi51aUFjdGlvbiB9O1xuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcbiAgICAgIC4uLnVpQWN0aW9uLnBhcmFtcyxcbiAgICAgIG1vZGVsOiByb3csXG4gICAgfTtcblxuICAgIGxldCB1aUFjdGlvbk1vZGVsOiBhbnkgPSB7XG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXG4gICAgICB1aUFjdGlvbjogX3VpQWN0aW9uLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnVpQWN0aW9uTW9kZWxDYWxsYmFjaykge1xuICAgICAgdWlBY3Rpb25Nb2RlbCA9IHRoaXMuc21hcnRHcmlkIS5vcHRpb25zIS51aUFjdGlvbk1vZGVsQ2FsbGJhY2sodWlBY3Rpb25Nb2RlbCk7XG4gICAgfVxuXG4gICAgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uU2VydmljZS51aUFjdGlvbk1vZGVsID0gdWlBY3Rpb25Nb2RlbDtcbiAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlLmV4ZWN1dGUoX3VpQWN0aW9uLCB7XG4gICAgICB3aWRnZXRJZDogdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxuICAgICAgbm9kZUlkOiByb3cuaWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1dHRvblRyYW5zbGF0b3IodWlBY3Rpb246IFVpQWN0aW9uKTogVWlBY3Rpb25EZXNjcmlwdG9yIHtcbiAgICBsZXQgZGVzYyA9IHRoaXMudWlBY3Rpb25EZXNjcmlwdG9ycy5nZXQodWlBY3Rpb24uY29kZSEpO1xuICAgIGlmICghZGVzYykge1xuICAgICAgZGVzYyA9IHtcbiAgICAgICAgdGl0bGU6IHVpQWN0aW9uLmNvZGUhLFxuICAgICAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuRkxBVCxcbiAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1aUFjdGlvbi5kZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UubWVyZ2VBY3Rpb25EZXNjcmlwdG9ySW50b0NsaWVudCh1aUFjdGlvbi5kZXNjcmlwdG9yISwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjO1xuICB9XG5cbiAgcHVibGljIGxheW91dERlZigpOiB0eXBlb2YgU21hcnRMYXlvdXREZWYge1xuICAgIHJldHVybiBTbWFydExheW91dERlZjtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrKGdyaWRSb3c6IEdyaWRSb3cpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XG4gIH1cbiAgcHVibGljIG9uRG91YmxlQ2xpY2soZ3JpZFJvdzogR3JpZFJvdyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT25DbGljayhncmlkUm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT25DbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XG4gICAgbGV0IGRlZmF1bHRSb3dBY3Rpb246IFVpQWN0aW9uIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsPy5kZWZhdWx0Um93QWN0aW9ucykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc2VydmljZS5ncmlkTW9kZWwuZGVmYXVsdFJvd0FjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRSb3dBY3Rpb25Db2RlID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9uc1tpbmRleF07XG5cbiAgICAgICAgZGVmYXVsdFJvd0FjdGlvbiA9IGdyaWRSb3cuYWN0aW9ucy5maW5kKFxuICAgICAgICAgICh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHVpQWN0aW9uLmNvZGUgPT09IGRlZmF1bHRSb3dBY3Rpb25Db2RlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWZhdWx0Um93QWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5leGVjdXRlKFtdLCBncmlkUm93LCBkZWZhdWx0Um93QWN0aW9uKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgb25TZWxlY3Qocm93SWQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcbiAgICBjb25zdCByb3cgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmluZCgoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5pZCA9PT0gcm93SWQpO1xuICAgIGNvbnN0IHZpZXdDb250ZXh0Q2hhbmdlID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdCh0aGlzLnNtYXJ0R3JpZCEsIHJvdyEpO1xuICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RBbGwoc2VsZWN0ZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XG5cbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3RBbGwodGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCk7XG4gICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZS5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2Uodmlld0NvbnRleHRDaGFuZ2UpO1xuXG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG9uU2VsZWN0Um93cyhcbiAgICBzZWxlY3RlZElkczogKHN0cmluZyB8IHVuZGVmaW5lZClbXSxcbiAgICB1bnNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcbiAgICBsZXQgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICBsZXQgdW5zZWxlY3RlZDogc3RyaW5nW10gPSB1bnNlbGVjdGVkSWRzLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IGl0ZW0gIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3Qgdmlld0NvbnRleHRDaGFuZ2UgPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2VsZWN0Um93cyh0aGlzLnNtYXJ0R3JpZCEsIHNlbGVjdGVkLCB1bnNlbGVjdGVkKTtcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBhc3luYyBvblJvd1NlbGVjdChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xuICAgIGF3YWl0IHRoaXMub25TZWxlY3QoZXZlbnQuZGF0YS5pZCk7XG4gIH1cblxuICBhc3luYyBvblJvd1Vuc2VsZWN0KGV2ZW50OiBUYWJsZVJvd1VuU2VsZWN0RXZlbnQpIHtcbiAgICBhd2FpdCB0aGlzLm9uU2VsZWN0KGV2ZW50LmRhdGEuaWQpO1xuICB9XG5cbiAgYXN5bmMgb25TZWxlY3RBbGxSb3coZXZlbnQ6IFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCkge1xuICAgIGF3YWl0IHRoaXMub25TZWxlY3RBbGwoZXZlbnQuY2hlY2tlZCk7XG4gIH1cblxuICBlZGl0Q29sdW1ucygpOiB2b2lkIHtcbiAgICBsZXQgZGlhbG9nRGF0YTogU21hcnREaWFsb2dEYXRhID0ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICB0aXRsZTogJ09zemxvcG9rIHRlc3RyZXN6YWLDoXNhJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7fSxcbiAgICAgIGN1c3RvbUNvbXBvbmVudDogVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50LFxuICAgICAgY3VzdG9tQ29tcG9uZW50SW5wdXRzOiB7XG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXG4gICAgICAgICAgdmlldzogdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC52aWV3LFxuICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmRpYWxvZy5vcGVuKFRhYmxlTGF5b3V0RGVmaW5lckNvbXBvbmVudCwgeyBkYXRhOiBkaWFsb2dEYXRhIH0pO1xuICB9XG5cbiAgLy9QUklNRU5HXG4gIGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10gPSBbXTtcbiAgbWVudUJ1dHRvbnMhOiBNZW51SXRlbVtdO1xuICBAVmlld0NoaWxkKCdtZW51JykgbWVudSE6IE1lbnU7XG4gIG9uT3B0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCwgcm93OiBHcmlkUm93KSB7XG4gICAgdGhpcy5tZW51QnV0dG9ucyA9IFtdO1xuXG4gICAgbGV0IG1lbnVBY3Rpb25zID0gdGhpcy5jYWxjdWxhdGVNZW51QWN0aW9ucyhyb3cpO1xuXG4gICAgbWVudUFjdGlvbnM/Lm1hcChhc3luYyAodWlBY3Rpb246IGFueSkgPT4ge1xuICAgICAgbGV0IGRlc2MgPSBhd2FpdCB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UuZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XG5cbiAgICAgIHRoaXMubWVudUJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBkZXNjPy50aXRsZSA/PyB1aUFjdGlvbi5jb2RlLFxuICAgICAgICBpY29uOiBkZXNjPy5pY29uLFxuICAgICAgICBhdXRvbWF0aW9uSWQ6IHVpQWN0aW9uLmNvZGUsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoW10sIHJvdywgdWlBY3Rpb24pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5tZW51LnRvZ2dsZShldmVudCk7XG4gIH1cblxuICBwcmV2aW91c211bHRpU29ydE1ldGE/OiBTb3J0TWV0YVtdO1xuICBhc3luYyBncmlkU29ydChldmVudDogYW55KSB7XG4gICAgbGV0IG9yZGVyQnlMaXN0OiBBcnJheTxGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeT4gPSBbXTtcblxuICAgIGV2ZW50Lm11bHRpc29ydG1ldGE/Lm1hcCgobWV0YTogU29ydE1ldGEsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmICh0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YSAmJiB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhLm1hcCgob3JkZXIpID0+IHtcbiAgICAgICAgICBpZiAobWV0YS5maWVsZCA9PT0gb3JkZXIuZmllbGQgJiYgb3JkZXIub3JkZXIgIT0gbWV0YS5vcmRlcikge1xuICAgICAgICAgICAgc3dpdGNoIChvcmRlci5vcmRlcikge1xuICAgICAgICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgICAgIGV2ZW50Lm11bHRpc29ydG1ldGEhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gZXZlbnQubXVsdGlzb3J0bWV0YTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBldmVudC5tdWx0aXNvcnRtZXRhPy5tYXAoKG1ldGE6IGFueSkgPT4ge1xuICAgICAgb3JkZXJCeUxpc3QucHVzaCh7XG4gICAgICAgIHByb3BlcnR5TmFtZTogbWV0YS5maWVsZCxcbiAgICAgICAgb3JkZXI6XG4gICAgICAgICAgbWV0YS5vcmRlciA9PT0gMVxuICAgICAgICAgICAgPyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5BU0NcbiAgICAgICAgICAgIDogbWV0YS5vcmRlciA9PT0gLTFcbiAgICAgICAgICAgICAgPyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5ERVNDXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc29ydCh0aGlzLnNtYXJ0R3JpZCEsIHtcbiAgICAgIG9yZGVyQnlMaXN0OiBvcmRlckJ5TGlzdCxcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMhLFxuICAgIH0pO1xuICB9XG4gIGxhenlMb2FkKGV2ZW50PzogVGFibGVMYXp5TG9hZEV2ZW50KSB7XG4gICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgPSBbXTtcbiAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Lm1hcCgob3JkZXIpID0+IHtcbiAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhPy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IG9yZGVyLnByb3BlcnR5TmFtZSEsXG4gICAgICAgIG9yZGVyOiBvcmRlci5vcmRlciA9PT0gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDID8gMSA6IC0xLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZXZlbnQhLm11bHRpU29ydE1ldGEgPSB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YTtcbiAgfVxuXG4gIGFzeW5jIGhlYWRlckNoYW5nZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBncmlkVXBkYXRlRGF0YTogR3JpZFVwZGF0ZURhdGEgPSB7XG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQudmFsdWUhKSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XG4gIH1cblxuICBhc3luYyBvbkNvbE9yZGVyKGV2ZW50OiBUYWJsZUNvbHVtblJlb3JkZXJFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBncmlkVXBkYXRlRGF0YTogR3JpZFVwZGF0ZURhdGEgPSB7XG4gICAgICBvcmRlckJ5TGlzdDogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdCxcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQuY29sdW1ucyEpLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XG4gIH1cblxuICBnZXRPcmRlckNvbHVtTmFtZXMoY29sdW1uczogR3JpZENvbHVtbk1ldGFbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xuICAgICAgcmV0dXJuIGNvbHVtLnByb3BlcnR5TmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbFZhbHVlKGNvbDogc3RyaW5nLCByb3c6IGFueSkge1xuICAgIGlmIChyb3cuaWNvbnNbY29sXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXRWYWx1ZSA9ICcnO1xuICAgIGlmIChjb2wuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgbGV0IHBhdGhBcnJheSA9IGNvbC5zcGxpdCgnLicpO1xuICAgICAgbGV0IGNvbFZhbHVlID0gcm93LmRhdGE7XG4gICAgICBwYXRoQXJyYXkubWFwKChwYXRoKSA9PiB7XG4gICAgICAgIGlmIChjb2xWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb2xWYWx1ZSA9IHJvdy5kYXRhW2NvbF07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbFZhbHVlID0gY29sVmFsdWVbcGF0aF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0VmFsdWUgPSBjb2xWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0VmFsdWUgPSByb3cuZGF0YVtjb2xdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbHVtbk1ldGFCeU5hbWUpIHtcbiAgICAgIGxldCBjb2x1bW5NZXRhID0gdGhpcy5jb2x1bW5NZXRhQnlOYW1lIS5nZXQoY29sKTtcbiAgICAgIGlmIChjb2x1bW5NZXRhKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U21hcnRUYWJsZVByb3BlcnR5KGNvbHVtbk1ldGEpO1xuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5Py50eXBlKSB7XG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEU6XG4gICAgICAgICAgICByZXRWYWx1ZSA9IHRoaXMuc21hcnREYXRlUGlwZS50cmFuc2Zvcm0ocmV0VmFsdWUsIHByb3BlcnR5LmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxuICAgICAgICAgICAgcmV0VmFsdWUgPSB0aGlzLnNtYXJ0RGF0ZVRpbWVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuVElNRTpcbiAgICAgICAgICAgIHJldFZhbHVlID0gdGhpcy5zbWFydFRpbWVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0VmFsdWU7XG4gIH1cblxuICBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93OiBhbnksIGhlYWRlcjogc3RyaW5nKTogSW1hZ2VSZXNvdXJjZVtdIHtcbiAgICBpZiAocm93Py5pY29ucykge1xuICAgICAgbGV0IGljb25Db2RlcyA9IHJvdz8uaWNvbnNbaGVhZGVyXTtcbiAgICAgIHJldHVybiBpY29uQ29kZXM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXRJbWFnZVJlc291cmNlU3R5bGUocmVzb3VyY2U6IEltYWdlUmVzb3VyY2UpOiBhbnkge1xuICAgIHJldHVybiByZXNvdXJjZS5zdHlsZSA/IHJlc291cmNlLnN0eWxlIDoge307XG4gIH1cblxuICBnZXRSb3dDb2x1bW5BY3Rpb24ocm93OiBhbnksIGNvbHVtbk5hbWU6IHN0cmluZyk6IFVpQWN0aW9uTW9kZWxbXSB7XG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5nZXRBY3Rpb25Nb2RlbHNGcm9tTWFwKFxuICAgICAgdGhpcy5jZWxsVG9BY3Rpb25NYXAsXG4gICAgICByb3csXG4gICAgICBjb2x1bW5OYW1lXG4gICAgKTtcbiAgfVxuXG4gIHNob3dDZWxsVG9vbGJhcihyb3c6IGFueSwgY29sdW1uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5zaG93VG9vbGJhcihyb3csIGNvbHVtbk5hbWUpO1xuICB9XG5cbiAgc2hvdWxkU2hvd09wdGlvbnNCdXR0b24ocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLnNob3dNZW51KFxuICAgICAgcm93LFxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMhXG4gICAgKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZU1lbnVBY3Rpb25zKHJvdzogR3JpZFJvdyk6IFVpQWN0aW9uW10ge1xuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuY2FsY3VsYXRlTWVudUFjdGlvbnMoXG4gICAgICByb3csXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyFcbiAgICApO1xuICB9XG4gIGNyZWF0ZUNlbGxUb0FjdGlvbk1hcCgpIHtcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORyAmJiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cykge1xuICAgICAgdGhpcy5jZWxsVG9BY3Rpb25NYXAgPSBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuY2FsY3VsYXRlQ2VsbFRvQWN0aW9uTWFwKFxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cyEsXG4gICAgICAgIHRoaXMuc21hcnRHcmlkLnNlcnZpY2VUb1VzZSxcbiAgICAgICAgdGhpcy5zbWFydEdyaWQuZ3JpZElkZW50aWZpZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJvd1RyYWNrQnlGbihpbmRleDogbnVtYmVyLCByb3c6IGFueSkge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH1cbn1cbiIsIkBpZihjb21wTGliID09PSBjb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcblxuPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwicHJpbWVTbWFydEdyaWQtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRvb2xiYXJcIj5cbiAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgI3Rvb2xiYXIgW2lkXT1cIidncmlkX25vdF9pbml0aWFsaXplZCdcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxuICA8L2Rpdj5cbiAgPHAtdGFibGVcbiAgICAqbmdJZj1cIiFzbWFydEdyaWQubGF5b3V0RGVmIHx8IHNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLlRBQkxFXCJcbiAgICAjcFRhYmxlXG4gICAgW3ZhbHVlXT1cInNtYXJ0R3JpZC5ncmlkTW9kZWwucGFnZS5yb3dzIVwiXG4gICAgKG9uU29ydCk9XCJncmlkU29ydCgkZXZlbnQpXCJcbiAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCJcbiAgICBbc29ydE1vZGVdPVwiJ211bHRpcGxlJ1wiXG4gICAgW2xhenldPVwidHJ1ZVwiXG4gICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWQoJGV2ZW50KVwiXG4gICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiXG4gICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgKG9uQ29sUmVvcmRlcik9XCJvbkNvbE9yZGVyKCRldmVudClcIlxuICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcbiAgICAob25Sb3dVbnNlbGVjdCk9XCJvblJvd1Vuc2VsZWN0KCRldmVudClcIlxuICAgIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRSb3dzXCJcbiAgICAob25IZWFkZXJDaGVja2JveFRvZ2dsZSk9XCJvblNlbGVjdEFsbFJvdygkZXZlbnQpXCJcbiAgICBkYXRhS2V5PVwiaWRcIlxuICAgIFtleHBhbmRlZFJvd0tleXNdPVwiZXhwYW5kZWRSb3dzXCJcbiAgICBbcm93RXhwYW5kTW9kZV09XCInbXVsdGlwbGUnXCJcbiAgICBbcm93VHJhY2tCeV09XCJyb3dUcmFja0J5Rm5cIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZUNhcHRpb25cIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGVcIiBjbGFzcz1cImNhcHRpb25UaXRsZVwiPlxuICAgICAgICAgIHt7IHNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiPlxuICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICBkaXNwbGF5PVwiY2hpcFwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnNcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGNvbHVtbnMgc2VsZWN0ZWRcIlxuICAgICAgICAgICAgW3N0eWxlXT1cInsgJ21pbi13aWR0aCc6ICcyMDBweCcgfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNob29zZSBDb2x1bW5zXCJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoZWFkZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgIDx0cj5cbiAgICAgICAgQGlmIChzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1ucykge1xuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxuICAgICAgICA+PC90aD5cbiAgICAgICAgPHRoIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIHBSZW9yZGVyYWJsZUNvbHVtbj5cbiAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLnByb3BlcnR5TmFtZVwiIC8+XG4gICAgICAgICAge3sgY29sLmxhYmVsIH19XG4gICAgICAgIDwvdGg+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxuICAgICAgICA+PC90aD5cbiAgICAgICAgPHRoIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlOYW1lXCIgLz5cbiAgICAgICAgICB7eyBjb2wubGFiZWwgfX1cbiAgICAgICAgPC90aD5cbiAgICAgICAgfVxuXG4gICAgICAgIDx0aD5cbiAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyVG9vbGJhclwiXG4gICAgICAgICAgICAjaGVhZGVyVG9vbGJhclxuICAgICAgICAgICAgW2lkXT1cIidoZWFkZXJfbm90X2luaXRpYWxpemVkJ1wiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0aCAqbmdJZj1cInNtYXJ0R3JpZC5leHBhbmRhYmxlXCI+IDwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3R5bGUocm93KVwiXG4gICAgICAgIFtjbGFzcy5yb3dFeHBhbmRlZF09XCJleHBhbmRlZFwiXG4gICAgICAgIChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKHJvdylcIlxuICAgICAgICAqbmdJZj1cInJvdyAmJiByb3cuZGF0YVwiXG4gICAgICA+XG4gICAgICAgIDx0ZCAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XG4gICAgICAgICAgPHAtdGFibGVDaGVja2JveCAqbmdJZj1cInJvdy5zZWxlY3RhYmxlICE9IGZhbHNlXCIgW3ZhbHVlXT1cInJvd1wiIC8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCAqbmdJZj1cIiFpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiPlxuICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cInJvd1wiIC8+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIHNtYXJ0R3JpZD8uZ3JpZE1vZGVsPy52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93Lmljb25zW2NvbF1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydC10YWJsZS1pY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpciBvZiBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb24gW2ltYWdlUmVzb3VyY2VdPVwiaXJcIj4gPC9zbWFydC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2VsbFRvb2xiYXIocm93LCBjb2wpXCI+XG4gICAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGNvbClcIlxuICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXJvdy5pY29uc1tjb2xdXCIgW2lubmVySHRtbF09XCJnZXRDb2xWYWx1ZShjb2wsIHJvdylcIj4gPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDx0ZD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1idXR0b25cIj5cbiAgICAgICAgICAgIEBpZihzaG93Q2VsbFRvb2xiYXIocm93LCBkZWZhdWx0QWN0aW9uVG9vbGJhcklkKSl7XG4gICAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGRlZmF1bHRBY3Rpb25Ub29sYmFySWQpXCJcbiAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG91bGRTaG93T3B0aW9uc0J1dHRvbihyb3cpXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25PcHRpb25zQ2xpY2soJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNtYXJ0LWljb24gaWNvbj1cImVsbGlwc2lzLXZcIj48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgKm5nSWY9XCJzbWFydEdyaWQuZXhwYW5kYWJsZVwiPlxuICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICBbcFJvd1RvZ2dsZXJdPVwicm93XCJcbiAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLXVwJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIEBpZihzbWFydEdyaWQuZXhwYW5kYWJsZSl7XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJvd2V4cGFuc2lvblwiIGxldC1yb3c+XG4gICAgICA8dHI+XG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwJVwiPlxuICAgICAgICAgIDxsaWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudFxuICAgICAgICAgICAgW3Jvd0lkXT1cInJvdy5pZFwiXG4gICAgICAgICAgICBbcm93RXhwYW5kZXJdPVwidGhpc1wiXG4gICAgICAgICAgICBbZXhwYW5kZWRDb21wb25lbnRdPVwic21hcnRHcmlkLmV4cGFuZGVkQ29tcG9uZW50XCJcbiAgICAgICAgICAgIFtzbWFydEdyaWRdPVwidGhpcy5zbWFydEdyaWRcIlxuICAgICAgICAgID48L2xpYi1leHBhbmRlZC1yb3ctcmVuZGVyZXItY29tcG9uZW50PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIH1cbiAgPC9wLXRhYmxlPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5DQVJEICYmIHNtYXJ0R3JpZC5kYXRhTGF5b3V0RGVmXCJcbiAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XG4gICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAncmVwZWF0KCcgKyBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gKyAnLCAxZnIpJ1xuICAgICAgICAgIDogJydcbiAgICB9XCJcbiAgPlxuICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXG4gICAgICBjbGFzcz1cInNtYXJ0R3JpZC1jYXJkLWNvbnRhaW5lclwiXG4gICAgICAqbmdGb3I9XCJsZXQgdGFzayBvZiBzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93c1wiXG4gICAgICBbaXRlbV09XCJ0YXNrXCJcbiAgICAgIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCJcbiAgICAgIFtvblNlbGVjdF09XCJvblNlbGVjdC5iaW5kKHRoaXMpXCJcbiAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxuICA8L2Rpdj5cbjxkaXYgKm5nSWY9XCJzbWFydEdyaWQucGFnaW5hdG9yXCIgY2xhc3M9XCJwYWdpbmF0b3Itcm93XCI+XG4gIDxkaXYgY2xhc3M9XCJwYWdpbmF0b3Itd3JhcFwiPlxuICAgIDxwLXBhZ2luYXRvclxuICAgICAgW2ZpcnN0XT1cInBhZ2VJbmRleCFcIlxuICAgICAgW3RvdGFsUmVjb3Jkc109XCJsZW5ndGghXCJcbiAgICAgIFtyb3dzXT1cInBhZ2VTaXplXCJcbiAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IC8ge3RvdGFsUmVjb3Jkc31cIlxuICAgICAgKG9uUGFnZUNoYW5nZSk9XCJvblByaW1lQ2hhbmdlUGFnZSgkZXZlbnQpXCJcbiAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gICAgICBkcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gICAgPjwvcC1wYWdpbmF0b3I+XG4gIDwvZGl2PlxuXG4gIDxidXR0b25cbiAgICBwQnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgaWNvbj1cInBpIHBpLXJlZnJlc2hcIlxuICAgIGNsYXNzPVwicC1idXR0b24tdGV4dFwiXG4gICAgcFRvb2x0aXA9XCJGcmlzc8OtdMOpc1wiXG4gICAgKGNsaWNrKT1cInJlZnJlc2hQYXJ0aWFsUmVzdWx0cygpXCJcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWw/LnJlZnJlc2hFbmFibGVkXCJcbiAgPjwvYnV0dG9uPlxuPC9kaXY+XG4gIDxwLW1lbnUgI21lbnUgW21vZGVsXT1cIm1lbnVCdXR0b25zXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj4gPC9wLW1lbnU+XG48L2Rpdj5cbn1AZWxzZSB7XG48ZGl2ICpuZ0lmPVwic21hcnRHcmlkXCIgY2xhc3M9XCJzbWFydEdyaWQtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRvb2xiYXJcIj5cbiAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgI3Rvb2xiYXIgW2lkXT1cIidncmlkX25vdF9pbml0aWFsaXplZCdcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxuICAgIDxidXR0b25cbiAgICAgIChjbGljayk9XCJlZGl0Q29sdW1ucygpXCJcbiAgICAgIG1hdC1taW5pLWZhYlxuICAgICAgY29sb3I9XCJ0ZXh0LXByaW1hcnlcIlxuICAgICAgKm5nSWY9XCJzbWFydEdyaWQuc2hvd0VkaXRDb2x1bW5zXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJDb2x1bW5zXCIgY2xhc3M9XCJzbWFydC1ncmlkLWVkaXQtaWNvblwiXG4gICAgICAgID52aWV3X2NvbHVtbnM8L21hdC1pY29uXG4gICAgICA+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8IS0tIDxkaXYgW25nQ2xhc3NdPVwiaXNCbG9ja2VkID8gJ2Jsb2NrZWQnIDogJydcIj48L2Rpdj4gLS0+XG4gIDxkaXYgY2xhc3M9XCJzbWFydEdyaWRDb250ZW50XCI+XG4gICAgPGRpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuc2hvd1Jlc3VsdENvdW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydEdyaWQtZGF0YS1udW1iZXJcIj5cbiAgICAgICAgICB7eyBzbWFydEdyaWQuZ3JpZE1vZGVsLnRvdGFsUm93Q291bnQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZT48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkVYUEFOREFCTEVcIj5cbiAgICAgIDxzbWFydC1leHBhbmRhYmxlLXNlY3Rpb25cbiAgICAgICAgI2dyaWRFeHBhbmRhYmxlU2VjdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgZXhwYW5kYWJsZVNlY3Rpb24gb2YgZXhwYW5kYWJsZVNlY3Rpb25zXCJcbiAgICAgICAgW2RhdGFdPVwiZXhwYW5kYWJsZVNlY3Rpb25cIlxuICAgICAgPjwvc21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuQ0FSRCAmJiBzbWFydEdyaWQuZGF0YUxheW91dERlZlwiXG4gICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOlxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/ICdyZXBlYXQoJyArIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiArICcsIDFmciknXG4gICAgICAgICAgICA6ICcnXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8YXBwLXNtYXJ0LWdyaWQtY2FyZFxuICAgICAgICBjbGFzcz1cInNtYXJ0R3JpZC1jYXJkLWNvbnRhaW5lclwiXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YXNrIG9mIHNtYXJ0R3JpZC5ncmlkTW9kZWwucGFnZS5yb3dzXCJcbiAgICAgICAgW2l0ZW1dPVwidGFza1wiXG4gICAgICAgIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCJcbiAgICAgICAgW29uU2VsZWN0XT1cIm9uU2VsZWN0LmJpbmQodGhpcylcIlxuICAgICAgPjwvYXBwLXNtYXJ0LWdyaWQtY2FyZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLlRSRUUgJiYgdHJlZUNvbnRyb2xcIlxuICAgICAgY2xhc3M9XCJ0cmVlLWNvbnRhaW5lclwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOlxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/ICdyZXBlYXQoJyArIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiArICcsIDFmciknXG4gICAgICAgICAgICA6ICcnXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8bWF0LXRyZWUgW2RhdGFTb3VyY2VdPVwidHJlZURhdGFTb3VyY2UhXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sIVwiPlxuICAgICAgICA8bWF0LXRyZWUtbm9kZVxuICAgICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCJcbiAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ0luZGVudD1cIjI0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRpc2FibGVkIGNsYXNzPVwidHJlZS1idXR0b25cIj48L2J1dHRvbj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICBjbGFzcz1cImNoZWNrbGlzdC1sZWFmLW5vZGVcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcbiAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XG4gICAgICAgICAgPlxuICAgICAgICA8L21hdC10cmVlLW5vZGU+XG5cbiAgICAgICAgPG1hdC10cmVlLW5vZGVcbiAgICAgICAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIlxuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ0luZGVudD1cIjI0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcbiAgICAgICAgICAgIGNsYXNzPVwidHJlZS1idXR0b25cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVG9nZ2xlICcgKyBub2RlLml0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIj5cbiAgICAgICAgICAgICAge3sgdHJlZUNvbnRyb2whLmlzRXhwYW5kZWQobm9kZSkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcbiAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XG4gICAgICAgICAgPlxuICAgICAgICA8L21hdC10cmVlLW5vZGU+XG4gICAgICA8L21hdC10cmVlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjxkaXYgKm5nSWY9XCJzbWFydEdyaWQucGFnaW5hdG9yXCIgY2xhc3M9XCJwYWdpbmF0b3Itcm93LW1hdGVyaWFsXCI+XG4gIDxidXR0b25cbiAgIHBCdXR0b25cbiAgIHR5cGU9XCJidXR0b25cIlxuICAgaWNvbj1cInBpIHBpLXJlZnJlc2hcIlxuICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcbiAgIHBUb29sdGlwPVwiRnJpc3PDrXTDqXNcIlxuICAgKGNsaWNrKT1cInJlZnJlc2hQYXJ0aWFsUmVzdWx0cygpXCJcbiAgICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbD8ucmVmcmVzaEVuYWJsZWRcIlxuID48L2J1dHRvbj5cbiAgPG1hdC1wYWdpbmF0b3JcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3IgJiYgIXRyZWVDb250cm9sXCJcbiAgICAjcGFnaW5hdG9yXG4gICAgW2xlbmd0aF09XCJsZW5ndGhcIlxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiXG4gID48L21hdC1wYWdpbmF0b3I+XG4gIDwvZGl2PlxuPC9kaXY+XG59XG4iXX0=
1036
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFHVCxXQUFXLEVBQ1gsTUFBTSxFQUVOLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUdwQiw0QkFBNEIsRUFFNUIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZixjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUdMLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBSWpCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sZ0JBQWdCLENB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LElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFLeEIsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNRLGNBQWM7c0JBQXpDLFNBQVM7dUJBQUMsZUFBZTtnQkFLMUIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLDRCQUE0QjtnQkE4OEJ2QixJQUFJO3NCQUF0QixTQUFTO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEZsYXRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vc21hcnQtZGlhbG9nL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3IvYXBpL21vZGVsL2ZpbHRlckV4cHJlc3Npb25PcmRlckJ5JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRhYmxlLFxyXG4gIFNtYXJ0VGFibGVCdXR0b25UeXBlLFxyXG4gIFNtYXJ0VGFibGVIZWFkZXIsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnRpZXMsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZSxcclxuICBTbWFydFRhYmxlSW50ZXJmYWNlLFxyXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcclxuICBTbWFydFRhYmxlT3JkZXIsXHJcbiAgU21hcnRUYWJsZVR5cGUsXHJcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSW1hZ2VSZXNvdXJjZSxcclxuICBVaUFjdGlvbixcclxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQge1xyXG4gIENPTVBPTkVOVF9MSUJSQVJZLFxyXG4gIENvbXBvbmVudExpYnJhcnksXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICBVaUFjdGlvbk1vZGVsLFxyXG4gIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCxcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRDb2x1bW5NZXRhLFxyXG4gIEdyaWRSb3csXHJcbiAgR3JpZFNlbGVjdGlvbk1vZGUsXHJcbiAgR3JpZFNlbGVjdGlvblR5cGUsXHJcbiAgR3JpZFVwZGF0ZURhdGEsXHJcbiAgR3JpZFZpZXdEZXNjcmlwdG9yS2luZEVudW0sXHJcbn0gZnJvbSAnLi9hcGkvZ3JpZC1hcGknO1xyXG5pbXBvcnQgeyBUYWJsZUxheW91dERlZmluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtbGF5b3V0LWRlZmluZXIvdGFibGUtbGF5b3V0LWRlZmluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHcmlkVWlBY3Rpb25UeXBlLFxyXG4gIFNtYXJ0R3JpZCxcclxuICBTbWFydEdyaWREYXRhTGF5b3V0LFxyXG4gIFNtYXJ0R3JpZFR5cGUsXHJcbiAgU21hcnRMYXlvdXREZWYsXHJcbn0gZnJvbSAnLi9tb2RlbHMvbW9kZWwnO1xyXG5pbXBvcnQgeyBTbWFydEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC1ncmlkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQge1xyXG4gIFJvd1RvZ2dsZXIsXHJcbiAgVGFibGVDb2x1bW5SZW9yZGVyRXZlbnQsXHJcbiAgVGFibGVIZWFkZXJDaGVja2JveFRvZ2dsZUV2ZW50LFxyXG4gIFRhYmxlTGF6eUxvYWRFdmVudCxcclxuICBUYWJsZVJvd0V4cGFuZEV2ZW50LFxyXG4gIFRhYmxlUm93U2VsZWN0RXZlbnQsXHJcbiAgVGFibGVSb3dVblNlbGVjdEV2ZW50LFxyXG59IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0Q2hhbmdlRXZlbnQgfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcclxuaW1wb3J0IHsgU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsIH0gZnJvbSAnLi9zbWFydC1ncmlkLXRvb2xiYXItdXRpbCc7XHJcbmltcG9ydCB7IEV4cGFuZGVkUm93UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VuZXJpYy1jb21wb25lbnQvZXhwYW5kZWQtcm93LXJlbmRlcmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNtYXJ0RGF0ZVBpcGUsIFNtYXJ0RGF0ZVRpbWVQaXBlLCBTbWFydFRpbWVQaXBlIH0gZnJvbSAnLi4vc2hhcmVkL3NtYXJ0dGFibGUuZGF0ZS1waXBlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc21hcnQtZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LWdyaWQuY29tcG9uZW50LmNzcyddLFxyXG4gIHByb3ZpZGVyczogW1NtYXJ0R3JpZFNlcnZpY2UsIFNtYXJ0RGF0ZVBpcGUsIFNtYXJ0RGF0ZVRpbWVQaXBlLCBTbWFydFRpbWVQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0R3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvLyBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQYWdlU2l6ZTogbnVtYmVyID0gMTA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjUsIDUwXTtcclxuICBjb21wb25lbnRMaWJyYXJ5ID0gQ29tcG9uZW50TGlicmFyeTtcclxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgQElucHV0KCkgc21hcnRHcmlkPzogU21hcnRHcmlkO1xyXG4gIEBJbnB1dCgpIHV1aWQ/OiBzdHJpbmc7XHJcblxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLXRlc3RpZCcpXHJcbiAgZ2V0IHRlc3RJZCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsPy5pZGVudGlmaWVyID8/IG51bGw7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGRldjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyB0YWJsZVxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHZjUmVmVGFibGU/OiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIGNvbXBvbmVudFJlZlRhYmxlPzogQ29tcG9uZW50UmVmPFNtYXJ0dGFibGVDb21wb25lbnQ+O1xyXG4gIHNtYXJ0VGFibGUhOiBTbWFydFRhYmxlPEdyaWRSb3c+O1xyXG5cclxuICAvLyB0b29sYmFyXHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicpIHRvb2xiYXI/OiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnaGVhZGVyVG9vbGJhcicpIF9oZWFkZXJUb29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG4gIGRlZmF1bHRBY3Rpb25Ub29sYmFySWQ6IHN0cmluZyA9IFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5kZWZhdWx0QWN0aW9uVG9vbGJhcklkO1xyXG5cclxuICAvLyBleHBhbmRhYmxlXHJcbiAgQFZpZXdDaGlsZHJlbihFeHBhbmRlZFJvd1JlbmRlcmVyQ29tcG9uZW50KVxyXG4gIGV4cGFuZGVkUm93c0NvbXBzITogUXVlcnlMaXN0PEV4cGFuZGVkUm93UmVuZGVyZXJDb21wb25lbnQ+O1xyXG5cclxuICBleHBhbmRhYmxlU2VjdGlvbnM/OiBFeHBhbmRhYmxlU2VjdGlvbjxhbnk+W107XHJcbiAgZXhwYW5kZWRSb3dzID0ge307XHJcblxyXG4gIC8vIGdyaWREYXRhXHJcbiAgcGFnZUV2ZW50PzogUGFnZUV2ZW50O1xyXG4gIGRhdGFzb3VyY2U/OiBudWxsO1xyXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xyXG4gIGxlbmd0aD86IG51bWJlcjtcclxuICBwYWdlSW5kZXg/OiBudW1iZXI7XHJcbiAgdmFsdWVzOiBhbnk7XHJcbiAgZ3JpZFRhYmxlITogU21hcnRUYWJsZTxhbnk+O1xyXG4gIGlzTXVsdGlwbGU/OiBib29sZWFuO1xyXG4gIHNlbGVjdGVkUm93czogR3JpZFJvd1tdID0gW107XHJcbiAgdGFibGVUeXBlPzogYW55O1xyXG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSB0aGlzLmRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM7XHJcbiAgY29sdW1uTWV0YUJ5TmFtZT86IE1hcDxzdHJpbmcsIEdyaWRDb2x1bW5NZXRhPjtcclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlczogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgdWlBY3Rpb25EZXNjcmlwdG9yczogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPiA9IG5ldyBNYXAoKTtcclxuICBjZWxsVG9BY3Rpb25NYXA6IFJlY29yZDxzdHJpbmcsIFVpQWN0aW9uTW9kZWxbXT4gPSB7fTtcclxuXHJcbiAgYWZ0ZXJWaWV3SW5pdEV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNCbG9ja2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gdHJlZVxyXG4gIHRyZWVDb250cm9sPzogRmxhdFRyZWVDb250cm9sPEdyaWRSb3c+O1xyXG4gIHRyZWVGbGF0dGVuZXI/OiBNYXRUcmVlRmxhdHRlbmVyPEdyaWRSb3csIEdyaWRSb3c+O1xyXG4gIHRyZWVEYXRhU291cmNlPzogTWF0VHJlZUZsYXREYXRhU291cmNlPEdyaWRSb3csIEdyaWRSb3c+O1xyXG4gIHRyZWVDaGVja2xpc3RTZWxlY3Rpb24/OiBTZWxlY3Rpb25Nb2RlbDxHcmlkUm93PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNtYXJ0R3JpZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNmU2VydmljZTogQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIHVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U6IFVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNtYXJ0RGF0ZVBpcGU6IFNtYXJ0RGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHNtYXJ0RGF0ZVRpbWVQaXBlOiBTbWFydERhdGVUaW1lUGlwZSxcclxuICAgIHByaXZhdGUgc21hcnRUaW1lUGlwZTogU21hcnRUaW1lUGlwZSxcclxuICAgIEBJbmplY3QoQ09NUE9ORU5UX0xJQlJBUlkpIHB1YmxpYyBjb21wTGliOiBDb21wb25lbnRMaWJyYXJ5LFxyXG4gICAgQEluamVjdCgnZ3JpZE1lbnVJY29uJykgcHJpdmF0ZSBncmlkTWVudUljb24/OiBzdHJpbmdcclxuICApIHtcclxuICAgIHRoaXMuc2VydmljZS5ncmlkTW9kZWxDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIC8vIGNhbGxlZCBhZnRlciBldmVyeSBzZXJ2aWNlIGNhbGwgKGxvYWQsIHNhdmUsIHJlZnJlc2gsIGV0Yy4pXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsO1xyXG4gICAgICB0aGlzLnJlbmRlcigpO1xyXG5cclxuICAgICAgLy9SZWZyZXNoIGV4cGFuZGVkIHNlY3Rpb25zIGRhdGFcclxuICAgICAgaWYgKHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd3NDb21wcy5mb3JFYWNoKChyb3dDb21wKSA9PiByb3dDb21wLnJlZnJlc2hSb3dEYXRhKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydzbWFydEdyaWQnXSkge1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCA9IGNoYW5nZXNbJ3NtYXJ0R3JpZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5zZXJ2aWNlLnBhZ2luYXRvciA9IHRoaXMuc21hcnRHcmlkPy5wYWdpbmF0b3I7XHJcbiAgICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1sndXVpZCddKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWyd1dWlkJ10gJiYgdGhpcy51dWlkID09PSBjaGFuZ2VzWyd1dWlkJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd3MgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnV1aWQgPSBjaGFuZ2VzWyd1dWlkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWZ0ZXJWaWV3SW5pdEV4ZWN1dGVkICYmIHRoaXMudXVpZCAmJiB0aGlzLnNtYXJ0R3JpZCkge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFmdGVyVmlld0luaXRFeGVjdXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHRoZSBzZWxlY3RlZCByb3dzIG9mIHRoZSB0YWJsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3MoKTogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4ge1xyXG4gICAgaWYgKCF0aGlzLnNtYXJ0VGFibGUuc2VsZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoKTtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0VGFibGUhLnNlbGVjdGlvbiE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBnZW5lcmljIEdyaWRBUEkgYW5kIHJlZnJlc2hlcyB0aGUgcHJlc2VudGVkXHJcbiAgICogZ3JpZCB3aXRoIHRoZSBuZXdlc3Qgb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXR1cFRvb2xiYXIoKTtcclxuICAgIC8vIHdpbGwgY2F1c2UgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbENoYW5nZWQgdG8gZmlyZVxyXG4gICAgaWYgKHRoaXMudXVpZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNlcnZpY2UubG9hZCh0aGlzLnV1aWQsIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdHlsZShyb3c6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIGlmIChyb3cgJiYgcm93LnN0eWxlKSB7XHJcbiAgICAgIGxldCBzdHlsZSA9IHJvdy5zdHlsZTtcclxuICAgICAgbGV0IGNsYXNzZXNUb0FkZDogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgICAgaWYgKHN0eWxlLmNsYXNzZXNUb0FkZCkge1xyXG4gICAgICAgIHN0eWxlLmNsYXNzZXNUb0FkZC5mb3JFYWNoKChjbDogc3RyaW5nKSA9PiBjbGFzc2VzVG9BZGQucHVzaChjbCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXN0eWxlLmNsYXNzZXNUb1JlbW92ZSkge1xyXG4gICAgICAgIHJldHVybiBjbGFzc2VzVG9BZGQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNsYXNzZXNUb0FkZC5maWx0ZXIoKGNscykgPT4gIXN0eWxlLmNsYXNzZXNUb1JlbW92ZS5pbmNsdWRlcyhjbHMpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXR1cFRvb2xiYXIoKSB7XHJcbiAgICAvLyBjaGVjayBpZiB0b29sYmFyIGlzIGF2YWlsYWJsZSBfYW5kXyBuZWVkIHNldCB1cFxyXG4gICAgaWYgKHRoaXMudG9vbGJhciAmJiB0aGlzLnNtYXJ0R3JpZCkge1xyXG4gICAgICBsZXQgdG9vbGJhcklkID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRJZGVudGlmaWVyICsgJ190b29sYmFyJztcclxuICAgICAgaWYgKHRvb2xiYXJJZCAhPT0gdGhpcy50b29sYmFyLmlkKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyLmlkID0gdG9vbGJhcklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2hlYWRlclRvb2xiYXIgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgbGV0IGhlYWRlclRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfaGVhZGVyVG9vbGJhcic7XHJcbiAgICAgIGlmIChoZWFkZXJUb29sYmFySWQgIT09IHRoaXMuX2hlYWRlclRvb2xiYXIuaWQpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXJUb29sYmFyLmlkID0gaGVhZGVyVG9vbGJhcklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVhZGVyVG9vbGJhcigpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJUb29sYmFyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50UmVmVGFibGU/Lmluc3RhbmNlLmNvbXBvbmVudFJlZlRhYmxlPy5pbnN0YW5jZS5oZWFkZXJUb29sYmFyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBncmlkTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsO1xyXG4gICAgaWYgKGdyaWRNb2RlbCkge1xyXG4gICAgICB0aGlzLmxlbmd0aCA9IGdyaWRNb2RlbC50b3RhbFJvd0NvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gZ3JpZE1vZGVsLnBhZ2VTaXplO1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IGdyaWRNb2RlbC5wYWdlSW5kZXggPz8gMDtcclxuICAgICAgaWYgKGdyaWRNb2RlbC5wYWdlU2l6ZU9wdGlvbnMgJiYgZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSBncmlkTW9kZWwucGFnZVNpemVPcHRpb25zO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gdGhpcy5kZWZhdWx0UGFnZVNpemVPcHRpb25zO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1ucykge1xyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5zaG93RWRpdENvbHVtbnMgPSBncmlkTW9kZWw/LnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1ucztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhQnlOYW1lID0gbmV3IE1hcChcclxuICAgICAgICAgIGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbCkgPT4gW2NvbC5wcm9wZXJ0eU5hbWUsIGNvbF0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFCeU5hbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBraW5kID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5raW5kO1xyXG4gICAgICBpZiAoa2luZCkge1xyXG4gICAgICAgIGxldCBsYXlvdXREZWY7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLlRBQkxFKSB7XHJcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UQUJMRTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLlRSRUUpIHtcclxuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRSRUU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5DQVJEUykge1xyXG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuQ0FSRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxheW91dERlZikge1xyXG4gICAgICAgICAgdGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9IGxheW91dERlZjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8ucGFnaW5hdG9yID09PSB0cnVlIHx8IGdyaWRNb2RlbD8ucGFnaW5hdG9yID09PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5wYWdpbmF0b3IgPSBncmlkTW9kZWwucGFnaW5hdG9yO1xyXG4gICAgICAgIHRoaXMuc2VydmljZS5wYWdpbmF0b3IgPSB0aGlzLnNtYXJ0R3JpZCEucGFnaW5hdG9yO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdHcmlkTW9kZWwgaXMgdW5kZWZpbmVkIGluIGNvbXBvbmVudCEnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmxheW91dERlZikge1xyXG4gICAgICAvLyBmYWxsYmFjaywgZGVmYXVsdCBUQUJMRVxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVEFCTEUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJUYWJsZSgpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5FWFBBTkRBQkxFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyRXhwYW5kYWJsZVNlY3Rpb25zKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLkNBUkQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJDYXJkcygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UUkVFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUYWJsZSgpIHtcclxuICAgIHRoaXMudmNSZWZUYWJsZT8uY2xlYXIoKTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlbmRlclRhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5jbGVhclRyZWUoKTtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlU2l6ZSEgKiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VJbmRleCE7XHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcy5tYXAoKG9yZGVyZWRDb2w6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9yZGVyZWRDb2wgPT09IGNvbHVtLnByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0YWJsZVJvdyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwhLnBhZ2Uucm93cyEubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jcmVhdGVDZWxsVG9BY3Rpb25NYXAoKTtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRhYmxlUm93Lmxlbmd0aCkge1xyXG4gICAgICBsZXQgcGxhY2VIb2xkZXJSb3c6IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChtZXRhOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICAgIHBsYWNlSG9sZGVyUm93W21ldGEucHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzID0gW3BsYWNlSG9sZGVyUm93XTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnPy50YWJsZVR5cGUpIHtcclxuICAgICAgdGhpcy50YWJsZVR5cGUgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWcudGFibGVUeXBlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zZWxlY3Rpb25UeXBlKSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID1cclxuICAgICAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5zZWxlY3Rpb25UeXBlID09PSBHcmlkU2VsZWN0aW9uVHlwZS5DSEVDS0JPWFxyXG4gICAgICAgICAgPyBTbWFydFRhYmxlVHlwZS5DSEVDS19CT1hcclxuICAgICAgICAgIDogU21hcnRUYWJsZVR5cGUuUk9XX1NFTEVDVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID0gU21hcnRUYWJsZVR5cGUuSU5IRVJJVEVEO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XHJcbiAgICAgIGxldCB0YWJsZUNvbmZpZzogU21hcnRUYWJsZUludGVyZmFjZTxHcmlkUm93PiA9IHtcclxuICAgICAgICAuLi50aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWcsXHJcbiAgICAgICAgdGl0bGU6IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudGl0bGUsXHJcbiAgICAgICAgdGFibGVSb3dzOiB0YWJsZVJvdyxcclxuICAgICAgICB0YWJsZVR5cGU6IHRoaXMudGFibGVUeXBlLFxyXG4gICAgICAgIGN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzOiBhd2FpdCB0aGlzLmNvbnN0cnVjdEhlYWRlcigpISxcclxuICAgICAgICBleHBhbmRhYmxlOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSxcclxuICAgICAgICBhc3luY09uRXhwYW5kOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSxcclxuICAgICAgICBleHBhbmRlZENvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGVkQ29tcG9uZW50LFxyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bS5OT1JNQUwsXHJcbiAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdEFjdGlvbkNvZGVzOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zISxcclxuICAgICAgICBkZWZhdWx0QWN0aW9uczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucz8ubWFwKChjb2RlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6XHJcbiAgICAgICAgICAgICAgY29kZSA9PT0gJ19hY3Rpb25TZXBhcmF0b3JfJ1xyXG4gICAgICAgICAgICAgICAgPyBTbWFydFRhYmxlQnV0dG9uVHlwZS5TRVBBUkFUT1JcclxuICAgICAgICAgICAgICAgIDogU21hcnRUYWJsZUJ1dHRvblR5cGUuTk9STUFMLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICAgIC8vIGxhYmVsOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IoeyBjb2RlOiBjb2RlIH0pLFxyXG4gICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgLy8gYXJnczogW1xyXG4gICAgICAgICAgICAvLyAgIHtcclxuICAgICAgICAgICAgLy8gICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgLy8gXSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5oaWdobGlnaHRQcm9wZXJ0eSAmJlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0Q2xhc3NcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcuaGlnaGxpZ2h0Q2xhc3MgPSB0aGlzLnNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldy5kZXNjcmlwdG9yLmhpZ2hsaWdodENsYXNzO1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodFByb3BlcnR5ID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRQcm9wZXJ0eTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSAmJlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uU2VsZWN0aW9uID0gdGhpcy5vblNlbGVjdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uQWxsU2VsZWN0aW9uID0gdGhpcy5vblNlbGVjdEFsbC5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBQcmVwYXJlZCBmb3Igc2ltcGxlIGNsaWNrc1xyXG4gICAgICAvLyBpZiAoIXRhYmxlQ29uZmlnLm9uUm93Q2xpY2spIHtcclxuICAgICAgLy8gICB0YWJsZUNvbmZpZy5vblJvd0NsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmICghdGFibGVDb25maWcub25Sb3dEb3VibGVDbGljaykge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2sgPSB0aGlzLm9uRG91YmxlQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0YWJsZUNvbmZpZy5pc1Jvd0Rpc2FibGVkUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0YWJsZVByb3BlcnR5TmFtZSA9ICdzZWxlY3RhYmxlJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRhYmxlQ29uZmlnLmFzeW5jT25FeHBhbmQpIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5yb3dFeHBhbmRlciA9IHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGUgPSB0aGlzLnNlcnZpY2UhLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zZWxlY3Rpb25Nb2RlO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICF0YWJsZUNvbmZpZy5zZWxlY3Rpb24gJiZcclxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgJiZcclxuICAgICAgICBzZWxlY3Rpb25Nb2RlICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5OT05FXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZSA9IHNlbGVjdGlvbk1vZGUgPT09IEdyaWRTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xyXG5cclxuICAgICAgICB0YWJsZUNvbmZpZy5zZWxlY3Rpb25Qcm9wZXJ0eSA9ICdpZCc7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSWRzO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZpbHRlcihcclxuICAgICAgICAgIChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LnNlbGVjdGVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkUm93cy5tYXAoKGdyaWRSb3c6IEdyaWRSb3cpID0+IGdyaWRSb3cuaWQhKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0aGlzLmlzTXVsdGlwbGUsIHNlbGVjdGVkSWRzKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5zaG93Q2hlY2tib3hJbkhlYWRlciA9XHJcbiAgICAgICAgICB0eXBlb2YgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgIT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgICAgID8gdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgLy8ga2VlcCBpZiBzZXRcclxuICAgICAgICAgICAgOiB0aGlzLmlzTXVsdGlwbGU7IC8vaWYgdW5zZXQsIHR1cm4gaXQgb24gZm9yIG11bHRpcGxlIHNlbGVjdGlvblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNtYXJ0VGFibGUgPSBuZXcgU21hcnRUYWJsZTxhbnk+KFxyXG4gICAgICAgIHRhYmxlQ29uZmlnLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllcixcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uc2VydmljZVRvVXNlXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRSZWZUYWJsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2UudXBkYXRlU21hcnRUYWJsZSh0aGlzLnNtYXJ0VGFibGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmNSZWZUYWJsZT8uY2xlYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnZjUmVmVGFibGUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZUYWJsZSA9IHRoaXMuY2ZTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChcclxuICAgICAgICAgIHRoaXMudmNSZWZUYWJsZSEsXHJcbiAgICAgICAgICBTbWFydHRhYmxlQ29tcG9uZW50LFxyXG4gICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIGFueT4oW1snc21hcnRUYWJsZScsIHRoaXMuc21hcnRUYWJsZV1dKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLnNvcnRFdmVudFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2UuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKGhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT4ge1xyXG4gICAgICAgICAgICBoZWFkZXIucHJvcGVydHlOYW1lID0gaGVhZGVyLnByb3BlcnR5TmFtZS5zdWJzdHJpbmcoNSk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGhlYWRlci5vcmRlcikge1xyXG4gICAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxyXG4gICAgICAgICAgICAgICAgaGVhZGVyLm9yZGVyID0gU21hcnRUYWJsZU9yZGVyLkFTQztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgU21hcnRUYWJsZU9yZGVyLkFTQzpcclxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IFNtYXJ0VGFibGVPcmRlci5ERVNDO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBTbWFydFRhYmxlT3JkZXIuREVTQzpcclxuICAgICAgICAgICAgICAgIGhlYWRlci5vcmRlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdC5maW5kKFxyXG4gICAgICAgICAgICAgIChmaWx0ZXJFeHByZXNzaW9uOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT5cclxuICAgICAgICAgICAgICAgIGZpbHRlckV4cHJlc3Npb24ucHJvcGVydHlOYW1lID09PSBoZWFkZXIucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgJiYgIWhlYWRlci5vcmRlcikge1xyXG4gICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3QuaW5kZXhPZihmaWx0ZXIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3Quc3BsaWNlKGluZGV4ISwgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyLm9yZGVyID0gaGVhZGVyLm9yZGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBvcmRlcjogaGVhZGVyLm9yZGVyLFxyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBoZWFkZXIucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZ3JpZFVwZGF0ZURhdGE6IEdyaWRVcGRhdGVEYXRhID0ge1xyXG4gICAgICAgICAgICAgIG9yZGVyQnlMaXN0OiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LFxyXG4gICAgICAgICAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlcmVkQ29sdW1uTmFtZXMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zb3J0KHRoaXMuc21hcnRHcmlkISwgZ3JpZFVwZGF0ZURhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2Uuc21hcnRUYWJsZS5zZWxlY3Rpb24/LmNoYW5nZWRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudFJlZlRhYmxlLmluc3RhbmNlLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZXMubmV4dChyb3cpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBhbmQocm93SWQ6IG51bWJlcik6IGFueSB7fVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZXhwYW5kQXN5bmMocm93SW5kZXg6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MpIHtcclxuICAgICAgbGV0IHJvdyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzW3Jvd0luZGV4XTtcclxuICAgICAgaWYgKHJvdyAmJiByb3cuaWQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cGFuZCh0aGlzLnNtYXJ0R3JpZCEsIHJvdy5pZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcnZpY2UuZXhwYW5kKHRoaXMuc21hcnRHcmlkISwgcm93SW5kZXgudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckV4cGFuZGFibGVTZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kYWJsZVNlY3Rpb25zID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbCEucGFnZS5yb3dzIS5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICBoZWFkZXJDb21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5oZWFkZXJDb21wb25lbnQsXHJcbiAgICAgICAgaGVhZGVySW5wdXROYW1lOiB0aGlzLnNtYXJ0R3JpZCEuaGVhZGVyQ29tcG9uZW50SW5wdXROYW1lLFxyXG4gICAgICAgIGhlYWRlckRhdGE6IGl0ZW0sXHJcbiAgICAgICAgY3VzdG9tQ29tcG9uZW50OiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZUNvbXBvbmVudCxcclxuICAgICAgICBpbnB1dE5hbWU6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlQ29tcG9uZW50SW5wdXROYW1lLFxyXG4gICAgICAgIGRhdGE6IGl0ZW0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQ2FyZHMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZVNpemUhICogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlSW5kZXghO1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMubWFwKChvcmRlcmVkQ29sOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChjb2x1bTogR3JpZENvbHVtbk1ldGEpID0+IHtcclxuICAgICAgICAgIGlmIChvcmRlcmVkQ29sID09PSBjb2x1bS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmN1c3RvbUNvbXBvbmVudCkge1xyXG4gICAgICBsZXQgZGF0YWxheW91dERlZiA9IHtcclxuICAgICAgICBkYXRhTGF5b3V0OiBTbWFydEdyaWREYXRhTGF5b3V0LkNPTFVNTixcclxuICAgICAgICBncmlkTGF5b3V0OiBTbWFydEdyaWREYXRhTGF5b3V0LkNPTFVNTixcclxuICAgICAgICB0eXBlOiBTbWFydEdyaWRUeXBlLkNVU1RPTSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5kYXRhTGF5b3V0RGVmID0gZGF0YWxheW91dERlZjtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmN1c3RvbUNvbXBvbmVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0KHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciArICdDYXJkJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTXVsdGlwbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZXJ2aWNlIS5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uTW9kZTtcclxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NVUxUSVBMRTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUcmVlKCkge1xyXG4gICAgdGhpcy50cmVlQ29udHJvbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudHJlZURhdGFTb3VyY2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVGbGF0dGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRyZWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyVGFibGUoKTtcclxuICAgIGlmICghdGhpcy50cmVlRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnRyZWVGbGF0dGVuZXIgPSBuZXcgTWF0VHJlZUZsYXR0ZW5lcihcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybWVyLFxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwsXHJcbiAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUsXHJcbiAgICAgICAgdGhpcy5nZXRDaGlsZHJlblxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93Pih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XHJcbiAgICAgIHRoaXMudHJlZURhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKHRoaXMudHJlZUNvbnRyb2wsIHRoaXMudHJlZUZsYXR0ZW5lcik7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxHcmlkUm93Pih0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSk7XHJcbiAgICB9XHJcbiAgICBsZXQgbm9kZXMgPSB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXM7XHJcbiAgICBsZXQgZXhwYW5kZWROb2RlczogKHN0cmluZyB8IHVuZGVmaW5lZClbXTtcclxuICAgIGlmIChub2Rlcykge1xyXG4gICAgICBleHBhbmRlZE5vZGVzID0gbm9kZXNcclxuICAgICAgICAuZmlsdGVyKChub2RlKSA9PiB0aGlzLnRyZWVDb250cm9sPy5pc0V4cGFuZGFibGUobm9kZSkpXHJcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRlZChub2RlKSlcclxuICAgICAgICAubWFwKChub2RlKSA9PiBub2RlLmlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4cGFuZGVkTm9kZXMgPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzIS5mb3JFYWNoKChyb3c6IGFueSkgPT4gKHJvdy5sZXZlbCA9IHVuZGVmaW5lZCkpO1xyXG4gICAgdGhpcy50cmVlRGF0YVNvdXJjZS5kYXRhID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZpbHRlcigocm93KSA9PiAhcm93LnBhcmVudCk7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmNsZWFyKCk7XHJcbiAgICB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICBpZiAobm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uc2VsZWN0KG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudHJlZUNvbnRyb2w/LmNvbGxhcHNlQWxsKCk7XHJcbiAgICBleHBhbmRlZE5vZGVzLmZvckVhY2goKHJvd0lkKSA9PiB7XHJcbiAgICAgIGxldCByb3cgPSB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXMuZmluZCgocm93KSA9PiByb3dJZCA9PT0gcm93LmlkKTtcclxuICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2w/LmV4cGFuZChyb3cpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExldmVsID0gKG5vZGU6IGFueSkgPT4gbm9kZS5sZXZlbCA/PyAwO1xyXG5cclxuICBpc0V4cGFuZGFibGUgPSAobm9kZTogR3JpZFJvdykgPT4gKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlKTtcclxuXHJcbiAgZ2V0Q2hpbGRyZW4gPSAobm9kZTogR3JpZFJvdyk6IEdyaWRSb3dbXSA9PiB7XHJcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xyXG4gICAgICBsZXQgcm93cyA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZS5yb3dzPy5maWx0ZXIoKHJvdykgPT5cclxuICAgICAgICBub2RlLmNoaWxkcmVuPy5zb21lKChjaGlsZCkgPT4gY2hpbGQgPT09IHJvdy5pZCEpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyb3dzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvd3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9O1xyXG5cclxuICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIF9ub2RlRGF0YTogR3JpZFJvdykgPT4gdGhpcy5pc0V4cGFuZGFibGUoX25vZGVEYXRhKTtcclxuXHJcbiAgdHJhbnNmb3JtZXIgPSAocm93OiBHcmlkUm93LCBsZXZlbDogbnVtYmVyKSA9PiB7XHJcbiAgICAocm93IGFzIGFueSkubGV2ZWwgPSBsZXZlbDtcclxuICAgIHJldHVybiByb3c7XHJcbiAgfTtcclxuXHJcbiAgZ2V0VHJlZUl0ZW0ocm93OiBHcmlkUm93KTogc3RyaW5nIHtcclxuICAgIGxldCBjb2x1bW5zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzO1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IHJvdy5kYXRhITtcclxuICAgIGlmIChjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbCkgPT4gZGF0YVtjb2xdKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm93LmlkITtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIHRyZWVOb2RlIHNlbGVjdGlvbi4gU2VsZWN0L2Rlc2VsZWN0IGFsbCB0aGUgZGVzY2VuZGFudHMgbm9kZSAqL1xyXG4gIHRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzZWxlY3Rpb25CZWZvcmUgPSB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubWFwKChyb3cpID0+IHJvdy5pZCk7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKG5vZGUpO1xyXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKSB7XHJcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbCEuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXHJcbiAgICAgICAgPyB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KC4uLmRlc2NlbmRhbnRzKVxyXG4gICAgICAgIDogdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KC4uLmRlc2NlbmRhbnRzKTtcclxuICAgICAgdGhpcy5jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgc2VsZWN0aW9uQWZ0ZXIgPSB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubWFwKChyb3cpID0+IHJvdy5pZCk7XHJcblxyXG4gICAgbGV0IHNlbGVjdGVkSWRzID0gc2VsZWN0aW9uQWZ0ZXIuZmlsdGVyKChzKSA9PiAhc2VsZWN0aW9uQmVmb3JlLmluY2x1ZGVzKHMpKTtcclxuICAgIGxldCB1bnNlbGVjdGVkSWRzID0gc2VsZWN0aW9uQmVmb3JlLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkFmdGVyLmluY2x1ZGVzKHMpKTtcclxuICAgIHRoaXMub25TZWxlY3RSb3dzKHNlbGVjdGVkSWRzLCB1bnNlbGVjdGVkSWRzKTtcclxuICB9XHJcblxyXG4gIGNoZWNrQWxsUGFyZW50c1NlbGVjdGlvbihub2RlOiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBsZXQgcGFyZW50OiBHcmlkUm93IHwgbnVsbCA9IHRoaXMuZ2V0UGFyZW50Tm9kZShub2RlKTtcclxuICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgdGhpcy5jaGVja1BhcmVudE5vZGVTZWxlY3Rpb24ocGFyZW50KTtcclxuICAgICAgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnROb2RlKHBhcmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja1BhcmVudE5vZGVTZWxlY3Rpb24obm9kZTogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZVNlbGVjdGVkID0gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSk7XHJcbiAgICBjb25zdCBkZXNjQWxsU2VsZWN0ZWQgPSB0aGlzLmRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZSk7XHJcbiAgICBpZiAobm9kZVNlbGVjdGVkICYmICFkZXNjQWxsU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KG5vZGUpO1xyXG4gICAgfSBlbHNlIGlmICghbm9kZVNlbGVjdGVkICYmIGRlc2NBbGxTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyogR2V0IHRoZSBwYXJlbnQgbm9kZSBvZiBhIG5vZGUgKi9cclxuICBnZXRQYXJlbnROb2RlKG5vZGU6IEdyaWRSb3cpOiBHcmlkUm93IHwgbnVsbCB7XHJcbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExldmVsKG5vZGUpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TGV2ZWwgPCAxKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnRyZWVDb250cm9sIS5kYXRhTm9kZXMuaW5kZXhPZihub2RlKSAtIDE7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy50cmVlQ29udHJvbCEuZGF0YU5vZGVzW2ldO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZ2V0TGV2ZWwoY3VycmVudE5vZGUpIDwgY3VycmVudExldmVsKSB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGFsbCB0aGUgZGVzY2VuZGFudHMgb2YgdGhlIG5vZGUgYXJlIHNlbGVjdGVkLiAqL1xyXG4gIGRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZTogR3JpZFJvdyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnRyZWVDb250cm9sIHx8ICF0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xyXG4gICAgY29uc3QgZGVzY0FsbFNlbGVjdGVkID1cclxuICAgICAgZGVzY2VuZGFudHMubGVuZ3RoID4gMCAmJlxyXG4gICAgICBkZXNjZW5kYW50cy5ldmVyeSgoY2hpbGQpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uIS5pc1NlbGVjdGVkKGNoaWxkKTtcclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gZGVzY0FsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgcGFydCBvZiB0aGUgZGVzY2VuZGFudHMgYXJlIHNlbGVjdGVkICovXHJcbiAgZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlOiBHcmlkUm93KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNvbnRyb2wgfHwgIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gZGVzY2VuZGFudHMuc29tZSgoY2hpbGQpID0+IHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiEuaXNTZWxlY3RlZChjaGlsZCkpO1xyXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKSB7XHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29uc3RydWN0SGVhZGVyKCk6IFByb21pc2U8U21hcnRUYWJsZUhlYWRlcltdPiB7XHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MgJiYgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MubGVuZ3RoKSB7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzLm1hcChhc3luYyAoZ3JpZFJvdzogR3JpZFJvdykgPT4ge1xyXG4gICAgICAgICAgbGV0IG5ld1VpQWN0aW9ucyA9IGdyaWRSb3cuYWN0aW9ucz8uZmlsdGVyKFxyXG4gICAgICAgICAgICAodWlBY3Rpb246IGFueSkgPT4gIXRoaXMudWlBY3Rpb25EZXNjcmlwdG9ycy5nZXQodWlBY3Rpb24uY29kZSEpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmIChuZXdVaUFjdGlvbnMpIHtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgbmV3VWlBY3Rpb25zLm1hcChhc3luYyAodWlBY3Rpb246IFVpQWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGVzY3JpcHRvcjogVWlBY3Rpb25EZXNjcmlwdG9yID1cclxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zbWFydEdyaWQhLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U/LmdldEFjdGlvbkRlc2NyaXB0b3IodWlBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHVpQWN0aW9uLmNvZGUgPz8gJ0NPREUnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLk5PUk1BTCxcclxuICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudWlBY3Rpb25EZXNjcmlwdG9ycy5zZXQodWlBY3Rpb24uY29kZSEsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JlZGVyZWREZXNjQ29sdW1ucyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJlZENvbHVtbk5hbWVzLm1hcChcclxuICAgICAgKHByb3BlcnR5TmFtZTogc3RyaW5nKSA9PlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEuZGVzY3JpcHRvciEuY29sdW1ucyEuZmluZChcclxuICAgICAgICAgIChjb2xEZXNjcmlwdG9yOiBHcmlkQ29sdW1uTWV0YSkgPT4gY29sRGVzY3JpcHRvci5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZVxyXG4gICAgICAgIClcclxuICAgICkuZmxhdE1hcCgoZikgPT4gZiA/PyBbXSk7XHJcblxyXG4gICAgbGV0IGhlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvcmVkZXJlZERlc2NDb2x1bW5zLm1hcChhc3luYyAoZGVzY0NvbHVtbjogR3JpZENvbHVtbk1ldGEpOiBQcm9taXNlPFNtYXJ0VGFibGVIZWFkZXI+ID0+IHtcclxuICAgICAgICBsZXQgY3VzdG9tVGFibGVIZWFkZXIgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWc/LmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzPy5maW5kKFxyXG4gICAgICAgICAgKGhlYWRlcjogU21hcnRUYWJsZUhlYWRlcikgPT4gaGVhZGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbi5wcm9wZXJ0eU5hbWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0gPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Py5maW5kKFxyXG4gICAgICAgICAgKGZpbHRlckV4cHJlc3Npb246IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PlxyXG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgb3JkZXI7XHJcbiAgICAgICAgbGV0IG9yZGVyTnVtYmVyO1xyXG4gICAgICAgIGlmIChmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0pIHtcclxuICAgICAgICAgIG9yZGVyID1cclxuICAgICAgICAgICAgZmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlJdGVtLm9yZGVyID09PSBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeS5PcmRlckVudW0uQXNjXHJcbiAgICAgICAgICAgICAgPyBTbWFydFRhYmxlT3JkZXIuQVNDXHJcbiAgICAgICAgICAgICAgOiBTbWFydFRhYmxlT3JkZXIuREVTQztcclxuICAgICAgICAgIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXIgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAoZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSkgPT4gZmlsdGVyLnByb3BlcnR5TmFtZSA9PT0gZGVzY0NvbHVtbiEucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWduYWxMYWJlbCA9IGN1c3RvbVRhYmxlSGVhZGVyPy5sYWJlbCA/PyBkZXNjQ29sdW1uLmxhYmVsO1xyXG4gICAgICAgIGxldCBsYWJlbCA9ICcnO1xyXG4gICAgICAgIGlmICghZGVzY0NvbHVtbi5oaWRlTGFiZWwpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEudHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICAgICAgICBsYWJlbCA9IGF3YWl0IHRoaXMuc21hcnRHcmlkIS50cmFuc2xhdGVTZXJ2aWNlPy5nZXQob3JpZ25hbExhYmVsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gb3JpZ25hbExhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBjdXN0b21UYWJsZUhlYWRlcj8ucHJvcGVydGllcztcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLmdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5jdXN0b21UYWJsZUhlYWRlcixcclxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ2RhdGEuJyArIGRlc2NDb2x1bW4ucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgb3JkZXIsXHJcbiAgICAgICAgICBvcmRlck51bWJlcixcclxuICAgICAgICAgIHByb3BlcnRpZXMsXHJcbiAgICAgICAgICBzdHlsZTogZGVzY0NvbHVtbi5zdHlsZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY29tcGxlbWVudCA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbHRlcihcclxuICAgICAgKHRhYmxlSGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PlxyXG4gICAgICAgICFoZWFkZXIuc29tZSgodEg6IFNtYXJ0VGFibGVIZWFkZXIpID0+IHRILnByb3BlcnR5TmFtZS5pbmNsdWRlcyh0YWJsZUhlYWRlci5wcm9wZXJ0eU5hbWUpKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29tcGxlbWVudCkge1xyXG4gICAgICBoZWFkZXIucHVzaCguLi5jb21wbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLm9wdGlvbnM/LnNpbXBsZUJ1dHRvbnMpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLm9wdGlvbnMuc2ltcGxlQnV0dG9ucy5mb3JFYWNoKCh1aUFjdGlvbkNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ3NpbXBsZV9idXR0b25zJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVCdXR0b25UeXBlLlJBSVNFRCxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgLy8gbGFiZWw6IHRoaXMuYnV0dG9uVHJhbnNsYXRvcih7IGNvZGU6IHVpQWN0aW9uQ29kZSB9KSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IHVpQWN0aW9uQ29kZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgICAgIHNob3dCdXR0b25JZjogKHJvdzogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgcm93LmFjdGlvbnMuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvZGUgPT09IHVpQWN0aW9uQ29kZTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFoZWFkZXIuc29tZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiBoZWFkZXIucHJvcGVydHlOYW1lID09PSAnbXlfbWVudScpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8ucm93VWlBY3Rpb25UeXBlID09PSBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUpIHtcclxuICAgICAgICBsZXQgaWNvbiA9IHRoaXMuZ3JpZE1lbnVJY29uID8/ICdtb3JlX3ZlcnQnO1xyXG4gICAgICAgIGhlYWRlci5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogJ215X21lbnUnLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogU21hcnRUYWJsZUJ1dHRvblR5cGUuTUVOVSxcclxuICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICBtZW51SXRlbUJ1dHRvbnNQcm9wZXJ0eU5hbWU6ICdhY3Rpb25zJyxcclxuICAgICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICBhcmdzOiBbXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBpc1NvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNtYXJ0VGFibGVQcm9wZXJ0eShkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5PZmZzZXREYXRlVGltZScgfHxcclxuICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuTG9jYWxEYXRlVGltZSdcclxuICAgICkge1xyXG4gICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAneXl5eS5NTS5kZCBIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxyXG4gICAgICAgIGRhdGVGb3JtYXQsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcclxuICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQnO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcclxuICAgICAgICBkYXRlRm9ybWF0LFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XHJcbiAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICdIOm1tJztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXHJcbiAgICAgICAgZGF0ZUZvcm1hdCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkNIRUNLQk9YLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VQYWdlKGV2ZW50OiBQYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvZmZzZXQgPSBldmVudC5wYWdlU2l6ZSAqIGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIGxldCBsaW1pdCA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25QcmltZUNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9mZnNldCA9IGV2ZW50LmZpcnN0O1xyXG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucm93cztcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQuZmlyc3Q7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2Uuc2V0UGFnZShcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3VXVpZCEsXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgb2Zmc2V0LnRvU3RyaW5nKCksXHJcbiAgICAgIGxpbWl0LnRvU3RyaW5nKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWZyZXNoUGFydGlhbFJlc3VsdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2UucmVmcmVzaCh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBhbnlbXSwgcm93OiBhbnksIHVpQWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBfdWlBY3Rpb246IFVpQWN0aW9uO1xyXG5cclxuICAgIGlmICghdWlBY3Rpb24pIHtcclxuICAgICAgdWlBY3Rpb24gPSByb3cuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbjogVWlBY3Rpb24pID0+IGFjdGlvbi5jb2RlID09PSBhcmdzWzBdLmNvZGUpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIF91aUFjdGlvbiA9IHsgLi4udWlBY3Rpb24gfTtcclxuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcclxuICAgICAgLi4udWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBtb2RlbDogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgdWlBY3Rpb25Nb2RlbDogYW55ID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXHJcbiAgICAgIHVpQWN0aW9uOiBfdWlBY3Rpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8udWlBY3Rpb25Nb2RlbENhbGxiYWNrKSB7XHJcbiAgICAgIHVpQWN0aW9uTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucyEudWlBY3Rpb25Nb2RlbENhbGxiYWNrKHVpQWN0aW9uTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UudWlBY3Rpb25Nb2RlbCA9IHVpQWN0aW9uTW9kZWw7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlLmV4ZWN1dGUoX3VpQWN0aW9uLCB7XHJcbiAgICAgIHdpZGdldElkOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgIG5vZGVJZDogcm93LmlkLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1dHRvblRyYW5zbGF0b3IodWlBY3Rpb246IFVpQWN0aW9uKTogVWlBY3Rpb25EZXNjcmlwdG9yIHtcclxuICAgIGxldCBkZXNjID0gdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JzLmdldCh1aUFjdGlvbi5jb2RlISk7XHJcbiAgICBpZiAoIWRlc2MpIHtcclxuICAgICAgZGVzYyA9IHtcclxuICAgICAgICB0aXRsZTogdWlBY3Rpb24uY29kZSEsXHJcbiAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLkZMQVQsXHJcbiAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICh1aUFjdGlvbi5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHRoaXMudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZS5tZXJnZUFjdGlvbkRlc2NyaXB0b3JJbnRvQ2xpZW50KHVpQWN0aW9uLmRlc2NyaXB0b3IhLCBkZXNjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZXNjO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxheW91dERlZigpOiB0eXBlb2YgU21hcnRMYXlvdXREZWYge1xyXG4gICAgcmV0dXJuIFNtYXJ0TGF5b3V0RGVmO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZ3JpZFJvdzogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVPbkNsaWNrKGdyaWRSb3cpO1xyXG4gIH1cclxuICBwdWJsaWMgb25Eb3VibGVDbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU9uQ2xpY2soZ3JpZFJvdzogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgbGV0IGRlZmF1bHRSb3dBY3Rpb246IFVpQWN0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuc2VydmljZS5ncmlkTW9kZWw/LmRlZmF1bHRSb3dBY3Rpb25zKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSb3dBY3Rpb25Db2RlID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9uc1tpbmRleF07XHJcblxyXG4gICAgICAgIGRlZmF1bHRSb3dBY3Rpb24gPSBncmlkUm93LmFjdGlvbnMuZmluZChcclxuICAgICAgICAgICh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHVpQWN0aW9uLmNvZGUgPT09IGRlZmF1bHRSb3dBY3Rpb25Db2RlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZGVmYXVsdFJvd0FjdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlKFtdLCBncmlkUm93LCBkZWZhdWx0Um93QWN0aW9uKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvblNlbGVjdChyb3dJZDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnBhZ2Uucm93cz8uZmluZCgoZ3JpZFJvdzogR3JpZFJvdykgPT4gZ3JpZFJvdy5pZCA9PT0gcm93SWQpO1xyXG4gICAgY29uc3Qgdmlld0NvbnRleHRDaGFuZ2UgPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2VsZWN0KHRoaXMuc21hcnRHcmlkISwgcm93ISk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RBbGwoc2VsZWN0ZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3RBbGwodGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uU2VsZWN0Um93cyhcclxuICAgIHNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdLFxyXG4gICAgdW5zZWxlY3RlZElkczogKHN0cmluZyB8IHVuZGVmaW5lZClbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSB0cnVlO1xyXG4gICAgbGV0IHNlbGVjdGVkOiBzdHJpbmdbXSA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IGl0ZW0gIT09IHVuZGVmaW5lZCk7XHJcbiAgICBsZXQgdW5zZWxlY3RlZDogc3RyaW5nW10gPSB1bnNlbGVjdGVkSWRzLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IGl0ZW0gIT09IHVuZGVmaW5lZCk7XHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3RSb3dzKHRoaXMuc21hcnRHcmlkISwgc2VsZWN0ZWQsIHVuc2VsZWN0ZWQpO1xyXG4gICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZS5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2Uodmlld0NvbnRleHRDaGFuZ2UpO1xyXG4gICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblJvd1NlbGVjdChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdChldmVudC5kYXRhLmlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUm93VW5zZWxlY3QoZXZlbnQ6IFRhYmxlUm93VW5TZWxlY3RFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdChldmVudC5kYXRhLmlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU2VsZWN0QWxsUm93KGV2ZW50OiBUYWJsZUhlYWRlckNoZWNrYm94VG9nZ2xlRXZlbnQpIHtcclxuICAgIGF3YWl0IHRoaXMub25TZWxlY3RBbGwoZXZlbnQuY2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBlZGl0Q29sdW1ucygpOiB2b2lkIHtcclxuICAgIGxldCBkaWFsb2dEYXRhOiBTbWFydERpYWxvZ0RhdGEgPSB7XHJcbiAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICB0aXRsZTogJ09zemxvcG9rIHRlc3RyZXN6YWLDoXNhJyxcclxuICAgICAgfSxcclxuICAgICAgc2l6ZToge30sXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudDogVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50LFxyXG4gICAgICBjdXN0b21Db21wb25lbnRJbnB1dHM6IHtcclxuICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcclxuICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgICAgIHZpZXc6IHRoaXMuc2VydmljZS5ncmlkTW9kZWwudmlldyxcclxuICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4oVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XHJcbiAgfVxyXG5cclxuICAvL1BSSU1FTkdcclxuICBjb2x1bW5zOiBHcmlkQ29sdW1uTWV0YVtdID0gW107XHJcbiAgbWVudUJ1dHRvbnMhOiBNZW51SXRlbVtdO1xyXG4gIEBWaWV3Q2hpbGQoJ21lbnUnKSBtZW51ITogTWVudTtcclxuICBvbk9wdGlvbnNDbGljayhldmVudDogRXZlbnQsIHJvdzogR3JpZFJvdykge1xyXG4gICAgdGhpcy5tZW51QnV0dG9ucyA9IFtdO1xyXG5cclxuICAgIGxldCBtZW51QWN0aW9ucyA9IHRoaXMuY2FsY3VsYXRlTWVudUFjdGlvbnMocm93KTtcclxuXHJcbiAgICBtZW51QWN0aW9ucz8ubWFwKGFzeW5jICh1aUFjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgIGxldCBkZXNjID0gYXdhaXQgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLmdldEFjdGlvbkRlc2NyaXB0b3IodWlBY3Rpb24pO1xyXG5cclxuICAgICAgdGhpcy5tZW51QnV0dG9ucy5wdXNoKHtcclxuICAgICAgICBsYWJlbDogZGVzYz8udGl0bGUgPz8gdWlBY3Rpb24uY29kZSxcclxuICAgICAgICBpY29uOiBkZXNjPy5pY29uLFxyXG4gICAgICAgIGF1dG9tYXRpb25JZDogdWlBY3Rpb24uY29kZSxcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoW10sIHJvdywgdWlBY3Rpb24pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lbnUudG9nZ2xlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByZXZpb3VzbXVsdGlTb3J0TWV0YT86IFNvcnRNZXRhW107XHJcbiAgYXN5bmMgZ3JpZFNvcnQoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IG9yZGVyQnlMaXN0OiBBcnJheTxGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeT4gPSBbXTtcclxuXHJcbiAgICBldmVudC5tdWx0aXNvcnRtZXRhPy5tYXAoKG1ldGE6IFNvcnRNZXRhLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YSAmJiB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEubWFwKChvcmRlcikgPT4ge1xyXG4gICAgICAgICAgaWYgKG1ldGEuZmllbGQgPT09IG9yZGVyLmZpZWxkICYmIG9yZGVyLm9yZGVyICE9IG1ldGEub3JkZXIpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChvcmRlci5vcmRlcikge1xyXG4gICAgICAgICAgICAgIGNhc2UgLTE6XHJcbiAgICAgICAgICAgICAgICBldmVudC5tdWx0aXNvcnRtZXRhIS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YSA9IGV2ZW50Lm11bHRpc29ydG1ldGE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZXZlbnQubXVsdGlzb3J0bWV0YT8ubWFwKChtZXRhOiBhbnkpID0+IHtcclxuICAgICAgb3JkZXJCeUxpc3QucHVzaCh7XHJcbiAgICAgICAgcHJvcGVydHlOYW1lOiBtZXRhLmZpZWxkLFxyXG4gICAgICAgIG9yZGVyOlxyXG4gICAgICAgICAgbWV0YS5vcmRlciA9PT0gMVxyXG4gICAgICAgICAgICA/IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtLkFTQ1xyXG4gICAgICAgICAgICA6IG1ldGEub3JkZXIgPT09IC0xXHJcbiAgICAgICAgICAgICAgPyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5ERVNDXHJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnNvcnQodGhpcy5zbWFydEdyaWQhLCB7XHJcbiAgICAgIG9yZGVyQnlMaXN0OiBvcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyEsXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbGF6eUxvYWQoZXZlbnQ/OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcclxuICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gW107XHJcbiAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Lm1hcCgob3JkZXIpID0+IHtcclxuICAgICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGE/LnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiBvcmRlci5wcm9wZXJ0eU5hbWUhLFxyXG4gICAgICAgIG9yZGVyOiBvcmRlci5vcmRlciA9PT0gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDID8gMSA6IC0xLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgZXZlbnQhLm11bHRpU29ydE1ldGEgPSB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhlYWRlckNoYW5nZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QsXHJcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQudmFsdWUhKSxcclxuICAgIH07XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNvbE9yZGVyKGV2ZW50OiBUYWJsZUNvbHVtblJlb3JkZXJFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QsXHJcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQuY29sdW1ucyEpLFxyXG4gICAgfTtcclxuICAgIGF3YWl0IHRoaXMuc2VydmljZS51cGRhdGUodGhpcy51dWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyISwgZ3JpZFVwZGF0ZURhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JkZXJDb2x1bU5hbWVzKGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gY29sdW0ucHJvcGVydHlOYW1lO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xWYWx1ZShjb2w6IHN0cmluZywgcm93OiBhbnkpIHtcclxuICAgIGlmIChyb3cuaWNvbnNbY29sXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJldFZhbHVlID0gJyc7XHJcbiAgICBpZiAoY29sLmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgbGV0IHBhdGhBcnJheSA9IGNvbC5zcGxpdCgnLicpO1xyXG4gICAgICBsZXQgY29sVmFsdWUgPSByb3cuZGF0YTtcclxuICAgICAgcGF0aEFycmF5Lm1hcCgocGF0aCkgPT4ge1xyXG4gICAgICAgIGlmIChjb2xWYWx1ZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbFZhbHVlID0gcm93LmRhdGFbY29sXTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29sVmFsdWUgPSBjb2xWYWx1ZVtwYXRoXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXRWYWx1ZSA9IGNvbFZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0VmFsdWUgPSByb3cuZGF0YVtjb2xdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbk1ldGFCeU5hbWUpIHtcclxuICAgICAgbGV0IGNvbHVtbk1ldGEgPSB0aGlzLmNvbHVtbk1ldGFCeU5hbWUhLmdldChjb2wpO1xyXG4gICAgICBpZiAoY29sdW1uTWV0YSkge1xyXG4gICAgICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U21hcnRUYWJsZVByb3BlcnR5KGNvbHVtbk1ldGEpO1xyXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHk/LnR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZS5EQVRFOlxyXG4gICAgICAgICAgICByZXRWYWx1ZSA9IHRoaXMuc21hcnREYXRlUGlwZS50cmFuc2Zvcm0ocmV0VmFsdWUsIHByb3BlcnR5LmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZS5EQVRFVElNRTpcclxuICAgICAgICAgICAgcmV0VmFsdWUgPSB0aGlzLnNtYXJ0RGF0ZVRpbWVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUU6XHJcbiAgICAgICAgICAgIHJldFZhbHVlID0gdGhpcy5zbWFydFRpbWVQaXBlLnRyYW5zZm9ybShyZXRWYWx1ZSwgcHJvcGVydHkuZGF0ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW1hZ2VSZXNvdXJjZUljb25zKHJvdzogYW55LCBoZWFkZXI6IHN0cmluZyk6IEltYWdlUmVzb3VyY2VbXSB7XHJcbiAgICBpZiAocm93Py5pY29ucykge1xyXG4gICAgICBsZXQgaWNvbkNvZGVzID0gcm93Py5pY29uc1toZWFkZXJdO1xyXG4gICAgICByZXR1cm4gaWNvbkNvZGVzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBnZXRJbWFnZVJlc291cmNlU3R5bGUocmVzb3VyY2U6IEltYWdlUmVzb3VyY2UpOiBhbnkge1xyXG4gICAgcmV0dXJuIHJlc291cmNlLnN0eWxlID8gcmVzb3VyY2Uuc3R5bGUgOiB7fTtcclxuICB9XHJcblxyXG4gIGdldFJvd0NvbHVtbkFjdGlvbihyb3c6IGFueSwgY29sdW1uTmFtZTogc3RyaW5nKTogVWlBY3Rpb25Nb2RlbFtdIHtcclxuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuZ2V0QWN0aW9uTW9kZWxzRnJvbU1hcChcclxuICAgICAgdGhpcy5jZWxsVG9BY3Rpb25NYXAsXHJcbiAgICAgIHJvdyxcclxuICAgICAgY29sdW1uTmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNob3dDZWxsVG9vbGJhcihyb3c6IGFueSwgY29sdW1uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsLnNob3dUb29sYmFyKHJvdywgY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRTaG93T3B0aW9uc0J1dHRvbihyb3c6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5zaG93TWVudShcclxuICAgICAgcm93LFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVNZW51QWN0aW9ucyhyb3c6IEdyaWRSb3cpOiBVaUFjdGlvbltdIHtcclxuICAgIHJldHVybiBTbWFydEdyaWRUb29sYmFyQWN0aW9uc1V0aWwuY2FsY3VsYXRlTWVudUFjdGlvbnMoXHJcbiAgICAgIHJvdyxcclxuICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXMhXHJcbiAgICApO1xyXG4gIH1cclxuICBjcmVhdGVDZWxsVG9BY3Rpb25NYXAoKSB7XHJcbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORyAmJiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2Uucm93cykge1xyXG4gICAgICB0aGlzLmNlbGxUb0FjdGlvbk1hcCA9IFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5jYWxjdWxhdGVDZWxsVG9BY3Rpb25NYXAoXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlLnJvd3MhLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkLnNlcnZpY2VUb1VzZSxcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZC5ncmlkSWRlbnRpZmllclxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICByb3dUcmFja0J5Rm4oaW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcclxuICAgIHJldHVybiByb3cuaWQ7XHJcbiAgfVxyXG59XHJcbiIsIkBpZihjb21wTGliID09PSBjb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuXHJcbjxkaXYgKm5nSWY9XCJzbWFydEdyaWRcIiBjbGFzcz1cInByaW1lU21hcnRHcmlkLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRvb2xiYXJcIj5cclxuICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgPC9kaXY+XHJcbiAgPHAtdGFibGVcclxuICAgICpuZ0lmPVwiIXNtYXJ0R3JpZC5sYXlvdXREZWYgfHwgc21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVEFCTEVcIlxyXG4gICAgI3BUYWJsZVxyXG4gICAgW3ZhbHVlXT1cInNtYXJ0R3JpZC5ncmlkTW9kZWwucGFnZS5yb3dzIVwiXHJcbiAgICAob25Tb3J0KT1cImdyaWRTb3J0KCRldmVudClcIlxyXG4gICAgW2N1c3RvbVNvcnRdPVwidHJ1ZVwiXHJcbiAgICBbc29ydE1vZGVdPVwiJ211bHRpcGxlJ1wiXHJcbiAgICBbbGF6eV09XCJ0cnVlXCJcclxuICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkKCRldmVudClcIlxyXG4gICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiXHJcbiAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgIChvbkNvbFJlb3JkZXIpPVwib25Db2xPcmRlcigkZXZlbnQpXCJcclxuICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcclxuICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXHJcbiAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGVkUm93c1wiXHJcbiAgICAob25IZWFkZXJDaGVja2JveFRvZ2dsZSk9XCJvblNlbGVjdEFsbFJvdygkZXZlbnQpXCJcclxuICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgICBbZXhwYW5kZWRSb3dLZXlzXT1cImV4cGFuZGVkUm93c1wiXHJcbiAgICBbcm93RXhwYW5kTW9kZV09XCInbXVsdGlwbGUnXCJcclxuICAgIFtyb3dUcmFja0J5XT1cInJvd1RyYWNrQnlGblwiXHJcbiAgPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlQ2FwdGlvblwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnRpdGxlXCIgY2xhc3M9XCJjYXB0aW9uVGl0bGVcIj5cclxuICAgICAgICAgIHt7IHNtYXJ0R3JpZC5ncmlkTW9kZWwudGl0bGUgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnNcIj5cclxuICAgICAgICAgIDxwLW11bHRpU2VsZWN0XHJcbiAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5jb2x1bW5zXCJcclxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBjb2x1bW5zIHNlbGVjdGVkXCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgJ21pbi13aWR0aCc6ICcyMDBweCcgfVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIENvbHVtbnNcIlxyXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgQGlmIChzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1ucykge1xyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgKm5nSWY9XCJpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IC8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgID48L3RoPlxyXG4gICAgICAgIDx0aCBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBwUmVvcmRlcmFibGVDb2x1bW4+XHJcbiAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLnByb3BlcnR5TmFtZVwiIC8+XHJcbiAgICAgICAgICB7eyBjb2wubGFiZWwgfX1cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgKm5nSWY9XCJpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94IC8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgID48L3RoPlxyXG4gICAgICAgIDx0aCBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wucHJvcGVydHlOYW1lXCIgLz5cclxuICAgICAgICAgIHt7IGNvbC5sYWJlbCB9fVxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8dGg+XHJcbiAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXJUb29sYmFyXCJcclxuICAgICAgICAgICAgI2hlYWRlclRvb2xiYXJcclxuICAgICAgICAgICAgW2lkXT1cIidoZWFkZXJfbm90X2luaXRpYWxpemVkJ1wiXHJcbiAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cInNtYXJ0R3JpZC5leHBhbmRhYmxlXCI+IDwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICAgIDx0clxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldFN0eWxlKHJvdylcIlxyXG4gICAgICAgIFtjbGFzcy5yb3dFeHBhbmRlZF09XCJleHBhbmRlZFwiXHJcbiAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2socm93KVwiXHJcbiAgICAgICAgKm5nSWY9XCJyb3cgJiYgcm93LmRhdGFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIj5cclxuICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggKm5nSWY9XCJyb3cuc2VsZWN0YWJsZSAhPSBmYWxzZVwiIFt2YWx1ZV09XCJyb3dcIiAvPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XHJcbiAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJyb3dcIiAvPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygc21hcnRHcmlkPy5ncmlkTW9kZWw/LnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lc1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5pY29uc1tjb2xdXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydC10YWJsZS1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhyb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDxzbWFydC1pY29uIFtpbWFnZVJlc291cmNlXT1cImlyXCI+IDwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2VsbFRvb2xiYXIocm93LCBjb2wpXCI+XHJcbiAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dDb2x1bW5BY3Rpb24ocm93LCBjb2wpXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXJvdy5pY29uc1tjb2xdXCIgW2lubmVySHRtbF09XCJnZXRDb2xWYWx1ZShjb2wsIHJvdylcIj4gPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1idXR0b25cIj5cclxuICAgICAgICAgICAgQGlmKHNob3dDZWxsVG9vbGJhcihyb3csIGRlZmF1bHRBY3Rpb25Ub29sYmFySWQpKXtcclxuICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgW3VpQWN0aW9uTW9kZWxzXT1cImdldFJvd0NvbHVtbkFjdGlvbihyb3csIGRlZmF1bHRBY3Rpb25Ub29sYmFySWQpXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3RleHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG91bGRTaG93T3B0aW9uc0J1dHRvbihyb3cpXCJcclxuICAgICAgICAgICAgICAob25DbGljayk9XCJvbk9wdGlvbnNDbGljaygkZXZlbnQsIHJvdylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb24gaWNvbj1cImVsbGlwc2lzLXZcIj48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDwvcC1idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNtYXJ0R3JpZC5leHBhbmRhYmxlXCI+XHJcbiAgICAgICAgICA8cC1idXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgW3BSb3dUb2dnbGVyXT1cInJvd1wiXHJcbiAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxyXG4gICAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLXVwJyA6ICdwaSBwaS1jaGV2cm9uLWRvd24nXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICBAaWYoc21hcnRHcmlkLmV4cGFuZGFibGUpe1xyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJvd2V4cGFuc2lvblwiIGxldC1yb3c+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cclxuICAgICAgICAgIDxsaWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudFxyXG4gICAgICAgICAgICBbcm93SWRdPVwicm93LmlkXCJcclxuICAgICAgICAgICAgW3Jvd0V4cGFuZGVyXT1cInRoaXNcIlxyXG4gICAgICAgICAgICBbZXhwYW5kZWRDb21wb25lbnRdPVwic21hcnRHcmlkLmV4cGFuZGVkQ29tcG9uZW50XCJcclxuICAgICAgICAgICAgW3NtYXJ0R3JpZF09XCJ0aGlzLnNtYXJ0R3JpZFwiXHJcbiAgICAgICAgICA+PC9saWItZXhwYW5kZWQtcm93LXJlbmRlcmVyLWNvbXBvbmVudD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIH1cclxuICA8L3AtdGFibGU+XHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5DQVJEICYmIHNtYXJ0R3JpZC5kYXRhTGF5b3V0RGVmXCJcclxuICAgIGNsYXNzPVwiY2FyZHMtY29udGFpbmVyXCJcclxuICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgIDogJydcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXHJcbiAgICAgIGNsYXNzPVwic21hcnRHcmlkLWNhcmQtY29udGFpbmVyXCJcclxuICAgICAgKm5nRm9yPVwibGV0IHRhc2sgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICBbaXRlbV09XCJ0YXNrXCJcclxuICAgICAgW3NtYXJ0R3JpZF09XCJzbWFydEdyaWRcIlxyXG4gICAgICBbb25TZWxlY3RdPVwib25TZWxlY3QuYmluZCh0aGlzKVwiXHJcbiAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxyXG4gIDwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic21hcnRHcmlkLnBhZ2luYXRvclwiIGNsYXNzPVwicGFnaW5hdG9yLXJvd1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJwYWdpbmF0b3Itd3JhcFwiPlxyXG4gICAgPHAtcGFnaW5hdG9yXHJcbiAgICAgIFtmaXJzdF09XCJwYWdlSW5kZXghXCJcclxuICAgICAgW3RvdGFsUmVjb3Jkc109XCJsZW5ndGghXCJcclxuICAgICAgW3Jvd3NdPVwicGFnZVNpemVcIlxyXG4gICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IC8ge3RvdGFsUmVjb3Jkc31cIlxyXG4gICAgICAob25QYWdlQ2hhbmdlKT1cIm9uUHJpbWVDaGFuZ2VQYWdlKCRldmVudClcIlxyXG4gICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxyXG4gICAgICBkcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICA+PC9wLXBhZ2luYXRvcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgcEJ1dHRvblxyXG4gICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBpY29uPVwicGkgcGktcmVmcmVzaFwiXHJcbiAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgcFRvb2x0aXA9XCJGcmlzc8OtdMOpc1wiXHJcbiAgICAoY2xpY2spPVwicmVmcmVzaFBhcnRpYWxSZXN1bHRzKClcIlxyXG4gICAgKm5nSWY9XCJzbWFydEdyaWQuZ3JpZE1vZGVsPy5yZWZyZXNoRW5hYmxlZFwiXHJcbiAgPjwvYnV0dG9uPlxyXG48L2Rpdj5cclxuICA8cC1tZW51ICNtZW51IFttb2RlbF09XCJtZW51QnV0dG9uc1wiIFtwb3B1cF09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCI+IDwvcC1tZW51PlxyXG48L2Rpdj5cclxufUBlbHNlIHtcclxuPGRpdiAqbmdJZj1cInNtYXJ0R3JpZFwiIGNsYXNzPVwic21hcnRHcmlkLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRvb2xiYXJcIj5cclxuICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIChjbGljayk9XCJlZGl0Q29sdW1ucygpXCJcclxuICAgICAgbWF0LW1pbmktZmFiXHJcbiAgICAgIGNvbG9yPVwidGV4dC1wcmltYXJ5XCJcclxuICAgICAgKm5nSWY9XCJzbWFydEdyaWQuc2hvd0VkaXRDb2x1bW5zXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiQ29sdW1uc1wiIGNsYXNzPVwic21hcnQtZ3JpZC1lZGl0LWljb25cIlxyXG4gICAgICAgID52aWV3X2NvbHVtbnM8L21hdC1pY29uXHJcbiAgICAgID5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gPGRpdiBbbmdDbGFzc109XCJpc0Jsb2NrZWQgPyAnYmxvY2tlZCcgOiAnJ1wiPjwvZGl2PiAtLT5cclxuICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkQ29udGVudFwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5zaG93UmVzdWx0Q291bnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnRHcmlkLWRhdGEtbnVtYmVyXCI+XHJcbiAgICAgICAgICB7eyBzbWFydEdyaWQuZ3JpZE1vZGVsLnRvdGFsUm93Q291bnQgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10YWJsZS1jb250YWluZXJcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZT48L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkVYUEFOREFCTEVcIj5cclxuICAgICAgPHNtYXJ0LWV4cGFuZGFibGUtc2VjdGlvblxyXG4gICAgICAgICNncmlkRXhwYW5kYWJsZVNlY3Rpb25cclxuICAgICAgICAqbmdGb3I9XCJsZXQgZXhwYW5kYWJsZVNlY3Rpb24gb2YgZXhwYW5kYWJsZVNlY3Rpb25zXCJcclxuICAgICAgICBbZGF0YV09XCJleHBhbmRhYmxlU2VjdGlvblwiXHJcbiAgICAgID48L3NtYXJ0LWV4cGFuZGFibGUtc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkNBUkQgJiYgc21hcnRHcmlkLmRhdGFMYXlvdXREZWZcIlxyXG4gICAgICBjbGFzcz1cImNhcmRzLWNvbnRhaW5lclwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgOiAnJ1xyXG4gICAgICB9XCJcclxuICAgID5cclxuICAgICAgPGFwcC1zbWFydC1ncmlkLWNhcmRcclxuICAgICAgICBjbGFzcz1cInNtYXJ0R3JpZC1jYXJkLWNvbnRhaW5lclwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhc2sgb2Ygc21hcnRHcmlkLmdyaWRNb2RlbC5wYWdlLnJvd3NcIlxyXG4gICAgICAgIFtpdGVtXT1cInRhc2tcIlxyXG4gICAgICAgIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCJcclxuICAgICAgICBbb25TZWxlY3RdPVwib25TZWxlY3QuYmluZCh0aGlzKVwiXHJcbiAgICAgID48L2FwcC1zbWFydC1ncmlkLWNhcmQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5UUkVFICYmIHRyZWVDb250cm9sXCJcclxuICAgICAgY2xhc3M9XCJ0cmVlLWNvbnRhaW5lclwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICAgIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gJ3JlcGVhdCgnICsgc21hcnRHcmlkLm51bWJlck9mQ29sdW1uICsgJywgMWZyKSdcclxuICAgICAgICAgICAgOiAnJ1xyXG4gICAgICB9XCJcclxuICAgID5cclxuICAgICAgPG1hdC10cmVlIFtkYXRhU291cmNlXT1cInRyZWVEYXRhU291cmNlIVwiIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbCFcIj5cclxuICAgICAgICA8bWF0LXRyZWUtbm9kZVxyXG4gICAgICAgICAgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIlxyXG4gICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ1xyXG4gICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nSW5kZW50PVwiMjRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRpc2FibGVkIGNsYXNzPVwidHJlZS1idXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgY2xhc3M9XCJjaGVja2xpc3QtbGVhZi1ub2RlXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidHJlZU5vZGVTZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgICAgICAgICA+e3sgZ2V0VHJlZUl0ZW0obm9kZSkgfX08L21hdC1jaGVja2JveFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuXHJcbiAgICAgICAgPG1hdC10cmVlLW5vZGVcclxuICAgICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlOyB3aGVuOiBoYXNDaGlsZFwiXHJcbiAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ0luZGVudD1cIjI0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICAgICAgICBjbGFzcz1cInRyZWUtYnV0dG9uXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVG9nZ2xlICcgKyBub2RlLml0ZW1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+XHJcbiAgICAgICAgICAgICAge3sgdHJlZUNvbnRyb2whLmlzRXhwYW5kZWQobm9kZSkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19XHJcbiAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcclxuICAgICAgICAgICAgPnt7IGdldFRyZWVJdGVtKG5vZGUpIH19PC9tYXQtY2hlY2tib3hcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC10cmVlLW5vZGU+XHJcbiAgICAgIDwvbWF0LXRyZWU+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIiBjbGFzcz1cInBhZ2luYXRvci1yb3ctbWF0ZXJpYWxcIj5cclxuICA8YnV0dG9uXHJcbiAgIHBCdXR0b25cclxuICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcclxuICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcclxuICAgcFRvb2x0aXA9XCJGcmlzc8OtdMOpc1wiXHJcbiAgIChjbGljayk9XCJyZWZyZXNoUGFydGlhbFJlc3VsdHMoKVwiXHJcbiAgICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbD8ucmVmcmVzaEVuYWJsZWRcIlxyXG4gPjwvYnV0dG9uPlxyXG4gIDxtYXQtcGFnaW5hdG9yXHJcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3IgJiYgIXRyZWVDb250cm9sXCJcclxuICAgICNwYWdpbmF0b3JcclxuICAgIFtsZW5ndGhdPVwibGVuZ3RoXCJcclxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcclxuICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiXHJcbiAgPjwvbWF0LXBhZ2luYXRvcj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxuIl19