@alfresco/aca-content 5.1.1 → 5.2.0

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 (396) hide show
  1. package/assets/app.extensions.json +9 -0
  2. package/assets/i18n/ar.json +600 -599
  3. package/assets/i18n/cs.json +600 -599
  4. package/assets/i18n/da.json +600 -599
  5. package/assets/i18n/de.json +600 -599
  6. package/assets/i18n/en.json +40 -1
  7. package/assets/i18n/es.json +600 -599
  8. package/assets/i18n/fi.json +600 -599
  9. package/assets/i18n/fr.json +600 -599
  10. package/assets/i18n/it.json +600 -599
  11. package/assets/i18n/ja.json +600 -599
  12. package/assets/i18n/nb.json +600 -599
  13. package/assets/i18n/nl.json +600 -599
  14. package/assets/i18n/pl.json +600 -599
  15. package/assets/i18n/pt-BR.json +600 -599
  16. package/assets/i18n/ru.json +600 -599
  17. package/assets/i18n/sv.json +600 -599
  18. package/assets/i18n/zh-CN.json +600 -599
  19. package/esm2022/about/about.component.mjs +70 -0
  20. package/esm2022/about/aca-about.module.mjs +47 -0
  21. package/esm2022/folder-rules/folder-rules.module.mjs +116 -0
  22. package/esm2022/folder-rules/manage-rules/manage-rules.smart-component.mjs +280 -0
  23. package/esm2022/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +117 -0
  24. package/esm2022/folder-rules/rule-details/actions/rule-action.ui-component.mjs +359 -0
  25. package/esm2022/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +171 -0
  26. package/esm2022/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +237 -0
  27. package/esm2022/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +80 -0
  28. package/esm2022/folder-rules/rule-details/options/rule-options.ui-component.mjs +129 -0
  29. package/esm2022/folder-rules/rule-details/rule-details.ui-component.mjs +192 -0
  30. package/esm2022/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +87 -0
  31. package/esm2022/folder-rules/rule-details/validators/rule-actions.validator.mjs +36 -0
  32. package/esm2022/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +166 -0
  33. package/esm2022/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +80 -0
  34. package/esm2022/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +59 -0
  35. package/esm2022/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +125 -0
  36. package/esm2022/folder-rules/services/actions.service.mjs +117 -0
  37. package/esm2022/folder-rules/services/folder-rule-sets.service.mjs +230 -0
  38. package/esm2022/folder-rules/services/folder-rules.service.mjs +195 -0
  39. package/esm2022/lib/aca-content.module.mjs +303 -0
  40. package/esm2022/lib/aca-content.routes.mjs +369 -0
  41. package/esm2022/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +82 -0
  42. package/{esm2020 → esm2022}/lib/components/common/language-picker/language-picker.component.mjs +9 -8
  43. package/esm2022/lib/components/common/location-link/location-link.component.mjs +182 -0
  44. package/{esm2020 → esm2022}/lib/components/common/logout/logout.component.mjs +8 -6
  45. package/esm2022/lib/components/common/toggle-shared/toggle-shared.component.mjs +81 -0
  46. package/esm2022/lib/components/common/user-info/user-info.component.mjs +46 -0
  47. package/esm2022/lib/components/context-menu/base-context-menu.directive.mjs +77 -0
  48. package/esm2022/lib/components/context-menu/context-menu-item.component.mjs +65 -0
  49. package/esm2022/lib/components/context-menu/context-menu-outside-event.directive.mjs +62 -0
  50. package/esm2022/lib/components/context-menu/context-menu-overlay.mjs +33 -0
  51. package/esm2022/lib/components/context-menu/context-menu.component.mjs +84 -0
  52. package/esm2022/lib/components/context-menu/context-menu.service.mjs +127 -0
  53. package/esm2022/lib/components/context-menu/custom-context-menu-actions.token.mjs +26 -0
  54. package/esm2022/lib/components/context-menu/custom-context-menu.component.mjs +79 -0
  55. package/esm2022/lib/components/details/details.component.mjs +154 -0
  56. package/esm2022/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +75 -0
  57. package/esm2022/lib/components/dl-custom-components/name-column/name-column.component.mjs +106 -0
  58. package/esm2022/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +52 -0
  59. package/esm2022/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +77 -0
  60. package/esm2022/lib/components/favorite-libraries/favorite-libraries.component.mjs +126 -0
  61. package/esm2022/lib/components/favorites/favorites.component.mjs +105 -0
  62. package/esm2022/lib/components/files/files.component.mjs +336 -0
  63. package/esm2022/lib/components/home/home.component.mjs +46 -0
  64. package/esm2022/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +62 -0
  65. package/esm2022/lib/components/info-drawer/info.drawer.module.mjs +74 -0
  66. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +213 -0
  67. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +47 -0
  68. package/esm2022/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +145 -0
  69. package/esm2022/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +107 -0
  70. package/esm2022/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +135 -0
  71. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +181 -0
  72. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +77 -0
  73. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +210 -0
  74. package/esm2022/lib/components/libraries/libraries.component.mjs +81 -0
  75. package/esm2022/lib/components/recent-files/recent-files.component.mjs +80 -0
  76. package/esm2022/lib/components/search/search-action-menu/search-action-menu.component.mjs +66 -0
  77. package/esm2022/lib/components/search/search-input/search-input.component.mjs +297 -0
  78. package/esm2022/lib/components/search/search-input-control/search-input-control.component.mjs +94 -0
  79. package/esm2022/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +93 -0
  80. package/esm2022/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +155 -0
  81. package/esm2022/lib/components/search/search-navigation.service.mjs +62 -0
  82. package/esm2022/lib/components/search/search-results/search-results.component.mjs +279 -0
  83. package/esm2022/lib/components/search/search-results-row/search-results-row.component.mjs +149 -0
  84. package/esm2022/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.mjs +82 -0
  85. package/esm2022/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.mjs +116 -0
  86. package/esm2022/lib/components/search/search-save/dialog/save-search-dialog.component.mjs +125 -0
  87. package/esm2022/lib/components/search/search-save/dialog/saved-search-form.interface.mjs +25 -0
  88. package/esm2022/lib/components/search/search-save/dialog/unique-search-name-validator.mjs +45 -0
  89. package/esm2022/lib/components/search/search-save/directive/save-search.directive.mjs +64 -0
  90. package/esm2022/lib/components/search/search-save/list/saved-searches-list-ui.service.mjs +51 -0
  91. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.mjs +44 -0
  92. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.mjs +50 -0
  93. package/esm2022/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.mjs +153 -0
  94. package/esm2022/lib/components/search/search-save/sidenav/save-search-sidenav.component.mjs +94 -0
  95. package/esm2022/lib/components/shared-files/shared-files.component.mjs +85 -0
  96. package/esm2022/lib/components/shared-link-view/shared-link-view.component.mjs +89 -0
  97. package/esm2022/lib/components/sidenav/components/button-menu.component.mjs +66 -0
  98. package/esm2022/lib/components/sidenav/components/expand-menu.component.mjs +73 -0
  99. package/esm2022/lib/components/sidenav/components/sidenav-header.component.mjs +65 -0
  100. package/esm2022/lib/components/sidenav/directives/action.directive.mjs +86 -0
  101. package/esm2022/lib/components/sidenav/directives/active-link.directive.mjs +100 -0
  102. package/esm2022/lib/components/sidenav/directives/expansion-panel.directive.mjs +107 -0
  103. package/esm2022/lib/components/sidenav/directives/menu-panel.directive.mjs +103 -0
  104. package/esm2022/lib/components/sidenav/sidenav.component.mjs +101 -0
  105. package/esm2022/lib/components/sidenav/user-menu/user-menu.component.mjs +57 -0
  106. package/esm2022/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +143 -0
  107. package/esm2022/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +91 -0
  108. package/esm2022/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +112 -0
  109. package/esm2022/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +77 -0
  110. package/esm2022/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +107 -0
  111. package/{esm2020 → esm2022}/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.mjs +7 -6
  112. package/esm2022/lib/components/toolbar/view-node/view-node.component.mjs +128 -0
  113. package/esm2022/lib/components/trashcan/trashcan.component.mjs +66 -0
  114. package/esm2022/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +55 -0
  115. package/esm2022/lib/components/view-profile/view-profile.component.mjs +200 -0
  116. package/esm2022/lib/dialogs/node-template/create-from-template.dialog.mjs +127 -0
  117. package/esm2022/lib/directives/document-list.directive.mjs +207 -0
  118. package/esm2022/lib/extensions/core.extensions.module.mjs +56 -0
  119. package/esm2022/lib/services/content-management.service.mjs +892 -0
  120. package/esm2022/lib/services/content-url.service.mjs +74 -0
  121. package/esm2022/lib/services/modal-ai.service.mjs +65 -0
  122. package/esm2022/lib/services/node-actions.service.mjs +609 -0
  123. package/esm2022/lib/services/node-template.service.mjs +145 -0
  124. package/esm2022/lib/services/search-ai-navigation.service.mjs +63 -0
  125. package/esm2022/lib/store/app-store.module.mjs +101 -0
  126. package/esm2022/lib/store/effects/app.effects.mjs +46 -0
  127. package/esm2022/lib/store/effects/contextmenu.effects.mjs +65 -0
  128. package/esm2022/lib/store/effects/download.effects.mjs +153 -0
  129. package/esm2022/lib/store/effects/favorite.effects.mjs +72 -0
  130. package/esm2022/lib/store/effects/library.effects.mjs +108 -0
  131. package/esm2022/lib/store/effects/node.effects.mjs +318 -0
  132. package/esm2022/lib/store/effects/search-ai.effects.mjs +54 -0
  133. package/esm2022/lib/store/effects/search.effects.mjs +52 -0
  134. package/esm2022/lib/store/effects/template.effects.mjs +116 -0
  135. package/esm2022/lib/store/effects/upload.effects.mjs +166 -0
  136. package/esm2022/lib/store/effects/viewer.effects.mjs +169 -0
  137. package/esm2022/lib/utils/aca-search-utils.mjs +129 -0
  138. package/esm2022/ms-office/actions/aos.actions.mjs +32 -0
  139. package/esm2022/ms-office/aos-extension.module.mjs +53 -0
  140. package/esm2022/ms-office/aos-extension.service.mjs +136 -0
  141. package/esm2022/ms-office/effects/aos.effects.mjs +45 -0
  142. package/esm2022/public-api.mjs +33 -0
  143. package/esm2022/viewer/lib/components/preview/preview.component.mjs +246 -0
  144. package/esm2022/viewer/lib/components/viewer/viewer.component.mjs +261 -0
  145. package/esm2022/viewer/lib/services/viewer.service.mjs +229 -0
  146. package/esm2022/viewer/lib/viewer.module.mjs +53 -0
  147. package/{fesm2015 → fesm2022}/alfresco-aca-content-about.mjs +17 -19
  148. package/fesm2022/alfresco-aca-content-about.mjs.map +1 -0
  149. package/{fesm2020 → fesm2022}/alfresco-aca-content-folder-rules.mjs +357 -316
  150. package/fesm2022/alfresco-aca-content-folder-rules.mjs.map +1 -0
  151. package/{fesm2020 → fesm2022}/alfresco-aca-content-ms-office.mjs +28 -26
  152. package/fesm2022/alfresco-aca-content-ms-office.mjs.map +1 -0
  153. package/{fesm2020 → fesm2022}/alfresco-aca-content-viewer.mjs +95 -64
  154. package/fesm2022/alfresco-aca-content-viewer.mjs.map +1 -0
  155. package/fesm2022/alfresco-aca-content.mjs +11091 -0
  156. package/fesm2022/alfresco-aca-content.mjs.map +1 -0
  157. package/folder-rules/rule-details/actions/rule-action-list.ui-component.d.ts +1 -1
  158. package/folder-rules/rule-details/actions/rule-action.ui-component.d.ts +1 -1
  159. package/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.d.ts +1 -1
  160. package/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.d.ts +1 -1
  161. package/folder-rules/rule-details/options/rule-options.ui-component.d.ts +1 -1
  162. package/folder-rules/rule-details/rule-details.ui-component.d.ts +1 -1
  163. package/folder-rules/rule-list/rule-list/rule-list.ui-component.d.ts +1 -1
  164. package/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.d.ts +1 -1
  165. package/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.d.ts +1 -1
  166. package/folder-rules/services/folder-rule-sets.service.d.ts +4 -4
  167. package/folder-rules/services/folder-rules.service.d.ts +1 -1
  168. package/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.d.ts +5 -10
  169. package/lib/components/common/location-link/location-link.component.d.ts +1 -1
  170. package/lib/components/common/toggle-shared/toggle-shared.component.d.ts +1 -1
  171. package/lib/components/context-menu/base-context-menu.directive.d.ts +20 -0
  172. package/lib/components/context-menu/context-menu-item.component.d.ts +1 -1
  173. package/lib/components/context-menu/context-menu-outside-event.directive.d.ts +1 -1
  174. package/lib/components/context-menu/context-menu.component.d.ts +4 -15
  175. package/lib/components/context-menu/context-menu.service.d.ts +4 -1
  176. package/lib/components/{knowledge-retrieval/search-ai/search-ai-utils.d.ts → context-menu/custom-context-menu-actions.token.d.ts} +2 -2
  177. package/lib/components/context-menu/custom-context-menu.component.d.ts +36 -0
  178. package/lib/components/details/details.component.d.ts +1 -1
  179. package/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.d.ts +1 -1
  180. package/lib/components/dl-custom-components/tags-column/tags-column.component.d.ts +1 -1
  181. package/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.d.ts +1 -1
  182. package/lib/components/info-drawer/comments-tab/comments-tab.component.d.ts +1 -1
  183. package/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.d.ts +1 -1
  184. package/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.d.ts +1 -1
  185. package/lib/components/info-drawer/metadata-tab/metadata-tab.component.d.ts +1 -1
  186. package/lib/components/info-drawer/versions-tab/versions-tab.component.d.ts +1 -1
  187. package/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.d.ts +1 -2
  188. package/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.d.ts +4 -5
  189. package/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.d.ts +8 -8
  190. package/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.d.ts +2 -3
  191. package/lib/components/search/search-input/search-input.component.d.ts +12 -14
  192. package/lib/components/search/search-input-control/search-input-control.component.d.ts +1 -1
  193. package/lib/components/search/search-libraries-results/search-libraries-results.component.d.ts +0 -1
  194. package/lib/components/search/search-results/search-results.component.d.ts +15 -9
  195. package/lib/components/search/search-results-row/search-results-row.component.d.ts +1 -1
  196. package/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.d.ts +16 -0
  197. package/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.d.ts +22 -0
  198. package/lib/components/search/search-save/dialog/save-search-dialog.component.d.ts +23 -0
  199. package/lib/components/search/search-save/dialog/saved-search-form.interface.d.ts +28 -0
  200. package/lib/components/search/search-save/dialog/unique-search-name-validator.d.ts +34 -0
  201. package/lib/components/search/search-save/directive/save-search.directive.d.ts +13 -0
  202. package/lib/components/search/search-save/list/saved-searches-list-ui.service.d.ts +9 -0
  203. package/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.d.ts +33 -0
  204. package/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.d.ts +13 -0
  205. package/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.d.ts +66 -0
  206. package/lib/components/search/search-save/sidenav/save-search-sidenav.component.d.ts +44 -0
  207. package/lib/components/sidenav/components/button-menu.component.d.ts +1 -1
  208. package/lib/components/sidenav/components/expand-menu.component.d.ts +3 -2
  209. package/lib/components/sidenav/directives/action.directive.d.ts +28 -1
  210. package/lib/components/sidenav/directives/active-link.directive.d.ts +2 -2
  211. package/lib/components/sidenav/directives/expansion-panel.directive.d.ts +1 -1
  212. package/lib/components/sidenav/directives/menu-panel.directive.d.ts +1 -1
  213. package/lib/components/sidenav/sidenav.component.d.ts +4 -3
  214. package/lib/components/sidenav/user-menu/user-menu.component.d.ts +1 -1
  215. package/lib/components/toolbar/toggle-favorite/toggle-favorite.component.d.ts +1 -1
  216. package/lib/components/toolbar/view-node/view-node.component.d.ts +1 -1
  217. package/lib/services/search-ai-navigation.service.d.ts +4 -2
  218. package/lib/store/effects/app.effects.d.ts +2 -3
  219. package/lib/store/effects/contextmenu.effects.d.ts +3 -3
  220. package/lib/store/effects/download.effects.d.ts +0 -30
  221. package/lib/store/effects/favorite.effects.d.ts +0 -28
  222. package/lib/store/effects/library.effects.d.ts +2 -7
  223. package/lib/store/effects/node.effects.d.ts +7 -38
  224. package/lib/store/effects/search-ai.effects.d.ts +0 -4
  225. package/lib/store/effects/search.effects.d.ts +3 -30
  226. package/lib/store/effects/template.effects.d.ts +5 -7
  227. package/lib/store/effects/upload.effects.d.ts +8 -32
  228. package/lib/store/effects/viewer.effects.d.ts +0 -29
  229. package/lib/utils/aca-search-utils.d.ts +67 -0
  230. package/ms-office/effects/aos.effects.d.ts +0 -3
  231. package/package.json +21 -35
  232. package/public-api.d.ts +1 -0
  233. package/ui/overrides/adf-pagination.theme.scss +0 -4
  234. package/ui/theme.scss +9 -4
  235. package/assets/images/agent-avatar-blue.png +0 -0
  236. package/assets/images/agent-avatar-gold.png +0 -0
  237. package/assets/images/agent-avatar-pink.png +0 -0
  238. package/esm2020/about/about.component.mjs +0 -71
  239. package/esm2020/about/aca-about.module.mjs +0 -46
  240. package/esm2020/folder-rules/folder-rules.module.mjs +0 -115
  241. package/esm2020/folder-rules/manage-rules/manage-rules.smart-component.mjs +0 -261
  242. package/esm2020/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +0 -117
  243. package/esm2020/folder-rules/rule-details/actions/rule-action.ui-component.mjs +0 -351
  244. package/esm2020/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +0 -172
  245. package/esm2020/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +0 -234
  246. package/esm2020/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +0 -74
  247. package/esm2020/folder-rules/rule-details/options/rule-options.ui-component.mjs +0 -129
  248. package/esm2020/folder-rules/rule-details/rule-details.ui-component.mjs +0 -185
  249. package/esm2020/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +0 -88
  250. package/esm2020/folder-rules/rule-details/validators/rule-actions.validator.mjs +0 -37
  251. package/esm2020/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +0 -164
  252. package/esm2020/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +0 -81
  253. package/esm2020/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +0 -58
  254. package/esm2020/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +0 -120
  255. package/esm2020/folder-rules/services/actions.service.mjs +0 -114
  256. package/esm2020/folder-rules/services/folder-rule-sets.service.mjs +0 -225
  257. package/esm2020/folder-rules/services/folder-rules.service.mjs +0 -193
  258. package/esm2020/lib/aca-content.module.mjs +0 -299
  259. package/esm2020/lib/aca-content.routes.mjs +0 -359
  260. package/esm2020/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +0 -83
  261. package/esm2020/lib/components/common/location-link/location-link.component.mjs +0 -180
  262. package/esm2020/lib/components/common/toggle-shared/toggle-shared.component.mjs +0 -76
  263. package/esm2020/lib/components/common/user-info/user-info.component.mjs +0 -47
  264. package/esm2020/lib/components/context-menu/context-menu-item.component.mjs +0 -62
  265. package/esm2020/lib/components/context-menu/context-menu-outside-event.directive.mjs +0 -63
  266. package/esm2020/lib/components/context-menu/context-menu-overlay.mjs +0 -32
  267. package/esm2020/lib/components/context-menu/context-menu.component.mjs +0 -114
  268. package/esm2020/lib/components/context-menu/context-menu.service.mjs +0 -99
  269. package/esm2020/lib/components/details/details.component.mjs +0 -147
  270. package/esm2020/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +0 -71
  271. package/esm2020/lib/components/dl-custom-components/name-column/name-column.component.mjs +0 -101
  272. package/esm2020/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +0 -48
  273. package/esm2020/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +0 -75
  274. package/esm2020/lib/components/favorite-libraries/favorite-libraries.component.mjs +0 -120
  275. package/esm2020/lib/components/favorites/favorites.component.mjs +0 -103
  276. package/esm2020/lib/components/files/files.component.mjs +0 -330
  277. package/esm2020/lib/components/home/home.component.mjs +0 -47
  278. package/esm2020/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +0 -59
  279. package/esm2020/lib/components/info-drawer/info.drawer.module.mjs +0 -73
  280. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +0 -206
  281. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +0 -45
  282. package/esm2020/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +0 -134
  283. package/esm2020/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +0 -95
  284. package/esm2020/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +0 -129
  285. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +0 -171
  286. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +0 -82
  287. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +0 -199
  288. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-utils.mjs +0 -33
  289. package/esm2020/lib/components/libraries/libraries.component.mjs +0 -79
  290. package/esm2020/lib/components/recent-files/recent-files.component.mjs +0 -82
  291. package/esm2020/lib/components/search/search-action-menu/search-action-menu.component.mjs +0 -64
  292. package/esm2020/lib/components/search/search-input/search-input.component.mjs +0 -301
  293. package/esm2020/lib/components/search/search-input-control/search-input-control.component.mjs +0 -94
  294. package/esm2020/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +0 -90
  295. package/esm2020/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +0 -153
  296. package/esm2020/lib/components/search/search-navigation.service.mjs +0 -60
  297. package/esm2020/lib/components/search/search-results/search-results.component.mjs +0 -255
  298. package/esm2020/lib/components/search/search-results-row/search-results-row.component.mjs +0 -142
  299. package/esm2020/lib/components/shared-files/shared-files.component.mjs +0 -83
  300. package/esm2020/lib/components/shared-link-view/shared-link-view.component.mjs +0 -82
  301. package/esm2020/lib/components/sidenav/components/button-menu.component.mjs +0 -62
  302. package/esm2020/lib/components/sidenav/components/expand-menu.component.mjs +0 -67
  303. package/esm2020/lib/components/sidenav/components/sidenav-header.component.mjs +0 -66
  304. package/esm2020/lib/components/sidenav/directives/action.directive.mjs +0 -75
  305. package/esm2020/lib/components/sidenav/directives/active-link.directive.mjs +0 -93
  306. package/esm2020/lib/components/sidenav/directives/expansion-panel.directive.mjs +0 -102
  307. package/esm2020/lib/components/sidenav/directives/menu-panel.directive.mjs +0 -99
  308. package/esm2020/lib/components/sidenav/sidenav.component.mjs +0 -89
  309. package/esm2020/lib/components/sidenav/user-menu/user-menu.component.mjs +0 -56
  310. package/esm2020/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +0 -137
  311. package/esm2020/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +0 -86
  312. package/esm2020/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +0 -107
  313. package/esm2020/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +0 -74
  314. package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +0 -105
  315. package/esm2020/lib/components/toolbar/view-node/view-node.component.mjs +0 -122
  316. package/esm2020/lib/components/trashcan/trashcan.component.mjs +0 -68
  317. package/esm2020/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +0 -52
  318. package/esm2020/lib/components/view-profile/view-profile.component.mjs +0 -193
  319. package/esm2020/lib/dialogs/node-template/create-from-template.dialog.mjs +0 -120
  320. package/esm2020/lib/directives/document-list.directive.mjs +0 -199
  321. package/esm2020/lib/extensions/core.extensions.module.mjs +0 -55
  322. package/esm2020/lib/services/content-management.service.mjs +0 -873
  323. package/esm2020/lib/services/content-url.service.mjs +0 -71
  324. package/esm2020/lib/services/modal-ai.service.mjs +0 -66
  325. package/esm2020/lib/services/node-actions.service.mjs +0 -600
  326. package/esm2020/lib/services/node-template.service.mjs +0 -144
  327. package/esm2020/lib/services/search-ai-navigation.service.mjs +0 -52
  328. package/esm2020/lib/store/app-store.module.mjs +0 -102
  329. package/esm2020/lib/store/effects/app.effects.mjs +0 -49
  330. package/esm2020/lib/store/effects/contextmenu.effects.mjs +0 -55
  331. package/esm2020/lib/store/effects/download.effects.mjs +0 -159
  332. package/esm2020/lib/store/effects/favorite.effects.mjs +0 -76
  333. package/esm2020/lib/store/effects/library.effects.mjs +0 -113
  334. package/esm2020/lib/store/effects/node.effects.mjs +0 -325
  335. package/esm2020/lib/store/effects/search-ai.effects.mjs +0 -57
  336. package/esm2020/lib/store/effects/search.effects.mjs +0 -60
  337. package/esm2020/lib/store/effects/template.effects.mjs +0 -121
  338. package/esm2020/lib/store/effects/upload.effects.mjs +0 -166
  339. package/esm2020/lib/store/effects/viewer.effects.mjs +0 -175
  340. package/esm2020/ms-office/actions/aos.actions.mjs +0 -31
  341. package/esm2020/ms-office/aos-extension.module.mjs +0 -52
  342. package/esm2020/ms-office/aos-extension.service.mjs +0 -132
  343. package/esm2020/ms-office/effects/aos.effects.mjs +0 -48
  344. package/esm2020/public-api.mjs +0 -32
  345. package/esm2020/viewer/lib/components/preview/preview.component.mjs +0 -236
  346. package/esm2020/viewer/lib/components/viewer/viewer.component.mjs +0 -240
  347. package/esm2020/viewer/lib/services/viewer.service.mjs +0 -226
  348. package/esm2020/viewer/lib/viewer.module.mjs +0 -52
  349. package/fesm2015/alfresco-aca-content-about.mjs.map +0 -1
  350. package/fesm2015/alfresco-aca-content-folder-rules.mjs +0 -2662
  351. package/fesm2015/alfresco-aca-content-folder-rules.mjs.map +0 -1
  352. package/fesm2015/alfresco-aca-content-ms-office.mjs +0 -256
  353. package/fesm2015/alfresco-aca-content-ms-office.mjs.map +0 -1
  354. package/fesm2015/alfresco-aca-content-viewer.mjs +0 -700
  355. package/fesm2015/alfresco-aca-content-viewer.mjs.map +0 -1
  356. package/fesm2015/alfresco-aca-content.mjs +0 -9835
  357. package/fesm2015/alfresco-aca-content.mjs.map +0 -1
  358. package/fesm2020/alfresco-aca-content-about.mjs +0 -193
  359. package/fesm2020/alfresco-aca-content-about.mjs.map +0 -1
  360. package/fesm2020/alfresco-aca-content-folder-rules.mjs.map +0 -1
  361. package/fesm2020/alfresco-aca-content-ms-office.mjs.map +0 -1
  362. package/fesm2020/alfresco-aca-content-viewer.mjs.map +0 -1
  363. package/fesm2020/alfresco-aca-content.mjs +0 -9934
  364. package/fesm2020/alfresco-aca-content.mjs.map +0 -1
  365. /package/{esm2020 → esm2022}/about/alfresco-aca-content-about.mjs +0 -0
  366. /package/{esm2020 → esm2022}/about/dev-mode.tokens.mjs +0 -0
  367. /package/{esm2020 → esm2022}/about/package-json.token.mjs +0 -0
  368. /package/{esm2020 → esm2022}/about/public-api.mjs +0 -0
  369. /package/{esm2020 → esm2022}/alfresco-aca-content.mjs +0 -0
  370. /package/{esm2020 → esm2022}/folder-rules/alfresco-aca-content-folder-rules.mjs +0 -0
  371. /package/{esm2020 → esm2022}/folder-rules/folder-rules.rules.mjs +0 -0
  372. /package/{esm2020 → esm2022}/folder-rules/model/action-parameter-constraint.model.mjs +0 -0
  373. /package/{esm2020 → esm2022}/folder-rules/model/rule-action.model.mjs +0 -0
  374. /package/{esm2020 → esm2022}/folder-rules/model/rule-composite-condition.model.mjs +0 -0
  375. /package/{esm2020 → esm2022}/folder-rules/model/rule-grouping-item.model.mjs +0 -0
  376. /package/{esm2020 → esm2022}/folder-rules/model/rule-set.model.mjs +0 -0
  377. /package/{esm2020 → esm2022}/folder-rules/model/rule-simple-condition.model.mjs +0 -0
  378. /package/{esm2020 → esm2022}/folder-rules/model/rule.model.mjs +0 -0
  379. /package/{esm2020 → esm2022}/folder-rules/public-api.mjs +0 -0
  380. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-comparators.mjs +0 -0
  381. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-fields.mjs +0 -0
  382. /package/{esm2020 → esm2022}/folder-rules/rule-details/validators/rule-composite-condition.validator.mjs +0 -0
  383. /package/{esm2020 → esm2022}/lib/components/common/index.mjs +0 -0
  384. /package/{esm2020 → esm2022}/lib/components/context-menu/direction.token.mjs +0 -0
  385. /package/{esm2020 → esm2022}/lib/components/context-menu/interfaces.mjs +0 -0
  386. /package/{esm2020 → esm2022}/lib/components/search/index.mjs +0 -0
  387. /package/{esm2020 → esm2022}/lib/components/sidenav/index.mjs +0 -0
  388. /package/{esm2020 → esm2022}/lib/components/toolbar/index.mjs +0 -0
  389. /package/{esm2020 → esm2022}/lib/components/view-profile/view-profile.guard.mjs +0 -0
  390. /package/{esm2020 → esm2022}/lib/store/effects.mjs +0 -0
  391. /package/{esm2020 → esm2022}/lib/store/initial-state.mjs +0 -0
  392. /package/{esm2020 → esm2022}/lib/store/reducers/app.reducer.mjs +0 -0
  393. /package/{esm2020 → esm2022}/ms-office/alfresco-aca-content-ms-office.mjs +0 -0
  394. /package/{esm2020 → esm2022}/ms-office/public-api.mjs +0 -0
  395. /package/{esm2020 → esm2022}/viewer/alfresco-aca-content-viewer.mjs +0 -0
  396. /package/{esm2020 → esm2022}/viewer/public-api.mjs +0 -0
