qms-angular 1.0.54 → 1.0.58

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 (479) hide show
  1. package/README.md +46 -1
  2. package/bundles/qms-angular.umd.js +6610 -13461
  3. package/bundles/qms-angular.umd.js.map +1 -1
  4. package/esm2015/lib/common/qms-icon.const.js +107 -1
  5. package/esm2015/lib/components/app-icon/app-icon.module.js +16 -29
  6. package/esm2015/lib/components/app-icon/icon-registry.service.js +8 -10
  7. package/esm2015/lib/components/badges/qms-badges.component.js +15 -24
  8. package/esm2015/lib/components/badges/qms-badges.module.js +18 -33
  9. package/esm2015/lib/components/banner/qms-banner/qms-banner.component.js +16 -28
  10. package/esm2015/lib/components/banner/qms-banner/qms-banner.module.js +19 -36
  11. package/esm2015/lib/components/banner/qms-banner-confirm/qms-banner-confirm.component.js +16 -28
  12. package/esm2015/lib/components/banner/qms-banner-confirm/qms-banner-confirm.module.js +19 -36
  13. package/esm2015/lib/components/banner/qms-banner-loading/qms-banner-loading.component.js +13 -19
  14. package/esm2015/lib/components/banner/qms-banner-loading/qms-banner-loading.module.js +17 -30
  15. package/esm2015/lib/components/breadcrumb/breadcrumb-direction-icon.directive.js +10 -11
  16. package/esm2015/lib/components/breadcrumb/breadcrumb-item.directive.js +17 -20
  17. package/esm2015/lib/components/breadcrumb/breadcrumb.js +28 -40
  18. package/esm2015/lib/components/breadcrumb/breadcrumb.module.js +26 -50
  19. package/esm2015/lib/components/button/button-toggle.js +85 -120
  20. package/esm2015/lib/components/button/button.js +78 -86
  21. package/esm2015/lib/components/button/button.module.js +27 -51
  22. package/esm2015/lib/components/comment/comment.js +18 -29
  23. package/esm2015/lib/components/dialog/dialog.js +28 -38
  24. package/esm2015/lib/components/edit-file-name-dialog/edit-file-name-dialog.js +16 -24
  25. package/esm2015/lib/components/edit-file-name-dialog/edit-file-name-dialog.module.js +31 -71
  26. package/esm2015/lib/components/list/list.js +89 -101
  27. package/esm2015/lib/components/list/list.module.js +50 -94
  28. package/esm2015/lib/components/qms-app-bar/qms-app-bar.component.js +29 -55
  29. package/esm2015/lib/components/qms-app-bar/qms-app-bar.module.js +20 -39
  30. package/esm2015/lib/components/qms-stepper/qms-stepper.component.js +22 -32
  31. package/esm2015/lib/components/qms-stepper/qms-stepper.module.js +25 -35
  32. package/esm2015/lib/components/related/content/related-content.component.js +12 -19
  33. package/esm2015/lib/components/related/list-other-related/list-related.component.js +25 -29
  34. package/esm2015/lib/components/related/model/popup-data.model.js +1 -1
  35. package/esm2015/lib/components/related/model/risk-analysis.model.js +1 -1
  36. package/esm2015/lib/components/related/popup/related-popup.component.js +80 -71
  37. package/esm2015/lib/components/related/related.module.js +44 -98
  38. package/esm2015/lib/components/related/risk/analysis/analysis.component.js +17 -23
  39. package/esm2015/lib/components/related/risk/list/list.component.js +18 -22
  40. package/esm2015/lib/components/related/risk/result/result.component.js +16 -23
  41. package/esm2015/lib/components/related/service/related-global.service.js +6 -7
  42. package/esm2015/lib/components/related/sidenav/sidenav.component.js +12 -21
  43. package/esm2015/lib/components/reports/qms-report-content-portrait/qms-report-content-portrait.component.js +18 -22
  44. package/esm2015/lib/components/reports/qms-report-cover-portrait/qms-report-cover-portrait.component.js +18 -22
  45. package/esm2015/lib/components/reports/qms-reports.module.js +20 -29
  46. package/esm2015/lib/components/rich-text/rich-text.js +32 -47
  47. package/esm2015/lib/components/rich-text/rich-text.module.js +21 -35
  48. package/esm2015/lib/components/select-dialog/select-dialog.js +16 -31
  49. package/esm2015/lib/components/select-include-children/enum/select-option-type.enum.js +7 -0
  50. package/esm2015/lib/components/select-include-children/index.js +2 -0
  51. package/esm2015/lib/components/select-include-children/model/select-option.model.js +3 -0
  52. package/esm2015/lib/components/select-include-children/model/select-popup-data.model.js +9 -0
  53. package/esm2015/lib/components/select-include-children/model/select-search-option.model.js +4 -0
  54. package/esm2015/lib/components/select-include-children/model/select.const.js +6 -0
  55. package/esm2015/lib/components/select-include-children/model/seleted-option.model.js +3 -0
  56. package/esm2015/lib/components/select-include-children/public_api.js +9 -0
  57. package/esm2015/lib/components/select-include-children/select-include-children.component.js +635 -0
  58. package/esm2015/lib/components/select-include-children/select-include-children.module.js +57 -0
  59. package/esm2015/lib/components/select-include-children/services/select-global.service.js +17 -0
  60. package/esm2015/lib/components/select-one/common/data-type.enum.js +14 -0
  61. package/esm2015/lib/components/select-one/common/document-folder-type.enum.js +12 -0
  62. package/esm2015/lib/components/select-one/common/module-type.enum.js +8 -0
  63. package/esm2015/lib/components/select-one/common/select-data.model.js +3 -0
  64. package/esm2015/lib/components/select-one/common/selected-node.model.js +3 -0
  65. package/esm2015/lib/components/select-one/common/selectone-popup-data.model.js +11 -0
  66. package/esm2015/lib/components/select-one/common/show-hide-search-result.const.js +6 -0
  67. package/esm2015/lib/components/select-one/index.js +2 -0
  68. package/esm2015/lib/components/select-one/public_api.js +7 -0
  69. package/esm2015/lib/components/select-one/select-one.component.js +343 -0
  70. package/esm2015/lib/components/select-one/select-one.module.js +53 -0
  71. package/esm2015/lib/components/select-one/service/select-one-global.service.js +17 -0
  72. package/esm2015/lib/components/suffix-field/suffix-field.directive.js +21 -22
  73. package/esm2015/lib/components/table/table-action.js +31 -31
  74. package/esm2015/lib/components/table/table.module.js +21 -37
  75. package/esm2015/lib/components/test-only/test-only.component.js +11 -14
  76. package/esm2015/lib/components/tooltip/tooltip.js +19 -24
  77. package/esm2015/lib/components/tooltip/tooltip.module.js +20 -38
  78. package/esm2015/lib/components/tree/model/tree-config.model.js +3 -0
  79. package/esm2015/lib/components/tree/model/tree-flat-node.model.js +3 -0
  80. package/esm2015/lib/components/tree/model/tree-node.model.js +3 -0
  81. package/esm2015/lib/components/tree/model/tree.model.js +3 -0
  82. package/esm2015/lib/components/tree/tree.component.js +730 -0
  83. package/esm2015/lib/components/tree/tree.function.js +96 -0
  84. package/esm2015/lib/components/tree/tree.module.js +51 -0
  85. package/esm2015/lib/components/upload-file-error-dialog/upload-file-error-dialog.js +16 -22
  86. package/esm2015/lib/components/upload-file-error-dialog/upload-file-error-dialog.module.js +31 -71
  87. package/esm2015/lib/directives/chip-input/chip-input-chip-list.directive.js +13 -13
  88. package/esm2015/lib/directives/chip-input/chip-input-field.directive.js +10 -11
  89. package/esm2015/lib/directives/chip-input/chip-input-select-dropdown.directive.js +10 -11
  90. package/esm2015/lib/directives/chip-input/chip-input-select-field.directive.js +14 -17
  91. package/esm2015/lib/directives/chip-input/chip-input-select-trigger.directive.js +13 -14
  92. package/esm2015/lib/directives/chips/chip-body.directive.js +10 -11
  93. package/esm2015/lib/directives/chips/chip.directive.js +13 -13
  94. package/esm2015/lib/directives/dropdown-menu/dropdown-item.directive.js +14 -16
  95. package/esm2015/lib/directives/file-upload/file-upload-attachment-list.directive.js +10 -11
  96. package/esm2015/lib/directives/file-upload/file-upload-display.directive.js +16 -19
  97. package/esm2015/lib/directives/file-upload/file-upload-multiple-display.directive.js +14 -16
  98. package/esm2015/lib/directives/file-upload/file-upload-multiple-selector.directive.js +20 -26
  99. package/esm2015/lib/directives/file-upload/file-upload-multiple.directive.js +15 -19
  100. package/esm2015/lib/directives/file-upload/file-upload-scrollable-attachment-list.directive.js +10 -11
  101. package/esm2015/lib/directives/file-upload/file-upload-selector.directive.js +18 -25
  102. package/esm2015/lib/directives/file-upload/file-upload.directive.js +20 -24
  103. package/esm2015/lib/directives/form.directive.js +51 -48
  104. package/esm2015/lib/directives/margin.directive.js +14 -15
  105. package/esm2015/lib/directives/range-slider/range-slider-lockup.directive.js +10 -11
  106. package/esm2015/lib/directives/range-slider/range-slider.directive.js +14 -17
  107. package/esm2015/lib/directives/scroll-selected/scroll-to-selected.directive.js +15 -16
  108. package/esm2015/lib/directives/scrollbar/scrollbar.directive.js +13 -13
  109. package/esm2015/lib/directives/search-field.directive.js +22 -21
  110. package/esm2015/lib/directives/side-sheet/drawer-content.directive.js +10 -11
  111. package/esm2015/lib/directives/side-sheet/drawer-header-action.directive.js +10 -11
  112. package/esm2015/lib/directives/side-sheet/drawer-header.directive.js +10 -11
  113. package/esm2015/lib/directives/side-sheet/drawer.directive.js +10 -11
  114. package/esm2015/lib/directives/tab/tab-group-advanced.directive.js +14 -15
  115. package/esm2015/lib/directives/tab/tab-group.directive.js +10 -11
  116. package/esm2015/lib/directives/tab/tab-label.directive.js +10 -11
  117. package/esm2015/lib/directives/text-block/text-block-line.directive.js +16 -20
  118. package/esm2015/lib/directives/text-block/text-block.directive.js +14 -17
  119. package/esm2015/lib/directives/tooltip/tooltip-image.directive.js +13 -14
  120. package/esm2015/lib/directives/tooltip/tooltip-renderer.directive.js +22 -35
  121. package/esm2015/lib/material-module.js +16 -35
  122. package/esm2015/lib/model/en.js +4 -35
  123. package/esm2015/lib/model/no.js +3 -34
  124. package/esm2015/lib/pipe/dateFormat.pipe.js +10 -11
  125. package/esm2015/lib/qms-angular.component.js +11 -13
  126. package/esm2015/lib/qms-angular.module.js +121 -232
  127. package/esm2015/lib/qms-angular.service.js +8 -9
  128. package/esm2015/lib/qms-ckeditor-components/common/bpmn/toolbar.function.js +12 -32
  129. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.js +1 -5
  130. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.js +1 -10
  131. package/esm2015/lib/qms-ckeditor-components/common/enums/document-type.enum.js +1 -2
  132. package/esm2015/lib/qms-ckeditor-components/common/functions/common.function.js +2 -2
  133. package/esm2015/lib/qms-ckeditor-components/common/module/confirm/qms-ckeditor-confirm.component.js +16 -23
  134. package/esm2015/lib/qms-ckeditor-components/common/module/tree/qms-ckeditor-tree.component.js +19 -34
  135. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.js +53 -577
  136. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.js +35 -69
  137. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-fullscreen/qms-ckeditor-fullscreen.component.js +8 -12
  138. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.js +30 -39
  139. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/attachments/link-attachment.component.js +18 -22
  140. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-link/qms-ckeditor-link.component.js +20 -29
  141. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-load-template/qms-ckeditor-load-template.component.js +18 -22
  142. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-relation/qmsckeditor-related.component.js +23 -35
  143. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-template/qms-ckeditor-template.component.js +20 -30
  144. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-tooltip/qms-ckeditor-tooltip.component.js +18 -27
  145. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor-base.component.js +4 -7
  146. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.component.js +44 -118
  147. package/esm2015/lib/qms-ckeditor-components/qms-ckeditor.module.js +55 -131
  148. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-base.service.js +10 -10
  149. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.js +9 -9
  150. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.js +26 -66
  151. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-global.service.js +8 -9
  152. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-link.service.js +9 -9
  153. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-tree.service.js +9 -9
  154. package/esm2015/lib/qms-ckeditor-components/services/qms-ckedtior-template.service.js +9 -9
  155. package/esm2015/lib/services/translation-registry.service.js +8 -9
  156. package/esm2015/lib/shared.module.js +4 -9
  157. package/esm2015/public-api.js +10 -22
  158. package/esm2015/qms-angular.js +9 -1
  159. package/fesm2015/qms-angular.js +5337 -12118
  160. package/fesm2015/qms-angular.js.map +1 -1
  161. package/lib/common/qms-icon.const.d.ts +23 -0
  162. package/lib/components/app-icon/app-icon.module.d.ts +0 -7
  163. package/lib/components/app-icon/icon-registry.service.d.ts +0 -3
  164. package/lib/components/badges/qms-badges.component.d.ts +0 -3
  165. package/lib/components/badges/qms-badges.module.d.ts +0 -9
  166. package/lib/components/banner/qms-banner/qms-banner.component.d.ts +0 -3
  167. package/lib/components/banner/qms-banner/qms-banner.module.d.ts +0 -10
  168. package/lib/components/banner/qms-banner-confirm/qms-banner-confirm.component.d.ts +0 -3
  169. package/lib/components/banner/qms-banner-confirm/qms-banner-confirm.module.d.ts +0 -10
  170. package/lib/components/banner/qms-banner-loading/qms-banner-loading.component.d.ts +0 -3
  171. package/lib/components/banner/qms-banner-loading/qms-banner-loading.module.d.ts +0 -8
  172. package/lib/components/breadcrumb/breadcrumb-direction-icon.directive.d.ts +0 -3
  173. package/lib/components/breadcrumb/breadcrumb-item.directive.d.ts +0 -3
  174. package/lib/components/breadcrumb/breadcrumb.d.ts +0 -3
  175. package/lib/components/breadcrumb/breadcrumb.module.d.ts +0 -13
  176. package/lib/components/button/button-toggle.d.ts +0 -5
  177. package/lib/components/button/button.d.ts +0 -7
  178. package/lib/components/button/button.module.d.ts +0 -9
  179. package/lib/components/comment/comment.d.ts +0 -3
  180. package/lib/components/dialog/dialog.d.ts +0 -5
  181. package/lib/components/edit-file-name-dialog/edit-file-name-dialog.d.ts +0 -3
  182. package/lib/components/edit-file-name-dialog/edit-file-name-dialog.module.d.ts +0 -16
  183. package/lib/components/list/list.d.ts +0 -15
  184. package/lib/components/list/list.module.d.ts +0 -11
  185. package/lib/components/qms-app-bar/qms-app-bar.component.d.ts +0 -3
  186. package/lib/components/qms-app-bar/qms-app-bar.module.d.ts +0 -12
  187. package/lib/components/qms-stepper/qms-stepper.component.d.ts +0 -3
  188. package/lib/components/qms-stepper/qms-stepper.module.d.ts +0 -8
  189. package/lib/components/related/content/related-content.component.d.ts +0 -3
  190. package/lib/components/related/list-other-related/list-related.component.d.ts +0 -3
  191. package/lib/components/related/model/popup-data.model.d.ts +2 -2
  192. package/lib/components/related/model/risk-analysis.model.d.ts +2 -2
  193. package/lib/components/related/popup/related-popup.component.d.ts +4 -17
  194. package/lib/components/related/related.module.d.ts +0 -29
  195. package/lib/components/related/risk/analysis/analysis.component.d.ts +3 -14
  196. package/lib/components/related/risk/list/list.component.d.ts +1 -4
  197. package/lib/components/related/risk/result/result.component.d.ts +0 -3
  198. package/lib/components/related/service/related-global.service.d.ts +0 -3
  199. package/lib/components/related/sidenav/sidenav.component.d.ts +0 -3
  200. package/lib/components/reports/qms-report-content-portrait/qms-report-content-portrait.component.d.ts +0 -3
  201. package/lib/components/reports/qms-report-cover-portrait/qms-report-cover-portrait.component.d.ts +0 -3
  202. package/lib/components/reports/qms-reports.module.d.ts +0 -7
  203. package/lib/components/rich-text/rich-text.d.ts +0 -3
  204. package/lib/components/rich-text/rich-text.module.d.ts +0 -8
  205. package/lib/components/select-dialog/select-dialog.d.ts +0 -3
  206. package/lib/components/select-include-children/enum/select-option-type.enum.d.ts +5 -0
  207. package/lib/components/select-include-children/index.d.ts +1 -0
  208. package/lib/components/select-include-children/model/select-option.model.d.ts +11 -0
  209. package/lib/components/select-include-children/model/select-popup-data.model.d.ts +15 -0
  210. package/lib/components/select-include-children/model/select-search-option.model.d.ts +7 -0
  211. package/lib/components/select-include-children/model/select.const.d.ts +5 -0
  212. package/lib/components/select-include-children/model/seleted-option.model.d.ts +15 -0
  213. package/lib/components/select-include-children/public_api.d.ts +8 -0
  214. package/lib/components/select-include-children/select-include-children.component.d.ts +99 -0
  215. package/lib/components/select-include-children/select-include-children.module.d.ts +2 -0
  216. package/lib/components/select-include-children/services/select-global.service.d.ts +7 -0
  217. package/lib/components/select-one/common/data-type.enum.d.ts +12 -0
  218. package/lib/components/select-one/common/document-folder-type.enum.d.ts +10 -0
  219. package/lib/components/select-one/common/module-type.enum.d.ts +6 -0
  220. package/lib/components/select-one/common/select-data.model.d.ts +12 -0
  221. package/lib/components/select-one/common/selected-node.model.d.ts +12 -0
  222. package/lib/components/select-one/common/selectone-popup-data.model.d.ts +12 -0
  223. package/lib/components/select-one/common/show-hide-search-result.const.d.ts +5 -0
  224. package/lib/components/select-one/index.d.ts +1 -0
  225. package/lib/components/select-one/public_api.d.ts +6 -0
  226. package/lib/components/select-one/select-one.component.d.ts +77 -0
  227. package/lib/components/select-one/select-one.module.d.ts +2 -0
  228. package/lib/components/select-one/service/select-one-global.service.d.ts +7 -0
  229. package/lib/components/suffix-field/suffix-field.directive.d.ts +0 -5
  230. package/lib/components/table/table-action.d.ts +0 -5
  231. package/lib/components/table/table.module.d.ts +0 -8
  232. package/lib/components/test-only/test-only.component.d.ts +0 -3
  233. package/lib/components/tooltip/tooltip.d.ts +0 -3
  234. package/lib/components/tooltip/tooltip.module.d.ts +0 -9
  235. package/lib/components/{related → tree}/model/tree-config.model.d.ts +2 -2
  236. package/lib/components/tree/model/tree-flat-node.model.d.ts +11 -0
  237. package/lib/components/{related → tree}/model/tree-node.model.d.ts +0 -0
  238. package/lib/components/{related → tree}/model/tree.model.d.ts +0 -0
  239. package/lib/components/{related/tree → tree}/tree.component.d.ts +11 -19
  240. package/lib/components/{related/common → tree}/tree.function.d.ts +2 -2
  241. package/lib/components/tree/tree.module.d.ts +2 -0
  242. package/lib/components/upload-file-error-dialog/upload-file-error-dialog.d.ts +0 -3
  243. package/lib/components/upload-file-error-dialog/upload-file-error-dialog.module.d.ts +0 -16
  244. package/lib/directives/chip-input/chip-input-chip-list.directive.d.ts +0 -3
  245. package/lib/directives/chip-input/chip-input-field.directive.d.ts +0 -3
  246. package/lib/directives/chip-input/chip-input-select-dropdown.directive.d.ts +0 -3
  247. package/lib/directives/chip-input/chip-input-select-field.directive.d.ts +0 -3
  248. package/lib/directives/chip-input/chip-input-select-trigger.directive.d.ts +0 -3
  249. package/lib/directives/chips/chip-body.directive.d.ts +0 -3
  250. package/lib/directives/chips/chip.directive.d.ts +0 -3
  251. package/lib/directives/dropdown-menu/dropdown-item.directive.d.ts +0 -3
  252. package/lib/directives/file-upload/file-upload-attachment-list.directive.d.ts +0 -3
  253. package/lib/directives/file-upload/file-upload-display.directive.d.ts +0 -3
  254. package/lib/directives/file-upload/file-upload-multiple-display.directive.d.ts +0 -3
  255. package/lib/directives/file-upload/file-upload-multiple-selector.directive.d.ts +0 -3
  256. package/lib/directives/file-upload/file-upload-multiple.directive.d.ts +0 -3
  257. package/lib/directives/file-upload/file-upload-scrollable-attachment-list.directive.d.ts +0 -3
  258. package/lib/directives/file-upload/file-upload-selector.directive.d.ts +0 -3
  259. package/lib/directives/file-upload/file-upload.directive.d.ts +0 -5
  260. package/lib/directives/form.directive.d.ts +0 -11
  261. package/lib/directives/margin.directive.d.ts +0 -3
  262. package/lib/directives/range-slider/range-slider-lockup.directive.d.ts +0 -3
  263. package/lib/directives/range-slider/range-slider.directive.d.ts +0 -3
  264. package/lib/directives/scroll-selected/scroll-to-selected.directive.d.ts +0 -3
  265. package/lib/directives/scrollbar/scrollbar.directive.d.ts +0 -3
  266. package/lib/directives/search-field.directive.d.ts +0 -5
  267. package/lib/directives/side-sheet/drawer-content.directive.d.ts +0 -3
  268. package/lib/directives/side-sheet/drawer-header-action.directive.d.ts +0 -3
  269. package/lib/directives/side-sheet/drawer-header.directive.d.ts +0 -3
  270. package/lib/directives/side-sheet/drawer.directive.d.ts +0 -3
  271. package/lib/directives/tab/tab-group-advanced.directive.d.ts +0 -3
  272. package/lib/directives/tab/tab-group.directive.d.ts +0 -3
  273. package/lib/directives/tab/tab-label.directive.d.ts +0 -3
  274. package/lib/directives/text-block/text-block-line.directive.d.ts +0 -3
  275. package/lib/directives/text-block/text-block.directive.d.ts +0 -3
  276. package/lib/directives/tooltip/tooltip-image.directive.d.ts +0 -3
  277. package/lib/directives/tooltip/tooltip-renderer.directive.d.ts +0 -3
  278. package/lib/material-module.d.ts +0 -12
  279. package/lib/model/en.d.ts +0 -31
  280. package/lib/model/no.d.ts +0 -31
  281. package/lib/pipe/dateFormat.pipe.d.ts +0 -3
  282. package/lib/qms-angular.component.d.ts +0 -3
  283. package/lib/qms-angular.module.d.ts +0 -49
  284. package/lib/qms-angular.service.d.ts +0 -3
  285. package/lib/qms-ckeditor-components/common/bpmn/toolbar.function.d.ts +2 -2
  286. package/lib/qms-ckeditor-components/common/constants/ckeditorEvent.constant.d.ts +0 -4
  287. package/lib/qms-ckeditor-components/common/constants/ckeditorFlowchart.const.d.ts +0 -9
  288. package/lib/qms-ckeditor-components/common/enums/document-type.enum.d.ts +0 -1
  289. package/lib/qms-ckeditor-components/common/module/confirm/qms-ckeditor-confirm.component.d.ts +0 -3
  290. package/lib/qms-ckeditor-components/common/module/tree/qms-ckeditor-tree.component.d.ts +0 -3
  291. package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.d.ts +4 -88
  292. package/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/save-template/save-template.component.d.ts +2 -11
  293. package/lib/qms-ckeditor-components/components/qms-ckeditor-fullscreen/qms-ckeditor-fullscreen.component.d.ts +0 -3
  294. package/lib/qms-ckeditor-components/components/qms-ckeditor-imagemap/qms-ckeditor-imagemap.component.d.ts +0 -3
  295. package/lib/qms-ckeditor-components/components/qms-ckeditor-link/attachments/link-attachment.component.d.ts +0 -3
  296. package/lib/qms-ckeditor-components/components/qms-ckeditor-link/qms-ckeditor-link.component.d.ts +0 -3
  297. package/lib/qms-ckeditor-components/components/qms-ckeditor-load-template/qms-ckeditor-load-template.component.d.ts +0 -3
  298. package/lib/qms-ckeditor-components/components/qms-ckeditor-relation/qmsckeditor-related.component.d.ts +0 -4
  299. package/lib/qms-ckeditor-components/components/qms-ckeditor-template/qms-ckeditor-template.component.d.ts +0 -3
  300. package/lib/qms-ckeditor-components/components/qms-ckeditor-tooltip/qms-ckeditor-tooltip.component.d.ts +0 -3
  301. package/lib/qms-ckeditor-components/qms-ckeditor-base.component.d.ts +0 -3
  302. package/lib/qms-ckeditor-components/qms-ckeditor.component.d.ts +0 -8
  303. package/lib/qms-ckeditor-components/qms-ckeditor.module.d.ts +0 -44
  304. package/lib/qms-ckeditor-components/services/qms-ckeditor-base.service.d.ts +0 -3
  305. package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn-api.service.d.ts +0 -3
  306. package/lib/qms-ckeditor-components/services/qms-ckeditor-bpmn.service.d.ts +0 -4
  307. package/lib/qms-ckeditor-components/services/qms-ckeditor-global.service.d.ts +0 -3
  308. package/lib/qms-ckeditor-components/services/qms-ckeditor-link.service.d.ts +0 -3
  309. package/lib/qms-ckeditor-components/services/qms-ckeditor-tree.service.d.ts +0 -3
  310. package/lib/qms-ckeditor-components/services/qms-ckedtior-template.service.d.ts +0 -3
  311. package/lib/services/translation-registry.service.d.ts +0 -3
  312. package/lib/shared.module.d.ts +0 -4
  313. package/lib.theme.scss +0 -8
  314. package/package.json +2 -1
  315. package/public-api.d.ts +9 -20
  316. package/qms-angular.d.ts +8 -1
  317. package/qms-angular.metadata.json +1 -0
  318. package/src/assets/jointjs/scss/bpmn.scss +63 -64
  319. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js +1 -1
  320. package/src/assets/qms-ckeditor-plugin/build/ckeditor.js.map +1 -1
  321. package/src/assets/qms-ckeditor-plugin/build/translations/ar.js +1 -1
  322. package/src/assets/qms-ckeditor-plugin/build/translations/az.js +1 -1
  323. package/src/assets/qms-ckeditor-plugin/build/translations/bg.js +1 -1
  324. package/src/assets/qms-ckeditor-plugin/build/translations/cs.js +1 -1
  325. package/src/assets/qms-ckeditor-plugin/build/translations/da.js +1 -1
  326. package/src/assets/qms-ckeditor-plugin/build/translations/de-ch.js +1 -1
  327. package/src/assets/qms-ckeditor-plugin/build/translations/de.js +1 -1
  328. package/src/assets/qms-ckeditor-plugin/build/translations/en-au.js +1 -1
  329. package/src/assets/qms-ckeditor-plugin/build/translations/en-gb.js +1 -1
  330. package/src/assets/qms-ckeditor-plugin/build/translations/es.js +1 -1
  331. package/src/assets/qms-ckeditor-plugin/build/translations/et.js +1 -1
  332. package/src/assets/qms-ckeditor-plugin/build/translations/fa.js +1 -1
  333. package/src/assets/qms-ckeditor-plugin/build/translations/fi.js +1 -1
  334. package/src/assets/qms-ckeditor-plugin/build/translations/fr.js +1 -1
  335. package/src/assets/qms-ckeditor-plugin/build/translations/gl.js +1 -1
  336. package/src/assets/qms-ckeditor-plugin/build/translations/he.js +1 -1
  337. package/src/assets/qms-ckeditor-plugin/build/translations/hi.js +1 -1
  338. package/src/assets/qms-ckeditor-plugin/build/translations/hr.js +1 -1
  339. package/src/assets/qms-ckeditor-plugin/build/translations/hu.js +1 -1
  340. package/src/assets/qms-ckeditor-plugin/build/translations/id.js +1 -1
  341. package/src/assets/qms-ckeditor-plugin/build/translations/it.js +1 -1
  342. package/src/assets/qms-ckeditor-plugin/build/translations/ja.js +1 -1
  343. package/src/assets/qms-ckeditor-plugin/build/translations/ko.js +1 -1
  344. package/src/assets/qms-ckeditor-plugin/build/translations/ku.js +1 -1
  345. package/src/assets/qms-ckeditor-plugin/build/translations/lt.js +1 -1
  346. package/src/assets/qms-ckeditor-plugin/build/translations/lv.js +1 -1
  347. package/src/assets/qms-ckeditor-plugin/build/translations/nb.js +1 -1
  348. package/src/assets/qms-ckeditor-plugin/build/translations/ne.js +1 -1
  349. package/src/assets/qms-ckeditor-plugin/build/translations/nl.js +1 -1
  350. package/src/assets/qms-ckeditor-plugin/build/translations/no.js +1 -1
  351. package/src/assets/qms-ckeditor-plugin/build/translations/pl.js +1 -1
  352. package/src/assets/qms-ckeditor-plugin/build/translations/pt-br.js +1 -1
  353. package/src/assets/qms-ckeditor-plugin/build/translations/ro.js +1 -1
  354. package/src/assets/qms-ckeditor-plugin/build/translations/ru.js +1 -1
  355. package/src/assets/qms-ckeditor-plugin/build/translations/sk.js +1 -1
  356. package/src/assets/qms-ckeditor-plugin/build/translations/sl.js +1 -1
  357. package/src/assets/qms-ckeditor-plugin/build/translations/sq.js +1 -1
  358. package/src/assets/qms-ckeditor-plugin/build/translations/sr-latn.js +1 -1
  359. package/src/assets/qms-ckeditor-plugin/build/translations/sr.js +1 -1
  360. package/src/assets/qms-ckeditor-plugin/build/translations/sv.js +1 -1
  361. package/src/assets/qms-ckeditor-plugin/build/translations/th.js +1 -1
  362. package/src/assets/qms-ckeditor-plugin/build/translations/tk.js +1 -1
  363. package/src/assets/qms-ckeditor-plugin/build/translations/tr.js +1 -1
  364. package/src/assets/qms-ckeditor-plugin/build/translations/ug.js +1 -1
  365. package/src/assets/qms-ckeditor-plugin/build/translations/uk.js +1 -1
  366. package/src/assets/qms-ckeditor-plugin/build/translations/vi.js +1 -1
  367. package/src/assets/qms-ckeditor-plugin/build/translations/zh-cn.js +1 -1
  368. package/src/assets/qms-ckeditor-plugin/build/translations/zh.js +1 -1
  369. package/src/assets/qms-ckeditor-plugin/package-lock.json +9 -12198
  370. package/src/assets/qms-ckeditor-plugin/package.json +0 -1
  371. package/src/assets/qms-ckeditor-plugin/src/ckeditor.js +3 -22
  372. package/src/assets/qms-ckeditor-plugin/src/plugins/bpmn/qmsCKEditorBpmnPlugin.js +5 -24
  373. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorConstant.js +1 -7
  374. package/src/assets/qms-ckeditor-plugin/src/plugins/common/qmsCKEditorService.js +0 -20
  375. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapediting.js +43 -47
  376. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/imagemapui.js +1 -1
  377. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/insertimagemapcommand.js +108 -72
  378. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/resizeimagemapcommand.js +3 -4
  379. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/utils.js +0 -13
  380. package/src/assets/qms-ckeditor-plugin/src/plugins/timestamp/timestamp.js +8 -8
  381. package/src/assets/qms-ckeditor-plugin/src/plugins/tooltip/tooltipui.js +24 -23
  382. package/src/assets/qms-ckeditor-plugin/src/themes/icons/information.svg +50 -1
  383. package/src/assets/qms-ckeditor-plugin/src/themes/icons/timestamp.svg +1 -1
  384. package/src/lib/components/qms-app-bar/qms-app-bar.component.scss +7 -0
  385. package/src/lib/components/select-include-children/select-include-children.component.scss +309 -0
  386. package/src/lib/components/select-one/select-one.component.scss +240 -0
  387. package/src/lib/components/{related/tree → tree}/tree.component.scss +4 -4
  388. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-bpmn/qms-ckeditor-bpmn.component.scss +1 -15
  389. package/src/lib/qms-ckeditor-components/styles/_layout.scss +0 -24
  390. package/src/lib/qms-ckeditor-components/styles/_modules.scss +0 -8
  391. package/src/themes/_non-bg-scrollbar.scss +33 -0
  392. package/src/themes/_scrollbar.scss +3 -10
  393. package/esm2015/lib/components/related/common/qms-icon.const.js +0 -107
  394. package/esm2015/lib/components/related/common/tree.function.js +0 -96
  395. package/esm2015/lib/components/related/model/tree-config.model.js +0 -3
  396. package/esm2015/lib/components/related/model/tree-node.model.js +0 -3
  397. package/esm2015/lib/components/related/model/tree.model.js +0 -3
  398. package/esm2015/lib/components/related/tree/tree.component.js +0 -684
  399. package/esm2015/lib/qms-ckeditor-components/common/constants/ckeditorLink.constant.js +0 -7
  400. package/esm2015/lib/qms-ckeditor-components/common/enums/shape-flow-chart-connection-type.js +0 -8
  401. package/esm2015/lib/qms-ckeditor-components/common/flowchart/sample/sample-graphs.js +0 -16
  402. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/halo-service.js +0 -105
  403. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/inspector-service.js +0 -3762
  404. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/keyboard-service.js +0 -68
  405. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/kitchensink-service.js +0 -372
  406. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/stencil-service.js +0 -1041
  407. package/esm2015/lib/qms-ckeditor-components/common/flowchart/service/toolbar-service.js +0 -326
  408. package/esm2015/lib/qms-ckeditor-components/common/flowchart/shapes/app-shapes.js +0 -318
  409. package/esm2015/lib/qms-ckeditor-components/common/flowchart/themes/theme-picker.js +0 -80
  410. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-flowchart-template.model.js +0 -9
  411. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-flowchart.model.js +0 -9
  412. package/esm2015/lib/qms-ckeditor-components/common/models/qms-ckeditor-save-as-template.model.js +0 -3
  413. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-about/qms-ckeditor-about.component.js +0 -43
  414. package/esm2015/lib/qms-ckeditor-components/components/qms-ckeditor-flowchart/qms-ckeditor-flowchart.component.js +0 -322
  415. package/esm2015/lib/qms-ckeditor-components/models/qms-ckeditor-bpmn-data.model.js +0 -8
  416. package/esm2015/lib/qms-ckeditor-components/services/qms-ckeditor-flowchart.service.js +0 -26
  417. package/lib/components/related/common/qms-icon.const.d.ts +0 -23
  418. package/lib/qms-ckeditor-components/common/constants/ckeditorLink.constant.d.ts +0 -6
  419. package/lib/qms-ckeditor-components/common/enums/shape-flow-chart-connection-type.d.ts +0 -6
  420. package/lib/qms-ckeditor-components/common/flowchart/sample/sample-graphs.d.ts +0 -14
  421. package/lib/qms-ckeditor-components/common/flowchart/service/halo-service.d.ts +0 -48
  422. package/lib/qms-ckeditor-components/common/flowchart/service/inspector-service.d.ts +0 -18
  423. package/lib/qms-ckeditor-components/common/flowchart/service/keyboard-service.d.ts +0 -17
  424. package/lib/qms-ckeditor-components/common/flowchart/service/kitchensink-service.d.ts +0 -62
  425. package/lib/qms-ckeditor-components/common/flowchart/service/stencil-service.d.ts +0 -1183
  426. package/lib/qms-ckeditor-components/common/flowchart/service/toolbar-service.d.ts +0 -216
  427. package/lib/qms-ckeditor-components/common/flowchart/shapes/app-shapes.d.ts +0 -61
  428. package/lib/qms-ckeditor-components/common/flowchart/themes/theme-picker.d.ts +0 -36
  429. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-flowchart-template.model.d.ts +0 -7
  430. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-flowchart.model.d.ts +0 -7
  431. package/lib/qms-ckeditor-components/common/models/qms-ckeditor-save-as-template.model.d.ts +0 -7
  432. package/lib/qms-ckeditor-components/components/qms-ckeditor-about/qms-ckeditor-about.component.d.ts +0 -18
  433. package/lib/qms-ckeditor-components/components/qms-ckeditor-flowchart/qms-ckeditor-flowchart.component.d.ts +0 -44
  434. package/lib/qms-ckeditor-components/models/qms-ckeditor-bpmn-data.model.d.ts +0 -7
  435. package/lib/qms-ckeditor-components/services/qms-ckeditor-flowchart.service.d.ts +0 -13
  436. package/src/assets/images/ckeditor5.svg +0 -1
  437. package/src/assets/jointjs/fonts/Alegreya_Sans/AlegreyaSans-Bold.ttf +0 -0
  438. package/src/assets/jointjs/fonts/Alegreya_Sans/AlegreyaSans-Light.ttf +0 -0
  439. package/src/assets/jointjs/fonts/Alegreya_Sans/AlegreyaSans-Regular.ttf +0 -0
  440. package/src/assets/jointjs/fonts/Alegreya_Sans/OFL.txt +0 -92
  441. package/src/assets/jointjs/fonts/Averia_Libre/AveriaLibre-Bold.ttf +0 -0
  442. package/src/assets/jointjs/fonts/Averia_Libre/AveriaLibre-Light.ttf +0 -0
  443. package/src/assets/jointjs/fonts/Averia_Libre/AveriaLibre-Regular.ttf +0 -0
  444. package/src/assets/jointjs/fonts/Averia_Libre/OFL.txt +0 -93
  445. package/src/assets/jointjs/fonts/Roboto_Condensed/LICENSE.txt +0 -202
  446. package/src/assets/jointjs/fonts/Roboto_Condensed/RobotoCondensed-Bold.ttf +0 -0
  447. package/src/assets/jointjs/fonts/Roboto_Condensed/RobotoCondensed-Light.ttf +0 -0
  448. package/src/assets/jointjs/fonts/Roboto_Condensed/RobotoCondensed-Regular.ttf +0 -0
  449. package/src/assets/jointjs/images/delete-icon-modern.png +0 -0
  450. package/src/assets/jointjs/images/image-icon1.svg +0 -1
  451. package/src/assets/jointjs/images/image-icon2.svg +0 -6
  452. package/src/assets/jointjs/images/image-icon3.svg +0 -11
  453. package/src/assets/jointjs/images/image-icon4.svg +0 -8
  454. package/src/assets/jointjs/images/member-female.png +0 -0
  455. package/src/assets/jointjs/images/member-male.png +0 -0
  456. package/src/assets/jointjs/images/no-color-icon.svg +0 -72
  457. package/src/assets/jointjs/images/reset-icon-modern.png +0 -0
  458. package/src/assets/jointjs/images/save-icon-modern.png +0 -0
  459. package/src/assets/jointjs/images/to-front-icon-modern.png +0 -0
  460. package/src/assets/jointjs/images/toback-icon-modern.png +0 -0
  461. package/src/assets/jointjs/images/toolbar-icons-dark.woff +0 -0
  462. package/src/assets/jointjs/images/toolbar-icons-material.png +0 -0
  463. package/src/assets/jointjs/images/toolbar-icons-modern.png +0 -0
  464. package/src/assets/jointjs/images/transparent-icon.svg +0 -50
  465. package/src/assets/jointjs/scss/style.dark.scss +0 -233
  466. package/src/assets/jointjs/scss/style.material.scss +0 -234
  467. package/src/assets/jointjs/scss/style.modern.scss +0 -225
  468. package/src/assets/jointjs/scss/style.scss +0 -216
  469. package/src/assets/jointjs/scss/theme-picker.scss +0 -21
  470. package/src/assets/qms-ckeditor-plugin/src/dist/ckeditor.dev.js +0 -173
  471. package/src/assets/qms-ckeditor-plugin/src/plugins/aboutckeditor/aboutckeditor.js +0 -28
  472. package/src/assets/qms-ckeditor-plugin/src/plugins/flowchart/qmsCKEditorFlowchartPlugin.js +0 -63
  473. package/src/assets/qms-ckeditor-plugin/src/plugins/fullscreen/dist/qmsCKEditorFullscreenPlugin.dev.js +0 -87
  474. package/src/assets/qms-ckeditor-plugin/src/plugins/imagemap/openimagemapcommand.js +0 -58
  475. package/src/assets/qms-ckeditor-plugin/src/themes/icons/flowchart.svg +0 -507
  476. package/src/assets/qms-ckeditor-plugin/src/themes/icons/tooltip.svg +0 -1
  477. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-about/qms-ckeditor-about.component.scss +0 -16
  478. package/src/lib/qms-ckeditor-components/components/qms-ckeditor-flowchart/qms-ckeditor-flowchart.component.scss +0 -5
  479. package/src/themes/_non-bg-srcollbar.scss +0 -4
