barsa-sap-ui 2.2.2 → 2.2.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 (241) hide show
  1. package/esm2022/barsa-sap-ui.mjs +5 -0
  2. package/esm2022/lib/apply-conditional-formmatings.directive.mjs +90 -0
  3. package/esm2022/lib/avatar-size.pipe.mjs +41 -0
  4. package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +41 -0
  5. package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +145 -0
  6. package/esm2022/lib/barsa-bar-download-file/barsa-bar-download-file.component.mjs +23 -0
  7. package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +23 -0
  8. package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +29 -0
  9. package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +24 -0
  10. package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +24 -0
  11. package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +31 -0
  12. package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +41 -0
  13. package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +24 -0
  14. package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +242 -0
  15. package/esm2022/lib/barsa-chat/chat.model.mjs +8 -0
  16. package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +13 -0
  17. package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +22 -0
  18. package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +66 -0
  19. package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +78 -0
  20. package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +22 -0
  21. package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +13 -0
  22. package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +15 -0
  23. package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +72 -0
  24. package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +23 -0
  25. package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +14 -0
  26. package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +14 -0
  27. package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +26 -0
  28. package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +71 -0
  29. package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +40 -0
  30. package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +61 -0
  31. package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +45 -0
  32. package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +58 -0
  33. package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +27 -0
  34. package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +94 -0
  35. package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +22 -0
  36. package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +37 -0
  37. package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +41 -0
  38. package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +29 -0
  39. package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +23 -0
  40. package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +43 -0
  41. package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +83 -0
  42. package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +57 -0
  43. package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +159 -0
  44. package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +17 -0
  45. package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +30 -0
  46. package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +14 -0
  47. package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +34 -0
  48. package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +46 -0
  49. package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +79 -0
  50. package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +30 -0
  51. package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +31 -0
  52. package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +28 -0
  53. package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +102 -0
  54. package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +26 -0
  55. package/esm2022/lib/barsa-sap-ui-routing.module.mjs +18 -0
  56. package/esm2022/lib/barsa-sap-ui.module.mjs +377 -0
  57. package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +29 -0
  58. package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +170 -0
  59. package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +18 -0
  60. package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +29 -0
  61. package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +222 -0
  62. package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +87 -0
  63. package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +60 -0
  64. package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +26 -0
  65. package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +23 -0
  66. package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +37 -0
  67. package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +418 -0
  68. package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +36 -0
  69. package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +153 -0
  70. package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +20 -0
  71. package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +216 -0
  72. package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +74 -0
  73. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +50 -0
  74. package/esm2022/lib/captcha-field/captcha-field.component.mjs +28 -0
  75. package/esm2022/lib/card-item/card-item.component.mjs +74 -0
  76. package/esm2022/lib/card-view-content/card-view-content.component.mjs +46 -0
  77. package/esm2022/lib/col-renderer.directive.mjs +47 -0
  78. package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +56 -0
  79. package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +61 -0
  80. package/esm2022/lib/column-renderer/column-renderer.component.mjs +97 -0
  81. package/esm2022/lib/constants.mjs +450 -0
  82. package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +41 -0
  83. package/esm2022/lib/device-info-field-base.mjs +24 -0
  84. package/esm2022/lib/dialog-handler.directive.mjs +29 -0
  85. package/esm2022/lib/download-files.directive.mjs +34 -0
  86. package/esm2022/lib/dynamic-page-size.pipe.mjs +27 -0
  87. package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +44 -0
  88. package/esm2022/lib/file-viewer/file-viewer.component.mjs +47 -0
  89. package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +71 -0
  90. package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +37 -0
  91. package/esm2022/lib/form-dialog/form-dialog.component.mjs +171 -0
  92. package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +50 -0
  93. package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +62 -0
  94. package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +45 -0
  95. package/esm2022/lib/form-wizard/form-wizard.component.mjs +21 -0
  96. package/esm2022/lib/fullscreen-dialog.directive.mjs +60 -0
  97. package/esm2022/lib/fullscreen-files.directive.mjs +43 -0
  98. package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +217 -0
  99. package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +215 -0
  100. package/esm2022/lib/global-search/global-search.component.mjs +27 -0
  101. package/esm2022/lib/global-search-module/global-search-module.component.mjs +29 -0
  102. package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +25 -0
  103. package/esm2022/lib/header-avatar/header-avatar.component.mjs +18 -0
  104. package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +48 -0
  105. package/esm2022/lib/hyperlink/hyperlink.component.mjs +23 -0
  106. package/esm2022/lib/index.mjs +549 -0
  107. package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +32 -0
  108. package/esm2022/lib/layout-actions/layout-actions.component.mjs +70 -0
  109. package/esm2022/lib/layout-control/layout-control.component.mjs +302 -0
  110. package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +180 -0
  111. package/esm2022/lib/list-item/list-item.component.mjs +34 -0
  112. package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +42 -0
  113. package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +82 -0
  114. package/esm2022/lib/ly-label/ly-label.component.mjs +37 -0
  115. package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +83 -0
  116. package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +17 -0
  117. package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +24 -0
  118. package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +83 -0
  119. package/esm2022/lib/ly-line/ly-line.component.mjs +56 -0
  120. package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +22 -0
  121. package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +44 -0
  122. package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +44 -0
  123. package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +51 -0
  124. package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +43 -0
  125. package/esm2022/lib/mask/mask.component.mjs +22 -0
  126. package/esm2022/lib/message-strip/message-strip.component.mjs +28 -0
  127. package/esm2022/lib/models/grid-data-provider.mjs +114 -0
  128. package/esm2022/lib/models/grid-view.mjs +2 -0
  129. package/esm2022/lib/models/index.mjs +2 -0
  130. package/esm2022/lib/no-data/no-data.component.mjs +31 -0
  131. package/esm2022/lib/notification-item/notification-item.component.mjs +57 -0
  132. package/esm2022/lib/notification-item-actions/notification-item-actions.component.mjs +79 -0
  133. package/esm2022/lib/notification-popup.service.mjs +92 -0
  134. package/esm2022/lib/object-status-icon.pipe.mjs +27 -0
  135. package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +18 -0
  136. package/esm2022/lib/report-navigator/report-navigator.component.mjs +68 -0
  137. package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +60 -0
  138. package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +35 -0
  139. package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +97 -0
  140. package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +88 -0
  141. package/esm2022/lib/report-tree-base.mjs +387 -0
  142. package/esm2022/lib/report-view-renderer.directive.mjs +392 -0
  143. package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +50 -0
  144. package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +84 -0
  145. package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +72 -0
  146. package/esm2022/lib/sap-font-class.pipe.mjs +30 -0
  147. package/esm2022/lib/sap-font.pipe.mjs +30 -0
  148. package/esm2022/lib/sap-size.pipe.mjs +28 -0
  149. package/esm2022/lib/sap-ui-report-base.component.mjs +809 -0
  150. package/esm2022/lib/search-panel/search-panel.component.mjs +63 -0
  151. package/esm2022/lib/static-text/static-text.component.mjs +15 -0
  152. package/esm2022/lib/table-th.directive.mjs +87 -0
  153. package/esm2022/lib/title/title.component.mjs +15 -0
  154. package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +34 -0
  155. package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +33 -0
  156. package/esm2022/lib/ui-button/ui-button.component.mjs +32 -0
  157. package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +53 -0
  158. package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +58 -0
  159. package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +42 -0
  160. package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +39 -0
  161. package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +50 -0
  162. package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +38 -0
  163. package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +191 -0
  164. package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +150 -0
  165. package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +108 -0
  166. package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +53 -0
  167. package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +124 -0
  168. package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +103 -0
  169. package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +32 -0
  170. package/esm2022/lib/ui-graph/ui-graph.component.mjs +17 -0
  171. package/esm2022/lib/ui-grid/ui-grid.component.mjs +25 -0
  172. package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +43 -0
  173. package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +66 -0
  174. package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +75 -0
  175. package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +58 -0
  176. package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +123 -0
  177. package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +16 -0
  178. package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +11 -0
  179. package/esm2022/lib/ui-label/ui-label.component.mjs +12 -0
  180. package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +379 -0
  181. package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +84 -0
  182. package/esm2022/lib/ui-map/ui-map.component.mjs +68 -0
  183. package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +124 -0
  184. package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +19 -0
  185. package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +14 -0
  186. package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +55 -0
  187. package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +429 -0
  188. package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +28 -0
  189. package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +37 -0
  190. package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +59 -0
  191. package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +93 -0
  192. package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +36 -0
  193. package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +56 -0
  194. package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +28 -0
  195. package/esm2022/lib/ui-notification-view/ui-notification-view.component.mjs +47 -0
  196. package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +33 -0
  197. package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +27 -0
  198. package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +21 -0
  199. package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +268 -0
  200. package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +101 -0
  201. package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +261 -0
  202. package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +48 -0
  203. package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +36 -0
  204. package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +46 -0
  205. package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +24 -0
  206. package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +55 -0
  207. package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +36 -0
  208. package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +20 -0
  209. package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +296 -0
  210. package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +49 -0
  211. package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +52 -0
  212. package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +48 -0
  213. package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +24 -0
  214. package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +53 -0
  215. package/esm2022/lib/ui-tree/ui-tree.component.mjs +114 -0
  216. package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +100 -0
  217. package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +23 -0
  218. package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +310 -0
  219. package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +25 -0
  220. package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +93 -0
  221. package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +119 -0
  222. package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +32 -0
  223. package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +48 -0
  224. package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +53 -0
  225. package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +116 -0
  226. package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +43 -0
  227. package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +196 -0
  228. package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +44 -0
  229. package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +84 -0
  230. package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +65 -0
  231. package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +116 -0
  232. package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +54 -0
  233. package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +177 -0
  234. package/esm2022/lib/upload-file-status.pipe.mjs +29 -0
  235. package/esm2022/lib/util-chat-time-badge.pipe.mjs +18 -0
  236. package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +23 -0
  237. package/esm2022/lib/wizard-layout.directive.mjs +104 -0
  238. package/esm2022/public-api.mjs +236 -0
  239. package/fesm2022/barsa-sap-ui.mjs +4 -4
  240. package/fesm2022/barsa-sap-ui.mjs.map +1 -1
  241. package/package.json +3 -1