@@ -0,0 +1,609 @@
1
+ /*!
2
+ * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
3
+ *
4
+ * Alfresco Example Content Application
5
+ *
6
+ * This file is part of the Alfresco Example Content Application.
7
+ * If the software was purchased under a paid Alfresco license, the terms of
8
+ * the paid license agreement will prevail. Otherwise, the software is
9
+ * provided under the following open source license terms:
10
+ *
11
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU Lesser General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU Lesser General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU Lesser General Public License
22
+ * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+ import { Injectable } from '@angular/core';
25
+ import { MatDialog } from '@angular/material/dialog';
26
+ import { Subject, of, zip, from } from 'rxjs';
27
+ import { ThumbnailService, TranslationService } from '@alfresco/adf-core';
28
+ import { AlfrescoApiService, DocumentListService, ContentNodeSelectorComponent, ContentNodeDialogService, NodeAction, ContentService } from '@alfresco/adf-content-services';
29
+ import { SitePaging, NodesApi } from '@alfresco/js-api';
30
+ import { ContentApiService } from '@alfresco/aca-shared';
31
+ import { catchError, map, mergeMap } from 'rxjs/operators';
32
+ import * as i0 from "@angular/core";
33
+ import * as i1 from "@alfresco/adf-content-services";
34
+ import * as i2 from "@alfresco/aca-shared";
35
+ import * as i3 from "@angular/material/dialog";
36
+ import * as i4 from "@alfresco/adf-core";
37
+ class NodeActionsService {
38
+ contentService;
39
+ contentApi;
40
+ dialog;
41
+ documentListService;
42
+ apiService;
43
+ translation;
44
+ thumbnailService;
45
+ contentCopied = new Subject();
46
+ contentMoved = new Subject();
47
+ moveDeletedEntries = [];
48
+ isSitesDestinationAvailable = false;
49
+ _nodesApi;
50
+ get nodesApi() {
51
+ this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
52
+ return this._nodesApi;
53
+ }
54
+ constructor(contentService, contentApi, dialog, documentListService, apiService, translation, thumbnailService) {
55
+ this.contentService = contentService;
56
+ this.contentApi = contentApi;
57
+ this.dialog = dialog;
58
+ this.documentListService = documentListService;
59
+ this.apiService = apiService;
60
+ this.translation = translation;
61
+ this.thumbnailService = thumbnailService;
62
+ }
63
+ /**
64
+ * Copy node list
65
+ *
66
+ * @param contentEntities nodes to copy
67
+ * @param permission permission which is needed to apply the action
68
+ * @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
69
+ */
70
+ copyNodes(contentEntities, permission, focusedElementOnCloseSelector) {
71
+ return this.doBatchOperation(NodeAction.COPY, contentEntities, permission, focusedElementOnCloseSelector);
72
+ }
73
+ /**
74
+ * Move node list
75
+ *
76
+ * @param contentEntities nodes to move
77
+ * @param permission permission which is needed to apply the action
78
+ * @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
79
+ */
80
+ moveNodes(contentEntities, permission, focusedElementOnCloseSelector) {
81
+ return this.doBatchOperation(NodeAction.MOVE, contentEntities, permission, focusedElementOnCloseSelector);
82
+ }
83
+ /**
84
+ * General method for performing the given operation (copy|move) to multiple nodes
85
+ *
86
+ * @param action the action to perform (copy|move)
87
+ * @param contentEntities the contentEntities which have to have the action performed on
88
+ * @param permission permission which is needed to apply the action
89
+ * @param focusedElementOnCloseSelector element's selector which should be autofocused after closing modal
90
+ */
91
+ doBatchOperation(action, contentEntities, permission, focusedElementOnCloseSelector) {
92
+ const observable = new Subject();
93
+ if (!this.isEntryEntitiesArray(contentEntities)) {
94
+ observable.error(new Error(JSON.stringify({ error: { statusCode: 400 } })));
95
+ }
96
+ else if (this.checkPermission(action, contentEntities, permission)) {
97
+ const destinationSelection = this.getContentNodeSelection(action, contentEntities, focusedElementOnCloseSelector);
98
+ destinationSelection.subscribe((selections) => {
99
+ const contentEntry = contentEntities[0].entry;
100
+ // Check if there's nodeId for Shared Files
101
+ const contentEntryId = contentEntry.nodeId || contentEntry.id;
102
+ const type = contentEntry.isFolder ? 'folder' : 'content';
103
+ const batch = [];
104
+ // consider only first item in the selection
105
+ const selection = selections[0];
106
+ let action$;
107
+ if (action === NodeAction.MOVE && contentEntities.length === 1 && type === 'content') {
108
+ action$ = this.documentListService.moveNode(contentEntryId, selection.id);
109
+ }
110
+ else {
111
+ contentEntities.forEach((node) => {
112
+ // batch.push(this.copyNodeAction(node.entry, selection.id));
113
+ batch.push(this[`${action.toLowerCase()}NodeAction`](node.entry, selection.id));
114
+ });
115
+ action$ = zip(...batch);
116
+ }
117
+ action$.subscribe((newContent) => {
118
+ observable.next(`OPERATION.SUCCESS.${type.toUpperCase()}.${action.toUpperCase()}`);
119
+ const processedData = this.processResponse(newContent);
120
+ if (action === NodeAction.COPY) {
121
+ this.contentCopied.next(processedData.succeeded);
122
+ }
123
+ else if (action === NodeAction.MOVE) {
124
+ this.contentMoved.next(processedData);
125
+ }
126
+ }, observable.error.bind(observable));
127
+ });
128
+ }
129
+ else {
130
+ observable.error(new Error(JSON.stringify({ error: { statusCode: 403 } })));
131
+ }
132
+ return observable;
133
+ }
134
+ isEntryEntitiesArray(contentEntities) {
135
+ if (contentEntities?.length) {
136
+ const nonEntryNode = contentEntities.find((node) => !(node?.entry?.nodeId || node?.entry?.id));
137
+ return !nonEntryNode;
138
+ }
139
+ return false;
140
+ }
141
+ checkPermission(action, contentEntities, permission) {
142
+ const notAllowedNode = contentEntities.find((node) => !this.isActionAllowed(action, node.entry, permission));
143
+ return !notAllowedNode;
144
+ }
145
+ getEntryParentId(nodeEntry) {
146
+ let entryParentId = '';
147
+ if (nodeEntry.parentId) {
148
+ entryParentId = nodeEntry.parentId;
149
+ }
150
+ else if (nodeEntry.path?.elements?.length) {
151
+ entryParentId = nodeEntry.path.elements[nodeEntry.path.elements.length - 1].id;
152
+ }
153
+ return entryParentId;
154
+ }
155
+ getContentNodeSelection(action, contentEntities, focusedElementOnCloseSelector) {
156
+ const currentParentFolderId = this.getEntryParentId(contentEntities[0].entry);
157
+ const customDropdown = new SitePaging({
158
+ list: {
159
+ entries: [
160
+ {
161
+ entry: {
162
+ guid: '-my-',
163
+ title: this.translation.instant('APP.BROWSE.PERSONAL.SIDENAV_LINK.LABEL')
164
+ }
165
+ },
166
+ {
167
+ entry: {
168
+ guid: '-mysites-',
169
+ title: this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.SIDENAV_LINK.LABEL')
170
+ }
171
+ }
172
+ ]
173
+ }
174
+ });
175
+ const title = this.getTitleTranslation(action, contentEntities);
176
+ this.isSitesDestinationAvailable = false;
177
+ const data = {
178
+ selectionMode: 'single',
179
+ title,
180
+ currentFolderId: currentParentFolderId,
181
+ actionName: action,
182
+ dropdownHideMyFiles: true,
183
+ dropdownSiteList: customDropdown,
184
+ rowFilter: this.rowFilter.bind(this),
185
+ imageResolver: this.imageResolver.bind(this),
186
+ isSelectionValid: this.canCopyMoveInsideIt.bind(this),
187
+ breadcrumbTransform: this.customizeBreadcrumb.bind(this),
188
+ select: new Subject(),
189
+ excludeSiteContent: ContentNodeDialogService.nonDocumentSiteContent
190
+ };
191
+ this.dialog
192
+ .open(ContentNodeSelectorComponent, {
193
+ data,
194
+ panelClass: 'adf-content-node-selector-dialog',
195
+ width: '630px',
196
+ role: 'dialog'
197
+ })
198
+ .afterClosed()
199
+ .subscribe(() => this.focusAfterClose(focusedElementOnCloseSelector));
200
+ data.select.subscribe({
201
+ complete: this.close.bind(this)
202
+ });
203
+ return data.select;
204
+ }
205
+ getTitleTranslation(action, nodes = []) {
206
+ let keyPrefix = 'ITEMS';
207
+ let name = '';
208
+ if (nodes.length === 1 && nodes[0].entry.name) {
209
+ name = nodes[0].entry.name;
210
+ keyPrefix = 'ITEM';
211
+ }
212
+ const number = nodes.length;
213
+ return this.translation.instant(`NODE_SELECTOR.${action.toUpperCase()}_${keyPrefix}`, { name, number });
214
+ }
215
+ canCopyMoveInsideIt(entry) {
216
+ return this.hasEntityCreatePermission(entry) && !this.isSite(entry);
217
+ }
218
+ hasEntityCreatePermission(entry) {
219
+ return this.contentService.hasAllowableOperations(entry, 'create');
220
+ }
221
+ isSite(entry) {
222
+ return !!entry.guid || entry.nodeType === 'st:site' || entry.nodeType === 'st:sites';
223
+ }
224
+ close() {
225
+ this.dialog.closeAll();
226
+ }
227
+ // todo: review this approach once 5.2.3 is out
228
+ customizeBreadcrumb(node) {
229
+ if (node?.path?.elements) {
230
+ const elements = node.path.elements;
231
+ if (elements.length > 1) {
232
+ if (elements[1].name === 'User Homes') {
233
+ elements.splice(0, 2);
234
+ // make sure first item is 'Personal Files'
235
+ if (elements[0]) {
236
+ elements[0].name = this.translation.instant('APP.BROWSE.PERSONAL.TITLE');
237
+ elements[0].id = '-my-';
238
+ }
239
+ else {
240
+ node.name = this.translation.instant('APP.BROWSE.PERSONAL.TITLE');
241
+ }
242
+ }
243
+ else if (elements[1].name === 'Sites') {
244
+ this.normalizeSitePath(node);
245
+ }
246
+ }
247
+ else if (elements.length === 1) {
248
+ if (node.name === 'Sites') {
249
+ node.name = this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE');
250
+ elements.splice(0, 1);
251
+ }
252
+ }
253
+ }
254
+ else if (node === null && this.isSitesDestinationAvailable) {
255
+ node = {
256
+ name: this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE'),
257
+ path: { elements: [] }
258
+ };
259
+ }
260
+ return node;
261
+ }
262
+ // todo: review this approach once 5.2.3 is out
263
+ normalizeSitePath(node) {
264
+ const elements = node.path.elements;
265
+ // remove 'Company Home'
266
+ elements.splice(0, 1);
267
+ // replace first item with 'File Libraries'
268
+ elements[0].name = this.translation.instant('APP.BROWSE.LIBRARIES.MENU.MY_LIBRARIES.TITLE');
269
+ elements[0].id = '-mysites-';
270
+ if (this.isSiteContainer(node)) {
271
+ // rename 'documentLibrary' entry to the target site display name
272
+ // clicking on the breadcrumb entry loads the site content
273
+ node.name = elements[1].name;
274
+ // remove the site entry
275
+ elements.splice(1, 1);
276
+ }
277
+ else {
278
+ // remove 'documentLibrary' in the middle of the path
279
+ const docLib = elements.findIndex((el) => el.name === 'documentLibrary');
280
+ if (docLib > -1) {
281
+ elements.splice(docLib, 1);
282
+ }
283
+ }
284
+ }
285
+ isSiteContainer(node) {
286
+ if (node?.aspectNames?.length > 0) {
287
+ return node.aspectNames.indexOf('st:siteContainer') >= 0;
288
+ }
289
+ return false;
290
+ }
291
+ copyNodeAction(nodeEntry, selectionId) {
292
+ if (nodeEntry.isFolder) {
293
+ return this.copyFolderAction(nodeEntry, selectionId);
294
+ }
295
+ else {
296
+ // any other type is treated as 'content'
297
+ return this.copyContentAction(nodeEntry, selectionId);
298
+ }
299
+ }
300
+ copyContentAction(contentEntry, selectionId, oldName) {
301
+ const _oldName = oldName || contentEntry.name;
302
+ // Check if there's nodeId for Shared Files
303
+ const contentEntryId = contentEntry.nodeId || contentEntry.id;
304
+ // use local method until new name parameter is added on ADF copyNode
305
+ return this.copyNode(contentEntryId, selectionId, _oldName).pipe(catchError((err) => {
306
+ let errStatusCode;
307
+ try {
308
+ const { error: { statusCode } } = JSON.parse(err.message);
309
+ errStatusCode = statusCode;
310
+ }
311
+ catch (e) {
312
+ //
313
+ }
314
+ if (errStatusCode && errStatusCode === 409) {
315
+ return this.copyContentAction(contentEntry, selectionId, this.getNewNameFrom(_oldName, contentEntry.name));
316
+ }
317
+ else {
318
+ // do not throw error, to be able to show message in case of partial copy of files
319
+ return of(err || 'Server error');
320
+ }
321
+ }));
322
+ }
323
+ copyFolderAction(contentEntry, selectionId) {
324
+ // Check if there's nodeId for Shared Files
325
+ const contentEntryId = contentEntry.nodeId || contentEntry.id;
326
+ let $destinationFolder;
327
+ let $childrenToCopy;
328
+ let newDestinationFolder;
329
+ return this.copyNode(contentEntryId, selectionId, contentEntry.name).pipe(catchError((err) => {
330
+ let errStatusCode;
331
+ try {
332
+ const { error: { statusCode } } = JSON.parse(err.message);
333
+ errStatusCode = statusCode;
334
+ }
335
+ catch { }
336
+ if (errStatusCode && errStatusCode === 409) {
337
+ $destinationFolder = this.getChildByName(selectionId, contentEntry.name);
338
+ $childrenToCopy = this.getNodeChildren(contentEntryId);
339
+ return $destinationFolder.pipe(mergeMap((destination) => {
340
+ newDestinationFolder = destination;
341
+ return $childrenToCopy;
342
+ }), mergeMap((nodesToCopy) => {
343
+ const batch = [];
344
+ nodesToCopy.list.entries.forEach((node) => {
345
+ if (node.entry.isFolder) {
346
+ batch.push(this.copyFolderAction(node.entry, newDestinationFolder.entry.id));
347
+ }
348
+ else {
349
+ batch.push(this.copyContentAction(node.entry, newDestinationFolder.entry.id));
350
+ }
351
+ });
352
+ if (!batch.length) {
353
+ return of({});
354
+ }
355
+ return zip(...batch);
356
+ }));
357
+ }
358
+ else {
359
+ // do not throw error, to be able to show message in case of partial copy of files
360
+ return of(err || 'Server error');
361
+ }
362
+ }));
363
+ }
364
+ moveNodeAction(nodeEntry, selectionId) {
365
+ this.moveDeletedEntries = [];
366
+ if (nodeEntry.isFolder) {
367
+ const initialParentId = nodeEntry.parentId;
368
+ return this.moveFolderAction(nodeEntry, selectionId).pipe(mergeMap((newContent) => {
369
+ // take no extra action, if folder is moved to the same location
370
+ if (initialParentId === selectionId) {
371
+ return of(newContent);
372
+ }
373
+ const flattenResponse = this.flatten(newContent);
374
+ const processedData = this.processResponse(flattenResponse);
375
+ // else, check if moving this nodeEntry succeeded for ALL of its nodes
376
+ if (processedData.failed.length === 0) {
377
+ // check if folder still exists on location
378
+ return this.getChildByName(initialParentId, nodeEntry.name).pipe(mergeMap((folderOnInitialLocation) => {
379
+ if (folderOnInitialLocation) {
380
+ // Check if there's nodeId for Shared Files
381
+ const nodeEntryId = nodeEntry.nodeId || nodeEntry.id;
382
+ // delete it from location
383
+ return this.contentApi.deleteNode(nodeEntryId).pipe(mergeMap(() => {
384
+ this.moveDeletedEntries.push(nodeEntry);
385
+ return of(newContent);
386
+ }));
387
+ }
388
+ return of(newContent);
389
+ }));
390
+ }
391
+ return of(newContent);
392
+ }));
393
+ }
394
+ else {
395
+ // any other type is treated as 'content'
396
+ return this.moveContentAction(nodeEntry, selectionId);
397
+ }
398
+ }
399
+ moveFolderAction(contentEntry, selectionId) {
400
+ // Check if there's nodeId for Shared Files
401
+ const contentEntryId = contentEntry.nodeId || contentEntry.id;
402
+ const initialParentId = this.getEntryParentId(contentEntry);
403
+ let $destinationFolder;
404
+ let $childrenToMove;
405
+ let newDestinationFolder;
406
+ return this.documentListService.moveNode(contentEntryId, selectionId).pipe(map((itemMoved) => ({ itemMoved, initialParentId })), catchError((err) => {
407
+ let errStatusCode;
408
+ try {
409
+ const { error: { statusCode } } = JSON.parse(err.message);
410
+ errStatusCode = statusCode;
411
+ }
412
+ catch (e) {
413
+ //
414
+ }
415
+ if (errStatusCode && errStatusCode === 409) {
416
+ $destinationFolder = this.getChildByName(selectionId, contentEntry.name);
417
+ $childrenToMove = this.getNodeChildren(contentEntryId);
418
+ return $destinationFolder.pipe(mergeMap((destination) => {
419
+ newDestinationFolder = destination;
420
+ return $childrenToMove;
421
+ }), mergeMap((childrenToMove) => {
422
+ const batch = [];
423
+ childrenToMove.list.entries.forEach((node) => {
424
+ if (node.entry.isFolder) {
425
+ batch.push(this.moveFolderAction(node.entry, newDestinationFolder.entry.id));
426
+ }
427
+ else {
428
+ batch.push(this.moveContentAction(node.entry, newDestinationFolder.entry.id));
429
+ }
430
+ });
431
+ if (!batch.length) {
432
+ return of(batch);
433
+ }
434
+ return zip(...batch);
435
+ }));
436
+ }
437
+ else {
438
+ // do not throw error, to be able to show message in case of partial move of files
439
+ return of(err);
440
+ }
441
+ }));
442
+ }
443
+ moveContentAction(contentEntry, selectionId) {
444
+ // Check if there's nodeId for Shared Files
445
+ const contentEntryId = contentEntry.nodeId || contentEntry.id;
446
+ const initialParentId = this.getEntryParentId(contentEntry);
447
+ return this.documentListService.moveNode(contentEntryId, selectionId).pipe(map((itemMoved) => ({ itemMoved, initialParentId })), catchError((err) =>
448
+ // do not throw error, to be able to show message in case of partial move of files
449
+ of(err)));
450
+ }
451
+ getChildByName(parentId, name) {
452
+ const matchedNodes = new Subject();
453
+ this.getNodeChildren(parentId).subscribe((childrenNodes) => {
454
+ const result = childrenNodes.list.entries.find((node) => node.entry.name === name);
455
+ if (result) {
456
+ matchedNodes.next(result);
457
+ }
458
+ else {
459
+ matchedNodes.next(null);
460
+ }
461
+ }, (err) => matchedNodes.error(err));
462
+ return matchedNodes;
463
+ }
464
+ isActionAllowed(action, node, permission) {
465
+ if (action === NodeAction.COPY) {
466
+ return true;
467
+ }
468
+ return this.contentService.hasAllowableOperations(node, permission);
469
+ }
470
+ rowFilter(row) {
471
+ const node = row.node.entry;
472
+ this.isSitesDestinationAvailable = !!node['guid'];
473
+ return !node.isFile && node.nodeType !== 'app:folderlink';
474
+ }
475
+ imageResolver(row) {
476
+ const entry = row.node.entry;
477
+ if (!this.contentService.hasAllowableOperations(entry, 'update')) {
478
+ return this.thumbnailService.getMimeTypeIcon('disable/folder');
479
+ }
480
+ return null;
481
+ }
482
+ getNewNameFrom(name, baseName) {
483
+ const extensionMatch = name.match(/\.[^/.]+$/);
484
+ // remove extension in case there is one
485
+ const fileExtension = extensionMatch ? extensionMatch[0] : '';
486
+ let extensionFree = extensionMatch ? name.slice(0, extensionMatch.index) : name;
487
+ let prefixNumber = 1;
488
+ let baseExtensionFree;
489
+ if (baseName) {
490
+ const baseExtensionMatch = baseName.match(/\.[^/.]+$/);
491
+ // remove extension in case there is one
492
+ baseExtensionFree = baseExtensionMatch ? baseName.slice(0, baseExtensionMatch.index) : baseName;
493
+ }
494
+ if (!baseExtensionFree || baseExtensionFree !== extensionFree) {
495
+ // check if name already has integer appended on end:
496
+ const oldPrefix = extensionFree.match('-[0-9]+$');
497
+ if (oldPrefix) {
498
+ // if so, try to get the number at the end
499
+ const oldPrefixNumber = parseInt(oldPrefix[0].slice(1), 10);
500
+ if (oldPrefixNumber.toString() === oldPrefix[0].slice(1)) {
501
+ extensionFree = extensionFree.slice(0, oldPrefix.index);
502
+ prefixNumber = oldPrefixNumber + 1;
503
+ }
504
+ }
505
+ }
506
+ return extensionFree + '-' + prefixNumber + fileExtension;
507
+ }
508
+ /**
509
+ * Get children nodes of given parent node
510
+ *
511
+ * @param nodeId The id of the parent node
512
+ * @param params optional parameters
513
+ */
514
+ getNodeChildren(nodeId, params) {
515
+ return from(this.nodesApi.listNodeChildren(nodeId, params));
516
+ }
517
+ // Copied from ADF document-list.service, and added the name parameter
518
+ /**
519
+ * Copy a node to destination node
520
+ *
521
+ * @param nodeId The id of the node to be copied
522
+ * @param targetParentId The id of the folder-node where the node have to be copied to
523
+ * @param name The new name for the copy that would be added on the destination folder
524
+ */
525
+ copyNode(nodeId, targetParentId, name) {
526
+ return from(this.nodesApi.copyNode(nodeId, { targetParentId, name }));
527
+ }
528
+ flatten(nDimArray) {
529
+ if (!Array.isArray(nDimArray)) {
530
+ return nDimArray;
531
+ }
532
+ const nodeQueue = nDimArray.slice(0);
533
+ const resultingArray = [];
534
+ do {
535
+ nodeQueue.forEach((node) => {
536
+ if (Array.isArray(node)) {
537
+ nodeQueue.push(...node);
538
+ }
539
+ else {
540
+ resultingArray.push(node);
541
+ }
542
+ const nodeIndex = nodeQueue.indexOf(node);
543
+ nodeQueue.splice(nodeIndex, 1);
544
+ });
545
+ } while (nodeQueue.length);
546
+ return resultingArray;
547
+ }
548
+ processResponse(data) {
549
+ const moveStatus = {
550
+ succeeded: [],
551
+ failed: [],
552
+ partiallySucceeded: []
553
+ };
554
+ if (Array.isArray(data)) {
555
+ return data.reduce((acc, next) => {
556
+ if (next instanceof Error) {
557
+ acc.failed.push(next);
558
+ }
559
+ else if (Array.isArray(next)) {
560
+ // if content of a folder was moved
561
+ const folderMoveResponseData = this.flatten(next);
562
+ const foundError = folderMoveResponseData.find((node) => node instanceof Error);
563
+ // data might contain also items of form: { itemMoved, initialParentId }
564
+ const foundEntry = folderMoveResponseData.find((node) => node.itemMoved?.entry || node?.entry);
565
+ if (!foundError) {
566
+ // consider success if NONE of the items from the folder move response is an error
567
+ acc.succeeded.push(next);
568
+ }
569
+ else if (!foundEntry) {
570
+ // consider failed if NONE of the items has an entry
571
+ acc.failed.push(next);
572
+ }
573
+ else {
574
+ // partially move folder
575
+ acc.partiallySucceeded.push(next);
576
+ }
577
+ }
578
+ else {
579
+ acc.succeeded.push(next);
580
+ }
581
+ return acc;
582
+ }, moveStatus);
583
+ }
584
+ else {
585
+ if (data.itemMoved?.entry || data?.entry) {
586
+ moveStatus.succeeded.push(data);
587
+ }
588
+ else {
589
+ moveStatus.failed.push(data);
590
+ }
591
+ return moveStatus;
592
+ }
593
+ }
594
+ focusAfterClose(focusedElementSelector) {
595
+ if (focusedElementSelector) {
596
+ document.querySelector(focusedElementSelector)?.focus();
597
+ }
598
+ }
599
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, deps: [{ token: i1.ContentService }, { token: i2.ContentApiService }, { token: i3.MatDialog }, { token: i1.DocumentListService }, { token: i1.AlfrescoApiService }, { token: i4.TranslationService }, { token: i4.ThumbnailService }], target: i0.ɵɵFactoryTarget.Injectable });
600
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, providedIn: 'root' });
601
+ }
602
+ export { NodeActionsService };
603
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NodeActionsService, decorators: [{
604
+ type: Injectable,
605
+ args: [{
606
+ providedIn: 'root'
607
+ }]
608
+ }], ctorParameters: function () { return [{ type: i1.ContentService }, { type: i2.ContentApiService }, { type: i3.MatDialog }, { type: i1.DocumentListService }, { type: i1.AlfrescoApiService }, { type: i4.TranslationService }, { type: i4.ThumbnailService }]; } });
609
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1hY3Rpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL25vZGUtYWN0aW9ucy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFFNUIsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixjQUFjLEVBQ2YsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQW1CLFVBQVUsRUFBeUQsUUFBUSxFQUF3QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFJM0QsTUFHYSxrQkFBa0I7SUFhbkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFsQlYsYUFBYSxHQUF5QixJQUFJLE9BQU8sRUFBZSxDQUFDO0lBQ2pFLFlBQVksR0FBaUIsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUNoRCxrQkFBa0IsR0FBVSxFQUFFLENBQUM7SUFDL0IsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBRXBDLFNBQVMsQ0FBVztJQUNw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dEU7SUFDSCxDQUFDO3VHQXZvQlUsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7U0FFUCxrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjQgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb25cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uLlxuICogSWYgdGhlIHNvZnR3YXJlIHdhcyBwdXJjaGFzZWQgdW5kZXIgYSBwYWlkIEFsZnJlc2NvIGxpY2Vuc2UsIHRoZSB0ZXJtcyBvZlxuICogdGhlIHBhaWQgbGljZW5zZSBhZ3JlZW1lbnQgd2lsbCBwcmV2YWlsLiBPdGhlcndpc2UsIHRoZSBzb2Z0d2FyZSBpc1xuICogcHJvdmlkZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBvcGVuIHNvdXJjZSBsaWNlbnNlIHRlcm1zOlxuICpcbiAqIFRoZSBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb24gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGZyb20gSHlsYW5kIFNvZnR3YXJlLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCB6aXAsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRodW1ibmFpbFNlcnZpY2UsIFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQge1xuICBBbGZyZXNjb0FwaVNlcnZpY2UsXG4gIERvY3VtZW50TGlzdFNlcnZpY2UsXG4gIENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnQsXG4gIENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnREYXRhLFxuICBDb250ZW50Tm9kZURpYWxvZ1NlcnZpY2UsXG4gIFNoYXJlRGF0YVJvdyxcbiAgTm9kZUFjdGlvbixcbiAgQ29udGVudFNlcnZpY2Vcbn0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb250ZW50LXNlcnZpY2VzJztcbmltcG9ydCB7IE5vZGVFbnRyeSwgTm9kZSwgU2l0ZVBhZ2luZywgTm9kZUNoaWxkQXNzb2NpYXRpb25QYWdpbmcsIE5vZGVDaGlsZEFzc29jaWF0aW9uRW50cnksIE5vZGVzQXBpLCBTaXRlLCBTaXRlUGFnaW5nTGlzdCB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29udGVudEFwaVNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWNhLXNoYXJlZCc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG50eXBlIEJhdGNoT3BlcmF0aW9uVHlwZSA9IEV4dHJhY3Q8Tm9kZUFjdGlvbiwgTm9kZUFjdGlvbi5DT1BZIHwgTm9kZUFjdGlvbi5NT1ZFPjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUFjdGlvbnNTZXJ2aWNlIHtcbiAgY29udGVudENvcGllZDogU3ViamVjdDxOb2RlRW50cnlbXT4gPSBuZXcgU3ViamVjdDxOb2RlRW50cnlbXT4oKTtcbiAgY29udGVudE1vdmVkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIG1vdmVEZWxldGVkRW50cmllczogYW55W10gPSBbXTtcbiAgaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gZmFsc2U7XG5cbiAgX25vZGVzQXBpOiBOb2Rlc0FwaTtcbiAgZ2V0IG5vZGVzQXBpKCk6IE5vZGVzQXBpIHtcbiAgICB0aGlzLl9ub2Rlc0FwaSA9IHRoaXMuX25vZGVzQXBpID8/IG5ldyBOb2Rlc0FwaSh0aGlzLmFwaVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzQXBpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZW50U2VydmljZTogQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50QXBpOiBDb250ZW50QXBpU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlOiBUaHVtYm5haWxTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ29weSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnRFbnRpdGllcyBub2RlcyB0byBjb3B5XG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgY29weU5vZGVzKGNvbnRlbnRFbnRpdGllczogYW55W10sIHBlcm1pc3Npb24/OiBzdHJpbmcsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKTogU3ViamVjdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5kb0JhdGNoT3BlcmF0aW9uKE5vZGVBY3Rpb24uQ09QWSwgY29udGVudEVudGl0aWVzLCBwZXJtaXNzaW9uLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBub2RlIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnRFbnRpdGllcyBub2RlcyB0byBtb3ZlXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgbW92ZU5vZGVzKGNvbnRlbnRFbnRpdGllczogYW55W10sIHBlcm1pc3Npb24/OiBzdHJpbmcsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKTogU3ViamVjdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5kb0JhdGNoT3BlcmF0aW9uKE5vZGVBY3Rpb24uTU9WRSwgY29udGVudEVudGl0aWVzLCBwZXJtaXNzaW9uLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgZm9yIHBlcmZvcm1pbmcgdGhlIGdpdmVuIG9wZXJhdGlvbiAoY29weXxtb3ZlKSB0byBtdWx0aXBsZSBub2Rlc1xuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gcGVyZm9ybSAoY29weXxtb3ZlKVxuICAgKiBAcGFyYW0gY29udGVudEVudGl0aWVzIHRoZSBjb250ZW50RW50aXRpZXMgd2hpY2ggaGF2ZSB0byBoYXZlIHRoZSBhY3Rpb24gcGVyZm9ybWVkIG9uXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uIHBlcm1pc3Npb24gd2hpY2ggaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yIGVsZW1lbnQncyBzZWxlY3RvciB3aGljaCBzaG91bGQgYmUgYXV0b2ZvY3VzZWQgYWZ0ZXIgY2xvc2luZyBtb2RhbFxuICAgKi9cbiAgZG9CYXRjaE9wZXJhdGlvbihhY3Rpb246IEJhdGNoT3BlcmF0aW9uVHlwZSwgY29udGVudEVudGl0aWVzOiBhbnlbXSwgcGVybWlzc2lvbj86IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgIGNvbnN0IG9ic2VydmFibGU6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGlmICghdGhpcy5pc0VudHJ5RW50aXRpZXNBcnJheShjb250ZW50RW50aXRpZXMpKSB7XG4gICAgICBvYnNlcnZhYmxlLmVycm9yKG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7IGVycm9yOiB7IHN0YXR1c0NvZGU6IDQwMCB9IH0pKSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrUGVybWlzc2lvbihhY3Rpb24sIGNvbnRlbnRFbnRpdGllcywgcGVybWlzc2lvbikpIHtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uU2VsZWN0aW9uID0gdGhpcy5nZXRDb250ZW50Tm9kZVNlbGVjdGlvbihhY3Rpb24sIGNvbnRlbnRFbnRpdGllcywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgZGVzdGluYXRpb25TZWxlY3Rpb24uc3Vic2NyaWJlKChzZWxlY3Rpb25zOiBOb2RlW10pID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudEVudHJ5ID0gY29udGVudEVudGl0aWVzWzBdLmVudHJ5O1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbnRyeUlkID0gY29udGVudEVudHJ5Lm5vZGVJZCB8fCBjb250ZW50RW50cnkuaWQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBjb250ZW50RW50cnkuaXNGb2xkZXIgPyAnZm9sZGVyJyA6ICdjb250ZW50JztcbiAgICAgICAgY29uc3QgYmF0Y2g6IGFueVtdID0gW107XG5cbiAgICAgICAgLy8gY29uc2lkZXIgb25seSBmaXJzdCBpdGVtIGluIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1swXTtcbiAgICAgICAgbGV0IGFjdGlvbiQ6IE9ic2VydmFibGU8YW55PjtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSBOb2RlQWN0aW9uLk1PVkUgJiYgY29udGVudEVudGl0aWVzLmxlbmd0aCA9PT0gMSAmJiB0eXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICBhY3Rpb24kID0gdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLm1vdmVOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb24uaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRFbnRpdGllcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICAvLyBiYXRjaC5wdXNoKHRoaXMuY29weU5vZGVBY3Rpb24obm9kZS5lbnRyeSwgc2VsZWN0aW9uLmlkKSk7XG4gICAgICAgICAgICBiYXRjaC5wdXNoKHRoaXNbYCR7YWN0aW9uLnRvTG93ZXJDYXNlKCl9Tm9kZUFjdGlvbmBdKG5vZGUuZW50cnksIHNlbGVjdGlvbi5pZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjdGlvbiQgPSB6aXAoLi4uYmF0Y2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aW9uJC5zdWJzY3JpYmUoKG5ld0NvbnRlbnQpID0+IHtcbiAgICAgICAgICBvYnNlcnZhYmxlLm5leHQoYE9QRVJBVElPTi5TVUNDRVNTLiR7dHlwZS50b1VwcGVyQ2FzZSgpfS4ke2FjdGlvbi50b1VwcGVyQ2FzZSgpfWApO1xuXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc1Jlc3BvbnNlKG5ld0NvbnRlbnQpO1xuICAgICAgICAgIGlmIChhY3Rpb24gPT09IE5vZGVBY3Rpb24uQ09QWSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Q29waWVkLm5leHQocHJvY2Vzc2VkRGF0YS5zdWNjZWVkZWQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBOb2RlQWN0aW9uLk1PVkUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudE1vdmVkLm5leHQocHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvYnNlcnZhYmxlLmVycm9yLmJpbmQob2JzZXJ2YWJsZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ic2VydmFibGUuZXJyb3IobmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IHsgc3RhdHVzQ29kZTogNDAzIH0gfSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGlzRW50cnlFbnRpdGllc0FycmF5KGNvbnRlbnRFbnRpdGllczogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoY29udGVudEVudGl0aWVzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5vbkVudHJ5Tm9kZSA9IGNvbnRlbnRFbnRpdGllcy5maW5kKChub2RlKSA9PiAhKG5vZGU/LmVudHJ5Py5ub2RlSWQgfHwgbm9kZT8uZW50cnk/LmlkKSk7XG4gICAgICByZXR1cm4gIW5vbkVudHJ5Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hlY2tQZXJtaXNzaW9uKGFjdGlvbjogQmF0Y2hPcGVyYXRpb25UeXBlLCBjb250ZW50RW50aXRpZXM6IGFueVtdLCBwZXJtaXNzaW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm90QWxsb3dlZE5vZGUgPSBjb250ZW50RW50aXRpZXMuZmluZCgobm9kZSkgPT4gIXRoaXMuaXNBY3Rpb25BbGxvd2VkKGFjdGlvbiwgbm9kZS5lbnRyeSwgcGVybWlzc2lvbikpO1xuICAgIHJldHVybiAhbm90QWxsb3dlZE5vZGU7XG4gIH1cblxuICBnZXRFbnRyeVBhcmVudElkKG5vZGVFbnRyeTogTm9kZSkge1xuICAgIGxldCBlbnRyeVBhcmVudElkID0gJyc7XG5cbiAgICBpZiAobm9kZUVudHJ5LnBhcmVudElkKSB7XG4gICAgICBlbnRyeVBhcmVudElkID0gbm9kZUVudHJ5LnBhcmVudElkO1xuICAgIH0gZWxzZSBpZiAobm9kZUVudHJ5LnBhdGg/LmVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgIGVudHJ5UGFyZW50SWQgPSBub2RlRW50cnkucGF0aC5lbGVtZW50c1tub2RlRW50cnkucGF0aC5lbGVtZW50cy5sZW5ndGggLSAxXS5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnlQYXJlbnRJZDtcbiAgfVxuXG4gIGdldENvbnRlbnROb2RlU2VsZWN0aW9uKGFjdGlvbjogTm9kZUFjdGlvbiwgY29udGVudEVudGl0aWVzOiBOb2RlRW50cnlbXSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiBTdWJqZWN0PE5vZGVbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQYXJlbnRGb2xkZXJJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50aXRpZXNbMF0uZW50cnkpO1xuXG4gICAgY29uc3QgY3VzdG9tRHJvcGRvd24gPSBuZXcgU2l0ZVBhZ2luZyh7XG4gICAgICBsaXN0OiB7XG4gICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICBndWlkOiAnLW15LScsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5CUk9XU0UuUEVSU09OQUwuU0lERU5BVl9MSU5LLkxBQkVMJylcbiAgICAgICAgICAgIH0gYXMgU2l0ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50cnk6IHtcbiAgICAgICAgICAgICAgZ3VpZDogJy1teXNpdGVzLScsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5CUk9XU0UuTElCUkFSSUVTLk1FTlUuTVlfTElCUkFSSUVTLlNJREVOQVZfTElOSy5MQUJFTCcpXG4gICAgICAgICAgICB9IGFzIFNpdGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0gYXMgU2l0ZVBhZ2luZ0xpc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5nZXRUaXRsZVRyYW5zbGF0aW9uKGFjdGlvbiwgY29udGVudEVudGl0aWVzKTtcblxuICAgIHRoaXMuaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgY29uc3QgZGF0YTogQ29udGVudE5vZGVTZWxlY3RvckNvbXBvbmVudERhdGEgPSB7XG4gICAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcbiAgICAgIHRpdGxlLFxuICAgICAgY3VycmVudEZvbGRlcklkOiBjdXJyZW50UGFyZW50Rm9sZGVySWQsXG4gICAgICBhY3Rpb25OYW1lOiBhY3Rpb24sXG4gICAgICBkcm9wZG93bkhpZGVNeUZpbGVzOiB0cnVlLFxuICAgICAgZHJvcGRvd25TaXRlTGlzdDogY3VzdG9tRHJvcGRvd24sXG4gICAgICByb3dGaWx0ZXI6IHRoaXMucm93RmlsdGVyLmJpbmQodGhpcyksXG4gICAgICBpbWFnZVJlc29sdmVyOiB0aGlzLmltYWdlUmVzb2x2ZXIuYmluZCh0aGlzKSxcbiAgICAgIGlzU2VsZWN0aW9uVmFsaWQ6IHRoaXMuY2FuQ29weU1vdmVJbnNpZGVJdC5iaW5kKHRoaXMpLFxuICAgICAgYnJlYWRjcnVtYlRyYW5zZm9ybTogdGhpcy5jdXN0b21pemVCcmVhZGNydW1iLmJpbmQodGhpcyksXG4gICAgICBzZWxlY3Q6IG5ldyBTdWJqZWN0PE5vZGVbXT4oKSxcbiAgICAgIGV4Y2x1ZGVTaXRlQ29udGVudDogQ29udGVudE5vZGVEaWFsb2dTZXJ2aWNlLm5vbkRvY3VtZW50U2l0ZUNvbnRlbnRcbiAgICB9O1xuXG4gICAgdGhpcy5kaWFsb2dcbiAgICAgIC5vcGVuKENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnQsIHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgcGFuZWxDbGFzczogJ2FkZi1jb250ZW50LW5vZGUtc2VsZWN0b3ItZGlhbG9nJyxcbiAgICAgICAgd2lkdGg6ICc2MzBweCcsXG4gICAgICAgIHJvbGU6ICdkaWFsb2cnXG4gICAgICB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpKTtcblxuICAgIGRhdGEuc2VsZWN0LnN1YnNjcmliZSh7XG4gICAgICBjb21wbGV0ZTogdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGF0YS5zZWxlY3Q7XG4gIH1cblxuICBnZXRUaXRsZVRyYW5zbGF0aW9uKGFjdGlvbjogc3RyaW5nLCBub2RlczogTm9kZUVudHJ5W10gPSBbXSk6IHN0cmluZyB7XG4gICAgbGV0IGtleVByZWZpeCA9ICdJVEVNUyc7XG4gICAgbGV0IG5hbWUgPSAnJztcblxuICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEgJiYgbm9kZXNbMF0uZW50cnkubmFtZSkge1xuICAgICAgbmFtZSA9IG5vZGVzWzBdLmVudHJ5Lm5hbWU7XG4gICAgICBrZXlQcmVmaXggPSAnSVRFTSc7XG4gICAgfVxuXG4gICAgY29uc3QgbnVtYmVyID0gbm9kZXMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoYE5PREVfU0VMRUNUT1IuJHthY3Rpb24udG9VcHBlckNhc2UoKX1fJHtrZXlQcmVmaXh9YCwgeyBuYW1lLCBudW1iZXIgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbkNvcHlNb3ZlSW5zaWRlSXQoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNFbnRpdHlDcmVhdGVQZXJtaXNzaW9uKGVudHJ5KSAmJiAhdGhpcy5pc1NpdGUoZW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNFbnRpdHlDcmVhdGVQZXJtaXNzaW9uKGVudHJ5OiBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ2NyZWF0ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NpdGUoZW50cnkpIHtcbiAgICByZXR1cm4gISFlbnRyeS5ndWlkIHx8IGVudHJ5Lm5vZGVUeXBlID09PSAnc3Q6c2l0ZScgfHwgZW50cnkubm9kZVR5cGUgPT09ICdzdDpzaXRlcyc7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmRpYWxvZy5jbG9zZUFsbCgpO1xuICB9XG5cbiAgLy8gdG9kbzogcmV2aWV3IHRoaXMgYXBwcm9hY2ggb25jZSA1LjIuMyBpcyBvdXRcbiAgcHJpdmF0ZSBjdXN0b21pemVCcmVhZGNydW1iKG5vZGU6IE5vZGUpIHtcbiAgICBpZiAobm9kZT8ucGF0aD8uZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gbm9kZS5wYXRoLmVsZW1lbnRzO1xuXG4gICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAoZWxlbWVudHNbMV0ubmFtZSA9PT0gJ1VzZXIgSG9tZXMnKSB7XG4gICAgICAgICAgZWxlbWVudHMuc3BsaWNlKDAsIDIpO1xuXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIGZpcnN0IGl0ZW0gaXMgJ1BlcnNvbmFsIEZpbGVzJ1xuICAgICAgICAgIGlmIChlbGVtZW50c1swXSkge1xuICAgICAgICAgICAgZWxlbWVudHNbMF0ubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5QRVJTT05BTC5USVRMRScpO1xuICAgICAgICAgICAgZWxlbWVudHNbMF0uaWQgPSAnLW15LSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5QRVJTT05BTC5USVRMRScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1sxXS5uYW1lID09PSAnU2l0ZXMnKSB7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVTaXRlUGF0aChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSA9PT0gJ1NpdGVzJykge1xuICAgICAgICAgIG5vZGUubmFtZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5MSUJSQVJJRVMuTUVOVS5NWV9MSUJSQVJJRVMuVElUTEUnKTtcbiAgICAgICAgICBlbGVtZW50cy5zcGxpY2UoMCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUgPT09IG51bGwgJiYgdGhpcy5pc1NpdGVzRGVzdGluYXRpb25BdmFpbGFibGUpIHtcbiAgICAgIG5vZGUgPSB7XG4gICAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQVBQLkJST1dTRS5MSUJSQVJJRVMuTUVOVS5NWV9MSUJSQVJJRVMuVElUTEUnKSxcbiAgICAgICAgcGF0aDogeyBlbGVtZW50czogW10gfVxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvLyB0b2RvOiByZXZpZXcgdGhpcyBhcHByb2FjaCBvbmNlIDUuMi4zIGlzIG91dFxuICBwcml2YXRlIG5vcm1hbGl6ZVNpdGVQYXRoKG5vZGU6IE5vZGUpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG5vZGUucGF0aC5lbGVtZW50cztcblxuICAgIC8vIHJlbW92ZSAnQ29tcGFueSBIb21lJ1xuICAgIGVsZW1lbnRzLnNwbGljZSgwLCAxKTtcblxuICAgIC8vIHJlcGxhY2UgZmlyc3QgaXRlbSB3aXRoICdGaWxlIExpYnJhcmllcydcbiAgICBlbGVtZW50c1swXS5uYW1lID0gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdBUFAuQlJPV1NFLkxJQlJBUklFUy5NRU5VLk1ZX0xJQlJBUklFUy5USVRMRScpO1xuICAgIGVsZW1lbnRzWzBdLmlkID0gJy1teXNpdGVzLSc7XG5cbiAgICBpZiAodGhpcy5pc1NpdGVDb250YWluZXIobm9kZSkpIHtcbiAgICAgIC8vIHJlbmFtZSAnZG9jdW1lbnRMaWJyYXJ5JyBlbnRyeSB0byB0aGUgdGFyZ2V0IHNpdGUgZGlzcGxheSBuYW1lXG4gICAgICAvLyBjbGlja2luZyBvbiB0aGUgYnJlYWRjcnVtYiBlbnRyeSBsb2FkcyB0aGUgc2l0ZSBjb250ZW50XG4gICAgICBub2RlLm5hbWUgPSBlbGVtZW50c1sxXS5uYW1lO1xuXG4gICAgICAvLyByZW1vdmUgdGhlIHNpdGUgZW50cnlcbiAgICAgIGVsZW1lbnRzLnNwbGljZSgxLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVtb3ZlICdkb2N1bWVudExpYnJhcnknIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhdGhcbiAgICAgIGNvbnN0IGRvY0xpYiA9IGVsZW1lbnRzLmZpbmRJbmRleCgoZWwpID0+IGVsLm5hbWUgPT09ICdkb2N1bWVudExpYnJhcnknKTtcbiAgICAgIGlmIChkb2NMaWIgPiAtMSkge1xuICAgICAgICBlbGVtZW50cy5zcGxpY2UoZG9jTGliLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc1NpdGVDb250YWluZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmIChub2RlPy5hc3BlY3ROYW1lcz8ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5vZGUuYXNwZWN0TmFtZXMuaW5kZXhPZignc3Q6c2l0ZUNvbnRhaW5lcicpID49IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvcHlOb2RlQWN0aW9uKG5vZGVFbnRyeTogYW55LCBzZWxlY3Rpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAobm9kZUVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5Rm9sZGVyQWN0aW9uKG5vZGVFbnRyeSwgc2VsZWN0aW9uSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbnkgb3RoZXIgdHlwZSBpcyB0cmVhdGVkIGFzICdjb250ZW50J1xuICAgICAgcmV0dXJuIHRoaXMuY29weUNvbnRlbnRBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCk7XG4gICAgfVxuICB9XG5cbiAgY29weUNvbnRlbnRBY3Rpb24oY29udGVudEVudHJ5OiBhbnksIHNlbGVjdGlvbklkOiBzdHJpbmcsIG9sZE5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IF9vbGROYW1lID0gb2xkTmFtZSB8fCBjb250ZW50RW50cnkubmFtZTtcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgY29uc3QgY29udGVudEVudHJ5SWQgPSBjb250ZW50RW50cnkubm9kZUlkIHx8IGNvbnRlbnRFbnRyeS5pZDtcblxuICAgIC8vIHVzZSBsb2NhbCBtZXRob2QgdW50aWwgbmV3IG5hbWUgcGFyYW1ldGVyIGlzIGFkZGVkIG9uIEFERiBjb3B5Tm9kZVxuICAgIHJldHVybiB0aGlzLmNvcHlOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb25JZCwgX29sZE5hbWUpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgbGV0IGVyclN0YXR1c0NvZGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgICAgfSA9IEpTT04ucGFyc2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIGVyclN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJTdGF0dXNDb2RlICYmIGVyclN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlDb250ZW50QWN0aW9uKGNvbnRlbnRFbnRyeSwgc2VsZWN0aW9uSWQsIHRoaXMuZ2V0TmV3TmFtZUZyb20oX29sZE5hbWUsIGNvbnRlbnRFbnRyeS5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgY29weSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIgfHwgJ1NlcnZlciBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb3B5Rm9sZGVyQWN0aW9uKGNvbnRlbnRFbnRyeTogYW55LCBzZWxlY3Rpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgY29uc3QgY29udGVudEVudHJ5SWQgPSBjb250ZW50RW50cnkubm9kZUlkIHx8IGNvbnRlbnRFbnRyeS5pZDtcbiAgICBsZXQgJGRlc3RpbmF0aW9uRm9sZGVyOiBPYnNlcnZhYmxlPGFueT47XG4gICAgbGV0ICRjaGlsZHJlblRvQ29weTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGxldCBuZXdEZXN0aW5hdGlvbkZvbGRlcjtcblxuICAgIHJldHVybiB0aGlzLmNvcHlOb2RlKGNvbnRlbnRFbnRyeUlkLCBzZWxlY3Rpb25JZCwgY29udGVudEVudHJ5Lm5hbWUpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgbGV0IGVyclN0YXR1c0NvZGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgICAgfSA9IEpTT04ucGFyc2UoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIGVyclN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgaWYgKGVyclN0YXR1c0NvZGUgJiYgZXJyU3RhdHVzQ29kZSA9PT0gNDA5KSB7XG4gICAgICAgICAgJGRlc3RpbmF0aW9uRm9sZGVyID0gdGhpcy5nZXRDaGlsZEJ5TmFtZShzZWxlY3Rpb25JZCwgY29udGVudEVudHJ5Lm5hbWUpO1xuICAgICAgICAgICRjaGlsZHJlblRvQ29weSA9IHRoaXMuZ2V0Tm9kZUNoaWxkcmVuKGNvbnRlbnRFbnRyeUlkKTtcblxuICAgICAgICAgIHJldHVybiAkZGVzdGluYXRpb25Gb2xkZXIucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKChkZXN0aW5hdGlvbikgPT4ge1xuICAgICAgICAgICAgICBuZXdEZXN0aW5hdGlvbkZvbGRlciA9IGRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICByZXR1cm4gJGNoaWxkcmVuVG9Db3B5O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZXJnZU1hcCgobm9kZXNUb0NvcHkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICAgICAgICAgICAgbm9kZXNUb0NvcHkubGlzdC5lbnRyaWVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLmNvcHlGb2xkZXJBY3Rpb24obm9kZS5lbnRyeSwgbmV3RGVzdGluYXRpb25Gb2xkZXIuZW50cnkuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLmNvcHlDb250ZW50QWN0aW9uKG5vZGUuZW50cnksIG5ld0Rlc3RpbmF0aW9uRm9sZGVyLmVudHJ5LmlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAoIWJhdGNoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHppcCguLi5iYXRjaCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgY29weSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIgfHwgJ1NlcnZlciBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBtb3ZlTm9kZUFjdGlvbihub2RlRW50cnksIHNlbGVjdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMubW92ZURlbGV0ZWRFbnRyaWVzID0gW107XG5cbiAgICBpZiAobm9kZUVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICBjb25zdCBpbml0aWFsUGFyZW50SWQgPSBub2RlRW50cnkucGFyZW50SWQ7XG5cbiAgICAgIHJldHVybiB0aGlzLm1vdmVGb2xkZXJBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCkucGlwZShcbiAgICAgICAgbWVyZ2VNYXAoKG5ld0NvbnRlbnQpID0+IHtcbiAgICAgICAgICAvLyB0YWtlIG5vIGV4dHJhIGFjdGlvbiwgaWYgZm9sZGVyIGlzIG1vdmVkIHRvIHRoZSBzYW1lIGxvY2F0aW9uXG4gICAgICAgICAgaWYgKGluaXRpYWxQYXJlbnRJZCA9PT0gc2VsZWN0aW9uSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihuZXdDb250ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmbGF0dGVuUmVzcG9uc2UgPSB0aGlzLmZsYXR0ZW4obmV3Q29udGVudCk7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGZsYXR0ZW5SZXNwb25zZSk7XG5cbiAgICAgICAgICAvLyBlbHNlLCBjaGVjayBpZiBtb3ZpbmcgdGhpcyBub2RlRW50cnkgc3VjY2VlZGVkIGZvciBBTEwgb2YgaXRzIG5vZGVzXG4gICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEuZmFpbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgZm9sZGVyIHN0aWxsIGV4aXN0cyBvbiBsb2NhdGlvblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRCeU5hbWUoaW5pdGlhbFBhcmVudElkLCBub2RlRW50cnkubmFtZSkucGlwZShcbiAgICAgICAgICAgICAgbWVyZ2VNYXAoKGZvbGRlck9uSW5pdGlhbExvY2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlck9uSW5pdGlhbExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIG5vZGVJZCBmb3IgU2hhcmVkIEZpbGVzXG4gICAgICAgICAgICAgICAgICBjb25zdCBub2RlRW50cnlJZCA9IG5vZGVFbnRyeS5ub2RlSWQgfHwgbm9kZUVudHJ5LmlkO1xuICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGl0IGZyb20gbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShub2RlRW50cnlJZCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZURlbGV0ZWRFbnRyaWVzLnB1c2gobm9kZUVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YobmV3Q29udGVudCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbnkgb3RoZXIgdHlwZSBpcyB0cmVhdGVkIGFzICdjb250ZW50J1xuICAgICAgcmV0dXJuIHRoaXMubW92ZUNvbnRlbnRBY3Rpb24obm9kZUVudHJ5LCBzZWxlY3Rpb25JZCk7XG4gICAgfVxuICB9XG5cbiAgbW92ZUZvbGRlckFjdGlvbihjb250ZW50RW50cnksIHNlbGVjdGlvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mgbm9kZUlkIGZvciBTaGFyZWQgRmlsZXNcbiAgICBjb25zdCBjb250ZW50RW50cnlJZCA9IGNvbnRlbnRFbnRyeS5ub2RlSWQgfHwgY29udGVudEVudHJ5LmlkO1xuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50cnkpO1xuICAgIGxldCAkZGVzdGluYXRpb25Gb2xkZXI6IE9ic2VydmFibGU8YW55PjtcbiAgICBsZXQgJGNoaWxkcmVuVG9Nb3ZlOiBPYnNlcnZhYmxlPGFueT47XG4gICAgbGV0IG5ld0Rlc3RpbmF0aW9uRm9sZGVyO1xuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5tb3ZlTm9kZShjb250ZW50RW50cnlJZCwgc2VsZWN0aW9uSWQpLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1Nb3ZlZCkgPT4gKHsgaXRlbU1vdmVkLCBpbml0aWFsUGFyZW50SWQgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIGxldCBlcnJTdGF0dXNDb2RlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGVycm9yOiB7IHN0YXR1c0NvZGUgfVxuICAgICAgICAgIH0gPSBKU09OLnBhcnNlKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICBlcnJTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyU3RhdHVzQ29kZSAmJiBlcnJTdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAkZGVzdGluYXRpb25Gb2xkZXIgPSB0aGlzLmdldENoaWxkQnlOYW1lKHNlbGVjdGlvbklkLCBjb250ZW50RW50cnkubmFtZSk7XG4gICAgICAgICAgJGNoaWxkcmVuVG9Nb3ZlID0gdGhpcy5nZXROb2RlQ2hpbGRyZW4oY29udGVudEVudHJ5SWQpO1xuXG4gICAgICAgICAgcmV0dXJuICRkZXN0aW5hdGlvbkZvbGRlci5waXBlKFxuICAgICAgICAgICAgbWVyZ2VNYXAoKGRlc3RpbmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0Rlc3RpbmF0aW9uRm9sZGVyID0gZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIHJldHVybiAkY2hpbGRyZW5Ub01vdmU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1lcmdlTWFwKChjaGlsZHJlblRvTW92ZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBiYXRjaDogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgY2hpbGRyZW5Ub01vdmUubGlzdC5lbnRyaWVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLm1vdmVGb2xkZXJBY3Rpb24obm9kZS5lbnRyeSwgbmV3RGVzdGluYXRpb25Gb2xkZXIuZW50cnkuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaCh0aGlzLm1vdmVDb250ZW50QWN0aW9uKG5vZGUuZW50cnksIG5ld0Rlc3RpbmF0aW9uRm9sZGVyLmVudHJ5LmlkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAoIWJhdGNoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihiYXRjaCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHppcCguLi5iYXRjaCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZG8gbm90IHRocm93IGVycm9yLCB0byBiZSBhYmxlIHRvIHNob3cgbWVzc2FnZSBpbiBjYXNlIG9mIHBhcnRpYWwgbW92ZSBvZiBmaWxlc1xuICAgICAgICAgIHJldHVybiBvZihlcnIpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBtb3ZlQ29udGVudEFjdGlvbihjb250ZW50RW50cnk6IGFueSwgc2VsZWN0aW9uSWQ6IHN0cmluZykge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlJ3Mgbm9kZUlkIGZvciBTaGFyZWQgRmlsZXNcbiAgICBjb25zdCBjb250ZW50RW50cnlJZCA9IGNvbnRlbnRFbnRyeS5ub2RlSWQgfHwgY29udGVudEVudHJ5LmlkO1xuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMuZ2V0RW50cnlQYXJlbnRJZChjb250ZW50RW50cnkpO1xuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5tb3ZlTm9kZShjb250ZW50RW50cnlJZCwgc2VsZWN0aW9uSWQpLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1Nb3ZlZCkgPT4gKHsgaXRlbU1vdmVkLCBpbml0aWFsUGFyZW50SWQgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PlxuICAgICAgICAvLyBkbyBub3QgdGhyb3cgZXJyb3IsIHRvIGJlIGFibGUgdG8gc2hvdyBtZXNzYWdlIGluIGNhc2Ugb2YgcGFydGlhbCBtb3ZlIG9mIGZpbGVzXG4gICAgICAgIG9mKGVycilcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2hpbGRCeU5hbWUocGFyZW50SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogU3ViamVjdDxOb2RlQ2hpbGRBc3NvY2lhdGlvbkVudHJ5PiB7XG4gICAgY29uc3QgbWF0Y2hlZE5vZGVzID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgdGhpcy5nZXROb2RlQ2hpbGRyZW4ocGFyZW50SWQpLnN1YnNjcmliZShcbiAgICAgIChjaGlsZHJlbk5vZGVzOiBOb2RlQ2hpbGRBc3NvY2lhdGlvblBhZ2luZykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZHJlbk5vZGVzLmxpc3QuZW50cmllcy5maW5kKChub2RlKSA9PiBub2RlLmVudHJ5Lm5hbWUgPT09IG5hbWUpO1xuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBtYXRjaGVkTm9kZXMubmV4dChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZWROb2Rlcy5uZXh0KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycikgPT4gbWF0Y2hlZE5vZGVzLmVycm9yKGVycilcbiAgICApO1xuICAgIHJldHVybiBtYXRjaGVkTm9kZXM7XG4gIH1cblxuICBwcml2YXRlIGlzQWN0aW9uQWxsb3dlZChhY3Rpb246IEJhdGNoT3BlcmF0aW9uVHlwZSwgbm9kZTogTm9kZSwgcGVybWlzc2lvbj86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChhY3Rpb24gPT09IE5vZGVBY3Rpb24uQ09QWSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZSwgcGVybWlzc2lvbik7XG4gIH1cblxuICBwcml2YXRlIHJvd0ZpbHRlcihyb3c6IFNoYXJlRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vZGU6IE5vZGUgPSByb3cubm9kZS5lbnRyeTtcblxuICAgIHRoaXMuaXNTaXRlc0Rlc3RpbmF0aW9uQXZhaWxhYmxlID0gISFub2RlWydndWlkJ107XG4gICAgcmV0dXJuICFub2RlLmlzRmlsZSAmJiBub2RlLm5vZGVUeXBlICE9PSAnYXBwOmZvbGRlcmxpbmsnO1xuICB9XG5cbiAgcHJpdmF0ZSBpbWFnZVJlc29sdmVyKHJvdzogU2hhcmVEYXRhUm93KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgZW50cnk6IE5vZGUgPSByb3cubm9kZS5lbnRyeTtcbiAgICBpZiAoIXRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ3VwZGF0ZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxTZXJ2aWNlLmdldE1pbWVUeXBlSWNvbignZGlzYWJsZS9mb2xkZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXROZXdOYW1lRnJvbShuYW1lOiBzdHJpbmcsIGJhc2VOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTWF0Y2ggPSBuYW1lLm1hdGNoKC9cXC5bXi8uXSskLyk7XG5cbiAgICAvLyByZW1vdmUgZXh0ZW5zaW9uIGluIGNhc2UgdGhlcmUgaXMgb25lXG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IGV4dGVuc2lvbk1hdGNoID8gZXh0ZW5zaW9uTWF0Y2hbMF0gOiAnJztcbiAgICBsZXQgZXh0ZW5zaW9uRnJlZSA9IGV4dGVuc2lvbk1hdGNoID8gbmFtZS5zbGljZSgwLCBleHRlbnNpb25NYXRjaC5pbmRleCkgOiBuYW1lO1xuXG4gICAgbGV0IHByZWZpeE51bWJlciA9IDE7XG4gICAgbGV0IGJhc2VFeHRlbnNpb25GcmVlO1xuXG4gICAgaWYgKGJhc2VOYW1lKSB7XG4gICAgICBjb25zdCBiYXNlRXh0ZW5zaW9uTWF0Y2ggPSBiYXNlTmFtZS5tYXRjaCgvXFwuW14vLl0rJC8pO1xuXG4gICAgICAvLyByZW1vdmUgZXh0ZW5zaW9uIGluIGNhc2UgdGhlcmUgaXMgb25lXG4gICAgICBiYXNlRXh0ZW5zaW9uRnJlZSA9IGJhc2VFeHRlbnNpb25NYXRjaCA/IGJhc2VOYW1lLnNsaWNlKDAsIGJhc2VFeHRlbnNpb25NYXRjaC5pbmRleCkgOiBiYXNlTmFtZTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2VFeHRlbnNpb25GcmVlIHx8IGJhc2VFeHRlbnNpb25GcmVlICE9PSBleHRlbnNpb25GcmVlKSB7XG4gICAgICAvLyBjaGVjayBpZiBuYW1lIGFscmVhZHkgaGFzIGludGVnZXIgYXBwZW5kZWQgb24gZW5kOlxuICAgICAgY29uc3Qgb2xkUHJlZml4ID0gZXh0ZW5zaW9uRnJlZS5tYXRjaCgnLVswLTldKyQnKTtcbiAgICAgIGlmIChvbGRQcmVmaXgpIHtcbiAgICAgICAgLy8gaWYgc28sIHRyeSB0byBnZXQgdGhlIG51bWJlciBhdCB0aGUgZW5kXG4gICAgICAgIGNvbnN0IG9sZFByZWZpeE51bWJlciA9IHBhcnNlSW50KG9sZFByZWZpeFswXS5zbGljZSgxKSwgMTApO1xuICAgICAgICBpZiAob2xkUHJlZml4TnVtYmVyLnRvU3RyaW5nKCkgPT09IG9sZFByZWZpeFswXS5zbGljZSgxKSkge1xuICAgICAgICAgIGV4dGVuc2lvbkZyZWUgPSBleHRlbnNpb25GcmVlLnNsaWNlKDAsIG9sZFByZWZpeC5pbmRleCk7XG4gICAgICAgICAgcHJlZml4TnVtYmVyID0gb2xkUHJlZml4TnVtYmVyICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uRnJlZSArICctJyArIHByZWZpeE51bWJlciArIGZpbGVFeHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoaWxkcmVuIG5vZGVzIG9mIGdpdmVuIHBhcmVudCBub2RlXG4gICAqXG4gICAqIEBwYXJhbSBub2RlSWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbm9kZVxuICAgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICovXG4gIGdldE5vZGVDaGlsZHJlbihub2RlSWQ6IHN0cmluZywgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxOb2RlQ2hpbGRBc3NvY2lhdGlvblBhZ2luZz4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMubm9kZXNBcGkubGlzdE5vZGVDaGlsZHJlbihub2RlSWQsIHBhcmFtcykpO1xuICB9XG5cbiAgLy8gQ29waWVkIGZyb20gQURGIGRvY3VtZW50LWxpc3Quc2VydmljZSwgYW5kIGFkZGVkIHRoZSBuYW1lIHBhcmFtZXRlclxuICAvKipcbiAgICogQ29weSBhIG5vZGUgdG8gZGVzdGluYXRpb24gbm9kZVxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUlkIFRoZSBpZCBvZiB0aGUgbm9kZSB0byBiZSBjb3BpZWRcbiAgICogQHBhcmFtIHRhcmdldFBhcmVudElkIFRoZSBpZCBvZiB0aGUgZm9sZGVyLW5vZGUgd2hlcmUgdGhlIG5vZGUgaGF2ZSB0byBiZSBjb3BpZWQgdG9cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIGZvciB0aGUgY29weSB0aGF0IHdvdWxkIGJlIGFkZGVkIG9uIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXJcbiAgICovXG4gIGNvcHlOb2RlKG5vZGVJZDogc3RyaW5nLCB0YXJnZXRQYXJlbnRJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5ub2Rlc0FwaS5jb3B5Tm9kZShub2RlSWQsIHsgdGFyZ2V0UGFyZW50SWQsIG5hbWUgfSkpO1xuICB9XG5cbiAgcHVibGljIGZsYXR0ZW4obkRpbUFycmF5OiBhbnlbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuRGltQXJyYXkpKSB7XG4gICAgICByZXR1cm4gbkRpbUFycmF5O1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVRdWV1ZSA9IG5EaW1BcnJheS5zbGljZSgwKTtcbiAgICBjb25zdCByZXN1bHRpbmdBcnJheTogYW55W10gPSBbXTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGVRdWV1ZS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgbm9kZVF1ZXVlLnB1c2goLi4ubm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0aW5nQXJyYXkucHVzaChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVRdWV1ZS5pbmRleE9mKG5vZGUpO1xuICAgICAgICBub2RlUXVldWUuc3BsaWNlKG5vZGVJbmRleCwgMSk7XG4gICAgICB9KTtcbiAgICB9IHdoaWxlIChub2RlUXVldWUubGVuZ3RoKTtcblxuICAgIHJldHVybiByZXN1bHRpbmdBcnJheTtcbiAgfVxuXG4gIHByb2Nlc3NSZXNwb25zZShkYXRhOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IG1vdmVTdGF0dXMgPSB7XG4gICAgICBzdWNjZWVkZWQ6IFtdLFxuICAgICAgZmFpbGVkOiBbXSxcbiAgICAgIHBhcnRpYWxseVN1Y2NlZWRlZDogW11cbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjLCBuZXh0KSA9PiB7XG4gICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBhY2MuZmFpbGVkLnB1c2gobmV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgICAgICAgIC8vIGlmIGNvbnRlbnQgb2YgYSBmb2xkZXIgd2FzIG1vdmVkXG5cbiAgICAgICAgICBjb25zdCBmb2xkZXJNb3ZlUmVzcG9uc2VEYXRhID0gdGhpcy5mbGF0dGVuKG5leHQpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kRXJyb3IgPSBmb2xkZXJNb3ZlUmVzcG9uc2VEYXRhLmZpbmQoKG5vZGUpID0+IG5vZGUgaW5zdGFuY2VvZiBFcnJvcik7XG4gICAgICAgICAgLy8gZGF0YSBtaWdodCBjb250YWluIGFsc28gaXRlbXMgb2YgZm9ybTogeyBpdGVtTW92ZWQsIGluaXRpYWxQYXJlbnRJZCB9XG4gICAgICAgICAgY29uc3QgZm91bmRFbnRyeSA9IGZvbGRlck1vdmVSZXNwb25zZURhdGEuZmluZCgobm9kZSkgPT4gbm9kZS5pdGVtTW92ZWQ/LmVudHJ5IHx8IG5vZGU/LmVudHJ5KTtcblxuICAgICAgICAgIGlmICghZm91bmRFcnJvcikge1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgc3VjY2VzcyBpZiBOT05FIG9mIHRoZSBpdGVtcyBmcm9tIHRoZSBmb2xkZXIgbW92ZSByZXNwb25zZSBpcyBhbiBlcnJvclxuICAgICAgICAgICAgYWNjLnN1Y2NlZWRlZC5wdXNoKG5leHQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWZvdW5kRW50cnkpIHtcbiAgICAgICAgICAgIC8vIGNvbnNpZGVyIGZhaWxlZCBpZiBOT05FIG9mIHRoZSBpdGVtcyBoYXMgYW4gZW50cnlcbiAgICAgICAgICAgIGFjYy5mYWlsZWQucHVzaChuZXh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFydGlhbGx5IG1vdmUgZm9sZGVyXG4gICAgICAgICAgICBhY2MucGFydGlhbGx5U3VjY2VlZGVkLnB1c2gobmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYy5zdWNjZWVkZWQucHVzaChuZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBtb3ZlU3RhdHVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEuaXRlbU1vdmVkPy5lbnRyeSB8fCBkYXRhPy5lbnRyeSkge1xuICAgICAgICBtb3ZlU3RhdHVzLnN1Y2NlZWRlZC5wdXNoKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW92ZVN0YXR1cy5mYWlsZWQucHVzaChkYXRhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vdmVTdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGZvY3VzZWRFbGVtZW50U2VsZWN0b3IpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuIl19