barsa-sap-ui 2.1.1 → 2.1.3

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 (243) hide show
  1. package/fesm2022/barsa-sap-ui.mjs +419 -367
  2. package/fesm2022/barsa-sap-ui.mjs.map +1 -1
  3. package/lib/barsa-bar-download-file/barsa-bar-download-file.component.d.ts +10 -0
  4. package/lib/barsa-sap-ui.module.d.ts +237 -236
  5. package/lib/file-viewer-popover/file-viewer-popover.component.d.ts +1 -1
  6. package/lib/ui-map/ui-map.component.d.ts +2 -0
  7. package/package.json +3 -5
  8. package/public-api.d.ts +1 -0
  9. package/esm2022/barsa-sap-ui.mjs +0 -5
  10. package/esm2022/lib/apply-conditional-formmatings.directive.mjs +0 -89
  11. package/esm2022/lib/avatar-size.pipe.mjs +0 -40
  12. package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +0 -41
  13. package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +0 -145
  14. package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +0 -23
  15. package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +0 -29
  16. package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +0 -24
  17. package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +0 -24
  18. package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +0 -31
  19. package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +0 -41
  20. package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +0 -24
  21. package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +0 -242
  22. package/esm2022/lib/barsa-chat/chat.model.mjs +0 -8
  23. package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +0 -13
  24. package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +0 -22
  25. package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +0 -66
  26. package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +0 -78
  27. package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +0 -22
  28. package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +0 -13
  29. package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +0 -15
  30. package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +0 -72
  31. package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +0 -23
  32. package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +0 -14
  33. package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +0 -14
  34. package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +0 -26
  35. package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +0 -71
  36. package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +0 -40
  37. package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +0 -61
  38. package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +0 -45
  39. package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +0 -58
  40. package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +0 -27
  41. package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +0 -94
  42. package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +0 -22
  43. package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +0 -37
  44. package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +0 -41
  45. package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +0 -29
  46. package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +0 -23
  47. package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +0 -43
  48. package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +0 -83
  49. package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +0 -57
  50. package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +0 -159
  51. package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +0 -17
  52. package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +0 -30
  53. package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +0 -14
  54. package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +0 -34
  55. package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +0 -46
  56. package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +0 -79
  57. package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +0 -30
  58. package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +0 -31
  59. package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +0 -28
  60. package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +0 -102
  61. package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +0 -26
  62. package/esm2022/lib/barsa-sap-ui-routing.module.mjs +0 -18
  63. package/esm2022/lib/barsa-sap-ui.module.mjs +0 -374
  64. package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +0 -29
  65. package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +0 -170
  66. package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +0 -18
  67. package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +0 -29
  68. package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +0 -222
  69. package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +0 -87
  70. package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +0 -60
  71. package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +0 -26
  72. package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +0 -23
  73. package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +0 -37
  74. package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +0 -418
  75. package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +0 -36
  76. package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +0 -153
  77. package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +0 -19
  78. package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +0 -216
  79. package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +0 -74
  80. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -50
  81. package/esm2022/lib/captcha-field/captcha-field.component.mjs +0 -28
  82. package/esm2022/lib/card-item/card-item.component.mjs +0 -64
  83. package/esm2022/lib/card-view-content/card-view-content.component.mjs +0 -46
  84. package/esm2022/lib/col-renderer.directive.mjs +0 -46
  85. package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +0 -56
  86. package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +0 -60
  87. package/esm2022/lib/column-renderer/column-renderer.component.mjs +0 -88
  88. package/esm2022/lib/constants.mjs +0 -425
  89. package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +0 -41
  90. package/esm2022/lib/device-info-field-base.mjs +0 -23
  91. package/esm2022/lib/dialog-handler.directive.mjs +0 -28
  92. package/esm2022/lib/download-files.directive.mjs +0 -33
  93. package/esm2022/lib/dynamic-page-size.pipe.mjs +0 -26
  94. package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +0 -44
  95. package/esm2022/lib/file-viewer/file-viewer.component.mjs +0 -47
  96. package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +0 -71
  97. package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +0 -39
  98. package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -171
  99. package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +0 -50
  100. package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +0 -62
  101. package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +0 -45
  102. package/esm2022/lib/form-wizard/form-wizard.component.mjs +0 -21
  103. package/esm2022/lib/fullscreen-dialog.directive.mjs +0 -59
  104. package/esm2022/lib/fullscreen-files.directive.mjs +0 -42
  105. package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +0 -213
  106. package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +0 -215
  107. package/esm2022/lib/global-search/global-search.component.mjs +0 -27
  108. package/esm2022/lib/global-search-module/global-search-module.component.mjs +0 -29
  109. package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +0 -25
  110. package/esm2022/lib/header-avatar/header-avatar.component.mjs +0 -18
  111. package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +0 -48
  112. package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -23
  113. package/esm2022/lib/index.mjs +0 -543
  114. package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +0 -32
  115. package/esm2022/lib/layout-actions/layout-actions.component.mjs +0 -70
  116. package/esm2022/lib/layout-control/layout-control.component.mjs +0 -302
  117. package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +0 -183
  118. package/esm2022/lib/list-item/list-item.component.mjs +0 -34
  119. package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +0 -42
  120. package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +0 -82
  121. package/esm2022/lib/ly-label/ly-label.component.mjs +0 -37
  122. package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +0 -83
  123. package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +0 -17
  124. package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +0 -24
  125. package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +0 -83
  126. package/esm2022/lib/ly-line/ly-line.component.mjs +0 -56
  127. package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +0 -22
  128. package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +0 -45
  129. package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +0 -44
  130. package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +0 -51
  131. package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +0 -43
  132. package/esm2022/lib/mask/mask.component.mjs +0 -22
  133. package/esm2022/lib/message-strip/message-strip.component.mjs +0 -28
  134. package/esm2022/lib/models/grid-data-provider.mjs +0 -114
  135. package/esm2022/lib/models/grid-view.mjs +0 -2
  136. package/esm2022/lib/models/index.mjs +0 -2
  137. package/esm2022/lib/no-data/no-data.component.mjs +0 -31
  138. package/esm2022/lib/notification-item/notification-item.component.mjs +0 -57
  139. package/esm2022/lib/notification-popup.service.mjs +0 -92
  140. package/esm2022/lib/object-status-icon.pipe.mjs +0 -26
  141. package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +0 -18
  142. package/esm2022/lib/report-navigator/report-navigator.component.mjs +0 -68
  143. package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +0 -60
  144. package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +0 -35
  145. package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +0 -97
  146. package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +0 -88
  147. package/esm2022/lib/report-tree-base.mjs +0 -386
  148. package/esm2022/lib/report-view-renderer.directive.mjs +0 -385
  149. package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +0 -50
  150. package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +0 -84
  151. package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +0 -72
  152. package/esm2022/lib/sap-font-class.pipe.mjs +0 -29
  153. package/esm2022/lib/sap-font.pipe.mjs +0 -29
  154. package/esm2022/lib/sap-size.pipe.mjs +0 -27
  155. package/esm2022/lib/sap-ui-report-base.component.mjs +0 -805
  156. package/esm2022/lib/search-panel/search-panel.component.mjs +0 -63
  157. package/esm2022/lib/static-text/static-text.component.mjs +0 -15
  158. package/esm2022/lib/table-th.directive.mjs +0 -86
  159. package/esm2022/lib/title/title.component.mjs +0 -15
  160. package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +0 -34
  161. package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +0 -33
  162. package/esm2022/lib/ui-button/ui-button.component.mjs +0 -32
  163. package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +0 -53
  164. package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +0 -57
  165. package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +0 -42
  166. package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +0 -39
  167. package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +0 -50
  168. package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +0 -38
  169. package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +0 -191
  170. package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +0 -150
  171. package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +0 -110
  172. package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +0 -53
  173. package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +0 -121
  174. package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +0 -100
  175. package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +0 -32
  176. package/esm2022/lib/ui-graph/ui-graph.component.mjs +0 -17
  177. package/esm2022/lib/ui-grid/ui-grid.component.mjs +0 -25
  178. package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +0 -43
  179. package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +0 -66
  180. package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +0 -75
  181. package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +0 -58
  182. package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +0 -123
  183. package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +0 -16
  184. package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +0 -11
  185. package/esm2022/lib/ui-label/ui-label.component.mjs +0 -12
  186. package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +0 -379
  187. package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +0 -84
  188. package/esm2022/lib/ui-map/ui-map.component.mjs +0 -58
  189. package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +0 -124
  190. package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +0 -19
  191. package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +0 -14
  192. package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +0 -55
  193. package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +0 -429
  194. package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +0 -28
  195. package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +0 -37
  196. package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +0 -59
  197. package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +0 -93
  198. package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +0 -36
  199. package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +0 -56
  200. package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +0 -28
  201. package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +0 -33
  202. package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +0 -27
  203. package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +0 -21
  204. package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +0 -268
  205. package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +0 -101
  206. package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +0 -261
  207. package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +0 -48
  208. package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +0 -36
  209. package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +0 -46
  210. package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +0 -24
  211. package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +0 -55
  212. package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +0 -36
  213. package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +0 -20
  214. package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +0 -289
  215. package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +0 -49
  216. package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +0 -52
  217. package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +0 -48
  218. package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +0 -24
  219. package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +0 -53
  220. package/esm2022/lib/ui-tree/ui-tree.component.mjs +0 -114
  221. package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +0 -100
  222. package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +0 -23
  223. package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +0 -306
  224. package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +0 -25
  225. package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +0 -93
  226. package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +0 -119
  227. package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +0 -32
  228. package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +0 -48
  229. package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +0 -53
  230. package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +0 -114
  231. package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +0 -43
  232. package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +0 -196
  233. package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +0 -44
  234. package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +0 -84
  235. package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +0 -65
  236. package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +0 -116
  237. package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +0 -54
  238. package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +0 -174
  239. package/esm2022/lib/upload-file-status.pipe.mjs +0 -28
  240. package/esm2022/lib/util-chat-time-badge.pipe.mjs +0 -18
  241. package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +0 -23
  242. package/esm2022/lib/wizard-layout.directive.mjs +0 -103
  243. package/esm2022/public-api.mjs +0 -233
