@tilde-nlp/ngx-common 4.0.28 → 5.0.2

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 (497) hide show
  1. package/esm2022/lib/close-button/close-button.component.mjs +34 -34
  2. package/esm2022/lib/close-button/close-button.module.mjs +36 -36
  3. package/esm2022/lib/close-button/index.mjs +2 -2
  4. package/esm2022/lib/company-product/company-product.component.mjs +20 -20
  5. package/esm2022/lib/company-product/company-product.module.mjs +22 -22
  6. package/esm2022/lib/company-product/index.mjs +2 -2
  7. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +25 -25
  8. package/esm2022/lib/confirmation-modal/confirmation-modal.module.mjs +21 -21
  9. package/esm2022/lib/confirmation-modal/index.mjs +5 -5
  10. package/esm2022/lib/confirmation-modal/models/confirmation-body.model.mjs +1 -1
  11. package/esm2022/lib/confirmation-modal/models/confirmation.enum.mjs +5 -5
  12. package/esm2022/lib/confirmation-modal/services/confirmation.service.mjs +25 -25
  13. package/esm2022/lib/confirmation-modal/services/index.mjs +1 -1
  14. package/esm2022/lib/constants/index.mjs +1 -1
  15. package/esm2022/lib/constants/screen-size.const.mjs +10 -10
  16. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +29 -29
  17. package/esm2022/lib/directives/click-outside/click-outside.module.mjs +24 -24
  18. package/esm2022/lib/directives/click-outside/index.mjs +2 -2
  19. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.directive.mjs +62 -62
  20. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.module.mjs +24 -24
  21. package/esm2022/lib/directives/drag-and-drop/index.mjs +2 -2
  22. package/esm2022/lib/directives/index.mjs +3 -3
  23. package/esm2022/lib/directives/mat-button-loading/index.mjs +2 -2
  24. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.directive.mjs +59 -59
  25. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.module.mjs +20 -20
  26. package/esm2022/lib/extension-dialog/components/index.mjs +1 -1
  27. package/esm2022/lib/extension-dialog/components/open-extension-dialog/open-extension-dialog.component.mjs +22 -22
  28. package/esm2022/lib/extension-dialog/extension-dialog.component.mjs +142 -142
  29. package/esm2022/lib/extension-dialog/extension-dialog.module.mjs +51 -51
  30. package/esm2022/lib/extension-dialog/icons/file-types/excel.icon.mjs +1 -1
  31. package/esm2022/lib/extension-dialog/icons/file-types/index.mjs +9 -9
  32. package/esm2022/lib/extension-dialog/icons/file-types/interchange.icon.mjs +1 -1
  33. package/esm2022/lib/extension-dialog/icons/file-types/office-other.icon.mjs +1 -1
  34. package/esm2022/lib/extension-dialog/icons/file-types/other.icon.mjs +1 -1
  35. package/esm2022/lib/extension-dialog/icons/file-types/pdf.icon.mjs +1 -1
  36. package/esm2022/lib/extension-dialog/icons/file-types/powerpoint.icon.mjs +1 -1
  37. package/esm2022/lib/extension-dialog/icons/file-types/scanned.icon.mjs +1 -1
  38. package/esm2022/lib/extension-dialog/icons/file-types/web.icon.mjs +1 -1
  39. package/esm2022/lib/extension-dialog/icons/file-types/word.icon.mjs +1 -1
  40. package/esm2022/lib/extension-dialog/icons/index.mjs +1 -1
  41. package/esm2022/lib/extension-dialog/index.mjs +5 -5
  42. package/esm2022/lib/extension-dialog/models/enums/file-categories.enum.mjs +8 -8
  43. package/esm2022/lib/extension-dialog/models/enums/file-extensions.enum.mjs +34 -34
  44. package/esm2022/lib/extension-dialog/models/enums/file-type-icons.enum.mjs +12 -12
  45. package/esm2022/lib/extension-dialog/models/enums/file-types.enum.mjs +12 -12
  46. package/esm2022/lib/extension-dialog/models/enums/index.mjs +4 -4
  47. package/esm2022/lib/extension-dialog/models/index.mjs +2 -2
  48. package/esm2022/lib/extension-dialog/models/interfaces/config.mjs +1 -1
  49. package/esm2022/lib/extension-dialog/models/interfaces/dialog-data.model.mjs +1 -1
  50. package/esm2022/lib/extension-dialog/models/interfaces/index.mjs +2 -2
  51. package/esm2022/lib/extension-dialog/services/extension-dialog.service.mjs +22 -22
  52. package/esm2022/lib/extension-dialog/services/index.mjs +1 -1
  53. package/esm2022/lib/file-upload/file-upload.component.mjs +107 -107
  54. package/esm2022/lib/file-upload/file-upload.module.mjs +42 -42
  55. package/esm2022/lib/file-upload/index.mjs +3 -3
  56. package/esm2022/lib/file-upload/models/file-upload-error-type.enum.mjs +7 -7
  57. package/esm2022/lib/file-upload/models/file-upload-error.model.mjs +1 -1
  58. package/esm2022/lib/file-upload/models/index.mjs +2 -2
  59. package/esm2022/lib/filter-bar/filter-bar.component.mjs +146 -146
  60. package/esm2022/lib/filter-bar/filter-bar.module.mjs +71 -71
  61. package/esm2022/lib/filter-bar/index.mjs +3 -3
  62. package/esm2022/lib/filter-bar/models/filter-bar-change-event.model.mjs +1 -1
  63. package/esm2022/lib/filter-bar/models/filter-bar-filter-item.model.mjs +1 -1
  64. package/esm2022/lib/filter-bar/models/filter-bar-filter.model.mjs +1 -1
  65. package/esm2022/lib/filter-bar/models/filter-bar-settings.model.mjs +1 -1
  66. package/esm2022/lib/filter-bar/models/index.mjs +3 -3
  67. package/esm2022/lib/footer/footer.component.mjs +37 -37
  68. package/esm2022/lib/footer/footer.module.mjs +34 -34
  69. package/esm2022/lib/footer/index.mjs +2 -2
  70. package/esm2022/lib/helpers/auth-headers.helper.mjs +24 -21
  71. package/esm2022/lib/helpers/conversion.helper.mjs +10 -10
  72. package/esm2022/lib/helpers/file-extension.helper.mjs +5 -5
  73. package/esm2022/lib/helpers/html-element-parse.helper.mjs +15 -15
  74. package/esm2022/lib/helpers/html.helper.mjs +54 -54
  75. package/esm2022/lib/helpers/index.mjs +9 -9
  76. package/esm2022/lib/helpers/missing-translation.helper.mjs +6 -6
  77. package/esm2022/lib/helpers/resolution.helper.mjs +6 -6
  78. package/esm2022/lib/helpers/save-file.helper.mjs +10 -10
  79. package/esm2022/lib/helpers/sort.helper.mjs +11 -10
  80. package/esm2022/lib/inline-message/index.mjs +3 -3
  81. package/esm2022/lib/inline-message/inline-message.component.mjs +23 -23
  82. package/esm2022/lib/inline-message/inline-message.module.mjs +32 -32
  83. package/esm2022/lib/inline-message/models/index.mjs +3 -3
  84. package/esm2022/lib/inline-message/models/inline-message-icon-position.enum.mjs +5 -5
  85. package/esm2022/lib/inline-message/models/inline-message-type.enum.mjs +6 -6
  86. package/esm2022/lib/inline-message/models/inline-message.model.mjs +1 -1
  87. package/esm2022/lib/multi-functional-table/constants/disable-export-attribute-name.const.mjs +1 -1
  88. package/esm2022/lib/multi-functional-table/constants/index.mjs +1 -1
  89. package/esm2022/lib/multi-functional-table/index.mjs +4 -4
  90. package/esm2022/lib/multi-functional-table/models/batch-config.model.mjs +1 -1
  91. package/esm2022/lib/multi-functional-table/models/column-config.model.mjs +1 -1
  92. package/esm2022/lib/multi-functional-table/models/column-select-config.model.mjs +1 -1
  93. package/esm2022/lib/multi-functional-table/models/export-config.model.mjs +1 -1
  94. package/esm2022/lib/multi-functional-table/models/export-format.enum.mjs +4 -4
  95. package/esm2022/lib/multi-functional-table/models/filter-config.model.mjs +2 -2
  96. package/esm2022/lib/multi-functional-table/models/index.mjs +6 -6
  97. package/esm2022/lib/multi-functional-table/models/multi-functional-table-config.model.mjs +1 -1
  98. package/esm2022/lib/multi-functional-table/models/selected-column-local-storage-config.model.mjs +1 -1
  99. package/esm2022/lib/multi-functional-table/multi-functional-table.component.mjs +228 -229
  100. package/esm2022/lib/multi-functional-table/multi-functional-table.module.mjs +72 -72
  101. package/esm2022/lib/notification-message/enums/index.mjs +1 -1
  102. package/esm2022/lib/notification-message/enums/notification-message-type.enum.mjs +8 -8
  103. package/esm2022/lib/notification-message/index.mjs +4 -4
  104. package/esm2022/lib/notification-message/interfaces/index.mjs +1 -1
  105. package/esm2022/lib/notification-message/interfaces/notification-message.model.mjs +1 -1
  106. package/esm2022/lib/notification-message/notification-message.component.mjs +52 -52
  107. package/esm2022/lib/notification-message/notification-message.module.mjs +44 -44
  108. package/esm2022/lib/open-close-button/index.mjs +4 -4
  109. package/esm2022/lib/open-close-button/injection-tokens/index.mjs +1 -1
  110. package/esm2022/lib/open-close-button/injection-tokens/open-close-btn-icons.token.mjs +1 -1
  111. package/esm2022/lib/open-close-button/models/index.mjs +1 -1
  112. package/esm2022/lib/open-close-button/models/open-close-btn-icons.model.mjs +1 -1
  113. package/esm2022/lib/open-close-button/open-close-button.component.mjs +53 -53
  114. package/esm2022/lib/open-close-button/open-close-button.module.mjs +21 -21
  115. package/esm2022/lib/pipes/date-ago/date-ago.module.mjs +28 -28
  116. package/esm2022/lib/pipes/date-ago/date-ago.pipe.mjs +114 -114
  117. package/esm2022/lib/pipes/date-ago/index.mjs +2 -2
  118. package/esm2022/lib/pipes/date-ago/models/date-ago-interval.model.mjs +1 -1
  119. package/esm2022/lib/pipes/date-ago/models/date-ago-settings.model.mjs +1 -1
  120. package/esm2022/lib/pipes/date-ago/models/date-ago-settings.token.mjs +1 -1
  121. package/esm2022/lib/pipes/date-ago/models/date-ago.model.mjs +1 -1
  122. package/esm2022/lib/pipes/date-ago/models/index.mjs +4 -4
  123. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.module.mjs +24 -24
  124. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.pipe.mjs +43 -42
  125. package/esm2022/lib/pipes/filter-with-highlight/index.mjs +2 -2
  126. package/esm2022/lib/pipes/index.mjs +6 -7
  127. package/esm2022/lib/pipes/language-translate/index.mjs +2 -2
  128. package/esm2022/lib/pipes/language-translate/language-translate.module.mjs +18 -18
  129. package/esm2022/lib/pipes/language-translate/language-translate.pipe.mjs +100 -99
  130. package/esm2022/lib/pipes/sort-translations/index.mjs +2 -2
  131. package/esm2022/lib/pipes/sort-translations/sort-translations.module.mjs +22 -22
  132. package/esm2022/lib/pipes/sort-translations/sort-translations.pipe.mjs +60 -60
  133. package/esm2022/lib/pipes/sort-translations-by-property/index.mjs +2 -2
  134. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.module.mjs +18 -18
  135. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.pipe.mjs +40 -40
  136. package/esm2022/lib/plausible/index.mjs +4 -4
  137. package/esm2022/lib/plausible/models/index.mjs +1 -1
  138. package/esm2022/lib/plausible/models/plausible-event.model.mjs +1 -1
  139. package/esm2022/lib/plausible/plausible-event.directive.mjs +40 -40
  140. package/esm2022/lib/plausible/plausible.helper.mjs +37 -37
  141. package/esm2022/lib/plausible/plausible.module.mjs +24 -24
  142. package/esm2022/lib/services/alert/alert.service.mjs +167 -165
  143. package/esm2022/lib/services/alert/index.mjs +3 -3
  144. package/esm2022/lib/services/alert/injection-tokens/alert-configuration.token.mjs +1 -1
  145. package/esm2022/lib/services/alert/injection-tokens/index.mjs +1 -1
  146. package/esm2022/lib/services/alert/models/alert-configuration.model.mjs +2 -2
  147. package/esm2022/lib/services/alert/models/index.mjs +1 -1
  148. package/esm2022/lib/services/dom/dom.service.mjs +21 -21
  149. package/esm2022/lib/services/dom/index.mjs +1 -1
  150. package/esm2022/lib/services/icon/icon.service.mjs +35 -35
  151. package/esm2022/lib/services/icon/index.mjs +1 -1
  152. package/esm2022/lib/services/index.mjs +6 -6
  153. package/esm2022/lib/services/language-translate/index.mjs +1 -1
  154. package/esm2022/lib/services/language-translate/language-translate.service.mjs +25 -25
  155. package/esm2022/lib/services/notification/index.mjs +2 -2
  156. package/esm2022/lib/services/notification/models/index.mjs +2 -2
  157. package/esm2022/lib/services/notification/models/notification.model.mjs +1 -1
  158. package/esm2022/lib/services/notification/models/operations.enum.mjs +5 -5
  159. package/esm2022/lib/services/notification/notification.service.mjs +35 -35
  160. package/esm2022/lib/services/system/index.mjs +1 -1
  161. package/esm2022/lib/services/system/system.service.mjs +23 -23
  162. package/esm2022/lib/status-display/index.mjs +3 -3
  163. package/esm2022/lib/status-display/models/index.mjs +1 -1
  164. package/esm2022/lib/status-display/models/status-display-config.model.mjs +1 -1
  165. package/esm2022/lib/status-display/status-display.component.mjs +17 -17
  166. package/esm2022/lib/status-display/status-display.module.mjs +21 -21
  167. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.mjs +65 -65
  168. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.mjs +70 -70
  169. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.mjs +60 -58
  170. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.mjs +56 -56
  171. package/esm2022/lib/terminology/components/terminology-panel/terminology-panel.component.mjs +49 -49
  172. package/esm2022/lib/terminology/config/models/index.mjs +1 -1
  173. package/esm2022/lib/terminology/config/models/terminology-config.model.mjs +1 -1
  174. package/esm2022/lib/terminology/config/services/index.mjs +1 -1
  175. package/esm2022/lib/terminology/config/services/terminology-config/terminology-config.service.mjs +45 -48
  176. package/esm2022/lib/terminology/enums/combined-collection-tooltip-key.enum.mjs +5 -5
  177. package/esm2022/lib/terminology/enums/engine-term-collection-scope.enum.mjs +6 -6
  178. package/esm2022/lib/terminology/enums/engine-term-collection-source.enum.mjs +5 -5
  179. package/esm2022/lib/terminology/enums/engine-term-collection-status.enum.mjs +7 -7
  180. package/esm2022/lib/terminology/enums/engine-term-collection-sub-status.enum.mjs +13 -13
  181. package/esm2022/lib/terminology/enums/index.mjs +6 -6
  182. package/esm2022/lib/terminology/enums/mt-collection-status.enum.mjs +10 -10
  183. package/esm2022/lib/terminology/enums/mt-term-collection-v1-status.enum.mjs +6 -6
  184. package/esm2022/lib/terminology/enums/system-metadata-key.enum.mjs +6 -6
  185. package/esm2022/lib/terminology/enums/translation-api-version.model.mjs +5 -5
  186. package/esm2022/lib/terminology/factories/terminology-api.factory.mjs +12 -12
  187. package/esm2022/lib/terminology/factories/terminology-system.factory.mjs +13 -13
  188. package/esm2022/lib/terminology/icons/collections-menu.icon.mjs +1 -1
  189. package/esm2022/lib/terminology/icons/index.mjs +1 -1
  190. package/esm2022/lib/terminology/index.mjs +9 -9
  191. package/esm2022/lib/terminology/injection-tokens/terminology-api.token.mjs +1 -1
  192. package/esm2022/lib/terminology/injection-tokens/terminology-system.token.mjs +1 -1
  193. package/esm2022/lib/terminology/models/active-data.model.mjs +2 -2
  194. package/esm2022/lib/terminology/models/add-engine-terms-request-params.model.mjs +1 -1
  195. package/esm2022/lib/terminology/models/api-system.model.mjs +2 -2
  196. package/esm2022/lib/terminology/models/combined-collection.model.mjs +189 -189
  197. package/esm2022/lib/terminology/models/default-term-collection-order-update.model.mjs +1 -1
  198. package/esm2022/lib/terminology/models/domain.model.mjs +1 -1
  199. package/esm2022/lib/terminology/models/engine-term-collection-access-scope-update.model.mjs +1 -1
  200. package/esm2022/lib/terminology/models/engine-term-collection-access-scope.model.mjs +1 -1
  201. package/esm2022/lib/terminology/models/engine-term-collection-access-update.model.mjs +1 -1
  202. package/esm2022/lib/terminology/models/engine-term-collection-access.model.mjs +1 -1
  203. package/esm2022/lib/terminology/models/engine-term-collection-list.model.mjs +1 -1
  204. package/esm2022/lib/terminology/models/engine-term-collection.model.mjs +1 -1
  205. package/esm2022/lib/terminology/models/index.mjs +20 -20
  206. package/esm2022/lib/terminology/models/lang-list-item.model.mjs +1 -1
  207. package/esm2022/lib/terminology/models/mt-collection.model.mjs +1 -1
  208. package/esm2022/lib/terminology/models/mt-term-collection-v1.model.mjs +1 -1
  209. package/esm2022/lib/terminology/models/mt-term-service.model.mjs +1 -1
  210. package/esm2022/lib/terminology/models/system-api-service.model.mjs +1 -1
  211. package/esm2022/lib/terminology/models/system.model.mjs +2 -2
  212. package/esm2022/lib/terminology/models/terminology-engine.model.mjs +2 -2
  213. package/esm2022/lib/terminology/models/tld-term-collection-languages.model.mjs +1 -1
  214. package/esm2022/lib/terminology/models/tld-term-collection.model.mjs +2 -2
  215. package/esm2022/lib/terminology/models/update-engine-terms-request-params.model.mjs +1 -1
  216. package/esm2022/lib/terminology/models/vendor.model.mjs +1 -1
  217. package/esm2022/lib/terminology/services/engine-term-api/engine-term-api.service.mjs +51 -51
  218. package/esm2022/lib/terminology/services/engine-term-api/index.mjs +1 -1
  219. package/esm2022/lib/terminology/services/index.mjs +5 -5
  220. package/esm2022/lib/terminology/services/system-api-v1/system-api-v1.service.mjs +60 -59
  221. package/esm2022/lib/terminology/services/system-api-v2/models/engine-deployment.model.mjs +1 -1
  222. package/esm2022/lib/terminology/services/system-api-v2/models/engine-domain-list.model.mjs +1 -1
  223. package/esm2022/lib/terminology/services/system-api-v2/models/engine-domain.model.mjs +1 -1
  224. package/esm2022/lib/terminology/services/system-api-v2/models/engine-list.model.mjs +1 -1
  225. package/esm2022/lib/terminology/services/system-api-v2/models/engine-status.enum.mjs +10 -10
  226. package/esm2022/lib/terminology/services/system-api-v2/models/engine-sub-status.enum.mjs +17 -17
  227. package/esm2022/lib/terminology/services/system-api-v2/models/engine.model.mjs +1 -1
  228. package/esm2022/lib/terminology/services/system-api-v2/models/index.mjs +8 -8
  229. package/esm2022/lib/terminology/services/system-api-v2/models/revision.model.mjs +1 -1
  230. package/esm2022/lib/terminology/services/system-api-v2/models/worker-status.model.mjs +1 -1
  231. package/esm2022/lib/terminology/services/system-api-v2/system-api-v2.service.mjs +81 -81
  232. package/esm2022/lib/terminology/services/terminology/terminology.service.mjs +325 -324
  233. package/esm2022/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.mjs +59 -58
  234. package/esm2022/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.mjs +85 -84
  235. package/esm2022/lib/terminology/services/terminology-collection/index.mjs +1 -1
  236. package/esm2022/lib/terminology/services/terminology-collection/terminology-collection.service.mjs +54 -54
  237. package/esm2022/lib/terminology/terminology.component.mjs +137 -137
  238. package/esm2022/lib/terminology/terminology.module.mjs +132 -132
  239. package/esm2022/lib/tld-loader/index.mjs +2 -2
  240. package/esm2022/lib/tld-loader/tld-loader.component.mjs +11 -11
  241. package/esm2022/lib/tld-loader/tld-loader.module.mjs +20 -20
  242. package/esm2022/public-api.mjs +23 -23
  243. package/esm2022/tilde-nlp-ngx-common.mjs +4 -4
  244. package/fesm2022/tilde-nlp-ngx-common.mjs +3768 -3791
  245. package/fesm2022/tilde-nlp-ngx-common.mjs.map +1 -1
  246. package/index.d.ts +5 -5
  247. package/lib/close-button/close-button.component.d.ts +13 -13
  248. package/lib/close-button/close-button.module.d.ts +11 -11
  249. package/lib/close-button/index.d.ts +2 -2
  250. package/lib/company-product/company-product.component.d.ts +7 -7
  251. package/lib/company-product/company-product.module.d.ts +8 -8
  252. package/lib/company-product/index.d.ts +2 -2
  253. package/lib/confirmation-modal/confirmation-modal.component.d.ts +12 -12
  254. package/lib/confirmation-modal/confirmation-modal.module.d.ts +11 -11
  255. package/lib/confirmation-modal/index.d.ts +5 -5
  256. package/lib/confirmation-modal/models/confirmation-body.model.d.ts +8 -8
  257. package/lib/confirmation-modal/models/confirmation.enum.d.ts +4 -4
  258. package/lib/confirmation-modal/services/confirmation.service.d.ts +12 -12
  259. package/lib/confirmation-modal/services/index.d.ts +1 -1
  260. package/lib/constants/index.d.ts +1 -1
  261. package/lib/constants/screen-size.const.d.ts +10 -10
  262. package/lib/directives/click-outside/click-outside.directive.d.ts +10 -10
  263. package/lib/directives/click-outside/click-outside.module.d.ts +8 -8
  264. package/lib/directives/click-outside/index.d.ts +2 -2
  265. package/lib/directives/drag-and-drop/drag-and-drop.directive.d.ts +14 -14
  266. package/lib/directives/drag-and-drop/drag-and-drop.module.d.ts +8 -8
  267. package/lib/directives/drag-and-drop/index.d.ts +2 -2
  268. package/lib/directives/index.d.ts +3 -3
  269. package/lib/directives/mat-button-loading/index.d.ts +2 -2
  270. package/lib/directives/mat-button-loading/mat-button-loading.directive.d.ts +18 -18
  271. package/lib/directives/mat-button-loading/mat-button-loading.module.d.ts +8 -8
  272. package/lib/extension-dialog/components/index.d.ts +1 -1
  273. package/lib/extension-dialog/components/open-extension-dialog/open-extension-dialog.component.d.ts +10 -10
  274. package/lib/extension-dialog/extension-dialog.component.d.ts +21 -21
  275. package/lib/extension-dialog/extension-dialog.module.d.ts +15 -15
  276. package/lib/extension-dialog/icons/file-types/excel.icon.d.ts +1 -1
  277. package/lib/extension-dialog/icons/file-types/index.d.ts +9 -9
  278. package/lib/extension-dialog/icons/file-types/interchange.icon.d.ts +1 -1
  279. package/lib/extension-dialog/icons/file-types/office-other.icon.d.ts +1 -1
  280. package/lib/extension-dialog/icons/file-types/other.icon.d.ts +1 -1
  281. package/lib/extension-dialog/icons/file-types/pdf.icon.d.ts +1 -1
  282. package/lib/extension-dialog/icons/file-types/powerpoint.icon.d.ts +1 -1
  283. package/lib/extension-dialog/icons/file-types/scanned.icon.d.ts +1 -1
  284. package/lib/extension-dialog/icons/file-types/web.icon.d.ts +1 -1
  285. package/lib/extension-dialog/icons/file-types/word.icon.d.ts +1 -1
  286. package/lib/extension-dialog/icons/index.d.ts +1 -1
  287. package/lib/extension-dialog/index.d.ts +5 -5
  288. package/lib/extension-dialog/models/enums/file-categories.enum.d.ts +7 -7
  289. package/lib/extension-dialog/models/enums/file-extensions.enum.d.ts +33 -33
  290. package/lib/extension-dialog/models/enums/file-type-icons.enum.d.ts +11 -11
  291. package/lib/extension-dialog/models/enums/file-types.enum.d.ts +11 -11
  292. package/lib/extension-dialog/models/enums/index.d.ts +4 -4
  293. package/lib/extension-dialog/models/index.d.ts +2 -2
  294. package/lib/extension-dialog/models/interfaces/config.d.ts +18 -18
  295. package/lib/extension-dialog/models/interfaces/dialog-data.model.d.ts +3 -3
  296. package/lib/extension-dialog/models/interfaces/index.d.ts +2 -2
  297. package/lib/extension-dialog/services/extension-dialog.service.d.ts +9 -9
  298. package/lib/extension-dialog/services/index.d.ts +1 -1
  299. package/lib/file-upload/file-upload.component.d.ts +29 -29
  300. package/lib/file-upload/file-upload.module.d.ts +13 -13
  301. package/lib/file-upload/index.d.ts +3 -3
  302. package/lib/file-upload/models/file-upload-error-type.enum.d.ts +6 -6
  303. package/lib/file-upload/models/file-upload-error.model.d.ts +6 -6
  304. package/lib/file-upload/models/index.d.ts +2 -2
  305. package/lib/filter-bar/filter-bar.component.d.ts +54 -54
  306. package/lib/filter-bar/filter-bar.module.d.ts +19 -19
  307. package/lib/filter-bar/index.d.ts +3 -3
  308. package/lib/filter-bar/models/filter-bar-change-event.model.d.ts +6 -6
  309. package/lib/filter-bar/models/filter-bar-filter-item.model.d.ts +4 -4
  310. package/lib/filter-bar/models/filter-bar-filter.model.d.ts +6 -6
  311. package/lib/filter-bar/models/filter-bar-settings.model.d.ts +19 -19
  312. package/lib/filter-bar/models/index.d.ts +3 -3
  313. package/lib/footer/footer.component.d.ts +15 -15
  314. package/lib/footer/footer.module.d.ts +11 -11
  315. package/lib/footer/index.d.ts +2 -2
  316. package/lib/helpers/auth-headers.helper.d.ts +4 -4
  317. package/lib/helpers/conversion.helper.d.ts +4 -4
  318. package/lib/helpers/file-extension.helper.d.ts +3 -3
  319. package/lib/helpers/html-element-parse.helper.d.ts +3 -3
  320. package/lib/helpers/html.helper.d.ts +17 -17
  321. package/lib/helpers/index.d.ts +9 -9
  322. package/lib/helpers/missing-translation.helper.d.ts +4 -4
  323. package/lib/helpers/resolution.helper.d.ts +3 -3
  324. package/lib/helpers/save-file.helper.d.ts +3 -3
  325. package/lib/helpers/sort.helper.d.ts +3 -3
  326. package/lib/inline-message/index.d.ts +3 -3
  327. package/lib/inline-message/inline-message.component.d.ts +10 -10
  328. package/lib/inline-message/inline-message.module.d.ts +10 -10
  329. package/lib/inline-message/models/index.d.ts +3 -3
  330. package/lib/inline-message/models/inline-message-icon-position.enum.d.ts +4 -4
  331. package/lib/inline-message/models/inline-message-type.enum.d.ts +5 -5
  332. package/lib/inline-message/models/inline-message.model.d.ts +10 -10
  333. package/lib/multi-functional-table/constants/disable-export-attribute-name.const.d.ts +1 -1
  334. package/lib/multi-functional-table/constants/index.d.ts +1 -1
  335. package/lib/multi-functional-table/index.d.ts +4 -4
  336. package/lib/multi-functional-table/models/batch-config.model.d.ts +4 -4
  337. package/lib/multi-functional-table/models/column-config.model.d.ts +18 -18
  338. package/lib/multi-functional-table/models/column-select-config.model.d.ts +14 -14
  339. package/lib/multi-functional-table/models/export-config.model.d.ts +9 -9
  340. package/lib/multi-functional-table/models/export-format.enum.d.ts +3 -3
  341. package/lib/multi-functional-table/models/filter-config.model.d.ts +6 -7
  342. package/lib/multi-functional-table/models/index.d.ts +6 -6
  343. package/lib/multi-functional-table/models/multi-functional-table-config.model.d.ts +36 -36
  344. package/lib/multi-functional-table/models/selected-column-local-storage-config.model.d.ts +20 -20
  345. package/lib/multi-functional-table/multi-functional-table.component.d.ts +66 -67
  346. package/lib/multi-functional-table/multi-functional-table.module.d.ts +20 -20
  347. package/lib/notification-message/enums/index.d.ts +1 -1
  348. package/lib/notification-message/enums/notification-message-type.enum.d.ts +7 -7
  349. package/lib/notification-message/index.d.ts +4 -4
  350. package/lib/notification-message/interfaces/index.d.ts +1 -1
  351. package/lib/notification-message/interfaces/notification-message.model.d.ts +22 -22
  352. package/lib/notification-message/notification-message.component.d.ts +22 -22
  353. package/lib/notification-message/notification-message.module.d.ts +13 -13
  354. package/lib/open-close-button/index.d.ts +4 -4
  355. package/lib/open-close-button/injection-tokens/index.d.ts +1 -1
  356. package/lib/open-close-button/injection-tokens/open-close-btn-icons.token.d.ts +1 -1
  357. package/lib/open-close-button/models/index.d.ts +1 -1
  358. package/lib/open-close-button/models/open-close-btn-icons.model.d.ts +4 -4
  359. package/lib/open-close-button/open-close-button.component.d.ts +22 -22
  360. package/lib/open-close-button/open-close-button.module.d.ts +11 -11
  361. package/lib/pipes/date-ago/date-ago.module.d.ts +9 -9
  362. package/lib/pipes/date-ago/date-ago.pipe.d.ts +20 -20
  363. package/lib/pipes/date-ago/index.d.ts +2 -2
  364. package/lib/pipes/date-ago/models/date-ago-interval.model.d.ts +5 -5
  365. package/lib/pipes/date-ago/models/date-ago-settings.model.d.ts +26 -26
  366. package/lib/pipes/date-ago/models/date-ago-settings.token.d.ts +1 -1
  367. package/lib/pipes/date-ago/models/date-ago.model.d.ts +4 -4
  368. package/lib/pipes/date-ago/models/index.d.ts +4 -4
  369. package/lib/pipes/filter-with-highlight/filter-with-highlight.module.d.ts +8 -8
  370. package/lib/pipes/filter-with-highlight/filter-with-highlight.pipe.d.ts +7 -7
  371. package/lib/pipes/filter-with-highlight/index.d.ts +2 -2
  372. package/lib/pipes/index.d.ts +5 -6
  373. package/lib/pipes/language-translate/index.d.ts +2 -2
  374. package/lib/pipes/language-translate/language-translate.module.d.ts +8 -8
  375. package/lib/pipes/language-translate/language-translate.pipe.d.ts +19 -19
  376. package/lib/pipes/sort-translations/index.d.ts +2 -2
  377. package/lib/pipes/sort-translations/sort-translations.module.d.ts +8 -8
  378. package/lib/pipes/sort-translations/sort-translations.pipe.d.ts +20 -20
  379. package/lib/pipes/sort-translations-by-property/index.d.ts +2 -2
  380. package/lib/pipes/sort-translations-by-property/sort-translations-by-property.module.d.ts +8 -8
  381. package/lib/pipes/sort-translations-by-property/sort-translations-by-property.pipe.d.ts +15 -15
  382. package/lib/plausible/index.d.ts +4 -4
  383. package/lib/plausible/models/index.d.ts +1 -1
  384. package/lib/plausible/models/plausible-event.model.d.ts +7 -7
  385. package/lib/plausible/plausible-event.directive.d.ts +11 -11
  386. package/lib/plausible/plausible.helper.d.ts +15 -15
  387. package/lib/plausible/plausible.module.d.ts +8 -8
  388. package/lib/services/alert/alert.service.d.ts +37 -37
  389. package/lib/services/alert/index.d.ts +3 -3
  390. package/lib/services/alert/injection-tokens/alert-configuration.token.d.ts +1 -1
  391. package/lib/services/alert/injection-tokens/index.d.ts +1 -1
  392. package/lib/services/alert/models/alert-configuration.model.d.ts +7 -7
  393. package/lib/services/alert/models/index.d.ts +1 -1
  394. package/lib/services/dom/dom.service.d.ts +7 -7
  395. package/lib/services/dom/index.d.ts +1 -1
  396. package/lib/services/icon/icon.service.d.ts +14 -14
  397. package/lib/services/icon/index.d.ts +1 -1
  398. package/lib/services/index.d.ts +6 -6
  399. package/lib/services/language-translate/index.d.ts +1 -1
  400. package/lib/services/language-translate/language-translate.service.d.ts +10 -10
  401. package/lib/services/notification/index.d.ts +2 -2
  402. package/lib/services/notification/models/index.d.ts +2 -2
  403. package/lib/services/notification/models/notification.model.d.ts +6 -6
  404. package/lib/services/notification/models/operations.enum.d.ts +4 -4
  405. package/lib/services/notification/notification.service.d.ts +15 -15
  406. package/lib/services/system/index.d.ts +1 -1
  407. package/lib/services/system/system.service.d.ts +11 -11
  408. package/lib/status-display/index.d.ts +3 -3
  409. package/lib/status-display/models/index.d.ts +1 -1
  410. package/lib/status-display/models/status-display-config.model.d.ts +9 -9
  411. package/lib/status-display/status-display.component.d.ts +7 -7
  412. package/lib/status-display/status-display.module.d.ts +11 -11
  413. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.d.ts +28 -28
  414. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.d.ts +30 -30
  415. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.d.ts +32 -32
  416. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.d.ts +20 -20
  417. package/lib/terminology/components/terminology-panel/terminology-panel.component.d.ts +30 -30
  418. package/lib/terminology/config/models/index.d.ts +1 -1
  419. package/lib/terminology/config/models/terminology-config.model.d.ts +39 -39
  420. package/lib/terminology/config/services/index.d.ts +1 -1
  421. package/lib/terminology/config/services/terminology-config/terminology-config.service.d.ts +9 -10
  422. package/lib/terminology/enums/combined-collection-tooltip-key.enum.d.ts +4 -4
  423. package/lib/terminology/enums/engine-term-collection-scope.enum.d.ts +5 -5
  424. package/lib/terminology/enums/engine-term-collection-source.enum.d.ts +4 -4
  425. package/lib/terminology/enums/engine-term-collection-status.enum.d.ts +6 -6
  426. package/lib/terminology/enums/engine-term-collection-sub-status.enum.d.ts +12 -12
  427. package/lib/terminology/enums/index.d.ts +6 -6
  428. package/lib/terminology/enums/mt-collection-status.enum.d.ts +8 -8
  429. package/lib/terminology/enums/mt-term-collection-v1-status.enum.d.ts +5 -5
  430. package/lib/terminology/enums/system-metadata-key.enum.d.ts +5 -5
  431. package/lib/terminology/enums/translation-api-version.model.d.ts +4 -4
  432. package/lib/terminology/factories/terminology-api.factory.d.ts +5 -5
  433. package/lib/terminology/factories/terminology-system.factory.d.ts +5 -5
  434. package/lib/terminology/icons/collections-menu.icon.d.ts +1 -1
  435. package/lib/terminology/icons/index.d.ts +1 -1
  436. package/lib/terminology/index.d.ts +9 -9
  437. package/lib/terminology/injection-tokens/terminology-api.token.d.ts +1 -1
  438. package/lib/terminology/injection-tokens/terminology-system.token.d.ts +1 -1
  439. package/lib/terminology/models/active-data.model.d.ts +22 -23
  440. package/lib/terminology/models/add-engine-terms-request-params.model.d.ts +7 -7
  441. package/lib/terminology/models/api-system.model.d.ts +27 -27
  442. package/lib/terminology/models/combined-collection.model.d.ts +92 -92
  443. package/lib/terminology/models/default-term-collection-order-update.model.d.ts +5 -5
  444. package/lib/terminology/models/domain.model.d.ts +9 -9
  445. package/lib/terminology/models/engine-term-collection-access-scope-update.model.d.ts +3 -3
  446. package/lib/terminology/models/engine-term-collection-access-scope.model.d.ts +4 -4
  447. package/lib/terminology/models/engine-term-collection-access-update.model.d.ts +6 -6
  448. package/lib/terminology/models/engine-term-collection-access.model.d.ts +6 -6
  449. package/lib/terminology/models/engine-term-collection-list.model.d.ts +4 -4
  450. package/lib/terminology/models/engine-term-collection.model.d.ts +24 -24
  451. package/lib/terminology/models/index.d.ts +20 -20
  452. package/lib/terminology/models/lang-list-item.model.d.ts +6 -6
  453. package/lib/terminology/models/mt-collection.model.d.ts +17 -17
  454. package/lib/terminology/models/mt-term-collection-v1.model.d.ts +12 -12
  455. package/lib/terminology/models/mt-term-service.model.d.ts +8 -8
  456. package/lib/terminology/models/system-api-service.model.d.ts +5 -5
  457. package/lib/terminology/models/system.model.d.ts +19 -20
  458. package/lib/terminology/models/terminology-engine.model.d.ts +15 -15
  459. package/lib/terminology/models/tld-term-collection-languages.model.d.ts +11 -11
  460. package/lib/terminology/models/tld-term-collection.model.d.ts +46 -46
  461. package/lib/terminology/models/update-engine-terms-request-params.model.d.ts +4 -4
  462. package/lib/terminology/models/vendor.model.d.ts +5 -5
  463. package/lib/terminology/services/engine-term-api/engine-term-api.service.d.ts +19 -19
  464. package/lib/terminology/services/engine-term-api/index.d.ts +1 -1
  465. package/lib/terminology/services/index.d.ts +5 -5
  466. package/lib/terminology/services/system-api-v1/system-api-v1.service.d.ts +15 -15
  467. package/lib/terminology/services/system-api-v2/models/engine-deployment.model.d.ts +9 -9
  468. package/lib/terminology/services/system-api-v2/models/engine-domain-list.model.d.ts +4 -4
  469. package/lib/terminology/services/system-api-v2/models/engine-domain.model.d.ts +5 -5
  470. package/lib/terminology/services/system-api-v2/models/engine-list.model.d.ts +4 -4
  471. package/lib/terminology/services/system-api-v2/models/engine-status.enum.d.ts +9 -9
  472. package/lib/terminology/services/system-api-v2/models/engine-sub-status.enum.d.ts +16 -16
  473. package/lib/terminology/services/system-api-v2/models/engine.model.d.ts +24 -24
  474. package/lib/terminology/services/system-api-v2/models/index.d.ts +8 -8
  475. package/lib/terminology/services/system-api-v2/models/revision.model.d.ts +9 -9
  476. package/lib/terminology/services/system-api-v2/models/worker-status.model.d.ts +12 -12
  477. package/lib/terminology/services/system-api-v2/system-api-v2.service.d.ts +16 -16
  478. package/lib/terminology/services/terminology/terminology.service.d.ts +61 -61
  479. package/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.d.ts +17 -17
  480. package/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.d.ts +18 -18
  481. package/lib/terminology/services/terminology-collection/index.d.ts +1 -1
  482. package/lib/terminology/services/terminology-collection/terminology-collection.service.d.ts +17 -17
  483. package/lib/terminology/terminology.component.d.ts +37 -37
  484. package/lib/terminology/terminology.module.d.ts +29 -29
  485. package/lib/tld-loader/index.d.ts +2 -2
  486. package/lib/tld-loader/tld-loader.component.d.ts +5 -5
  487. package/lib/tld-loader/tld-loader.module.d.ts +7 -7
  488. package/package.json +5 -4
  489. package/public-api.d.ts +20 -20
  490. package/styles/custom/containers.scss +1 -1
  491. package/styles/typography.scss +1 -1
  492. package/esm2022/lib/pipes/object-length/index.mjs +0 -3
  493. package/esm2022/lib/pipes/object-length/object-length.module.mjs +0 -18
  494. package/esm2022/lib/pipes/object-length/object-length.pipe.mjs +0 -22
  495. package/lib/pipes/object-length/index.d.ts +0 -2
  496. package/lib/pipes/object-length/object-length.module.d.ts +0 -8
  497. package/lib/pipes/object-length/object-length.pipe.d.ts +0 -7