@@ -1,684 +0,0 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { FlatTreeControl } from '@angular/cdk/tree';
3
- import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
4
- import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
5
- import { DataType } from '../common/data-type.enum';
6
- import { DocumentNodeType } from '../common/document-folder-type.enum';
7
- import { ItemIconType } from '../common/item-icon-type.enum';
8
- import { KEYBOARD_DOWN_ICON, KEYBOARD_UP_ICON } from '../common/qms-icon.const';
9
- import { RelatedConst } from '../common/related.const';
10
- import TreeFunctions from '../common/tree.function';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/platform-browser";
13
- import * as i2 from "@angular/material/icon";
14
- import * as i3 from "../../app-icon/icon-registry.service";
15
- import * as i4 from "@angular/material/tree";
16
- import * as i5 from "@angular/material/checkbox";
17
- import * as i6 from "@angular/material/button";
18
- import * as i7 from "@angular/common";
19
- import * as i8 from "../../../directives/form.directive";
20
- export class TreeComponent {
21
- constructor(cdRef, domSanitizer, iconRegistry, appIconService) {
22
- this.cdRef = cdRef;
23
- this.domSanitizer = domSanitizer;
24
- this.iconRegistry = iconRegistry;
25
- this.appIconService = appIconService;
26
- this.treeData = [];
27
- this.selectedData = [];
28
- this.selectedRiskData = [];
29
- this.disabledList = [];
30
- this.selectNodeEvent = new EventEmitter();
31
- this.selectFolderEvent = new EventEmitter();
32
- this.checkBoxEvent = new EventEmitter();
33
- this.childCheckedEvent = new EventEmitter();
34
- this.nodeExpandEvent = new EventEmitter();
35
- this.getChildNodeSelectOne = new EventEmitter();
36
- this.listParentObj = {};
37
- this.filterData = [];
38
- this.arrIndex = [];
39
- this.checkedNodeList = [];
40
- this.useExpandFeature = true;
41
- this.allowSelectFolder = false;
42
- this.areaOfCurrentProcess = '';
43
- this.showCheckBox = false;
44
- this.allowMultipleCheck = true;
45
- this.singleSelectedNode = false;
46
- this.onlyCheckBoxForChild = false;
47
- this.onlyFolder = false;
48
- this.itemIconType = ItemIconType;
49
- this.displayType = 1;
50
- this.openIcon = '';
51
- this.openIconColor = '#1954A9';
52
- this.closeIcon = '';
53
- this.closeIconColor = '#000000';
54
- this.itemIcon = '';
55
- this.itemIconSvg = '';
56
- this.itemIconPath = '';
57
- this.itemIconBase64 = '';
58
- this.treeControl = new FlatTreeControl((node) => {
59
- return node.level;
60
- }, (node) => {
61
- return node.expandable;
62
- });
63
- this.isChecked = false;
64
- this.idCheckIcon = '';
65
- this.listChildNode = [];
66
- this.dataType = DataType;
67
- this.transformer = (node, level) => {
68
- let checkHasChild = true;
69
- if (!node.children) {
70
- checkHasChild = false;
71
- }
72
- else if (!(!!node.children && node.children.length && node.children.length > 0)) {
73
- checkHasChild = false;
74
- }
75
- // tslint:disable-next-line:max-line-length
76
- else if (!!node.children &&
77
- node.children.length &&
78
- node.children.length === 1 &&
79
- !node.children[0].name.length &&
80
- node.id.toString() === this.areaOfCurrentProcess) {
81
- checkHasChild = false;
82
- }
83
- if (!(this.listParentObj[node.id] === 1)) {
84
- checkHasChild = false;
85
- }
86
- return {
87
- expandable: !!node.children && node.children.length > 0,
88
- name: node.name,
89
- level,
90
- id: node.id,
91
- hasChild: checkHasChild,
92
- parentId: node.parentId,
93
- disabled: false,
94
- levelType: node.levelType
95
- };
96
- };
97
- this.treeFlattener = new MatTreeFlattener(this.transformer, (node) => {
98
- return node.level;
99
- }, (node) => {
100
- return node.expandable;
101
- }, (node) => {
102
- return node.children;
103
- });
104
- this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
105
- this.hasChild = (_, node) => {
106
- return node.expandable;
107
- };
108
- iconRegistry.addSvgIconLiteral('keyboard_up', domSanitizer.bypassSecurityTrustHtml(KEYBOARD_UP_ICON));
109
- iconRegistry.addSvgIconLiteral('keyboard_down', domSanitizer.bypassSecurityTrustHtml(KEYBOARD_DOWN_ICON));
110
- appIconService.registerProcessIcon(iconRegistry, domSanitizer);
111
- appIconService.registerProcessAreaIcon(iconRegistry, domSanitizer);
112
- appIconService.registerDocumentIcon(iconRegistry, domSanitizer);
113
- appIconService.registerFolderIcon(iconRegistry, domSanitizer);
114
- appIconService.registerDeviationIcon(iconRegistry, domSanitizer);
115
- appIconService.registerChecklistIcon(iconRegistry, domSanitizer);
116
- appIconService.registerRiskIcon(iconRegistry, domSanitizer);
117
- }
118
- ngOnChanges(changes) {
119
- if (changes.treeData && JSON.stringify(changes.treeData.currentValue) !== JSON.stringify(changes.treeData.previousValue)) {
120
- this.treeData = [...this.treeData, changes.treeData.currentValue];
121
- this.initTreeData();
122
- }
123
- if (changes.selectedData &&
124
- (changes.selectedData.currentValue.length > 0 ||
125
- JSON.stringify(changes.selectedData.currentValue) !==
126
- JSON.stringify(changes.selectedData.previousValue))) {
127
- this.checkSelected(changes.selectedData.currentValue);
128
- }
129
- else {
130
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
131
- this.checklistSelection.deselect(this.treeControl.dataNodes[i]);
132
- }
133
- }
134
- if (changes.disabledList && JSON.stringify(changes.disabledList.currentValue) !== JSON.stringify(changes.disabledList.previousValue)) {
135
- this.checkDisabledList();
136
- }
137
- }
138
- ngOnInit() {
139
- this.initTreeData();
140
- }
141
- initTreeData() {
142
- this.treeData.forEach(item => {
143
- if (!!item.parentId && item.parentId.length > 0) {
144
- this.listParentObj[item.parentId] = 1;
145
- }
146
- if (item.childId && item.childId.length > 0) {
147
- this.listParentObj[item.rootId] = 1;
148
- }
149
- });
150
- this.filterData = this.treeData;
151
- this.treeObject = TreeFunctions.buildObjectTree(this.filterData);
152
- this.dataSource.data = TreeFunctions.buildArrayTree(this.treeObject || {}, 0).map(element => {
153
- const item = this.sortDataTree(element);
154
- element = null;
155
- element = Object.assign({}, item);
156
- return element;
157
- });
158
- this.useExpandFeature = !this.treeConfig.showCheckBox;
159
- this.allowSelectFolder = this.treeConfig.allowSelectFolder;
160
- this.areaOfCurrentProcess = this.treeConfig.areaOfCurrentProcess;
161
- this.showCheckBox = this.treeConfig.showCheckBox;
162
- this.onlyCheckBoxForChild = this.treeConfig.onlyCheckBoxForChild;
163
- this.moduleId = this.treeConfig.moduleId;
164
- this.openIcon = this.treeConfig.openIcon;
165
- this.openIconColor = this.treeConfig.openIconColor ? this.treeConfig.openIconColor : this.openIconColor;
166
- this.closeIcon = this.treeConfig.closeIcon;
167
- this.closeIconColor = this.treeConfig.closeIconColor ? this.treeConfig.closeIconColor : this.closeIconColor;
168
- this.itemIcon = this.treeConfig.itemIcon;
169
- this.itemIconSvg = this.treeConfig.itemIconSvg;
170
- this.itemIconPath = this.treeConfig.itemIconPath;
171
- this.itemIconBase64 = this.domSanitizer.bypassSecurityTrustResourceUrl(this.treeConfig.itemIconBase64);
172
- this.allowMultipleCheck = this.treeConfig.allowMultipleCheck;
173
- this.singleSelectedNode = this.treeConfig.singleSelectedNode;
174
- this.onlyFolder = this.treeConfig.onlyFolder;
175
- this.checklistSelection = new SelectionModel(this.allowMultipleCheck); /* true: multiple */
176
- this.displayType = this.getItemIconType(this.treeConfig);
177
- // Expand child node tree
178
- if (this.treeConfig.expandAll) {
179
- this.treeControl.expandAll();
180
- }
181
- // Risk Tree
182
- if (this.selectedRiskData.length) {
183
- const selectedData = [];
184
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
185
- this.selectedRiskData.forEach(x => {
186
- const index = selectedData.findIndex(el => el.id === x.rootId);
187
- if (x.rootId === this.treeControl.dataNodes[i].id && index < 0) {
188
- selectedData.push(this.treeControl.dataNodes[i]);
189
- }
190
- });
191
- }
192
- this.checkSelected(selectedData);
193
- this.checkBoxEvent.emit(selectedData);
194
- }
195
- //check disabled list
196
- this.checkDisabledList();
197
- }
198
- checkDisabledList() {
199
- // Disable List
200
- if (this.disabledList.length) {
201
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
202
- this.disabledList.forEach(x => {
203
- var _a;
204
- if (x.id === this.treeControl.dataNodes[i].id
205
- && (!x.parentId || x.parentId === ((_a = this.treeControl.dataNodes[i]) === null || _a === void 0 ? void 0 : _a.parentId))) {
206
- this.treeControl.dataNodes[i].disabled = true;
207
- }
208
- });
209
- }
210
- }
211
- //Selected node with select one
212
- if (this.disabledList.length && this.treeConfig.selectOne) {
213
- let itemMarkChecked = this.disabledList[this.disabledList.length - 1].toUpperCase();
214
- this.idCheckIcon = itemMarkChecked;
215
- // get all children nodes on same level
216
- let listChildNodeSameLevel = this.findChildNode(itemMarkChecked, this.dataSource.data);
217
- // get all children in all level
218
- this.listChildNode = [];
219
- this.getChild(listChildNodeSameLevel);
220
- this.getChildNodeSelectOne.emit(this.listChildNode);
221
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
222
- if (itemMarkChecked === this.treeControl.dataNodes[i].id) {
223
- this.selectNodeEvent.emit(this.treeControl.dataNodes[i]);
224
- }
225
- this.disabledList.forEach(el => {
226
- if (this.treeControl.dataNodes[i].id === el.toUpperCase()) {
227
- this.treeControl.expand(this.treeControl.dataNodes[i]);
228
- }
229
- });
230
- // remove all children nodes when user dont need to show them
231
- this.listChildNode.forEach(el => {
232
- var _a;
233
- if (((_a = this.treeControl.dataNodes[i]) === null || _a === void 0 ? void 0 : _a.id) === el.id) {
234
- this.treeControl.dataNodes.splice(i, 1);
235
- }
236
- });
237
- }
238
- }
239
- else {
240
- this.idCheckIcon = '';
241
- this.treeControl.collapseAll();
242
- this.cdRef.detectChanges();
243
- }
244
- }
245
- getChild(obj) {
246
- for (let i = 0; i < obj.children.length; i++) {
247
- if (obj.children[i].children) {
248
- this.getChild(obj.children[i]);
249
- delete obj.children[i].children;
250
- this.listChildNode.push(obj.children[i]);
251
- }
252
- else {
253
- this.listChildNode.push(obj.children[i]);
254
- }
255
- }
256
- }
257
- sortDataTree(obj) {
258
- if (obj.children) {
259
- let child = [];
260
- const leafNode = obj.children.filter(x => !x.children);
261
- const subFolderNode = obj.children.filter(x => x.children);
262
- // for(let index = subFolderNode.length - 1; index >= 0 ; index--){
263
- // let el = subFolderNode[index];
264
- // this.sortDataTree(el);
265
- // child.unshift(el);
266
- // }
267
- subFolderNode.forEach(element => {
268
- let el = element;
269
- this.sortDataTree(el);
270
- child.push(el);
271
- });
272
- leafNode.forEach(element => {
273
- let el = element;
274
- child.push(el);
275
- });
276
- obj.children = child;
277
- }
278
- return obj;
279
- }
280
- getImagePath() {
281
- return this.domSanitizer.bypassSecurityTrustResourceUrl(this.treeConfig.itemIconBase64);
282
- }
283
- checkSelected(itemSelected) {
284
- setTimeout(() => {
285
- if (!this.treeControl['dataNodes'])
286
- return;
287
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
288
- const tree = this.treeControl.dataNodes[i];
289
- this.checklistSelection.deselect(tree);
290
- for (let j = 0; j < itemSelected.length; j++) {
291
- const element = itemSelected[j];
292
- if (tree.id === element.id && (!element.parentId || tree.parentId === element.parentId) && !tree.disabled) {
293
- this.checklistSelection.select(tree);
294
- }
295
- }
296
- }
297
- }, 500);
298
- }
299
- checkSelectedSameNode(itemSelected, flag) {
300
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
301
- const tree = this.treeControl.dataNodes[i];
302
- for (let j = 0; j < itemSelected.length; j++) {
303
- const element = itemSelected[j];
304
- if (element.id && tree.id === element.id
305
- && tree.parentId === element.parentId && !tree.disabled) {
306
- flag ? this.checklistSelection.select(tree) : this.checklistSelection.deselect(tree);
307
- }
308
- }
309
- }
310
- }
311
- getItemIconType(treeConfig) {
312
- if (treeConfig.itemIcon && treeConfig.itemIcon.length)
313
- return this.itemIconType.name;
314
- if (treeConfig.itemIconPath && treeConfig.itemIconPath.length)
315
- return this.itemIconType.path;
316
- if (treeConfig.itemIconBase64 && treeConfig.itemIconBase64.length)
317
- return this.itemIconType.base64;
318
- if (treeConfig.itemIconSvg && treeConfig.itemIconSvg.length)
319
- return this.itemIconType.svg;
320
- return this.itemIconType.none;
321
- }
322
- /** Whether all the descendants of the node are selected */
323
- descendantsAllSelected(node) {
324
- const descendants = !this.singleSelectedNode ? this.treeControl.getDescendants(node).filter(item => !item.disabled) : [];
325
- if (!descendants.length) {
326
- return this.checklistSelection.isSelected(node);
327
- }
328
- const selected = this.checklistSelection.isSelected(node);
329
- const allSelected = descendants.every(child => this.checklistSelection.isSelected(child));
330
- if (!selected && allSelected) {
331
- this.checklistSelection.select(node);
332
- this.cdRef.markForCheck();
333
- }
334
- return allSelected;
335
- }
336
- /** Whether part of the descendants are selected */
337
- descendantsPartiallySelected(node) {
338
- const descendants = !this.singleSelectedNode ? this.treeControl.getDescendants(node).filter(item => !item.disabled) : [];
339
- const result = descendants.some(child => this.checklistSelection.isSelected(child));
340
- return result && !this.descendantsAllSelected(node);
341
- }
342
- /** Toggle the to-do item selection. Select/deselect all the descendants node */
343
- todoItemSelectionToggle(node) {
344
- // tree have duplicate node
345
- if (this.treeConfig.canHaveDupId) {
346
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
347
- if (this.treeControl.dataNodes[i].id === node.id
348
- && this.treeControl.dataNodes[i].parentId === node.parentId
349
- && !this.treeControl.dataNodes[i].disabled) {
350
- this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
351
- }
352
- }
353
- }
354
- else {
355
- this.checklistSelection.toggle(node);
356
- }
357
- // process/ document single selected
358
- if (this.singleSelectedNode) {
359
- this.checkBoxEvent.emit(this.checklistSelection.selected);
360
- }
361
- else {
362
- const descendants = this.treeControl.getDescendants(node).filter(item => !item.disabled);
363
- this.checkSelectedSameNode(descendants, this.descendantsAllSelected(node));
364
- !this.descendantsAllSelected(node)
365
- ? this.checklistSelection.select(...descendants)
366
- : this.checklistSelection.deselect(...descendants);
367
- this.cdRef.markForCheck();
368
- const allNodeIsParent = this.checklistSelection.selected.every(child => child.expandable);
369
- if (allNodeIsParent) {
370
- this.checklistSelection.selected.forEach(element => {
371
- this.checklistSelection.deselect(element);
372
- });
373
- }
374
- this.checkBoxEvent.emit(this.checklistSelection.selected);
375
- }
376
- }
377
- todoChildSelectionToggle(node) {
378
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
379
- if (this.treeControl.dataNodes[i].id === node.id
380
- && this.treeControl.dataNodes[i].parentId === node.parentId
381
- && !this.treeControl.dataNodes[i].disabled) {
382
- this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
383
- }
384
- }
385
- // this.checklistSelection.toggle(node);
386
- this.cdRef.markForCheck();
387
- this.checkBoxEvent.emit(this.checklistSelection.selected);
388
- }
389
- todoItemSelectionById(ids) {
390
- ids.forEach(id => {
391
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
392
- if (this.treeControl.dataNodes[i].id === id
393
- && !this.treeControl.dataNodes[i].disabled) {
394
- if (!this.checklistSelection.isSelected(this.treeControl.dataNodes[i]))
395
- this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
396
- }
397
- }
398
- });
399
- this.checkBoxEvent.emit(this.checklistSelection.selected);
400
- }
401
- todoItemSelection(nodes) {
402
- nodes.forEach(node => {
403
- for (let i = 0; i < this.treeControl.dataNodes.length; i++) {
404
- if (this.treeControl.dataNodes[i].id === node.id &&
405
- this.treeControl.dataNodes[i].parentId === node.parentId &&
406
- !this.treeControl.dataNodes[i].disabled) {
407
- if (!this.checklistSelection.isSelected(this.treeControl.dataNodes[i]))
408
- this.checklistSelection.toggle(this.treeControl.dataNodes[i]);
409
- }
410
- }
411
- });
412
- this.checkBoxEvent.emit(this.checklistSelection.selected);
413
- }
414
- selectNode(node) {
415
- if (window[RelatedConst.IS_DISPLAY_SEARCH_RESULT]) {
416
- window.postMessage(RelatedConst.HIDE_SEARCH_RESULT, '*');
417
- }
418
- if (this.treeConfig.selectOne) {
419
- node.itemType = this.checkDataTypeSelectNode(node);
420
- this.idCheckIcon = node.id;
421
- this.selectNodeEvent.emit(node);
422
- }
423
- }
424
- checkDataTypeSelectNode(node) {
425
- let itemType = -1;
426
- switch (this.moduleId) {
427
- case DataType.process:
428
- itemType = node.expandable ? DataType.area : DataType.process;
429
- break;
430
- case DataType.document:
431
- itemType = node.expandable ? DataType.folder : DataType.document;
432
- break;
433
- default:
434
- itemType = this.moduleId;
435
- break;
436
- }
437
- return itemType;
438
- }
439
- selectFolder(node) {
440
- this.selectFolderEvent.emit(node);
441
- }
442
- onExpandNode(node, isExpandNode) {
443
- if (this.treeConfig.selectOne) {
444
- if (this.disabledList.length &&
445
- (node.id === this.disabledList[this.disabledList.length - 1].toUpperCase() ||
446
- node.parentId === this.disabledList[this.disabledList.length - 1].toUpperCase())) {
447
- return;
448
- }
449
- this.idCheckIcon = node.id;
450
- node.itemType = this.checkDataTypeSelectNode(node);
451
- this.selectNodeEvent.emit(node);
452
- }
453
- if (window[RelatedConst.IS_DISPLAY_SEARCH_RESULT]) {
454
- window.postMessage(RelatedConst.HIDE_SEARCH_RESULT, '*');
455
- }
456
- // set useExpandFeature = true to improve performance of tree loading
457
- if (!isExpandNode || !this.useExpandFeature) {
458
- for (let i = 0; i < this.arrIndex.length; i++) {
459
- if (this.arrIndex[i] === node.id) {
460
- this.arrIndex.splice(i, 1);
461
- }
462
- }
463
- if (isExpandNode && !this.expandOnTitleClick) {
464
- this.nodeExpandEvent.emit(node);
465
- }
466
- return;
467
- }
468
- // get array index to expand node after refresh datasource
469
- let index = 0;
470
- let isChange = false;
471
- let isRemove = false;
472
- this.arrIndex.push(node.id);
473
- const childArray = this.treeData.filter((x) => {
474
- return x.parentId === node.id;
475
- });
476
- let rootId = '0';
477
- let parentElement;
478
- let childrenList;
479
- if (childArray.length === 0) {
480
- return;
481
- }
482
- childArray.forEach((item) => {
483
- if (item.rootId === rootId) {
484
- return;
485
- }
486
- // get child node from original datasource
487
- const child = this.getChildNode(item.rootId, childArray);
488
- rootId = item.rootId;
489
- index = this.getNodeIndex(child.id, undefined, this.dataSource['_treeControl'].dataNodes);
490
- if (index > -1) {
491
- return;
492
- }
493
- // add child node to expand node
494
- parentElement = this.findChildNode(node.id, this.dataSource.data);
495
- if (parentElement) {
496
- // temporary remove all node without children => purpose to add node folder first
497
- if (!isRemove) {
498
- childrenList = [...parentElement.children];
499
- this.removeChildren(parentElement);
500
- isRemove = true;
501
- }
502
- // add node folder first
503
- parentElement.children.push(child);
504
- isChange = true;
505
- }
506
- });
507
- // add node without children again
508
- if (isRemove) {
509
- this.addChildren(parentElement, childrenList);
510
- }
511
- // refresh data and expand tree node from root node
512
- if (isChange) {
513
- this.refreshTreeData();
514
- this.arrIndex.forEach((item) => {
515
- index = this.getNodeIndex(item, undefined, this.dataSource['_treeControl'].dataNodes);
516
- this.treeControl.expand(this.treeControl.dataNodes[index]);
517
- });
518
- isChange = false;
519
- }
520
- }
521
- removeChildren(parentElement) {
522
- if (parentElement.children) {
523
- parentElement.children.length = 0;
524
- }
525
- }
526
- addChildren(parentElement, childrenList) {
527
- if (childrenList) {
528
- childrenList.forEach((e) => {
529
- parentElement.children.push(e);
530
- });
531
- }
532
- }
533
- getNodeIndex(id, level, data) {
534
- if (level) {
535
- return data.findIndex((x) => {
536
- return x.id === id && x.level === level;
537
- });
538
- }
539
- return data.findIndex((x) => {
540
- return x.id === id;
541
- });
542
- }
543
- getChildNode(rootId, data) {
544
- const childArray = data.filter((x) => {
545
- return x.rootId === rootId;
546
- });
547
- const child = { id: childArray[0].rootId, name: childArray[0].subName, children: [] };
548
- childArray.forEach((item) => {
549
- child.children.push({ id: item.childId, name: item.childName, parentId: rootId });
550
- });
551
- return child;
552
- }
553
- findChildNode(id, data) {
554
- // eslint-disable-next-line no-restricted-syntax
555
- for (const currentFather of data) {
556
- if (currentFather.id === id) {
557
- return currentFather;
558
- }
559
- if (currentFather.children) {
560
- const currentChild = currentFather.children.find((x) => {
561
- return x.id === id;
562
- });
563
- if (currentChild) {
564
- return currentChild;
565
- }
566
- // eslint-disable-next-line no-restricted-syntax
567
- for (const currentChild1 of currentFather.children) {
568
- if (id !== currentChild1.id) {
569
- const result = this.findChildNode(id, currentFather.children);
570
- if (result !== false) {
571
- return result;
572
- }
573
- }
574
- }
575
- }
576
- }
577
- return false;
578
- }
579
- refreshTreeData() {
580
- const data = this.dataSource.data;
581
- this.dataSource.data = [];
582
- this.dataSource.data = data;
583
- }
584
- getNodeIcon(node) {
585
- if (this.openIcon && this.closeIcon) {
586
- return this.treeControl.isExpanded(node) ? this.openIcon : this.closeIcon;
587
- }
588
- switch (this.moduleId) {
589
- case DataType.document: {
590
- const nodeData = this.treeData.filter(x => { return x.rootId === node.id; });
591
- if (nodeData.length > 0) {
592
- switch (nodeData[0].levelType) {
593
- case DocumentNodeType.DepartmentFolder:
594
- return this.treeControl.isExpanded(node) ? 'department_folder_outlined' : 'department_folder';
595
- case DocumentNodeType.RegionalFolder:
596
- return this.treeControl.isExpanded(node) ? 'regional_folder_outlined' : 'regional_folder';
597
- case DocumentNodeType.TopFolder:
598
- return this.treeControl.isExpanded(node) ? 'enterprise_folder_outlined' : 'enterprise_folder';
599
- case DocumentNodeType.Folder:
600
- return this.treeControl.isExpanded(node) ? 'local_folder_outlined' : 'local_folder';
601
- default:
602
- return this.treeControl.isExpanded(node) ? 'folder_outlined' : 'folder';
603
- }
604
- }
605
- return this.treeControl.isExpanded(node) ? 'keyboard_up' : 'keyboard_down';
606
- }
607
- case DataType.process:
608
- return this.treeControl.isExpanded(node) ? 'process_area_outlined' : 'process_area';
609
- default:
610
- return this.treeControl.isExpanded(node) ? 'keyboard_up' : 'keyboard_down';
611
- }
612
- }
613
- getItemIcon(node) {
614
- switch (this.moduleId) {
615
- case DataType.document:
616
- switch (node.levelType) {
617
- case DocumentNodeType.DepartmentFolder:
618
- return 'document_department';
619
- case DocumentNodeType.RegionalFolder:
620
- return 'document_regional';
621
- case DocumentNodeType.TopFolder:
622
- return 'document_enterprise';
623
- case DocumentNodeType.Folder:
624
- return 'document_local';
625
- default:
626
- return 'document';
627
- }
628
- case DataType.process:
629
- return 'process';
630
- case DataType.checklist:
631
- return 'checklist';
632
- case DataType.deviation:
633
- return 'deviation';
634
- case DataType.risk:
635
- return 'risk';
636
- default:
637
- return 'document';
638
- }
639
- }
640
- selectFolderNode(node) {
641
- if (!this.expandOnTitleClick) {
642
- this.onExpandNode(node, true);
643
- }
644
- }
645
- getNodeId(node) {
646
- return `_${node.parentId ? node.parentId : ''}_${node.id}_${node.level}`;
647
- }
648
- }
649
- TreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }, { token: i2.MatIconRegistry }, { token: i3.QMSIconRegistryService }], target: i0.ɵɵFactoryTarget.Component });
650
- TreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: TreeComponent, selector: "qms-tree", inputs: { treeData: "treeData", treeConfig: "treeConfig", selectedData: "selectedData", selectedRiskData: "selectedRiskData", disabledList: "disabledList", expandOnTitleClick: "expandOnTitleClick" }, outputs: { selectNodeEvent: "selectNodeEvent", selectFolderEvent: "selectFolderEvent", checkBoxEvent: "checkBoxEvent", childCheckedEvent: "childCheckedEvent", nodeExpandEvent: "nodeExpandEvent", getChildNodeSelectOne: "getChildNodeSelectOne" }, usesOnChanges: true, ngImport: i0, template: "<mat-tree\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"tree__container\"\r\n>\r\n <mat-tree-node\r\n class=\"tree-branch\"\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n >\r\n <!-- form thu 1 - child -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"node.name && showCheckBox && !onlyCheckBoxForChild && !onlyFolder\"\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"checklistSelection.isSelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n >\r\n </mat-checkbox>\r\n\r\n <!-- form thu 2 -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"node.name && showCheckBox && onlyCheckBoxForChild && !onlyFolder\"\r\n class=\"ml-10 checklist-leaf-node\"\r\n [checked]=\"checklistSelection.isSelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n ></mat-checkbox>\r\n <div\r\n class=\"expand-node\"\r\n *ngIf=\"node.name && !onlyFolder\"\r\n [class.bgSelected]=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n (click)=\"selectNode(node)\"\r\n >\r\n <div class=\"expand-node__text\">\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.name && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n >\r\n {{ itemIcon }}\r\n </mat-icon>\r\n\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.svg && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n [svgIcon]=\"itemIconSvg\"\r\n >\r\n </mat-icon>\r\n\r\n <img\r\n *ngIf=\"displayType === itemIconType.path && !onlyCheckBoxForChild\"\r\n class=\"mat-icon\"\r\n [src]=\"itemIconPath\"\r\n />\r\n\r\n <img\r\n *ngIf=\"displayType === itemIconType.base64 && !onlyCheckBoxForChild\"\r\n class=\"mat-icon image-base64\"\r\n [src]=\"getImagePath()\"\r\n />\r\n\r\n <mat-icon\r\n *ngIf=\"displayType === itemIconType.none && !onlyCheckBoxForChild\"\r\n class=\"mat-icon-rtl-mirror material-icons-outlined\"\r\n [svgIcon]=\"getItemIcon(node)\"\r\n ></mat-icon>\r\n <span class=\"text-node\">{{ node.name }}</span>\r\n </div>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </div>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding>\r\n <!-- form thu 1 - parent -->\r\n <mat-checkbox\r\n qms-group-options\r\n [disabled]=\"node.disabled\"\r\n color=\"default\"\r\n *ngIf=\"showCheckBox && !onlyCheckBoxForChild\"\r\n [checked]=\"descendantsAllSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"todoItemSelectionToggle(node)\"\r\n ></mat-checkbox>\r\n <button\r\n class=\"button-boder\"\r\n mat-icon-button\r\n matTreeNodeToggle\r\n [disableRipple]=\"!node.hasChild\"\r\n [attr.aria-label]=\"'toggle ' + node.filename\"\r\n >\r\n <mat-icon\r\n *ngIf=\"openIcon && closeIcon\"\r\n class=\"mat-icon-rtl-mirror\"\r\n [ngStyle]=\"{\r\n color: treeControl.isExpanded(node) ? openIconColor : closeIconColor\r\n }\"\r\n >{{ getNodeIcon(node) }}</mat-icon\r\n >\r\n <mat-icon\r\n *ngIf=\"!openIcon || !closeIcon\"\r\n class=\"mat-icon-rtl-mirror\"\r\n [ngClass]=\"{\r\n 'open-icon': treeControl.isExpanded(node),\r\n 'not-department-icon': moduleId !== dataType.document\r\n }\"\r\n [svgIcon]=\"getNodeIcon(node)\"\r\n >\r\n </mat-icon>\r\n </button>\r\n <span\r\n *ngIf=\"expandOnTitleClick\"\r\n matTreeNodeToggle\r\n class=\"text-node-parent\"\r\n style=\"cursor: pointer\"\r\n (click)=\"onExpandNode(node)\"\r\n [ngStyle]=\"{\r\n color: treeControl.isExpanded(node) ? openIconColor : '#000000'\r\n }\"\r\n >\r\n <span>{{ node.name }}</span>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </span>\r\n <span\r\n *ngIf=\"!expandOnTitleClick\"\r\n class=\"text-node-parent\"\r\n (click)=\"selectFolderNode(node)\"\r\n style=\"cursor: pointer\"\r\n [id]=\"getNodeId(node)\"\r\n >\r\n <span>{{ node.name }}</span>\r\n <mat-icon\r\n class=\"icon-check\"\r\n *ngIf=\"treeConfig.selectOne && idCheckIcon == node.id\"\r\n >done</mat-icon\r\n >\r\n </span>\r\n </mat-tree-node>\r\n</mat-tree>\r\n", styles: ["@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWJ0bbck.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFUZ0bbck.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWZ0bbck.woff2) format(\"woff2\");unicode-range:U+1f??}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFVp0bbck.woff2) format(\"woff2\");unicode-range:U+0370-03ff}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFWp0bbck.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFW50bbck.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-family:Open Sans;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v20/mem8YaGs126MiZpBA-UFVZ0b.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrEHJA.woff2) format(\"woff2\");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCMPrEHJA.woff2) format(\"woff2\");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCHPrEHJA.woff2) format(\"woff2\");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01a0-01a1,U+01af-01b0,U+1ea0-1ef9,U+20ab}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCGPrEHJA.woff2) format(\"woff2\");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-family:Raleway;font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/raleway/v19/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrE.woff2) format(\"woff2\");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.tree__container{font-family:Open Sans;font-style:normal;font-weight:400;font-size:.875rem;line-height:19px;color:#323232}.tree__container .mat-tree-node{color:#000;min-height:0}.tree__container .mat-tree-node .mat-checkbox.qms-group-options{padding:0}.tree__container .mat-tree-node .mat-checkbox.qms-group-options .mat-checkbox-inner-container{margin-right:11px}.tree__container .button{margin-left:6px}.tree__container .button:focus,.tree__container .button:hover{background-color:#009ef2;border-radius:2px;width:auto}.tree__container .button-boder:focus,.tree__container .button:focus{outline:0}.tree__container .button-folder-boder:focus{outline:0}.tree__container .button-folder-boder:focus,.tree__container .button-folder-boder:hover{background-color:#009ef2;border-radius:2px;width:auto}.tree__container .expand-node{margin-left:8px;min-height:32px;justify-content:space-between;width:100%}.tree__container .expand-node,.tree__container .expand-node .expand-node__text{display:flex;align-items:center}.tree__container .expand-node .mat-icon{color:rgba(0,0,0,.6);margin-right:17px;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.tree__container .expand-node .mat-icon svg{display:block;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.tree__container .expand-node.bgSelected .icon-check{color:#1954a9}.tree__container .text-node-parent{width:100%;display:flex;align-items:center;justify-content:space-between;margin-left:10px;cursor:pointer}.tree__container .text-node-parent.active-item{color:#1954a9!important}.tree__container .text-node-parent.bgSelected .icon-check{color:#1954a9}.tree__container .mr-11{margin-right:11px}.tree__container .ml-10{margin-left:10px}.tree__container .tree-branch:hover{background-color:#e5eefb}.tree__container .image-base64{width:20px;height:20px}.tree__container .mat-checkbox.qms-group-options.mat-checkbox-checked{background:transparent!important}::ng-deep .mat-tree .mat-checkbox.qms-group-options{padding:0}::ng-deep .mat-tree .mat-checkbox.qms-group-options.mat-checkbox-checked{background-color:transparent}::ng-deep .mat-tree .mat-checkbox.qms-group-options .mat-checkbox-inner-container{margin-right:0}svg{display:block;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.open-icon.not-department-icon svg path,.open-icon svg path:first-child{fill:#1954a9}"], components: [{ type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.QMSGroupOptionDirective, selector: "[qms-group-options]" }, { type: i8.AutocompleteOffDirective, selector: "[qms-group-options]" }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
651
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TreeComponent, decorators: [{
652
- type: Component,
653
- args: [{
654
- selector: 'qms-tree',
655
- templateUrl: './tree.component.html',
656
- styleUrls: ['./tree.component.scss'],
657
- encapsulation: ViewEncapsulation.None,
658
- }]
659
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }, { type: i2.MatIconRegistry }, { type: i3.QMSIconRegistryService }]; }, propDecorators: { treeData: [{
660
- type: Input
661
- }], treeConfig: [{
662
- type: Input
663
- }], selectedData: [{
664
- type: Input
665
- }], selectedRiskData: [{
666
- type: Input
667
- }], disabledList: [{
668
- type: Input
669
- }], expandOnTitleClick: [{
670
- type: Input
671
- }], selectNodeEvent: [{
672
- type: Output
673
- }], selectFolderEvent: [{
674
- type: Output
675
- }], checkBoxEvent: [{
676
- type: Output
677
- }], childCheckedEvent: [{
678
- type: Output
679
- }], nodeExpandEvent: [{
680
- type: Output
681
- }], getChildNodeSelectOne: [{
682
- type: Output
683
- }] } });
684
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9xbXMtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvcmVsYXRlZC90cmVlL3RyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcW1zLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3JlbGF0ZWQvdHJlZS90cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7OztBQW1DcEQsTUFBTSxPQUFPLGFBQWE7SUFzRHhCLFlBQW9CLEtBQXdCLEVBQ2xDLFlBQTBCLEVBQzFCLFlBQTZCLEVBQzdCLGNBQXNDO1FBSDVCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ2xDLGlCQUFZLEdB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VUFBVSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWtCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQWtCO1FBQzFCLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0UsQ0FBQzs7MEdBanRCVSxhQUFhOzhGQUFiLGFBQWEsa2dCQy9DMUIsMDZKQXVKQTsyRkR4R2EsYUFBYTtrQkFOekIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsV0FBVyxFQUFFLHVCQUF1QjtvQkFDcEMsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUM7b0JBQ3BDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0QztzTUFFVSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEZsYXRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0SWNvblJlZ2lzdHJ5IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUU1TSWNvblJlZ2lzdHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcC1pY29uL2ljb24tcmVnaXN0cnkuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2RhdGEtdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgRG9jdW1lbnROb2RlVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9kb2N1bWVudC1mb2xkZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgSXRlbUljb25UeXBlIH0gZnJvbSAnLi4vY29tbW9uL2l0ZW0taWNvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBLRVlCT0FSRF9ET1dOX0lDT04sIEtFWUJPQVJEX1VQX0lDT04gfSBmcm9tICcuLi9jb21tb24vcW1zLWljb24uY29uc3QnO1xyXG5pbXBvcnQgeyBSZWxhdGVkQ29uc3QgfSBmcm9tICcuLi9jb21tb24vcmVsYXRlZC5jb25zdCc7XHJcbmltcG9ydCBUcmVlRnVuY3Rpb25zIGZyb20gJy4uL2NvbW1vbi90cmVlLmZ1bmN0aW9uJztcclxuaW1wb3J0IHsgVHJlZUNvbmZpZyB9IGZyb20gJy4uL21vZGVsL3RyZWUtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdHJlZS5tb2RlbCc7XHJcblxyXG5pbnRlcmZhY2UgVHJlZU5vZGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGNoaWxkcmVuPzogVHJlZU5vZGVbXTtcclxuICBwYXJlbnRJZD86IHN0cmluZztcclxuICBsZXZlbFR5cGU/OiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUcmVlRmxhdE5vZGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGxldmVsOiBudW1iZXI7XHJcbiAgZXhwYW5kYWJsZTogYm9vbGVhbjtcclxuICBoYXNDaGlsZDogYm9vbGVhbjtcclxuICBwYXJlbnRJZD86IHN0cmluZztcclxuICBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBsZXZlbFR5cGU/OiBudW1iZXI7XHJcbiAgaXRlbVR5cGU/OiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ2hlY2tlZE5vZGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY2hlY2tlZDogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdxbXMtdHJlZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RyZWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RyZWUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0cmVlRGF0YTogQXJyYXk8VHJlZU1vZGVsPiA9IFtdO1xyXG4gIEBJbnB1dCgpIHRyZWVDb25maWc6IFRyZWVDb25maWc7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRhOiBBcnJheTxUcmVlRmxhdE5vZGU+ID0gW107XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSaXNrRGF0YTogYW55ID0gW107XHJcbiAgQElucHV0KCkgZGlzYWJsZWRMaXN0OiBhbnkgPSBbXTtcclxuICBASW5wdXQoKSBleHBhbmRPblRpdGxlQ2xpY2s6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIHNlbGVjdE5vZGVFdmVudDogRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdEZvbGRlckV2ZW50OiBFdmVudEVtaXR0ZXI8VHJlZUZsYXROb2RlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY2hlY2tCb3hFdmVudDogRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY2hpbGRDaGVja2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxJQ2hlY2tlZE5vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBub2RlRXhwYW5kRXZlbnQ6IEV2ZW50RW1pdHRlcjxUcmVlRmxhdE5vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZXRDaGlsZE5vZGVTZWxlY3RPbmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBsaXN0UGFyZW50T2JqID0ge307XHJcbiAgZmlsdGVyRGF0YTogVHJlZU1vZGVsW10gPSBbXTtcclxuICB0cmVlT2JqZWN0OiBvYmplY3Q7XHJcbiAgYXJySW5kZXg6IHN0cmluZ1tdID0gW107XHJcbiAgY2hlY2tlZE5vZGVMaXN0OiBBcnJheTxUcmVlRmxhdE5vZGU+ID0gW107XHJcbiAgdXNlRXhwYW5kRmVhdHVyZSA9IHRydWU7XHJcbiAgYWxsb3dTZWxlY3RGb2xkZXIgPSBmYWxzZTtcclxuICBhcmVhT2ZDdXJyZW50UHJvY2VzcyA9ICcnO1xyXG4gIHNob3dDaGVja0JveCA9IGZhbHNlO1xyXG4gIGFsbG93TXVsdGlwbGVDaGVjayA9IHRydWU7XHJcbiAgc2luZ2xlU2VsZWN0ZWROb2RlID0gZmFsc2U7XHJcbiAgb25seUNoZWNrQm94Rm9yQ2hpbGQgPSBmYWxzZTtcclxuICBvbmx5Rm9sZGVyID0gZmFsc2U7XHJcbiAgaXRlbUljb25UeXBlID0gSXRlbUljb25UeXBlO1xyXG4gIGRpc3BsYXlUeXBlID0gMTtcclxuICBvcGVuSWNvbiA9ICcnO1xyXG4gIG9wZW5JY29uQ29sb3IgPSAnIzE5NTRBOSc7XHJcbiAgY2xvc2VJY29uID0gJyc7XHJcbiAgY2xvc2VJY29uQ29sb3IgPSAnIzAwMDAwMCc7XHJcbiAgaXRlbUljb24gPSAnJztcclxuICBpdGVtSWNvblN2ZyA9ICcnO1xyXG4gIGl0ZW1JY29uUGF0aCA9ICcnO1xyXG4gIGl0ZW1JY29uQmFzZTY0ID0gJyc7XHJcbiAgbW9kdWxlSWQ6IG51bWJlcjtcclxuXHJcbiAgdHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPFRyZWVGbGF0Tm9kZT4oXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5sZXZlbDtcclxuICAgIH0sXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIGlzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gIGNoZWNrbGlzdFNlbGVjdGlvbjogYW55O1xyXG4gIGlkQ2hlY2tJY29uID0gJyc7XHJcbiAgbGlzdENoaWxkTm9kZSA9IFtdO1xyXG4gIGRhdGFUeXBlID0gRGF0YVR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBNYXRJY29uUmVnaXN0cnksXHJcbiAgICBwcml2YXRlIGFwcEljb25TZXJ2aWNlOiBRTVNJY29uUmVnaXN0cnlTZXJ2aWNlKSB7XHJcbiAgICBpY29uUmVnaXN0cnkuYWRkU3ZnSWNvbkxpdGVyYWwoJ2tleWJvYXJkX3VwJywgZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKEtFWUJPQVJEX1VQX0lDT04pKTtcclxuICAgIGljb25SZWdpc3RyeS5hZGRTdmdJY29uTGl0ZXJhbCgna2V5Ym9hcmRfZG93bicsIGRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChLRVlCT0FSRF9ET1dOX0lDT04pKTtcclxuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyUHJvY2Vzc0ljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJQcm9jZXNzQXJlYUljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJEb2N1bWVudEljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJGb2xkZXJJY29uKGljb25SZWdpc3RyeSwgZG9tU2FuaXRpemVyKTtcclxuICAgIGFwcEljb25TZXJ2aWNlLnJlZ2lzdGVyRGV2aWF0aW9uSWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XHJcbiAgICBhcHBJY29uU2VydmljZS5yZWdpc3RlckNoZWNrbGlzdEljb24oaWNvblJlZ2lzdHJ5LCBkb21TYW5pdGl6ZXIpO1xyXG4gICAgYXBwSWNvblNlcnZpY2UucmVnaXN0ZXJSaXNrSWNvbihpY29uUmVnaXN0cnksIGRvbVNhbml0aXplcik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy50cmVlRGF0YSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLnRyZWVEYXRhLmN1cnJlbnRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGNoYW5nZXMudHJlZURhdGEucHJldmlvdXNWYWx1ZSkpIHtcclxuICAgICAgdGhpcy50cmVlRGF0YSA9IFsuLi50aGlzLnRyZWVEYXRhLCBjaGFuZ2VzLnRyZWVEYXRhLmN1cnJlbnRWYWx1ZV07XHJcbiAgICAgIHRoaXMuaW5pdFRyZWVEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWREYXRhICYmXHJcbiAgICAgIChjaGFuZ2VzLnNlbGVjdGVkRGF0YS5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCB8fFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXMuc2VsZWN0ZWREYXRhLmN1cnJlbnRWYWx1ZSkgIT09XHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcy5zZWxlY3RlZERhdGEucHJldmlvdXNWYWx1ZSkpKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZChjaGFuZ2VzLnNlbGVjdGVkRGF0YS5jdXJyZW50VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmRpc2FibGVkTGlzdCAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLmRpc2FibGVkTGlzdC5jdXJyZW50VmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzLmRpc2FibGVkTGlzdC5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZWRMaXN0KCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRUcmVlRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFRyZWVEYXRhKCkge1xyXG4gICAgdGhpcy50cmVlRGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoISFpdGVtLnBhcmVudElkICYmIGl0ZW0ucGFyZW50SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubGlzdFBhcmVudE9ialtpdGVtLnBhcmVudElkXSA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRJZCAmJiBpdGVtLmNoaWxkSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMubGlzdFBhcmVudE9ialtpdGVtLnJvb3RJZF0gPSAxO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpbHRlckRhdGEgPSB0aGlzLnRyZWVEYXRhO1xyXG5cclxuICAgIHRoaXMudHJlZU9iamVjdCA9IFRyZWVGdW5jdGlvbnMuYnVpbGRPYmplY3RUcmVlKHRoaXMuZmlsdGVyRGF0YSk7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFRyZWVGdW5jdGlvbnMuYnVpbGRBcnJheVRyZWUodGhpcy50cmVlT2JqZWN0IHx8IHt9LCAwKS5tYXAoZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNvcnREYXRhVHJlZShlbGVtZW50KTtcclxuICAgICAgZWxlbWVudCA9IG51bGw7XHJcbiAgICAgIGVsZW1lbnQgPSB7IC4uLnt9LCAuLi5pdGVtIH07XHJcbiAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51c2VFeHBhbmRGZWF0dXJlID0gIXRoaXMudHJlZUNvbmZpZy5zaG93Q2hlY2tCb3g7XHJcbiAgICB0aGlzLmFsbG93U2VsZWN0Rm9sZGVyID0gdGhpcy50cmVlQ29uZmlnLmFsbG93U2VsZWN0Rm9sZGVyO1xyXG4gICAgdGhpcy5hcmVhT2ZDdXJyZW50UHJvY2VzcyA9IHRoaXMudHJlZUNvbmZpZy5hcmVhT2ZDdXJyZW50UHJvY2VzcztcclxuICAgIHRoaXMuc2hvd0NoZWNrQm94ID0gdGhpcy50cmVlQ29uZmlnLnNob3dDaGVja0JveDtcclxuICAgIHRoaXMub25seUNoZWNrQm94Rm9yQ2hpbGQgPSB0aGlzLnRyZWVDb25maWcub25seUNoZWNrQm94Rm9yQ2hpbGQ7XHJcbiAgICB0aGlzLm1vZHVsZUlkID0gdGhpcy50cmVlQ29uZmlnLm1vZHVsZUlkO1xyXG4gICAgdGhpcy5vcGVuSWNvbiA9IHRoaXMudHJlZUNvbmZpZy5vcGVuSWNvbjtcclxuICAgIHRoaXMub3Blbkljb25Db2xvciA9IHRoaXMudHJlZUNvbmZpZy5vcGVuSWNvbkNvbG9yID8gdGhpcy50cmVlQ29uZmlnLm9wZW5JY29uQ29sb3IgOiB0aGlzLm9wZW5JY29uQ29sb3I7XHJcbiAgICB0aGlzLmNsb3NlSWNvbiA9IHRoaXMudHJlZUNvbmZpZy5jbG9zZUljb247XHJcbiAgICB0aGlzLmNsb3NlSWNvbkNvbG9yID0gdGhpcy50cmVlQ29uZmlnLmNsb3NlSWNvbkNvbG9yID8gdGhpcy50cmVlQ29uZmlnLmNsb3NlSWNvbkNvbG9yIDogdGhpcy5jbG9zZUljb25Db2xvcjtcclxuICAgIHRoaXMuaXRlbUljb24gPSB0aGlzLnRyZWVDb25maWcuaXRlbUljb247XHJcbiAgICB0aGlzLml0ZW1JY29uU3ZnID0gdGhpcy50cmVlQ29uZmlnLml0ZW1JY29uU3ZnO1xyXG4gICAgdGhpcy5pdGVtSWNvblBhdGggPSB0aGlzLnRyZWVDb25maWcuaXRlbUljb25QYXRoO1xyXG4gICAgdGhpcy5pdGVtSWNvbkJhc2U2NCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLnRyZWVDb25maWcuaXRlbUljb25CYXNlNjQpIGFzIHN0cmluZztcclxuICAgIHRoaXMuYWxsb3dNdWx0aXBsZUNoZWNrID0gdGhpcy50cmVlQ29uZmlnLmFsbG93TXVsdGlwbGVDaGVjaztcclxuICAgIHRoaXMuc2luZ2xlU2VsZWN0ZWROb2RlID0gdGhpcy50cmVlQ29uZmlnLnNpbmdsZVNlbGVjdGVkTm9kZTtcclxuICAgIHRoaXMub25seUZvbGRlciA9IHRoaXMudHJlZUNvbmZpZy5vbmx5Rm9sZGVyO1xyXG4gICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8VHJlZUZsYXROb2RlPih0aGlzLmFsbG93TXVsdGlwbGVDaGVjayk7IC8qIHRydWU6IG11bHRpcGxlICovXHJcblxyXG4gICAgdGhpcy5kaXNwbGF5VHlwZSA9IHRoaXMuZ2V0SXRlbUljb25UeXBlKHRoaXMudHJlZUNvbmZpZyk7XHJcblxyXG4gICAgLy8gRXhwYW5kIGNoaWxkIG5vZGUgdHJlZVxyXG4gICAgaWYgKHRoaXMudHJlZUNvbmZpZy5leHBhbmRBbGwpIHtcclxuICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmRBbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSaXNrIFRyZWVcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUmlza0RhdGEubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0YSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJpc2tEYXRhLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGVkRGF0YS5maW5kSW5kZXgoZWwgPT4gZWwuaWQgPT09IHgucm9vdElkKTtcclxuICAgICAgICAgIGlmICh4LnJvb3RJZCA9PT0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQgJiYgaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkKHNlbGVjdGVkRGF0YSk7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hFdmVudC5lbWl0KHNlbGVjdGVkRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9jaGVjayBkaXNhYmxlZCBsaXN0XHJcbiAgICB0aGlzLmNoZWNrRGlzYWJsZWRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0Rpc2FibGVkTGlzdCgpIHtcclxuICAgIC8vIERpc2FibGUgTGlzdCAgXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZExpc3QubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkTGlzdC5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgaWYgKHguaWQgPT09IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmlkXHJcbiAgICAgICAgICAgICYmICgheC5wYXJlbnRJZCB8fCB4LnBhcmVudElkID09PSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXT8ucGFyZW50SWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vU2VsZWN0ZWQgbm9kZSB3aXRoIHNlbGVjdCBvbmVcclxuICAgIGlmICh0aGlzLmRpc2FibGVkTGlzdC5sZW5ndGggJiYgdGhpcy50cmVlQ29uZmlnLnNlbGVjdE9uZSkge1xyXG4gICAgICBsZXQgaXRlbU1hcmtDaGVja2VkID0gdGhpcy5kaXNhYmxlZExpc3RbdGhpcy5kaXNhYmxlZExpc3QubGVuZ3RoIC0gMV0udG9VcHBlckNhc2UoKTtcclxuICAgICAgdGhpcy5pZENoZWNrSWNvbiA9IGl0ZW1NYXJrQ2hlY2tlZDtcclxuICAgICAgLy8gZ2V0IGFsbCBjaGlsZHJlbiBub2RlcyBvbiBzYW1lIGxldmVsXHJcbiAgICAgIGxldCBsaXN0Q2hpbGROb2RlU2FtZUxldmVsID0gdGhpcy5maW5kQ2hpbGROb2RlKGl0ZW1NYXJrQ2hlY2tlZCwgdGhpcy5kYXRhU291cmNlLmRhdGEpO1xyXG4gICAgICAvLyBnZXQgYWxsIGNoaWxkcmVuIGluIGFsbCBsZXZlbFxyXG4gICAgICB0aGlzLmxpc3RDaGlsZE5vZGUgPSBbXTtcclxuICAgICAgdGhpcy5nZXRDaGlsZChsaXN0Q2hpbGROb2RlU2FtZUxldmVsKTtcclxuICAgICAgdGhpcy5nZXRDaGlsZE5vZGVTZWxlY3RPbmUuZW1pdCh0aGlzLmxpc3RDaGlsZE5vZGUpO1xyXG5cclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoaXRlbU1hcmtDaGVja2VkID09PSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5pZCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3ROb2RlRXZlbnQuZW1pdCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzYWJsZWRMaXN0LmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmlkID09PSBlbC50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyByZW1vdmUgYWxsIGNoaWxkcmVuIG5vZGVzIHdoZW4gdXNlciBkb250IG5lZWQgdG8gc2hvdyB0aGVtXHJcbiAgICAgICAgdGhpcy5saXN0Q2hpbGROb2RlLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldPy5pZCA9PT0gZWwuaWQpIHtcclxuICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlkQ2hlY2tJY29uID0gJyc7XHJcbiAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2VBbGwoKTtcclxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDaGlsZChvYmopIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChvYmouY2hpbGRyZW5baV0uY2hpbGRyZW4pIHtcclxuICAgICAgICB0aGlzLmdldENoaWxkKG9iai5jaGlsZHJlbltpXSk7XHJcbiAgICAgICAgZGVsZXRlIG9iai5jaGlsZHJlbltpXS5jaGlsZHJlbjtcclxuICAgICAgICB0aGlzLmxpc3RDaGlsZE5vZGUucHVzaChvYmouY2hpbGRyZW5baV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGlzdENoaWxkTm9kZS5wdXNoKG9iai5jaGlsZHJlbltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNvcnREYXRhVHJlZShvYmopIHtcclxuICAgIGlmIChvYmouY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IGNoaWxkID0gW107XHJcbiAgICAgIGNvbnN0IGxlYWZOb2RlID0gb2JqLmNoaWxkcmVuLmZpbHRlcih4ID0+ICF4LmNoaWxkcmVuKTtcclxuICAgICAgY29uc3Qgc3ViRm9sZGVyTm9kZSA9IG9iai5jaGlsZHJlbi5maWx0ZXIoeCA9PiB4LmNoaWxkcmVuKTtcclxuICAgICAgLy8gZm9yKGxldCBpbmRleCA9IHN1YkZvbGRlck5vZGUubGVuZ3RoIC0gMTsgaW5kZXggPj0gMCA7IGluZGV4LS0pe1xyXG4gICAgICAvLyAgIGxldCBlbCA9IHN1YkZvbGRlck5vZGVbaW5kZXhdO1xyXG4gICAgICAvLyAgIHRoaXMuc29ydERhdGFUcmVlKGVsKTsgXHJcbiAgICAgIC8vICAgY2hpbGQudW5zaGlmdChlbCk7IFxyXG4gICAgICAvLyB9XHJcbiAgICAgIHN1YkZvbGRlck5vZGUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xyXG4gICAgICAgIHRoaXMuc29ydERhdGFUcmVlKGVsKTtcclxuICAgICAgICBjaGlsZC5wdXNoKGVsKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZWFmTm9kZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgY2hpbGQucHVzaChlbCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBvYmouY2hpbGRyZW4gPSBjaGlsZDtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVBhdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHRoaXMudHJlZUNvbmZpZy5pdGVtSWNvbkJhc2U2NCkgYXMgc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tTZWxlY3RlZChpdGVtU2VsZWN0ZWQ6IFRyZWVGbGF0Tm9kZVtdKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnRyZWVDb250cm9sWydkYXRhTm9kZXMnXSkgcmV0dXJuO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldO1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KHRyZWUpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW1TZWxlY3RlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGl0ZW1TZWxlY3RlZFtqXTtcclxuICAgICAgICAgIGlmICh0cmVlLmlkID09PSBlbGVtZW50LmlkICYmICghZWxlbWVudC5wYXJlbnRJZCB8fCB0cmVlLnBhcmVudElkID09PSBlbGVtZW50LnBhcmVudElkKSAmJiAhdHJlZS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QodHJlZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCA1MDApO1xyXG5cclxuICB9XHJcblxyXG4gIGNoZWNrU2VsZWN0ZWRTYW1lTm9kZShpdGVtU2VsZWN0ZWQ6IFRyZWVGbGF0Tm9kZVtdLCBmbGFnOiBib29sZWFuKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpdGVtU2VsZWN0ZWQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXRlbVNlbGVjdGVkW2pdO1xyXG4gICAgICAgIGlmIChlbGVtZW50LmlkICYmIHRyZWUuaWQgPT09IGVsZW1lbnQuaWRcclxuICAgICAgICAgICYmIHRyZWUucGFyZW50SWQgPT09IGVsZW1lbnQucGFyZW50SWQgJiYgIXRyZWUuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGZsYWcgPyB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QodHJlZSkgOiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCh0cmVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEl0ZW1JY29uVHlwZSh0cmVlQ29uZmlnOiBUcmVlQ29uZmlnKSB7XHJcbiAgICBpZiAodHJlZUNvbmZpZy5pdGVtSWNvbiAmJiB0cmVlQ29uZmlnLml0ZW1JY29uLmxlbmd0aCkgcmV0dXJuIHRoaXMuaXRlbUljb25UeXBlLm5hbWU7XHJcbiAgICBpZiAodHJlZUNvbmZpZy5pdGVtSWNvblBhdGggJiYgdHJlZUNvbmZpZy5pdGVtSWNvblBhdGgubGVuZ3RoKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUucGF0aDtcclxuICAgIGlmICh0cmVlQ29uZmlnLml0ZW1JY29uQmFzZTY0ICYmIHRyZWVDb25maWcuaXRlbUljb25CYXNlNjQubGVuZ3RoKSByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUuYmFzZTY0O1xyXG4gICAgaWYgKHRyZWVDb25maWcuaXRlbUljb25TdmcgJiYgdHJlZUNvbmZpZy5pdGVtSWNvblN2Zy5sZW5ndGgpIHJldHVybiB0aGlzLml0ZW1JY29uVHlwZS5zdmc7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtSWNvblR5cGUubm9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNmb3JtZXIgPSAobm9kZTogVHJlZU5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcclxuICAgIGxldCBjaGVja0hhc0NoaWxkID0gdHJ1ZTtcclxuICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKCEoISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkpIHtcclxuICAgICAgY2hlY2tIYXNDaGlsZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgICEhbm9kZS5jaGlsZHJlbiAmJlxyXG4gICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJlxyXG4gICAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAhbm9kZS5jaGlsZHJlblswXS5uYW1lLmxlbmd0aCAmJlxyXG4gICAgICBub2RlLmlkLnRvU3RyaW5nKCkgPT09IHRoaXMuYXJlYU9mQ3VycmVudFByb2Nlc3NcclxuICAgICkge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEodGhpcy5saXN0UGFyZW50T2JqW25vZGUuaWRdID09PSAxKSkge1xyXG4gICAgICBjaGVja0hhc0NoaWxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXhwYW5kYWJsZTogISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCxcclxuICAgICAgbmFtZTogbm9kZS5uYW1lLFxyXG4gICAgICBsZXZlbCxcclxuICAgICAgaWQ6IG5vZGUuaWQsXHJcbiAgICAgIGhhc0NoaWxkOiBjaGVja0hhc0NoaWxkLFxyXG4gICAgICBwYXJlbnRJZDogbm9kZS5wYXJlbnRJZCxcclxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBsZXZlbFR5cGU6IG5vZGUubGV2ZWxUeXBlXHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHRyZWVGbGF0dGVuZXIgPSBuZXcgTWF0VHJlZUZsYXR0ZW5lcihcclxuICAgIHRoaXMudHJhbnNmb3JtZXIsXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5sZXZlbDtcclxuICAgIH0sXHJcbiAgICAobm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xyXG4gICAgfSxcclxuICAgIChub2RlKSA9PiB7XHJcbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuO1xyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKHRoaXMudHJlZUNvbnRyb2wsIHRoaXMudHJlZUZsYXR0ZW5lcik7XHJcblxyXG5cclxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZCAqL1xyXG4gIGRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZTogVHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XHJcblxyXG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSAhdGhpcy5zaW5nbGVTZWxlY3RlZE5vZGUgPyB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKSA6IFtdO1xyXG5cclxuICAgIGlmICghZGVzY2VuZGFudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpO1xyXG5cclxuICAgIGNvbnN0IGFsbFNlbGVjdGVkID0gZGVzY2VuZGFudHMuZXZlcnkoY2hpbGQgPT4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZCkpO1xyXG4gICAgaWYgKCFzZWxlY3RlZCAmJiBhbGxTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcbiAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWxsU2VsZWN0ZWQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgcGFydCBvZiB0aGUgZGVzY2VuZGFudHMgYXJlIHNlbGVjdGVkICovXHJcbiAgZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlOiBUcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gIXRoaXMuc2luZ2xlU2VsZWN0ZWROb2RlID8gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCkgOiBbXTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBkZXNjZW5kYW50cy5zb21lKGNoaWxkID0+IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoY2hpbGQpKTtcclxuICAgIHJldHVybiByZXN1bHQgJiYgIXRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIHRvLWRvIGl0ZW0gc2VsZWN0aW9uLiBTZWxlY3QvZGVzZWxlY3QgYWxsIHRoZSBkZXNjZW5kYW50cyBub2RlICovXHJcbiAgdG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZTogVHJlZUZsYXROb2RlKTogdm9pZCB7XHJcbiAgICAvLyB0cmVlIGhhdmUgZHVwbGljYXRlIG5vZGVcclxuICAgIGlmICh0aGlzLnRyZWVDb25maWcuY2FuSGF2ZUR1cElkKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQgPT09IG5vZGUuaWRcclxuICAgICAgICAgICYmIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLnBhcmVudElkID09PSBub2RlLnBhcmVudElkXHJcbiAgICAgICAgICAmJiAhdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uZGlzYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZSh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi50b2dnbGUobm9kZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHByb2Nlc3MvIGRvY3VtZW50IHNpbmdsZSBzZWxlY3RlZFxyXG4gICAgaWYgKHRoaXMuc2luZ2xlU2VsZWN0ZWROb2RlKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hFdmVudC5lbWl0KHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xyXG5cclxuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkU2FtZU5vZGUoZGVzY2VuZGFudHMsIHRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKSk7XHJcblxyXG4gICAgICAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXHJcbiAgICAgICAgPyB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3QoLi4uZGVzY2VuZGFudHMpXHJcbiAgICAgICAgOiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5kZXNlbGVjdCguLi5kZXNjZW5kYW50cyk7XHJcblxyXG4gICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgY29uc3QgYWxsTm9kZUlzUGFyZW50ID0gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQuZXZlcnkoY2hpbGQgPT4gY2hpbGQuZXhwYW5kYWJsZSk7XHJcbiAgICAgIGlmIChhbGxOb2RlSXNQYXJlbnQpIHtcclxuICAgICAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGVja0JveEV2ZW50LmVtaXQodGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9kb0NoaWxkU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0uaWQgPT09IG5vZGUuaWRcclxuICAgICAgICAmJiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5wYXJlbnRJZCA9PT0gbm9kZS5wYXJlbnRJZFxyXG4gICAgICAgICYmICF0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5kaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZSh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcclxuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLmNoZWNrQm94RXZlbnQuZW1pdCh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZG9JdGVtU2VsZWN0aW9uQnlJZChpZHM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZHMuZm9yRWFjaChcclxuICAgICAgaWQgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5pZCA9PT0gaWRcclxuICAgICAgICAgICAgJiYgIXRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZCh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuICAgIHRoaXMuY2hlY2tCb3hFdmVudC5lbWl0KHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2RvSXRlbVNlbGVjdGlvbihub2RlczogVHJlZU5vZGVbXSk6IHZvaWQge1xyXG4gICAgbm9kZXMuZm9yRWFjaChcclxuICAgICAgbm9kZSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLmlkID09PSBub2RlLmlkICYmXHJcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2ldLnBhcmVudElkID09PSBub2RlLnBhcmVudElkICYmXHJcbiAgICAgICAgICAgICF0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXS5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQodGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZSh0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlc1tpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgICB0aGlzLmNoZWNrQm94RXZlbnQuZW1pdCh0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIG5vZGU6IFRyZWVGbGF0Tm9kZSkgPT4ge1xyXG4gICAgcmV0dXJuIG5vZGUuZXhwYW5kYWJsZTtcclxuICB9O1xyXG5cclxuICBzZWxlY3ROb2RlKG5vZGU6IFRyZWVGbGF0Tm9kZSkge1xyXG4gICAgaWYgKHdpbmRvd1tSZWxhdGVkQ29uc3QuSVNfRElTUExBWV9TRUFSQ0hfUkVTVUxUXSkge1xyXG4gICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoUmVsYXRlZENvbnN0LkhJREVfU0VBUkNIX1JFU1VMVCwgJyonKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy50cmVlQ29uZmlnLnNlbGVjdE9uZSkge1xyXG4gICAgICBub2RlLml0ZW1UeXBlID0gdGhpcy5jaGVja0RhdGFUeXBlU2VsZWN0Tm9kZShub2RlKTtcclxuICAgICAgdGhpcy5pZENoZWNrSWNvbiA9IG5vZGUuaWQ7XHJcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZUV2ZW50LmVtaXQobm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0RhdGFUeXBlU2VsZWN0Tm9kZShub2RlOiBUcmVlRmxhdE5vZGUpIHtcclxuICAgIGxldCBpdGVtVHlwZSA9IC0xO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5tb2R1bGVJZCkge1xyXG4gICAgICBjYXNlIERhdGFUeXBlLnByb2Nlc3M6XHJcbiAgICAgICAgaXRlbVR5cGUgPSBub2RlLmV4cGFuZGFibGUgPyBEYXRhVHlwZS5hcmVhIDogRGF0YVR5cGUucHJvY2VzcztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBEYXRhVHlwZS5kb2N1bWVudDpcclxuICAgICAgICBpdGVtVHlwZSA9IG5vZGUuZXhwYW5kYWJsZSA/IERhdGFUeXBlLmZvbGRlciA6IERhdGFUeXBlLmRvY3VtZW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBpdGVtVHlwZSA9IHRoaXMubW9kdWxlSWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1UeXBlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rm9sZGVyKG5vZGU6IFRyZWVGbGF0Tm9kZSkge1xyXG4gICAgdGhpcy5zZWxlY3RGb2xkZXJFdmVudC5lbWl0KG5vZGUpO1xyXG4gIH1cclxuXHJcbiAgb25FeHBhbmROb2RlKG5vZGU6IFRyZWVGbGF0Tm9kZSwgaXNFeHBhbmROb2RlPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMudHJlZUNvbmZpZy5zZWxlY3RPbmUpIHtcclxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWRMaXN0Lmxlbmd0aCAmJlxyXG4gICAgICAgIChub2RlLmlkID09PSB0aGlzLmRpc2FibGVkTGlzdFt0aGlzLmRpc2FibGVkTGlzdC5sZW5ndGggLSAxXS50b1VwcGVyQ2FzZSgpIHx8XHJcbiAgICAgICAgICBub2RlLnBhcmVudElkID09PSB0aGlzLmRpc2FibGVkTGlzdFt0aGlzLmRpc2FibGVkTGlzdC5sZW5ndGggLSAxXS50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlkQ2hlY2tJY29uID0gbm9kZS5pZDtcclxuICAgICAgbm9kZS5pdGVtVHlwZSA9IHRoaXMuY2hlY2tEYXRhVHlwZVNlbGVjdE5vZGUobm9kZSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZUV2ZW50LmVtaXQobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvd1tSZWxhdGVkQ29uc3QuSVNfRElTUExBWV9TRUFSQ0hfUkVTVUxUXSkge1xyXG4gICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoUmVsYXRlZENvbnN0LkhJREVfU0VBUkNIX1JFU1VMVCwgJyonKTtcclxuICAgIH1cclxuICAgIC8vIHNldCB1c2VFeHBhbmRGZWF0dXJlID0gdHJ1ZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIHRyZWUgbG9hZGluZ1xyXG4gICAgaWYgKCFpc0V4cGFuZE5vZGUgfHwgIXRoaXMudXNlRXhwYW5kRmVhdHVyZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJySW5kZXgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5hcnJJbmRleFtpXSA9PT0gbm9kZS5pZCkge1xyXG4gICAgICAgICAgdGhpcy5hcnJJbmRleC5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0V4cGFuZE5vZGUgJiYgIXRoaXMuZXhwYW5kT25UaXRsZUNsaWNrKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlRXhwYW5kRXZlbnQuZW1pdChub2RlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyBnZXQgYXJyYXkgaW5kZXggdG8gZXhwYW5kIG5vZGUgYWZ0ZXIgcmVmcmVzaCBkYXRhc291cmNlXHJcbiAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgbGV0IGlzQ2hhbmdlID0gZmFsc2U7XHJcbiAgICBsZXQgaXNSZW1vdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuYXJySW5kZXgucHVzaChub2RlLmlkKTtcclxuXHJcbiAgICBjb25zdCBjaGlsZEFycmF5ID0gdGhpcy50cmVlRGF0YS5maWx0ZXIoKHgpID0+IHtcclxuICAgICAgcmV0dXJuIHgucGFyZW50SWQgPT09IG5vZGUuaWQ7XHJcbiAgICB9KTtcclxuICAgIGxldCByb290SWQgPSAnMCc7XHJcbiAgICBsZXQgcGFyZW50RWxlbWVudDogVHJlZU5vZGU7XHJcbiAgICBsZXQgY2hpbGRyZW5MaXN0OiBUcmVlTm9kZVtdO1xyXG4gICAgaWYgKGNoaWxkQXJyYXkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNoaWxkQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5yb290SWQgPT09IHJvb3RJZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZ2V0IGNoaWxkIG5vZGUgZnJvbSBvcmlnaW5hbCBkYXRhc291cmNlXHJcbiAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5nZXRDaGlsZE5vZGUoaXRlbS5yb290SWQsIGNoaWxkQXJyYXkpO1xyXG4gICAgICByb290SWQgPSBpdGVtLnJvb3RJZDtcclxuXHJcbiAgICAgIGluZGV4ID0gdGhpcy5nZXROb2RlSW5kZXgoY2hpbGQuaWQsIHVuZGVmaW5lZCwgdGhpcy5kYXRhU291cmNlWydfdHJlZUNvbnRyb2wnXS5kYXRhTm9kZXMpO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIGNoaWxkIG5vZGUgdG8gZXhwYW5kIG5vZGVcclxuICAgICAgcGFyZW50RWxlbWVudCA9IHRoaXMuZmluZENoaWxkTm9kZShub2RlLmlkLCB0aGlzLmRhdGFTb3VyY2UuZGF0YSk7XHJcbiAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgLy8gdGVtcG9yYXJ5IHJlbW92ZSBhbGwgbm9kZSB3aXRob3V0IGNoaWxkcmVuID0+IHB1cnBvc2UgdG8gYWRkIG5vZGUgZm9sZGVyIGZpcnN0XHJcbiAgICAgICAgaWYgKCFpc1JlbW92ZSkge1xyXG4gICAgICAgICAgY2hpbGRyZW5MaXN0ID0gWy4uLnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRFbGVtZW50KTtcclxuICAgICAgICAgIGlzUmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gYWRkIG5vZGUgZm9sZGVyIGZpcnN0XHJcbiAgICAgICAgcGFyZW50RWxlbWVudC5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcclxuICAgICAgICBpc0NoYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gYWRkIG5vZGUgd2l0aG91dCBjaGlsZHJlbiBhZ2FpblxyXG4gICAgaWYgKGlzUmVtb3ZlKSB7XHJcbiAgICAgIHRoaXMuYWRkQ2hpbGRyZW4ocGFyZW50RWxlbWVudCwgY2hpbGRyZW5MaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZWZyZXNoIGRhdGEgYW5kIGV4cGFuZCB0cmVlIG5vZGUgZnJvbSByb290IG5vZGVcclxuICAgIGlmIChpc0NoYW5nZSkge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUcmVlRGF0YSgpO1xyXG4gICAgICB0aGlzLmFyckluZGV4LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0Tm9kZUluZGV4KGl0ZW0sIHVuZGVmaW5lZCwgdGhpcy5kYXRhU291cmNlWydfdHJlZUNvbnRyb2wnXS5kYXRhTm9kZXMpO1xyXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzW2luZGV4XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpc0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2hpbGRyZW4ocGFyZW50RWxlbWVudD86IFRyZWVOb2RlKSB7XHJcbiAgICBpZiAocGFyZW50RWxlbWVudC5jaGlsZHJlbikge1xyXG4gICAgICBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDaGlsZHJlbihwYXJlbnRFbGVtZW50PzogVHJlZU5vZGUsIGNoaWxkcmVuTGlzdD86IFRyZWVOb2RlW10pIHtcclxuICAgIGlmIChjaGlsZHJlbkxpc3QpIHtcclxuICAgICAgY2hpbGRyZW5MaXN0LmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLnB1c2goZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Tm9kZUluZGV4KGlkOiBzdHJpbmcsIGxldmVsPzogbnVtYmVyLCBkYXRhPzogYW55W10pIHtcclxuICAgIGlmIChsZXZlbCkge1xyXG4gICAgICByZXR1cm4gZGF0YS5maW5kSW5kZXgoKHgpID0+IHtcclxuICAgICAgICByZXR1cm4geC5pZCA9PT0gaWQgJiYgeC5sZXZlbCA9PT0gbGV2ZWw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhLmZpbmRJbmRleCgoeCkgPT4ge1xyXG4gICAgICByZXR1cm4geC5pZCA9PT0gaWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENoaWxkTm9kZShyb290SWQ6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBjaGlsZEFycmF5ID0gZGF0YS5maWx0ZXIoKHgpID0+IHtcclxuICAgICAgcmV0dXJuIHgucm9vdElkID09PSByb290SWQ7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGNoaWxkID0geyBpZDogY2hpbGRBcnJheVswXS5yb290SWQsIG5hbWU6IGNoaWxkQXJyYXlbMF0uc3ViTmFtZSwgY2hpbGRyZW46IFtdIH0gYXMgVHJlZU5vZGU7XHJcbiAgICBjaGlsZEFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgY2hpbGQuY2hpbGRyZW4ucHVzaCh7IGlkOiBpdGVtLmNoaWxkSWQsIG5hbWU6IGl0ZW0uY2hpbGROYW1lLCBwYXJlbnRJZDogcm9vdElkIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2hpbGQ7XHJcbiAgfVxyXG5cclxuICBmaW5kQ2hpbGROb2RlKGlkOiBzdHJpbmcsIGRhdGE6IFRyZWVOb2RlW10pIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxyXG4gICAgZm9yIChjb25zdCBjdXJyZW50RmF0aGVyIG9mIGRhdGEpIHtcclxuICAgICAgaWYgKGN1cnJlbnRGYXRoZXIuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRGYXRoZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyZW50RmF0aGVyLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENoaWxkID0gY3VycmVudEZhdGhlci5jaGlsZHJlbi5maW5kKCh4KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geC5pZCA9PT0gaWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRDaGlsZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGlsZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxyXG4gICAgICAgIGZvciAoY29uc3QgY3VycmVudENoaWxkMSBvZiBjdXJyZW50RmF0aGVyLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICBpZiAoaWQgIT09IGN1cnJlbnRDaGlsZDEuaWQpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kQ2hpbGROb2RlKGlkLCBjdXJyZW50RmF0aGVyLmNoaWxkcmVuKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoVHJlZURhdGEoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGE7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZ2V0Tm9kZUljb24obm9kZTogVHJlZUZsYXROb2RlKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuSWNvbiAmJiB0aGlzLmNsb3NlSWNvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gdGhpcy5vcGVuSWNvbiA6IHRoaXMuY2xvc2VJY29uO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoICh0aGlzLm1vZHVsZUlkKSB7XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUuZG9jdW1lbnQ6IHtcclxuICAgICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMudHJlZURhdGEuZmlsdGVyKHggPT4geyByZXR1cm4geC5yb290SWQgPT09IG5vZGUuaWQ7IH0pO1xyXG4gICAgICAgIGlmIChub2RlRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKG5vZGVEYXRhWzBdLmxldmVsVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIERvY3VtZW50Tm9kZVR5cGUuRGVwYXJ0bWVudEZvbGRlcjpcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2RlcGFydG1lbnRfZm9sZGVyX291dGxpbmVkJyA6ICdkZXBhcnRtZW50X2ZvbGRlcic7XHJcbiAgICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5SZWdpb25hbEZvbGRlcjpcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ3JlZ2lvbmFsX2ZvbGRlcl9vdXRsaW5lZCcgOiAncmVnaW9uYWxfZm9sZGVyJztcclxuICAgICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLlRvcEZvbGRlcjpcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2VudGVycHJpc2VfZm9sZGVyX291dGxpbmVkJyA6ICdlbnRlcnByaXNlX2ZvbGRlcic7XHJcbiAgICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5Gb2xkZXI6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdsb2NhbF9mb2xkZXJfb3V0bGluZWQnIDogJ2xvY2FsX2ZvbGRlcic7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdmb2xkZXJfb3V0bGluZWQnIDogJ2ZvbGRlcic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAna2V5Ym9hcmRfdXAnIDogJ2tleWJvYXJkX2Rvd24nO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUucHJvY2VzczpcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ3Byb2Nlc3NfYXJlYV9vdXRsaW5lZCcgOiAncHJvY2Vzc19hcmVhJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2tleWJvYXJkX3VwJyA6ICdrZXlib2FyZF9kb3duJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEl0ZW1JY29uKG5vZGUpIHtcclxuICAgIHN3aXRjaCAodGhpcy5tb2R1bGVJZCkge1xyXG4gICAgICBjYXNlIERhdGFUeXBlLmRvY3VtZW50OlxyXG4gICAgICAgIHN3aXRjaCAobm9kZS5sZXZlbFR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5EZXBhcnRtZW50Rm9sZGVyOlxyXG4gICAgICAgICAgICByZXR1cm4gJ2RvY3VtZW50X2RlcGFydG1lbnQnO1xyXG4gICAgICAgICAgY2FzZSBEb2N1bWVudE5vZGVUeXBlLlJlZ2lvbmFsRm9sZGVyOlxyXG4gICAgICAgICAgICByZXR1cm4gJ2RvY3VtZW50X3JlZ2lvbmFsJztcclxuICAgICAgICAgIGNhc2UgRG9jdW1lbnROb2RlVHlwZS5Ub3BGb2xkZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAnZG9jdW1lbnRfZW50ZXJwcmlzZSc7XHJcbiAgICAgICAgICBjYXNlIERvY3VtZW50Tm9kZVR5cGUuRm9sZGVyOlxyXG4gICAgICAgICAgICByZXR1cm4gJ2RvY3VtZW50X2xvY2FsJztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiAnZG9jdW1lbnQnO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBEYXRhVHlwZS5wcm9jZXNzOlxyXG4gICAgICAgIHJldHVybiAncHJvY2Vzcyc7XHJcbiAgICAgIGNhc2UgRGF0YVR5cGUuY2hlY2tsaXN0OlxyXG4gICAgICAgIHJldHVybiAnY2hlY2tsaXN0JztcclxuICAgICAgY2FzZSBEYXRhVHlwZS5kZXZpYXRpb246XHJcbiAgICAgICAgcmV0dXJuICdkZXZpYXRpb24nO1xyXG4gICAgICBjYXNlIERhdGFUeXBlLnJpc2s6XHJcbiAgICAgICAgcmV0dXJuICdyaXNrJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ2RvY3VtZW50JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdEZvbGRlck5vZGUobm9kZTogVHJlZUZsYXROb2RlKSB7XHJcbiAgICBpZiAoIXRoaXMuZXhwYW5kT25UaXRsZUNsaWNrKSB7XHJcbiAgICAgIHRoaXMub25FeHBhbmROb2RlKG5vZGUsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Tm9kZUlkKG5vZGU6IFRyZWVGbGF0Tm9kZSkge1xyXG4gICAgcmV0dXJuIGBfJHtub2RlLnBhcmVudElkID8gbm9kZS5wYXJlbnRJZCA6ICcnfV8ke25vZGUuaWR9XyR7bm9kZS5sZXZlbH1gO1xyXG4gIH1cclxufVxyXG4iLCI8bWF0LXRyZWVcclxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcclxuICBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIlxyXG4gIGNsYXNzPVwidHJlZV9fY29udGFpbmVyXCJcclxuPlxyXG4gIDxtYXQtdHJlZS1ub2RlXHJcbiAgICBjbGFzcz1cInRyZWUtYnJhbmNoXCJcclxuICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCJcclxuICAgIG1hdFRyZWVOb2RlVG9nZ2xlXHJcbiAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICA+XHJcbiAgICA8IS0tIGZvcm0gdGh1IDEgLSBjaGlsZCAtLT5cclxuICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgcW1zLWdyb3VwLW9wdGlvbnNcclxuICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAqbmdJZj1cIm5vZGUubmFtZSAmJiBzaG93Q2hlY2tCb3ggJiYgIW9ubHlDaGVja0JveEZvckNoaWxkICYmICFvbmx5Rm9sZGVyXCJcclxuICAgICAgY2xhc3M9XCJjaGVja2xpc3QtbGVhZi1ub2RlXCJcclxuICAgICAgW2NoZWNrZWRdPVwiY2hlY2tsaXN0U2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAoY2hhbmdlKT1cInRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcclxuICAgID5cclxuICAgIDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgIDwhLS0gZm9ybSB0aHUgMiAtLT5cclxuICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgcW1zLWdyb3VwLW9wdGlvbnNcclxuICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuZGlzYWJsZWRcIlxyXG4gICAgICBjb2xvcj1cImRlZmF1bHRcIlxyXG4gICAgICAqbmdJZj1cIm5vZGUubmFtZSAmJiBzaG93Q2hlY2tCb3ggJiYgb25seUNoZWNrQm94Rm9yQ2hpbGQgJiYgIW9ubHlGb2xkZXJcIlxyXG4gICAgICBjbGFzcz1cIm1sLTEwIGNoZWNrbGlzdC1sZWFmLW5vZGVcIlxyXG4gICAgICBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwidG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIlxyXG4gICAgPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImV4cGFuZC1ub2RlXCJcclxuICAgICAgKm5nSWY9XCJub2RlLm5hbWUgJiYgIW9ubHlGb2xkZXJcIlxyXG4gICAgICBbY2xhc3MuYmdTZWxlY3RlZF09XCJ0cmVlQ29uZmlnLnNlbGVjdE9uZSAmJiBpZENoZWNrSWNvbiA9PSBub2RlLmlkXCJcclxuICAgICAgKGNsaWNrKT1cInNlbGVjdE5vZGUobm9kZSlcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kLW5vZGVfX3RleHRcIj5cclxuICAgICAgICA8bWF0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwiZGlzcGxheVR5cGUgPT09IGl0ZW1JY29uVHlwZS5uYW1lICYmICFvbmx5Q2hlY2tCb3hGb3JDaGlsZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3IgbWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGl0ZW1JY29uIH19XHJcbiAgICAgICAgPC9tYXQtaWNvbj5cclxuXHJcbiAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBpdGVtSWNvblR5cGUuc3ZnICYmICFvbmx5Q2hlY2tCb3hGb3JDaGlsZFwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3IgbWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIlxyXG4gICAgICAgICAgW3N2Z0ljb25dPVwiaXRlbUljb25TdmdcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L21hdC1pY29uPlxyXG5cclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBpdGVtSWNvblR5cGUucGF0aCAmJiAhb25seUNoZWNrQm94Rm9yQ2hpbGRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJtYXQtaWNvblwiXHJcbiAgICAgICAgICBbc3JjXT1cIml0ZW1JY29uUGF0aFwiXHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gaXRlbUljb25UeXBlLmJhc2U2NCAmJiAhb25seUNoZWNrQm94Rm9yQ2hpbGRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJtYXQtaWNvbiBpbWFnZS1iYXNlNjRcIlxyXG4gICAgICAgICAgW3NyY109XCJnZXRJbWFnZVBhdGgoKVwiXHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBpdGVtSWNvblR5cGUubm9uZSAmJiAhb25seUNoZWNrQm94Rm9yQ2hpbGRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yIG1hdGVyaWFsLWljb25zLW91dGxpbmVkXCJcclxuICAgICAgICAgIFtzdmdJY29uXT1cImdldEl0ZW1JY29uKG5vZGUpXCJcclxuICAgICAgICA+PC9tYXQtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbm9kZVwiPnt7IG5vZGUubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgIGNsYXNzPVwiaWNvbi1jaGVja1wiXHJcbiAgICAgICAgKm5nSWY9XCJ0cmVlQ29uZmlnLnNlbGVjdE9uZSAmJiBpZENoZWNrSWNvbiA9PSBub2RlLmlkXCJcclxuICAgICAgICA+ZG9uZTwvbWF0LWljb25cclxuICAgICAgPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9tYXQtdHJlZS1ub2RlPlxyXG5cclxuICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIiBtYXRUcmVlTm9kZVBhZGRpbmc+XHJcbiAgICA8IS0tIGZvcm0gdGh1IDEgLSBwYXJlbnQgLS0+XHJcbiAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgIHFtcy1ncm91cC1vcHRpb25zXHJcbiAgICAgIFtkaXNhYmxlZF09XCJub2RlLmRpc2FibGVkXCJcclxuICAgICAgY29sb3I9XCJkZWZhdWx0XCJcclxuICAgICAgKm5nSWY9XCJzaG93Q2hlY2tCb3ggJiYgIW9ubHlDaGVja0JveEZvckNoaWxkXCJcclxuICAgICAgW2NoZWNrZWRdPVwiZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAoY2hhbmdlKT1cInRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcclxuICAgID48L21hdC1jaGVja2JveD5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJidXR0b24tYm9kZXJcIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiIW5vZGUuaGFzQ2hpbGRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIid0b2dnbGUgJyArIG5vZGUuZmlsZW5hbWVcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb25cclxuICAgICAgICAqbmdJZj1cIm9wZW5JY29uICYmIGNsb3NlSWNvblwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICBjb2xvcjogdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/IG9wZW5JY29uQ29sb3IgOiBjbG9zZUljb25Db2xvclxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgID57eyBnZXROb2RlSWNvbihub2RlKSB9fTwvbWF0LWljb25cclxuICAgICAgPlxyXG4gICAgICA8bWF0LWljb25cclxuICAgICAgICAqbmdJZj1cIiFvcGVuSWNvbiB8fCAhY2xvc2VJY29uXCJcclxuICAgICAgICBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICdvcGVuLWljb24nOiB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpLFxyXG4gICAgICAgICAgJ25vdC1kZXBhcnRtZW50LWljb24nOiBtb2R1bGVJZCAhPT0gZGF0YVR5cGUuZG9jdW1lbnRcclxuICAgICAgICB9XCJcclxuICAgICAgICBbc3ZnSWNvbl09XCJnZXROb2RlSWNvbihub2RlKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPHNwYW5cclxuICAgICAgKm5nSWY9XCJleHBhbmRPblRpdGxlQ2xpY2tcIlxyXG4gICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxyXG4gICAgICBjbGFzcz1cInRleHQtbm9kZS1wYXJlbnRcIlxyXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgIChjbGljayk9XCJvbkV4cGFuZE5vZGUobm9kZSlcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgY29sb3I6IHRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyBvcGVuSWNvbkNvbG9yIDogJyMwMDAwMDAnXHJcbiAgICAgIH1cIlxyXG4gICAgPlxyXG4gICAgICA8c3Bhbj57eyBub2RlLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgIGNsYXNzPVwiaWNvbi1jaGVja1wiXHJcbiAgICAgICAgKm5nSWY9XCJ0cmVlQ29uZmlnLnNlbGVjdE9uZSAmJiBpZENoZWNrSWNvbiA9PSBub2RlLmlkXCJcclxuICAgICAgICA+ZG9uZTwvbWF0LWljb25cclxuICAgICAgPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW5cclxuICAgICAgKm5nSWY9XCIhZXhwYW5kT25UaXRsZUNsaWNrXCJcclxuICAgICAgY2xhc3M9XCJ0ZXh0LW5vZGUtcGFyZW50XCJcclxuICAgICAgKGNsaWNrKT1cInNlbGVjdEZvbGRlck5vZGUobm9kZSlcIlxyXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgIFtpZF09XCJnZXROb2RlSWQobm9kZSlcIlxyXG4gICAgPlxyXG4gICAgICA8c3Bhbj57eyBub2RlLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgIGNsYXNzPVwiaWNvbi1jaGVja1wiXHJcbiAgICAgICAgKm5nSWY9XCJ0cmVlQ29uZmlnLnNlbGVjdE9uZSAmJiBpZENoZWNrSWNvbiA9PSBub2RlLmlkXCJcclxuICAgICAgICA+ZG9uZTwvbWF0LWljb25cclxuICAgICAgPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvbWF0LXRyZWUtbm9kZT5cclxuPC9tYXQtdHJlZT5cclxuIl19