barsa-sap-ui 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/fesm2022/barsa-sap-ui.mjs +419 -367
  2. package/fesm2022/barsa-sap-ui.mjs.map +1 -1
  3. package/lib/barsa-bar-download-file/barsa-bar-download-file.component.d.ts +10 -0
  4. package/lib/barsa-sap-ui.module.d.ts +237 -236
  5. package/lib/file-viewer-popover/file-viewer-popover.component.d.ts +1 -1
  6. package/lib/ui-map/ui-map.component.d.ts +2 -0
  7. package/package.json +3 -5
  8. package/public-api.d.ts +1 -0
  9. package/esm2022/barsa-sap-ui.mjs +0 -5
  10. package/esm2022/lib/apply-conditional-formmatings.directive.mjs +0 -89
  11. package/esm2022/lib/avatar-size.pipe.mjs +0 -40
  12. package/esm2022/lib/barsa-answer-card/barsa-answer-card.component.mjs +0 -41
  13. package/esm2022/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +0 -145
  14. package/esm2022/lib/barsa-bar-panel/barsa-bar-panel.component.mjs +0 -23
  15. package/esm2022/lib/barsa-base-panel/barsa-base-layout-panel.component.mjs +0 -29
  16. package/esm2022/lib/barsa-breadcrumbs/barsa-breadcrumbs.component.mjs +0 -24
  17. package/esm2022/lib/barsa-card-layout-panel/barsa-card-layout-panel.component.mjs +0 -24
  18. package/esm2022/lib/barsa-card-row-payam/barsa-card-row-payam.component.mjs +0 -31
  19. package/esm2022/lib/barsa-cartable-form/barsa-cartable-form.component.mjs +0 -41
  20. package/esm2022/lib/barsa-cartable-template/barsa-cartable-template.component.mjs +0 -24
  21. package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +0 -242
  22. package/esm2022/lib/barsa-chat/chat.model.mjs +0 -8
  23. package/esm2022/lib/barsa-chat-content/barsa-chat-content.component.mjs +0 -13
  24. package/esm2022/lib/barsa-chat-content-toolbar/barsa-chat-content-toolbar.component.mjs +0 -22
  25. package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +0 -66
  26. package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +0 -78
  27. package/esm2022/lib/barsa-chat-thread/barsa-chat-thread.component.mjs +0 -22
  28. package/esm2022/lib/barsa-chat-threads-list/barsa-chat-threads-list.component.mjs +0 -13
  29. package/esm2022/lib/barsa-chat-threads-list-toolbar/barsa-chat-threads-list-toolbar.component.mjs +0 -15
  30. package/esm2022/lib/barsa-chip/barsa-chip.component.mjs +0 -72
  31. package/esm2022/lib/barsa-column-indicator/barsa-column-indicator.component.mjs +0 -23
  32. package/esm2022/lib/barsa-column-rownumber/barsa-column-rownumber.component.mjs +0 -14
  33. package/esm2022/lib/barsa-custom-inline-edit/barsa-custom-inline-edit.component.mjs +0 -14
  34. package/esm2022/lib/barsa-custom-inline-edit-row/barsa-custom-inline-edit-row.component.mjs +0 -26
  35. package/esm2022/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +0 -71
  36. package/esm2022/lib/barsa-dynamic-field/barsa-dynamic-field.component.mjs +0 -40
  37. package/esm2022/lib/barsa-enum-menu-button/barsa-enum-menu-button.component.mjs +0 -61
  38. package/esm2022/lib/barsa-field-key-value/barsa-field-key-value.component.mjs +0 -45
  39. package/esm2022/lib/barsa-form-side-content/barsa-form-side-content.component.mjs +0 -58
  40. package/esm2022/lib/barsa-grid-layout-panel/barsa-grid-layout-panel.component.mjs +0 -27
  41. package/esm2022/lib/barsa-group-cartable/barsa-cartable-group.component.mjs +0 -94
  42. package/esm2022/lib/barsa-horizontal-flex-panel/barsa-horizontal-flex-panel.component.mjs +0 -22
  43. package/esm2022/lib/barsa-linkable-items-panel/barsa-linkable-items-panel.component.mjs +0 -37
  44. package/esm2022/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +0 -41
  45. package/esm2022/lib/barsa-list-file-linear-gmail/barsa-list-file-linear-gmail.component.mjs +0 -29
  46. package/esm2022/lib/barsa-list-layout-panel/barsa-list-layout-panel.component.mjs +0 -23
  47. package/esm2022/lib/barsa-modal/barsa-modal.component.mjs +0 -43
  48. package/esm2022/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +0 -83
  49. package/esm2022/lib/barsa-network-offline/barsa-network-offline.component.mjs +0 -57
  50. package/esm2022/lib/barsa-pishnamayesh-payam/barsa-pishnamayesh-payam.component.mjs +0 -159
  51. package/esm2022/lib/barsa-question-answer-comments-section/barsa-question-answer-comments-section.component.mjs +0 -17
  52. package/esm2022/lib/barsa-question-answer-content-actions-section/barsa-question-answer-content-actions-section.component.mjs +0 -30
  53. package/esm2022/lib/barsa-question-answer-creator-time-section/barsa-question-answer-creator-time-section.component.mjs +0 -14
  54. package/esm2022/lib/barsa-question-answer-form/barsa-question-answer-form.component.mjs +0 -34
  55. package/esm2022/lib/barsa-question-answer-form-add-comment/barsa-question-answer-form-add-comment.component.mjs +0 -46
  56. package/esm2022/lib/barsa-question-answer-vote-section/barsa-question-answer-vote-section.component.mjs +0 -79
  57. package/esm2022/lib/barsa-question-post/barsa-question-post.component.mjs +0 -30
  58. package/esm2022/lib/barsa-report-card-flex-view/barsa-report-card-flex-view.component.mjs +0 -31
  59. package/esm2022/lib/barsa-report-checkbox-switch-button/barsa-report-checkbox-switch-button.component.mjs +0 -28
  60. package/esm2022/lib/barsa-report-one-of-list/barsa-report-one-of-list.component.mjs +0 -102
  61. package/esm2022/lib/barsa-row-inline-actionlist/barsa-row-inline-actionlist.component.mjs +0 -26
  62. package/esm2022/lib/barsa-sap-ui-routing.module.mjs +0 -18
  63. package/esm2022/lib/barsa-sap-ui.module.mjs +0 -374
  64. package/esm2022/lib/barsa-search-form/barsa-search-form.component.mjs +0 -29
  65. package/esm2022/lib/barsa-simple-form/barsa-simple-form.component.mjs +0 -170
  66. package/esm2022/lib/barsa-tab-route-manager/barsa-tab-route-manager.component.mjs +0 -18
  67. package/esm2022/lib/barsa-table-column/barsa-table-column.component.mjs +0 -29
  68. package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +0 -222
  69. package/esm2022/lib/barsa-table-row/barsa-table-row.component.mjs +0 -87
  70. package/esm2022/lib/barsa-tag-categories/barsa-tag-categories.component.mjs +0 -60
  71. package/esm2022/lib/barsa-tag-chip/barsa-tag-chip.component.mjs +0 -26
  72. package/esm2022/lib/barsa-tags-category-row/barsa-tags-category-row.component.mjs +0 -23
  73. package/esm2022/lib/barsa-text-ellipsis/barsa-text-ellipsis.component.mjs +0 -37
  74. package/esm2022/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +0 -418
  75. package/esm2022/lib/barsa-toolbaritem-search/barsa-toolbaritem-search.component.mjs +0 -36
  76. package/esm2022/lib/barsa-tree-item/barsa-tree-item.component.mjs +0 -153
  77. package/esm2022/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +0 -19
  78. package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +0 -216
  79. package/esm2022/lib/blob-viewer/blob-viewer.component.mjs +0 -74
  80. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -50
  81. package/esm2022/lib/captcha-field/captcha-field.component.mjs +0 -28
  82. package/esm2022/lib/card-item/card-item.component.mjs +0 -64
  83. package/esm2022/lib/card-view-content/card-view-content.component.mjs +0 -46
  84. package/esm2022/lib/col-renderer.directive.mjs +0 -46
  85. package/esm2022/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +0 -56
  86. package/esm2022/lib/column-matrix-renderer/matrix-value.pipe.mjs +0 -60
  87. package/esm2022/lib/column-renderer/column-renderer.component.mjs +0 -88
  88. package/esm2022/lib/constants.mjs +0 -425
  89. package/esm2022/lib/custom-date-time/custom-date-time.component.mjs +0 -41
  90. package/esm2022/lib/device-info-field-base.mjs +0 -23
  91. package/esm2022/lib/dialog-handler.directive.mjs +0 -28
  92. package/esm2022/lib/download-files.directive.mjs +0 -33
  93. package/esm2022/lib/dynamic-page-size.pipe.mjs +0 -26
  94. package/esm2022/lib/file-in-dialog/file-in-dialog.component.mjs +0 -44
  95. package/esm2022/lib/file-viewer/file-viewer.component.mjs +0 -47
  96. package/esm2022/lib/file-viewer-content/file-viewer-content.component.mjs +0 -71
  97. package/esm2022/lib/file-viewer-popover/file-viewer-popover.component.mjs +0 -39
  98. package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -171
  99. package/esm2022/lib/form-dialog-less/form-dialog-less.component.mjs +0 -50
  100. package/esm2022/lib/form-toolbar/form-toolbar.component.mjs +0 -62
  101. package/esm2022/lib/form-toolbar-button/form-toolbar-button.component.mjs +0 -45
  102. package/esm2022/lib/form-wizard/form-wizard.component.mjs +0 -21
  103. package/esm2022/lib/fullscreen-dialog.directive.mjs +0 -59
  104. package/esm2022/lib/fullscreen-files.directive.mjs +0 -42
  105. package/esm2022/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +0 -213
  106. package/esm2022/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +0 -215
  107. package/esm2022/lib/global-search/global-search.component.mjs +0 -27
  108. package/esm2022/lib/global-search-module/global-search-module.component.mjs +0 -29
  109. package/esm2022/lib/global-search-panel/global-search-panel.component.mjs +0 -25
  110. package/esm2022/lib/header-avatar/header-avatar.component.mjs +0 -18
  111. package/esm2022/lib/htree-create-new/htree-create-new.component.mjs +0 -48
  112. package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -23
  113. package/esm2022/lib/index.mjs +0 -543
  114. package/esm2022/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +0 -32
  115. package/esm2022/lib/layout-actions/layout-actions.component.mjs +0 -70
  116. package/esm2022/lib/layout-control/layout-control.component.mjs +0 -302
  117. package/esm2022/lib/layout-wizard/layout-wizard.component.mjs +0 -183
  118. package/esm2022/lib/list-item/list-item.component.mjs +0 -34
  119. package/esm2022/lib/ly-empty-space/ly-empty-space.component.mjs +0 -42
  120. package/esm2022/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +0 -82
  121. package/esm2022/lib/ly-label/ly-label.component.mjs +0 -37
  122. package/esm2022/lib/ly-layout-container/ly-layout-container.component.mjs +0 -83
  123. package/esm2022/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +0 -17
  124. package/esm2022/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +0 -24
  125. package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +0 -83
  126. package/esm2022/lib/ly-line/ly-line.component.mjs +0 -56
  127. package/esm2022/lib/ly-simple-label/ly-simple-label.component.mjs +0 -22
  128. package/esm2022/lib/ly-tab-container/ly-tab-container.component.mjs +0 -45
  129. package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +0 -44
  130. package/esm2022/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +0 -51
  131. package/esm2022/lib/manage-filters-report/manage-filters-report.component.mjs +0 -43
  132. package/esm2022/lib/mask/mask.component.mjs +0 -22
  133. package/esm2022/lib/message-strip/message-strip.component.mjs +0 -28
  134. package/esm2022/lib/models/grid-data-provider.mjs +0 -114
  135. package/esm2022/lib/models/grid-view.mjs +0 -2
  136. package/esm2022/lib/models/index.mjs +0 -2
  137. package/esm2022/lib/no-data/no-data.component.mjs +0 -31
  138. package/esm2022/lib/notification-item/notification-item.component.mjs +0 -57
  139. package/esm2022/lib/notification-popup.service.mjs +0 -92
  140. package/esm2022/lib/object-status-icon.pipe.mjs +0 -26
  141. package/esm2022/lib/progress-indicator/progress-indicator.component.mjs +0 -18
  142. package/esm2022/lib/report-navigator/report-navigator.component.mjs +0 -68
  143. package/esm2022/lib/report-new-top-form/report-new-top-form.component.mjs +0 -60
  144. package/esm2022/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +0 -35
  145. package/esm2022/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +0 -97
  146. package/esm2022/lib/report-search-panel-save/report-search-panel-save.component.mjs +0 -88
  147. package/esm2022/lib/report-tree-base.mjs +0 -386
  148. package/esm2022/lib/report-view-renderer.directive.mjs +0 -385
  149. package/esm2022/lib/responsive-toolbar/responsive-toolbar.component.mjs +0 -50
  150. package/esm2022/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +0 -84
  151. package/esm2022/lib/rich-text-static/rich-text-static.component.mjs +0 -72
  152. package/esm2022/lib/sap-font-class.pipe.mjs +0 -29
  153. package/esm2022/lib/sap-font.pipe.mjs +0 -29
  154. package/esm2022/lib/sap-size.pipe.mjs +0 -27
  155. package/esm2022/lib/sap-ui-report-base.component.mjs +0 -805
  156. package/esm2022/lib/search-panel/search-panel.component.mjs +0 -63
  157. package/esm2022/lib/static-text/static-text.component.mjs +0 -15
  158. package/esm2022/lib/table-th.directive.mjs +0 -86
  159. package/esm2022/lib/title/title.component.mjs +0 -15
  160. package/esm2022/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +0 -34
  161. package/esm2022/lib/ui-bpmn-viewer/ui-bpmn-viewer.component.mjs +0 -33
  162. package/esm2022/lib/ui-button/ui-button.component.mjs +0 -32
  163. package/esm2022/lib/ui-calendar/ui-calendar.component.mjs +0 -53
  164. package/esm2022/lib/ui-card-view/ui-card-view.component.mjs +0 -57
  165. package/esm2022/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +0 -42
  166. package/esm2022/lib/ui-check-box/ui-check-box.component.mjs +0 -39
  167. package/esm2022/lib/ui-color-ui/ui-color-ui.component.mjs +0 -50
  168. package/esm2022/lib/ui-container-with-button/ui-container-with-button.component.mjs +0 -38
  169. package/esm2022/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +0 -191
  170. package/esm2022/lib/ui-date-time/ui-date-time.component.mjs +0 -150
  171. package/esm2022/lib/ui-editable-grid/ui-editable-grid.component.mjs +0 -110
  172. package/esm2022/lib/ui-exception-form/ui-exception-form.component.mjs +0 -53
  173. package/esm2022/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +0 -121
  174. package/esm2022/lib/ui-form-panel/ui-form-panel.component.mjs +0 -100
  175. package/esm2022/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +0 -32
  176. package/esm2022/lib/ui-graph/ui-graph.component.mjs +0 -17
  177. package/esm2022/lib/ui-grid/ui-grid.component.mjs +0 -25
  178. package/esm2022/lib/ui-grid-columns/ui-grid-columns.component.mjs +0 -43
  179. package/esm2022/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +0 -66
  180. package/esm2022/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +0 -75
  181. package/esm2022/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +0 -58
  182. package/esm2022/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +0 -123
  183. package/esm2022/lib/ui-html-viewer/ui-html-viewer.component.mjs +0 -16
  184. package/esm2022/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +0 -11
  185. package/esm2022/lib/ui-label/ui-label.component.mjs +0 -12
  186. package/esm2022/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +0 -379
  187. package/esm2022/lib/ui-list-view/ui-list-view.component.mjs +0 -84
  188. package/esm2022/lib/ui-map/ui-map.component.mjs +0 -58
  189. package/esm2022/lib/ui-matrix-view/ui-matrix-view.component.mjs +0 -124
  190. package/esm2022/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +0 -19
  191. package/esm2022/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +0 -14
  192. package/esm2022/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +0 -55
  193. package/esm2022/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +0 -429
  194. package/esm2022/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +0 -28
  195. package/esm2022/lib/ui-multi-select-card/ui-multi-select-card.component.mjs +0 -37
  196. package/esm2022/lib/ui-multi-select-checkbox/ui-multi-select-checkbox.component.mjs +0 -59
  197. package/esm2022/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +0 -93
  198. package/esm2022/lib/ui-multi-select-radio/ui-multi-select-radio.component.mjs +0 -36
  199. package/esm2022/lib/ui-multi-select-slider/ui-multi-select-slider.component.mjs +0 -56
  200. package/esm2022/lib/ui-multi-select-smile/ui-multi-select-smile.component.mjs +0 -28
  201. package/esm2022/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +0 -33
  202. package/esm2022/lib/ui-num-int-slider/ui-num-int-slider.component.mjs +0 -27
  203. package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +0 -21
  204. package/esm2022/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +0 -268
  205. package/esm2022/lib/ui-picture-file/ui-picture-file.component.mjs +0 -101
  206. package/esm2022/lib/ui-pictures-info/ui-pictures-info.component.mjs +0 -261
  207. package/esm2022/lib/ui-radio-group/ui-radio-group.component.mjs +0 -48
  208. package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +0 -36
  209. package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +0 -46
  210. package/esm2022/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +0 -24
  211. package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +0 -55
  212. package/esm2022/lib/ui-single-picture/ui-single-picture.component.mjs +0 -36
  213. package/esm2022/lib/ui-switch-button/ui-switch-button.component.mjs +0 -20
  214. package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +0 -289
  215. package/esm2022/lib/ui-text-area/ui-text-area.component.mjs +0 -49
  216. package/esm2022/lib/ui-text-field/ui-text-field.component.mjs +0 -52
  217. package/esm2022/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +0 -48
  218. package/esm2022/lib/ui-time-span/ui-time-span.component.mjs +0 -24
  219. package/esm2022/lib/ui-tinymce/ui-tinymce.component.mjs +0 -53
  220. package/esm2022/lib/ui-tree/ui-tree.component.mjs +0 -114
  221. package/esm2022/lib/ui-tree-view/ui-tree-view.component.mjs +0 -100
  222. package/esm2022/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +0 -23
  223. package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +0 -306
  224. package/esm2022/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +0 -25
  225. package/esm2022/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +0 -93
  226. package/esm2022/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +0 -119
  227. package/esm2022/lib/ul-notify-popup/ul-notify-popup.component.mjs +0 -32
  228. package/esm2022/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +0 -48
  229. package/esm2022/lib/ulv-column-settings/ulv-column-settings.component.mjs +0 -53
  230. package/esm2022/lib/ulv-context-menu/ulv-context-menu.component.mjs +0 -114
  231. package/esm2022/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +0 -43
  232. package/esm2022/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +0 -196
  233. package/esm2022/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +0 -44
  234. package/esm2022/lib/ulv-paging/ulv-paging.component.mjs +0 -84
  235. package/esm2022/lib/ulv-selection/ulv-selection.component.mjs +0 -65
  236. package/esm2022/lib/ulv-settings/ulv-settings.component.mjs +0 -116
  237. package/esm2022/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +0 -54
  238. package/esm2022/lib/ulv-toolbar/ulv-toolbar.component.mjs +0 -174
  239. package/esm2022/lib/upload-file-status.pipe.mjs +0 -28
  240. package/esm2022/lib/util-chat-time-badge.pipe.mjs +0 -18
  241. package/esm2022/lib/util-date-to-hh-mm.pipe.mjs +0 -23
  242. package/esm2022/lib/wizard-layout.directive.mjs +0 -103
  243. package/esm2022/public-api.mjs +0 -233