@@ -1,324 +1,325 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject, forkJoin, of, tap } from 'rxjs';
3
- import { CombinedCollection } from '../../models';
4
- import { TERMINOLOGY_API_TOKEN } from '../../injection-tokens/terminology-api.token';
5
- import { EngineTermCollectionSource, MtCollectionStatus } from '../../enums';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../config/services";
8
- import * as i2 from "../../../services";
9
- import * as i3 from "../terminology-collection/terminology-collection.service";
10
- export class TerminologyService {
11
- get isAuthenticated() { return this.config.termConfig.isAuth; }
12
- get canCreateCollections() { return this.config.termConfig.canCreateCollection; }
13
- get hasEditPermissions() {
14
- return (this.config?.termConfig.isAuth &&
15
- this.canCreateCollections &&
16
- this.config.termConfig.isTermPortalSupported);
17
- }
18
- constructor(config, alert, termCollectionApi, mtApi) {
19
- this.config = config;
20
- this.alert = alert;
21
- this.termCollectionApi = termCollectionApi;
22
- this.mtApi = mtApi;
23
- this.engines = {};
24
- this.retranslateSubject = new Subject();
25
- this.engineSubject = new BehaviorSubject(this.engines);
26
- this.updatedEnginesSubject = new Subject();
27
- this.LOCAL_STORAGE_KEY = 'systemLastCollections';
28
- }
29
- getRetranslateSignal() {
30
- return this.retranslateSubject.asObservable();
31
- }
32
- resetEngines() {
33
- this.engines = {};
34
- }
35
- hasAnyCollections(systemId) { return this.engines[systemId]?.collections.size > 0; }
36
- getEnginesWithSelectedCollectionChange() {
37
- return this.updatedEnginesSubject.asObservable();
38
- }
39
- setEngine(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true, selectedCollection, autoRefresh) {
40
- const engineExists = this.engines[engineId] ?? null;
41
- if (!engineExists) {
42
- const newEngine = {
43
- selected: selectedCollection || null,
44
- isImporting: false,
45
- isAnyImporting: false,
46
- hasAnyCollections: false,
47
- isRefreshingCollections: false,
48
- collections: new Set,
49
- refreshMtCollections: mtCollections,
50
- refreshTermCollections: termCollections,
51
- engineLanguages: languages || [],
52
- isSoftAutoRefreshOn: false,
53
- hardAutoRefresh: autoRefresh ?? false,
54
- refreshTimeout: 0
55
- };
56
- this.engines[engineId] = newEngine;
57
- }
58
- else {
59
- engineExists.hardAutoRefresh = autoRefresh ?? false;
60
- }
61
- return this.loadCollections(engineId, setSelectedFromLocalStorage);
62
- }
63
- setSelectedCollection(engineId, collection, storeSelectedInLocalStorage) {
64
- if (this.engines[engineId]) {
65
- this.engines[engineId].selected = collection;
66
- }
67
- if (storeSelectedInLocalStorage) {
68
- this.storeSelectedInLocalStorage(engineId);
69
- }
70
- this.retranslateSubject.next(true);
71
- }
72
- loadCollections(engineId, setSelectedFromLocalStorage) {
73
- // clear timeout since this refresh replaces scheduled
74
- this.clearTimeout(engineId);
75
- this.engines[engineId] = { ...this.engines[engineId], isRefreshingCollections: true };
76
- let termResponse;
77
- let mtApiResponse;
78
- const observables = [];
79
- if (this.engines[engineId].refreshTermCollections) {
80
- observables.push(this.termCollectionApi
81
- .getCollectionList()
82
- .pipe(tap((response) => (termResponse = response))));
83
- }
84
- if (this.engines[engineId].refreshMtCollections) {
85
- observables.push(this.mtApi
86
- .getList(engineId)
87
- .pipe(tap((response) => (mtApiResponse = response))));
88
- }
89
- forkJoin(observables).subscribe({
90
- // do not need response becaue responses are saved in pipe methods
91
- next: () => {
92
- this.engines[engineId].isAnyImporting = false;
93
- // note that termResponse and mtapiresponse gets changed during remove method
94
- this.removeDeleted(termResponse, mtApiResponse, engineId);
95
- const joined = [];
96
- if (mtApiResponse) {
97
- joined.push(...mtApiResponse);
98
- }
99
- if (termResponse) {
100
- joined.push(...termResponse);
101
- }
102
- this.addCollections(joined, engineId);
103
- if (setSelectedFromLocalStorage) {
104
- this.setSelectedFromLocalStorage(engineId);
105
- }
106
- this.engines[engineId].isRefreshingCollections = false;
107
- this.scheduleRefresh(engineId, null);
108
- },
109
- error: (error) => {
110
- this.engines[engineId].isRefreshingCollections = false;
111
- // it is enough to show error only in console. No special thing is necessary.
112
- console.error(error);
113
- },
114
- });
115
- return this.engineSubject.asObservable();
116
- }
117
- getCollections() {
118
- return this.engineSubject.asObservable();
119
- }
120
- startAutoRefresh(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true) {
121
- return this.setEngine(engineId, languages ?? this.engines[engineId]?.engineLanguages, setSelectedFromLocalStorage, termCollections, mtCollections, undefined, true);
122
- }
123
- stopAutoRefresh(engineId) {
124
- this.clearTimeout(engineId);
125
- if (this.engines[engineId]) {
126
- this.engines[engineId].isSoftAutoRefreshOn = false;
127
- this.engines[engineId].hardAutoRefresh = false;
128
- }
129
- }
130
- create(sourceLanguage, targetLanguage, collectionName, engineId, redirectToEdit = true) {
131
- return this.termCollectionApi
132
- .createCollection([sourceLanguage, targetLanguage], collectionName)
133
- .pipe(tap((collection) => {
134
- if (redirectToEdit) {
135
- window.open(this.termCollectionApi.getEditLink(collection.termCollection?.id ?? '', sourceLanguage, targetLanguage), '_blank');
136
- }
137
- this.engines[engineId]?.collections?.add(collection);
138
- this.loadCollections(engineId);
139
- }));
140
- }
141
- selectedIdForTranslation(engineId) {
142
- const selected = this.engines[engineId]?.selected;
143
- if (selected?.mtCollection &&
144
- (selected.mtCollection.lastUpdated ||
145
- selected.mtCollection.status === MtCollectionStatus.READY)) {
146
- return selected.mtCollection.id;
147
- }
148
- return null;
149
- }
150
- updateIfNecessary(collection, engineId, isEdited = false) {
151
- // collection is not imported and should be attached to engine
152
- if (collection.isEdited() || isEdited) {
153
- return this.mtApi.add(engineId, collection).pipe(tap((updatedCollection) => {
154
- collection.update(updatedCollection);
155
- }));
156
- }
157
- else {
158
- return of(collection);
159
- }
160
- }
161
- handleAddToEngineError(error, engineId) {
162
- this.alert.unhandeledError(error);
163
- this.engines[engineId].selected = null;
164
- }
165
- sync(collection, engineId) {
166
- return this.mtApi.sync(engineId, collection).pipe(tap((updatedCollection) => {
167
- collection.update(updatedCollection);
168
- }));
169
- }
170
- removeMtCollection(collection, engineId) {
171
- return this.mtApi.remove(engineId, collection).pipe(tap((response) => {
172
- collection.update(response);
173
- }));
174
- }
175
- addToEngineValidation(collection) {
176
- if (!collection || !collection.termCollection) {
177
- console.error("Trying to attach collection that has no tilde term id.");
178
- return false;
179
- }
180
- return true;
181
- }
182
- clearTimeout(engineId) {
183
- if (this.engines[engineId]?.refreshTimeout) {
184
- clearTimeout(this.engines[engineId].refreshTimeout);
185
- this.engines[engineId].refreshTimeout = null;
186
- }
187
- }
188
- setSelectedFromLocalStorage(engineId) {
189
- // If no collections or selected is already set, it should not be changed from localstorage value. (Usually, localstorage should have the same value).
190
- if (this.engines[engineId].collections?.size === 0 || this.engines[engineId].selected) {
191
- this.updateSelectedCollectionOutsideService();
192
- return;
193
- }
194
- const storedId = this.readLocalStorage()?.[engineId];
195
- if (!storedId) {
196
- this.engines[engineId].selected = null;
197
- this.updateSelectedCollectionOutsideService();
198
- return;
199
- }
200
- const existing = Array.from(this.engines[engineId].collections).find((item) => item.mtCollection?.id === storedId || item.termCollection?.id === storedId);
201
- this.engines[engineId].selected = existing;
202
- this.updateSelectedCollectionOutsideService();
203
- }
204
- removeDeleted(termResponse, mtResponse, engineId) {
205
- for (const collection of this.engines[engineId].collections) {
206
- const termExistingIx = CombinedCollection.findExistingIndexFromList(termResponse, collection);
207
- const mtExistingIx = CombinedCollection.findExistingIndexFromList(mtResponse, collection);
208
- if (termExistingIx === null && mtExistingIx === null) {
209
- this.engines[engineId]?.collections.delete(collection);
210
- if (this.engines[engineId]?.selected === collection) {
211
- this.engines[engineId].selected = null;
212
- this.updateSelectedCollectionOutsideService();
213
- }
214
- }
215
- else {
216
- if (termExistingIx !== null) {
217
- const existingTerm = termResponse[termExistingIx];
218
- collection.update(existingTerm);
219
- termResponse.splice(termExistingIx, 1);
220
- }
221
- else {
222
- collection.deleteTerms();
223
- }
224
- if (mtExistingIx !== null) {
225
- const existingMt = mtResponse[mtExistingIx];
226
- collection.update(existingMt);
227
- mtResponse.splice(mtExistingIx, 1);
228
- }
229
- else {
230
- collection.deleteMT();
231
- }
232
- }
233
- }
234
- }
235
- addCollections(newCollections, engineId) {
236
- // sets collection list to this value at the end, so deleted collections are not in the list.
237
- for (const collection of newCollections) {
238
- // User shouldn't see failed collections if he can't retry to import them.
239
- if (!this.hasEditPermissions && collection.mtStatus === MtCollectionStatus.ERROR || collection.mtStatus === MtCollectionStatus.DELETING) {
240
- continue;
241
- }
242
- if (collection.isImporting) {
243
- this.engines[engineId].isAnyImporting = true;
244
- }
245
- const existing = CombinedCollection.findExistingCollectionFromList(this.engines[engineId].collections, collection);
246
- // If term api doesn't have engine languages, collection should not be shown (if it is not already imported somehow);
247
- if (!existing && collection.source === EngineTermCollectionSource.TILDE_TERM) {
248
- let hasLanguages = true;
249
- for (let i = 0; i < this.engines[engineId].engineLanguages.length; i++) {
250
- if (!collection.termCollection?.languages?.find((lang) => lang.id === this.engines[engineId].engineLanguages[i])) {
251
- hasLanguages = false;
252
- break;
253
- }
254
- }
255
- if (!hasLanguages) {
256
- continue;
257
- }
258
- }
259
- if (!existing) {
260
- this.engines[engineId].collections.add(collection);
261
- }
262
- else {
263
- existing.update(collection);
264
- }
265
- }
266
- this.engines[engineId].hasAnyCollections = this.engines[engineId].collections.size > 0;
267
- this.engineSubject.next(this.engines);
268
- }
269
- scheduleRefresh(engineId, timeout) {
270
- // if menu is closed and selected collection is not importing anymore - auto refreshing should be cancelled.
271
- if (!this.engines[engineId].hardAutoRefresh &&
272
- !this.engines[engineId]?.isImporting &&
273
- this.engines[engineId].isSoftAutoRefreshOn) {
274
- this.stopAutoRefresh(engineId);
275
- return;
276
- }
277
- // if hard auto refresho on, auto refresh should be on. If hard autoreferesh is off , refresh needs to be done only if selected is importing.
278
- if (this.engines[engineId].hardAutoRefresh ||
279
- (!this.engines[engineId] &&
280
- (this.engines[engineId].isSoftAutoRefreshOn || this.engines[engineId].selected?.isImporting))) {
281
- const timeoutMs = timeout ??
282
- (this.engines[engineId].isAnyImporting
283
- ? this.config.termConfig.refreshTimeoutMsWhenImporting
284
- : this.config.termConfig.refreshTimeoutMs);
285
- this.engines[engineId].refreshTimeout = setTimeout(() => {
286
- this.engines[engineId].refreshTimeout = null;
287
- this.loadCollections(engineId);
288
- }, timeoutMs);
289
- }
290
- }
291
- storeSelectedInLocalStorage(engineId) {
292
- let localStorageObject = this.readLocalStorage();
293
- if (!localStorageObject) {
294
- localStorageObject = {};
295
- }
296
- localStorageObject[engineId] = this.engines[engineId].selected ? (this.engines[engineId]?.selected?.mtCollection?.id ?? this.engines[engineId]?.selected?.termCollection?.id) : null;
297
- // store term id if it exists
298
- localStorage.setItem(this.LOCAL_STORAGE_KEY, JSON.stringify(localStorageObject));
299
- }
300
- readLocalStorage() {
301
- const data = localStorage.getItem(this.LOCAL_STORAGE_KEY);
302
- try {
303
- return JSON.parse(data);
304
- }
305
- catch {
306
- return null;
307
- }
308
- }
309
- updateSelectedCollectionOutsideService() {
310
- this.updatedEnginesSubject.next(this.engines);
311
- }
312
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, deps: [{ token: i1.TerminologyConfigService }, { token: i2.AlertService }, { token: i3.TerminologyCollectionService }, { token: TERMINOLOGY_API_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
313
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, providedIn: 'root' }); }
314
- }
315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, decorators: [{
316
- type: Injectable,
317
- args: [{
318
- providedIn: 'root',
319
- }]
320
- }], ctorParameters: function () { return [{ type: i1.TerminologyConfigService }, { type: i2.AlertService }, { type: i3.TerminologyCollectionService }, { type: undefined, decorators: [{
321
- type: Inject,
322
- args: [TERMINOLOGY_API_TOKEN]
323
- }] }]; } });
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWlub2xvZ3kuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXJtaW5vbG9neS9zZXJ2aWNlcy90ZXJtaW5vbG9neS90ZXJtaW5vbG9neS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBa0IsTUFBTSxjQUFjLENBQUM7QUFFbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBTzdCLElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUM5RCxJQUFJLG9CQUFvQixLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUEsQ0FBQyxDQUFDO0lBSWhGLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQzlCLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQsWUFDbUIsTUFBZ0MsRUFDaEMsS0FBbUIsRUFDbkIsaUJBQStDLEVBQ2hCLEtBQXFCO1FBSHBELFdBQU0sR0FBTixNQUFNLENBQTBCO1FB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LFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBeUJJLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tYmluZWRDb2xsZWN0aW9uLCBJTXRUZXJtU2VydmljZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbmZpZy9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IFRFUk1JTk9MT0dZX0FQSV9UT0tFTiB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMvdGVybWlub2xvZ3ktYXBpLnRva2VuJztcclxuaW1wb3J0IHsgVGVybWlub2xvZ3lDb2xsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL3Rlcm1pbm9sb2d5LWNvbGxlY3Rpb24vdGVybWlub2xvZ3ktY29sbGVjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW5naW5lVGVybUNvbGxlY3Rpb25Tb3VyY2UsIE10Q29sbGVjdGlvblN0YXR1cyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBUZXJtaW5vbG9neUVuZ2luZSB9IGZyb20gJy4uLy4uL21vZGVscy90ZXJtaW5vbG9neS1lbmdpbmUubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRlcm1pbm9sb2d5U2VydmljZSB7XHJcbiAgcHVibGljIGVuZ2luZXM6IHsgW2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZSB9ID0ge307XHJcblxyXG4gIHByaXZhdGUgcmV0cmFuc2xhdGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwcml2YXRlIGVuZ2luZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZW5naW5lcyk7XHJcbiAgcHJpdmF0ZSB1cGRhdGVkRW5naW5lc1N1YmplY3QgPSBuZXcgU3ViamVjdDx7W2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZX0+KCk7XHJcblxyXG4gIGdldCBpc0F1dGhlbnRpY2F0ZWQoKSB7IHJldHVybiB0aGlzLmNvbmZpZy50ZXJtQ29uZmlnLmlzQXV0aCB9XHJcbiAgZ2V0IGNhbkNyZWF0ZUNvbGxlY3Rpb25zKCkgeyByZXR1cm4gdGhpcy5jb25maWcudGVybUNvbmZpZy5jYW5DcmVhdGVDb2xsZWN0aW9uIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBMT0NBTF9TVE9SQUdFX0tFWSA9ICdzeXN0ZW1MYXN0Q29sbGVjdGlvbnMnO1xyXG5cclxuICBnZXQgaGFzRWRpdFBlcm1pc3Npb25zKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb25maWc/LnRlcm1Db25maWcuaXNBdXRoICYmXHJcbiAgICAgIHRoaXMuY2FuQ3JlYXRlQ29sbGVjdGlvbnMgJiZcclxuICAgICAgdGhpcy5jb25maWcudGVybUNvbmZpZy5pc1Rlcm1Qb3J0YWxTdXBwb3J0ZWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBUZXJtaW5vbG9neUNvbmZpZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0OiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlcm1Db2xsZWN0aW9uQXBpOiBUZXJtaW5vbG9neUNvbGxlY3Rpb25TZXJ2aWNlLFxyXG4gICAgQEluamVjdChURVJNSU5PTE9HWV9BUElfVE9LRU4pIHByaXZhdGUgcmVhZG9ubHkgbXRBcGk6IElNdFRlcm1TZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBnZXRSZXRyYW5zbGF0ZVNpZ25hbCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLnJldHJhbnNsYXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0RW5naW5lcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZW5naW5lcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgaGFzQW55Q29sbGVjdGlvbnMoc3lzdGVtSWQ6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5lbmdpbmVzW3N5c3RlbUlkXT8uY29sbGVjdGlvbnMuc2l6ZSA+IDAgfVxyXG5cclxuICBnZXRFbmdpbmVzV2l0aFNlbGVjdGVkQ29sbGVjdGlvbkNoYW5nZSgpOiBPYnNlcnZhYmxlPHtbZW5naW5lSWQ6IHN0cmluZ106IFRlcm1pbm9sb2d5RW5naW5lfT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlZEVuZ2luZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RW5naW5lKFxyXG4gICAgZW5naW5lSWQ6IHN0cmluZyxcclxuICAgIGxhbmd1YWdlczogc3RyaW5nW10gfCBudWxsID0gbnVsbCxcclxuICAgIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZSA9IGZhbHNlLFxyXG4gICAgdGVybUNvbGxlY3Rpb25zID0gdHJ1ZSxcclxuICAgIG10Q29sbGVjdGlvbnMgPSB0cnVlLFxyXG4gICAgc2VsZWN0ZWRDb2xsZWN0aW9uPzogQ29tYmluZWRDb2xsZWN0aW9uLFxyXG4gICAgYXV0b1JlZnJlc2g/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBjb25zdCBlbmdpbmVFeGlzdHMgPSB0aGlzLmVuZ2luZXNbZW5naW5lSWRdID8/IG51bGw7XHJcblxyXG4gICAgaWYgKCFlbmdpbmVFeGlzdHMpIHtcclxuICAgICAgY29uc3QgbmV3RW5naW5lOiBUZXJtaW5vbG9neUVuZ2luZSA9IHtcclxuICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRDb2xsZWN0aW9uIHx8IG51bGwsXHJcbiAgICAgICAgaXNJbXBvcnRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzQW55SW1wb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBoYXNBbnlDb2xsZWN0aW9uczogZmFsc2UsXHJcbiAgICAgICAgaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGNvbGxlY3Rpb25zOiBuZXcgU2V0PENvbWJpbmVkQ29sbGVjdGlvbj4sXHJcbiAgICAgICAgcmVmcmVzaE10Q29sbGVjdGlvbnM6IG10Q29sbGVjdGlvbnMsXHJcbiAgICAgICAgcmVmcmVzaFRlcm1Db2xsZWN0aW9uczogdGVybUNvbGxlY3Rpb25zLFxyXG4gICAgICAgIGVuZ2luZUxhbmd1YWdlczogbGFuZ3VhZ2VzIHx8IFtdLFxyXG4gICAgICAgIGlzU29mdEF1dG9SZWZyZXNoT246IGZhbHNlLFxyXG4gICAgICAgIGhhcmRBdXRvUmVmcmVzaDogYXV0b1JlZnJlc2ggPz8gZmFsc2UsXHJcbiAgICAgICAgcmVmcmVzaFRpbWVvdXQ6IDBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0gPSBuZXdFbmdpbmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbmdpbmVFeGlzdHMuaGFyZEF1dG9SZWZyZXNoID0gYXV0b1JlZnJlc2ggPz8gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubG9hZENvbGxlY3Rpb25zKGVuZ2luZUlkLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2UpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VsZWN0ZWRDb2xsZWN0aW9uKGVuZ2luZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbiB8IG51bGwsIHN0b3JlU2VsZWN0ZWRJbkxvY2FsU3RvcmFnZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0pIHtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA9IGNvbGxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0b3JlU2VsZWN0ZWRJbkxvY2FsU3RvcmFnZSkge1xyXG4gICAgICB0aGlzLnN0b3JlU2VsZWN0ZWRJbkxvY2FsU3RvcmFnZShlbmdpbmVJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXRyYW5zbGF0ZVN1YmplY3QubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIGxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZDogc3RyaW5nLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2U/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx7W2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZTt9PiB7XHJcbiAgICAgIC8vIGNsZWFyIHRpbWVvdXQgc2luY2UgdGhpcyByZWZyZXNoIHJlcGxhY2VzIHNjaGVkdWxlZFxyXG4gICAgICB0aGlzLmNsZWFyVGltZW91dChlbmdpbmVJZCk7XHJcblxyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdID0gey4uLnRoaXMuZW5naW5lc1tlbmdpbmVJZF0sIGlzUmVmcmVzaGluZ0NvbGxlY3Rpb25zOiB0cnVlfVxyXG4gIFxyXG4gICAgICBsZXQgdGVybVJlc3BvbnNlOiBDb21iaW5lZENvbGxlY3Rpb25bXTtcclxuICAgICAgbGV0IG10QXBpUmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdO1xyXG4gIFxyXG4gICAgICBjb25zdCBvYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxDb21iaW5lZENvbGxlY3Rpb25bXT5bXSA9IFtdO1xyXG4gIFxyXG4gICAgICBpZiAodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGVybUNvbGxlY3Rpb25zKSB7XHJcbiAgICAgICAgb2JzZXJ2YWJsZXMucHVzaChcclxuICAgICAgICAgIHRoaXMudGVybUNvbGxlY3Rpb25BcGlcclxuICAgICAgICAgICAgLmdldENvbGxlY3Rpb25MaXN0KClcclxuICAgICAgICAgICAgLnBpcGUodGFwKChyZXNwb25zZSkgPT4gKHRlcm1SZXNwb25zZSA9IHJlc3BvbnNlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoTXRDb2xsZWN0aW9ucykge1xyXG4gICAgICAgIG9ic2VydmFibGVzLnB1c2goXHJcbiAgICAgICAgICB0aGlzLm10QXBpXHJcbiAgICAgICAgICAgIC5nZXRMaXN0KGVuZ2luZUlkKVxyXG4gICAgICAgICAgICAucGlwZSh0YXAoKHJlc3BvbnNlKSA9PiAobXRBcGlSZXNwb25zZSA9IHJlc3BvbnNlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKHtcclxuICAgICAgICAvLyBkbyBub3QgbmVlZCByZXNwb25zZSBiZWNhdWUgcmVzcG9uc2VzIGFyZSBzYXZlZCBpbiBwaXBlIG1ldGhvZHNcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzQW55SW1wb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBub3RlIHRoYXQgdGVybVJlc3BvbnNlIGFuZCBtdGFwaXJlc3BvbnNlIGdldHMgY2hhbmdlZCBkdXJpbmcgcmVtb3ZlIG1ldGhvZFxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVEZWxldGVkKHRlcm1SZXNwb25zZSwgbXRBcGlSZXNwb25zZSwgZW5naW5lSWQpO1xyXG4gIFxyXG4gICAgICAgICAgY29uc3Qgam9pbmVkID0gW107XHJcbiAgICAgICAgICBpZiAobXRBcGlSZXNwb25zZSkge1xyXG4gICAgICAgICAgICBqb2luZWQucHVzaCguLi5tdEFwaVJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0ZXJtUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgam9pbmVkLnB1c2goLi4udGVybVJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgIHRoaXMuYWRkQ29sbGVjdGlvbnMoam9pbmVkLCBlbmdpbmVJZCk7XHJcbiAgICAgICAgICBpZiAoc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKGVuZ2luZUlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKGVuZ2luZUlkLCBudWxsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIGl0IGlzIGVub3VnaCB0byBzaG93IGVycm9yIG9ubHkgaW4gY29uc29sZS4gTm8gc3BlY2lhbCB0aGluZyBpcyBuZWNlc3NhcnkuXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xsZWN0aW9ucygpOiBPYnNlcnZhYmxlPHsgW2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZSB9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmdpbmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRBdXRvUmVmcmVzaChlbmdpbmVJZDogc3RyaW5nLCBsYW5ndWFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGwsIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZSA9IGZhbHNlLCB0ZXJtQ29sbGVjdGlvbnMgPSB0cnVlLCBtdENvbGxlY3Rpb25zID0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW5naW5lKGVuZ2luZUlkLCBsYW5ndWFnZXMgPz8gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uZW5naW5lTGFuZ3VhZ2VzLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2UsIHRlcm1Db2xsZWN0aW9ucywgbXRDb2xsZWN0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHN0b3BBdXRvUmVmcmVzaChlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dChlbmdpbmVJZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0pIHtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5pc1NvZnRBdXRvUmVmcmVzaE9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoXHJcbiAgICBzb3VyY2VMYW5ndWFnZTogc3RyaW5nLFxyXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IHN0cmluZyxcclxuICAgIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgcmVkaXJlY3RUb0VkaXQgPSB0cnVlXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZXJtQ29sbGVjdGlvbkFwaVxyXG4gICAgICAuY3JlYXRlQ29sbGVjdGlvbihbc291cmNlTGFuZ3VhZ2UsIHRhcmdldExhbmd1YWdlXSwgY29sbGVjdGlvbk5hbWUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoY29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlZGlyZWN0VG9FZGl0KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAgICAgICAgIHRoaXMudGVybUNvbGxlY3Rpb25BcGkuZ2V0RWRpdExpbmsoXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uPy5pZCA/PyAnJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZUxhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGFuZ3VhZ2VcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICdfYmxhbmsnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uY29sbGVjdGlvbnM/LmFkZChjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSWRGb3JUcmFuc2xhdGlvbihlbmdpbmVJZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkO1xyXG4gICAgaWYgKFxyXG4gICAgICBzZWxlY3RlZD8ubXRDb2xsZWN0aW9uICYmXHJcbiAgICAgIChzZWxlY3RlZC5tdENvbGxlY3Rpb24ubGFzdFVwZGF0ZWQgfHxcclxuICAgICAgICBzZWxlY3RlZC5tdENvbGxlY3Rpb24uc3RhdHVzID09PSBNdENvbGxlY3Rpb25TdGF0dXMuUkVBRFkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkLm10Q29sbGVjdGlvbi5pZDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSWZOZWNlc3NhcnkoXHJcbiAgICBjb2xsZWN0aW9uOiBDb21iaW5lZENvbGxlY3Rpb24sXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgaXNFZGl0ZWQgPSBmYWxzZVxyXG4gICk6IE9ic2VydmFibGU8Q29tYmluZWRDb2xsZWN0aW9uPiB7XHJcbiAgICAvLyBjb2xsZWN0aW9uIGlzIG5vdCBpbXBvcnRlZCBhbmQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGVuZ2luZVxyXG4gICAgaWYgKGNvbGxlY3Rpb24uaXNFZGl0ZWQoKSB8fCBpc0VkaXRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tdEFwaS5hZGQoZW5naW5lSWQsIGNvbGxlY3Rpb24pLnBpcGUoXHJcbiAgICAgICAgdGFwKCh1cGRhdGVkQ29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUodXBkYXRlZENvbGxlY3Rpb24pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoY29sbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBZGRUb0VuZ2luZUVycm9yKGVycm9yOiBhbnksIGVuZ2luZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxlcnQudW5oYW5kZWxlZEVycm9yKGVycm9yKTtcclxuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc3luYyhcclxuICAgIGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbixcclxuICAgIGVuZ2luZUlkOiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPENvbWJpbmVkQ29sbGVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubXRBcGkuc3luYyhlbmdpbmVJZCwgY29sbGVjdGlvbikucGlwZShcclxuICAgICAgdGFwKCh1cGRhdGVkQ29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbGxlY3Rpb24udXBkYXRlKHVwZGF0ZWRDb2xsZWN0aW9uKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVNdENvbGxlY3Rpb24oY29sbGVjdGlvbjogQ29tYmluZWRDb2xsZWN0aW9uLCBlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tdEFwaS5yZW1vdmUoZW5naW5lSWQsIGNvbGxlY3Rpb24pLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZShyZXNwb25zZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9FbmdpbmVWYWxpZGF0aW9uKGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb2xsZWN0aW9uIHx8ICFjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUcnlpbmcgdG8gYXR0YWNoIGNvbGxlY3Rpb24gdGhhdCBoYXMgbm8gdGlsZGUgdGVybSBpZC5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclRpbWVvdXQoZW5naW5lSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnJlZnJlc2hUaW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnJlZnJlc2hUaW1lb3V0KTtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGltZW91dCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZShlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICAvLyBJZiBubyBjb2xsZWN0aW9ucyBvciBzZWxlY3RlZCBpcyBhbHJlYWR5IHNldCwgaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZyb20gbG9jYWxzdG9yYWdlIHZhbHVlLiAoVXN1YWxseSwgbG9jYWxzdG9yYWdlIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlKS5cclxuICAgIGlmICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmNvbGxlY3Rpb25zPy5zaXplID09PSAwIHx8IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZENvbGxlY3Rpb25PdXRzaWRlU2VydmljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RvcmVkSWQgPSB0aGlzLnJlYWRMb2NhbFN0b3JhZ2UoKT8uW2VuZ2luZUlkXTtcclxuICAgIFxyXG4gICAgaWYgKCFzdG9yZWRJZCkge1xyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZENvbGxlY3Rpb25PdXRzaWRlU2VydmljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSBBcnJheS5mcm9tKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMpLmZpbmQoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLm10Q29sbGVjdGlvbj8uaWQgPT09IHN0b3JlZElkIHx8IGl0ZW0udGVybUNvbGxlY3Rpb24/LmlkID09PSBzdG9yZWRJZCk7XHJcbiAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gZXhpc3RpbmcgYXMgQ29tYmluZWRDb2xsZWN0aW9uO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICB9XHJcbiAgXHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVsZXRlZCh0ZXJtUmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdLCBtdFJlc3BvbnNlOiBDb21iaW5lZENvbGxlY3Rpb25bXSwgZW5naW5lSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMpIHtcclxuICAgICAgY29uc3QgdGVybUV4aXN0aW5nSXggPSBDb21iaW5lZENvbGxlY3Rpb24uZmluZEV4aXN0aW5nSW5kZXhGcm9tTGlzdCh0ZXJtUmVzcG9uc2UsIGNvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBtdEV4aXN0aW5nSXggPSBDb21iaW5lZENvbGxlY3Rpb24uZmluZEV4aXN0aW5nSW5kZXhGcm9tTGlzdChtdFJlc3BvbnNlLCBjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgIGlmICh0ZXJtRXhpc3RpbmdJeCA9PT0gbnVsbCAmJiBtdEV4aXN0aW5nSXggPT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5jb2xsZWN0aW9ucy5kZWxldGUoY29sbGVjdGlvbik7XHJcbiAgXHJcbiAgICAgICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkID09PSBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRlcm1FeGlzdGluZ0l4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1Rlcm0gPSB0ZXJtUmVzcG9uc2VbdGVybUV4aXN0aW5nSXhdO1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUoZXhpc3RpbmdUZXJtKTtcclxuICAgICAgICAgIHRlcm1SZXNwb25zZS5zcGxpY2UodGVybUV4aXN0aW5nSXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLmRlbGV0ZVRlcm1zKCk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGlmIChtdEV4aXN0aW5nSXggIT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTXQgPSBtdFJlc3BvbnNlW210RXhpc3RpbmdJeF07XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZShleGlzdGluZ010KTtcclxuICAgICAgICAgIG10UmVzcG9uc2Uuc3BsaWNlKG10RXhpc3RpbmdJeCwgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbGxlY3Rpb24uZGVsZXRlTVQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQ29sbGVjdGlvbnMobmV3Q29sbGVjdGlvbnM6IEl0ZXJhYmxlPENvbWJpbmVkQ29sbGVjdGlvbj4sIGVuZ2luZUlkOiBzdHJpbmcpIHtcclxuICAgIC8vIHNldHMgY29sbGVjdGlvbiBsaXN0IHRvIHRoaXMgdmFsdWUgYXQgdGhlIGVuZCwgc28gZGVsZXRlZCBjb2xsZWN0aW9ucyBhcmUgbm90IGluIHRoZSBsaXN0LlxyXG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIG5ld0NvbGxlY3Rpb25zKSB7XHJcbiAgICAgIC8vIFVzZXIgc2hvdWxkbid0IHNlZSBmYWlsZWQgY29sbGVjdGlvbnMgaWYgaGUgY2FuJ3QgcmV0cnkgdG8gaW1wb3J0IHRoZW0uXHJcbiAgICAgIGlmICghdGhpcy5oYXNFZGl0UGVybWlzc2lvbnMgJiYgY29sbGVjdGlvbi5tdFN0YXR1cyA9PT0gTXRDb2xsZWN0aW9uU3RhdHVzLkVSUk9SIHx8IGNvbGxlY3Rpb24ubXRTdGF0dXMgPT09IE10Q29sbGVjdGlvblN0YXR1cy5ERUxFVElORykge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sbGVjdGlvbi5pc0ltcG9ydGluZykge1xyXG4gICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNBbnlJbXBvcnRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBleGlzdGluZzogQ29tYmluZWRDb2xsZWN0aW9uIHwgbnVsbCA9IENvbWJpbmVkQ29sbGVjdGlvbi5maW5kRXhpc3RpbmdDb2xsZWN0aW9uRnJvbUxpc3QodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucywgY29sbGVjdGlvbik7XHJcblxyXG4gICAgICAvLyBJZiB0ZXJtIGFwaSBkb2Vzbid0IGhhdmUgZW5naW5lIGxhbmd1YWdlcywgY29sbGVjdGlvbiBzaG91bGQgbm90IGJlIHNob3duIChpZiBpdCBpcyBub3QgYWxyZWFkeSBpbXBvcnRlZCBzb21laG93KTtcclxuICAgICAgaWYgKCFleGlzdGluZyAmJiBjb2xsZWN0aW9uLnNvdXJjZSA9PT0gRW5naW5lVGVybUNvbGxlY3Rpb25Tb3VyY2UuVElMREVfVEVSTSkge1xyXG4gICAgICAgIGxldCBoYXNMYW5ndWFnZXMgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5lbmdpbmVMYW5ndWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgIWNvbGxlY3Rpb24udGVybUNvbGxlY3Rpb24/Lmxhbmd1YWdlcz8uZmluZChcclxuICAgICAgICAgICAgICAobGFuZykgPT4gbGFuZy5pZCA9PT0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5lbmdpbmVMYW5ndWFnZXNbaV1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGhhc0xhbmd1YWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaGFzTGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBleGlzdGluZy51cGRhdGUoY29sbGVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmhhc0FueUNvbGxlY3Rpb25zID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucy5zaXplID4gMDtcclxuXHJcbiAgICB0aGlzLmVuZ2luZVN1YmplY3QubmV4dCh0aGlzLmVuZ2luZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goZW5naW5lSWQ6IHN0cmluZywgdGltZW91dD86IG51bWJlciB8IG51bGwsKSB7XHJcbiAgICAvLyBpZiBtZW51IGlzIGNsb3NlZCBhbmQgc2VsZWN0ZWQgY29sbGVjdGlvbiBpcyBub3QgaW1wb3J0aW5nIGFueW1vcmUgLSBhdXRvIHJlZnJlc2hpbmcgc2hvdWxkIGJlIGNhbmNlbGxlZC5cclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoICYmXHJcbiAgICAgICF0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5pc0ltcG9ydGluZyAmJlxyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzU29mdEF1dG9SZWZyZXNoT25cclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaChlbmdpbmVJZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBoYXJkIGF1dG8gcmVmcmVzaG8gb24sIGF1dG8gcmVmcmVzaCBzaG91bGQgYmUgb24uIElmIGhhcmQgYXV0b3JlZmVyZXNoIGlzIG9mZiAsIHJlZnJlc2ggbmVlZHMgdG8gYmUgZG9uZSBvbmx5IGlmIHNlbGVjdGVkIGlzIGltcG9ydGluZy5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5oYXJkQXV0b1JlZnJlc2ggfHxcclxuICAgICAgKCF0aGlzLmVuZ2luZXNbZW5naW5lSWRdICYmXHJcbiAgICAgICAgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNTb2Z0QXV0b1JlZnJlc2hPbiB8fCB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkPy5pc0ltcG9ydGluZykpXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgdGltZW91dE1zID1cclxuICAgICAgICB0aW1lb3V0ID8/XHJcbiAgICAgICAgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNBbnlJbXBvcnRpbmdcclxuICAgICAgICAgID8gdGhpcy5jb25maWcudGVybUNvbmZpZy5yZWZyZXNoVGltZW91dE1zV2hlbkltcG9ydGluZ1xyXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZy50ZXJtQ29uZmlnLnJlZnJlc2hUaW1lb3V0TXMpO1xyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnJlZnJlc2hUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCk7XHJcbiAgICAgIH0sIHRpbWVvdXRNcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JlU2VsZWN0ZWRJbkxvY2FsU3RvcmFnZShlbmdpbmVJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbG9jYWxTdG9yYWdlT2JqZWN0ID0gdGhpcy5yZWFkTG9jYWxTdG9yYWdlKCk7XHJcbiAgICBcclxuICAgIGlmICghbG9jYWxTdG9yYWdlT2JqZWN0KSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZU9iamVjdCA9IHt9IGFzIGFueTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2VPYmplY3RbZW5naW5lSWRdID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA/ICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8ubXRDb2xsZWN0aW9uPy5pZCA/PyB0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8udGVybUNvbGxlY3Rpb24/LmlkKSA6IG51bGw7XHJcbiAgICAvLyBzdG9yZSB0ZXJtIGlkIGlmIGl0IGV4aXN0c1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5MT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobG9jYWxTdG9yYWdlT2JqZWN0KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRMb2NhbFN0b3JhZ2UoKTogYW55IHtcclxuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMX1NUT1JBR0VfS0VZKSBhcyBzdHJpbmc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZWRFbmdpbmVzU3ViamVjdC5uZXh0KHRoaXMuZW5naW5lcyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Subject, forkJoin, of, tap } from 'rxjs';
3
+ import { CombinedCollection } from '../../models';
4
+ import { TERMINOLOGY_API_TOKEN } from '../../injection-tokens/terminology-api.token';
5
+ import { EngineTermCollectionSource, MtCollectionStatus } from '../../enums';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../config/services";
8
+ import * as i2 from "../../../services";
9
+ import * as i3 from "../terminology-collection/terminology-collection.service";
10
+ export class TerminologyService {
11
+ get isAuthenticated() { return this.config.termConfig.isAuth; }
12
+ get canCreateCollections() { return this.config.termConfig.canCreateCollection; }
13
+ get hasEditPermissions() {
14
+ return (this.config?.termConfig.isAuth &&
15
+ this.canCreateCollections &&
16
+ this.config.termConfig.isTermPortalSupported);
17
+ }
18
+ constructor(config, alert, termCollectionApi, mtApi) {
19
+ this.config = config;
20
+ this.alert = alert;
21
+ this.termCollectionApi = termCollectionApi;
22
+ this.mtApi = mtApi;
23
+ this.engines = {};
24
+ this.retranslateSubject = new Subject();
25
+ this.engineSubject = new BehaviorSubject(this.engines);
26
+ this.updatedEnginesSubject = new Subject();
27
+ this.LOCAL_STORAGE_KEY = 'systemLastCollections';
28
+ }
29
+ getRetranslateSignal() {
30
+ return this.retranslateSubject.asObservable();
31
+ }
32
+ resetEngines() {
33
+ this.engines = {};
34
+ }
35
+ hasAnyCollections(systemId) { return this.engines[systemId]?.collections.size > 0; }
36
+ getEnginesWithSelectedCollectionChange() {
37
+ return this.updatedEnginesSubject.asObservable();
38
+ }
39
+ setEngine(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true, selectedCollection, autoRefresh) {
40
+ const engineExists = this.engines[engineId] ?? null;
41
+ if (!engineExists) {
42
+ const newEngine = {
43
+ selected: selectedCollection ?? null,
44
+ isImporting: false,
45
+ isAnyImporting: false,
46
+ hasAnyCollections: false,
47
+ isRefreshingCollections: false,
48
+ collections: new Set,
49
+ refreshMtCollections: mtCollections,
50
+ refreshTermCollections: termCollections,
51
+ engineLanguages: languages ?? [],
52
+ isSoftAutoRefreshOn: false,
53
+ hardAutoRefresh: autoRefresh ?? false,
54
+ refreshTimeout: 0
55
+ };
56
+ this.engines[engineId] = newEngine;
57
+ }
58
+ else {
59
+ engineExists.hardAutoRefresh = autoRefresh ?? false;
60
+ }
61
+ return this.loadCollections(engineId, setSelectedFromLocalStorage);
62
+ }
63
+ setSelectedCollection(engineId, collection, storeSelectedInLocalStorage) {
64
+ this.engines[engineId].selected = collection;
65
+ if (storeSelectedInLocalStorage) {
66
+ this.storeSelectedInLocalStorage(engineId);
67
+ }
68
+ this.retranslateSubject.next(true);
69
+ }
70
+ loadCollections(engineId, setSelectedFromLocalStorage) {
71
+ // clear timeout since this refresh replaces scheduled
72
+ this.clearTimeout(engineId);
73
+ this.engines[engineId] = { ...this.engines[engineId], isRefreshingCollections: true };
74
+ let termResponse;
75
+ let mtApiResponse;
76
+ const observables = [];
77
+ if (this.engines[engineId].refreshTermCollections) {
78
+ observables.push(this.termCollectionApi
79
+ .getCollectionList()
80
+ .pipe(tap((response) => (termResponse = response))));
81
+ }
82
+ if (this.engines[engineId].refreshMtCollections) {
83
+ observables.push(this.mtApi
84
+ .getList(engineId)
85
+ .pipe(tap((response) => (mtApiResponse = response))));
86
+ }
87
+ forkJoin(observables).subscribe({
88
+ // do not need response becaue responses are saved in pipe methods
89
+ next: () => {
90
+ this.engines[engineId].isAnyImporting = false;
91
+ // note that termResponse and mtapiresponse gets changed during remove method
92
+ this.removeDeleted(termResponse, mtApiResponse, engineId);
93
+ const joined = [];
94
+ if (mtApiResponse) {
95
+ joined.push(...mtApiResponse);
96
+ }
97
+ if (termResponse) {
98
+ joined.push(...termResponse);
99
+ }
100
+ this.addCollections(joined, engineId);
101
+ if (setSelectedFromLocalStorage) {
102
+ this.setSelectedFromLocalStorage(engineId);
103
+ }
104
+ this.engines[engineId].isRefreshingCollections = false;
105
+ this.scheduleRefresh(engineId, null);
106
+ },
107
+ error: (error) => {
108
+ this.engines[engineId].isRefreshingCollections = false;
109
+ // it is enough to show error only in console. No special thing is necessary.
110
+ console.error(error);
111
+ },
112
+ });
113
+ return this.engineSubject.asObservable();
114
+ }
115
+ getCollections() {
116
+ return this.engineSubject.asObservable();
117
+ }
118
+ startAutoRefresh(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true) {
119
+ return this.setEngine(engineId, languages ?? this.engines[engineId]?.engineLanguages, setSelectedFromLocalStorage, termCollections, mtCollections, undefined, true);
120
+ }
121
+ stopAutoRefresh(engineId) {
122
+ this.clearTimeout(engineId);
123
+ if (this.engines[engineId]) {
124
+ this.engines[engineId].isSoftAutoRefreshOn = false;
125
+ this.engines[engineId].hardAutoRefresh = false;
126
+ }
127
+ }
128
+ create(sourceLanguage, targetLanguage, collectionName, engineId, redirectToEdit = true) {
129
+ return this.termCollectionApi
130
+ .createCollection([sourceLanguage, targetLanguage], collectionName)
131
+ .pipe(tap((collection) => {
132
+ if (redirectToEdit) {
133
+ window.open(this.termCollectionApi.getEditLink(collection.termCollection?.id ?? '', sourceLanguage, targetLanguage), '_blank');
134
+ }
135
+ this.engines[engineId]?.collections?.add(collection);
136
+ this.loadCollections(engineId);
137
+ }));
138
+ }
139
+ selectedIdForTranslation(engineId) {
140
+ const selected = this.engines[engineId]?.selected;
141
+ if (selected?.mtCollection &&
142
+ (selected.mtCollection.lastUpdated ||
143
+ selected.mtCollection.status === MtCollectionStatus.READY)) {
144
+ return selected.mtCollection.id;
145
+ }
146
+ return null;
147
+ }
148
+ updateIfNecessary(collection, engineId, isEdited = false) {
149
+ // collection is not imported and should be attached to engine
150
+ if (collection.isEdited() || isEdited) {
151
+ return this.mtApi.add(engineId, collection).pipe(tap((updatedCollection) => {
152
+ collection.update(updatedCollection);
153
+ }));
154
+ }
155
+ else {
156
+ return of(collection);
157
+ }
158
+ }
159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
+ handleAddToEngineError(error, engineId) {
161
+ this.alert.unhandeledError(error);
162
+ this.engines[engineId].selected = null;
163
+ }
164
+ sync(collection, engineId) {
165
+ return this.mtApi.sync(engineId, collection).pipe(tap((updatedCollection) => {
166
+ collection.update(updatedCollection);
167
+ }));
168
+ }
169
+ removeMtCollection(collection, engineId) {
170
+ return this.mtApi.remove(engineId, collection).pipe(tap((response) => {
171
+ collection.update(response);
172
+ }));
173
+ }
174
+ addToEngineValidation(collection) {
175
+ if (!collection || !collection.termCollection) {
176
+ console.error("Trying to attach collection that has no tilde term id.");
177
+ return false;
178
+ }
179
+ return true;
180
+ }
181
+ clearTimeout(engineId) {
182
+ if (this.engines[engineId]?.refreshTimeout) {
183
+ clearTimeout(this.engines[engineId].refreshTimeout);
184
+ this.engines[engineId].refreshTimeout = null;
185
+ }
186
+ }
187
+ setSelectedFromLocalStorage(engineId) {
188
+ // If no collections or selected is already set, it should not be changed from localstorage value. (Usually, localstorage should have the same value).
189
+ if (this.engines[engineId].collections?.size === 0 || this.engines[engineId].selected) {
190
+ this.updateSelectedCollectionOutsideService();
191
+ return;
192
+ }
193
+ const storedId = this.readLocalStorage()?.[engineId];
194
+ if (!storedId) {
195
+ this.engines[engineId].selected = null;
196
+ this.updateSelectedCollectionOutsideService();
197
+ return;
198
+ }
199
+ const existing = Array.from(this.engines[engineId].collections).find((item) => item.mtCollection?.id === storedId || item.termCollection?.id === storedId);
200
+ this.engines[engineId].selected = existing;
201
+ this.updateSelectedCollectionOutsideService();
202
+ }
203
+ removeDeleted(termResponse, mtResponse, engineId) {
204
+ for (const collection of this.engines[engineId].collections) {
205
+ const termExistingIx = CombinedCollection.findExistingIndexFromList(termResponse, collection);
206
+ const mtExistingIx = CombinedCollection.findExistingIndexFromList(mtResponse, collection);
207
+ if (termExistingIx === null && mtExistingIx === null) {
208
+ this.engines[engineId]?.collections.delete(collection);
209
+ if (this.engines[engineId]?.selected === collection) {
210
+ this.engines[engineId].selected = null;
211
+ this.updateSelectedCollectionOutsideService();
212
+ }
213
+ }
214
+ else {
215
+ if (termExistingIx !== null) {
216
+ const existingTerm = termResponse[termExistingIx];
217
+ collection.update(existingTerm);
218
+ termResponse.splice(termExistingIx, 1);
219
+ }
220
+ else {
221
+ collection.deleteTerms();
222
+ }
223
+ if (mtExistingIx !== null) {
224
+ const existingMt = mtResponse[mtExistingIx];
225
+ collection.update(existingMt);
226
+ mtResponse.splice(mtExistingIx, 1);
227
+ }
228
+ else {
229
+ collection.deleteMT();
230
+ }
231
+ }
232
+ }
233
+ }
234
+ addCollections(newCollections, engineId) {
235
+ // sets collection list to this value at the end, so deleted collections are not in the list.
236
+ for (const collection of newCollections) {
237
+ // User shouldn't see failed collections if he can't retry to import them.
238
+ if (!this.hasEditPermissions && collection.mtStatus === MtCollectionStatus.ERROR || collection.mtStatus === MtCollectionStatus.DELETING) {
239
+ continue;
240
+ }
241
+ if (collection.isImporting) {
242
+ this.engines[engineId].isAnyImporting = true;
243
+ }
244
+ const existing = CombinedCollection.findExistingCollectionFromList(this.engines[engineId].collections, collection);
245
+ // If term api doesn't have engine languages, collection should not be shown (if it is not already imported somehow);
246
+ if (!existing && collection.source === EngineTermCollectionSource.TILDE_TERM) {
247
+ let hasLanguages = true;
248
+ for (let i = 0; i < this.engines[engineId].engineLanguages.length; i++) {
249
+ if (!collection.termCollection?.languages?.find((lang) => lang.id === this.engines[engineId].engineLanguages[i])) {
250
+ hasLanguages = false;
251
+ break;
252
+ }
253
+ }
254
+ if (!hasLanguages) {
255
+ continue;
256
+ }
257
+ }
258
+ if (!existing) {
259
+ this.engines[engineId].collections.add(collection);
260
+ }
261
+ else {
262
+ existing.update(collection);
263
+ }
264
+ }
265
+ this.engines[engineId].hasAnyCollections = this.engines[engineId].collections.size > 0;
266
+ this.engineSubject.next(this.engines);
267
+ }
268
+ scheduleRefresh(engineId, timeout) {
269
+ // if menu is closed and selected collection is not importing anymore - auto refreshing should be cancelled.
270
+ if (!this.engines[engineId].hardAutoRefresh &&
271
+ !this.engines[engineId]?.isImporting &&
272
+ this.engines[engineId].isSoftAutoRefreshOn) {
273
+ this.stopAutoRefresh(engineId);
274
+ return;
275
+ }
276
+ // if hard auto refresho on, auto refresh should be on. If hard autoreferesh is off , refresh needs to be done only if selected is importing.
277
+ if (this.engines[engineId].hardAutoRefresh ||
278
+ (!this.engines[engineId] &&
279
+ (this.engines[engineId].isSoftAutoRefreshOn || this.engines[engineId].selected?.isImporting))) {
280
+ const timeoutMs = timeout ??
281
+ (this.engines[engineId].isAnyImporting
282
+ ? this.config.termConfig.refreshTimeoutMsWhenImporting
283
+ : this.config.termConfig.refreshTimeoutMs);
284
+ this.engines[engineId].refreshTimeout = setTimeout(() => {
285
+ this.engines[engineId].refreshTimeout = null;
286
+ this.loadCollections(engineId);
287
+ }, timeoutMs);
288
+ }
289
+ }
290
+ storeSelectedInLocalStorage(engineId) {
291
+ let localStorageObject = this.readLocalStorage();
292
+ if (!localStorageObject) {
293
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
294
+ localStorageObject = {};
295
+ }
296
+ localStorageObject[engineId] = this.engines[engineId].selected ? (this.engines[engineId]?.selected?.mtCollection?.id ?? this.engines[engineId]?.selected?.termCollection?.id) : null;
297
+ // store term id if it exists
298
+ localStorage.setItem(this.LOCAL_STORAGE_KEY, JSON.stringify(localStorageObject));
299
+ }
300
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
301
+ readLocalStorage() {
302
+ const data = localStorage.getItem(this.LOCAL_STORAGE_KEY);
303
+ try {
304
+ return JSON.parse(data);
305
+ }
306
+ catch {
307
+ return null;
308
+ }
309
+ }
310
+ updateSelectedCollectionOutsideService() {
311
+ this.updatedEnginesSubject.next(this.engines);
312
+ }
313
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TerminologyService, deps: [{ token: i1.TerminologyConfigService }, { token: i2.AlertService }, { token: i3.TerminologyCollectionService }, { token: TERMINOLOGY_API_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
314
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TerminologyService, providedIn: 'root' }); }
315
+ }
316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: TerminologyService, decorators: [{
317
+ type: Injectable,
318
+ args: [{
319
+ providedIn: 'root',
320
+ }]
321
+ }], ctorParameters: () => [{ type: i1.TerminologyConfigService }, { type: i2.AlertService }, { type: i3.TerminologyCollectionService }, { type: undefined, decorators: [{
322
+ type: Inject,
323
+ args: [TERMINOLOGY_API_TOKEN]
324
+ }] }] });
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWlub2xvZ3kuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXJtaW5vbG9neS9zZXJ2aWNlcy90ZXJtaW5vbG9neS90ZXJtaW5vbG9neS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBa0IsTUFBTSxjQUFjLENBQUM7QUFFbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBTzdCLElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUM5RCxJQUFJLG9CQUFvQixLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUEsQ0FBQyxDQUFDO0lBSWhGLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQzlCLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQsWUFDbUIsTUFBZ0MsRUFDaEMsS0FBbUIsRUFDbkIsaUJBQStDLEVBQ2hCLEtBQXFCO1FBSHBELFdBQU0sR0FBTixNQUFNLENBQTBCO1FB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QkFBZ0I7UUFDdEIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQVcsQ0FBQztRQUNwRSxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFTyxzQ0FBc0M7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0E3WlUsa0JBQWtCLGtJQXdCbkIscUJBQXFCO2tIQXhCcEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXlCSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIGZvcmtKb2luLCBvZiwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbWJpbmVkQ29sbGVjdGlvbiwgSU10VGVybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBUZXJtaW5vbG9neUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb25maWcvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBURVJNSU5PTE9HWV9BUElfVE9LRU4gfSBmcm9tICcuLi8uLi9pbmplY3Rpb24tdG9rZW5zL3Rlcm1pbm9sb2d5LWFwaS50b2tlbic7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi90ZXJtaW5vbG9neS1jb2xsZWN0aW9uL3Rlcm1pbm9sb2d5LWNvbGxlY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVuZ2luZVRlcm1Db2xsZWN0aW9uU291cmNlLCBNdENvbGxlY3Rpb25TdGF0dXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGVybWlub2xvZ3lFbmdpbmUgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGVybWlub2xvZ3ktZW5naW5lLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXJtaW5vbG9neVNlcnZpY2Uge1xyXG4gIHB1YmxpYyBlbmdpbmVzOiB7IFtlbmdpbmVJZDogc3RyaW5nXTogVGVybWlub2xvZ3lFbmdpbmUgfSA9IHt9O1xyXG5cclxuICBwcml2YXRlIHJldHJhbnNsYXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHJpdmF0ZSBlbmdpbmVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLmVuZ2luZXMpO1xyXG4gIHByaXZhdGUgdXBkYXRlZEVuZ2luZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8e1tlbmdpbmVJZDogc3RyaW5nXTogVGVybWlub2xvZ3lFbmdpbmV9PigpO1xyXG5cclxuICBnZXQgaXNBdXRoZW50aWNhdGVkKCkgeyByZXR1cm4gdGhpcy5jb25maWcudGVybUNvbmZpZy5pc0F1dGggfVxyXG4gIGdldCBjYW5DcmVhdGVDb2xsZWN0aW9ucygpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRlcm1Db25maWcuY2FuQ3JlYXRlQ29sbGVjdGlvbiB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxfU1RPUkFHRV9LRVkgPSAnc3lzdGVtTGFzdENvbGxlY3Rpb25zJztcclxuXHJcbiAgZ2V0IGhhc0VkaXRQZXJtaXNzaW9ucygpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuY29uZmlnPy50ZXJtQ29uZmlnLmlzQXV0aCAmJlxyXG4gICAgICB0aGlzLmNhbkNyZWF0ZUNvbGxlY3Rpb25zICYmXHJcbiAgICAgIHRoaXMuY29uZmlnLnRlcm1Db25maWcuaXNUZXJtUG9ydGFsU3VwcG9ydGVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVGVybWlub2xvZ3lDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydDogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXJtQ29sbGVjdGlvbkFwaTogVGVybWlub2xvZ3lDb2xsZWN0aW9uU2VydmljZSxcclxuICAgIEBJbmplY3QoVEVSTUlOT0xPR1lfQVBJX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IG10QXBpOiBJTXRUZXJtU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgZ2V0UmV0cmFuc2xhdGVTaWduYWwoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXRyYW5zbGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICByZXNldEVuZ2luZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVuZ2luZXMgPSB7fTtcclxuICB9XHJcblxyXG4gIGhhc0FueUNvbGxlY3Rpb25zKHN5c3RlbUlkOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZW5naW5lc1tzeXN0ZW1JZF0/LmNvbGxlY3Rpb25zLnNpemUgPiAwIH1cclxuXHJcbiAgZ2V0RW5naW5lc1dpdGhTZWxlY3RlZENvbGxlY3Rpb25DaGFuZ2UoKTogT2JzZXJ2YWJsZTx7W2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZX0+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZWRFbmdpbmVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHNldEVuZ2luZShcclxuICAgIGVuZ2luZUlkOiBzdHJpbmcsXHJcbiAgICBsYW5ndWFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGwsXHJcbiAgICBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2UgPSBmYWxzZSxcclxuICAgIHRlcm1Db2xsZWN0aW9ucyA9IHRydWUsXHJcbiAgICBtdENvbGxlY3Rpb25zID0gdHJ1ZSxcclxuICAgIHNlbGVjdGVkQ29sbGVjdGlvbj86IENvbWJpbmVkQ29sbGVjdGlvbixcclxuICAgIGF1dG9SZWZyZXNoPzogYm9vbGVhblxyXG4gICkge1xyXG4gICAgY29uc3QgZW5naW5lRXhpc3RzID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXSA/PyBudWxsO1xyXG5cclxuICAgIGlmICghZW5naW5lRXhpc3RzKSB7XHJcbiAgICAgIGNvbnN0IG5ld0VuZ2luZTogVGVybWlub2xvZ3lFbmdpbmUgPSB7XHJcbiAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkQ29sbGVjdGlvbiA/PyBudWxsLFxyXG4gICAgICAgIGlzSW1wb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBpc0FueUltcG9ydGluZzogZmFsc2UsXHJcbiAgICAgICAgaGFzQW55Q29sbGVjdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGlzUmVmcmVzaGluZ0NvbGxlY3Rpb25zOiBmYWxzZSxcclxuICAgICAgICBjb2xsZWN0aW9uczogbmV3IFNldDxDb21iaW5lZENvbGxlY3Rpb24+LFxyXG4gICAgICAgIHJlZnJlc2hNdENvbGxlY3Rpb25zOiBtdENvbGxlY3Rpb25zLFxyXG4gICAgICAgIHJlZnJlc2hUZXJtQ29sbGVjdGlvbnM6IHRlcm1Db2xsZWN0aW9ucyxcclxuICAgICAgICBlbmdpbmVMYW5ndWFnZXM6IGxhbmd1YWdlcyA/PyBbXSxcclxuICAgICAgICBpc1NvZnRBdXRvUmVmcmVzaE9uOiBmYWxzZSxcclxuICAgICAgICBoYXJkQXV0b1JlZnJlc2g6IGF1dG9SZWZyZXNoID8/IGZhbHNlLFxyXG4gICAgICAgIHJlZnJlc2hUaW1lb3V0OiAwXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdID0gbmV3RW5naW5lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZW5naW5lRXhpc3RzLmhhcmRBdXRvUmVmcmVzaCA9IGF1dG9SZWZyZXNoID8/IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCwgc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKTtcclxuICB9XHJcblxyXG4gIHNldFNlbGVjdGVkQ29sbGVjdGlvbihlbmdpbmVJZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBDb21iaW5lZENvbGxlY3Rpb24gfCBudWxsLCBzdG9yZVNlbGVjdGVkSW5Mb2NhbFN0b3JhZ2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQgPSBjb2xsZWN0aW9uO1xyXG5cclxuICAgIGlmIChzdG9yZVNlbGVjdGVkSW5Mb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgdGhpcy5zdG9yZVNlbGVjdGVkSW5Mb2NhbFN0b3JhZ2UoZW5naW5lSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmV0cmFuc2xhdGVTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBsb2FkQ29sbGVjdGlvbnMoZW5naW5lSWQ6IHN0cmluZywgc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlPzogYm9vbGVhbik6IE9ic2VydmFibGU8e1tlbmdpbmVJZDogc3RyaW5nXTogVGVybWlub2xvZ3lFbmdpbmU7fT4ge1xyXG4gICAgICAvLyBjbGVhciB0aW1lb3V0IHNpbmNlIHRoaXMgcmVmcmVzaCByZXBsYWNlcyBzY2hlZHVsZWRcclxuICAgICAgdGhpcy5jbGVhclRpbWVvdXQoZW5naW5lSWQpO1xyXG5cclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXSA9IHsuLi50aGlzLmVuZ2luZXNbZW5naW5lSWRdLCBpc1JlZnJlc2hpbmdDb2xsZWN0aW9uczogdHJ1ZX1cclxuXHJcbiAgICAgIGxldCB0ZXJtUmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdO1xyXG4gICAgICBsZXQgbXRBcGlSZXNwb25zZTogQ29tYmluZWRDb2xsZWN0aW9uW107XHJcblxyXG4gICAgICBjb25zdCBvYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxDb21iaW5lZENvbGxlY3Rpb25bXT5bXSA9IFtdO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0ucmVmcmVzaFRlcm1Db2xsZWN0aW9ucykge1xyXG4gICAgICAgIG9ic2VydmFibGVzLnB1c2goXHJcbiAgICAgICAgICB0aGlzLnRlcm1Db2xsZWN0aW9uQXBpXHJcbiAgICAgICAgICAgIC5nZXRDb2xsZWN0aW9uTGlzdCgpXHJcbiAgICAgICAgICAgIC5waXBlKHRhcCgocmVzcG9uc2UpID0+ICh0ZXJtUmVzcG9uc2UgPSByZXNwb25zZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0ucmVmcmVzaE10Q29sbGVjdGlvbnMpIHtcclxuICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5tdEFwaVxyXG4gICAgICAgICAgICAuZ2V0TGlzdChlbmdpbmVJZClcclxuICAgICAgICAgICAgLnBpcGUodGFwKChyZXNwb25zZSkgPT4gKG10QXBpUmVzcG9uc2UgPSByZXNwb25zZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgZm9ya0pvaW4ob2JzZXJ2YWJsZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgLy8gZG8gbm90IG5lZWQgcmVzcG9uc2UgYmVjYXVlIHJlc3BvbnNlcyBhcmUgc2F2ZWQgaW4gcGlwZSBtZXRob2RzXHJcbiAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5pc0FueUltcG9ydGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gbm90ZSB0aGF0IHRlcm1SZXNwb25zZSBhbmQgbXRhcGlyZXNwb25zZSBnZXRzIGNoYW5nZWQgZHVyaW5nIHJlbW92ZSBtZXRob2RcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRGVsZXRlZCh0ZXJtUmVzcG9uc2UsIG10QXBpUmVzcG9uc2UsIGVuZ2luZUlkKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBqb2luZWQgPSBbXTtcclxuICAgICAgICAgIGlmIChtdEFwaVJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGpvaW5lZC5wdXNoKC4uLm10QXBpUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRlcm1SZXNwb25zZSkge1xyXG4gICAgICAgICAgICBqb2luZWQucHVzaCguLi50ZXJtUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuYWRkQ29sbGVjdGlvbnMoam9pbmVkLCBlbmdpbmVJZCk7XHJcbiAgICAgICAgICBpZiAoc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKGVuZ2luZUlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKGVuZ2luZUlkLCBudWxsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIGl0IGlzIGVub3VnaCB0byBzaG93IGVycm9yIG9ubHkgaW4gY29uc29sZS4gTm8gc3BlY2lhbCB0aGluZyBpcyBuZWNlc3NhcnkuXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xsZWN0aW9ucygpOiBPYnNlcnZhYmxlPHsgW2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZSB9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmdpbmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRBdXRvUmVmcmVzaChlbmdpbmVJZDogc3RyaW5nLCBsYW5ndWFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGwsIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZSA9IGZhbHNlLCB0ZXJtQ29sbGVjdGlvbnMgPSB0cnVlLCBtdENvbGxlY3Rpb25zID0gdHJ1ZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RW5naW5lKGVuZ2luZUlkLCBsYW5ndWFnZXMgPz8gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uZW5naW5lTGFuZ3VhZ2VzLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2UsIHRlcm1Db2xsZWN0aW9ucywgbXRDb2xsZWN0aW9ucywgdW5kZWZpbmVkLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHN0b3BBdXRvUmVmcmVzaChlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNsZWFyVGltZW91dChlbmdpbmVJZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0pIHtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5pc1NvZnRBdXRvUmVmcmVzaE9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoXHJcbiAgICBzb3VyY2VMYW5ndWFnZTogc3RyaW5nLFxyXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IHN0cmluZyxcclxuICAgIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgcmVkaXJlY3RUb0VkaXQgPSB0cnVlXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZXJtQ29sbGVjdGlvbkFwaVxyXG4gICAgICAuY3JlYXRlQ29sbGVjdGlvbihbc291cmNlTGFuZ3VhZ2UsIHRhcmdldExhbmd1YWdlXSwgY29sbGVjdGlvbk5hbWUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoY29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlZGlyZWN0VG9FZGl0KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAgICAgICAgIHRoaXMudGVybUNvbGxlY3Rpb25BcGkuZ2V0RWRpdExpbmsoXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uPy5pZCA/PyAnJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZUxhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGFuZ3VhZ2VcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICdfYmxhbmsnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uY29sbGVjdGlvbnM/LmFkZChjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSWRGb3JUcmFuc2xhdGlvbihlbmdpbmVJZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkO1xyXG4gICAgaWYgKFxyXG4gICAgICBzZWxlY3RlZD8ubXRDb2xsZWN0aW9uICYmXHJcbiAgICAgIChzZWxlY3RlZC5tdENvbGxlY3Rpb24ubGFzdFVwZGF0ZWQgfHxcclxuICAgICAgICBzZWxlY3RlZC5tdENvbGxlY3Rpb24uc3RhdHVzID09PSBNdENvbGxlY3Rpb25TdGF0dXMuUkVBRFkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkLm10Q29sbGVjdGlvbi5pZDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSWZOZWNlc3NhcnkoXHJcbiAgICBjb2xsZWN0aW9uOiBDb21iaW5lZENvbGxlY3Rpb24sXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgaXNFZGl0ZWQgPSBmYWxzZVxyXG4gICk6IE9ic2VydmFibGU8Q29tYmluZWRDb2xsZWN0aW9uPiB7XHJcbiAgICAvLyBjb2xsZWN0aW9uIGlzIG5vdCBpbXBvcnRlZCBhbmQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGVuZ2luZVxyXG4gICAgaWYgKGNvbGxlY3Rpb24uaXNFZGl0ZWQoKSB8fCBpc0VkaXRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tdEFwaS5hZGQoZW5naW5lSWQsIGNvbGxlY3Rpb24pLnBpcGUoXHJcbiAgICAgICAgdGFwKCh1cGRhdGVkQ29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUodXBkYXRlZENvbGxlY3Rpb24pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoY29sbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGhhbmRsZUFkZFRvRW5naW5lRXJyb3IoZXJyb3I6IGFueSwgZW5naW5lSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGVydC51bmhhbmRlbGVkRXJyb3IoZXJyb3IpO1xyXG4gICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBzeW5jKFxyXG4gICAgY29sbGVjdGlvbjogQ29tYmluZWRDb2xsZWN0aW9uLFxyXG4gICAgZW5naW5lSWQ6IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8Q29tYmluZWRDb2xsZWN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tdEFwaS5zeW5jKGVuZ2luZUlkLCBjb2xsZWN0aW9uKS5waXBlKFxyXG4gICAgICB0YXAoKHVwZGF0ZWRDb2xsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgY29sbGVjdGlvbi51cGRhdGUodXBkYXRlZENvbGxlY3Rpb24pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU10Q29sbGVjdGlvbihjb2xsZWN0aW9uOiBDb21iaW5lZENvbGxlY3Rpb24sIGVuZ2luZUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm10QXBpLnJlbW92ZShlbmdpbmVJZCwgY29sbGVjdGlvbikucGlwZShcclxuICAgICAgdGFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbGxlY3Rpb24udXBkYXRlKHJlc3BvbnNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0VuZ2luZVZhbGlkYXRpb24oY29sbGVjdGlvbjogQ29tYmluZWRDb2xsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIWNvbGxlY3Rpb24udGVybUNvbGxlY3Rpb24pIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIlRyeWluZyB0byBhdHRhY2ggY29sbGVjdGlvbiB0aGF0IGhhcyBubyB0aWxkZSB0ZXJtIGlkLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyVGltZW91dChlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8ucmVmcmVzaFRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZW5naW5lc1tlbmdpbmVJZF0ucmVmcmVzaFRpbWVvdXQpO1xyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnJlZnJlc2hUaW1lb3V0ID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKGVuZ2luZUlkOiBzdHJpbmcpIHtcclxuICAgIC8vIElmIG5vIGNvbGxlY3Rpb25zIG9yIHNlbGVjdGVkIGlzIGFscmVhZHkgc2V0LCBpdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgZnJvbSBsb2NhbHN0b3JhZ2UgdmFsdWUuIChVc3VhbGx5LCBsb2NhbHN0b3JhZ2Ugc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmFsdWUpLlxyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnM/LnNpemUgPT09IDAgfHwgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQ29sbGVjdGlvbk91dHNpZGVTZXJ2aWNlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdG9yZWRJZCA9IHRoaXMucmVhZExvY2FsU3RvcmFnZSgpPy5bZW5naW5lSWRdO1xyXG5cclxuICAgIGlmICghc3RvcmVkSWQpIHtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV4aXN0aW5nID0gQXJyYXkuZnJvbSh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmNvbGxlY3Rpb25zKS5maW5kKFxyXG4gICAgICAoaXRlbSkgPT4gaXRlbS5tdENvbGxlY3Rpb24/LmlkID09PSBzdG9yZWRJZCB8fCBpdGVtLnRlcm1Db2xsZWN0aW9uPy5pZCA9PT0gc3RvcmVkSWQpO1xyXG4gICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA9IGV4aXN0aW5nIGFzIENvbWJpbmVkQ29sbGVjdGlvbjtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQ29sbGVjdGlvbk91dHNpZGVTZXJ2aWNlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZWxldGVkKHRlcm1SZXNwb25zZTogQ29tYmluZWRDb2xsZWN0aW9uW10sIG10UmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdLCBlbmdpbmVJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucykge1xyXG4gICAgICBjb25zdCB0ZXJtRXhpc3RpbmdJeCA9IENvbWJpbmVkQ29sbGVjdGlvbi5maW5kRXhpc3RpbmdJbmRleEZyb21MaXN0KHRlcm1SZXNwb25zZSwgY29sbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IG10RXhpc3RpbmdJeCA9IENvbWJpbmVkQ29sbGVjdGlvbi5maW5kRXhpc3RpbmdJbmRleEZyb21MaXN0KG10UmVzcG9uc2UsIGNvbGxlY3Rpb24pO1xyXG5cclxuICAgICAgaWYgKHRlcm1FeGlzdGluZ0l4ID09PSBudWxsICYmIG10RXhpc3RpbmdJeCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LmNvbGxlY3Rpb25zLmRlbGV0ZShjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkID09PSBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRlcm1FeGlzdGluZ0l4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1Rlcm0gPSB0ZXJtUmVzcG9uc2VbdGVybUV4aXN0aW5nSXhdO1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUoZXhpc3RpbmdUZXJtKTtcclxuICAgICAgICAgIHRlcm1SZXNwb25zZS5zcGxpY2UodGVybUV4aXN0aW5nSXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLmRlbGV0ZVRlcm1zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobXRFeGlzdGluZ0l4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ010ID0gbXRSZXNwb25zZVttdEV4aXN0aW5nSXhdO1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUoZXhpc3RpbmdNdCk7XHJcbiAgICAgICAgICBtdFJlc3BvbnNlLnNwbGljZShtdEV4aXN0aW5nSXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLmRlbGV0ZU1UKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENvbGxlY3Rpb25zKG5ld0NvbGxlY3Rpb25zOiBJdGVyYWJsZTxDb21iaW5lZENvbGxlY3Rpb24+LCBlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICAvLyBzZXRzIGNvbGxlY3Rpb24gbGlzdCB0byB0aGlzIHZhbHVlIGF0IHRoZSBlbmQsIHNvIGRlbGV0ZWQgY29sbGVjdGlvbnMgYXJlIG5vdCBpbiB0aGUgbGlzdC5cclxuICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBvZiBuZXdDb2xsZWN0aW9ucykge1xyXG4gICAgICAvLyBVc2VyIHNob3VsZG4ndCBzZWUgZmFpbGVkIGNvbGxlY3Rpb25zIGlmIGhlIGNhbid0IHJldHJ5IHRvIGltcG9ydCB0aGVtLlxyXG4gICAgICBpZiAoIXRoaXMuaGFzRWRpdFBlcm1pc3Npb25zICYmIGNvbGxlY3Rpb24ubXRTdGF0dXMgPT09IE10Q29sbGVjdGlvblN0YXR1cy5FUlJPUiB8fCBjb2xsZWN0aW9uLm10U3RhdHVzID09PSBNdENvbGxlY3Rpb25TdGF0dXMuREVMRVRJTkcpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbGxlY3Rpb24uaXNJbXBvcnRpbmcpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzQW55SW1wb3J0aW5nID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZXhpc3Rpbmc6IENvbWJpbmVkQ29sbGVjdGlvbiB8IG51bGwgPSBDb21iaW5lZENvbGxlY3Rpb24uZmluZEV4aXN0aW5nQ29sbGVjdGlvbkZyb21MaXN0KHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMsIGNvbGxlY3Rpb24pO1xyXG5cclxuICAgICAgLy8gSWYgdGVybSBhcGkgZG9lc24ndCBoYXZlIGVuZ2luZSBsYW5ndWFnZXMsIGNvbGxlY3Rpb24gc2hvdWxkIG5vdCBiZSBzaG93biAoaWYgaXQgaXMgbm90IGFscmVhZHkgaW1wb3J0ZWQgc29tZWhvdyk7XHJcbiAgICAgIGlmICghZXhpc3RpbmcgJiYgY29sbGVjdGlvbi5zb3VyY2UgPT09IEVuZ2luZVRlcm1Db2xsZWN0aW9uU291cmNlLlRJTERFX1RFUk0pIHtcclxuICAgICAgICBsZXQgaGFzTGFuZ3VhZ2VzID0gdHJ1ZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uZW5naW5lTGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uPy5sYW5ndWFnZXM/LmZpbmQoXHJcbiAgICAgICAgICAgICAgKGxhbmcpID0+IGxhbmcuaWQgPT09IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uZW5naW5lTGFuZ3VhZ2VzW2ldXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBoYXNMYW5ndWFnZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWhhc0xhbmd1YWdlcykge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXhpc3RpbmcudXBkYXRlKGNvbGxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5oYXNBbnlDb2xsZWN0aW9ucyA9IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMuc2l6ZSA+IDA7XHJcblxyXG4gICAgdGhpcy5lbmdpbmVTdWJqZWN0Lm5leHQodGhpcy5lbmdpbmVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2NoZWR1bGVSZWZyZXNoKGVuZ2luZUlkOiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIgfCBudWxsLCkge1xyXG4gICAgLy8gaWYgbWVudSBpcyBjbG9zZWQgYW5kIHNlbGVjdGVkIGNvbGxlY3Rpb24gaXMgbm90IGltcG9ydGluZyBhbnltb3JlIC0gYXV0byByZWZyZXNoaW5nIHNob3VsZCBiZSBjYW5jZWxsZWQuXHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmhhcmRBdXRvUmVmcmVzaCAmJlxyXG4gICAgICAhdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uaXNJbXBvcnRpbmcgJiZcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5pc1NvZnRBdXRvUmVmcmVzaE9uXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zdG9wQXV0b1JlZnJlc2goZW5naW5lSWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgaGFyZCBhdXRvIHJlZnJlc2hvIG9uLCBhdXRvIHJlZnJlc2ggc2hvdWxkIGJlIG9uLiBJZiBoYXJkIGF1dG9yZWZlcmVzaCBpcyBvZmYgLCByZWZyZXNoIG5lZWRzIHRvIGJlIGRvbmUgb25seSBpZiBzZWxlY3RlZCBpcyBpbXBvcnRpbmcuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoIHx8XHJcbiAgICAgICghdGhpcy5lbmdpbmVzW2VuZ2luZUlkXSAmJlxyXG4gICAgICAgICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzU29mdEF1dG9SZWZyZXNoT24gfHwgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZD8uaXNJbXBvcnRpbmcpKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9XHJcbiAgICAgICAgdGltZW91dCA/P1xyXG4gICAgICAgICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzQW55SW1wb3J0aW5nXHJcbiAgICAgICAgICA/IHRoaXMuY29uZmlnLnRlcm1Db25maWcucmVmcmVzaFRpbWVvdXRNc1doZW5JbXBvcnRpbmdcclxuICAgICAgICAgIDogdGhpcy5jb25maWcudGVybUNvbmZpZy5yZWZyZXNoVGltZW91dE1zKTtcclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0ucmVmcmVzaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sb2FkQ29sbGVjdGlvbnMoZW5naW5lSWQpO1xyXG4gICAgICB9LCB0aW1lb3V0TXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9yZVNlbGVjdGVkSW5Mb2NhbFN0b3JhZ2UoZW5naW5lSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGxvY2FsU3RvcmFnZU9iamVjdCA9IHRoaXMucmVhZExvY2FsU3RvcmFnZSgpO1xyXG5cclxuICAgIGlmICghbG9jYWxTdG9yYWdlT2JqZWN0KSB7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIGxvY2FsU3RvcmFnZU9iamVjdCA9IHt9IGFzIGFueTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2VPYmplY3RbZW5naW5lSWRdID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA/ICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8ubXRDb2xsZWN0aW9uPy5pZCA/PyB0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8udGVybUNvbGxlY3Rpb24/LmlkKSA6IG51bGw7XHJcbiAgICAvLyBzdG9yZSB0ZXJtIGlkIGlmIGl0IGV4aXN0c1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5MT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobG9jYWxTdG9yYWdlT2JqZWN0KSk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHByaXZhdGUgcmVhZExvY2FsU3RvcmFnZSgpOiBhbnkge1xyXG4gICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuTE9DQUxfU1RPUkFHRV9LRVkpIGFzIHN0cmluZztcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZENvbGxlY3Rpb25PdXRzaWRlU2VydmljZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlZEVuZ2luZXNTdWJqZWN0Lm5leHQodGhpcy5lbmdpbmVzKTtcclxuICB9XHJcbn1cclxuIl19