@@ -1,386 +0,0 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
3
- import { debounceTime, map, takeUntil } from 'rxjs/operators';
4
- import { BarsaApi, getAllItemsPerChildren, setOneDepthLevel } from 'barsa-novin-ray-core';
5
- import { SapUiReportBaseComponent } from './sap-ui-report-base.component';
6
- import * as i0 from "@angular/core";
7
- export class ReportTreeBaseComponent extends SapUiReportBaseComponent {
8
- constructor() {
9
- super(...arguments);
10
- this._dragMove = new Subject();
11
- this._selectedNodeSource = new BehaviorSubject(null);
12
- this._rootSource = new BehaviorSubject(null);
13
- }
14
- get _root() {
15
- return this._rootSource.getValue();
16
- }
17
- ngOnInit() {
18
- this.selectedNode$ = this._selectedNodeSource.asObservable();
19
- this.root$ = this._rootSource.asObservable().pipe(takeUntil(this._onDestroy$));
20
- super.ngOnInit();
21
- this.rtl$ = this._portalService.rtl$;
22
- this.contentDensity$ = this._contentDensityService.contentDensity;
23
- this._rootSource.next(this.context.root);
24
- if (this.viewSetting?.DefaultCollapsed) {
25
- this.collapseAll();
26
- }
27
- this._selectedNodeSource.next(this.context.selNode);
28
- this.context.on({
29
- rootChanged: (root) => {
30
- this._rootSource.next(root);
31
- },
32
- selectedNodeChange: (node) => {
33
- this._selectedNodeSource.next(node);
34
- }
35
- });
36
- this._rootSource
37
- .pipe(takeUntil(this._onDestroy$), map((root) => {
38
- if (root) {
39
- const moList = [];
40
- const autoOpenLevels = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.View.TreeAutoOpenLevels', 1);
41
- getAllItemsPerChildren(root, 0, moList, root, autoOpenLevels);
42
- return moList;
43
- }
44
- return [];
45
- }))
46
- .subscribe((flatMoDataList) => {
47
- this.flatMoDataList = flatMoDataList.map((c) => ({
48
- ...c,
49
- parentNode: c.parentNode ? { ...c.parentNode } : null
50
- }));
51
- });
52
- this._resetDropActionTodo();
53
- this._dragMove
54
- .asObservable()
55
- .pipe(takeUntil(this._onDestroy$), debounceTime(50))
56
- .subscribe((event) => {
57
- this._doDragMove(event);
58
- });
59
- }
60
- onCreateNew(e) {
61
- this.context.fireEvent('createNew', e);
62
- }
63
- dragMoved(event) {
64
- this._dragMove.next(event);
65
- }
66
- drop(event) {
67
- this._removeNoDrops();
68
- this._clearDragInfo();
69
- const dragAction = this.dropActionTodo.action;
70
- if (!dragAction) {
71
- return;
72
- }
73
- if (dragAction === 'forbid') {
74
- ReportTreeBaseComponent._showForbiddenMoveAlert();
75
- return;
76
- }
77
- const draggedItemId = event.item.data;
78
- const targetItemId = this.dropActionTodo.targetId;
79
- const draggedItem = this._getNodeById(draggedItemId);
80
- const targetItem = this._getNodeById(targetItemId);
81
- const oldParentNodeId = draggedItem.parentNode?.Data?.Id || '$Root';
82
- const newParentNodeId = targetItem.parentNode?.Data?.Id || '$Root';
83
- const oldParentNode = draggedItem.parentNode;
84
- let newParentNode = targetItem.parentNode;
85
- if (oldParentNode && newParentNode) {
86
- switch (dragAction) {
87
- case 'before':
88
- case 'after': {
89
- let serverTarget = targetItem;
90
- if (dragAction === 'after') {
91
- const targetIndex = this.flatMoDataList.findIndex((c) => c.Data.Id === targetItem.Data.Id);
92
- if (targetIndex === this.flatMoDataList.length - 1) {
93
- serverTarget = null;
94
- }
95
- else {
96
- const afterTarget = this.flatMoDataList[targetIndex + 1];
97
- if (afterTarget.parentNode === targetItem.parentNode) {
98
- serverTarget = afterTarget;
99
- }
100
- else {
101
- serverTarget = null;
102
- }
103
- }
104
- }
105
- this._saveToServer(draggedItem.Data.Id, serverTarget, newParentNode);
106
- this._changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId);
107
- if (newParentNodeId !== '$Root') {
108
- const i = this.flatMoDataList.indexOf(draggedItem) -
109
- this.flatMoDataList.indexOf(targetItem.parentNode);
110
- newParentNode?.children.splice(i, 0, draggedItem);
111
- }
112
- // send new moDataList To server:
113
- // (draggedItem, draggedItem.parentNode, draggedItem.parentNode.children?.indexOf(draggedItem))
114
- break;
115
- }
116
- case 'inside': {
117
- newParentNode = targetItem;
118
- this._saveToServer(draggedItem.Data.Id, null, newParentNode);
119
- this._moveNodeInsideAnother(draggedItem, targetItem);
120
- break;
121
- }
122
- }
123
- setOneDepthLevel(newParentNode);
124
- setOneDepthLevel(oldParentNode);
125
- this._clearDragInfo(true);
126
- }
127
- }
128
- _rebindRoot() {
129
- this._rootSource.next(this._root);
130
- }
131
- _saveToServer(draggedId, target, parent) {
132
- const targetId = target ? target.Data.Id : '0';
133
- const parentId = parent.Data.Id === '$Root' ? '0' : parent.Data.Id;
134
- BarsaApi.Bw.RunBlMethod('MoveTreeNode', draggedId, targetId, parentId);
135
- }
136
- confirmDialog(selectedNode) {
137
- this.dialogRef.close(selectedNode);
138
- }
139
- dismissDialog() {
140
- this.dialogRef.dismiss();
141
- }
142
- collapseAll() {
143
- this.context.fireEvent('collapseAll');
144
- }
145
- openMoveToDialog(sourceNode, device, dialogTmp) {
146
- const config = {
147
- ...this.dialogConfig,
148
- data: { context: this.context },
149
- mobile: device === 'mobile',
150
- minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
151
- minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight
152
- };
153
- this.dialogRef = this._dialogService.open(dialogTmp, config);
154
- this.dialogRef.afterClosed.subscribe((destinationNode) => {
155
- if (!destinationNode) {
156
- return;
157
- }
158
- const canMove = this._canMove(sourceNode, destinationNode);
159
- if (canMove) {
160
- this._moveNodeInsideAnother(sourceNode, destinationNode);
161
- }
162
- else {
163
- ReportTreeBaseComponent._showForbiddenMoveAlert();
164
- }
165
- this._rootSource.next(this._root);
166
- });
167
- }
168
- selectNodeInMoveDialog(ev) {
169
- this.dialogSelectedNode = ev.node;
170
- }
171
- loadChildren(node) {
172
- this.context.fireEvent('loadNodeChildren', node);
173
- }
174
- /* eslint-disable */
175
- updateGridSetting() { }
176
- _selectNode(node) {
177
- this.context.selNode = node;
178
- this._selectedNodeSource.next(node);
179
- this.context.fireEvent('click');
180
- this.context.fireEvent('selectionchange');
181
- }
182
- /* eslint-disable */
183
- _deselectNode() {
184
- this.context.selNode = null;
185
- this._selectedNodeSource.next(null);
186
- }
187
- _raiseRowClick(index, mo) {
188
- this.context.selNode = mo;
189
- this.context?.fireEvent('dblclick', this.context, index, mo);
190
- }
191
- _resetDropActionTodo() {
192
- this.dropActionTodo = { targetId: null, action: null };
193
- }
194
- _changeDraggedItemsOrder(draggedItem, targetItem, newParentNode, oldParentNode, oldParentNodeId) {
195
- this._removeDraggedItemFromMoDataList(draggedItem);
196
- if (oldParentNodeId !== '$Root') {
197
- // oldParentNode.children?.remove(draggedItem);
198
- oldParentNode.children = oldParentNode.children.filter((c) => c.Data.Id !== draggedItem.Data.Id);
199
- oldParentNode.leaf = !(oldParentNode.children?.length > 0);
200
- oldParentNode.Data.$HasChildren = !oldParentNode.leaf;
201
- }
202
- draggedItem.parentNode = newParentNode;
203
- this._setLevelForDraggedItems(draggedItem, newParentNode.level || 0);
204
- const targetIndex = this.flatMoDataList.indexOf(targetItem);
205
- const index = this.dropActionTodo.action === 'before' ? targetIndex : this._nextIndexInMoDataList(targetItem);
206
- this._addDraggedItemsToMoDataList(draggedItem, index);
207
- }
208
- _addDraggedItemsToMoDataList(node, i) {
209
- this.flatMoDataList.splice(i, 0, node);
210
- node?.children?.forEach((child) => {
211
- i++;
212
- i = this._addDraggedItemsToMoDataList(child, i);
213
- });
214
- return i;
215
- }
216
- _removeDraggedItemFromMoDataList(node) {
217
- node?.children?.forEach((child) => {
218
- this._removeDraggedItemFromMoDataList(child);
219
- });
220
- this.flatMoDataList.remove(node);
221
- }
222
- _nextIndexInMoDataList(node) {
223
- return this.flatMoDataList.indexOf(node) + this._allNestedChildesCount(node) + 1;
224
- }
225
- _allNestedChildesCount(node, i = 0) {
226
- node.children?.forEach((child) => {
227
- i++;
228
- if (child.children?.length > 0) {
229
- i = this._allNestedChildesCount(child, i);
230
- }
231
- });
232
- return i;
233
- }
234
- _getNodeById(id) {
235
- let node;
236
- for (const mo of this.flatMoDataList) {
237
- if (mo.Data.Id === id) {
238
- node = mo;
239
- }
240
- }
241
- return node;
242
- }
243
- _setLevelForDraggedItems(node, parentLevel) {
244
- parentLevel++;
245
- node.level = parentLevel;
246
- node?.children?.forEach((child) => {
247
- this._setLevelForDraggedItems(child, parentLevel);
248
- });
249
- }
250
- _moveNodeInsideAnother(sourceNode, destinationNode) {
251
- const oldParentNode = sourceNode.parentNode;
252
- const oldParentNodeId = oldParentNode?.Data?.Id || '$Root';
253
- this._changeDraggedItemsOrder(sourceNode, destinationNode, destinationNode, oldParentNode, oldParentNodeId);
254
- this.context.fireEvent('moveNodeInsideAnother', sourceNode, destinationNode);
255
- }
256
- _clearDragInfo(dropped = false) {
257
- if (dropped) {
258
- this._resetDropActionTodo();
259
- }
260
- this.el.nativeElement
261
- .querySelectorAll('.drop-before')
262
- .forEach((element) => this._renderer.removeClass(element, 'drop-before'));
263
- this.el.nativeElement
264
- .querySelectorAll('.drop-after')
265
- .forEach((element) => this._renderer.removeClass(element, 'drop-after'));
266
- this.el.nativeElement
267
- .querySelectorAll('.drop-inside')
268
- .forEach((element) => this._renderer.removeClass(element, 'drop-inside'));
269
- }
270
- _stopDragging() {
271
- this._clearDragInfo();
272
- this._resetDropActionTodo();
273
- }
274
- _showDragInfo() {
275
- this._clearDragInfo();
276
- if (this.dropActionTodo.targetId) {
277
- const parent = this._getNodeById(this.dropActionTodo.targetId);
278
- const newParentId = parent?.parentNode?.Data?.Id || '$Root';
279
- const targetNodeElement = this.el.nativeElement.querySelector('#node-' + this.dropActionTodo.targetId);
280
- if (!targetNodeElement) {
281
- this._resetDropActionTodo();
282
- return;
283
- }
284
- else if (newParentId === '$Root' && this.dropActionTodo.action !== 'inside') {
285
- const rootContainer = this.el.nativeElement.querySelector('fd-layout-panel');
286
- this._renderer.addClass(rootContainer, 'drop-inside');
287
- }
288
- this._renderer.addClass(targetNodeElement, 'drop-' + this.dropActionTodo?.action);
289
- }
290
- }
291
- _doDragMove(event) {
292
- const elementFromPoint = document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y);
293
- if (!elementFromPoint) {
294
- this._stopDragging();
295
- return;
296
- }
297
- const targetNodeElement = elementFromPoint.classList.contains('node-item')
298
- ? elementFromPoint
299
- : elementFromPoint.closest('.node-item');
300
- if (!targetNodeElement) {
301
- this._stopDragging();
302
- return;
303
- }
304
- this.dropActionTodo = {
305
- targetId: targetNodeElement.getAttribute('data-id')
306
- };
307
- const targetRect = targetNodeElement.getBoundingClientRect();
308
- const oneThird = targetRect.height / 3;
309
- if (event.pointerPosition.y - targetRect.top < oneThird) {
310
- // before
311
- this.dropActionTodo.action = 'before';
312
- }
313
- else if (event.pointerPosition.y - targetRect.top > 2 * oneThird) {
314
- // after
315
- this.dropActionTodo.action = 'after';
316
- }
317
- else {
318
- // inside
319
- this.dropActionTodo.action = 'inside';
320
- }
321
- this._setNoDropItems(event.source.data);
322
- this._setNoDropStyle();
323
- const targetNode = this._getNodeById(this.dropActionTodo.targetId);
324
- if (targetNode.noDrop) {
325
- this._stopDragging();
326
- this.dropActionTodo.action = 'forbid';
327
- return;
328
- }
329
- this._showDragInfo();
330
- }
331
- _removeNoDrops() {
332
- this.flatMoDataList
333
- .filter((node) => node.noDrop)
334
- .forEach((node) => {
335
- node.noDrop = false;
336
- const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
337
- if (el) {
338
- this._renderer.removeClass(el, 'no-drop');
339
- }
340
- });
341
- }
342
- _setNoDropItems(draggedItemId) {
343
- const node = this._getNodeById(draggedItemId);
344
- node.noDrop = true;
345
- node.children?.forEach((child) => {
346
- this._setNoDropItems(child.Data.Id);
347
- });
348
- }
349
- _setNoDropStyle() {
350
- this.flatMoDataList
351
- .filter((node) => node.noDrop)
352
- .forEach((node) => {
353
- const el = this.el.nativeElement.querySelector('#node-' + node.Data.Id);
354
- if (el) {
355
- this._renderer.addClass(el, 'no-drop');
356
- }
357
- });
358
- }
359
- _canMove(sourceNode, destinationNode) {
360
- let canMove = true;
361
- if (sourceNode.Data.Id === destinationNode.Data.Id) {
362
- canMove = false;
363
- }
364
- else {
365
- sourceNode.children?.foreach((child) => {
366
- canMove = this._canMove(sourceNode, child);
367
- });
368
- }
369
- return canMove;
370
- }
371
- /* eslint-disable */
372
- static _showForbiddenMoveAlert() {
373
- BarsaApi.Bw.Msg.Error('نمیتوانید آیتم را به زیرشاخه خودش منتقل کنید.');
374
- }
375
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
376
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReportTreeBaseComponent, selector: "bsu-report-tree-base", usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
377
- }
378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportTreeBaseComponent, decorators: [{
379
- type: Component,
380
- args: [{
381
- selector: 'bsu-report-tree-base',
382
- template: '',
383
- changeDetection: ChangeDetectionStrategy.OnPush
384
- }]
385
- }] });
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXRyZWUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3JlcG9ydC10cmVlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5RCxPQUFPLEVBQ0gsUUFBUSxFQUtSLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDbkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFRMUUsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHdCQUFpRDtJQUw5Rjs7UUFZSSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUlyQix3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFDcEUsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7S0F3WnpFO0lBdlpHLElBQVksS0FBSztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9FLEtBQUssQ0FBQyxRQUFRLEVBQUUs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UUFBUSxDQUFDLFVBQVUsRUFBRSxlQUFlO1FBQ3hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNKLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0Qsb0JBQW9CO0lBQ1osTUFBTSxDQUFDLHVCQUF1QjtRQUNsQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMzRSxDQUFDOytHQW5hUSx1QkFBdUI7bUdBQXZCLHVCQUF1QixtRkFIdEIsRUFBRTs7NEZBR0gsdUJBQXVCO2tCQUxuQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHksIERpYWxvZ0NvbmZpZyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XG5cbmltcG9ydCB7XG4gICAgQmFyc2FBcGksXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcbiAgICBUcmVlTm9kZU9iaixcbiAgICBSZWxhdGlvbkl0ZW1UeXBlLFxuICAgIGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4sXG4gICAgc2V0T25lRGVwdGhMZXZlbFxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XG5pbXBvcnQgeyBTYXBVaVJlcG9ydEJhc2VDb21wb25lbnQgfSBmcm9tICcuL3NhcC11aS1yZXBvcnQtYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcEluZm8gfSBmcm9tICcuL3VpLXRyZWUtdmlldy91aS10cmVlLXZpZXcuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdic3UtcmVwb3J0LXRyZWUtYmFzZScsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFRyZWVCYXNlQ29tcG9uZW50IGV4dGVuZHMgU2FwVWlSZXBvcnRCYXNlQ29tcG9uZW50PFVpUmVwb3J0Vmlld0Jhc2VTZXR0aW5nPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgY29udGVudERlbnNpdHkkOiBPYnNlcnZhYmxlPENvbnRlbnREZW5zaXR5PjtcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGRpYWxvZ1NlbGVjdGVkTm9kZTtcbiAgICBzZWxlY3RlZE5vZGUkOiBPYnNlcnZhYmxlPFRyZWVOb2RlT2JqIHwgbnVsbD47XG4gICAgcm9vdCQ6IE9ic2VydmFibGU8VHJlZU5vZGVPYmogfCBudWxsPjtcbiAgICBkcm9wQWN0aW9uVG9kbzogRHJvcEluZm87XG4gICAgX2RyYWdNb3ZlID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIGZsYXRNb0RhdGFMaXN0O1xuICAgIGRpYWxvZ1JlZjtcblxuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWROb2RlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmVlTm9kZU9iaiB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCBfcm9vdFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJlZU5vZGVPYmogfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIGdldCBfcm9vdCgpOiBUcmVlTm9kZU9iaiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUkID0gdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJvb3QkID0gdGhpcy5fcm9vdFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMucnRsJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy5jb250ZW50RGVuc2l0eSQgPSB0aGlzLl9jb250ZW50RGVuc2l0eVNlcnZpY2UuY29udGVudERlbnNpdHk7XG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2UubmV4dCh0aGlzLmNvbnRleHQucm9vdCk7XG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5EZWZhdWx0Q29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxhcHNlQWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLm5leHQodGhpcy5jb250ZXh0LnNlbE5vZGUpO1xuICAgICAgICB0aGlzLmNvbnRleHQub24oe1xuICAgICAgICAgICAgcm9vdENoYW5nZWQ6IChyb290KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdFNvdXJjZS5uZXh0KHJvb3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbGVjdGVkTm9kZUNoYW5nZTogKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVTb3VyY2UubmV4dChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2VcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICBtYXAoKHJvb3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvT3BlbkxldmVscyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2V0dGluZy5WaWV3LlRyZWVBdXRvT3BlbkxldmVscycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4ocm9vdCwgMCwgbW9MaXN0LCByb290LCBhdXRvT3BlbkxldmVscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9MaXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZmxhdE1vRGF0YUxpc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZsYXRNb0RhdGFMaXN0ID0gZmxhdE1vRGF0YUxpc3QubWFwKChjKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5jLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiBjLnBhcmVudE5vZGUgPyB7IC4uLmMucGFyZW50Tm9kZSB9IDogbnVsbFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZXNldERyb3BBY3Rpb25Ub2RvKCk7XG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDUwKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9EcmFnTW92ZShldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNyZWF0ZU5ldyhlOiBSZWxhdGlvbkl0ZW1UeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NyZWF0ZU5ldycsIGUpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZHJhZ01vdmVkKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2RyYWdNb3ZlLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZHJvcChldmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW1vdmVOb0Ryb3BzKCk7XG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcbiAgICAgICAgY29uc3QgZHJhZ0FjdGlvbiA9IHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uO1xuICAgICAgICBpZiAoIWRyYWdBY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJhZ0FjdGlvbiA9PT0gJ2ZvcmJpZCcpIHtcbiAgICAgICAgICAgIFJlcG9ydFRyZWVCYXNlQ29tcG9uZW50Ll9zaG93Rm9yYmlkZGVuTW92ZUFsZXJ0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1JZCA9IGV2ZW50Lml0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SXRlbUlkID0gdGhpcy5kcm9wQWN0aW9uVG9kby50YXJnZXRJZDtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSB0aGlzLl9nZXROb2RlQnlJZChkcmFnZ2VkSXRlbUlkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SXRlbSA9IHRoaXMuX2dldE5vZGVCeUlkKHRhcmdldEl0ZW1JZCk7XG4gICAgICAgIGNvbnN0IG9sZFBhcmVudE5vZGVJZCA9IGRyYWdnZWRJdGVtLnBhcmVudE5vZGU/LkRhdGE/LklkIHx8ICckUm9vdCc7XG4gICAgICAgIGNvbnN0IG5ld1BhcmVudE5vZGVJZCA9IHRhcmdldEl0ZW0ucGFyZW50Tm9kZT8uRGF0YT8uSWQgfHwgJyRSb290JztcbiAgICAgICAgY29uc3Qgb2xkUGFyZW50Tm9kZSA9IGRyYWdnZWRJdGVtLnBhcmVudE5vZGU7XG4gICAgICAgIGxldCBuZXdQYXJlbnROb2RlID0gdGFyZ2V0SXRlbS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAob2xkUGFyZW50Tm9kZSAmJiBuZXdQYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGRyYWdBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2FmdGVyJzoge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VydmVyVGFyZ2V0OiBUcmVlTm9kZU9iaiB8IG51bGwgPSB0YXJnZXRJdGVtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ0FjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5EYXRhLklkID09PSB0YXJnZXRJdGVtLkRhdGEuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSB0aGlzLmZsYXRNb0RhdGFMaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlclRhcmdldCA9IHRoaXMuZmxhdE1vRGF0YUxpc3RbdGFyZ2V0SW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJUYXJnZXQucGFyZW50Tm9kZSA9PT0gdGFyZ2V0SXRlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhcmdldCA9IGFmdGVyVGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhdmVUb1NlcnZlcihkcmFnZ2VkSXRlbS5EYXRhLklkLCBzZXJ2ZXJUYXJnZXQsIG5ld1BhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEcmFnZ2VkSXRlbXNPcmRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudE5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Tm9kZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXJlbnROb2RlSWQgIT09ICckUm9vdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3QuaW5kZXhPZihkcmFnZ2VkSXRlbSkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3QuaW5kZXhPZih0YXJnZXRJdGVtLnBhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Tm9kZT8uY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRyYWdnZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgbmV3IG1vRGF0YUxpc3QgVG8gc2VydmVyOlxuICAgICAgICAgICAgICAgICAgICAvLyAoZHJhZ2dlZEl0ZW0sIGRyYWdnZWRJdGVtLnBhcmVudE5vZGUsIGRyYWdnZWRJdGVtLnBhcmVudE5vZGUuY2hpbGRyZW4/LmluZGV4T2YoZHJhZ2dlZEl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICdpbnNpZGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudE5vZGUgPSB0YXJnZXRJdGVtO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYXZlVG9TZXJ2ZXIoZHJhZ2dlZEl0ZW0uRGF0YS5JZCwgbnVsbCwgbmV3UGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVOb2RlSW5zaWRlQW5vdGhlcihkcmFnZ2VkSXRlbSwgdGFyZ2V0SXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldE9uZURlcHRoTGV2ZWwobmV3UGFyZW50Tm9kZSk7XG4gICAgICAgICAgICBzZXRPbmVEZXB0aExldmVsKG9sZFBhcmVudE5vZGUpO1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJEcmFnSW5mbyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgX3JlYmluZFJvb3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jvb3RTb3VyY2UubmV4dCh0aGlzLl9yb290KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3NhdmVUb1NlcnZlcihkcmFnZ2VkSWQ6IHN0cmluZywgdGFyZ2V0OiBUcmVlTm9kZU9iaiB8IG51bGwsIHBhcmVudDogVHJlZU5vZGVPYmopOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWQ6IHN0cmluZyA9IHRhcmdldCA/IHRhcmdldC5EYXRhLklkIDogJzAnO1xuICAgICAgICBjb25zdCBwYXJlbnRJZDogc3RyaW5nID0gcGFyZW50LkRhdGEuSWQgPT09ICckUm9vdCcgPyAnMCcgOiBwYXJlbnQuRGF0YS5JZDtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2QoJ01vdmVUcmVlTm9kZScsIGRyYWdnZWRJZCwgdGFyZ2V0SWQsIHBhcmVudElkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uZmlybURpYWxvZyhzZWxlY3RlZE5vZGU6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoc2VsZWN0ZWROb2RlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGlzbWlzc0RpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuZGlzbWlzcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb2xsYXBzZUFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnY29sbGFwc2VBbGwnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3Blbk1vdmVUb0RpYWxvZyhzb3VyY2VOb2RlLCBkZXZpY2U6IHN0cmluZywgZGlhbG9nVG1wKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZzogRGlhbG9nQ29uZmlnID0ge1xuICAgICAgICAgICAgLi4udGhpcy5kaWFsb2dDb25maWcsXG4gICAgICAgICAgICBkYXRhOiB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCB9LFxuICAgICAgICAgICAgbW9iaWxlOiBkZXZpY2UgPT09ICdtb2JpbGUnLFxuICAgICAgICAgICAgbWluV2lkdGg6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnYXV0bycgOiB0aGlzLmRpYWxvZ0NvbmZpZy5taW5XaWR0aCxcbiAgICAgICAgICAgIG1pbkhlaWdodDogZGV2aWNlID09PSAnbW9iaWxlJyA/ICdhdXRvJyA6IHRoaXMuZGlhbG9nQ29uZmlnLm1pbkhlaWdodFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3BlbihkaWFsb2dUbXAsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkLnN1YnNjcmliZSgoZGVzdGluYXRpb25Ob2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbk1vdmUgPSB0aGlzLl9jYW5Nb3ZlKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSk7XG4gICAgICAgICAgICBpZiAoY2FuTW92ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVOb2RlSW5zaWRlQW5vdGhlcihzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBSZXBvcnRUcmVlQmFzZUNvbXBvbmVudC5fc2hvd0ZvcmJpZGRlbk1vdmVBbGVydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcm9vdFNvdXJjZS5uZXh0KHRoaXMuX3Jvb3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0Tm9kZUluTW92ZURpYWxvZyhldjogeyBub2RlOiBUcmVlTm9kZU9iajsgaW5kZXg6IG51bWJlciB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VsZWN0ZWROb2RlID0gZXYubm9kZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbG9hZENoaWxkcmVuKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2xvYWROb2RlQ2hpbGRyZW4nLCBub2RlKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlR3JpZFNldHRpbmcoKTogdm9pZCB7fVxuXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROb2RlKG5vZGU6IFRyZWVOb2RlT2JqKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5zZWxOb2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLm5leHQobm9kZSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ2NsaWNrJyk7XG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScpO1xuICAgIH1cblxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgcHJvdGVjdGVkIF9kZXNlbGVjdE5vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5zZWxOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWROb2RlU291cmNlLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yYWlzZVJvd0NsaWNrKGluZGV4LCBtbyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRleHQuc2VsTm9kZSA9IG1vO1xuICAgICAgICB0aGlzLmNvbnRleHQ/LmZpcmVFdmVudCgnZGJsY2xpY2snLCB0aGlzLmNvbnRleHQsIGluZGV4LCBtbyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXREcm9wQWN0aW9uVG9kbygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wQWN0aW9uVG9kbyA9IHsgdGFyZ2V0SWQ6IG51bGwsIGFjdGlvbjogbnVsbCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoYW5nZURyYWdnZWRJdGVtc09yZGVyKFxuICAgICAgICBkcmFnZ2VkSXRlbTogVHJlZU5vZGVPYmosXG4gICAgICAgIHRhcmdldEl0ZW06IFRyZWVOb2RlT2JqLFxuICAgICAgICBuZXdQYXJlbnROb2RlOiBUcmVlTm9kZU9iaixcbiAgICAgICAgb2xkUGFyZW50Tm9kZTogVHJlZU5vZGVPYmosXG4gICAgICAgIG9sZFBhcmVudE5vZGVJZFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW1vdmVEcmFnZ2VkSXRlbUZyb21Nb0RhdGFMaXN0KGRyYWdnZWRJdGVtKTtcbiAgICAgICAgaWYgKG9sZFBhcmVudE5vZGVJZCAhPT0gJyRSb290Jykge1xuICAgICAgICAgICAgLy8gb2xkUGFyZW50Tm9kZS5jaGlsZHJlbj8ucmVtb3ZlKGRyYWdnZWRJdGVtKTtcbiAgICAgICAgICAgIG9sZFBhcmVudE5vZGUuY2hpbGRyZW4gPSBvbGRQYXJlbnROb2RlLmNoaWxkcmVuLmZpbHRlcigoYykgPT4gYy5EYXRhLklkICE9PSBkcmFnZ2VkSXRlbS5EYXRhLklkKTtcblxuICAgICAgICAgICAgb2xkUGFyZW50Tm9kZS5sZWFmID0gIShvbGRQYXJlbnROb2RlLmNoaWxkcmVuPy5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgIG9sZFBhcmVudE5vZGUuRGF0YS4kSGFzQ2hpbGRyZW4gPSAhb2xkUGFyZW50Tm9kZS5sZWFmO1xuICAgICAgICB9XG4gICAgICAgIGRyYWdnZWRJdGVtLnBhcmVudE5vZGUgPSBuZXdQYXJlbnROb2RlO1xuICAgICAgICB0aGlzLl9zZXRMZXZlbEZvckRyYWdnZWRJdGVtcyhkcmFnZ2VkSXRlbSwgbmV3UGFyZW50Tm9kZS5sZXZlbCB8fCAwKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLmZsYXRNb0RhdGFMaXN0LmluZGV4T2YodGFyZ2V0SXRlbSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kcm9wQWN0aW9uVG9kby5hY3Rpb24gPT09ICdiZWZvcmUnID8gdGFyZ2V0SW5kZXggOiB0aGlzLl9uZXh0SW5kZXhJbk1vRGF0YUxpc3QodGFyZ2V0SXRlbSk7XG4gICAgICAgIHRoaXMuX2FkZERyYWdnZWRJdGVtc1RvTW9EYXRhTGlzdChkcmFnZ2VkSXRlbSwgaW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZERyYWdnZWRJdGVtc1RvTW9EYXRhTGlzdChub2RlOiBUcmVlTm9kZU9iaiwgaSk6IG51bWJlciB7XG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3Quc3BsaWNlKGksIDAsIG5vZGUpO1xuICAgICAgICBub2RlPy5jaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGkgPSB0aGlzLl9hZGREcmFnZ2VkSXRlbXNUb01vRGF0YUxpc3QoY2hpbGQsIGkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlRHJhZ2dlZEl0ZW1Gcm9tTW9EYXRhTGlzdChub2RlOiBUcmVlTm9kZU9iaik6IHZvaWQge1xuICAgICAgICBub2RlPy5jaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZURyYWdnZWRJdGVtRnJvbU1vRGF0YUxpc3QoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbmV4dEluZGV4SW5Nb0RhdGFMaXN0KG5vZGU6IFRyZWVOb2RlT2JqKTogQXJyYXk8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0TW9EYXRhTGlzdC5pbmRleE9mKG5vZGUpICsgdGhpcy5fYWxsTmVzdGVkQ2hpbGRlc0NvdW50KG5vZGUpICsgMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hbGxOZXN0ZWRDaGlsZGVzQ291bnQobm9kZTogVHJlZU5vZGVPYmosIGkgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgbm9kZS5jaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGkgPSB0aGlzLl9hbGxOZXN0ZWRDaGlsZGVzQ291bnQoY2hpbGQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Tm9kZUJ5SWQoaWQ6IGFueSk6IFRyZWVOb2RlT2JqIHtcbiAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgIGZvciAoY29uc3QgbW8gb2YgdGhpcy5mbGF0TW9EYXRhTGlzdCkge1xuICAgICAgICAgICAgaWYgKG1vLkRhdGEuSWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG1vO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldExldmVsRm9yRHJhZ2dlZEl0ZW1zKG5vZGUsIHBhcmVudExldmVsKTogdm9pZCB7XG4gICAgICAgIHBhcmVudExldmVsKys7XG4gICAgICAgIG5vZGUubGV2ZWwgPSBwYXJlbnRMZXZlbDtcbiAgICAgICAgbm9kZT8uY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZXRMZXZlbEZvckRyYWdnZWRJdGVtcyhjaGlsZCwgcGFyZW50TGV2ZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tb3ZlTm9kZUluc2lkZUFub3RoZXIoc291cmNlTm9kZSwgZGVzdGluYXRpb25Ob2RlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFBhcmVudE5vZGUgPSBzb3VyY2VOb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IG9sZFBhcmVudE5vZGVJZCA9IG9sZFBhcmVudE5vZGU/LkRhdGE/LklkIHx8ICckUm9vdCc7XG4gICAgICAgIHRoaXMuX2NoYW5nZURyYWdnZWRJdGVtc09yZGVyKHNvdXJjZU5vZGUsIGRlc3RpbmF0aW9uTm9kZSwgZGVzdGluYXRpb25Ob2RlLCBvbGRQYXJlbnROb2RlLCBvbGRQYXJlbnROb2RlSWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdtb3ZlTm9kZUluc2lkZUFub3RoZXInLCBzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyRHJhZ0luZm8oZHJvcHBlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmIChkcm9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldERyb3BBY3Rpb25Ub2RvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtYmVmb3JlJylcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1iZWZvcmUnKSk7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLWFmdGVyJylcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1hZnRlcicpKTtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtaW5zaWRlJylcbiAgICAgICAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50LCAnZHJvcC1pbnNpZGUnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RvcERyYWdnaW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jbGVhckRyYWdJbmZvKCk7XG4gICAgICAgIHRoaXMuX3Jlc2V0RHJvcEFjdGlvblRvZG8oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaG93RHJhZ0luZm8oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NsZWFyRHJhZ0luZm8oKTtcbiAgICAgICAgaWYgKHRoaXMuZHJvcEFjdGlvblRvZG8udGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2dldE5vZGVCeUlkKHRoaXMuZHJvcEFjdGlvblRvZG8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50SWQgPSBwYXJlbnQ/LnBhcmVudE5vZGU/LkRhdGE/LklkIHx8ICckUm9vdCc7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlRWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjbm9kZS0nICsgdGhpcy5kcm9wQWN0aW9uVG9kby50YXJnZXRJZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldE5vZGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREcm9wQWN0aW9uVG9kbygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3UGFyZW50SWQgPT09ICckUm9vdCcgJiYgdGhpcy5kcm9wQWN0aW9uVG9kby5hY3Rpb24gIT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdmZC1sYXlvdXQtcGFuZWwnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyhyb290Q29udGFpbmVyLCAnZHJvcC1pbnNpZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRhcmdldE5vZGVFbGVtZW50LCAnZHJvcC0nICsgdGhpcy5kcm9wQWN0aW9uVG9kbz8uYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RvRHJhZ01vdmUoZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZyb21Qb2ludCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQucG9pbnRlclBvc2l0aW9uLngsIGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55KTtcblxuICAgICAgICBpZiAoIWVsZW1lbnRGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3BEcmFnZ2luZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGVFbGVtZW50ID0gZWxlbWVudEZyb21Qb2ludC5jbGFzc0xpc3QuY29udGFpbnMoJ25vZGUtaXRlbScpXG4gICAgICAgICAgICA/IGVsZW1lbnRGcm9tUG9pbnRcbiAgICAgICAgICAgIDogZWxlbWVudEZyb21Qb2ludC5jbG9zZXN0KCcubm9kZS1pdGVtJyk7XG4gICAgICAgIGlmICghdGFyZ2V0Tm9kZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3BEcmFnZ2luZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8gPSB7XG4gICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0Tm9kZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJylcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldE5vZGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBvbmVUaGlyZCA9IHRhcmdldFJlY3QuaGVpZ2h0IC8gMztcblxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IG9uZVRoaXJkKSB7XG4gICAgICAgICAgICAvLyBiZWZvcmVcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2JlZm9yZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA+IDIgKiBvbmVUaGlyZCkge1xuICAgICAgICAgICAgLy8gYWZ0ZXJcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2FmdGVyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc2lkZVxuICAgICAgICAgICAgdGhpcy5kcm9wQWN0aW9uVG9kby5hY3Rpb24gPSAnaW5zaWRlJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXROb0Ryb3BJdGVtcyhldmVudC5zb3VyY2UuZGF0YSk7XG4gICAgICAgIHRoaXMuX3NldE5vRHJvcFN0eWxlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLl9nZXROb2RlQnlJZCh0aGlzLmRyb3BBY3Rpb25Ub2RvLnRhcmdldElkKTtcbiAgICAgICAgaWYgKHRhcmdldE5vZGUubm9Ecm9wKSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9wRHJhZ2dpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuZHJvcEFjdGlvblRvZG8uYWN0aW9uID0gJ2ZvcmJpZCc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvd0RyYWdJbmZvKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVtb3ZlTm9Ecm9wcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mbGF0TW9EYXRhTGlzdFxuICAgICAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gbm9kZS5ub0Ryb3ApXG4gICAgICAgICAgICAuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIG5vZGUubm9Ecm9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI25vZGUtJyArIG5vZGUuRGF0YS5JZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCAnbm8tZHJvcCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldE5vRHJvcEl0ZW1zKGRyYWdnZWRJdGVtSWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX2dldE5vZGVCeUlkKGRyYWdnZWRJdGVtSWQpO1xuICAgICAgICBub2RlLm5vRHJvcCA9IHRydWU7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZXROb0Ryb3BJdGVtcyhjaGlsZC5EYXRhLklkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Tm9Ecm9wU3R5bGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmxhdE1vRGF0YUxpc3RcbiAgICAgICAgICAgIC5maWx0ZXIoKG5vZGUpID0+IG5vZGUubm9Ecm9wKVxuICAgICAgICAgICAgLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjbm9kZS0nICsgbm9kZS5EYXRhLklkKTtcbiAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3MoZWwsICduby1kcm9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2FuTW92ZShzb3VyY2VOb2RlLCBkZXN0aW5hdGlvbk5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNhbk1vdmUgPSB0cnVlO1xuICAgICAgICBpZiAoc291cmNlTm9kZS5EYXRhLklkID09PSBkZXN0aW5hdGlvbk5vZGUuRGF0YS5JZCkge1xuICAgICAgICAgICAgY2FuTW92ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc291cmNlTm9kZS5jaGlsZHJlbj8uZm9yZWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5Nb3ZlID0gdGhpcy5fY2FuTW92ZShzb3VyY2VOb2RlLCBjaGlsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuTW92ZTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBfc2hvd0ZvcmJpZGRlbk1vdmVBbGVydCgpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuTXNnLkVycm9yKCfZhtmF24zYqtmI2KfZhtuM2K8g2KLbjNiq2YUg2LHYpyDYqNmHINiy24zYsdi02KfYrtmHINiu2YjYr9i0INmF2YbYqtmC2YQg2qnZhtuM2K8uJyk7XG4gICAgfVxufVxuIl19