@@ -1,805 +0,0 @@
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
- onListCheckboxClick($event) {
292
- const { mo, index, e } = $event;
293
- this.onRowCheck({ mo, index, cause: 'singleSelect' });
294
- e.stopPropagation();
295
- e.preventDefault();
296
- }
297
- onListNavigationClick($event) {
298
- const { mo, index, e } = $event;
299
- this.onRowClick({ mo, index });
300
- e.stopPropagation();
301
- e.preventDefault();
302
- }
303
- onSaveTopForm(mo) {
304
- const newMoDataList = this.moDataList;
305
- const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
306
- if (existsIndex > -1) {
307
- newMoDataList[existsIndex] = mo;
308
- }
309
- newMoDataList.map((c) => {
310
- c.$NewInlineMo = undefined;
311
- c.$IsChecked = false;
312
- });
313
- this._resetMoDataList(newMoDataList);
314
- this.refreshContextMoDataList(newMoDataList);
315
- }
316
- onNewTopFormAdd(mo) {
317
- this._addInlineMoToModataList(mo);
318
- }
319
- // protected _inlineEditModeChanged(editMode): void {
320
- // if (editMode) {
321
- // const canAdd: boolean = this._access?.Add !== false;
322
- // let selectedMo = this._getSelected();
323
- // let newMo;
324
- // if (canAdd !== false && !selectedMo) {
325
- // this._createNewInlineRecord();
326
- // return;
327
- // }
328
- // // if (!selectedMo && !newMo && this.moDataList.length > 0) {
329
- // // selectedMo = this.moDataList[0];
330
- // // }
331
- // // if (selectedMo) {
332
- // // const idOfSelectedMo = this._indexOfMo(selectedMo);
333
- // // selectedMo.$IsChecked = false;
334
- // // this._createNewInlineRecord(selectedMo);
335
- // // this._rowCheck(selectedMo, idOfSelectedMo);
336
- // // }
337
- // } else {
338
- // BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter = this._oldContainer;
339
- // this._setNewInlineMo(null);
340
- // }
341
- // }
342
- // protected _createNewInlineRecord(selectedMo?: MetaobjectDataModel) {
343
- // const mo = this._inlineEditPrepareNewMo();
344
- // const formMo = BarsaApi.Common.Merger.FastMerge(mo, selectedMo, { extendedFields: ['Id,$Caption'] });
345
- // this._setNewInlineMo(formMo);
346
- // this._select(formMo, -1);
347
- // }
348
- _resetMoDataList(newMoDataList) {
349
- this._ulvMainService.reSetMoDataList(newMoDataList);
350
- }
351
- _getWidth(label) {
352
- const labelWithPadding = measureText(label);
353
- if (labelWithPadding < 1) {
354
- return 0;
355
- }
356
- return Math.ceil(labelWithPadding);
357
- }
358
- _setParentHeight() {
359
- this.parentHeight = getParentHeight(this.el.nativeElement);
360
- }
361
- _mapCartableMo(items) {
362
- if (!this.viewSetting) {
363
- return items;
364
- }
365
- const { NameSerializeMo, CartableObjectName } = this.viewSetting;
366
- if (!NameSerializeMo || !CartableObjectName || !items?.length) {
367
- return items;
368
- }
369
- items.forEach((c) => (c[CartableObjectName] = BarsaApi.Ext.decode('{' + c[NameSerializeMo] + '}')));
370
- return items;
371
- }
372
- onToolbarCreateNewInlineMo() {
373
- this._createNewInlineMo();
374
- }
375
- onCreateNewMo() {
376
- this._createNewInlineMo(true);
377
- }
378
- onMandatory(isMandator) {
379
- this.context.fireEvent('Mandatory', isMandator);
380
- }
381
- onUpdateMo(mo) {
382
- const moDataList = this.moDataList;
383
- const moIndex = moDataList.findIndex((c) => c.Id === mo.Id);
384
- if (moIndex > -1) {
385
- moDataList[moIndex] = mo;
386
- this._resetMoDataList(moDataList);
387
- this.refreshContextMoDataList(moDataList);
388
- }
389
- }
390
- onHasDetailsInRow(value, deviceSize) {
391
- this.hasDetailsInRow = value;
392
- this._deviceSizeChanged(deviceSize);
393
- }
394
- onEscapeKey(mo) {
395
- this._handleCancelInlineEdit(mo);
396
- }
397
- _handleCancelInlineEdit(mo) {
398
- const moDataList = this.moDataList;
399
- const moIndex = moDataList.findIndex((c) => c.Id === mo.Id);
400
- if (moIndex < 0 || !mo.$NewInlineMo) {
401
- this._doCheckedAll(false);
402
- return;
403
- }
404
- const newMoDataList = moDataList.filter((c) => c.Id !== mo.Id);
405
- this._resetMoDataList(newMoDataList);
406
- this.refreshContextMoDataList(newMoDataList);
407
- }
408
- _createNewInlineMo(setChanged = false) {
409
- const moDataList = this.moDataList;
410
- const existInlineMo = moDataList.find((c) => c.$NewInlineMo);
411
- if (existInlineMo) {
412
- this._inlineEditSaveFormPanel(existInlineMo);
413
- }
414
- const mo = this._inlineReportCreateNewMo(true);
415
- if (setChanged) {
416
- mo.$InlineMoChanged = true;
417
- }
418
- this.moDataList.forEach((c) => (c.$IsChecked = false));
419
- this._addInlineMoToModataList(mo, true);
420
- }
421
- _inlineReportCreateNewMo(isChecked) {
422
- return this._ulvMainService.createNewInlineMo(isChecked);
423
- }
424
- _inlineFormPanelValueChange(mo) {
425
- const newMoDataList = this.moDataList;
426
- const existMoIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
427
- if (existMoIndex > -1) {
428
- const sIndex = newMoDataList[existMoIndex].$StyleIndex;
429
- newMoDataList[existMoIndex] = BarsaApi.Common.MetaObjectWeb.CreateMo(mo);
430
- newMoDataList[existMoIndex].$StyleIndex = sIndex;
431
- this._resetMoDataList(newMoDataList);
432
- this.refreshContextMoDataList(newMoDataList);
433
- }
434
- }
435
- _selectNextInlineRecord(mo) {
436
- const newMoDataList = this.moDataList;
437
- if (!mo.$NewInlineMo) {
438
- // select next record
439
- const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
440
- if (existsIndex > -1 && existsIndex + 1 < newMoDataList.length) {
441
- newMoDataList[existsIndex + 1].$IsChecked = false;
442
- this._rowCheck(newMoDataList[existsIndex + 1], existsIndex + 1);
443
- }
444
- else {
445
- newMoDataList.map((c) => {
446
- c.$NewInlineMo = undefined;
447
- c.$IsChecked = false;
448
- });
449
- if (!this._access.Add) {
450
- this._resetMoDataList(newMoDataList);
451
- return;
452
- }
453
- this._addInlineMoToModataList(this._inlineReportCreateNewMo(true), true);
454
- }
455
- return;
456
- }
457
- else {
458
- this._createNewInlineMo();
459
- }
460
- }
461
- _inlineEditSaveFormPanel(mo) {
462
- const newMoDataList = this.moDataList;
463
- if (!mo.$NewInlineMo) {
464
- return;
465
- }
466
- const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
467
- if (existsIndex > -1) {
468
- newMoDataList[existsIndex] = mo;
469
- }
470
- const canAdd = this._access.Add;
471
- if (!canAdd) {
472
- return;
473
- }
474
- newMoDataList.map((c) => {
475
- c.$NewInlineMo = undefined;
476
- c.$IsChecked = false;
477
- });
478
- // this._ulvMainService.createNewInlineMo();
479
- }
480
- _setDefaultAccess() {
481
- this._access = {
482
- Add: false,
483
- AddToList: false,
484
- Delete: false,
485
- Edit: false,
486
- Export: false,
487
- Print: false,
488
- Refresh: false,
489
- RemoveFromList: false,
490
- View: false
491
- };
492
- }
493
- _expandMo(selectedMo, expand) {
494
- selectedMo.$Expanded = expand;
495
- selectedMo.$Children?.forEach((child) => {
496
- this._expandMo(child, expand);
497
- });
498
- }
499
- _indexOfId(id) {
500
- return this.gridDataSource.resultItems.findIndex((c) => c.Id === id);
501
- }
502
- _indexOfMo(mo) {
503
- return this.gridDataSource.resultItems.findIndex((c) => c.Id === mo.Id);
504
- }
505
- _indexOfSelected() {
506
- return this.gridDataSource.resultItems.findIndex((c) => c.$IsChecked);
507
- }
508
- _getIndex(mo) {
509
- return this.moDataList.findIndex((c) => c.Id === mo.Id);
510
- }
511
- _setInlineEdit(value) {
512
- this._ulvMainService.setInlineEdit(value);
513
- }
514
- _readViewSetting() {
515
- this.viewSetting = this.context.Setting.ClassNames.CustomUi?.Parameters;
516
- }
517
- // protected _moDataListChanged(moDataList: MetaobjectDataModel[]): void {
518
- // super._moDataListChanged(moDataList);
519
- // if (this._inlineEditMode) {
520
- // const checkedMoIndex = moDataList.findIndex((c) => c.$IsChecked);
521
- // if (checkedMoIndex > -1) {
522
- // const checkedMo = moDataList[checkedMoIndex];
523
- // if (checkedMo.Id !== this.formPanelCtrlr.Mo.Id) {
524
- // this._inlineEditorDestroyFormPanelCtrlr();
525
- // this._inlineEditCreateFormPanelCtrlr(checkedMo, checkedMoIndex);
526
- // }
527
- // }
528
- // }
529
- // }
530
- _setVisibility(expand, mo //MetaobjectDataModel
531
- ) {
532
- mo.$Children?.forEach((child) => {
533
- child.$Visibility = expand;
534
- if (child.$Children) {
535
- this._setVisibility(expand, child);
536
- }
537
- });
538
- }
539
- // protected _setNewInlineMo(mo: MetaobjectDataModel | null): void {
540
- // this._ulvMainService.setNewInlineMo(mo);
541
- // }
542
- // protected _inlineEditPrepareNewMo(): MetaobjectDataModel {
543
- // const newMo = getNewMoGridEditor(this.formSetting, this._typeDefId);
544
- // newMo.Id = getUniqueId(3);
545
- // if (this._isComposite()) {
546
- // const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
547
- // newMo[relation.ParentFdName] = relation.ParentMoId;
548
- // }
549
- // const newMoDataList = [...this.moDataList, newMo as MetaobjectDataModel];
550
- // this._ulvMainService.reSetMoDataList(newMoDataList);
551
- // BarsaApi.Ul.ApplicationCtrlr.fireEvent(
552
- // BarsaApi.Ul.ApplicationCtrlr.EventEnum.GlobalReportMoAdd,
553
- // this.context,
554
- // reportEventMoAdd
555
- // );
556
- // this.context.fireEvent('RefreshContextMoDataList', newMoDataList);
557
- // return newMo as MetaobjectDataModel;
558
- // }
559
- _addInlineMoToModataList(newInlineMo, select = false) {
560
- const newMoDataList = [...this.moDataList, { ...newInlineMo, $IsChecked: select }];
561
- this._resetMoDataList(newMoDataList);
562
- this.refreshContextMoDataList(newMoDataList);
563
- }
564
- _rowCheck(mo, index, selected = false) {
565
- const editMode = this._inlineEditMode && this._allowInlineEdit;
566
- if (mo.$IsChecked && editMode) {
567
- return;
568
- }
569
- let selectionMode = this.selectionMode;
570
- if (editMode) {
571
- selectionMode = SelectionMode.SINGLE;
572
- }
573
- const checked = !mo.$IsChecked || selected;
574
- this.rowHoverable = false;
575
- if (selectionMode === 'none') {
576
- return;
577
- }
578
- if (checked) {
579
- if (selectionMode === 'single' && checked) {
580
- this._doCheckedAll(false);
581
- }
582
- if (editMode) {
583
- if (index !== -1) {
584
- // this._setNewInlineMo(null);
585
- this._select(mo, index);
586
- }
587
- // TODO
588
- // this._setValueInlineMo(mo);
589
- }
590
- else {
591
- this._select(mo, index);
592
- }
593
- }
594
- else
595
- this._deselect(mo, index);
596
- }
597
- // protected _setValueInlineMo(mo: MetaobjectDataModel): void {
598
- // // this.formPanelCtrlr.SetValue({ ...mo, $TypeDefId: this._typeDefId });
599
- // }
600
- _inlineEditorDestroyFormPanelCtrlr() {
601
- // if (this.formPanelCtrlr) {
602
- // this._formPanelService.destroy();
603
- // this.formPanelCtrlr.Destroy();
604
- // this.formPanelCtrlr = null;
605
- // }
606
- }
607
- _windowResized() {
608
- this._setContainerWidth();
609
- this._setParentHeight();
610
- this._cdr.detectChanges();
611
- }
612
- _setContainerWidth() {
613
- const el = this.el.nativeElement;
614
- this.containerWidthSource$.next(el.getBoundingClientRect().width);
615
- }
616
- _deviceSizeChanged(deviceSize) {
617
- const elNativeElement = this.el.nativeElement;
618
- if (this._inlineEditMode || deviceSize === 'l' || deviceSize === 'xl') {
619
- this.secondaryColumnsSource.next([]);
620
- return;
621
- }
622
- const gridSize = getControlSizeMode(elNativeElement, deviceSize);
623
- let deviceName = 'desktop';
624
- this.allColumns
625
- ?.filter((c) => !c.Hidden)
626
- .forEach((c) => (c.$TextWidth = c.$TextWidth ? c.$TextWidth : this._getWidth(c.Alias) + 10));
627
- const allColumnsWidth = this.allColumns.map((column) => column.$TextWidth && column.Width > column.$TextWidth ? column.Width : column.$TextWidth || column.Width);
628
- const visibleColumns = this._visibleColumnsSource.getValue();
629
- if (visibleColumns.length === 1) {
630
- this.secondaryColumnsSource.next([]);
631
- }
632
- let columnsCount = visibleColumns.length;
633
- const gridSettings = this.gridSettingSource.getValue();
634
- const groupedColumns = gridSettings.SortSettingList.filter((d) => d.IsGrouped);
635
- const nameGroupedColumns = groupedColumns.map((c) => c.Name);
636
- const colWidthSettings = gridSettings?.ColSettingList?.filter((c) => nameGroupedColumns.indexOf(c.Name) === -1).map((c) => c.Width);
637
- const columnsWidth = colWidthSettings?.length ? colWidthSettings : allColumnsWidth;
638
- let sumColWidth = 0;
639
- if (this.context.ViewSetting?.IsCheckList) {
640
- sumColWidth += 15;
641
- }
642
- if (this.context.Setting?.Extra?.DefaultCommandsAccess?.View) {
643
- sumColWidth += 32;
644
- }
645
- if (this.hasDetailsInRow) {
646
- sumColWidth += 210;
647
- }
648
- const containerWidth = elNativeElement.clientWidth;
649
- switch (gridSize) {
650
- case 'l':
651
- case 'xl':
652
- deviceName = 'desktop';
653
- break;
654
- case 's':
655
- deviceName = 'mobile';
656
- columnsCount = 2;
657
- break;
658
- case 'm':
659
- deviceName = 'tablet';
660
- columnsCount = 4;
661
- break;
662
- }
663
- this._deviceNameSource.next(deviceName);
664
- if (columnsWidth.length > 0 && containerWidth > 0 && deviceSize !== 's') {
665
- columnsCount = visibleColumns.length;
666
- columnsWidth.forEach((width, index) => {
667
- if (sumColWidth + width > containerWidth && columnsCount === visibleColumns.length) {
668
- columnsCount = index;
669
- }
670
- sumColWidth += width;
671
- });
672
- }
673
- const secColumns = this.secondaryColumnsSource.getValue();
674
- if (visibleColumns.length > 2) {
675
- if (this._isDisableResponsiveInDesktop() ||
676
- this._isDisableResponsiveInMobile() ||
677
- this._isDisableResponsiveInTablet()) {
678
- if (secColumns.length) {
679
- this.secondaryColumnsSource.next([]);
680
- }
681
- return;
682
- }
683
- if (columnsCount == 0) {
684
- columnsCount = 1;
685
- }
686
- this.secondaryColumnsSource.next(visibleColumns.slice(columnsCount, visibleColumns.length));
687
- }
688
- }
689
- _isDisableResponsiveInDesktop() {
690
- const isDesktop = getDeviceIsDesktop();
691
- return this.viewSetting?.DisableResponsiveInDesktop && isDesktop;
692
- }
693
- _isDisableResponsiveInTablet() {
694
- const isTablet = getDeviceIsTablet();
695
- return this.viewSetting?.DisableResponsiveInTablet && isTablet;
696
- }
697
- _isDisableResponsiveInMobile() {
698
- const isMobile = getDeviceIsMobile();
699
- return this.viewSetting?.DisableResponsiveInMobile && isMobile;
700
- }
701
- _openSettings(name, device) {
702
- let component = null;
703
- switch (name) {
704
- case 'columns':
705
- component = UlvColumnSettingsComponent;
706
- break;
707
- case 'sort':
708
- component = UlvSortSettingsComponent;
709
- break;
710
- case 'groupby':
711
- component = UlvGroupbySettingsComponent;
712
- break;
713
- }
714
- const config = {
715
- ...this.dialogConfig,
716
- data: { context: this.context },
717
- mobile: device === 'mobile',
718
- minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
719
- minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight,
720
- maxHeight: device === 'mobile' ? '100%' : this.dialogConfig.maxHeight,
721
- maxWidth: device === 'mobile' ? '100%' : this.dialogConfig.maxWidth
722
- };
723
- if (component !== null) {
724
- const dialogRef = this._dialogService.open(component, config);
725
- dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
726
- if (setting) {
727
- const isSortChanged = name === 'sort' || name === 'groupby';
728
- this.updateGridSetting(setting, isSortChanged);
729
- this.context.moDataList = this.gridDataSource.resultItems;
730
- }
731
- });
732
- }
733
- }
734
- _showFilterSetting(selectedColumn) {
735
- const typeDefId = this._typeDefId;
736
- const controlsInfo$ = this._ulvMainService.loadMetaConditionsControlInfos(typeDefId, this.allColumns.map((c) => c.Name));
737
- const config = {
738
- ...this.dialogConfig,
739
- data: {
740
- controlsInfo$,
741
- typeDefId,
742
- selectedColumnName: selectedColumn.Name,
743
- context: this.context
744
- }
745
- };
746
- const dialogRef = this._dialogService.open(UlvFilterSettingsComponent, config);
747
- dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
748
- if (setting) {
749
- }
750
- });
751
- }
752
- _addSortColumn(name, sortDirection, isGrouped = false) {
753
- const sortItem = {
754
- Name: name,
755
- SortDirection: sortDirection,
756
- IsGrouped: isGrouped
757
- };
758
- const settings = getGridSettings(this.context);
759
- const existSortItemIndex = settings.SortSettingList.findIndex((c) => c.Name === name);
760
- if (existSortItemIndex > -1) {
761
- settings.SortSettingList = [sortItem, ...settings.SortSettingList];
762
- settings.SortSettingList.splice(existSortItemIndex + 1, 1);
763
- }
764
- else {
765
- settings.SortSettingList.push(sortItem);
766
- }
767
- this.updateGridSetting(settings, true);
768
- }
769
- 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 }); }
770
- 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 }); }
771
- }
772
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SapUiReportBaseComponent, decorators: [{
773
- type: Component,
774
- args: [{
775
- selector: 'bsu-sap-ui-report-base',
776
- template: '',
777
- changeDetection: ChangeDetectionStrategy.OnPush
778
- }]
779
- }], 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: [{
780
- type: Inject,
781
- args: [DOCUMENT]
782
- }] }, { type: i3.FormPanelService, decorators: [{
783
- type: Optional
784
- }, {
785
- type: Self
786
- }] }], propDecorators: { tableComponent: [{
787
- type: ViewChild,
788
- args: [TableComponent]
789
- }], toolbarComponent: [{
790
- type: ViewChild,
791
- args: [ToolbarComponent]
792
- }], tableRowsRef: [{
793
- type: ViewChildren,
794
- args: ['tableRows']
795
- }], layoutControlsRef: [{
796
- type: ViewChildren,
797
- args: [LayoutControlComponent]
798
- }], ShowFormPanelControl: [{
799
- type: Input
800
- }], ForceCloseChild: [{
801
- type: Input
802
- }], RefreshFormPanelControl: [{
803
- type: Input
804
- }] } });
805
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3NhcC11aS1yZXBvcnQtYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBR1IsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFLSCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUNILFFBQVEsRUFLUixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFJZixtQkFBbUIsRUFLbkIsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBR3BCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNqRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFB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Q0FBQyxDQUFDO1lBQ25FLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNKLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7K0dBejFCUSx3QkFBd0IsdVJBbUZyQixRQUFRO21HQW5GWCx3QkFBd0IsZ1FBSXRCLGNBQWMsbUZBQ2QsZ0JBQWdCLHNKQUViLHNCQUFzQix1RUFWMUIsRUFBRTs7NEZBR0gsd0JBQXdCO2tCQUxwQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRDs7MEJBb0ZRLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsUUFBUTs7MEJBQUksSUFBSTt5Q0FoRk0sY0FBYztzQkFBeEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNJLGdCQUFnQjtzQkFBNUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0EsWUFBWTtzQkFBdEMsWUFBWTt1QkFBQyxXQUFXO2dCQUV6QixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsc0JBQXNCO2dCQXVYM0Isb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsdUJBQXVCO3NCQUEvQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNlbGYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIE92ZXJsYXksIFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsLCB0YXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBDb250ZW50RGVuc2l0eSxcbiAgICBDb250ZW50RGVuc2l0eVNlcnZpY2UsXG4gICAgRGlhbG9nQ29uZmlnLFxuICAgIERpYWxvZ1NlcnZpY2UsXG4gICAgVGFibGVDb21wb25lbnQsXG4gICAgVG9vbGJhckNvbXBvbmVudFxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIEJhcnNhQXBpLFxuICAgIGNvbHVtbnNSZXNpemVkRXZlbnRBcmdzLFxuICAgIERlZmF1bHRDb21tYW5kc0FjY2VzcyxcbiAgICBEZXZpY2VTaXplLFxuICAgIEZvcm1QYW5lbFNlcnZpY2UsXG4gICAgR2V0QWxsQ29sdW1uc1NvcnRlZCxcbiAgICBnZXRDb250cm9sU2l6ZU1vZGUsXG4gICAgZ2V0R3JpZFNldHRpbmdzLFxuICAgIExheW91dFNlcnZpY2UsXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBQb3J0YWxTZXJ2aWNlLFxuICAgIFJlcG9ydEJhc2VDb21wb25lbnQsXG4gICAgUmVwb3J0Vmlld0NvbHVtbixcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcbiAgICBVbHZNYWluU2VydmljZSxcbiAgICBTaGFyZUJ1dHRvbnNDaG9pY2VEZWYsXG4gICAgZ2V0UGFyZW50SGVpZ2h0LFxuICAgIG1lYXN1cmVUZXh0LFxuICAgIGdldFVuaXF1ZUlkLFxuICAgIFNlbGVjdGlvbk1vZGUsXG4gICAgZ2V0RGV2aWNlSXNEZXNrdG9wLFxuICAgIGdldERldmljZUlzTW9iaWxlLFxuICAgIGdldERldmljZUlzVGFibGV0LFxuICAgIENvbHVtblN1bW1hcnlUeXBlLFxuICAgIExheW91dFNldHRpbmdcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuaW1wb3J0IHsgTGF5b3V0Q29udHJvbENvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LWNvbnRyb2wvbGF5b3V0LWNvbnRyb2wuY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRNb0RhdGFMaXN0IH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgVWx2Q29sdW1uU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1jb2x1bW4tc2V0dGluZ3MvdWx2LWNvbHVtbi1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVWx2U29ydFNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi91bHYtc29ydC1zZXR0aW5ncy91bHYtc29ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVWx2R3JvdXBieVNldHRpbmdzQ29tcG9uZW50IH0gZnJvbSAnLi91bHYtZ3JvdXBieS1zZXR0aW5ncy91bHYtZ3JvdXBieS1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVWx2RmlsdGVyU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1maWx0ZXItc2V0dGluZ3MvdWx2LWZpbHRlci1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2JzdS1zYXAtdWktcmVwb3J0LWJhc2UnLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTYXBVaVJlcG9ydEJhc2VDb21wb25lbnQ8VCBleHRlbmRzIFVpUmVwb3J0Vmlld0Jhc2VTZXR0aW5nPlxuICAgIGV4dGVuZHMgUmVwb3J0QmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgICBAVmlld0NoaWxkKFRhYmxlQ29tcG9uZW50KSB0YWJsZUNvbXBvbmVudDogVGFibGVDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZChUb29sYmFyQ29tcG9uZW50KSB0b29sYmFyQ29tcG9uZW50OiBUb29sYmFyQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3RhYmxlUm93cycpIHRhYmxlUm93c1JlZjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICAgIEBWaWV3Q2hpbGRyZW4oTGF5b3V0Q29udHJvbENvbXBvbmVudClcbiAgICBsYXlvdXRDb250cm9sc1JlZjogUXVlcnlMaXN0PExheW91dENvbnRyb2xDb21wb25lbnQ+O1xuICAgIHVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbCA9IGZhbHNlO1xuICAgIGhhc1NlbGVjdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBzaG93T2tDYW5jZWxCdXR0b25zOiBhbnk7XG4gICAgcGFyZW50SGVpZ2h0ID0gMDtcbiAgICBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcbiAgICAgICAgcmVzcG9uc2l2ZVBhZGRpbmc6IHRydWUsXG4gICAgICAgIHZlcnRpY2FsUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgbWluV2lkdGg6ICc0MHJlbScsXG4gICAgICAgIG1pbkhlaWdodDogJzkwdmgnLFxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgbWF4SGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICByZXNpemFibGU6IHRydWVcbiAgICB9O1xuICAgIGlkID0gYFJlcG9ydF8ke2dldFVuaXF1ZUlkKDMpfWA7XG4gICAgc2VsZWN0ZWRSb3dzTnVtYmVyID0ge307XG4gICAgc2VsZWN0QWxsID0gZmFsc2U7XG4gICAgc2VsZWN0aW9uQWRhcHRlckhhbmRsZXI6IHtcbiAgICAgICAgc2NvcGU6IGFueTtcbiAgICAgICAgcm93c2VsZWN0OiBhbnk7XG4gICAgICAgIHJvd2Rlc2VsZWN0OiBhbnk7XG4gICAgICAgIGJlZm9yZXJvd3NlbGVjdDogYW55O1xuICAgIH07XG4gICAgbmF2aWdhdGlvbkFycm93JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIGN1c3RvbVJvd0hlaWdodDogYW55O1xuICAgIHJvd0NsaWNrID0gdHJ1ZTtcbiAgICBjZWxsQ2xpY2sgPSBmYWxzZTtcbiAgICBkZXZpY2VOYW1lJDogT2JzZXJ2YWJsZTxEZXZpY2VTaXplPjtcbiAgICBtb2JpbGVPclRhYmxldCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBzZWNvbmRhcnlDb2x1bW5zU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXBvcnRWaWV3Q29sdW1uW10+KFtdKTtcbiAgICBzZWNvbmRhcnlDb2x1bW5zJCA9IHRoaXMuc2Vjb25kYXJ5Q29sdW1uc1NvdXJjZVxuICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEubGVuZ3RoID09PSBiLmxlbmd0aCB8fCBhID09PSBiKSk7XG4gICAgcG9waW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGNvbnRlbnREZW5zaXR5JDogT2JzZXJ2YWJsZTxDb250ZW50RGVuc2l0eT47XG4gICAgaGFzRGV0YWlsc0luUm93ID0gZmFsc2U7XG4gICAgcm93QWN0aXZhYmxlID0gdHJ1ZTtcbiAgICBvcGVuT3ZlcmZsb3dDb21tYW5kczogYm9vbGVhbltdID0gW107XG4gICAgY29udGFpbmVyV2lkdGhTb3VyY2UkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAgIGNsb3NlU2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5O1xuICAgIHJvd0hvdmVyYWJsZTogYm9vbGVhbjtcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlO1xuICAgIGNvbHVtbnNDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICBzZWNvbmRhcnlDb2x1bW5zQ291bnQkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgY29udGFpbmVyV2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgY29sdW1ucyQ6IE9ic2VydmFibGU8UmVwb3J0Vmlld0NvbHVtbltdPjtcbiAgICBncmlkRGF0YVNvdXJjZTogR3JpZE1vRGF0YUxpc3Q7XG4gICAgc2luZ2xlU2VsZWN0aW9uID0gU2VsZWN0aW9uTW9kZS5TSU5HTEU7XG4gICAgbXVsdGlwbGVTZWxlY3Rpb24gPSBTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xuICAgIGFsbG93SW5saW5lRWRpdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgaW5saW5lRWRpdE1vZGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIG9ubHlJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBmb3JtUGFuZWxDdHJscjogYW55O1xuICAgIGxheW91dCQ6IE9ic2VydmFibGU8YW55PjtcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHJlcG9ydElkOiBzdHJpbmc7XG4gICAgdmlld1NldHRpbmc6IFQ7XG4gICAgZGlzYWJsZVJlc3BvbnNpdmUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHNpbXBsZUlubGluZUVkaXQ6IGJvb2xlYW47XG4gICAgbGF5b3V0SW5mbzogTGF5b3V0U2V0dGluZztcbiAgICBwcm90ZWN0ZWQgX2RldmljZU5hbWVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERldmljZVNpemU+KCdkZXNrdG9wJyk7XG4gICAgcHJpdmF0ZSBfb2xkQ29udGFpbmVyOiBhbnk7XG4gICAgcHJpdmF0ZSBfb3Blbk9uQ2xpY2s6IGJvb2xlYW47XG4gICAgZ3JvdXBTdW1tYXJ5OiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9vdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcm90ZWN0ZWQgX2NvbnRlbnREZW5zaXR5U2VydmljZTogQ29udGVudERlbnNpdHlTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF91bHZNYWluU2VydmljZTogVWx2TWFpblNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHJvdGVjdGVkIF9mb3JtcGFuZWxTZXJ2aWNlOiBGb3JtUGFuZWxTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9wb3J0YWxTZXJ2aWNlLCBfdWx2TWFpblNlcnZpY2UpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoJCA9IHRoaXMuY29udGFpbmVyV2lkdGhTb3VyY2UkXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5kZXZpY2VOYW1lJCA9IHRoaXMuX2RldmljZU5hbWVTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVJlc3BvbnNpdmUkID0gdGhpcy5kZXZpY2VOYW1lJC5waXBlKG1hcCgoYykgPT4gYyA9PT0gJ2Rlc2t0b3AnKSk7XG4gICAgICAgIHRoaXMubW9iaWxlT3JUYWJsZXQkID0gdGhpcy5kZXZpY2VOYW1lJC5waXBlKG1hcCgoZGV2aWNlKSA9PiBkZXZpY2UgPT09ICdtb2JpbGUnIHx8IGRldmljZSA9PT0gJ3RhYmxldCcpKTtcbiAgICAgICAgdGhpcy5fb2xkQ29udGFpbmVyID0gQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5DdXJyZW50U3lzdGVtQWRhcHRlcjtcbiAgICAgICAgdGhpcy5jbG9zZVNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY29udGVudERlbnNpdHkkID0gdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlLmNvbnRlbnREZW5zaXR5O1xuICAgICAgICB0aGlzLnNlY29uZGFyeUNvbHVtbnNDb3VudCQgPSB0aGlzLnNlY29uZGFyeUNvbHVtbnMkLnBpcGUobWFwKChjb2x1bW5zKSA9PiBjb2x1bW5zLmxlbmd0aCkpO1xuICAgICAgICB0aGlzLmNvbHVtbnNDb3VudCQgPSB0aGlzLnZpc2libGVDb2x1bW5zJC5waXBlKFxuICAgICAgICAgICAgbWFwKChjb2x1bW5zKSA9PiBjb2x1bW5zLmxlbmd0aCksXG4gICAgICAgICAgICBtYXAoKGNvdW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3MgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZSh0aGlzLmNvbnRleHQsICdTZXR0aW5nLkV4dHJhLkRlZmF1bHRDb21tYW5kc0FjY2VzcycpO1xuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3M/LlZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKGNvdW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgb25Db2x1bW5TdW1tYXJ5KGU6IENvbHVtblN1bW1hcnlUeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbHVtblN1bW1hcnkoZSk7XG4gICAgfVxuICAgIG9uUmVzZXRXb3JrZmxvd1N0YXRlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIG1vLiRXb3JrZmxvd1N0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KCk7XG4gICAgfVxuXG4gICAgZ2V0IF90eXBlRGVmSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5TZXR0aW5nLkV4dHJhLlJlcG9ydC5UeXBlRGVmSWQ7XG4gICAgfVxuICAgIGdldCBfaW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91bHZNYWluU2VydmljZS5nZXRWYWx1ZUlubGluZUVkaXQoKTtcbiAgICB9XG4gICAgZ2V0IF9hbGxvd0lubGluZUVkaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91bHZNYWluU2VydmljZS5nZXRBbGxvd0lubGluZUVkaXQoKTtcbiAgICB9XG4gICAgZ2V0IF9hY2Nlc3MoKTogRGVmYXVsdENvbW1hbmRzQWNjZXNzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5TZXR0aW5nPy5FeHRyYT8uRGVmYXVsdENvbW1hbmRzQWNjZXNzO1xuICAgIH1cbiAgICBzZXQgX2FjY2Vzcyh2YWw6IERlZmF1bHRDb21tYW5kc0FjY2Vzcykge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLkV4dHJhLkRlZmF1bHRDb21tYW5kc0FjY2VzcyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLkV4dHJhID0geyBEZWZhdWx0Q29tbWFuZHNBY2Nlc3M6IHZhbCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpc0NoZWNrTGlzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5WaWV3U2V0dGluZz8uSXNDaGVja0xpc3Q7XG4gICAgfVxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRQYXJlbnRIZWlnaHQoKTtcbiAgICAgICAgdGhpcy5fcmVhZFZpZXdTZXR0aW5nKCk7XG4gICAgICAgIGlmICghdGhpcy5fYWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXREZWZhdWx0QWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5zaG93T2tDYW5jZWxCdXR0b25zID0gdGhpcy5jb250ZXh0LlNob3dPa0NhbmNlbEJ1dHRvbnM7XG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxheW91dEluZm8kLnN1YnNjcmliZSgobGF5b3V0SW5mbykgPT4ge1xuICAgICAgICAgICAgaWYgKGxheW91dEluZm8gJiYgbGF5b3V0SW5mby5Vc2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMudmlld1NldHRpbmc/LlRpdGxlO1xuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnNldFRpdGxlKHRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZXBvcnRJZCQuc3Vic2NyaWJlKChyZXBvcnRJZCkgPT4gKHRoaXMucmVwb3J0SWQgPSByZXBvcnRJZCkpO1xuICAgICAgICB0aGlzLl9sYXlvdXRTZXJ2aWNlLnNldFJlbmRlcmVkKHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSB0aGlzLmNvbnRleHQuVmlld1NldHRpbmc/LklzQ2hlY2tMaXN0ID8gdGhpcy5tdWx0aXBsZVNlbGVjdGlvbiA6IHRoaXMuc2luZ2xlU2VsZWN0aW9uO1xuICAgICAgICB0aGlzLl9vcGVuT25DbGljayA9IHRoaXMudmlld1NldHRpbmc/Lk9wZW5PbkNsaWNrO1xuICAgICAgICB0aGlzLmN1c3RvbVJvd0hlaWdodCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LlNldHRpbmcsXG4gICAgICAgICAgICAnRXh0cmEuRXh0cmFKc29uUHJvcFJlcG9ydC5HcmlkUm93SGVpZ2h0J1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnNpbXBsZUlubGluZUVkaXQgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxuICAgICAgICAgICAgJ0V4dHJhLkV4dHJhSnNvblByb3BSZXBvcnQuU2ltcGxlSW5saW5lRWRpdCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ncm91cFN1bW1hcnkgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxuICAgICAgICAgICAgJ0V4dHJhLkV4dHJhSnNvblByb3BSZXBvcnQuR3JvdXBTdW1tYXJ5JyxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucnRsJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uQXJyb3ckID0gdGhpcy5fcG9ydGFsU2VydmljZS5ydGwkLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGlzUnRsKSA9PiAoaXNSdGwgPyAnbmF2aWdhdGlvbi1sZWZ0LWFycm93JyA6ICduYXZpZ2F0aW9uLXJpZ2h0LWFycm93JykpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWxsb3dJbmxpbmVFZGl0JCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmFsbG93SW5saW5lRWRpdCQ7XG4gICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUkID0gdGhpcy5fdWx2TWFpblNlcnZpY2UuaW5saW5lRWRpdE1vZGUkO1xuICAgICAgICB0aGlzLm9ubHlJbmxpbmVFZGl0JCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLm9ubHlJbmxpbmVFZGl0JDtcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2Uuc2V0Q2FuU2F2ZUdyaWRTZXR0aW5ncyh0aGlzLnZpZXdTZXR0aW5nPy5DYW5TYXZlR3JpZFNldHRpbmcpO1xuICAgICAgICB0aGlzLmhhc1NlbGVjdGVkJCA9IHRoaXMubW9EYXRhTGlzdCQucGlwZShtYXAoKG1vTGlzdCkgPT4gbW9MaXN0LnNvbWUoKGMpID0+IGMuJElzQ2hlY2tlZCkpKTtcbiAgICAgICAgdGhpcy5tb0RhdGFMaXN0JCA9IHRoaXMubW9EYXRhTGlzdCQucGlwZShtYXAoKGl0ZW1zKSA9PiB0aGlzLl9tYXBDYXJ0YWJsZU1vKGl0ZW1zKSkpO1xuICAgICAgICBjb25zdCBncmlkRGF0YVNvdXJjZSA9IG5ldyBHcmlkTW9EYXRhTGlzdChcbiAgICAgICAgICAgIHRoaXMubW9EYXRhTGlzdCQsXG4gICAgICAgICAgICB0aGlzLmdyaWRTZXR0aW5nJCxcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMkLFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtJCxcbiAgICAgICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUkXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5ncmlkRGF0YVNvdXJjZSA9IGdyaWREYXRhU291cmNlO1xuICAgICAgICB0aGlzLmNvbHVtbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5ncmlkU2V0dGluZyQsIHRoaXMuc2Vjb25kYXJ5Q29sdW1ucyRdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbXywgc2Vjb25kYXJ5Q29sdW1uc10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWNvbmRhcmllcyA9IHNlY29uZGFyeUNvbHVtbnMubWFwKChjKSA9PiBjLk5hbWUpO1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gR2V0QWxsQ29sdW1uc1NvcnRlZCh0aGlzLmNvbnRleHQpLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkQ29sdW1ucyA9IF8/LlNvcnRTZXR0aW5nTGlzdD8uZmlsdGVyKChjKSA9PiBjLklzR3JvdXBlZCkubWFwKChjKSA9PiBjLk5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cGVkQ29sdW1ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcigoYykgPT4gZ3JvdXBlZENvbHVtbnMuaW5kZXhPZihjLk5hbWUpID09PSAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoYykgPT4gc2Vjb25kYXJpZXMuaW5kZXhPZihjLk5hbWUpID09PSAtMSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoY29sdW1ucykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoYzogUmVwb3J0Vmlld0NvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjLiRDU1NDbGFzc05hbWUgPSAnY29sdW1uX19GaWVsZFR5cGUnICsgYy5GaWVsZFR5cGVJZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGMuRmllbGRUeXBlSWQgPT09IDM4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjLiRXaWR0aCA9ICdhdXRvJztcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYy5FeHRyYT8uSWNvbkRpc3BsYXlUeXBlRW51bSA9PT0gJ0ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYy4kV2lkdGggPSAnMzhweCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjLiRXaWR0aCA9ICFCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzVXNlckxvZ2dlZEluIC8vIGlmIHVzZXIgaXMgYW5vbnltb3VzIGFsbCBjb2x1bW4gd2lkdGggZXF1YWxzIHRvIDEwMCVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICA/ICcxMDAlJ1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIDogYy5XaWR0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICA/IGMuV2lkdGggKyAncHgnXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmlubGluZUVkaXRNb2RlJC5waXBlKFxuICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5oYXNTZWxlY3RlZCQpLFxuICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2FjY2Vzcy5BZGQgIT09IGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9zZXRDb250YWluZXJXaWR0aCgpO1xuICAgIH1cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1wYW5lbFNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1wYW5lbFNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uRXhlY3V0ZVRvb2xiYXJCdXR0b24oZTogeyBpdGVtSWQ6IHN0cmluZzsgb3B0aW9ucz86IGFueSB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgaXRlbUlkLCBvcHRpb25zIH0gPSBlO1xuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5leGVjdXRlVG9vbGJhckJ1dHRvbihpdGVtSWQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBvbkVkaXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRJbmxpbmVFZGl0KCF0aGlzLl9pbmxpbmVFZGl0TW9kZSk7XG4gICAgfVxuICAgIG9uU2VsZWN0TmV4dElubGluZVJlY29yZChtbyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vKTtcbiAgICB9XG5cbiAgICBvbkVkaXRGb3JtUGFuZWxTYXZlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lubGluZUVkaXRTYXZlRm9ybVBhbmVsKG1vKTtcbiAgICB9XG5cbiAgICBvbkVkaXRGb3JtUGFuZWxDYW5jZWwobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcbiAgICAgICAgY29uc3QgaGFzU2VsZWN0ZWQgPSBtb0RhdGFMaXN0LnNvbWUoKGMpID0+IGMuJElzQ2hlY2tlZCk7XG4gICAgICAgIGlmIChoYXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdFNhdmVGb3JtUGFuZWwobW8pO1xuICAgICAgICAgICAgdGhpcy5fc2V0SW5saW5lRWRpdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25FZGl0Rm9ybVBhbmVsVmFsdWVDaGFuZ2UoZTogeyBtbzogTWV0YW9iamVjdERhdGFNb2RlbDsgZmllbGREYk5hbWU/OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbmxpbmVGb3JtUGFuZWxWYWx1ZUNoYW5nZShlLm1vKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnQ2VsbEVkaXRlZCcsIEJhcnNhQXBpLkJ3Ll93cmFwKGUubW8pLCBlLmZpZWxkRGJOYW1lKTtcbiAgICB9XG4gICAgb25Db2x1bW5SZXNpemVkKGNvbHVtbnM6IGNvbHVtbnNSZXNpemVkRXZlbnRBcmdzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUNvbHVtbnNSZXNpemVkKGNvbHVtbnMpO1xuICAgIH1cbiAgICBvbldvcmtmbG93U2hhcmVCdXR0b25zKGU6IFNoYXJlQnV0dG9uc0Nob2ljZURlZik6IHZvaWQge1xuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5hZGRXb3JrZmxvd0J1dHRvbnNJblRvb2xiYXIoZSk7XG4gICAgfVxuICAgIG9uUm93Q2xpY2soJGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgbW8gfSA9ICRldmVudDtcbiAgICAgICAgaWYgKG1vLmdyb3VwIHx8IHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ2hlY2tlZEFsbCgpO1xuICAgICAgICBpZiAoIW1vLiRJc0NoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvd0NoZWNrKG1vLCBtb0luZGV4LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52aWV3U2V0dGluZz8uRGlzYWJsZVNob3dGb3JtT25Eb3VibGVDbGljaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29wZW5NbyhtbywgbW9JbmRleCk7XG4gICAgfVxuXG4gICAgb25VbHZDb21tYW5kKCRldmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XG4gICAgICAgIGNvbnN0IG1vSW5kZXggPSB0aGlzLl9nZXRJbmRleChtbyk7XG4gICAgICAgIHRoaXMuX3VsdkNvbW1hbmRDbGlja2VkKG1vLCBtb0luZGV4KTtcbiAgICB9XG4gICAgb25EZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZG9DaGVja2VkQWxsKGZhbHNlKTtcbiAgICAgICAgLy8gdGhpcy5jb250ZXh0LmZpcmVFdmVudCgncm93c2VsZWN0JywgdGhpcy5jb250ZXh0KTsgLy8g2KjYp9i52Ksg2YXbjNi02YjYryDYr9mI2KjYp9ixIHNlbGVjdGlvbmNoYW5nZSDar9iy2KfYsdi0INmB2LHYp9iu2YjYp9mG24wg2LTZiNivXG4gICAgfVxuICAgIG9uUm93Q2hlY2soJGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgbW8sIG9ubHlDaGVjayB9ID0gJGV2ZW50O1xuICAgICAgICBjb25zdCBtb0luZGV4ID0gdGhpcy5fZ2V0SW5kZXgobW8pO1xuICAgICAgICBpZiAoIW9ubHlDaGVjayAmJiB0aGlzLl9vcGVuT25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCRldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yb3dDaGVjayhtbywgbW9JbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DYXJ0YWJsZUZvcm1DbG9zZWQoeyBtbyB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QyID0gbmV3TW9EYXRhTGlzdC5maWx0ZXIoKGMpID0+IGMuSWQgIT09IG1vLklkKTtcbiAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QyKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdDIpO1xuICAgIH1cbiAgICBvbkV4cGFuZENsaWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIG1vLiRFeHBhbmRlZCA9ICFtby4kRXhwYW5kZWQ7XG4gICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHkobW8uJEV4cGFuZGVkLCBtbyk7XG4gICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdCgpO1xuICAgIH1cblxuICAgIG9uQWxsQ2hlY2tib3goY2hlY2tlZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kb0NoZWNrZWRBbGwoY2hlY2tlZCk7XG4gICAgICAgIC8vIGlmIChjaGVja2VkKSB7XG4gICAgICAgIC8vICAgdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5mb3JFYWNoKChtbywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3NlbGVjdChtbywgaW5kZXgpO1xuICAgICAgICAvLyAgIH0pO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZm9yRWFjaCgobW8sIGluZGV4KSA9PiB7XG4gICAgICAgIC8vICAgICB0aGlzLl9kZXNlbGVjdChtbywgaW5kZXgpO1xuICAgICAgICAvLyAgIH0pO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgb25Tb3J0QXNjZW5kaW5nKGNvbHVtbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZGRTb3J0Q29sdW1uKGNvbHVtbi5OYW1lLCAnQVNDJyk7XG4gICAgfVxuXG4gICAgb25Tb3J0RGVzY2VuZGluZyhjb2x1bW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWRkU29ydENvbHVtbihjb2x1bW4uTmFtZSwgJ0RFU0MnKTtcbiAgICB9XG4gICAgb25GaWx0ZXIoc2VsZWN0ZWRDb2x1bW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW4pO1xuICAgIH1cblxuICAgIG9uQ29sdW1uU2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnY29sdW1ucycsIGRldmljZSk7XG4gICAgfVxuXG4gICAgb25Tb3J0U2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnc29ydCcsIGRldmljZSk7XG4gICAgfVxuXG4gICAgb25Hcm91cGJ5U2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnZ3JvdXBieScsIGRldmljZSk7XG4gICAgfVxuXG4gICAgb25MaXN0Q2hlY2tib3hDbGljaygkZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBtbywgaW5kZXgsIGUgfSA9ICRldmVudDtcbiAgICAgICAgdGhpcy5vblJvd0NoZWNrKHsgbW8sIGluZGV4LCBjYXVzZTogJ3NpbmdsZVNlbGVjdCcgfSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBvbkxpc3ROYXZpZ2F0aW9uQ2xpY2soJGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgbW8sIGluZGV4LCBlIH0gPSAkZXZlbnQ7XG4gICAgICAgIHRoaXMub25Sb3dDbGljayh7IG1vLCBpbmRleCB9KTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvblNhdmVUb3BGb3JtKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XG4gICAgICAgIGNvbnN0IGV4aXN0c0luZGV4ID0gbmV3TW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcbiAgICAgICAgaWYgKGV4aXN0c0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXhdID0gbW87XG4gICAgICAgIH1cbiAgICAgICAgbmV3TW9EYXRhTGlzdC5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGMuJE5ld0lubGluZU1vID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZXNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XG4gICAgICAgIHRoaXMucmVmcmVzaENvbnRleHRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xuICAgIH1cbiAgICBvbk5ld1RvcEZvcm1BZGQobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWRkSW5saW5lTW9Ub01vZGF0YUxpc3QobW8pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIEBJbnB1dCgpIFNob3dGb3JtUGFuZWxDb250cm9sID0gKGZvcm1wYW5lbEN0cmxyKSA9PiB7fTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIEBJbnB1dCgpIEZvcmNlQ2xvc2VDaGlsZCA9ICgpID0+IHt9O1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgQElucHV0KCkgUmVmcmVzaEZvcm1QYW5lbENvbnRyb2wgPSAoZm9ybXBhbmVsQ3RybHIpID0+IHt9O1xuXG4gICAgLy8gcHJvdGVjdGVkIF9pbmxpbmVFZGl0TW9kZUNoYW5nZWQoZWRpdE1vZGUpOiB2b2lkIHtcbiAgICAvLyAgICAgaWYgKGVkaXRNb2RlKSB7XG4gICAgLy8gICAgICAgICBjb25zdCBjYW5BZGQ6IGJvb2xlYW4gPSB0aGlzLl9hY2Nlc3M/LkFkZCAhPT0gZmFsc2U7XG5cbiAgICAvLyAgICAgICAgIGxldCBzZWxlY3RlZE1vID0gdGhpcy5fZ2V0U2VsZWN0ZWQoKTtcbiAgICAvLyAgICAgICAgIGxldCBuZXdNbztcbiAgICAvLyAgICAgICAgIGlmIChjYW5BZGQgIT09IGZhbHNlICYmICFzZWxlY3RlZE1vKSB7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lUmVjb3JkKCk7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgLy8gaWYgKCFzZWxlY3RlZE1vICYmICFuZXdNbyAmJiB0aGlzLm1vRGF0YUxpc3QubGVuZ3RoID4gMCkge1xuICAgIC8vICAgICAgICAgLy8gICAgIHNlbGVjdGVkTW8gPSB0aGlzLm1vRGF0YUxpc3RbMF07XG4gICAgLy8gICAgICAgICAvLyB9XG4gICAgLy8gICAgICAgICAvLyBpZiAoc2VsZWN0ZWRNbykge1xuICAgIC8vICAgICAgICAgLy8gICAgIGNvbnN0IGlkT2ZTZWxlY3RlZE1vID0gdGhpcy5faW5kZXhPZk1vKHNlbGVjdGVkTW8pO1xuICAgIC8vICAgICAgICAgLy8gICAgIHNlbGVjdGVkTW8uJElzQ2hlY2tlZCA9IGZhbHNlO1xuICAgIC8vICAgICAgICAgLy8gICAgIHRoaXMuX2NyZWF0ZU5ld0lubGluZVJlY29yZChzZWxlY3RlZE1vKTtcbiAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLl9yb3dDaGVjayhzZWxlY3RlZE1vLCBpZE9mU2VsZWN0ZWRNbyk7XG4gICAgLy8gICAgICAgICAvLyB9XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkN1cnJlbnRTeXN0ZW1BZGFwdGVyID0gdGhpcy5fb2xkQ29udGFpbmVyO1xuICAgIC8vICAgICAgICAgdGhpcy5fc2V0TmV3SW5saW5lTW8obnVsbCk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG4gICAgLy8gcHJvdGVjdGVkIF9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoc2VsZWN0ZWRNbz86IE1ldGFvYmplY3REYXRhTW9kZWwpIHtcbiAgICAvLyAgICAgY29uc3QgbW8gPSB0aGlzLl9pbmxpbmVFZGl0UHJlcGFyZU5ld01vKCk7XG4gICAgLy8gICAgIGNvbnN0IGZvcm1NbyA9IEJhcnNhQXBpLkNvbW1vbi5NZXJnZXIuRmFzdE1lcmdlKG1vLCBzZWxlY3RlZE1vLCB7IGV4dGVuZGVkRmllbGRzOiBbJ0lkLCRDYXB0aW9uJ10gfSk7XG4gICAgLy8gICAgIHRoaXMuX3NldE5ld0lubGluZU1vKGZvcm1Nbyk7XG4gICAgLy8gICAgIHRoaXMuX3NlbGVjdChmb3JtTW8sIC0xKTtcbiAgICAvLyB9XG4gICAgcHJvdGVjdGVkIF9yZXNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdD86IE1ldGFvYmplY3REYXRhTW9kZWxbXSkge1xuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfZ2V0V2lkdGgobGFiZWw6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGxhYmVsV2l0aFBhZGRpbmcgPSBtZWFzdXJlVGV4dChsYWJlbCk7XG4gICAgICAgIGlmIChsYWJlbFdpdGhQYWRkaW5nIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChsYWJlbFdpdGhQYWRkaW5nKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zZXRQYXJlbnRIZWlnaHQoKSB7XG4gICAgICAgIHRoaXMucGFyZW50SGVpZ2h0ID0gZ2V0UGFyZW50SGVpZ2h0KHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbWFwQ2FydGFibGVNbyhpdGVtczogTWV0YW9iamVjdERhdGFNb2RlbFtdKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3U2V0dGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgTmFtZVNlcmlhbGl6ZU1vLCBDYXJ0YWJsZU9iamVjdE5hbWUgfSA9IHRoaXMudmlld1NldHRpbmc7XG4gICAgICAgIGlmICghTmFtZVNlcmlhbGl6ZU1vIHx8ICFDYXJ0YWJsZU9iamVjdE5hbWUgfHwgIWl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgfVxuICAgICAgICBpdGVtcy5mb3JFYWNoKChjKSA9PiAoY1tDYXJ0YWJsZU9iamVjdE5hbWVdID0gQmFyc2FBcGkuRXh0LmRlY29kZSgneycgKyBjW05hbWVTZXJpYWxpemVNb10gKyAnfScpKSk7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBvblRvb2xiYXJDcmVhdGVOZXdJbmxpbmVNbygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lTW8oKTtcbiAgICB9XG4gICAgb25DcmVhdGVOZXdNbygpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lTW8odHJ1ZSk7XG4gICAgfVxuICAgIG9uTWFuZGF0b3J5KGlzTWFuZGF0b3I6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnTWFuZGF0b3J5JywgaXNNYW5kYXRvcik7XG4gICAgfVxuICAgIG9uVXBkYXRlTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IG1vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XG4gICAgICAgIGlmIChtb0luZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIG1vRGF0YUxpc3RbbW9JbmRleF0gPSBtbztcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdChtb0RhdGFMaXN0KTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvbnRleHRNb0RhdGFMaXN0KG1vRGF0YUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSGFzRGV0YWlsc0luUm93KHZhbHVlOiBib29sZWFuLCBkZXZpY2VTaXplKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzRGV0YWlsc0luUm93ID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2RldmljZVNpemVDaGFuZ2VkKGRldmljZVNpemUpO1xuICAgIH1cbiAgICBvbkVzY2FwZUtleShtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVDYW5jZWxJbmxpbmVFZGl0KG1vKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2FuY2VsSW5saW5lRWRpdChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xuICAgICAgICBjb25zdCBtb0luZGV4ID0gbW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcbiAgICAgICAgaWYgKG1vSW5kZXggPCAwIHx8ICFtby4kTmV3SW5saW5lTW8pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IG1vRGF0YUxpc3QuZmlsdGVyKChjKSA9PiBjLklkICE9PSBtby5JZCk7XG4gICAgICAgIHRoaXMuX3Jlc2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XG4gICAgfVxuICAgIHByaXZhdGUgX2NyZWF0ZU5ld0lubGluZU1vKHNldENoYW5nZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xuICAgICAgICBjb25zdCBleGlzdElubGluZU1vID0gbW9EYXRhTGlzdC5maW5kKChjKSA9PiBjLiROZXdJbmxpbmVNbyk7XG4gICAgICAgIGlmIChleGlzdElubGluZU1vKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChleGlzdElubGluZU1vKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtbyA9IHRoaXMuX2lubGluZVJlcG9ydENyZWF0ZU5ld01vKHRydWUpO1xuICAgICAgICBpZiAoc2V0Q2hhbmdlZCkge1xuICAgICAgICAgICAgbW8uJElubGluZU1vQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IChjLiRJc0NoZWNrZWQgPSBmYWxzZSkpO1xuICAgICAgICB0aGlzLl9hZGRJbmxpbmVNb1RvTW9kYXRhTGlzdChtbywgdHJ1ZSk7XG4gICAgfVxuICAgIHByaXZhdGUgX2lubGluZVJlcG9ydENyZWF0ZU5ld01vKGlzQ2hlY2tlZDogYm9vbGVhbik6IE1ldGFvYmplY3REYXRhTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdWx2TWFpblNlcnZpY2UuY3JlYXRlTmV3SW5saW5lTW8oaXNDaGVja2VkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XG4gICAgICAgIGNvbnN0IGV4aXN0TW9JbmRleCA9IG5ld01vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XG4gICAgICAgIGlmIChleGlzdE1vSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgY29uc3Qgc0luZGV4ID0gbmV3TW9EYXRhTGlzdFtleGlzdE1vSW5kZXhdLiRTdHlsZUluZGV4O1xuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdE1vSW5kZXhdID0gQmFyc2FBcGkuQ29tbW9uLk1ldGFPYmplY3RXZWIuQ3JlYXRlTW8obW8pO1xuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdE1vSW5kZXhdLiRTdHlsZUluZGV4ID0gc0luZGV4O1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XG4gICAgICAgIGlmICghbW8uJE5ld0lubGluZU1vKSB7XG4gICAgICAgICAgICAvLyBzZWxlY3QgbmV4dCByZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0c0luZGV4ID0gbmV3TW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcbiAgICAgICAgICAgIGlmIChleGlzdHNJbmRleCA+IC0xICYmIGV4aXN0c0luZGV4ICsgMSA8IG5ld01vRGF0YUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleCArIDFdLiRJc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3dDaGVjayhuZXdNb0RhdGFMaXN0W2V4aXN0c0luZGV4ICsgMV0sIGV4aXN0c0luZGV4ICsgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuJE5ld0lubGluZU1vID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjLiRJc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2FjY2Vzcy5BZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkSW5saW5lTW9Ub01vZGF0YUxpc3QodGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8odHJ1ZSksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lTW8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2lubGluZUVkaXRTYXZlRm9ybVBhbmVsKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XG4gICAgICAgIGlmICghbW8uJE5ld0lubGluZU1vKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xuICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleF0gPSBtbztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5BZGQgPSB0aGlzLl9hY2Nlc3MuQWRkO1xuICAgICAgICBpZiAoIWNhbkFkZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TW9EYXRhTGlzdC5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIGMuJE5ld0lubGluZU1vID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmNyZWF0ZU5ld0lubGluZU1vKCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfc2V0RGVmYXVsdEFjY2VzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWNjZXNzID0ge1xuICAgICAgICAgICAgQWRkOiBmYWxzZSxcbiAgICAgICAgICAgIEFkZFRvTGlzdDogZmFsc2UsXG4gICAgICAgICAgICBEZWxldGU6IGZhbHNlLFxuICAgICAgICAgICAgRWRpdDogZmFsc2UsXG4gICAgICAgICAgICBFeHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgUHJpbnQ6IGZhbHNlLFxuICAgICAgICAgICAgUmVmcmVzaDogZmFsc2UsXG4gICAgICAgICAgICBSZW1vdmVGcm9tTGlzdDogZmFsc2UsXG4gICAgICAgICAgICBWaWV3OiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2V4cGFuZE1vKHNlbGVjdGVkTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIGV4cGFuZCk6IHZvaWQge1xuICAgICAgICBzZWxlY3RlZE1vLiRFeHBhbmRlZCA9IGV4cGFuZDtcbiAgICAgICAgc2VsZWN0ZWRNby4kQ2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRNbyhjaGlsZCwgZXhwYW5kKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5kZXhPZklkKGlkKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBpZCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5kZXhPZk1vKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXMuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfaW5kZXhPZlNlbGVjdGVkKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy4kSXNDaGVja2VkKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9nZXRJbmRleChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfc2V0SW5saW5lRWRpdCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5zZXRJbmxpbmVFZGl0KHZhbHVlKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9yZWFkVmlld1NldHRpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlld1NldHRpbmcgPSB0aGlzLmNvbnRleHQuU2V0dGluZy5DbGFzc05hbWVzLkN1c3RvbVVpPy5QYXJhbWV0ZXJzO1xuICAgIH1cbiAgICAvLyBwcm90ZWN0ZWQgX21vRGF0YUxpc3RDaGFuZ2VkKG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xuICAgIC8vICAgICBzdXBlci5fbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk7XG4gICAgLy8gICAgIGlmICh0aGlzLl9pbmxpbmVFZGl0TW9kZSkge1xuICAgIC8vICAgICAgICAgY29uc3QgY2hlY2tlZE1vSW5kZXggPSBtb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy4kSXNDaGVja2VkKTtcblxuICAgIC8vICAgICAgICAgaWYgKGNoZWNrZWRNb0luZGV4ID4gLTEpIHtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjaGVja2VkTW8gPSBtb0RhdGFMaXN0W2NoZWNrZWRNb0luZGV4XTtcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2hlY2tlZE1vLklkICE9PSB0aGlzLmZvcm1QYW5lbEN0cmxyLk1vLklkKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuX2lubGluZUVkaXRvckRlc3Ryb3lGb3JtUGFuZWxDdHJscigpO1xuICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLl9pbmxpbmVFZGl0Q3JlYXRlRm9ybVBhbmVsQ3RybHIoY2hlY2tlZE1vLCBjaGVja2VkTW9JbmRleCk7XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJvdGVjdGVkIF9zZXRWaXNpYmlsaXR5KFxuICAgICAgICBleHBhbmQ6IGJvb2xlYW4sXG4gICAgICAgIG1vOiBhbnkgLy9NZXRhb2JqZWN0RGF0YU1vZGVsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIG1vLiRDaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLiRWaXNpYmlsaXR5ID0gZXhwYW5kO1xuICAgICAgICAgICAgaWYgKGNoaWxkLiRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHkoZXhwYW5kLCBjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHByb3RlY3RlZCBfc2V0TmV3SW5saW5lTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnNldE5ld0lubGluZU1vKG1vKTtcbiAgICAvLyB9XG4gICAgLy8gcHJvdGVjdGVkIF9pbmxpbmVFZGl0UHJlcGFyZU5ld01vKCk6IE1ldGFvYmplY3REYXRhTW9kZWwge1xuICAgIC8vIGNvbnN0IG5ld01vID0gZ2V0TmV3TW9HcmlkRWRpdG9yKHRoaXMuZm9ybVNldHRpbmcsIHRoaXMuX3R5cGVEZWZJZCk7XG4gICAgLy8gbmV3TW8uSWQgPSBnZXRVbmlxdWVJZCgzKTtcbiAgICAvLyBpZiAodGhpcy5faXNDb21wb3NpdGUoKSkge1xuICAgIC8vICAgICBjb25zdCByZWxhdGlvbiA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMuY29udGV4dC5TZXR0aW5nLCAnRXh0cmEuUmVsYXRpb24nKTtcbiAgICAvLyAgICAgbmV3TW9bcmVsYXRpb24uUGFyZW50RmROYW1lXSA9IHJlbGF0aW9uLlBhcmVudE1vSWQ7XG4gICAgLy8gfVxuICAgIC8vICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gWy4uLnRoaXMubW9EYXRhTGlzdCwgbmV3TW8gYXMgTWV0YW9iamVjdERhdGFNb2RlbF07XG4gICAgLy8gICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UucmVTZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xuICAgIC8vIEJhcnNhQXBpLlVsLkFwcGxpY2F0aW9uQ3RybHIuZmlyZUV2ZW50KFxuICAgIC8vICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5FdmVudEVudW0uR2xvYmFsUmVwb3J0TW9BZGQsXG4gICAgLy8gICB0aGlzLmNvbnRleHQsXG4gICAgLy8gICByZXBvcnRFdmVudE1vQWRkXG4gICAgLy8gKTtcbiAgICAvLyAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KCdSZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QnLCBuZXdNb0RhdGFMaXN0KTtcbiAgICAvLyAgICByZXR1cm4gbmV3TW8gYXMgTWV0YW9iamVjdERhdGFNb2RlbDtcbiAgICAvLyB9XG4gICAgcHJvdGVjdGVkIF9hZGRJbmxpbmVNb1RvTW9kYXRhTGlzdChuZXdJbmxpbmVNbzogTWV0YW9iamVjdERhdGFNb2RlbCwgc2VsZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IFsuLi50aGlzLm1vRGF0YUxpc3QsIHsgLi4ubmV3SW5saW5lTW8sICRJc0NoZWNrZWQ6IHNlbGVjdCB9XTtcbiAgICAgICAgdGhpcy5fcmVzZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jvd0NoZWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBpbmRleDogbnVtYmVyLCBzZWxlY3RlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVkaXRNb2RlID0gdGhpcy5faW5saW5lRWRpdE1vZGUgJiYgdGhpcy5fYWxsb3dJbmxpbmVFZGl0O1xuICAgICAgICBpZiAobW8uJElzQ2hlY2tlZCAmJiBlZGl0TW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoZWRpdE1vZGUpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLlNJTkdMRTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGVja2VkID0gIW1vLiRJc0NoZWNrZWQgfHwgc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMucm93SG92ZXJhYmxlID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxlY3Rpb25Nb2RlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnICYmIGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb0NoZWNrZWRBbGwoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXROZXdJbmxpbmVNbyhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRWYWx1ZUlubGluZU1vKG1vKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB0aGlzLl9kZXNlbGVjdChtbywgaW5kZXgpO1xuICAgIH1cbiAgICAvLyBwcm90ZWN0ZWQgX3NldFZhbHVlSW5saW5lTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAvLyAgICAgLy8gdGhpcy5mb3JtUGFuZWxDdHJsci5TZXRWYWx1ZSh7IC4uLm1vLCAkVHlwZURlZklkOiB0aGlzLl90eXBlRGVmSWQgfSk7XG4gICAgLy8gfVxuXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0b3JEZXN0cm95Rm9ybVBhbmVsQ3RybHIoKTogdm9pZCB7XG4gICAgICAgIC8vIGlmICh0aGlzLmZvcm1QYW5lbEN0cmxyKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybVBhbmVsQ3RybHIuRGVzdHJveSgpO1xuICAgICAgICAvLyAgICAgdGhpcy5mb3JtUGFuZWxDdHJsciA9IG51bGw7XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF93aW5kb3dSZXNpemVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRDb250YWluZXJXaWR0aCgpO1xuICAgICAgICB0aGlzLl9zZXRQYXJlbnRIZWlnaHQoKTtcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zZXRDb250YWluZXJXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGhTb3VyY2UkLm5leHQoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGV2aWNlU2l6ZUNoYW5nZWQoZGV2aWNlU2l6ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbE5hdGl2ZUVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLl9pbmxpbmVFZGl0TW9kZSB8fCBkZXZpY2VTaXplID09PSAnbCcgfHwgZGV2aWNlU2l6ZSA9PT0gJ3hsJykge1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLm5leHQoW10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JpZFNpemUgPSBnZXRDb250cm9sU2l6ZU1vZGUoZWxOYXRpdmVFbGVtZW50LCBkZXZpY2VTaXplKTtcbiAgICAgICAgbGV0IGRldmljZU5hbWU6IERldmljZVNpemUgPSAnZGVza3RvcCc7XG4gICAgICAgIHRoaXMuYWxsQ29sdW1uc1xuICAgICAgICAgICAgPy5maWx0ZXIoKGMpID0+ICFjLkhpZGRlbilcbiAgICAgICAgICAgIC5mb3JFYWNoKChjKSA9PiAoYy4kVGV4dFdpZHRoID0gYy4kVGV4dFdpZHRoID8gYy4kVGV4dFdpZHRoIDogdGhpcy5fZ2V0V2lkdGgoYy5BbGlhcykgKyAxMCkpO1xuXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnNXaWR0aCA9IHRoaXMuYWxsQ29sdW1ucy5tYXAoKGNvbHVtbikgPT5cbiAgICAgICAgICAgIGNvbHVtbi4kVGV4dFdpZHRoICYmIGNvbHVtbi5XaWR0aCA+IGNvbHVtbi4kVGV4dFdpZHRoID8gY29sdW1uLldpZHRoIDogY29sdW1uLiRUZXh0V2lkdGggfHwgY29sdW1uLldpZHRoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW10gPSB0aGlzLl92aXNpYmxlQ29sdW1uc1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAodmlzaWJsZUNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UubmV4dChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbHVtbnNDb3VudCA9IHZpc2libGVDb2x1bW5zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZ3JpZFNldHRpbmdzID0gdGhpcy5ncmlkU2V0dGluZ1NvdXJjZS5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBncm91cGVkQ29sdW1ucyA9IGdyaWRTZXR0aW5ncy5Tb3J0U2V0dGluZ0xpc3QuZmlsdGVyKChkKSA9PiBkLklzR3JvdXBlZCk7XG4gICAgICAgIGNvbnN0IG5hbWVHcm91cGVkQ29sdW1ucyA9IGdyb3VwZWRDb2x1bW5zLm1hcCgoYykgPT4gYy5OYW1lKTtcbiAgICAgICAgY29uc3QgY29sV2lkdGhTZXR0aW5ncyA9IGdyaWRTZXR0aW5ncz8uQ29sU2V0dGluZ0xpc3Q/LmZpbHRlcihcbiAgICAgICAgICAgIChjKSA9PiBuYW1lR3JvdXBlZENvbHVtbnMuaW5kZXhPZihjLk5hbWUpID09PSAtMVxuICAgICAgICApLm1hcCgoYykgPT4gYy5XaWR0aCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaWR0aDogbnVtYmVyW10gPSBjb2xXaWR0aFNldHRpbmdzPy5sZW5ndGggPyBjb2xXaWR0aFNldHRpbmdzIDogYWxsQ29sdW1uc1dpZHRoO1xuICAgICAgICBsZXQgc3VtQ29sV2lkdGggPSAwO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LlZpZXdTZXR0aW5nPy5Jc0NoZWNrTGlzdCkge1xuICAgICAgICAgICAgc3VtQ29sV2lkdGggKz0gMTU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5TZXR0aW5nPy5FeHRyYT8uRGVmYXVsdENvbW1hbmRzQWNjZXNzPy5WaWV3KSB7XG4gICAgICAgICAgICBzdW1Db2xXaWR0aCArPSAzMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNEZXRhaWxzSW5Sb3cpIHtcbiAgICAgICAgICAgIHN1bUNvbFdpZHRoICs9IDIxMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGVsTmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgc3dpdGNoIChncmlkU2l6ZSkge1xuICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICBjYXNlICd4bCc6XG4gICAgICAgICAgICAgICAgZGV2aWNlTmFtZSA9ICdkZXNrdG9wJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIGRldmljZU5hbWUgPSAnbW9iaWxlJztcbiAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgZGV2aWNlTmFtZSA9ICd0YWJsZXQnO1xuICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGV2aWNlTmFtZVNvdXJjZS5uZXh0KGRldmljZU5hbWUpO1xuXG4gICAgICAgIGlmIChjb2x1bW5zV2lkdGgubGVuZ3RoID4gMCAmJiBjb250YWluZXJXaWR0aCA+IDAgJiYgZGV2aWNlU2l6ZSAhPT0gJ3MnKSB7XG4gICAgICAgICAgICBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XG4gICAgICAgICAgICBjb2x1bW5zV2lkdGguZm9yRWFjaCgod2lkdGg6IG51bWJlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3VtQ29sV2lkdGggKyB3aWR0aCA+IGNvbnRhaW5lcldpZHRoICYmIGNvbHVtbnNDb3VudCA9PT0gdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdW1Db2xXaWR0aCArPSB3aWR0aDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlY0NvbHVtbnMgPSB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKHZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0Rpc2FibGVSZXNwb25zaXZlSW5EZXNrdG9wKCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0Rpc2FibGVSZXNwb25zaXZlSW5Nb2JpbGUoKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX2lzRGlzYWJsZVJlc3BvbnNpdmVJblRhYmxldCgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VjQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLm5leHQoW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sdW1uc0NvdW50ID09IDApIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLm5leHQodmlzaWJsZUNvbHVtbnMuc2xpY2UoY29sdW1uc0NvdW50LCB2aXNpYmxlQ29sdW1ucy5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2lzRGlzYWJsZVJlc3BvbnNpdmVJbkRlc2t0b3AoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlzRGVza3RvcCA9IGdldERldmljZUlzRGVza3RvcCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U2V0dGluZz8uRGlzYWJsZVJlc3BvbnNpdmVJbkRlc2t0b3AgJiYgaXNEZXNrdG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2lzRGlzYWJsZVJlc3BvbnNpdmVJblRhYmxldCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNUYWJsZXQgPSBnZXREZXZpY2VJc1RhYmxldCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U2V0dGluZz8uRGlzYWJsZVJlc3BvbnNpdmVJblRhYmxldCAmJiBpc1RhYmxldDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9pc0Rpc2FibGVSZXNwb25zaXZlSW5Nb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlzTW9iaWxlID0gZ2V0RGV2aWNlSXNNb2JpbGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1NldHRpbmc/LkRpc2FibGVSZXNwb25zaXZlSW5Nb2JpbGUgJiYgaXNNb2JpbGU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfb3BlblNldHRpbmdzKG5hbWUsIGRldmljZTogRGV2aWNlU2l6ZSk6IHZvaWQge1xuICAgICAgICBsZXQgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPGFueT4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdjb2x1bW5zJzpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBVbHZDb2x1bW5TZXR0aW5nc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdlNvcnRTZXR0aW5nc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwYnknOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdkdyb3VwYnlTZXR0aW5nc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxuICAgICAgICAgICAgZGF0YTogeyBjb250ZXh0OiB0aGlzLmNvbnRleHQgfSxcbiAgICAgICAgICAgIG1vYmlsZTogZGV2aWNlID09PSAnbW9iaWxlJyxcbiAgICAgICAgICAgIG1pbldpZHRoOiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluV2lkdGgsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnYXV0bycgOiB0aGlzLmRpYWxvZ0NvbmZpZy5taW5IZWlnaHQsXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnMTAwJScgOiB0aGlzLmRpYWxvZ0NvbmZpZy5tYXhIZWlnaHQsXG4gICAgICAgICAgICBtYXhXaWR0aDogZGV2aWNlID09PSAnbW9iaWxlJyA/ICcxMDAlJyA6IHRoaXMuZGlhbG9nQ29uZmlnLm1heFdpZHRoXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbihjb21wb25lbnQsIGNvbmZpZyk7XG4gICAgICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoc2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU29ydENoYW5nZWQgPSBuYW1lID09PSAnc29ydCcgfHwgbmFtZSA9PT0gJ2dyb3VwYnknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTZXR0aW5nKHNldHRpbmcsIGlzU29ydENoYW5nZWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQubW9EYXRhTGlzdCA9IHRoaXMuZ3JpZERhdGFTb3VyY2UucmVzdWx0SXRlbXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIF9zaG93RmlsdGVyU2V0dGluZyhzZWxlY3RlZENvbHVtbjogUmVwb3J0Vmlld0NvbHVtbik6IHZvaWQge1xuICAgICAgICBjb25zdCB0eXBlRGVmSWQgPSB0aGlzLl90eXBlRGVmSWQ7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzSW5mbyQgPSB0aGlzLl91bHZNYWluU2VydmljZS5sb2FkTWV0YUNvbmRpdGlvbnNDb250cm9sSW5mb3MoXG4gICAgICAgICAgICB0eXBlRGVmSWQsXG4gICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMubWFwKChjKSA9PiBjLk5hbWUpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzSW5mbyQsXG4gICAgICAgICAgICAgICAgdHlwZURlZklkLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1uTmFtZTogc2VsZWN0ZWRDb2x1bW4uTmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKFVsdkZpbHRlclNldHRpbmdzQ29tcG9uZW50LCBjb25maWcpO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoc2V0dGluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfYWRkU29ydENvbHVtbihuYW1lOiBhbnksIHNvcnREaXJlY3Rpb246IHN0cmluZywgaXNHcm91cGVkID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSB7XG4gICAgICAgICAgICBOYW1lOiBuYW1lLFxuICAgICAgICAgICAgU29ydERpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICAgICAgICAgIElzR3JvdXBlZDogaXNHcm91cGVkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0R3JpZFNldHRpbmdzKHRoaXMuY29udGV4dCk7XG4gICAgICAgIGNvbnN0IGV4aXN0U29ydEl0ZW1JbmRleCA9IHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuTmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChleGlzdFNvcnRJdGVtSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0ID0gW3NvcnRJdGVtLCAuLi5zZXR0aW5ncy5Tb3J0U2V0dGluZ0xpc3RdO1xuICAgICAgICAgICAgc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0LnNwbGljZShleGlzdFNvcnRJdGVtSW5kZXggKyAxLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdC5wdXNoKHNvcnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTZXR0aW5nKHNldHRpbmdzLCB0cnVlKTtcbiAgICB9XG59XG4iXX0=