@@ -0,0 +1,809 @@
1
+ import { ChangeDetectionStrategy, Component, Inject, Input, Optional, Self, ViewChild, ViewChildren } from '@angular/core';
2
+ import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
3
+ import { debounceTime, distinctUntilChanged, filter, map, takeUntil, tap, withLatestFrom } from 'rxjs/operators';
4
+ import { TableComponent, ToolbarComponent } from '@fundamental-ngx/core';
5
+ import { BarsaApi, GetAllColumnsSorted, getControlSizeMode, getGridSettings, ReportBaseComponent, getParentHeight, measureText, getUniqueId, SelectionMode, getDeviceIsDesktop, getDeviceIsMobile, getDeviceIsTablet } from 'barsa-novin-ray-core';
6
+ import { LayoutControlComponent } from './layout-control/layout-control.component';
7
+ import { GridMoDataList } from './models';
8
+ import { UlvColumnSettingsComponent } from './ulv-column-settings/ulv-column-settings.component';
9
+ import { UlvSortSettingsComponent } from './ulv-sort-settings/ulv-sort-settings.component';
10
+ import { UlvGroupbySettingsComponent } from './ulv-groupby-settings/ulv-groupby-settings.component';
11
+ import { UlvFilterSettingsComponent } from './ulv-filter-settings/ulv-filter-settings.component';
12
+ import { DOCUMENT } from '@angular/common';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/cdk/overlay";
15
+ import * as i2 from "@fundamental-ngx/core";
16
+ import * as i3 from "barsa-novin-ray-core";
17
+ export class SapUiReportBaseComponent extends ReportBaseComponent {
18
+ constructor(el, _cdr, _overlay, _contentDensityService, _portalService, _dialogService, _ulvMainService, _layoutService, _renderer, document, _formpanelService) {
19
+ super(_portalService, _ulvMainService);
20
+ this.el = el;
21
+ this._cdr = _cdr;
22
+ this._overlay = _overlay;
23
+ this._contentDensityService = _contentDensityService;
24
+ this._portalService = _portalService;
25
+ this._dialogService = _dialogService;
26
+ this._ulvMainService = _ulvMainService;
27
+ this._layoutService = _layoutService;
28
+ this._renderer = _renderer;
29
+ this.document = document;
30
+ this._formpanelService = _formpanelService;
31
+ this.useLayoutItemTextForControl = false;
32
+ this.parentHeight = 0;
33
+ this.dialogConfig = {
34
+ responsivePadding: true,
35
+ verticalPadding: true,
36
+ minWidth: '40rem',
37
+ minHeight: '90vh',
38
+ maxWidth: '100vw',
39
+ maxHeight: '100vh',
40
+ resizable: true
41
+ };
42
+ this.id = `Report_${getUniqueId(3)}`;
43
+ this.selectedRowsNumber = {};
44
+ this.selectAll = false;
45
+ this.rowClick = true;
46
+ this.cellClick = false;
47
+ this.secondaryColumnsSource = new BehaviorSubject([]);
48
+ this.secondaryColumns$ = this.secondaryColumnsSource
49
+ .asObservable()
50
+ .pipe(distinctUntilChanged((a, b) => a.length === b.length || a === b));
51
+ this.hasDetailsInRow = false;
52
+ this.rowActivable = true;
53
+ this.openOverflowCommands = [];
54
+ this.containerWidthSource$ = new Subject();
55
+ this.singleSelection = SelectionMode.SINGLE;
56
+ this.multipleSelection = SelectionMode.MULTIPLE;
57
+ this._deviceNameSource = new BehaviorSubject('desktop');
58
+ /* eslint-disable */
59
+ this.ShowFormPanelControl = (formpanelCtrlr) => { };
60
+ /* eslint-disable */
61
+ this.ForceCloseChild = () => { };
62
+ /* eslint-disable */
63
+ this.RefreshFormPanelControl = (formpanelCtrlr) => { };
64
+ this.containerWidth$ = this.containerWidthSource$
65
+ .asObservable()
66
+ .pipe(debounceTime(200), distinctUntilChanged());
67
+ this.deviceName$ = this._deviceNameSource.asObservable();
68
+ this.disableResponsive$ = this.deviceName$.pipe(map((c) => c === 'desktop'));
69
+ this.mobileOrTablet$ = this.deviceName$.pipe(map((device) => device === 'mobile' || device === 'tablet'));
70
+ this._oldContainer = BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter;
71
+ this.closeScrollStrategy = this._overlay.scrollStrategies.close();
72
+ this.contentDensity$ = this._contentDensityService.contentDensity;
73
+ this.secondaryColumnsCount$ = this.secondaryColumns$.pipe(map((columns) => columns.length));
74
+ this.columnsCount$ = this.visibleColumns$.pipe(map((columns) => columns.length), map((count) => {
75
+ const access = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.Extra.DefaultCommandsAccess');
76
+ if (access?.View) {
77
+ count++;
78
+ }
79
+ return count;
80
+ }), map((count) => {
81
+ if (this.selectionMode !== 'none') {
82
+ count++;
83
+ }
84
+ return count;
85
+ }));
86
+ }
87
+ onColumnSummary(e) {
88
+ this._columnSummary(e);
89
+ }
90
+ onResetWorkflowState(mo) {
91
+ mo.$WorkflowState = null;
92
+ this._resetMoDataList();
93
+ }
94
+ get _typeDefId() {
95
+ return this.context.Setting.Extra.Report.TypeDefId;
96
+ }
97
+ get _inlineEditMode() {
98
+ return this._ulvMainService.getValueInlineEdit();
99
+ }
100
+ get _allowInlineEdit() {
101
+ return this._ulvMainService.getAllowInlineEdit();
102
+ }
103
+ get _access() {
104
+ return this.context.Setting?.Extra?.DefaultCommandsAccess;
105
+ }
106
+ set _access(val) {
107
+ if (this.context.Setting.Extra) {
108
+ this.context.Setting.Extra.DefaultCommandsAccess = val;
109
+ }
110
+ else {
111
+ this.context.Setting.Extra = { DefaultCommandsAccess: val };
112
+ }
113
+ }
114
+ get isCheckList() {
115
+ return this.context.ViewSetting?.IsCheckList;
116
+ }
117
+ ngOnInit() {
118
+ this._setParentHeight();
119
+ this._readViewSetting();
120
+ if (!this._access) {
121
+ this._setDefaultAccess();
122
+ }
123
+ super.ngOnInit();
124
+ this.showOkCancelButtons = this.context.ShowOkCancelButtons;
125
+ this._ulvMainService.layoutInfo$.subscribe((layoutInfo) => {
126
+ if (layoutInfo && layoutInfo.UseLayoutItemTextForControl) {
127
+ this.useLayoutItemTextForControl = true;
128
+ }
129
+ });
130
+ const title = this.viewSetting?.Title;
131
+ if (title) {
132
+ this._ulvMainService.setTitle(title);
133
+ }
134
+ this._ulvMainService.reportId$.subscribe((reportId) => (this.reportId = reportId));
135
+ this._layoutService.setRendered(true);
136
+ this.selectionMode = this.context.ViewSetting?.IsCheckList ? this.multipleSelection : this.singleSelection;
137
+ this._openOnClick = this.viewSetting?.OpenOnClick;
138
+ this.customRowHeight = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.ExtraJsonPropReport.GridRowHeight');
139
+ this.simpleInlineEdit = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.ExtraJsonPropReport.SimpleInlineEdit');
140
+ this.groupSummary = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.ExtraJsonPropReport.GroupSummary', false);
141
+ this.rtl$ = this._portalService.rtl$;
142
+ this.navigationArrow$ = this._portalService.rtl$.pipe(map((isRtl) => (isRtl ? 'navigation-left-arrow' : 'navigation-right-arrow')));
143
+ this.allowInlineEdit$ = this._ulvMainService.allowInlineEdit$;
144
+ this.inlineEditMode$ = this._ulvMainService.inlineEditMode$;
145
+ this.onlyInlineEdit$ = this._ulvMainService.onlyInlineEdit$;
146
+ this._ulvMainService.setCanSaveGridSettings(this.viewSetting?.CanSaveGridSetting);
147
+ this.hasSelected$ = this.moDataList$.pipe(map((moList) => moList.some((c) => c.$IsChecked)));
148
+ this.moDataList$ = this.moDataList$.pipe(map((items) => this._mapCartableMo(items)));
149
+ const gridDataSource = new GridMoDataList(this.moDataList$, this.gridSetting$, this.visibleColumns$, this.searchTerm$, this.inlineEditMode$);
150
+ this.gridDataSource = gridDataSource;
151
+ this.columns$ = combineLatest([this.gridSetting$, this.secondaryColumns$]).pipe(map(([_, secondaryColumns]) => {
152
+ const secondaries = secondaryColumns.map((c) => c.Name);
153
+ let columns = GetAllColumnsSorted(this.context).filter((c) => !c.Hidden);
154
+ const groupedColumns = _?.SortSettingList?.filter((c) => c.IsGrouped).map((c) => c.Name);
155
+ if (groupedColumns?.length) {
156
+ columns = columns.filter((c) => groupedColumns.indexOf(c.Name) === -1);
157
+ }
158
+ return columns.filter((c) => secondaries.indexOf(c.Name) === -1);
159
+ }), tap((columns) => {
160
+ columns.forEach((c) => {
161
+ c.$CSSClassName = 'column__FieldType' + c.FieldTypeId;
162
+ // if (c.FieldTypeId === 38) {
163
+ // c.$Width = 'auto';
164
+ // }
165
+ // if (c.Extra?.IconDisplayTypeEnum === 'Image') {
166
+ // c.$Width = '38px';
167
+ // } else {
168
+ // c.$Width = !BarsaApi.LoginFormData.IsUserLoggedIn // if user is anonymous all column width equals to 100%
169
+ // ? '100%'
170
+ // : c.Width > 0
171
+ // ? c.Width + 'px'
172
+ // : '100%';
173
+ // }
174
+ });
175
+ }));
176
+ this._ulvMainService.inlineEditMode$.pipe(withLatestFrom(this.hasSelected$), filter(() => this._access.Add !== false));
177
+ this._setContainerWidth();
178
+ }
179
+ ngOnDestroy() {
180
+ super.ngOnDestroy();
181
+ if (this._formpanelService) {
182
+ this._formpanelService.destroy();
183
+ }
184
+ }
185
+ onExecuteToolbarButton(e) {
186
+ const { itemId, options } = e;
187
+ this._ulvMainService.executeToolbarButton(itemId, options);
188
+ }
189
+ onEditMode() {
190
+ this._setInlineEdit(!this._inlineEditMode);
191
+ }
192
+ onSelectNextInlineRecord(mo) {
193
+ this._selectNextInlineRecord(mo);
194
+ }
195
+ onEditFormPanelSave(mo) {
196
+ this._inlineEditSaveFormPanel(mo);
197
+ }
198
+ onEditFormPanelCancel(mo) {
199
+ const moDataList = this.moDataList;
200
+ const hasSelected = moDataList.some((c) => c.$IsChecked);
201
+ if (hasSelected) {
202
+ this._inlineEditSaveFormPanel(mo);
203
+ this._setInlineEdit(false);
204
+ }
205
+ }
206
+ onEditFormPanelValueChange(e) {
207
+ this._inlineFormPanelValueChange(e.mo);
208
+ this.context.fireEvent('CellEdited', BarsaApi.Bw._wrap(e.mo), e.fieldDbName);
209
+ }
210
+ onColumnResized(columns) {
211
+ this._handleColumnsResized(columns);
212
+ }
213
+ onWorkflowShareButtons(e) {
214
+ this._ulvMainService.addWorkflowButtonsInToolbar(e);
215
+ }
216
+ onRowClick($event) {
217
+ const { mo } = $event;
218
+ if (mo.group || this._inlineEditMode) {
219
+ return;
220
+ }
221
+ const moIndex = this._getIndex(mo);
222
+ this._removeCheckedAll();
223
+ if (!mo.$IsChecked) {
224
+ this._rowCheck(mo, moIndex, true);
225
+ }
226
+ if (this.viewSetting?.DisableShowFormOnDoubleClick) {
227
+ return;
228
+ }
229
+ this._openMo(mo, moIndex);
230
+ }
231
+ onUlvCommand($event) {
232
+ const { mo } = $event;
233
+ const moIndex = this._getIndex(mo);
234
+ this._ulvCommandClicked(mo, moIndex);
235
+ }
236
+ onDeselectAll() {
237
+ this._doCheckedAll(false);
238
+ // this.context.fireEvent('rowselect', this.context); // باعث میشود دوبار selectionchange گزارش فراخوانی شود
239
+ }
240
+ onRowCheck($event) {
241
+ const { mo, onlyCheck } = $event;
242
+ const moIndex = this._getIndex(mo);
243
+ if (!onlyCheck && this._openOnClick) {
244
+ this.onRowClick($event);
245
+ }
246
+ else {
247
+ this._rowCheck(mo, moIndex);
248
+ }
249
+ }
250
+ onCartableFormClosed({ mo }) {
251
+ const newMoDataList = this.moDataList;
252
+ const newMoDataList2 = newMoDataList.filter((c) => c.Id !== mo.Id);
253
+ this._resetMoDataList(newMoDataList2);
254
+ this.refreshContextMoDataList(newMoDataList2);
255
+ }
256
+ onExpandClick(mo) {
257
+ mo.$Expanded = !mo.$Expanded;
258
+ this._setVisibility(mo.$Expanded, mo);
259
+ this._resetMoDataList();
260
+ }
261
+ onAllCheckbox(checked) {
262
+ this._doCheckedAll(checked);
263
+ // if (checked) {
264
+ // this.gridDataSource.resultItems.forEach((mo, index) => {
265
+ // this._select(mo, index);
266
+ // });
267
+ // } else {
268
+ // this.gridDataSource.resultItems.forEach((mo, index) => {
269
+ // this._deselect(mo, index);
270
+ // });
271
+ // }
272
+ }
273
+ onSortAscending(column) {
274
+ this._addSortColumn(column.Name, 'ASC');
275
+ }
276
+ onSortDescending(column) {
277
+ this._addSortColumn(column.Name, 'DESC');
278
+ }
279
+ onFilter(selectedColumn) {
280
+ this._showFilterSetting(selectedColumn);
281
+ }
282
+ onColumnSettings(device) {
283
+ this._openSettings('columns', device);
284
+ }
285
+ onSortSettings(device) {
286
+ this._openSettings('sort', device);
287
+ }
288
+ onGroupbySettings(device) {
289
+ this._openSettings('groupby', device);
290
+ }
291
+ onSortSettingsChange(sortSettings) {
292
+ this.updateSortSettings(sortSettings);
293
+ }
294
+ onListCheckboxClick($event) {
295
+ const { mo, index, e } = $event;
296
+ this.onRowCheck({ mo, index, cause: 'singleSelect' });
297
+ e.stopPropagation();
298
+ e.preventDefault();
299
+ }
300
+ onListNavigationClick($event) {
301
+ const { mo, index, e } = $event;
302
+ this.onRowClick({ mo, index });
303
+ e.stopPropagation();
304
+ e.preventDefault();
305
+ }
306
+ onSaveTopForm(mo) {
307
+ const newMoDataList = this.moDataList;
308
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
309
+ if (existsIndex > -1) {
310
+ newMoDataList[existsIndex] = mo;
311
+ }
312
+ newMoDataList.map((c) => {
313
+ c.$NewInlineMo = undefined;
314
+ c.$IsChecked = false;
315
+ });
316
+ this._resetMoDataList(newMoDataList);
317
+ this.refreshContextMoDataList(newMoDataList);
318
+ }
319
+ onNewTopFormAdd(mo) {
320
+ this._addInlineMoToModataList(mo);
321
+ }
322
+ // protected _inlineEditModeChanged(editMode): void {
323
+ // if (editMode) {
324
+ // const canAdd: boolean = this._access?.Add !== false;
325
+ // let selectedMo = this._getSelected();
326
+ // let newMo;
327
+ // if (canAdd !== false && !selectedMo) {
328
+ // this._createNewInlineRecord();
329
+ // return;
330
+ // }
331
+ // // if (!selectedMo && !newMo && this.moDataList.length > 0) {
332
+ // // selectedMo = this.moDataList[0];
333
+ // // }
334
+ // // if (selectedMo) {
335
+ // // const idOfSelectedMo = this._indexOfMo(selectedMo);
336
+ // // selectedMo.$IsChecked = false;
337
+ // // this._createNewInlineRecord(selectedMo);
338
+ // // this._rowCheck(selectedMo, idOfSelectedMo);
339
+ // // }
340
+ // } else {
341
+ // BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter = this._oldContainer;
342
+ // this._setNewInlineMo(null);
343
+ // }
344
+ // }
345
+ // protected _createNewInlineRecord(selectedMo?: MetaobjectDataModel) {
346
+ // const mo = this._inlineEditPrepareNewMo();
347
+ // const formMo = BarsaApi.Common.Merger.FastMerge(mo, selectedMo, { extendedFields: ['Id,$Caption'] });
348
+ // this._setNewInlineMo(formMo);
349
+ // this._select(formMo, -1);
350
+ // }
351
+ _resetMoDataList(newMoDataList) {
352
+ this._ulvMainService.reSetMoDataList(newMoDataList);
353
+ }
354
+ _getWidth(label) {
355
+ const labelWithPadding = measureText(label);
356
+ if (labelWithPadding < 1) {
357
+ return 0;
358
+ }
359
+ return Math.ceil(labelWithPadding);
360
+ }
361
+ _setParentHeight() {
362
+ this.parentHeight = getParentHeight(this.el.nativeElement);
363
+ }
364
+ _mapCartableMo(items) {
365
+ if (!this.viewSetting) {
366
+ return items;
367
+ }
368
+ const { NameSerializeMo, CartableObjectName } = this.viewSetting;
369
+ if (!NameSerializeMo || !CartableObjectName || !items?.length) {
370
+ return items;
371
+ }
372
+ items.forEach((c) => (c[CartableObjectName] = BarsaApi.Ext.decode('{' + c[NameSerializeMo] + '}')));
373
+ return items;
374
+ }
375
+ onToolbarCreateNewInlineMo() {
376
+ this._createNewInlineMo();
377
+ }
378
+ onCreateNewMo() {
379
+ this._createNewInlineMo(true);
380
+ }
381
+ onMandatory(isMandator) {
382
+ this.context.fireEvent('Mandatory', isMandator);
383
+ }
384
+ onUpdateMo(mo) {
385
+ const moDataList = this.moDataList;
386
+ const moIndex = moDataList.findIndex((c) => c.Id === mo.Id);
387
+ if (moIndex > -1) {
388
+ moDataList[moIndex] = mo;
389
+ this._resetMoDataList(moDataList);
390
+ this.refreshContextMoDataList(moDataList);
391
+ }
392
+ }
393
+ onHasDetailsInRow(value, deviceSize) {
394
+ this.hasDetailsInRow = value;
395
+ this._deviceSizeChanged(deviceSize);
396
+ }
397
+ onEscapeKey(mo) {
398
+ this._handleCancelInlineEdit(mo);
399
+ }
400
+ _handleCancelInlineEdit(mo) {
401
+ const moDataList = this.moDataList;
402
+ const moIndex = moDataList.findIndex((c) => c.Id === mo.Id);
403
+ if (moIndex < 0 || !mo.$NewInlineMo) {
404
+ this._doCheckedAll(false);
405
+ return;
406
+ }
407
+ const newMoDataList = moDataList.filter((c) => c.Id !== mo.Id);
408
+ this._resetMoDataList(newMoDataList);
409
+ this.refreshContextMoDataList(newMoDataList);
410
+ }
411
+ _createNewInlineMo(setChanged = false) {
412
+ const moDataList = this.moDataList;
413
+ const existInlineMo = moDataList.find((c) => c.$NewInlineMo);
414
+ if (existInlineMo) {
415
+ this._inlineEditSaveFormPanel(existInlineMo);
416
+ }
417
+ const mo = this._inlineReportCreateNewMo(true);
418
+ if (setChanged) {
419
+ mo.$InlineMoChanged = true;
420
+ }
421
+ this.moDataList.forEach((c) => (c.$IsChecked = false));
422
+ this._addInlineMoToModataList(mo, true);
423
+ }
424
+ _inlineReportCreateNewMo(isChecked) {
425
+ return this._ulvMainService.createNewInlineMo(isChecked);
426
+ }
427
+ _inlineFormPanelValueChange(mo) {
428
+ const newMoDataList = this.moDataList;
429
+ const existMoIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
430
+ if (existMoIndex > -1) {
431
+ const sIndex = newMoDataList[existMoIndex].$StyleIndex;
432
+ newMoDataList[existMoIndex] = BarsaApi.Common.MetaObjectWeb.CreateMo(mo);
433
+ newMoDataList[existMoIndex].$StyleIndex = sIndex;
434
+ this._resetMoDataList(newMoDataList);
435
+ this.refreshContextMoDataList(newMoDataList);
436
+ }
437
+ }
438
+ _selectNextInlineRecord(mo) {
439
+ const newMoDataList = this.moDataList;
440
+ if (!mo.$NewInlineMo) {
441
+ // select next record
442
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
443
+ if (existsIndex > -1 && existsIndex + 1 < newMoDataList.length) {
444
+ newMoDataList[existsIndex + 1].$IsChecked = false;
445
+ this._rowCheck(newMoDataList[existsIndex + 1], existsIndex + 1);
446
+ }
447
+ else {
448
+ newMoDataList.map((c) => {
449
+ c.$NewInlineMo = undefined;
450
+ c.$IsChecked = false;
451
+ });
452
+ if (!this._access.Add) {
453
+ this._resetMoDataList(newMoDataList);
454
+ return;
455
+ }
456
+ this._addInlineMoToModataList(this._inlineReportCreateNewMo(true), true);
457
+ }
458
+ return;
459
+ }
460
+ else {
461
+ this._createNewInlineMo();
462
+ }
463
+ }
464
+ _inlineEditSaveFormPanel(mo) {
465
+ const newMoDataList = this.moDataList;
466
+ if (!mo.$NewInlineMo) {
467
+ return;
468
+ }
469
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
470
+ if (existsIndex > -1) {
471
+ newMoDataList[existsIndex] = mo;
472
+ }
473
+ const canAdd = this._access.Add;
474
+ if (!canAdd) {
475
+ return;
476
+ }
477
+ newMoDataList.map((c) => {
478
+ c.$NewInlineMo = undefined;
479
+ c.$IsChecked = false;
480
+ });
481
+ // this._ulvMainService.createNewInlineMo();
482
+ }
483
+ _setDefaultAccess() {
484
+ this._access = {
485
+ Add: false,
486
+ AddToList: false,
487
+ Delete: false,
488
+ Edit: false,
489
+ Export: false,
490
+ Print: false,
491
+ Refresh: false,
492
+ RemoveFromList: false,
493
+ View: false
494
+ };
495
+ }
496
+ _expandMo(selectedMo, expand) {
497
+ selectedMo.$Expanded = expand;
498
+ selectedMo.$Children?.forEach((child) => {
499
+ this._expandMo(child, expand);
500
+ });
501
+ }
502
+ _indexOfId(id) {
503
+ return this.gridDataSource.resultItems.findIndex((c) => c.Id === id);
504
+ }
505
+ _indexOfMo(mo) {
506
+ return this.gridDataSource.resultItems.findIndex((c) => c.Id === mo.Id);
507
+ }
508
+ _indexOfSelected() {
509
+ return this.gridDataSource.resultItems.findIndex((c) => c.$IsChecked);
510
+ }
511
+ _getIndex(mo) {
512
+ return this.moDataList.findIndex((c) => c.Id === mo.Id);
513
+ }
514
+ _setInlineEdit(value) {
515
+ this._ulvMainService.setInlineEdit(value);
516
+ }
517
+ _readViewSetting() {
518
+ this.viewSetting = this.context.Setting.ClassNames.CustomUi?.Parameters;
519
+ }
520
+ // protected _moDataListChanged(moDataList: MetaobjectDataModel[]): void {
521
+ // super._moDataListChanged(moDataList);
522
+ // if (this._inlineEditMode) {
523
+ // const checkedMoIndex = moDataList.findIndex((c) => c.$IsChecked);
524
+ // if (checkedMoIndex > -1) {
525
+ // const checkedMo = moDataList[checkedMoIndex];
526
+ // if (checkedMo.Id !== this.formPanelCtrlr.Mo.Id) {
527
+ // this._inlineEditorDestroyFormPanelCtrlr();
528
+ // this._inlineEditCreateFormPanelCtrlr(checkedMo, checkedMoIndex);
529
+ // }
530
+ // }
531
+ // }
532
+ // }
533
+ _setVisibility(expand, mo //MetaobjectDataModel
534
+ ) {
535
+ mo.$Children?.forEach((child) => {
536
+ child.$Visibility = expand;
537
+ if (child.$Children) {
538
+ this._setVisibility(expand, child);
539
+ }
540
+ });
541
+ }
542
+ // protected _setNewInlineMo(mo: MetaobjectDataModel | null): void {
543
+ // this._ulvMainService.setNewInlineMo(mo);
544
+ // }
545
+ // protected _inlineEditPrepareNewMo(): MetaobjectDataModel {
546
+ // const newMo = getNewMoGridEditor(this.formSetting, this._typeDefId);
547
+ // newMo.Id = getUniqueId(3);
548
+ // if (this._isComposite()) {
549
+ // const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
550
+ // newMo[relation.ParentFdName] = relation.ParentMoId;
551
+ // }
552
+ // const newMoDataList = [...this.moDataList, newMo as MetaobjectDataModel];
553
+ // this._ulvMainService.reSetMoDataList(newMoDataList);
554
+ // BarsaApi.Ul.ApplicationCtrlr.fireEvent(
555
+ // BarsaApi.Ul.ApplicationCtrlr.EventEnum.GlobalReportMoAdd,
556
+ // this.context,
557
+ // reportEventMoAdd
558
+ // );
559
+ // this.context.fireEvent('RefreshContextMoDataList', newMoDataList);
560
+ // return newMo as MetaobjectDataModel;
561
+ // }
562
+ _addInlineMoToModataList(newInlineMo, select = false) {
563
+ const newMoDataList = [...this.moDataList, { ...newInlineMo, $IsChecked: select }];
564
+ this._resetMoDataList(newMoDataList);
565
+ this.refreshContextMoDataList(newMoDataList);
566
+ }
567
+ _rowCheck(mo, index, selected = false) {
568
+ const editMode = this._inlineEditMode && this._allowInlineEdit;
569
+ if (mo.$IsChecked && !this.isCheckList) {
570
+ return;
571
+ }
572
+ let selectionMode = this.selectionMode;
573
+ if (editMode) {
574
+ selectionMode = SelectionMode.SINGLE;
575
+ }
576
+ const checked = !mo.$IsChecked || selected;
577
+ this.rowHoverable = false;
578
+ if (selectionMode === 'none') {
579
+ return;
580
+ }
581
+ if (checked) {
582
+ if (selectionMode === 'single' && checked) {
583
+ this._doCheckedAll(false);
584
+ }
585
+ if (editMode) {
586
+ if (index !== -1) {
587
+ // this._setNewInlineMo(null);
588
+ this._select(mo, index);
589
+ }
590
+ // TODO
591
+ // this._setValueInlineMo(mo);
592
+ }
593
+ else {
594
+ this._select(mo, index);
595
+ }
596
+ }
597
+ else
598
+ this._deselect(mo, index);
599
+ }
600
+ // protected _setValueInlineMo(mo: MetaobjectDataModel): void {
601
+ // // this.formPanelCtrlr.SetValue({ ...mo, $TypeDefId: this._typeDefId });
602
+ // }
603
+ _inlineEditorDestroyFormPanelCtrlr() {
604
+ // if (this.formPanelCtrlr) {
605
+ // this._formPanelService.destroy();
606
+ // this.formPanelCtrlr.Destroy();
607
+ // this.formPanelCtrlr = null;
608
+ // }
609
+ }
610
+ _windowResized() {
611
+ this._setContainerWidth();
612
+ this._setParentHeight();
613
+ this._cdr.detectChanges();
614
+ }
615
+ _setContainerWidth() {
616
+ const el = this.el.nativeElement;
617
+ this.containerWidthSource$.next(el.getBoundingClientRect().width);
618
+ }
619
+ _deviceSizeChanged(deviceSize) {
620
+ const elNativeElement = this.el.nativeElement;
621
+ if (this._inlineEditMode || deviceSize === 'l' || deviceSize === 'xl') {
622
+ this.secondaryColumnsSource.next([]);
623
+ return;
624
+ }
625
+ const gridSize = getControlSizeMode(elNativeElement, deviceSize);
626
+ let deviceName = 'desktop';
627
+ this.allColumns
628
+ ?.filter((c) => !c.Hidden)
629
+ .forEach((c) => (c.$TextWidth = c.$TextWidth ? c.$TextWidth : this._getWidth(c.Alias) + 10));
630
+ const allColumnsWidth = this.allColumns.map((column) => column.$TextWidth && column.Width > column.$TextWidth ? column.Width : column.$TextWidth || column.Width);
631
+ const visibleColumns = this._visibleColumnsSource.getValue();
632
+ if (visibleColumns.length === 1) {
633
+ this.secondaryColumnsSource.next([]);
634
+ }
635
+ let columnsCount = visibleColumns.length;
636
+ const gridSettings = this.gridSettingSource.getValue();
637
+ const groupedColumns = gridSettings.SortSettingList.filter((d) => d.IsGrouped);
638
+ const nameGroupedColumns = groupedColumns.map((c) => c.Name);
639
+ const colWidthSettings = gridSettings?.ColSettingList?.filter((c) => nameGroupedColumns.indexOf(c.Name) === -1).map((c) => c.Width);
640
+ const columnsWidth = colWidthSettings?.length ? colWidthSettings : allColumnsWidth;
641
+ let sumColWidth = 0;
642
+ if (this.context.ViewSetting?.IsCheckList) {
643
+ sumColWidth += 15;
644
+ }
645
+ if (this.context.Setting?.Extra?.DefaultCommandsAccess?.View) {
646
+ sumColWidth += 32;
647
+ }
648
+ if (this.hasDetailsInRow) {
649
+ sumColWidth += 210;
650
+ }
651
+ const containerWidth = elNativeElement.clientWidth;
652
+ switch (gridSize) {
653
+ case 'l':
654
+ case 'xl':
655
+ deviceName = 'desktop';
656
+ break;
657
+ case 's':
658
+ deviceName = 'mobile';
659
+ columnsCount = 2;
660
+ break;
661
+ case 'm':
662
+ deviceName = 'tablet';
663
+ columnsCount = 4;
664
+ break;
665
+ }
666
+ this._deviceNameSource.next(deviceName);
667
+ if (columnsWidth.length > 0 && containerWidth > 0 && deviceSize !== 's') {
668
+ columnsCount = visibleColumns.length;
669
+ columnsWidth.forEach((width, index) => {
670
+ if (sumColWidth + width > containerWidth && columnsCount === visibleColumns.length) {
671
+ columnsCount = index;
672
+ }
673
+ sumColWidth += width;
674
+ });
675
+ }
676
+ const secColumns = this.secondaryColumnsSource.getValue();
677
+ if (visibleColumns.length > 2) {
678
+ if (this._isDisableResponsiveInDesktop() ||
679
+ this._isDisableResponsiveInMobile() ||
680
+ this._isDisableResponsiveInTablet()) {
681
+ if (secColumns.length) {
682
+ this.secondaryColumnsSource.next([]);
683
+ }
684
+ return;
685
+ }
686
+ if (columnsCount == 0) {
687
+ columnsCount = 1;
688
+ }
689
+ this.secondaryColumnsSource.next(visibleColumns.slice(columnsCount, visibleColumns.length));
690
+ }
691
+ }
692
+ _isDisableResponsiveInDesktop() {
693
+ const isDesktop = getDeviceIsDesktop();
694
+ return this.viewSetting?.DisableResponsiveInDesktop && isDesktop;
695
+ }
696
+ _isDisableResponsiveInTablet() {
697
+ const isTablet = getDeviceIsTablet();
698
+ return this.viewSetting?.DisableResponsiveInTablet && isTablet;
699
+ }
700
+ _isDisableResponsiveInMobile() {
701
+ const isMobile = getDeviceIsMobile();
702
+ return this.viewSetting?.DisableResponsiveInMobile && isMobile;
703
+ }
704
+ _openSettings(name, device) {
705
+ let component = null;
706
+ switch (name) {
707
+ case 'columns':
708
+ component = UlvColumnSettingsComponent;
709
+ break;
710
+ case 'sort':
711
+ component = UlvSortSettingsComponent;
712
+ break;
713
+ case 'groupby':
714
+ component = UlvGroupbySettingsComponent;
715
+ break;
716
+ }
717
+ const config = {
718
+ ...this.dialogConfig,
719
+ data: { context: this.context },
720
+ mobile: device === 'mobile',
721
+ minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
722
+ minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight,
723
+ maxHeight: device === 'mobile' ? '100%' : this.dialogConfig.maxHeight,
724
+ maxWidth: device === 'mobile' ? '100%' : this.dialogConfig.maxWidth
725
+ };
726
+ if (component !== null) {
727
+ const dialogRef = this._dialogService.open(component, config);
728
+ dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
729
+ if (setting) {
730
+ const isSortChanged = name === 'sort' || name === 'groupby';
731
+ this.updateGridSetting(setting, isSortChanged);
732
+ this.context.moDataList = this.gridDataSource.resultItems;
733
+ }
734
+ });
735
+ }
736
+ }
737
+ _showFilterSetting(selectedColumn) {
738
+ const typeDefId = this._typeDefId;
739
+ const controlsInfo$ = this._ulvMainService.loadMetaConditionsControlInfos(typeDefId, this.allColumns.map((c) => c.Name));
740
+ const config = {
741
+ ...this.dialogConfig,
742
+ data: {
743
+ controlsInfo$,
744
+ typeDefId,
745
+ selectedColumnName: selectedColumn.Name,
746
+ context: this.context
747
+ }
748
+ };
749
+ const dialogRef = this._dialogService.open(UlvFilterSettingsComponent, config);
750
+ dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
751
+ if (setting) {
752
+ }
753
+ });
754
+ }
755
+ _addSortColumn(name, sortDirection, isGrouped = false) {
756
+ const sortItem = {
757
+ Name: name,
758
+ SortDirection: sortDirection,
759
+ IsGrouped: isGrouped
760
+ };
761
+ const settings = getGridSettings(this.context);
762
+ const existSortItemIndex = settings.SortSettingList.findIndex((c) => c.Name === name);
763
+ if (existSortItemIndex > -1) {
764
+ settings.SortSettingList = [sortItem, ...settings.SortSettingList];
765
+ settings.SortSettingList.splice(existSortItemIndex + 1, 1);
766
+ }
767
+ else {
768
+ settings.SortSettingList.push(sortItem);
769
+ }
770
+ this.updateGridSetting(settings, true);
771
+ }
772
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SapUiReportBaseComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.Overlay }, { token: i2.ContentDensityService }, { token: i3.PortalService }, { token: i2.DialogService }, { token: i3.UlvMainService }, { token: i3.LayoutService }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i3.FormPanelService, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
773
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SapUiReportBaseComponent, selector: "bsu-sap-ui-report-base", inputs: { ShowFormPanelControl: "ShowFormPanelControl", ForceCloseChild: "ForceCloseChild", RefreshFormPanelControl: "RefreshFormPanelControl" }, viewQueries: [{ propertyName: "tableComponent", first: true, predicate: TableComponent, descendants: true }, { propertyName: "toolbarComponent", first: true, predicate: ToolbarComponent, descendants: true }, { propertyName: "tableRowsRef", predicate: ["tableRows"], descendants: true }, { propertyName: "layoutControlsRef", predicate: LayoutControlComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
774
+ }
775
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SapUiReportBaseComponent, decorators: [{
776
+ type: Component,
777
+ args: [{
778
+ selector: 'bsu-sap-ui-report-base',
779
+ template: '',
780
+ changeDetection: ChangeDetectionStrategy.OnPush,
781
+ standalone: false
782
+ }]
783
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.Overlay }, { type: i2.ContentDensityService }, { type: i3.PortalService }, { type: i2.DialogService }, { type: i3.UlvMainService }, { type: i3.LayoutService }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
784
+ type: Inject,
785
+ args: [DOCUMENT]
786
+ }] }, { type: i3.FormPanelService, decorators: [{
787
+ type: Optional
788
+ }, {
789
+ type: Self
790
+ }] }], propDecorators: { tableComponent: [{
791
+ type: ViewChild,
792
+ args: [TableComponent]
793
+ }], toolbarComponent: [{
794
+ type: ViewChild,
795
+ args: [ToolbarComponent]
796
+ }], tableRowsRef: [{
797
+ type: ViewChildren,
798
+ args: ['tableRows']
799
+ }], layoutControlsRef: [{
800
+ type: ViewChildren,
801
+ args: [LayoutControlComponent]
802
+ }], ShowFormPanelControl: [{
803
+ type: Input
804
+ }], ForceCloseChild: [{
805
+ type: Input
806
+ }], RefreshFormPanelControl: [{
807
+ type: Input
808
+ }] } });
809
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3NhcC11aS1yZXBvcnQtYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBR1IsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFLSCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUNILFFBQVEsRUFLUixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFJZixtQkFBbUIsRUFLbkIsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBSXBCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFB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QkFBa0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbkUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ0osUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQzsrR0E1MUJRLHdCQUF3Qix1UkFtRnJCLFFBQVE7bUdBbkZYLHdCQUF3QixnUUFJdEIsY0FBYyxtRkFDZCxnQkFBZ0Isc0pBRWIsc0JBQXNCLHVFQVgxQixFQUFFOzs0RkFJSCx3QkFBd0I7a0JBTnBDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLEVBQUU7b0JBQ1osZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxLQUFLO2lCQUNwQjs7MEJBb0ZRLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsUUFBUTs7MEJBQUksSUFBSTt5Q0FoRk0sY0FBYztzQkFBeEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNJLGdCQUFnQjtzQkFBNUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0EsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUV6QixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsc0JBQXNCO2dCQTBYM0Isb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsdUJBQXVCO3NCQUEvQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPcHRpb25hbCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNlbGYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBWaWV3Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgT3ZlcmxheSwgU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsLCB0YXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29udGVudERlbnNpdHksXHJcbiAgICBDb250ZW50RGVuc2l0eVNlcnZpY2UsXHJcbiAgICBEaWFsb2dDb25maWcsXHJcbiAgICBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgVGFibGVDb21wb25lbnQsXHJcbiAgICBUb29sYmFyQ29tcG9uZW50XHJcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBCYXJzYUFwaSxcclxuICAgIGNvbHVtbnNSZXNpemVkRXZlbnRBcmdzLFxyXG4gICAgRGVmYXVsdENvbW1hbmRzQWNjZXNzLFxyXG4gICAgRGV2aWNlU2l6ZSxcclxuICAgIEZvcm1QYW5lbFNlcnZpY2UsXHJcbiAgICBHZXRBbGxDb2x1bW5zU29ydGVkLFxyXG4gICAgZ2V0Q29udHJvbFNpemVNb2RlLFxyXG4gICAgZ2V0R3JpZFNldHRpbmdzLFxyXG4gICAgTGF5b3V0U2VydmljZSxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBQb3J0YWxTZXJ2aWNlLFxyXG4gICAgUmVwb3J0QmFzZUNvbXBvbmVudCxcclxuICAgIFJlcG9ydFZpZXdDb2x1bW4sXHJcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcclxuICAgIFVsdk1haW5TZXJ2aWNlLFxyXG4gICAgU2hhcmVCdXR0b25zQ2hvaWNlRGVmLFxyXG4gICAgZ2V0UGFyZW50SGVpZ2h0LFxyXG4gICAgbWVhc3VyZVRleHQsXHJcbiAgICBnZXRVbmlxdWVJZCxcclxuICAgIFNlbGVjdGlvbk1vZGUsXHJcbiAgICBnZXREZXZpY2VJc0Rlc2t0b3AsXHJcbiAgICBnZXREZXZpY2VJc01vYmlsZSxcclxuICAgIGdldERldmljZUlzVGFibGV0LFxyXG4gICAgQ29sdW1uU3VtbWFyeVR5cGUsXHJcbiAgICBMYXlvdXRTZXR0aW5nLFxyXG4gICAgU29ydFNldHRpbmdcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IExheW91dENvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1jb250cm9sL2xheW91dC1jb250cm9sLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyaWRNb0RhdGFMaXN0IH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBVbHZDb2x1bW5TZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdWx2LWNvbHVtbi1zZXR0aW5ncy91bHYtY29sdW1uLXNldHRpbmdzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVsdlNvcnRTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdWx2LXNvcnQtc2V0dGluZ3MvdWx2LXNvcnQtc2V0dGluZ3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWx2R3JvdXBieVNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi91bHYtZ3JvdXBieS1zZXR0aW5ncy91bHYtZ3JvdXBieS1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVbHZGaWx0ZXJTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdWx2LWZpbHRlci1zZXR0aW5ncy91bHYtZmlsdGVyLXNldHRpbmdzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdic3Utc2FwLXVpLXJlcG9ydC1iYXNlJyxcclxuICAgIHRlbXBsYXRlOiAnJyxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc3RhbmRhbG9uZTogZmFsc2VcclxufSlcclxuZXhwb3J0IGNsYXNzIFNhcFVpUmVwb3J0QmFzZUNvbXBvbmVudDxUIGV4dGVuZHMgVWlSZXBvcnRWaWV3QmFzZVNldHRpbmc+XHJcbiAgICBleHRlbmRzIFJlcG9ydEJhc2VDb21wb25lbnRcclxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gICAgQFZpZXdDaGlsZChUYWJsZUNvbXBvbmVudCkgdGFibGVDb21wb25lbnQ6IFRhYmxlQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZChUb29sYmFyQ29tcG9uZW50KSB0b29sYmFyQ29tcG9uZW50OiBUb29sYmFyQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZHJlbigndGFibGVSb3dzJykgdGFibGVSb3dzUmVmOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgICBAVmlld0NoaWxkcmVuKExheW91dENvbnRyb2xDb21wb25lbnQpXHJcbiAgICBsYXlvdXRDb250cm9sc1JlZjogUXVlcnlMaXN0PExheW91dENvbnRyb2xDb21wb25lbnQ+O1xyXG4gICAgdXNlTGF5b3V0SXRlbVRleHRGb3JDb250cm9sID0gZmFsc2U7XHJcbiAgICBoYXNTZWxlY3RlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBzaG93T2tDYW5jZWxCdXR0b25zOiBhbnk7XHJcbiAgICBwYXJlbnRIZWlnaHQgPSAwO1xyXG4gICAgZGlhbG9nQ29uZmlnOiBEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgcmVzcG9uc2l2ZVBhZGRpbmc6IHRydWUsXHJcbiAgICAgICAgdmVydGljYWxQYWRkaW5nOiB0cnVlLFxyXG4gICAgICAgIG1pbldpZHRoOiAnNDByZW0nLFxyXG4gICAgICAgIG1pbkhlaWdodDogJzkwdmgnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMTAwdncnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzEwMHZoJyxcclxuICAgICAgICByZXNpemFibGU6IHRydWVcclxuICAgIH07XHJcbiAgICBpZCA9IGBSZXBvcnRfJHtnZXRVbmlxdWVJZCgzKX1gO1xyXG4gICAgc2VsZWN0ZWRSb3dzTnVtYmVyID0ge307XHJcbiAgICBzZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIHNlbGVjdGlvbkFkYXB0ZXJIYW5kbGVyOiB7XHJcbiAgICAgICAgc2NvcGU6IGFueTtcclxuICAgICAgICByb3dzZWxlY3Q6IGFueTtcclxuICAgICAgICByb3dkZXNlbGVjdDogYW55O1xyXG4gICAgICAgIGJlZm9yZXJvd3NlbGVjdDogYW55O1xyXG4gICAgfTtcclxuICAgIG5hdmlnYXRpb25BcnJvdyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuICAgIGN1c3RvbVJvd0hlaWdodDogYW55O1xyXG4gICAgcm93Q2xpY2sgPSB0cnVlO1xyXG4gICAgY2VsbENsaWNrID0gZmFsc2U7XHJcbiAgICBkZXZpY2VOYW1lJDogT2JzZXJ2YWJsZTxEZXZpY2VTaXplPjtcclxuICAgIG1vYmlsZU9yVGFibGV0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgICBzZWNvbmRhcnlDb2x1bW5zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXBvcnRWaWV3Q29sdW1uW10+KFtdKTtcclxuICAgIHNlY29uZGFyeUNvbHVtbnMkID0gdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlXHJcbiAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEubGVuZ3RoID09PSBiLmxlbmd0aCB8fCBhID09PSBiKSk7XHJcbiAgICBwb3BpbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBjb250ZW50RGVuc2l0eSQ6IE9ic2VydmFibGU8Q29udGVudERlbnNpdHk+O1xyXG4gICAgaGFzRGV0YWlsc0luUm93ID0gZmFsc2U7XHJcbiAgICByb3dBY3RpdmFibGUgPSB0cnVlO1xyXG4gICAgb3Blbk92ZXJmbG93Q29tbWFuZHM6IGJvb2xlYW5bXSA9IFtdO1xyXG4gICAgY29udGFpbmVyV2lkdGhTb3VyY2UkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG4gICAgY2xvc2VTY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3k7XHJcbiAgICByb3dIb3ZlcmFibGU6IGJvb2xlYW47XHJcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlO1xyXG4gICAgY29sdW1uc0NvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gICAgc2Vjb25kYXJ5Q29sdW1uc0NvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gICAgY29udGFpbmVyV2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgICBjb2x1bW5zJDogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3Q29sdW1uW10+O1xyXG4gICAgZ3JpZERhdGFTb3VyY2U6IEdyaWRNb0RhdGFMaXN0O1xyXG4gICAgc2luZ2xlU2VsZWN0aW9uID0gU2VsZWN0aW9uTW9kZS5TSU5HTEU7XHJcbiAgICBtdWx0aXBsZVNlbGVjdGlvbiA9IFNlbGVjdGlvbk1vZGUuTVVMVElQTEU7XHJcbiAgICBhbGxvd0lubGluZUVkaXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgaW5saW5lRWRpdE1vZGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgb25seUlubGluZUVkaXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgZm9ybVBhbmVsQ3RybHI6IGFueTtcclxuICAgIGxheW91dCQ6IE9ic2VydmFibGU8YW55PjtcclxuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICByZXBvcnRJZDogc3RyaW5nO1xyXG4gICAgdmlld1NldHRpbmc6IFQ7XHJcbiAgICBkaXNhYmxlUmVzcG9uc2l2ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBzaW1wbGVJbmxpbmVFZGl0OiBib29sZWFuO1xyXG4gICAgbGF5b3V0SW5mbzogTGF5b3V0U2V0dGluZztcclxuICAgIHByb3RlY3RlZCBfZGV2aWNlTmFtZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGV2aWNlU2l6ZT4oJ2Rlc2t0b3AnKTtcclxuICAgIHByaXZhdGUgX29sZENvbnRhaW5lcjogYW55O1xyXG4gICAgcHJpdmF0ZSBfb3Blbk9uQ2xpY2s6IGJvb2xlYW47XHJcbiAgICBncm91cFN1bW1hcnk6IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByb3RlY3RlZCBfb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcm90ZWN0ZWQgX2NvbnRlbnREZW5zaXR5U2VydmljZTogQ29udGVudERlbnNpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF91bHZNYWluU2VydmljZTogVWx2TWFpblNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9sYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwcm90ZWN0ZWQgX2Zvcm1wYW5lbFNlcnZpY2U6IEZvcm1QYW5lbFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9wb3J0YWxTZXJ2aWNlLCBfdWx2TWFpblNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGgkID0gdGhpcy5jb250YWluZXJXaWR0aFNvdXJjZSRcclxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgICAgICB0aGlzLmRldmljZU5hbWUkID0gdGhpcy5fZGV2aWNlTmFtZVNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLmRpc2FibGVSZXNwb25zaXZlJCA9IHRoaXMuZGV2aWNlTmFtZSQucGlwZShtYXAoKGMpID0+IGMgPT09ICdkZXNrdG9wJykpO1xyXG4gICAgICAgIHRoaXMubW9iaWxlT3JUYWJsZXQkID0gdGhpcy5kZXZpY2VOYW1lJC5waXBlKG1hcCgoZGV2aWNlKSA9PiBkZXZpY2UgPT09ICdtb2JpbGUnIHx8IGRldmljZSA9PT0gJ3RhYmxldCcpKTtcclxuICAgICAgICB0aGlzLl9vbGRDb250YWluZXIgPSBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkN1cnJlbnRTeXN0ZW1BZGFwdGVyO1xyXG4gICAgICAgIHRoaXMuY2xvc2VTY3JvbGxTdHJhdGVneSA9IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuY29udGVudERlbnNpdHkkID0gdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlLmNvbnRlbnREZW5zaXR5O1xyXG4gICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc0NvdW50JCA9IHRoaXMuc2Vjb25kYXJ5Q29sdW1ucyQucGlwZShtYXAoKGNvbHVtbnMpID0+IGNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ291bnQkID0gdGhpcy52aXNpYmxlQ29sdW1ucyQucGlwZShcclxuICAgICAgICAgICAgbWFwKChjb2x1bW5zKSA9PiBjb2x1bW5zLmxlbmd0aCksXHJcbiAgICAgICAgICAgIG1hcCgoY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUodGhpcy5jb250ZXh0LCAnU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3M/LlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbWFwKChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBvbkNvbHVtblN1bW1hcnkoZTogQ29sdW1uU3VtbWFyeVR5cGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5TdW1tYXJ5KGUpO1xyXG4gICAgfVxyXG4gICAgb25SZXNldFdvcmtmbG93U3RhdGUobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBtby4kV29ya2Zsb3dTdGF0ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF90eXBlRGVmSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEuUmVwb3J0LlR5cGVEZWZJZDtcclxuICAgIH1cclxuICAgIGdldCBfaW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldFZhbHVlSW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hbGxvd0lubGluZUVkaXQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldEFsbG93SW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hY2Nlc3MoKTogRGVmYXVsdENvbW1hbmRzQWNjZXNzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmc/LkV4dHJhPy5EZWZhdWx0Q29tbWFuZHNBY2Nlc3M7XHJcbiAgICB9XHJcbiAgICBzZXQgX2FjY2Vzcyh2YWw6IERlZmF1bHRDb21tYW5kc0FjY2Vzcykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MgPSB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEgPSB7IERlZmF1bHRDb21tYW5kc0FjY2VzczogdmFsIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGlzQ2hlY2tMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuVmlld1NldHRpbmc/LklzQ2hlY2tMaXN0O1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50SGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fcmVhZFZpZXdTZXR0aW5nKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9hY2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFjY2VzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuc2hvd09rQ2FuY2VsQnV0dG9ucyA9IHRoaXMuY29udGV4dC5TaG93T2tDYW5jZWxCdXR0b25zO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxheW91dEluZm8kLnN1YnNjcmliZSgobGF5b3V0SW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLlVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLnZpZXdTZXR0aW5nPy5UaXRsZTtcclxuICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2Uuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZXBvcnRJZCQuc3Vic2NyaWJlKChyZXBvcnRJZCkgPT4gKHRoaXMucmVwb3J0SWQgPSByZXBvcnRJZCkpO1xyXG4gICAgICAgIHRoaXMuX2xheW91dFNlcnZpY2Uuc2V0UmVuZGVyZWQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb250ZXh0LlZpZXdTZXR0aW5nPy5Jc0NoZWNrTGlzdCA/IHRoaXMubXVsdGlwbGVTZWxlY3Rpb24gOiB0aGlzLnNpbmdsZVNlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLl9vcGVuT25DbGljayA9IHRoaXMudmlld1NldHRpbmc/Lk9wZW5PbkNsaWNrO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tUm93SGVpZ2h0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxyXG4gICAgICAgICAgICAnRXh0cmEuRXh0cmFKc29uUHJvcFJlcG9ydC5HcmlkUm93SGVpZ2h0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zaW1wbGVJbmxpbmVFZGl0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxyXG4gICAgICAgICAgICAnRXh0cmEuRXh0cmFKc29uUHJvcFJlcG9ydC5TaW1wbGVJbmxpbmVFZGl0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5ncm91cFN1bW1hcnkgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LlNldHRpbmcsXHJcbiAgICAgICAgICAgICdFeHRyYS5FeHRyYUpzb25Qcm9wUmVwb3J0Lkdyb3VwU3VtbWFyeScsXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnJ0bCQgPSB0aGlzLl9wb3J0YWxTZXJ2aWNlLnJ0bCQ7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQXJyb3ckID0gdGhpcy5fcG9ydGFsU2VydmljZS5ydGwkLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoaXNSdGwpID0+IChpc1J0bCA/ICduYXZpZ2F0aW9uLWxlZnQtYXJyb3cnIDogJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuYWxsb3dJbmxpbmVFZGl0JCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmFsbG93SW5saW5lRWRpdCQ7XHJcbiAgICAgICAgdGhpcy5pbmxpbmVFZGl0TW9kZSQgPSB0aGlzLl91bHZNYWluU2VydmljZS5pbmxpbmVFZGl0TW9kZSQ7XHJcbiAgICAgICAgdGhpcy5vbmx5SW5saW5lRWRpdCQgPSB0aGlzLl91bHZNYWluU2VydmljZS5vbmx5SW5saW5lRWRpdCQ7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2Uuc2V0Q2FuU2F2ZUdyaWRTZXR0aW5ncyh0aGlzLnZpZXdTZXR0aW5nPy5DYW5TYXZlR3JpZFNldHRpbmcpO1xyXG4gICAgICAgIHRoaXMuaGFzU2VsZWN0ZWQkID0gdGhpcy5tb0RhdGFMaXN0JC5waXBlKG1hcCgobW9MaXN0KSA9PiBtb0xpc3Quc29tZSgoYykgPT4gYy4kSXNDaGVja2VkKSkpO1xyXG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3QkLnBpcGUobWFwKChpdGVtcykgPT4gdGhpcy5fbWFwQ2FydGFibGVNbyhpdGVtcykpKTtcclxuICAgICAgICBjb25zdCBncmlkRGF0YVNvdXJjZSA9IG5ldyBHcmlkTW9EYXRhTGlzdChcclxuICAgICAgICAgICAgdGhpcy5tb0RhdGFMaXN0JCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZyQsXHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMkLFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm0kLFxyXG4gICAgICAgICAgICB0aGlzLmlubGluZUVkaXRNb2RlJFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZERhdGFTb3VyY2UgPSBncmlkRGF0YVNvdXJjZTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5ncmlkU2V0dGluZyQsIHRoaXMuc2Vjb25kYXJ5Q29sdW1ucyRdKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKFtfLCBzZWNvbmRhcnlDb2x1bW5zXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vjb25kYXJpZXMgPSBzZWNvbmRhcnlDb2x1bW5zLm1hcCgoYykgPT4gYy5OYW1lKTtcclxuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gR2V0QWxsQ29sdW1uc1NvcnRlZCh0aGlzLmNvbnRleHQpLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRDb2x1bW5zID0gXz8uU29ydFNldHRpbmdMaXN0Py5maWx0ZXIoKGMpID0+IGMuSXNHcm91cGVkKS5tYXAoKGMpID0+IGMuTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZENvbHVtbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gZ3JvdXBlZENvbHVtbnMuaW5kZXhPZihjLk5hbWUpID09PSAtMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGMpID0+IHNlY29uZGFyaWVzLmluZGV4T2YoYy5OYW1lKSA9PT0gLTEpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgdGFwKChjb2x1bW5zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGM6IFJlcG9ydFZpZXdDb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjLiRDU1NDbGFzc05hbWUgPSAnY29sdW1uX19GaWVsZFR5cGUnICsgYy5GaWVsZFR5cGVJZDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYy5GaWVsZFR5cGVJZCA9PT0gMzgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYy4kV2lkdGggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChjLkV4dHJhPy5JY29uRGlzcGxheVR5cGVFbnVtID09PSAnSW1hZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGMuJFdpZHRoID0gJzM4cHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGMuJFdpZHRoID0gIUJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNVc2VyTG9nZ2VkSW4gLy8gaWYgdXNlciBpcyBhbm9ueW1vdXMgYWxsIGNvbHVtbiB3aWR0aCBlcXVhbHMgdG8gMTAwJVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgPyAnMTAwJSdcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIDogYy5XaWR0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgID8gYy5XaWR0aCArICdweCdcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIDogJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UuaW5saW5lRWRpdE1vZGUkLnBpcGUoXHJcbiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuaGFzU2VsZWN0ZWQkKSxcclxuICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2FjY2Vzcy5BZGQgIT09IGZhbHNlKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5fc2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgIH1cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1wYW5lbFNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9ybXBhbmVsU2VydmljZS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25FeGVjdXRlVG9vbGJhckJ1dHRvbihlOiB7IGl0ZW1JZDogc3RyaW5nOyBvcHRpb25zPzogYW55IH0pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IGl0ZW1JZCwgb3B0aW9ucyB9ID0gZTtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5leGVjdXRlVG9vbGJhckJ1dHRvbihpdGVtSWQsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgb25FZGl0TW9kZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZXRJbmxpbmVFZGl0KCF0aGlzLl9pbmxpbmVFZGl0TW9kZSk7XHJcbiAgICB9XHJcbiAgICBvblNlbGVjdE5leHRJbmxpbmVSZWNvcmQobW8pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRGb3JtUGFuZWxTYXZlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdFNhdmVGb3JtUGFuZWwobW8pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdEZvcm1QYW5lbENhbmNlbChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgY29uc3QgaGFzU2VsZWN0ZWQgPSBtb0RhdGFMaXN0LnNvbWUoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcbiAgICAgICAgaWYgKGhhc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lubGluZUVkaXRTYXZlRm9ybVBhbmVsKG1vKTtcclxuICAgICAgICAgICAgdGhpcy5fc2V0SW5saW5lRWRpdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25FZGl0Rm9ybVBhbmVsVmFsdWVDaGFuZ2UoZTogeyBtbzogTWV0YW9iamVjdERhdGFNb2RlbDsgZmllbGREYk5hbWU/OiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKGUubW8pO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ0NlbGxFZGl0ZWQnLCBCYXJzYUFwaS5Cdy5fd3JhcChlLm1vKSwgZS5maWVsZERiTmFtZSk7XHJcbiAgICB9XHJcbiAgICBvbkNvbHVtblJlc2l6ZWQoY29sdW1uczogY29sdW1uc1Jlc2l6ZWRFdmVudEFyZ3MpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVDb2x1bW5zUmVzaXplZChjb2x1bW5zKTtcclxuICAgIH1cclxuICAgIG9uV29ya2Zsb3dTaGFyZUJ1dHRvbnMoZTogU2hhcmVCdXR0b25zQ2hvaWNlRGVmKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UuYWRkV29ya2Zsb3dCdXR0b25zSW5Ub29sYmFyKGUpO1xyXG4gICAgfVxyXG4gICAgb25Sb3dDbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgaWYgKG1vLmdyb3VwIHx8IHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICB0aGlzLl9yZW1vdmVDaGVja2VkQWxsKCk7XHJcbiAgICAgICAgaWYgKCFtby4kSXNDaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvd0NoZWNrKG1vLCBtb0luZGV4LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudmlld1NldHRpbmc/LkRpc2FibGVTaG93Rm9ybU9uRG91YmxlQ2xpY2spIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vcGVuTW8obW8sIG1vSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVWx2Q29tbWFuZCgkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICB0aGlzLl91bHZDb21tYW5kQ2xpY2tlZChtbywgbW9JbmRleCk7XHJcbiAgICB9XHJcbiAgICBvbkRlc2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChmYWxzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5jb250ZXh0LmZpcmVFdmVudCgncm93c2VsZWN0JywgdGhpcy5jb250ZXh0KTsgLy8g2KjYp9i52Ksg2YXbjNi02YjYryDYr9mI2KjYp9ixIHNlbGVjdGlvbmNoYW5nZSDar9iy2KfYsdi0INmB2LHYp9iu2YjYp9mG24wg2LTZiNivXHJcbiAgICB9XHJcbiAgICBvblJvd0NoZWNrKCRldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgbW8sIG9ubHlDaGVjayB9ID0gJGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IG1vSW5kZXggPSB0aGlzLl9nZXRJbmRleChtbyk7XHJcbiAgICAgICAgaWYgKCFvbmx5Q2hlY2sgJiYgdGhpcy5fb3Blbk9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCRldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcm93Q2hlY2sobW8sIG1vSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uQ2FydGFibGVGb3JtQ2xvc2VkKHsgbW8gfSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdDIgPSBuZXdNb0RhdGFMaXN0LmZpbHRlcigoYykgPT4gYy5JZCAhPT0gbW8uSWQpO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0Mik7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdDIpO1xyXG4gICAgfVxyXG4gICAgb25FeHBhbmRDbGljayhtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIG1vLiRFeHBhbmRlZCA9ICFtby4kRXhwYW5kZWQ7XHJcbiAgICAgICAgdGhpcy5fc2V0VmlzaWJpbGl0eShtby4kRXhwYW5kZWQsIG1vKTtcclxuICAgICAgICB0aGlzLl9yZXNldE1vRGF0YUxpc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFsbENoZWNrYm94KGNoZWNrZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kb0NoZWNrZWRBbGwoY2hlY2tlZCk7XHJcbiAgICAgICAgLy8gaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAvLyAgIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZm9yRWFjaCgobW8sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3NlbGVjdChtbywgaW5kZXgpO1xyXG4gICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZm9yRWFjaCgobW8sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2Rlc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgb25Tb3J0QXNjZW5kaW5nKGNvbHVtbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FkZFNvcnRDb2x1bW4oY29sdW1uLk5hbWUsICdBU0MnKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNvcnREZXNjZW5kaW5nKGNvbHVtbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FkZFNvcnRDb2x1bW4oY29sdW1uLk5hbWUsICdERVNDJyk7XHJcbiAgICB9XHJcbiAgICBvbkZpbHRlcihzZWxlY3RlZENvbHVtbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Nob3dGaWx0ZXJTZXR0aW5nKHNlbGVjdGVkQ29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNvbHVtblNldHRpbmdzKGRldmljZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnY29sdW1ucycsIGRldmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Tb3J0U2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb3BlblNldHRpbmdzKCdzb3J0JywgZGV2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkdyb3VwYnlTZXR0aW5ncyhkZXZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vcGVuU2V0dGluZ3MoJ2dyb3VwYnknLCBkZXZpY2UpO1xyXG4gICAgfVxyXG4gICAgb25Tb3J0U2V0dGluZ3NDaGFuZ2Uoc29ydFNldHRpbmdzOiBTb3J0U2V0dGluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0U2V0dGluZ3Moc29ydFNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkxpc3RDaGVja2JveENsaWNrKCRldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgbW8sIGluZGV4LCBlIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgdGhpcy5vblJvd0NoZWNrKHsgbW8sIGluZGV4LCBjYXVzZTogJ3NpbmdsZVNlbGVjdCcgfSk7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25MaXN0TmF2aWdhdGlvbkNsaWNrKCRldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgbW8sIGluZGV4LCBlIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgdGhpcy5vblJvd0NsaWNrKHsgbW8sIGluZGV4IH0pO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgb25TYXZlVG9wRm9ybShtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgIGlmIChleGlzdHNJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXhdID0gbW87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5ld01vRGF0YUxpc3QubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgIGMuJE5ld0lubGluZU1vID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjLiRJc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9yZXNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICB9XHJcbiAgICBvbk5ld1RvcEZvcm1BZGQobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hZGRJbmxpbmVNb1RvTW9kYXRhTGlzdChtbyk7XHJcbiAgICB9XHJcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0Zvcm1QYW5lbENvbnRyb2wgPSAoZm9ybXBhbmVsQ3RybHIpID0+IHt9O1xyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIEBJbnB1dCgpIEZvcmNlQ2xvc2VDaGlsZCA9ICgpID0+IHt9O1xyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIEBJbnB1dCgpIFJlZnJlc2hGb3JtUGFuZWxDb250cm9sID0gKGZvcm1wYW5lbEN0cmxyKSA9PiB7fTtcclxuXHJcbiAgICAvLyBwcm90ZWN0ZWQgX2lubGluZUVkaXRNb2RlQ2hhbmdlZChlZGl0TW9kZSk6IHZvaWQge1xyXG4gICAgLy8gICAgIGlmIChlZGl0TW9kZSkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBjYW5BZGQ6IGJvb2xlYW4gPSB0aGlzLl9hY2Nlc3M/LkFkZCAhPT0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgICBsZXQgc2VsZWN0ZWRNbyA9IHRoaXMuX2dldFNlbGVjdGVkKCk7XHJcbiAgICAvLyAgICAgICAgIGxldCBuZXdNbztcclxuICAgIC8vICAgICAgICAgaWYgKGNhbkFkZCAhPT0gZmFsc2UgJiYgIXNlbGVjdGVkTW8pIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU5ld0lubGluZVJlY29yZCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIC8vIGlmICghc2VsZWN0ZWRNbyAmJiAhbmV3TW8gJiYgdGhpcy5tb0RhdGFMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgLy8gICAgIHNlbGVjdGVkTW8gPSB0aGlzLm1vRGF0YUxpc3RbMF07XHJcbiAgICAvLyAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgLy8gaWYgKHNlbGVjdGVkTW8pIHtcclxuICAgIC8vICAgICAgICAgLy8gICAgIGNvbnN0IGlkT2ZTZWxlY3RlZE1vID0gdGhpcy5faW5kZXhPZk1vKHNlbGVjdGVkTW8pO1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgc2VsZWN0ZWRNby4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLl9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoc2VsZWN0ZWRNbyk7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLl9yb3dDaGVjayhzZWxlY3RlZE1vLCBpZE9mU2VsZWN0ZWRNbyk7XHJcbiAgICAvLyAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkN1cnJlbnRTeXN0ZW1BZGFwdGVyID0gdGhpcy5fb2xkQ29udGFpbmVyO1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9zZXROZXdJbmxpbmVNbyhudWxsKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICAvLyBwcm90ZWN0ZWQgX2NyZWF0ZU5ld0lubGluZVJlY29yZChzZWxlY3RlZE1vPzogTWV0YW9iamVjdERhdGFNb2RlbCkge1xyXG4gICAgLy8gICAgIGNvbnN0IG1vID0gdGhpcy5faW5saW5lRWRpdFByZXBhcmVOZXdNbygpO1xyXG4gICAgLy8gICAgIGNvbnN0IGZvcm1NbyA9IEJhcnNhQXBpLkNvbW1vbi5NZXJnZXIuRmFzdE1lcmdlKG1vLCBzZWxlY3RlZE1vLCB7IGV4dGVuZGVkRmllbGRzOiBbJ0lkLCRDYXB0aW9uJ10gfSk7XHJcbiAgICAvLyAgICAgdGhpcy5fc2V0TmV3SW5saW5lTW8oZm9ybU1vKTtcclxuICAgIC8vICAgICB0aGlzLl9zZWxlY3QoZm9ybU1vLCAtMSk7XHJcbiAgICAvLyB9XHJcbiAgICBwcm90ZWN0ZWQgX3Jlc2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0PzogTWV0YW9iamVjdERhdGFNb2RlbFtdKSB7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UucmVTZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9nZXRXaWR0aChsYWJlbDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBsYWJlbFdpdGhQYWRkaW5nID0gbWVhc3VyZVRleHQobGFiZWwpO1xyXG4gICAgICAgIGlmIChsYWJlbFdpdGhQYWRkaW5nIDwgMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChsYWJlbFdpdGhQYWRkaW5nKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2V0UGFyZW50SGVpZ2h0KCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50SGVpZ2h0ID0gZ2V0UGFyZW50SGVpZ2h0KHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX21hcENhcnRhYmxlTW8oaXRlbXM6IE1ldGFvYmplY3REYXRhTW9kZWxbXSkge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3U2V0dGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgTmFtZVNlcmlhbGl6ZU1vLCBDYXJ0YWJsZU9iamVjdE5hbWUgfSA9IHRoaXMudmlld1NldHRpbmc7XHJcbiAgICAgICAgaWYgKCFOYW1lU2VyaWFsaXplTW8gfHwgIUNhcnRhYmxlT2JqZWN0TmFtZSB8fCAhaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGMpID0+IChjW0NhcnRhYmxlT2JqZWN0TmFtZV0gPSBCYXJzYUFwaS5FeHQuZGVjb2RlKCd7JyArIGNbTmFtZVNlcmlhbGl6ZU1vXSArICd9JykpKTtcclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ub29sYmFyQ3JlYXRlTmV3SW5saW5lTW8oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lTW8oKTtcclxuICAgIH1cclxuICAgIG9uQ3JlYXRlTmV3TW8oKSB7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lTW8odHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBvbk1hbmRhdG9yeShpc01hbmRhdG9yOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnTWFuZGF0b3J5JywgaXNNYW5kYXRvcik7XHJcbiAgICB9XHJcbiAgICBvblVwZGF0ZU1vKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBjb25zdCBtb0luZGV4ID0gbW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcclxuICAgICAgICBpZiAobW9JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIG1vRGF0YUxpc3RbbW9JbmRleF0gPSBtbztcclxuICAgICAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG1vRGF0YUxpc3QpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChtb0RhdGFMaXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvbkhhc0RldGFpbHNJblJvdyh2YWx1ZTogYm9vbGVhbiwgZGV2aWNlU2l6ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaGFzRGV0YWlsc0luUm93ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fZGV2aWNlU2l6ZUNoYW5nZWQoZGV2aWNlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICBvbkVzY2FwZUtleShtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNhbmNlbElubGluZUVkaXQobW8pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2FuY2VsSW5saW5lRWRpdChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IG1vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICAgICAgaWYgKG1vSW5kZXggPCAwIHx8ICFtby4kTmV3SW5saW5lTW8pIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9DaGVja2VkQWxsKGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gbW9EYXRhTGlzdC5maWx0ZXIoKGMpID0+IGMuSWQgIT09IG1vLklkKTtcclxuICAgICAgICB0aGlzLl9yZXNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9jcmVhdGVOZXdJbmxpbmVNbyhzZXRDaGFuZ2VkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xyXG4gICAgICAgIGNvbnN0IGV4aXN0SW5saW5lTW8gPSBtb0RhdGFMaXN0LmZpbmQoKGMpID0+IGMuJE5ld0lubGluZU1vKTtcclxuICAgICAgICBpZiAoZXhpc3RJbmxpbmVNbykge1xyXG4gICAgICAgICAgICB0aGlzLl9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChleGlzdElubGluZU1vKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW8gPSB0aGlzLl9pbmxpbmVSZXBvcnRDcmVhdGVOZXdNbyh0cnVlKTtcclxuICAgICAgICBpZiAoc2V0Q2hhbmdlZCkge1xyXG4gICAgICAgICAgICBtby4kSW5saW5lTW9DaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IChjLiRJc0NoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgICAgIHRoaXMuX2FkZElubGluZU1vVG9Nb2RhdGFMaXN0KG1vLCB0cnVlKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2lubGluZVJlcG9ydENyZWF0ZU5ld01vKGlzQ2hlY2tlZDogYm9vbGVhbik6IE1ldGFvYmplY3REYXRhTW9kZWwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91bHZNYWluU2VydmljZS5jcmVhdGVOZXdJbmxpbmVNbyhpc0NoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5saW5lRm9ybVBhbmVsVmFsdWVDaGFuZ2UobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xyXG4gICAgICAgIGNvbnN0IGV4aXN0TW9JbmRleCA9IG5ld01vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0TW9JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNJbmRleCA9IG5ld01vRGF0YUxpc3RbZXhpc3RNb0luZGV4XS4kU3R5bGVJbmRleDtcclxuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdE1vSW5kZXhdID0gQmFyc2FBcGkuQ29tbW9uLk1ldGFPYmplY3RXZWIuQ3JlYXRlTW8obW8pO1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0W2V4aXN0TW9JbmRleF0uJFN0eWxlSW5kZXggPSBzSW5kZXg7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBpZiAoIW1vLiROZXdJbmxpbmVNbykge1xyXG4gICAgICAgICAgICAvLyBzZWxlY3QgbmV4dCByZWNvcmRcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSAmJiBleGlzdHNJbmRleCArIDEgPCBuZXdNb0RhdGFMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleCArIDFdLiRJc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvd0NoZWNrKG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXggKyAxXSwgZXhpc3RzSW5kZXggKyAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fYWNjZXNzLkFkZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkSW5saW5lTW9Ub01vZGF0YUxpc3QodGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8odHJ1ZSksIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVOZXdJbmxpbmVNbygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfaW5saW5lRWRpdFNhdmVGb3JtUGFuZWwobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xyXG4gICAgICAgIGlmICghbW8uJE5ld0lubGluZU1vKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgIGlmIChleGlzdHNJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXhdID0gbW87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbkFkZCA9IHRoaXMuX2FjY2Vzcy5BZGQ7XHJcbiAgICAgICAgaWYgKCFjYW5BZGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV3TW9EYXRhTGlzdC5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGMuJElzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl91bHZNYWluU2VydmljZS5jcmVhdGVOZXdJbmxpbmVNbygpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZXREZWZhdWx0QWNjZXNzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FjY2VzcyA9IHtcclxuICAgICAgICAgICAgQWRkOiBmYWxzZSxcclxuICAgICAgICAgICAgQWRkVG9MaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgRGVsZXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgRWRpdDogZmFsc2UsXHJcbiAgICAgICAgICAgIEV4cG9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgIFByaW50OiBmYWxzZSxcclxuICAgICAgICAgICAgUmVmcmVzaDogZmFsc2UsXHJcbiAgICAgICAgICAgIFJlbW92ZUZyb21MaXN0OiBmYWxzZSxcclxuICAgICAgICAgICAgVmlldzogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9leHBhbmRNbyhzZWxlY3RlZE1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBleHBhbmQpOiB2b2lkIHtcclxuICAgICAgICBzZWxlY3RlZE1vLiRFeHBhbmRlZCA9IGV4cGFuZDtcclxuICAgICAgICBzZWxlY3RlZE1vLiRDaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZXhwYW5kTW8oY2hpbGQsIGV4cGFuZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2luZGV4T2ZJZChpZCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBpZCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2luZGV4T2ZNbyhtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2luZGV4T2ZTZWxlY3RlZCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy4kSXNDaGVja2VkKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZ2V0SW5kZXgobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX3NldElubGluZUVkaXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5zZXRJbmxpbmVFZGl0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfcmVhZFZpZXdTZXR0aW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld1NldHRpbmcgPSB0aGlzLmNvbnRleHQuU2V0dGluZy5DbGFzc05hbWVzLkN1c3RvbVVpPy5QYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG4gICAgLy8gcHJvdGVjdGVkIF9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcclxuICAgIC8vICAgICBzdXBlci5fbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNoZWNrZWRNb0luZGV4ID0gbW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoY2hlY2tlZE1vSW5kZXggPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY2hlY2tlZE1vID0gbW9EYXRhTGlzdFtjaGVja2VkTW9JbmRleF07XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2hlY2tlZE1vLklkICE9PSB0aGlzLmZvcm1QYW5lbEN0cmxyLk1vLklkKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdG9yRGVzdHJveUZvcm1QYW5lbEN0cmxyKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdENyZWF0ZUZvcm1QYW5lbEN0cmxyKGNoZWNrZWRNbywgY2hlY2tlZE1vSW5kZXgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0VmlzaWJpbGl0eShcclxuICAgICAgICBleHBhbmQ6IGJvb2xlYW4sXHJcbiAgICAgICAgbW86IGFueSAvL01ldGFvYmplY3REYXRhTW9kZWxcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIG1vLiRDaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQuJFZpc2liaWxpdHkgPSBleHBhbmQ7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC4kQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHkoZXhwYW5kLCBjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcm90ZWN0ZWQgX3NldE5ld0lubGluZU1vKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnNldE5ld0lubGluZU1vKG1vKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHByb3RlY3RlZCBfaW5saW5lRWRpdFByZXBhcmVOZXdNbygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgIC8vIGNvbnN0IG5ld01vID0gZ2V0TmV3TW9HcmlkRWRpdG9yKHRoaXMuZm9ybVNldHRpbmcsIHRoaXMuX3R5cGVEZWZJZCk7XHJcbiAgICAvLyBuZXdNby5JZCA9IGdldFVuaXF1ZUlkKDMpO1xyXG4gICAgLy8gaWYgKHRoaXMuX2lzQ29tcG9zaXRlKCkpIHtcclxuICAgIC8vICAgICBjb25zdCByZWxhdGlvbiA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMuY29udGV4dC5TZXR0aW5nLCAnRXh0cmEuUmVsYXRpb24nKTtcclxuICAgIC8vICAgICBuZXdNb1tyZWxhdGlvbi5QYXJlbnRGZE5hbWVdID0gcmVsYXRpb24uUGFyZW50TW9JZDtcclxuICAgIC8vIH1cclxuICAgIC8vICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gWy4uLnRoaXMubW9EYXRhTGlzdCwgbmV3TW8gYXMgTWV0YW9iamVjdERhdGFNb2RlbF07XHJcbiAgICAvLyAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAvLyBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLmZpcmVFdmVudChcclxuICAgIC8vICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5FdmVudEVudW0uR2xvYmFsUmVwb3J0TW9BZGQsXHJcbiAgICAvLyAgIHRoaXMuY29udGV4dCxcclxuICAgIC8vICAgcmVwb3J0RXZlbnRNb0FkZFxyXG4gICAgLy8gKTtcclxuICAgIC8vICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1JlZnJlc2hDb250ZXh0TW9EYXRhTGlzdCcsIG5ld01vRGF0YUxpc3QpO1xyXG4gICAgLy8gICAgcmV0dXJuIG5ld01vIGFzIE1ldGFvYmplY3REYXRhTW9kZWw7XHJcbiAgICAvLyB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZElubGluZU1vVG9Nb2RhdGFMaXN0KG5ld0lubGluZU1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSBbLi4udGhpcy5tb0RhdGFMaXN0LCB7IC4uLm5ld0lubGluZU1vLCAkSXNDaGVja2VkOiBzZWxlY3QgfV07XHJcbiAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaENvbnRleHRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcm93Q2hlY2sobW86IE1ldGFvYmplY3REYXRhTW9kZWwsIGluZGV4OiBudW1iZXIsIHNlbGVjdGVkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlZGl0TW9kZSA9IHRoaXMuX2lubGluZUVkaXRNb2RlICYmIHRoaXMuX2FsbG93SW5saW5lRWRpdDtcclxuICAgICAgICBpZiAobW8uJElzQ2hlY2tlZCAmJiAhdGhpcy5pc0NoZWNrTGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZWxlY3Rpb25Nb2RlO1xyXG4gICAgICAgIGlmIChlZGl0TW9kZSkge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5TSU5HTEU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSAhbW8uJElzQ2hlY2tlZCB8fCBzZWxlY3RlZDtcclxuICAgICAgICB0aGlzLnJvd0hvdmVyYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb25Nb2RlID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScgJiYgY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9DaGVja2VkQWxsKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXROZXdJbmxpbmVNbyhudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3QobW8sIGluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFRPRE9cclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuX3NldFZhbHVlSW5saW5lTW8obW8pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgdGhpcy5fZGVzZWxlY3QobW8sIGluZGV4KTtcclxuICAgIH1cclxuICAgIC8vIHByb3RlY3RlZCBfc2V0VmFsdWVJbmxpbmVNbyhtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIHRoaXMuZm9ybVBhbmVsQ3RybHIuU2V0VmFsdWUoeyAuLi5tbywgJFR5cGVEZWZJZDogdGhpcy5fdHlwZURlZklkIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5saW5lRWRpdG9yRGVzdHJveUZvcm1QYW5lbEN0cmxyKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmZvcm1QYW5lbEN0cmxyKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2Zvcm1QYW5lbFNlcnZpY2UuZGVzdHJveSgpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmZvcm1QYW5lbEN0cmxyLkRlc3Ryb3koKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5mb3JtUGFuZWxDdHJsciA9IG51bGw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF93aW5kb3dSZXNpemVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldENvbnRhaW5lcldpZHRoKCk7XHJcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50SGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2V0Q29udGFpbmVyV2lkdGgoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aFNvdXJjZSQubmV4dChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZXZpY2VTaXplQ2hhbmdlZChkZXZpY2VTaXplKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWxOYXRpdmVFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmxpbmVFZGl0TW9kZSB8fCBkZXZpY2VTaXplID09PSAnbCcgfHwgZGV2aWNlU2l6ZSA9PT0gJ3hsJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UubmV4dChbXSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGdyaWRTaXplID0gZ2V0Q29udHJvbFNpemVNb2RlKGVsTmF0aXZlRWxlbWVudCwgZGV2aWNlU2l6ZSk7XHJcbiAgICAgICAgbGV0IGRldmljZU5hbWU6IERldmljZVNpemUgPSAnZGVza3RvcCc7XHJcbiAgICAgICAgdGhpcy5hbGxDb2x1bW5zXHJcbiAgICAgICAgICAgID8uZmlsdGVyKChjKSA9PiAhYy5IaWRkZW4pXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChjKSA9PiAoYy4kVGV4dFdpZHRoID0gYy4kVGV4dFdpZHRoID8gYy4kVGV4dFdpZHRoIDogdGhpcy5fZ2V0V2lkdGgoYy5BbGlhcykgKyAxMCkpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxDb2x1bW5zV2lkdGggPSB0aGlzLmFsbENvbHVtbnMubWFwKChjb2x1bW4pID0+XHJcbiAgICAgICAgICAgIGNvbHVtbi4kVGV4dFdpZHRoICYmIGNvbHVtbi5XaWR0aCA+IGNvbHVtbi4kVGV4dFdpZHRoID8gY29sdW1uLldpZHRoIDogY29sdW1uLiRUZXh0V2lkdGggfHwgY29sdW1uLldpZHRoXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1uczogUmVwb3J0Vmlld0NvbHVtbltdID0gdGhpcy5fdmlzaWJsZUNvbHVtbnNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAodmlzaWJsZUNvbHVtbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc1NvdXJjZS5uZXh0KFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbHVtbnNDb3VudCA9IHZpc2libGVDb2x1bW5zLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBncmlkU2V0dGluZ3MgPSB0aGlzLmdyaWRTZXR0aW5nU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZENvbHVtbnMgPSBncmlkU2V0dGluZ3MuU29ydFNldHRpbmdMaXN0LmZpbHRlcigoZCkgPT4gZC5Jc0dyb3VwZWQpO1xyXG4gICAgICAgIGNvbnN0IG5hbWVHcm91cGVkQ29sdW1ucyA9IGdyb3VwZWRDb2x1bW5zLm1hcCgoYykgPT4gYy5OYW1lKTtcclxuICAgICAgICBjb25zdCBjb2xXaWR0aFNldHRpbmdzID0gZ3JpZFNldHRpbmdzPy5Db2xTZXR0aW5nTGlzdD8uZmlsdGVyKFxyXG4gICAgICAgICAgICAoYykgPT4gbmFtZUdyb3VwZWRDb2x1bW5zLmluZGV4T2YoYy5OYW1lKSA9PT0gLTFcclxuICAgICAgICApLm1hcCgoYykgPT4gYy5XaWR0aCk7XHJcbiAgICAgICAgY29uc3QgY29sdW1uc1dpZHRoOiBudW1iZXJbXSA9IGNvbFdpZHRoU2V0dGluZ3M/Lmxlbmd0aCA/IGNvbFdpZHRoU2V0dGluZ3MgOiBhbGxDb2x1bW5zV2lkdGg7XHJcbiAgICAgICAgbGV0IHN1bUNvbFdpZHRoID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LlZpZXdTZXR0aW5nPy5Jc0NoZWNrTGlzdCkge1xyXG4gICAgICAgICAgICBzdW1Db2xXaWR0aCArPSAxNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5TZXR0aW5nPy5FeHRyYT8uRGVmYXVsdENvbW1hbmRzQWNjZXNzPy5WaWV3KSB7XHJcbiAgICAgICAgICAgIHN1bUNvbFdpZHRoICs9IDMyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5oYXNEZXRhaWxzSW5Sb3cpIHtcclxuICAgICAgICAgICAgc3VtQ29sV2lkdGggKz0gMjEwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGVsTmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICBzd2l0Y2ggKGdyaWRTaXplKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2wnOlxyXG4gICAgICAgICAgICBjYXNlICd4bCc6XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VOYW1lID0gJ2Rlc2t0b3AnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxyXG4gICAgICAgICAgICAgICAgZGV2aWNlTmFtZSA9ICdtb2JpbGUnO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uc0NvdW50ID0gMjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtJzpcclxuICAgICAgICAgICAgICAgIGRldmljZU5hbWUgPSAndGFibGV0JztcclxuICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IDQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGV2aWNlTmFtZVNvdXJjZS5uZXh0KGRldmljZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uc1dpZHRoLmxlbmd0aCA+IDAgJiYgY29udGFpbmVyV2lkdGggPiAwICYmIGRldmljZVNpemUgIT09ICdzJykge1xyXG4gICAgICAgICAgICBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbHVtbnNXaWR0aC5mb3JFYWNoKCh3aWR0aDogbnVtYmVyLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1bUNvbFdpZHRoICsgd2lkdGggPiBjb250YWluZXJXaWR0aCAmJiBjb2x1bW5zQ291bnQgPT09IHZpc2libGVDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc3VtQ29sV2lkdGggKz0gd2lkdGg7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZWNDb2x1bW5zID0gdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNEaXNhYmxlUmVzcG9uc2l2ZUluRGVza3RvcCgpIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0Rpc2FibGVSZXNwb25zaXZlSW5Nb2JpbGUoKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNEaXNhYmxlUmVzcG9uc2l2ZUluVGFibGV0KClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VjQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UubmV4dChbXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbHVtbnNDb3VudCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc1NvdXJjZS5uZXh0KHZpc2libGVDb2x1bW5zLnNsaWNlKGNvbHVtbnNDb3VudCwgdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pc0Rpc2FibGVSZXNwb25zaXZlSW5EZXNrdG9wKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGlzRGVza3RvcCA9IGdldERldmljZUlzRGVza3RvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTZXR0aW5nPy5EaXNhYmxlUmVzcG9uc2l2ZUluRGVza3RvcCAmJiBpc0Rlc2t0b3A7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2lzRGlzYWJsZVJlc3BvbnNpdmVJblRhYmxldCgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBpc1RhYmxldCA9IGdldERldmljZUlzVGFibGV0KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1NldHRpbmc/LkRpc2FibGVSZXNwb25zaXZlSW5UYWJsZXQgJiYgaXNUYWJsZXQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2lzRGlzYWJsZVJlc3BvbnNpdmVJbk1vYmlsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBpc01vYmlsZSA9IGdldERldmljZUlzTW9iaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1NldHRpbmc/LkRpc2FibGVSZXNwb25zaXZlSW5Nb2JpbGUgJiYgaXNNb2JpbGU7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX29wZW5TZXR0aW5ncyhuYW1lLCBkZXZpY2U6IERldmljZVNpemUpOiB2b2lkIHtcclxuICAgICAgICBsZXQgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPGFueT4gfCBudWxsID0gbnVsbDtcclxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcclxuICAgICAgICAgICAgY2FzZSAnY29sdW1ucyc6XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBVbHZDb2x1bW5TZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzb3J0JzpcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdlNvcnRTZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdncm91cGJ5JzpcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdkdyb3VwYnlTZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5kaWFsb2dDb25maWcsXHJcbiAgICAgICAgICAgIGRhdGE6IHsgY29udGV4dDogdGhpcy5jb250ZXh0IH0sXHJcbiAgICAgICAgICAgIG1vYmlsZTogZGV2aWNlID09PSAnbW9iaWxlJyxcclxuICAgICAgICAgICAgbWluV2lkdGg6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnYXV0bycgOiB0aGlzLmRpYWxvZ0NvbmZpZy5taW5XaWR0aCxcclxuICAgICAgICAgICAgbWluSGVpZ2h0OiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluSGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnMTAwJScgOiB0aGlzLmRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQsXHJcbiAgICAgICAgICAgIG1heFdpZHRoOiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJzEwMCUnIDogdGhpcy5kaWFsb2dDb25maWcubWF4V2lkdGhcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChjb21wb25lbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGNvbXBvbmVudCwgY29uZmlnKTtcclxuICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKHNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNTb3J0Q2hhbmdlZCA9IG5hbWUgPT09ICdzb3J0JyB8fCBuYW1lID09PSAnZ3JvdXBieSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVHcmlkU2V0dGluZyhzZXR0aW5nLCBpc1NvcnRDaGFuZ2VkKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQubW9EYXRhTGlzdCA9IHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlRGVmSWQgPSB0aGlzLl90eXBlRGVmSWQ7XHJcbiAgICAgICAgY29uc3QgY29udHJvbHNJbmZvJCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxvYWRNZXRhQ29uZGl0aW9uc0NvbnRyb2xJbmZvcyhcclxuICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMubWFwKChjKSA9PiBjLk5hbWUpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sc0luZm8kLFxyXG4gICAgICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzZWxlY3RlZENvbHVtbi5OYW1lLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3BlbihVbHZGaWx0ZXJTZXR0aW5nc0NvbXBvbmVudCwgY29uZmlnKTtcclxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZFNvcnRDb2x1bW4obmFtZTogYW55LCBzb3J0RGlyZWN0aW9uOiBzdHJpbmcsIGlzR3JvdXBlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSB7XHJcbiAgICAgICAgICAgIE5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgIFNvcnREaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXHJcbiAgICAgICAgICAgIElzR3JvdXBlZDogaXNHcm91cGVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldEdyaWRTZXR0aW5ncyh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0U29ydEl0ZW1JbmRleCA9IHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuTmFtZSA9PT0gbmFtZSk7XHJcbiAgICAgICAgaWYgKGV4aXN0U29ydEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdCA9IFtzb3J0SXRlbSwgLi4uc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0XTtcclxuICAgICAgICAgICAgc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0LnNwbGljZShleGlzdFNvcnRJdGVtSW5kZXggKyAxLCAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5Tb3J0U2V0dGluZ0xpc3QucHVzaChzb3J0SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZFNldHRpbmcoc2V0dGluZ3MsIHRydWUpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==