@c8y/ngx-components 1021.11.1 → 1021.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/alarms/alarms-date-filter.component.d.ts +34 -0
  2. package/alarms/alarms-date-filter.component.d.ts.map +1 -0
  3. package/alarms/alarms-filter.component.d.ts +2 -1
  4. package/alarms/alarms-filter.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +5 -2
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts +3 -1
  10. package/alarms/alarms.component.d.ts.map +1 -1
  11. package/alarms/alarms.model.d.ts +47 -1
  12. package/alarms/alarms.model.d.ts.map +1 -1
  13. package/alarms/alarms.module.d.ts +15 -13
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/branding/shared/data/store-branding.service.d.ts +5 -0
  16. package/branding/shared/data/store-branding.service.d.ts.map +1 -1
  17. package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
  18. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  19. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  20. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  21. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  22. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  23. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  24. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  25. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  26. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  28. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  30. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  32. package/core/action-bar/action-bar.module.d.ts +6 -6
  33. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  34. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  35. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  36. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  37. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  38. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  39. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  40. package/core/common/index.d.ts +4 -0
  41. package/core/common/index.d.ts.map +1 -1
  42. package/core/common/inter-app.service.d.ts +48 -0
  43. package/core/common/inter-app.service.d.ts.map +1 -0
  44. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  45. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  46. package/core/dashboard/dashboard.module.d.ts +26 -20
  47. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  48. package/core/dashboard/index.d.ts +3 -0
  49. package/core/dashboard/index.d.ts.map +1 -1
  50. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  54. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  56. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  58. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  66. package/core/dashboard/widget-change-event.model.d.ts +1 -1
  67. package/core/dashboard/widget-change-event.model.d.ts.map +1 -1
  68. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  69. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  71. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts +2 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-helper.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  75. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  77. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +12 -8
  78. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  79. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +7 -26
  80. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  81. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  82. package/core/header/header.module.d.ts +18 -18
  83. package/core/header/header.module.d.ts.map +1 -1
  84. package/core/header/title/title.component.d.ts +1 -1
  85. package/core/header/title/title.component.d.ts.map +1 -1
  86. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  87. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  88. package/core/i18n/i18n.module.d.ts +0 -4
  89. package/core/i18n/i18n.module.d.ts.map +1 -1
  90. package/core/i18n/index.d.ts +2 -1
  91. package/core/i18n/index.d.ts.map +1 -1
  92. package/core/i18n/translation-loader.service.d.ts +50 -0
  93. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  94. package/core/i18n/translation-utils.d.ts +14 -0
  95. package/core/i18n/translation-utils.d.ts.map +1 -0
  96. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  97. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  98. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  99. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  100. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  101. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  102. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  103. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  104. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  105. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  106. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  107. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  108. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  109. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  110. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  111. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  112. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  113. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  114. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  115. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  116. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  117. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  118. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  119. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  120. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  130. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  132. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  133. package/datapoints-export-selector/index.d.ts +15 -0
  134. package/datapoints-export-selector/index.d.ts.map +1 -0
  135. package/device-list/device-list.module.d.ts +4 -2
  136. package/device-list/device-list.module.d.ts.map +1 -1
  137. package/esm2022/alarm-event-selector/alarm-event-selection-list/alarm-event-selection-list.component.mjs +4 -4
  138. package/esm2022/alarm-event-selector/alarm-event-selector-list-item/alarm-event-selector-list-item.component.mjs +3 -3
  139. package/esm2022/alarms/alarms-date-filter.component.mjs +139 -0
  140. package/esm2022/alarms/alarms-filter.component.mjs +11 -5
  141. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  142. package/esm2022/alarms/alarms-type-filter.component.mjs +3 -3
  143. package/esm2022/alarms/alarms-view.service.mjs +16 -2
  144. package/esm2022/alarms/alarms.component.mjs +12 -6
  145. package/esm2022/alarms/alarms.model.mjs +17 -1
  146. package/esm2022/alarms/alarms.module.mjs +11 -4
  147. package/esm2022/branding/shared/data/store-branding.service.mjs +24 -1
  148. package/esm2022/branding/shared/lazy/branding/branding.component.mjs +3 -1
  149. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  150. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  151. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  152. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  153. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  154. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  155. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  156. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  157. package/esm2022/core/action-bar/action-bar.component.mjs +3 -3
  158. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  159. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  160. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  161. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  162. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  163. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  164. package/esm2022/core/common/index.mjs +5 -1
  165. package/esm2022/core/common/inter-app.service.mjs +76 -0
  166. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  167. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  168. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  169. package/esm2022/core/dashboard/dashboard.module.mjs +22 -4
  170. package/esm2022/core/dashboard/index.mjs +4 -1
  171. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  172. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  173. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  174. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  175. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  176. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  177. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  178. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  179. package/esm2022/core/dashboard/widget-change-event.model.mjs +1 -1
  180. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  181. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  182. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  183. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-helper.service.mjs +3 -2
  184. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  185. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  186. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -36
  187. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -72
  188. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +9 -3
  189. package/esm2022/core/header/header.module.mjs +7 -5
  190. package/esm2022/core/header/title/title.component.mjs +3 -3
  191. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  192. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  193. package/esm2022/core/i18n/index.mjs +3 -2
  194. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  195. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  196. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  197. package/esm2022/core/list-display-switch/list-display-switch.component.mjs +3 -3
  198. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  199. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  200. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  201. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  202. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  203. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  204. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  205. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  206. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  207. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  208. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  209. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  210. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  211. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  212. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  213. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  214. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  215. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  216. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  217. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  218. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  219. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  220. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  221. package/esm2022/device-list/device-list.module.mjs +22 -4
  222. package/esm2022/interval-picker/c8y-ngx-components-interval-picker.mjs +5 -0
  223. package/esm2022/interval-picker/index.mjs +3 -0
  224. package/esm2022/interval-picker/interval-picker.component.mjs +68 -0
  225. package/esm2022/interval-picker/interval-picker.model.mjs +47 -0
  226. package/esm2022/map/cluster-map.component.mjs +41 -13
  227. package/esm2022/map/map-status.component.mjs +6 -5
  228. package/esm2022/map/map.component.mjs +9 -5
  229. package/esm2022/map/map.model.mjs +1 -1
  230. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  231. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  232. package/esm2022/translation-editor/data/index.mjs +2 -0
  233. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  234. package/esm2022/translation-editor/index.mjs +10 -0
  235. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  236. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  237. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  238. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  239. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  240. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  241. package/esm2022/widgets/cockpit/index.mjs +4 -2
  242. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  243. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  244. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  245. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  246. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  247. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  248. package/esm2022/widgets/definitions/index.mjs +2 -1
  249. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  250. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  251. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  252. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  253. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  254. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  255. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  256. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  257. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  258. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  259. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  260. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  261. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  262. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  263. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  264. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  265. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  268. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  269. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  270. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  271. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  272. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  273. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +5 -5
  274. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  275. package/fesm2022/c8y-ngx-components-alarms.mjs +189 -31
  276. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  277. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +23 -0
  278. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  279. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -0
  280. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  281. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  282. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  283. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  284. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  285. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  286. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  287. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  288. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  289. package/fesm2022/c8y-ngx-components-interval-picker.mjs +120 -0
  290. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -0
  291. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  292. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  293. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  294. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  295. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  296. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  297. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  298. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  299. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  300. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  301. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  302. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  303. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  304. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  305. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  306. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  307. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  308. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  309. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  314. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  315. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  316. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  317. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  318. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  319. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  320. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  321. package/fesm2022/c8y-ngx-components.mjs +5093 -4369
  322. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  323. package/interval-picker/c8y-ngx-components-interval-picker.d.ts.map +1 -0
  324. package/interval-picker/index.d.ts +3 -0
  325. package/interval-picker/index.d.ts.map +1 -0
  326. package/{core/dashboard/wiget-time-context/interval-picker → interval-picker}/interval-picker.component.d.ts +10 -2
  327. package/interval-picker/interval-picker.component.d.ts.map +1 -0
  328. package/interval-picker/interval-picker.model.d.ts +15 -0
  329. package/interval-picker/interval-picker.model.d.ts.map +1 -0
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +266 -21
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.d.ts.map +0 -1
  431. package/core/i18n/translate.loader.d.ts +0 -31
  432. package/core/i18n/translate.loader.d.ts.map +0 -1
  433. package/esm2022/core/dashboard/wiget-time-context/interval-picker/interval-picker.component.mjs +0 -55
  434. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,132 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { OptionsService } from '../common';
3
+ import { CachedLocaleDictionaryService } from './cached-locale-dictionary.service';
4
+ import { PluginsResolveService } from '../plugins';
5
+ import { LOCALE_PATH } from './locale.path';
6
+ import { LANGUAGES } from './languages';
7
+ import { BehaviorSubject, combineLatest, defer, of } from 'rxjs';
8
+ import { catchError, distinctUntilChanged, map, shareReplay, switchMap, tap } from 'rxjs/operators';
9
+ import { TranslateService } from '@ngx-translate/core';
10
+ import { getDictionaryWithTrimmedKeys } from './translation-utils';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../common";
13
+ import * as i2 from "./cached-locale-dictionary.service";
14
+ import * as i3 from "../plugins";
15
+ import * as i4 from "@ngx-translate/core";
16
+ /**
17
+ * A service to load translations from different sources.
18
+ * It combines translations from the app, user-defined translations, and plugins.
19
+ * It also caches translations to avoid unnecessary requests.
20
+ *
21
+ * Is used instead of the default TranslateLoader functionality that ngx-translate provides as otherwise only the first translations from TranslateLoader observable would have been picked up.
22
+ * This would have been problematic, as we can only load the plugin translations after the login and we need to have at least the basic translations already on the login screen.
23
+ */
24
+ export class TranslationLoaderService {
25
+ constructor(optionsService, cachedLocaleDictionaryService, pluginResolverService, translateService, path = null, languages = null) {
26
+ this.optionsService = optionsService;
27
+ this.cachedLocaleDictionaryService = cachedLocaleDictionaryService;
28
+ this.pluginResolverService = pluginResolverService;
29
+ this.translateService = translateService;
30
+ this.path = path;
31
+ this.languages = languages;
32
+ this.cache = new Map();
33
+ this.reloadTrigger$ = new BehaviorSubject(null);
34
+ this.translateService.onLangChange
35
+ .pipe(map(event => event.lang), distinctUntilChanged(), switchMap(lang => this.getTranslation(lang).pipe(map(translations => ({ lang, translations })))))
36
+ .subscribe(({ lang, translations }) => {
37
+ this.translateService.setTranslation(lang, translations, false);
38
+ });
39
+ }
40
+ getTranslation(lang) {
41
+ const translations$ = combineLatest([
42
+ defer(() => this.getTranslationsFromApp(lang)),
43
+ defer(() => this.getUserDefinedTranslations(lang)),
44
+ defer(() => this.optionsService.get$('langsDetails', {})),
45
+ defer(() => this.getTranslationsForPugins(lang))
46
+ ]).pipe(map(([appTranslations, userDefinedTranslations, langsDetails, pluginTranslations]) => {
47
+ const translationsFromBranding = (langsDetails && langsDetails[lang]) || {};
48
+ return {
49
+ ...appTranslations,
50
+ ...pluginTranslations,
51
+ ...translationsFromBranding,
52
+ ...userDefinedTranslations
53
+ };
54
+ }), tap(dictionary => {
55
+ this.cachedLocaleDictionaryService.cachedDictionary[lang] = dictionary;
56
+ }), map(dictionary => getDictionaryWithTrimmedKeys(dictionary)), catchError(() => of({})));
57
+ return this.reloadTrigger$.pipe(switchMap(() => translations$));
58
+ }
59
+ triggerReload() {
60
+ this.clearCache();
61
+ this.reloadTrigger$.next();
62
+ }
63
+ clearCache() {
64
+ this.cache.clear();
65
+ }
66
+ getTranslationsForPugins(lang) {
67
+ return this.pluginResolverService.contextPathsFromWhereRemotesHaveBeenLoaded$.pipe(switchMap(plugins => {
68
+ // no need to load translations for self scoped plugins
69
+ plugins = plugins.filter(plugin => plugin !== this.optionsService.contextPath);
70
+ if (!plugins.length) {
71
+ return of({});
72
+ }
73
+ return combineLatest(plugins.map(plugin => this.getTranslationsForPlugin(lang, plugin))).pipe(map(translations => {
74
+ return translations.reduce((acc, translation) => ({ ...acc, ...translation }), {});
75
+ }));
76
+ }));
77
+ }
78
+ getTranslationsForPlugin(lang, pluginId) {
79
+ const url = `/apps/${pluginId}/${lang}.json`;
80
+ return this.getTranslationFromPath(url, lang);
81
+ }
82
+ getTranslationsFromApp(lang) {
83
+ const path = this.path || '';
84
+ let url = `${path}${lang}.json`;
85
+ if (this.languages && this.languages[lang] && this.languages[lang].url) {
86
+ url = this.languages[lang].url;
87
+ }
88
+ return this.getTranslationFromPath(url, lang);
89
+ }
90
+ getUserDefinedTranslations(lang) {
91
+ const url = `/apps/public/user-defined-translations/${lang}.json`;
92
+ return this.getTranslationFromPath(url, lang);
93
+ }
94
+ getTranslationFromPath(path, lang) {
95
+ if (this.cache.has(path)) {
96
+ return this.cache.get(path);
97
+ }
98
+ const observable = defer(async () => {
99
+ try {
100
+ const fetchResponse = await fetch(path);
101
+ if (!fetchResponse.ok) {
102
+ throw new Error(`Unexpected response status: ${fetchResponse.status}`);
103
+ }
104
+ const responseBody = await fetchResponse.json();
105
+ if (responseBody[lang]) {
106
+ return responseBody[lang];
107
+ }
108
+ }
109
+ catch (e) {
110
+ console.warn(`Failed to fetch translations from ${path}`);
111
+ }
112
+ return {};
113
+ }).pipe(shareReplay(1));
114
+ this.cache.set(path, observable);
115
+ return observable;
116
+ }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TranslationLoaderService, deps: [{ token: i1.OptionsService }, { token: i2.CachedLocaleDictionaryService }, { token: i3.PluginsResolveService }, { token: i4.TranslateService }, { token: LOCALE_PATH }, { token: LANGUAGES }], target: i0.ɵɵFactoryTarget.Injectable }); }
118
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TranslationLoaderService, providedIn: 'root' }); }
119
+ }
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TranslationLoaderService, decorators: [{
121
+ type: Injectable,
122
+ args: [{
123
+ providedIn: 'root'
124
+ }]
125
+ }], ctorParameters: () => [{ type: i1.OptionsService }, { type: i2.CachedLocaleDictionaryService }, { type: i3.PluginsResolveService }, { type: i4.TranslateService }, { type: undefined, decorators: [{
126
+ type: Inject,
127
+ args: [LOCALE_PATH]
128
+ }] }, { type: undefined, decorators: [{
129
+ type: Inject,
130
+ args: [LANGUAGES]
131
+ }] }] });
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2kxOG4vdHJhbnNsYXRpb24tbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBRW5FOzs7Ozs7O0dBT0c7QUFJSCxNQUFNLE9BQU8sd0JBQXdCO0lBSW5DLFlBQ1UsY0FBOEIsRUFDOUIsNkJBQTRELEVBQzVELHFCQUE0QyxFQUM1QyxnQkFBa0MsRUFDYixPQUFlLElBQUksRUFDckIsWUFBd0QsSUFBSTtRQUwvRSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0NBQTZCLEdBQTdCLDZCQUE2QixDQUErQjtRQUM1RCwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FB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QUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOzhHQTdIVSx3QkFBd0Isa0tBU3pCLFdBQVcsYUFDWCxTQUFTO2tIQVZSLHdCQUF3QixjQUZ2QixNQUFNOzsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFVSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IENhY2hlZExvY2FsZURpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi9jYWNoZWQtbG9jYWxlLWRpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UgfSBmcm9tICcuLi9wbHVnaW5zJztcbmltcG9ydCB7IExPQ0FMRV9QQVRIIH0gZnJvbSAnLi9sb2NhbGUucGF0aCc7XG5pbXBvcnQgeyBMQU5HVUFHRVMgfSBmcm9tICcuL2xhbmd1YWdlcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlZmVyLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGljdGlvbmFyeVdpdGhUcmltbWVkS2V5cyB9IGZyb20gJy4vdHJhbnNsYXRpb24tdXRpbHMnO1xuXG4vKipcbiAqIEEgc2VydmljZSB0byBsb2FkIHRyYW5zbGF0aW9ucyBmcm9tIGRpZmZlcmVudCBzb3VyY2VzLlxuICogSXQgY29tYmluZXMgdHJhbnNsYXRpb25zIGZyb20gdGhlIGFwcCwgdXNlci1kZWZpbmVkIHRyYW5zbGF0aW9ucywgYW5kIHBsdWdpbnMuXG4gKiBJdCBhbHNvIGNhY2hlcyB0cmFuc2xhdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVxdWVzdHMuXG4gKlxuICogSXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IFRyYW5zbGF0ZUxvYWRlciBmdW5jdGlvbmFsaXR5IHRoYXQgbmd4LXRyYW5zbGF0ZSBwcm92aWRlcyBhcyBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3QgdHJhbnNsYXRpb25zIGZyb20gVHJhbnNsYXRlTG9hZGVyIG9ic2VydmFibGUgd291bGQgaGF2ZSBiZWVuIHBpY2tlZCB1cC5cbiAqIFRoaXMgd291bGQgaGF2ZSBiZWVuIHByb2JsZW1hdGljLCBhcyB3ZSBjYW4gb25seSBsb2FkIHRoZSBwbHVnaW4gdHJhbnNsYXRpb25zIGFmdGVyIHRoZSBsb2dpbiBhbmQgd2UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IHRoZSBiYXNpYyB0cmFuc2xhdGlvbnMgYWxyZWFkeSBvbiB0aGUgbG9naW4gc2NyZWVuLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbkxvYWRlclNlcnZpY2Uge1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4+KCk7XG4gIHByaXZhdGUgcmVsb2FkVHJpZ2dlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHZvaWQ+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FjaGVkTG9jYWxlRGljdGlvbmFyeVNlcnZpY2U6IENhY2hlZExvY2FsZURpY3Rpb25hcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGx1Z2luUmVzb2x2ZXJTZXJ2aWNlOiBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoTE9DQUxFX1BBVEgpIHByaXZhdGUgcGF0aDogc3RyaW5nID0gbnVsbCxcbiAgICBASW5qZWN0KExBTkdVQUdFUykgcHJpdmF0ZSBsYW5ndWFnZXM6IHsgW2tleTogc3RyaW5nXTogeyB1cmw/OiBzdHJpbmcgfSB9IHwgbnVsbCA9IG51bGxcbiAgKSB7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChldmVudCA9PiBldmVudC5sYW5nKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKGxhbmcgPT5cbiAgICAgICAgICB0aGlzLmdldFRyYW5zbGF0aW9uKGxhbmcpLnBpcGUobWFwKHRyYW5zbGF0aW9ucyA9PiAoeyBsYW5nLCB0cmFuc2xhdGlvbnMgfSkpKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh7IGxhbmcsIHRyYW5zbGF0aW9ucyB9KSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXRUcmFuc2xhdGlvbihsYW5nLCB0cmFuc2xhdGlvbnMsIGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgZGVmZXIoKCkgPT4gdGhpcy5nZXRUcmFuc2xhdGlvbnNGcm9tQXBwKGxhbmcpKSxcbiAgICAgIGRlZmVyKCgpID0+IHRoaXMuZ2V0VXNlckRlZmluZWRUcmFuc2xhdGlvbnMobGFuZykpLFxuICAgICAgZGVmZXIoKCkgPT4gdGhpcy5vcHRpb25zU2VydmljZS5nZXQkKCdsYW5nc0RldGFpbHMnLCB7fSkpLFxuICAgICAgZGVmZXIoKCkgPT4gdGhpcy5nZXRUcmFuc2xhdGlvbnNGb3JQdWdpbnMobGFuZykpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2FwcFRyYW5zbGF0aW9ucywgdXNlckRlZmluZWRUcmFuc2xhdGlvbnMsIGxhbmdzRGV0YWlscywgcGx1Z2luVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnNGcm9tQnJhbmRpbmcgPSAobGFuZ3NEZXRhaWxzICYmIGxhbmdzRGV0YWlsc1tsYW5nXSkgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYXBwVHJhbnNsYXRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpblRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAuLi50cmFuc2xhdGlvbnNGcm9tQnJhbmRpbmcsXG4gICAgICAgICAgLi4udXNlckRlZmluZWRUcmFuc2xhdGlvbnNcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgdGFwKGRpY3Rpb25hcnkgPT4ge1xuICAgICAgICB0aGlzLmNhY2hlZExvY2FsZURpY3Rpb25hcnlTZXJ2aWNlLmNhY2hlZERpY3Rpb25hcnlbbGFuZ10gPSBkaWN0aW9uYXJ5O1xuICAgICAgfSksXG4gICAgICBtYXAoZGljdGlvbmFyeSA9PiBnZXREaWN0aW9uYXJ5V2l0aFRyaW1tZWRLZXlzKGRpY3Rpb25hcnkpKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2Yoe30pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUcmlnZ2VyJC5waXBlKHN3aXRjaE1hcCgoKSA9PiB0cmFuc2xhdGlvbnMkKSk7XG4gIH1cblxuICB0cmlnZ2VyUmVsb2FkKCkge1xuICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIHRoaXMucmVsb2FkVHJpZ2dlciQubmV4dCgpO1xuICB9XG5cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNsYXRpb25zRm9yUHVnaW5zKGxhbmc6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsdWdpblJlc29sdmVyU2VydmljZS5jb250ZXh0UGF0aHNGcm9tV2hlcmVSZW1vdGVzSGF2ZUJlZW5Mb2FkZWQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAocGx1Z2lucyA9PiB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbG9hZCB0cmFuc2xhdGlvbnMgZm9yIHNlbGYgc2NvcGVkIHBsdWdpbnNcbiAgICAgICAgcGx1Z2lucyA9IHBsdWdpbnMuZmlsdGVyKHBsdWdpbiA9PiBwbHVnaW4gIT09IHRoaXMub3B0aW9uc1NlcnZpY2UuY29udGV4dFBhdGgpO1xuICAgICAgICBpZiAoIXBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChcbiAgICAgICAgICBwbHVnaW5zLm1hcChwbHVnaW4gPT4gdGhpcy5nZXRUcmFuc2xhdGlvbnNGb3JQbHVnaW4obGFuZywgcGx1Z2luKSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcCh0cmFuc2xhdGlvbnMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucy5yZWR1Y2UoKGFjYywgdHJhbnNsYXRpb24pID0+ICh7IC4uLmFjYywgLi4udHJhbnNsYXRpb24gfSksIHt9KTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zbGF0aW9uc0ZvclBsdWdpbihsYW5nOiBzdHJpbmcsIHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1cmwgPSBgL2FwcHMvJHtwbHVnaW5JZH0vJHtsYW5nfS5qc29uYDtcbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21QYXRoKHVybCwgbGFuZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNsYXRpb25zRnJvbUFwcChsYW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRoIHx8ICcnO1xuICAgIGxldCB1cmwgPSBgJHtwYXRofSR7bGFuZ30uanNvbmA7XG4gICAgaWYgKHRoaXMubGFuZ3VhZ2VzICYmIHRoaXMubGFuZ3VhZ2VzW2xhbmddICYmIHRoaXMubGFuZ3VhZ2VzW2xhbmddLnVybCkge1xuICAgICAgdXJsID0gdGhpcy5sYW5ndWFnZXNbbGFuZ10udXJsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9uRnJvbVBhdGgodXJsLCBsYW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRVc2VyRGVmaW5lZFRyYW5zbGF0aW9ucyhsYW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1cmwgPSBgL2FwcHMvcHVibGljL3VzZXItZGVmaW5lZC10cmFuc2xhdGlvbnMvJHtsYW5nfS5qc29uYDtcbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21QYXRoKHVybCwgbGFuZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNsYXRpb25Gcm9tUGF0aChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbGFuZzogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhwYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBvYnNlcnZhYmxlID0gZGVmZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmV0Y2hSZXNwb25zZSA9IGF3YWl0IGZldGNoKHBhdGgpO1xuICAgICAgICBpZiAoIWZldGNoUmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzOiAke2ZldGNoUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5qc29uKCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlQm9keVtsYW5nXSkge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZUJvZHlbbGFuZ107XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHJhbnNsYXRpb25zIGZyb20gJHtwYXRofWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xuICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIG9ic2VydmFibGUpO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,24 @@
1
+ import { mapKeys } from 'lodash-es';
2
+ /**
3
+ * Returns a trimmed translation key.
4
+ * If the key contains HTML, it also removes all whitespaces.
5
+ * The reason behind it is that by default Angular compiler removes
6
+ * whitespaces from adjacent inline elements,
7
+ * which prevents ngx-translate from finding a matching entry in the dictionary.
8
+ */
9
+ export function trimTranslationKey(key) {
10
+ key = key
11
+ .replace(/(\r\n|\n|\r)/gm, '')
12
+ .replace(/\s{2,}/g, ' ')
13
+ .trim();
14
+ const containsHTML = /(<([^>]+)>)/i.test(key);
15
+ return containsHTML ? key.replace(/\s/g, '') : key;
16
+ }
17
+ /**
18
+ * We want to have translation keys unified, so they don't contain unnecessary spaces and line breaks.
19
+ * This way we can dynamically build keys from HTML, and match them to extracted string, that might be HTML as well.
20
+ */
21
+ export function getDictionaryWithTrimmedKeys(dictionary) {
22
+ return mapKeys(dictionary, (value, key) => trimTranslationKey(key));
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2kxOG4vdHJhbnNsYXRpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsR0FBVztJQUM1QyxHQUFHLEdBQUcsR0FBRztTQUNOLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7U0FDN0IsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7U0FDdkIsSUFBSSxFQUFFLENBQUM7SUFDVixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3JELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsVUFBa0I7SUFDN0QsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFwS2V5cyB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIHRyaW1tZWQgdHJhbnNsYXRpb24ga2V5LlxuICogSWYgdGhlIGtleSBjb250YWlucyBIVE1MLCBpdCBhbHNvIHJlbW92ZXMgYWxsIHdoaXRlc3BhY2VzLlxuICogVGhlIHJlYXNvbiBiZWhpbmQgaXQgaXMgdGhhdCBieSBkZWZhdWx0IEFuZ3VsYXIgY29tcGlsZXIgcmVtb3Zlc1xuICogd2hpdGVzcGFjZXMgZnJvbSBhZGphY2VudCBpbmxpbmUgZWxlbWVudHMsXG4gKiB3aGljaCBwcmV2ZW50cyBuZ3gtdHJhbnNsYXRlIGZyb20gZmluZGluZyBhIG1hdGNoaW5nIGVudHJ5IGluIHRoZSBkaWN0aW9uYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVRyYW5zbGF0aW9uS2V5KGtleTogc3RyaW5nKSB7XG4gIGtleSA9IGtleVxuICAgIC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnJylcbiAgICAucmVwbGFjZSgvXFxzezIsfS9nLCAnICcpXG4gICAgLnRyaW0oKTtcbiAgY29uc3QgY29udGFpbnNIVE1MID0gLyg8KFtePl0rKT4pL2kudGVzdChrZXkpO1xuICByZXR1cm4gY29udGFpbnNIVE1MID8ga2V5LnJlcGxhY2UoL1xccy9nLCAnJykgOiBrZXk7XG59XG5cbi8qKlxuICogV2Ugd2FudCB0byBoYXZlIHRyYW5zbGF0aW9uIGtleXMgdW5pZmllZCwgc28gdGhleSBkb24ndCBjb250YWluIHVubmVjZXNzYXJ5IHNwYWNlcyBhbmQgbGluZSBicmVha3MuXG4gKiBUaGlzIHdheSB3ZSBjYW4gZHluYW1pY2FsbHkgYnVpbGQga2V5cyBmcm9tIEhUTUwsIGFuZCBtYXRjaCB0aGVtIHRvIGV4dHJhY3RlZCBzdHJpbmcsIHRoYXQgbWlnaHQgYmUgSFRNTCBhcyB3ZWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGljdGlvbmFyeVdpdGhUcmltbWVkS2V5cyhkaWN0aW9uYXJ5OiBvYmplY3QpIHtcbiAgcmV0dXJuIG1hcEtleXMoZGljdGlvbmFyeSwgKHZhbHVlLCBrZXkpID0+IHRyaW1UcmFuc2xhdGlvbktleShrZXkpKTtcbn1cbiJdfQ==
@@ -74,11 +74,11 @@ export class ListDisplaySwitchComponent {
74
74
  return this.listKey || this.location.path();
75
75
  }
76
76
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ListDisplaySwitchComponent, deps: [{ token: i1.Location }], target: i0.ɵɵFactoryTarget.Component }); }
77
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: { listKey: "listKey", listLength: "listLength", filterPipe: "filterPipe" }, outputs: { onListClassChange: "onListClassChange" }, ngImport: i0, template: "<div class=\"form-group\">\n <label class=\"m-r-8\" id=\"listLabel\">\n {{ 'Display as' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n aria-labelledby=\"listLabel\"\n name=\"listLabel\"\n class=\"form-control\"\n [ngModel]=\"selectedOption\"\n (ngModelChange)=\"onOptionSelect($event)\"\n [attr.aria-label]=\"'Display mode' | translate\"\n >\n <option *ngFor=\"let option of DISPLAY_OPTIONS\" [ngValue]=\"option\">\n {{ option.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
77
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: { listKey: "listKey", listLength: "listLength", filterPipe: "filterPipe" }, outputs: { onListClassChange: "onListClassChange" }, ngImport: i0, template: "<div class=\"d-flex\">\n <label class=\"m-r-8\" id=\"listLabel\">\n {{ 'Display as' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n aria-labelledby=\"listLabel\"\n name=\"listLabel\"\n class=\"form-control\"\n [ngModel]=\"selectedOption\"\n (ngModelChange)=\"onOptionSelect($event)\"\n [attr.aria-label]=\"'Display mode' | translate\"\n >\n <option *ngFor=\"let option of DISPLAY_OPTIONS\" [ngValue]=\"option\">\n {{ option.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
78
78
  }
79
79
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ListDisplaySwitchComponent, decorators: [{
80
80
  type: Component,
81
- args: [{ selector: 'c8y-list-display-switch', template: "<div class=\"form-group\">\n <label class=\"m-r-8\" id=\"listLabel\">\n {{ 'Display as' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n aria-labelledby=\"listLabel\"\n name=\"listLabel\"\n class=\"form-control\"\n [ngModel]=\"selectedOption\"\n (ngModelChange)=\"onOptionSelect($event)\"\n [attr.aria-label]=\"'Display mode' | translate\"\n >\n <option *ngFor=\"let option of DISPLAY_OPTIONS\" [ngValue]=\"option\">\n {{ option.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</div>\n" }]
81
+ args: [{ selector: 'c8y-list-display-switch', template: "<div class=\"d-flex\">\n <label class=\"m-r-8\" id=\"listLabel\">\n {{ 'Display as' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n aria-labelledby=\"listLabel\"\n name=\"listLabel\"\n class=\"form-control\"\n [ngModel]=\"selectedOption\"\n (ngModelChange)=\"onOptionSelect($event)\"\n [attr.aria-label]=\"'Display mode' | translate\"\n >\n <option *ngFor=\"let option of DISPLAY_OPTIONS\" [ngValue]=\"option\">\n {{ option.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</div>\n" }]
82
82
  }], ctorParameters: () => [{ type: i1.Location }], propDecorators: { listKey: [{
83
83
  type: Input
84
84
  }], listLength: [{
@@ -89,4 +89,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
89
89
  }], onListClassChange: [{
90
90
  type: Output
91
91
  }] } });
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2xpc3QtZGlzcGxheS1zd2l0Y2gvbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2xpc3QtZGlzcGxheS1zd2l0Y2gvbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBTzFDLE1BQU0sT0FBTywwQkFBMEI7SUFFckMsSUFDSSxVQUFVLENBQUMsR0FBVztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBa0NELFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFqQzdCLGVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN4QixzQkFBaUIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUd0RSxvQkFBZSxHQUFvQjtZQUMxQztnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDdEIsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsWUFBWSxFQUFFLEdBQUcs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ci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBEaXNwbGF5T3B0aW9uIH0gZnJvbSAnLi9saXN0LWRpc3BsYXktc3dpdGNoLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWxpc3QtZGlzcGxheS1zd2l0Y2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTGlzdERpc3BsYXlTd2l0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsaXN0S2V5OiBzdHJpbmc7XG4gIEBJbnB1dCgnbGlzdExlbmd0aCcpXG4gIHNldCBsaXN0TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGlzdExlbmd0aCA9IHZhbDtcbiAgICB0aGlzLmxvYWRTZWxlY3RlZE9wdGlvbigpO1xuICB9XG4gIEBJbnB1dCgpIGZpbHRlclBpcGUgPSBwaXBlKHRhcCgpKTtcbiAgQE91dHB1dCgpIG9uTGlzdENsYXNzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBzZWxlY3RlZE9wdGlvbjogRGlzcGxheU9wdGlvbjtcblxuICByZWFkb25seSBESVNQTEFZX09QVElPTlM6IERpc3BsYXlPcHRpb25bXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQVVUTycsXG4gICAgICB2YWx1ZTogJ2F1dG8nLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0F1dG8nKSxcbiAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICBnZXRMaXN0Q2xhc3M6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID1cbiAgICAgICAgICB0aGlzLl9saXN0TGVuZ3RoID4gdGhpcy5BVVRPX0dSSURfSVRFTVNfTElNSVRcbiAgICAgICAgICAgID8gdGhpcy5ESVNQTEFZX09QVElPTlMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09ICdMSVNUJylcbiAgICAgICAgICAgIDogdGhpcy5ESVNQTEFZX09QVElPTlMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09ICdHUklEJyk7XG4gICAgICAgIHJldHVybiBvcHRpb24uZ2V0TGlzdENsYXNzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnR1JJRCcsXG4gICAgICB2YWx1ZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0dyaWQnKSxcbiAgICAgIGdldExpc3RDbGFzczogKCkgPT4gJ2ludGVyYWN0LWdyaWQnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTElTVCcsXG4gICAgICB2YWx1ZTogJ2xpc3QnLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0xpc3QnKSxcbiAgICAgIGdldExpc3RDbGFzczogKCkgPT4gJ2ludGVyYWN0LWxpc3QnXG4gICAgfVxuICBdO1xuICBwcml2YXRlIHJlYWRvbmx5IEFVVE9fR1JJRF9JVEVNU19MSU1JVCA9IDEyO1xuICBwcml2YXRlIF9saXN0TGVuZ3RoOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZFNlbGVjdGVkT3B0aW9uKCk7XG4gIH1cblxuICBvbk9wdGlvblNlbGVjdChvcHRpb246IERpc3BsYXlPcHRpb24pIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2VLZXkgPSB0aGlzLmdldExvY2FsU3RvcmFnZUtleSgpO1xuICAgIGlmIChvcHRpb24uZGVmYXVsdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obG9jYWxTdG9yYWdlS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBvcHRpb24udmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRTZWxlY3RlZE9wdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2VsZWN0ZWRPcHRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMuZ2V0TG9jYWxTdG9yYWdlT3B0aW9uKCkgfHwgdGhpcy5nZXREZWZhdWx0T3B0aW9uKCk7XG4gICAgdGhpcy5vbkxpc3RDbGFzc0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb24uZ2V0TGlzdENsYXNzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbFN0b3JhZ2VPcHRpb24oKTogRGlzcGxheU9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuRElTUExBWV9PUFRJT05TLmZpbmQoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldExvY2FsU3RvcmFnZUtleSgpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRPcHRpb24oKTogRGlzcGxheU9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuRElTUExBWV9PUFRJT05TLmZpbmQob3B0aW9uID0+IG9wdGlvbi5kZWZhdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9jYWxTdG9yYWdlS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBsaXN0LWRpc3BsYXktb3B0aW9uWyR7dGhpcy5nZXRMaXN0S2V5KCl9XWA7XG4gIH1cblxuICBwcml2YXRlIGdldExpc3RLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saXN0S2V5IHx8IHRoaXMubG9jYXRpb24ucGF0aCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgY2xhc3M9XCJtLXItOFwiIGlkPVwibGlzdExhYmVsXCI+XG4gICAge3sgJ0Rpc3BsYXkgYXMnIHwgdHJhbnNsYXRlIH19XG4gIDwvbGFiZWw+XG4gIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICA8c2VsZWN0XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9XCJsaXN0TGFiZWxcIlxuICAgICAgbmFtZT1cImxpc3RMYWJlbFwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9wdGlvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Rpc3BsYXkgbW9kZScgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBESVNQTEFZX09QVElPTlNcIiBbbmdWYWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAge3sgb3B0aW9uLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgICA8c3Bhbj48L3NwYW4+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2xpc3QtZGlzcGxheS1zd2l0Y2gvbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2xpc3QtZGlzcGxheS1zd2l0Y2gvbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBTzFDLE1BQU0sT0FBTywwQkFBMEI7SUFFckMsSUFDSSxVQUFVLENBQUMsR0FBVztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBa0NELFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFqQzdCLGVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN4QixzQkFBaUIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUd0RSxvQkFBZSxHQUFvQjtZQUMxQztnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDdEIsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsWUFBWSxFQUFFLEdBQUcs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ci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBEaXNwbGF5T3B0aW9uIH0gZnJvbSAnLi9saXN0LWRpc3BsYXktc3dpdGNoLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWxpc3QtZGlzcGxheS1zd2l0Y2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdC1kaXNwbGF5LXN3aXRjaC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTGlzdERpc3BsYXlTd2l0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsaXN0S2V5OiBzdHJpbmc7XG4gIEBJbnB1dCgnbGlzdExlbmd0aCcpXG4gIHNldCBsaXN0TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGlzdExlbmd0aCA9IHZhbDtcbiAgICB0aGlzLmxvYWRTZWxlY3RlZE9wdGlvbigpO1xuICB9XG4gIEBJbnB1dCgpIGZpbHRlclBpcGUgPSBwaXBlKHRhcCgpKTtcbiAgQE91dHB1dCgpIG9uTGlzdENsYXNzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBzZWxlY3RlZE9wdGlvbjogRGlzcGxheU9wdGlvbjtcblxuICByZWFkb25seSBESVNQTEFZX09QVElPTlM6IERpc3BsYXlPcHRpb25bXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQVVUTycsXG4gICAgICB2YWx1ZTogJ2F1dG8nLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0F1dG8nKSxcbiAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICBnZXRMaXN0Q2xhc3M6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID1cbiAgICAgICAgICB0aGlzLl9saXN0TGVuZ3RoID4gdGhpcy5BVVRPX0dSSURfSVRFTVNfTElNSVRcbiAgICAgICAgICAgID8gdGhpcy5ESVNQTEFZX09QVElPTlMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09ICdMSVNUJylcbiAgICAgICAgICAgIDogdGhpcy5ESVNQTEFZX09QVElPTlMuZmluZChvcHQgPT4gb3B0Lm5hbWUgPT09ICdHUklEJyk7XG4gICAgICAgIHJldHVybiBvcHRpb24uZ2V0TGlzdENsYXNzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnR1JJRCcsXG4gICAgICB2YWx1ZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0dyaWQnKSxcbiAgICAgIGdldExpc3RDbGFzczogKCkgPT4gJ2ludGVyYWN0LWdyaWQnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTElTVCcsXG4gICAgICB2YWx1ZTogJ2xpc3QnLFxuICAgICAgbGFiZWw6IGdldHRleHQoJ0xpc3QnKSxcbiAgICAgIGdldExpc3RDbGFzczogKCkgPT4gJ2ludGVyYWN0LWxpc3QnXG4gICAgfVxuICBdO1xuICBwcml2YXRlIHJlYWRvbmx5IEFVVE9fR1JJRF9JVEVNU19MSU1JVCA9IDEyO1xuICBwcml2YXRlIF9saXN0TGVuZ3RoOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZFNlbGVjdGVkT3B0aW9uKCk7XG4gIH1cblxuICBvbk9wdGlvblNlbGVjdChvcHRpb246IERpc3BsYXlPcHRpb24pIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2VLZXkgPSB0aGlzLmdldExvY2FsU3RvcmFnZUtleSgpO1xuICAgIGlmIChvcHRpb24uZGVmYXVsdCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obG9jYWxTdG9yYWdlS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBvcHRpb24udmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRTZWxlY3RlZE9wdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2VsZWN0ZWRPcHRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMuZ2V0TG9jYWxTdG9yYWdlT3B0aW9uKCkgfHwgdGhpcy5nZXREZWZhdWx0T3B0aW9uKCk7XG4gICAgdGhpcy5vbkxpc3RDbGFzc0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb24uZ2V0TGlzdENsYXNzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbFN0b3JhZ2VPcHRpb24oKTogRGlzcGxheU9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuRElTUExBWV9PUFRJT05TLmZpbmQoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldExvY2FsU3RvcmFnZUtleSgpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRPcHRpb24oKTogRGlzcGxheU9wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuRElTUExBWV9PUFRJT05TLmZpbmQob3B0aW9uID0+IG9wdGlvbi5kZWZhdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9jYWxTdG9yYWdlS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBsaXN0LWRpc3BsYXktb3B0aW9uWyR7dGhpcy5nZXRMaXN0S2V5KCl9XWA7XG4gIH1cblxuICBwcml2YXRlIGdldExpc3RLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saXN0S2V5IHx8IHRoaXMubG9jYXRpb24ucGF0aCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gIDxsYWJlbCBjbGFzcz1cIm0tci04XCIgaWQ9XCJsaXN0TGFiZWxcIj5cbiAgICB7eyAnRGlzcGxheSBhcycgfCB0cmFuc2xhdGUgfX1cbiAgPC9sYWJlbD5cbiAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgIDxzZWxlY3RcbiAgICAgIGFyaWEtbGFiZWxsZWRieT1cImxpc3RMYWJlbFwiXG4gICAgICBuYW1lPVwibGlzdExhYmVsXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkT3B0aW9uXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uU2VsZWN0KCRldmVudClcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGlzcGxheSBtb2RlJyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIERJU1BMQVlfT1BUSU9OU1wiIFtuZ1ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICB7eyBvcHRpb24ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICAgIDxzcGFuPjwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -1,17 +1,10 @@
1
1
  import { Injectable, NgModuleRef, EnvironmentInjector, createNgModule } from '@angular/core';
2
- import { FetchClient } from '@c8y/client';
3
- import { TranslateService } from '@ngx-translate/core';
4
2
  import { reduce, forEach, get, union, camelCase } from 'lodash-es';
5
3
  import { BehaviorSubject, Subject } from 'rxjs';
6
4
  import { shareReplay } from 'rxjs/operators';
7
- import { AppStateService, StandalonePluginInjector } from '../common';
8
- import { OptionsService } from '../common/options.service';
5
+ import { StandalonePluginInjector } from '../common';
9
6
  import { cloneDeep } from 'lodash-es';
10
7
  import * as i0 from "@angular/core";
11
- import * as i1 from "@ngx-translate/core";
12
- import * as i2 from "@c8y/client";
13
- import * as i3 from "../common";
14
- import * as i4 from "../common/options.service";
15
8
  export class PluginsResolveService {
16
9
  /**
17
10
  * Takes a list of remotes and turns it into an object containing union of corresponding remotes.
@@ -71,18 +64,15 @@ export class PluginsResolveService {
71
64
  }
72
65
  return remotesToRemoveFrom;
73
66
  }
74
- constructor(translateService, fetchClient, appState, injector, optionsService) {
75
- this.translateService = translateService;
76
- this.fetchClient = fetchClient;
77
- this.appState = appState;
67
+ constructor(injector) {
78
68
  this.injector = injector;
79
- this.optionsService = optionsService;
80
69
  this.urlRemotesCache = null;
81
70
  this.remoteScriptSet = new Set();
82
71
  this._injectors$ = new Subject();
83
72
  this._refresh$ = new Subject();
84
73
  this._pluginDetails$ = new Subject();
85
74
  this._allPluginsLoaded$ = new BehaviorSubject(false);
75
+ this._contextPathsFromWhereRemotesHaveBeenLoaded$ = new BehaviorSubject([]);
86
76
  this.injectors$ = this._injectors$.asObservable().pipe(
87
77
  // not specifying the bufferSize of shareReplay so all injectors are received on subscription
88
78
  shareReplay());
@@ -91,6 +81,8 @@ export class PluginsResolveService {
91
81
  // not specifying the bufferSize of shareReplay so all details are received on subscription
92
82
  shareReplay());
93
83
  this.allPluginsLoaded$ = this._allPluginsLoaded$.asObservable();
84
+ this.contextPathsFromWhereRemotesHaveBeenLoaded$ =
85
+ this._contextPathsFromWhereRemotesHaveBeenLoaded$.asObservable();
94
86
  }
95
87
  /**
96
88
  * Loads plugins by resolving the remote NgModules and injecting it. Also attaching
@@ -126,7 +118,8 @@ export class PluginsResolveService {
126
118
  loadProviders(providers, name) {
127
119
  const injector = new StandalonePluginInjector({
128
120
  providers: providers,
129
- name: `pluginsInjector-${name}`
121
+ name: `pluginsInjector-${name}`,
122
+ parent: this.injector
130
123
  });
131
124
  this._injectors$.next(injector);
132
125
  }
@@ -179,17 +172,12 @@ export class PluginsResolveService {
179
172
  console.warn(`Could not load remote module '%s' from url:`, moduleName, url);
180
173
  }
181
174
  }
182
- // no need to load translations if we were unable to load a single module..
175
+ // Only add successfully loaded remotes to the list
183
176
  if (atLeastOneModuleLoadedSuccessfully) {
184
- await this.loadRemoteTranslations(pluginId);
177
+ this._contextPathsFromWhereRemotesHaveBeenLoaded$.next(this._contextPathsFromWhereRemotesHaveBeenLoaded$.value.concat(pluginId));
185
178
  }
186
179
  }
187
180
  }
188
- // Added to ensure that the translations from public-options are not overridden by the plugin translations
189
- const { lang } = this.appState.state;
190
- if (this.optionsService.langsDetails && this.optionsService.langsDetails[lang]) {
191
- this.translateService.setTranslation(lang, this.optionsService.langsDetails[lang], true);
192
- }
193
181
  return remoteModules;
194
182
  }
195
183
  /**
@@ -239,19 +227,6 @@ export class PluginsResolveService {
239
227
  }
240
228
  return this.urlRemotesCache;
241
229
  }
242
- async loadRemoteTranslations(pluginId) {
243
- try {
244
- const { lang } = this.appState.state;
245
- const resp = await this.fetchClient.fetch(`/apps/${pluginId}/${lang}.json`);
246
- if (resp.status < 400) {
247
- const result = await resp.json();
248
- this.translateService.setTranslation(lang, result[lang], true);
249
- }
250
- }
251
- catch (ex) {
252
- console.warn(`Failed to load translations for ${pluginId}`);
253
- }
254
- }
255
230
  async loadRemoteModule(remoteEntryUrl, remoteContextPath, exposedModule) {
256
231
  if (!this.remoteScriptSet.has(remoteEntryUrl)) {
257
232
  this.remoteScriptSet.add(remoteEntryUrl);
@@ -307,7 +282,7 @@ export class PluginsResolveService {
307
282
  }
308
283
  return { name: exposedModule, factory };
309
284
  }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PluginsResolveService, deps: [{ token: i1.TranslateService }, { token: i2.FetchClient }, { token: i3.AppStateService }, { token: i0.EnvironmentInjector }, { token: i4.OptionsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
285
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PluginsResolveService, deps: [{ token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable }); }
311
286
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PluginsResolveService, providedIn: 'root' }); }
312
287
  }
313
288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: PluginsResolveService, decorators: [{
@@ -315,5 +290,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
315
290
  args: [{
316
291
  providedIn: 'root'
317
292
  }]
318
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.FetchClient }, { type: i3.AppStateService }, { type: i0.EnvironmentInjector }, { type: i4.OptionsService }] });
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3BsdWdpbnMvcGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLGNBQWMsRUFHZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTRCLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBZ0J0QyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBbUM7UUFDckQsT0FBTyxNQUFNLENBQ1gsT0FBTyxFQUNQLENBQUMsVUFBb0MsRUFBRSxRQUFrQyxFQUFFLEVBQUU7WUFDM0UsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLGFBQXVCLEVBQUUsaUJBQXlCLEVBQUUsRUFBRTtnQkFDdkUsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLENBQUMs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O1FBQ3JCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFDLENBQUM7OEdBcldVLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzJGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZ01vZHVsZVJlZixcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgVHlwZSxcbiAgY3JlYXRlTmdNb2R1bGUsXG4gIEluamVjdG9yLFxuICBQcm92aWRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucywgRmV0Y2hDbGllbnQgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyByZWR1Y2UsIGZvckVhY2gsIGdldCwgdW5pb24sIGNhbWVsQ2FzZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlLCBTdGFuZGFsb25lUGx1Z2luSW5qZWN0b3IgfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbnR5cGUgU2NvcGUgPSB1bmtub3duO1xudHlwZSBGYWN0b3J5ID0gKCkgPT4gYW55O1xuXG5kZWNsYXJlIGNvbnN0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXzogKHNoYXJlU2NvcGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fOiB7IGRlZmF1bHQ6IFNjb3BlIH07XG5kZWNsYXJlIGNvbnN0IF9fT1JJR0lOQUxfQ09OVEVYVF9QQVRIX186IHN0cmluZztcblxuaW50ZXJmYWNlIENvbnRhaW5lciB7XG4gIGluaXQoc2hhcmVTY29wZTogU2NvcGUpOiB2b2lkO1xuICBnZXQobW9kdWxlOiBzdHJpbmcpOiBGYWN0b3J5O1xufVxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGx1Z2luc1Jlc29sdmVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBvZiByZW1vdGVzIGFuZCB0dXJucyBpdCBpbnRvIGFuIG9iamVjdCBjb250YWluaW5nIHVuaW9uIG9mIGNvcnJlc3BvbmRpbmcgcmVtb3Rlcy5cbiAgICogQHBhcmFtIHJlbW90ZXMgTGlzdCBvZiB0aGUgcmVtb3Rlcy5cbiAgICogQHJldHVybnMgUmV0dXJucyBvYmplY3Qgd2l0aCBtZXJnZWQgcmVtb3Rlcy5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdGVzQTpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJywgJ21vZHVsZUInXSB9O1xuICAgKiBjb25zdCByZW1vdGVzQjpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJ10sIGNvbnRleHRQYXRoQjogWydtb2R1bGVaJ10gfTtcbiAgICogY29uc3QgbWVyZ2VkUmVtb3RlczpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBtZXJnZVJlbW90ZXMoW3JlbW90ZXNBLCByZW1vdGVzQl0pO1xuICAgKiAvLyBSZXN1bHRcbiAgICoge1xuICAgKiAgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnLCAnbW9kdWxlQiddLFxuICAgKiAgY29udGV4dFBhdGhCOiBbJ21vZHVsZVonXVxuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIG1lcmdlUmVtb3RlcyhyZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnNbXSk6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyB7XG4gICAgcmV0dXJuIHJlZHVjZShcbiAgICAgIHJlbW90ZXMsXG4gICAgICAoYWxsUmVtb3RlczogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zLCBtZlJlbW90ZTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zKSA9PiB7XG4gICAgICAgIGZvckVhY2gobWZSZW1vdGUsIChyZW1vdGVNb2R1bGVzOiBzdHJpbmdbXSwgcmVtb3RlQ29udGV4dFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZW1vdGVzID0gZ2V0KGFsbFJlbW90ZXMsIHJlbW90ZUNvbnRleHRQYXRoLCBbXSk7XG4gICAgICAgICAgYWxsUmVtb3Rlc1tyZW1vdGVDb250ZXh0UGF0aF0gPSB1bmlvbihjdXJyZW50UmVtb3RlcywgcmVtb3RlTW9kdWxlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhbGxSZW1vdGVzO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVSZW1vdGVzKFxuICAgIHJlbW90ZXNUb1JlbW92ZUZyb206IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyxcbiAgICByZW1vdGVzVG9SZW1vdmU/OiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnNcbiAgKTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zIHtcbiAgICBjb25zdCBrZXlzVG9SZW1vdmUgPSBPYmplY3Qua2V5cyhyZW1vdGVzVG9SZW1vdmUgfHwge30pO1xuICAgIGlmICgha2V5c1RvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJlbW90ZXNUb1JlbW92ZUZyb207XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRLZXlzID0gT2JqZWN0LmtleXMocmVtb3Rlc1RvUmVtb3ZlRnJvbSk7XG4gICAgY29uc3Qga2V5c1ByZXNlbnRJbkJvdGggPSBjdXJyZW50S2V5cy5maWx0ZXIoa2V5ID0+IGtleXNUb1JlbW92ZS5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoIWtleXNQcmVzZW50SW5Cb3RoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJlbW90ZXNUb1JlbW92ZUZyb207XG4gICAgfVxuICAgIHJlbW90ZXNUb1JlbW92ZUZyb20gPSBjbG9uZURlZXAocmVtb3Rlc1RvUmVtb3ZlRnJvbSk7XG4gICAgZm9yIChjb25zdCByZW1vdGVDb250ZXh0UGF0aCBvZiBrZXlzUHJlc2VudEluQm90aCkge1xuICAgICAgY29uc3QgcmVtb3RlTW9kdWxlc1RvQmVSZW1vdmVkID0gcmVtb3Rlc1RvUmVtb3ZlW3JlbW90ZUNvbnRleHRQYXRoXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZW1vdGVNb2R1bGVzVG9CZVJlbW92ZWQpIHx8ICFyZW1vdGVNb2R1bGVzVG9CZVJlbW92ZWQ/Lmxlbmd0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1cnJlbnRNb2R1bGVzID0gcmVtb3Rlc1RvUmVtb3ZlRnJvbVtyZW1vdGVDb250ZXh0UGF0aF07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudE1vZHVsZXMpIHx8ICFjdXJyZW50TW9kdWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGRlbGV0ZSByZW1vdGVzVG9SZW1vdmVGcm9tW3JlbW90ZUNvbnRleHRQYXRoXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRNb2R1bGVzID0gY3VycmVudE1vZHVsZXMuZmlsdGVyKG1vZHVsZSA9PiAhcmVtb3RlTW9kdWxlc1RvQmVSZW1vdmVkLmluY2x1ZGVzKG1vZHVsZSkpO1xuICAgICAgaWYgKGN1cnJlbnRNb2R1bGVzLmxlbmd0aCkge1xuICAgICAgICByZW1vdGVzVG9SZW1vdmVGcm9tW3JlbW90ZUNvbnRleHRQYXRoXSA9IGN1cnJlbnRNb2R1bGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHJlbW90ZXNUb1JlbW92ZUZyb21bcmVtb3RlQ29udGV4dFBhdGhdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZW1vdGVzVG9SZW1vdmVGcm9tO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFsbCBpbmplY3RvcnMgb2YgYWxyZWFkeSBsb2FkZWQgcGx1Z2lucyBvbiBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBpbmplY3RvcnMkOiBPYnNlcnZhYmxlPEVudmlyb25tZW50SW5qZWN0b3IgfCBJbmplY3Rvcj47XG4gIC8qKlxuICAgKiBFbWl0cyBvbmNlIHJlbW90ZVBsdWdpbnMgaGF2ZSBiZWVuIHJlc29sdmVkLlxuICAgKi9cbiAgcmVmcmVzaCQ6IE9ic2VydmFibGU8dm9pZD47XG4gIC8qKlxuICAgKiBFbWl0cyBhbGwgcGx1Z2luIGRldGFpbHMgb2YgYWxyZWFkeSBsb2FkZWQgcGx1Z2lucyBvbiBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBwbHVnaW5EZXRhaWxzJDogT2JzZXJ2YWJsZTx7XG4gICAgcmVtb3RlTmdNb2R1bGU6IE5nTW9kdWxlUmVmPHVua25vd24+IHwgVHlwZTx1bmtub3duPjtcbiAgICBtb2R1bGVSZWY6IE5nTW9kdWxlUmVmPHVua25vd24+O1xuICB9PjtcbiAgYWxsUGx1Z2luc0xvYWRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHByaXZhdGUgdXJsUmVtb3Rlc0NhY2hlOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBudWxsO1xuICBwcml2YXRlIHJlbW90ZVNjcmlwdFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbmplY3RvcnMkID0gbmV3IFN1YmplY3Q8RW52aXJvbm1lbnRJbmplY3RvciB8IEluamVjdG9yPigpO1xuICBwcml2YXRlIF9yZWZyZXNoJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3BsdWdpbkRldGFpbHMkID0gbmV3IFN1YmplY3Q8e1xuICAgIHJlbW90ZU5nTW9kdWxlOiBOZ01vZHVsZVJlZjx1bmtub3duPiB8IFR5cGU8dW5rbm93bj47XG4gICAgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjx1bmtub3duPjtcbiAgfT4oKTtcbiAgcHJpdmF0ZSBfYWxsUGx1Z2luc0xvYWRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmZXRjaENsaWVudDogRmV0Y2hDbGllbnQsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBvcHRpb25zU2VydmljZTogT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pbmplY3RvcnMkID0gdGhpcy5faW5qZWN0b3JzJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgLy8gbm90IHNwZWNpZnlpbmcgdGhlIGJ1ZmZlclNpemUgb2Ygc2hhcmVSZXBsYXkgc28gYWxsIGluamVjdG9ycyBhcmUgcmVjZWl2ZWQgb24gc3Vic2NyaXB0aW9uXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgICB0aGlzLnJlZnJlc2gkID0gdGhpcy5fcmVmcmVzaCQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5wbHVnaW5EZXRhaWxzJCA9IHRoaXMuX3BsdWdpbkRldGFpbHMkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAvLyBub3Qgc3BlY2lmeWluZyB0aGUgYnVmZmVyU2l6ZSBvZiBzaGFyZVJlcGxheSBzbyBhbGwgZGV0YWlscyBhcmUgcmVjZWl2ZWQgb24gc3Vic2NyaXB0aW9uXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgICB0aGlzLmFsbFBsdWdpbnNMb2FkZWQkID0gdGhpcy5fYWxsUGx1Z2luc0xvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgcGx1Z2lucyBieSByZXNvbHZpbmcgdGhlIHJlbW90ZSBOZ01vZHVsZXMgYW5kIGluamVjdGluZyBpdC4gQWxzbyBhdHRhY2hpbmdcbiAgICogdGhlIGhvb2tzIG9udG8gdGhlIHJvb3QgaW5qZWN0b3IuXG4gICAqIEBwYXJhbSByZW1vdGVNb2R1bGVzIFRoZSByZW1vdGUgcGx1Z2lucyB0byBsb2FkIGFzIGZhY3RvcnkgbmFtZSBtYXBwaW5nIGFycmF5LlxuICAgKi9cbiAgcmVzb2x2ZVJlbW90ZVBsdWdpbnMocmVtb3RlTW9kdWxlczogQXJyYXk8eyBmYWN0b3J5OyBuYW1lIH0+KSB7XG4gICAgdGhpcy5sb2FkTW9kdWxlc0R5bmFtaWNhbGx5KHJlbW90ZU1vZHVsZXMpO1xuICAgIHRoaXMucmVmcmVzaEhvb2tzKCk7XG4gICAgdGhpcy5tYXJrUGx1Z2luc0FzTG9hZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgbW9kdWxlcyBhbmQgaGFuZGxlcyBob29raW5nIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIHJlbW90ZU5nTW9kdWxlcyBUaGUgbW9kdWxlcyB0byBsb2FkLlxuICAgKi9cbiAgbG9hZE1vZHVsZXNEeW5hbWljYWxseShyZW1vdGVNb2R1bGVzOiBBcnJheTx7IGZhY3Rvcnk7IG5hbWUgfT4pIHtcbiAgICBmb3IgKGNvbnN0IHsgZmFjdG9yeSwgbmFtZSB9IG9mIHJlbW90ZU1vZHVsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU9yUHJvdmlkZXJzID0gZmFjdG9yeVtuYW1lXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlT3JQcm92aWRlcnMpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkUHJvdmlkZXJzKG1vZHVsZU9yUHJvdmlkZXJzLCBuYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRNb2R1bGUobW9kdWxlT3JQcm92aWRlcnMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke25hbWV9YCwgZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRQcm92aWRlcnMocHJvdmlkZXJzOiBQcm92aWRlcltdLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmplY3RvciA9IG5ldyBTdGFuZGFsb25lUGx1Z2luSW5qZWN0b3Ioe1xuICAgICAgcHJvdmlkZXJzOiBwcm92aWRlcnMsXG4gICAgICBuYW1lOiBgcGx1Z2luc0luamVjdG9yLSR7bmFtZX1gXG4gICAgfSk7XG4gICAgdGhpcy5faW5qZWN0b3JzJC5uZXh0KGluamVjdG9yKTtcbiAgfVxuXG4gIGxvYWRNb2R1bGU8VCA9IHVua25vd24+KHJlbW90ZU5nTW9kdWxlOiBOZ01vZHVsZVJlZjxUPiB8IFR5cGU8VD4pIHtcbiAgICBsZXQgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjxUPjtcbiAgICBpZiAocmVtb3RlTmdNb2R1bGUgaW5zdGFuY2VvZiBOZ01vZHVsZVJlZikge1xuICAgICAgLy8gQU9UXG4gICAgICBtb2R1bGVSZWYgPSByZW1vdGVOZ01vZHVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSklUXG4gICAgICBtb2R1bGVSZWYgPSBjcmVhdGVOZ01vZHVsZShyZW1vdGVOZ01vZHVsZSwgdGhpcy5pbmplY3Rvcik7XG4gICAgfVxuICAgIHRoaXMuX2luamVjdG9ycyQubmV4dChtb2R1bGVSZWYuaW5qZWN0b3IpO1xuICAgIHRoaXMuX3BsdWdpbkRldGFpbHMkLm5leHQoeyBtb2R1bGVSZWYsIHJlbW90ZU5nTW9kdWxlIH0pO1xuICAgIHJldHVybiBtb2R1bGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZWZyZXNoIGFsbCBjdXJyZW50IHJlZ2lzdGVyZWQgaG9va3MuXG4gICAqL1xuICByZWZyZXNoSG9va3MoKSB7XG4gICAgdGhpcy5fcmVmcmVzaCQubmV4dCgpO1xuICB9XG5cbiAgbWFya1BsdWdpbnNBc0xvYWRlZCgpIHtcbiAgICB0aGlzLl9hbGxQbHVnaW5zTG9hZGVkJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgbGlzdCBvZiByZW1vdGVzIHNvIHRoYXQgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhlbS5cbiAgICogVGhlIHJlcXVlc3QgaXMgbWFkZSB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3M6IC9hcHBzLzxjb250ZXh0UGF0aD4vcmVtb3RlRW50cnkuanNcbiAgICogQHBhcmFtIHJlbW90ZXMgTGlzdCBvZiByZW1vdGVzIHRvIGJlIGxvYWRlZC5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBmcm9tIHJlbW90ZXMuXG4gICAqL1xuICBhc3luYyBsb2FkUmVtb3RlcyhyZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMpIHtcbiAgICBpZiAoIXJlbW90ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVtb3RlTW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGx1Z2luSWQgaW4gcmVtb3Rlcykge1xuICAgICAgaWYgKHJlbW90ZXMuaGFzT3duUHJvcGVydHkocGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWVzID0gcmVtb3Rlc1twbHVnaW5JZF07XG4gICAgICAgIGNvbnN0IHVybCA9IGAvYXBwcy8ke3BsdWdpbklkfS9yZW1vdGVFbnRyeS5qcz9ub2NhY2hlPSR7ZGF0ZS5nZXRUaW1lKCl9YDtcbiAgICAgICAgbGV0IGF0TGVhc3RPbmVNb2R1bGVMb2FkZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIG1vZHVsZU5hbWVzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlbW90ZU1vZHVsZXMucHVzaChhd2FpdCB0aGlzLmxvYWRSZW1vdGVNb2R1bGUodXJsLCBwbHVnaW5JZCwgbW9kdWxlTmFtZSkpO1xuICAgICAgICAgICAgYXRMZWFzdE9uZU1vZHVsZUxvYWRlZFN1Y2Nlc3NmdWxseSA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IGxvYWQgcmVtb3RlIG1vZHVsZSAnJXMnIGZyb20gdXJsOmAsIG1vZHVsZU5hbWUsIHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byBsb2FkIHRyYW5zbGF0aW9ucyBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsb2FkIGEgc2luZ2xlIG1vZHVsZS4uXG4gICAgICAgIGlmIChhdExlYXN0T25lTW9kdWxlTG9hZGVkU3VjY2Vzc2Z1bGx5KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkUmVtb3RlVHJhbnNsYXRpb25zKHBsdWdpbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGRlZCB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNsYXRpb25zIGZyb20gcHVibGljLW9wdGlvbnMgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IHRoZSBwbHVnaW4gdHJhbnNsYXRpb25zXG4gICAgY29uc3QgeyBsYW5nIH0gPSB0aGlzLmFwcFN0YXRlLnN0YXRlO1xuICAgIGlmICh0aGlzLm9wdGlvbnNTZXJ2aWNlLmxhbmdzRGV0YWlscyAmJiB0aGlzLm9wdGlvbnNTZXJ2aWNlLmxhbmdzRGV0YWlsc1tsYW5nXSkge1xuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKGxhbmcsIHRoaXMub3B0aW9uc1NlcnZpY2UubGFuZ3NEZXRhaWxzW2xhbmddLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZU1vZHVsZXM7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBsaXN0IG9mIHJlbW90ZXMgYW5kIHR1cm5zIGl0IGludG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdW5pb24gb2YgY29ycmVzcG9uZGluZyByZW1vdGVzLlxuICAgKiBAcGFyYW0gbWZSZW1vdGVzIExpc3Qgb2YgdGhlIHJlbW90ZXMuXG4gICAqIEByZXR1cm5zIFJldHVybnMgb2JqZWN0IHdpdGggbWVyZ2VkIHJlbW90ZXMuXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgc3RhdGljIGZ1bmN0aW9uIG1lcmdlUmVtb3RlcyBhcyB0aGlzIGlzIGEgcHVyZSBmdW5jdGlvbi5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdGVzQTpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJywgJ21vZHVsZUInXSB9O1xuICAgKiBjb25zdCByZW1vdGVzQjpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJ10sIGNvbnRleHRQYXRoQjogWydtb2R1bGVaJ10gfTtcbiAgICogY29uc3QgbWVyZ2VkUmVtb3RlczpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBtZXJnZU1GUmVtb3RlcyhbcmVtb3Rlc0EsIHJlbW90ZXNCXSk7XG4gICAqIC8vIFJlc3VsdFxuICAgKiB7XG4gICAqICBjb250ZXh0UGF0aEE6IFsnbW9kdWxlQScsICdtb2R1bGVCJ10sXG4gICAqICBjb250ZXh0UGF0aEI6IFsnbW9kdWxlWiddXG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqL1xuICBtZXJnZU1GUmVtb3RlcyhtZlJlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2luc1tdKTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zIHtcbiAgICByZXR1cm4gUGx1Z2luc1Jlc29sdmVTZXJ2aWNlLm1lcmdlUmVtb3RlcyhtZlJlbW90ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBVUkwgcmVtb3RlcyBjYWNoZS5cbiAgICovXG4gIGNsZWFyVVJMUmVtb3Rlc0NhY2hlKCkge1xuICAgIHRoaXMudXJsUmVtb3Rlc0NhY2hlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlbW90ZXMgbGlzdCBmcm9tIHRoZSBVUkwuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAgICovXG4gIGxvYWRVcmxSZW1vdGVzKCkge1xuICAgIGlmICghdGhpcy51cmxSZW1vdGVzQ2FjaGUpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICBjb25zdCByZW1vdGVzID0gcGFyYW1zLmdldCgncmVtb3RlcycpO1xuICAgICAgaWYgKHJlbW90ZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnVybFJlbW90ZXNDYWNoZSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHJlbW90ZXMpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSByZW1vdGVzOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybFJlbW90ZXNDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbW90ZVRyYW5zbGF0aW9ucyhwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGFuZyB9ID0gdGhpcy5hcHBTdGF0ZS5zdGF0ZTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmZldGNoQ2xpZW50LmZldGNoKGAvYXBwcy8ke3BsdWdpbklkfS8ke2xhbmd9Lmpzb25gKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKGxhbmcsIHJlc3VsdFtsYW5nXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGxvYWQgdHJhbnNsYXRpb25zIGZvciAke3BsdWdpbklkfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbW90ZU1vZHVsZShcbiAgICByZW1vdGVFbnRyeVVybDogc3RyaW5nLFxuICAgIHJlbW90ZUNvbnRleHRQYXRoOiBzdHJpbmcsXG4gICAgZXhwb3NlZE1vZHVsZTogc3RyaW5nXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGZhY3Rvcnk6IEZhY3RvcnkgfT4ge1xuICAgIGlmICghdGhpcy5yZW1vdGVTY3JpcHRTZXQuaGFzKHJlbW90ZUVudHJ5VXJsKSkge1xuICAgICAgdGhpcy5yZW1vdGVTY3JpcHRTZXQuYWRkKHJlbW90ZUVudHJ5VXJsKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFJlbW90ZUVudHJ5KHJlbW90ZUVudHJ5VXJsKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHRQYXRoOiBzdHJpbmcgPSByZW1vdGVDb250ZXh0UGF0aDtcbiAgICBpZiAoY29udGV4dFBhdGguaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29udGV4dFBhdGggPSByZW1vdGVDb250ZXh0UGF0aC5zcGxpdCgnQCcpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb29rdXBFeHBvc2VkTW9kdWxlKGNhbWVsQ2FzZShjb250ZXh0UGF0aCksIGV4cG9zZWRNb2R1bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUmVtb3RlRW50cnkocmVtb3RlRW50cnlVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdC5zcmMgPSByZW1vdGVFbnRyeVVybDtcblxuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSByZWplY3Q7XG5cbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTsgLy8gd2luZG93IGlzIHRoZSBnbG9iYWwgbmFtZXNwYWNlXG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzY3JpcHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb29rdXBFeHBvc2VkTW9kdWxlKFxuICAgIHJlbW90ZU5hbWU6IHN0cmluZyxcbiAgICBleHBvc2VkTW9kdWxlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZmFjdG9yeTogRmFjdG9yeSB9PiB7XG4gICAgLy8gSW5pdGlhbGl6ZXMgdGhlIHNoYXJlIHNjb3BlLiBUaGlzIGZpbGxzIGl0IHdpdGgga25vd24gcHJvdmlkZWQgbW9kdWxlcyBmcm9tIHRoaXMgYnVpbGQgYW5kIGFsbCByZW1vdGVzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXygnZGVmYXVsdCcpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTW9kdWxlICVzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIE1vZHVsZSBGZWRlcmF0aW9uIGlzIG5vdCBlbmFibGVkIGluIHRoaXMgYXBwbGljYXRpb24uYCxcbiAgICAgICAgZXhwb3NlZE1vZHVsZSxcbiAgICAgICAgZXhcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBjb250YWluZXI6IENvbnRhaW5lciA9IHdpbmRvd1tyZW1vdGVOYW1lXTtcblxuICAgIC8qKlxuICAgICAqIE1UTS02MDg1MDogSW4gY2FzZSBvZiBlLmcuIHRoZSBjb2NrcGl0IGFwcCBiZWluZyBjbG9uZWQgdG8gYSBkaWZmZXJlbnQgY29udGV4dCBwYXRoXG4gICAgICogdGhlIHNlbGYgc2NvcGVkIHBsdWdpbnMgb2YgY29ja3BpdCB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBuZXcgY29udGV4dCBwYXRoLlxuICAgICAqIEJ1dCB0aGUgcmVtb3RlRW50cnkuanMgd2lsbCBzdGlsbCByZWdpc3RlciB0aGUgcmVtb3RlcyB3aXRoIHRoZSBvcmlnaW5hbCBjb250ZXh0IHBhdGgsXG4gICAgICogYXMgdGhpcyBpcyBoYXJkY29kZWQgZHVyaW5nIGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIFdlIHRoZXJlZm9yZSBhZGQgYSBmYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBwYXRoIGluIGNhc2UgdGhlcmUgaXMgbm8gY29udGFpbmVyIGZvciB0aGUgcmVtb3RlTmFtZVxuICAgICAqL1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmYWxsYmFja1JlbW90ZU5hbWU6IHN0cmluZyA9IGNhbWVsQ2FzZShfX09SSUdJTkFMX0NPTlRFWFRfUEFUSF9fKTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEF0dHJpYnV0ZSBcIiVzXCIgbm90IGRlZmluZWQgb24gd2luZG93IG9iamVjdCB3aGlsZSB0cnlpbmcgdG8gbG9hZCBcIiVzXCIuIFVzaW5nIFwiJXNcIiBhcyBmYWxsYmFjay5gLFxuICAgICAgICByZW1vdGVOYW1lLFxuICAgICAgICBleHBvc2VkTW9kdWxlLFxuICAgICAgICBmYWxsYmFja1JlbW90ZU5hbWVcbiAgICAgICk7XG4gICAgICBjb250YWluZXIgPSB3aW5kb3dbZmFsbGJhY2tSZW1vdGVOYW1lXTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBjb250YWluZXIsIGl0IG1heSBwcm92aWRlIHNoYXJlZCBtb2R1bGVzXG4gICAgbGV0IGZhY3Rvcnk6IEZhY3Rvcnk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbnRhaW5lci5pbml0KF9fd2VicGFja19zaGFyZV9zY29wZXNfXy5kZWZhdWx0KTtcbiAgICAgIGZhY3RvcnkgPSAoYXdhaXQgY29udGFpbmVyLmdldChleHBvc2VkTW9kdWxlKSkoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS5lcnJvcihgTW9kdWxlICVzIGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXhwb3NlZE1vZHVsZSwgZXgpO1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBleHBvc2VkTW9kdWxlLCBmYWN0b3J5IH07XG4gIH1cbn1cbiJdfQ==
293
+ }], ctorParameters: () => [{ type: i0.EnvironmentInjector }] });
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3BsdWdpbnMvcGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEVBRW5CLGNBQWMsRUFHZixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBZ0J0QyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBbUM7UUFDckQsT0FBTyxNQUFNLENBQ1gsT0FBTyxFQUNQLENBQUMsVUFBb0MsRUFBRSxRQUFrQyxFQUFFLEVBQUU7WUFDM0UsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLGFBQXVCLEVBQUUsaUJBQXlCLEVBQUUsRUFBRTtnQkFDdkUsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FB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QUFDO1FBQ3JCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFDLENBQUM7OEdBdlZVLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzJGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZ01vZHVsZVJlZixcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgVHlwZSxcbiAgY3JlYXRlTmdNb2R1bGUsXG4gIEluamVjdG9yLFxuICBQcm92aWRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IHJlZHVjZSwgZm9yRWFjaCwgZ2V0LCB1bmlvbiwgY2FtZWxDYXNlIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFuZGFsb25lUGx1Z2luSW5qZWN0b3IgfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcblxudHlwZSBTY29wZSA9IHVua25vd247XG50eXBlIEZhY3RvcnkgPSAoKSA9PiBhbnk7XG5cbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fOiAoc2hhcmVTY29wZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX186IHsgZGVmYXVsdDogU2NvcGUgfTtcbmRlY2xhcmUgY29uc3QgX19PUklHSU5BTF9DT05URVhUX1BBVEhfXzogc3RyaW5nO1xuXG5pbnRlcmZhY2UgQ29udGFpbmVyIHtcbiAgaW5pdChzaGFyZVNjb3BlOiBTY29wZSk6IHZvaWQ7XG4gIGdldChtb2R1bGU6IHN0cmluZyk6IEZhY3Rvcnk7XG59XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2Uge1xuICAvKipcbiAgICogVGFrZXMgYSBsaXN0IG9mIHJlbW90ZXMgYW5kIHR1cm5zIGl0IGludG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdW5pb24gb2YgY29ycmVzcG9uZGluZyByZW1vdGVzLlxuICAgKiBAcGFyYW0gcmVtb3RlcyBMaXN0IG9mIHRoZSByZW1vdGVzLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIG9iamVjdCB3aXRoIG1lcmdlZCByZW1vdGVzLlxuICAgKlxuICAgKiAqKkV4YW1wbGUqKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlbW90ZXNBOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHsgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnLCAnbW9kdWxlQiddIH07XG4gICAqIGNvbnN0IHJlbW90ZXNCOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHsgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnXSwgY29udGV4dFBhdGhCOiBbJ21vZHVsZVonXSB9O1xuICAgKiBjb25zdCBtZXJnZWRSZW1vdGVzOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IG1lcmdlUmVtb3RlcyhbcmVtb3Rlc0EsIHJlbW90ZXNCXSk7XG4gICAqIC8vIFJlc3VsdFxuICAgKiB7XG4gICAqICBjb250ZXh0UGF0aEE6IFsnbW9kdWxlQScsICdtb2R1bGVCJ10sXG4gICAqICBjb250ZXh0UGF0aEI6IFsnbW9kdWxlWiddXG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgbWVyZ2VSZW1vdGVzKHJlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2luc1tdKTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zIHtcbiAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgcmVtb3RlcyxcbiAgICAgIChhbGxSZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMsIG1mUmVtb3RlOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMpID0+IHtcbiAgICAgICAgZm9yRWFjaChtZlJlbW90ZSwgKHJlbW90ZU1vZHVsZXM6IHN0cmluZ1tdLCByZW1vdGVDb250ZXh0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJlbW90ZXMgPSBnZXQoYWxsUmVtb3RlcywgcmVtb3RlQ29udGV4dFBhdGgsIFtdKTtcbiAgICAgICAgICBhbGxSZW1vdGVzW3JlbW90ZUNvbnRleHRQYXRoXSA9IHVuaW9uKGN1cnJlbnRSZW1vdGVzLCByZW1vdGVNb2R1bGVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbFJlbW90ZXM7XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVJlbW90ZXMoXG4gICAgcmVtb3Rlc1RvUmVtb3ZlRnJvbTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zLFxuICAgIHJlbW90ZXNUb1JlbW92ZT86IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2luc1xuICApOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMge1xuICAgIGNvbnN0IGtleXNUb1JlbW92ZSA9IE9iamVjdC5rZXlzKHJlbW90ZXNUb1JlbW92ZSB8fCB7fSk7XG4gICAgaWYgKCFrZXlzVG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcmVtb3Rlc1RvUmVtb3ZlRnJvbTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEtleXMgPSBPYmplY3Qua2V5cyhyZW1vdGVzVG9SZW1vdmVGcm9tKTtcbiAgICBjb25zdCBrZXlzUHJlc2VudEluQm90aCA9IGN1cnJlbnRLZXlzLmZpbHRlcihrZXkgPT4ga2V5c1RvUmVtb3ZlLmluY2x1ZGVzKGtleSkpO1xuICAgIGlmICgha2V5c1ByZXNlbnRJbkJvdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcmVtb3Rlc1RvUmVtb3ZlRnJvbTtcbiAgICB9XG4gICAgcmVtb3Rlc1RvUmVtb3ZlRnJvbSA9IGNsb25lRGVlcChyZW1vdGVzVG9SZW1vdmVGcm9tKTtcbiAgICBmb3IgKGNvbnN0IHJlbW90ZUNvbnRleHRQYXRoIG9mIGtleXNQcmVzZW50SW5Cb3RoKSB7XG4gICAgICBjb25zdCByZW1vdGVNb2R1bGVzVG9CZVJlbW92ZWQgPSByZW1vdGVzVG9SZW1vdmVbcmVtb3RlQ29udGV4dFBhdGhdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlbW90ZU1vZHVsZXNUb0JlUmVtb3ZlZCkgfHwgIXJlbW90ZU1vZHVsZXNUb0JlUmVtb3ZlZD8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgY3VycmVudE1vZHVsZXMgPSByZW1vdGVzVG9SZW1vdmVGcm9tW3JlbW90ZUNvbnRleHRQYXRoXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50TW9kdWxlcykgfHwgIWN1cnJlbnRNb2R1bGVzPy5sZW5ndGgpIHtcbiAgICAgICAgZGVsZXRlIHJlbW90ZXNUb1JlbW92ZUZyb21bcmVtb3RlQ29udGV4dFBhdGhdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE1vZHVsZXMgPSBjdXJyZW50TW9kdWxlcy5maWx0ZXIobW9kdWxlID0+ICFyZW1vdGVNb2R1bGVzVG9CZVJlbW92ZWQuaW5jbHVkZXMobW9kdWxlKSk7XG4gICAgICBpZiAoY3VycmVudE1vZHVsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlbW90ZXNUb1JlbW92ZUZyb21bcmVtb3RlQ29udGV4dFBhdGhdID0gY3VycmVudE1vZHVsZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcmVtb3Rlc1RvUmVtb3ZlRnJvbVtyZW1vdGVDb250ZXh0UGF0aF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbW90ZXNUb1JlbW92ZUZyb207XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYWxsIGluamVjdG9ycyBvZiBhbHJlYWR5IGxvYWRlZCBwbHVnaW5zIG9uIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGluamVjdG9ycyQ6IE9ic2VydmFibGU8RW52aXJvbm1lbnRJbmplY3RvciB8IEluamVjdG9yPjtcbiAgLyoqXG4gICAqIEVtaXRzIG9uY2UgcmVtb3RlUGx1Z2lucyBoYXZlIGJlZW4gcmVzb2x2ZWQuXG4gICAqL1xuICByZWZyZXNoJDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgLyoqXG4gICAqIEVtaXRzIGFsbCBwbHVnaW4gZGV0YWlscyBvZiBhbHJlYWR5IGxvYWRlZCBwbHVnaW5zIG9uIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIHBsdWdpbkRldGFpbHMkOiBPYnNlcnZhYmxlPHtcbiAgICByZW1vdGVOZ01vZHVsZTogTmdNb2R1bGVSZWY8dW5rbm93bj4gfCBUeXBlPHVua25vd24+O1xuICAgIG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8dW5rbm93bj47XG4gIH0+O1xuICBhbGxQbHVnaW5zTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEVtaXRzIGFsbCBjb250ZXh0UGF0aHMgKGluY2x1ZGluZyB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uL3RhZywgaWYgcHJvdmlkZWQpIHRoYXQgaGF2ZSBiZWVuIGFscmVhZHkgbG9hZGVkIG9uIHN0YXJ0dXAgYW5kIGZ1cnRoZXIgYW55IG5ld2xvYWQgbG9hZGVkLlxuICAgKi9cbiAgY29udGV4dFBhdGhzRnJvbVdoZXJlUmVtb3Rlc0hhdmVCZWVuTG9hZGVkJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHByaXZhdGUgdXJsUmVtb3Rlc0NhY2hlOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBudWxsO1xuICBwcml2YXRlIHJlbW90ZVNjcmlwdFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbmplY3RvcnMkID0gbmV3IFN1YmplY3Q8RW52aXJvbm1lbnRJbmplY3RvciB8IEluamVjdG9yPigpO1xuICBwcml2YXRlIF9yZWZyZXNoJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3BsdWdpbkRldGFpbHMkID0gbmV3IFN1YmplY3Q8e1xuICAgIHJlbW90ZU5nTW9kdWxlOiBOZ01vZHVsZVJlZjx1bmtub3duPiB8IFR5cGU8dW5rbm93bj47XG4gICAgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjx1bmtub3duPjtcbiAgfT4oKTtcbiAgcHJpdmF0ZSBfYWxsUGx1Z2luc0xvYWRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBfY29udGV4dFBhdGhzRnJvbVdoZXJlUmVtb3Rlc0hhdmVCZWVuTG9hZGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yKSB7XG4gICAgdGhpcy5pbmplY3RvcnMkID0gdGhpcy5faW5qZWN0b3JzJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgLy8gbm90IHNwZWNpZnlpbmcgdGhlIGJ1ZmZlclNpemUgb2Ygc2hhcmVSZXBsYXkgc28gYWxsIGluamVjdG9ycyBhcmUgcmVjZWl2ZWQgb24gc3Vic2NyaXB0aW9uXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgICB0aGlzLnJlZnJlc2gkID0gdGhpcy5fcmVmcmVzaCQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgdGhpcy5wbHVnaW5EZXRhaWxzJCA9IHRoaXMuX3BsdWdpbkRldGFpbHMkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAvLyBub3Qgc3BlY2lmeWluZyB0aGUgYnVmZmVyU2l6ZSBvZiBzaGFyZVJlcGxheSBzbyBhbGwgZGV0YWlscyBhcmUgcmVjZWl2ZWQgb24gc3Vic2NyaXB0aW9uXG4gICAgICBzaGFyZVJlcGxheSgpXG4gICAgKTtcbiAgICB0aGlzLmFsbFBsdWdpbnNMb2FkZWQkID0gdGhpcy5fYWxsUGx1Z2luc0xvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5jb250ZXh0UGF0aHNGcm9tV2hlcmVSZW1vdGVzSGF2ZUJlZW5Mb2FkZWQkID1cbiAgICAgIHRoaXMuX2NvbnRleHRQYXRoc0Zyb21XaGVyZVJlbW90ZXNIYXZlQmVlbkxvYWRlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgcGx1Z2lucyBieSByZXNvbHZpbmcgdGhlIHJlbW90ZSBOZ01vZHVsZXMgYW5kIGluamVjdGluZyBpdC4gQWxzbyBhdHRhY2hpbmdcbiAgICogdGhlIGhvb2tzIG9udG8gdGhlIHJvb3QgaW5qZWN0b3IuXG4gICAqIEBwYXJhbSByZW1vdGVNb2R1bGVzIFRoZSByZW1vdGUgcGx1Z2lucyB0byBsb2FkIGFzIGZhY3RvcnkgbmFtZSBtYXBwaW5nIGFycmF5LlxuICAgKi9cbiAgcmVzb2x2ZVJlbW90ZVBsdWdpbnMocmVtb3RlTW9kdWxlczogQXJyYXk8eyBmYWN0b3J5OyBuYW1lIH0+KSB7XG4gICAgdGhpcy5sb2FkTW9kdWxlc0R5bmFtaWNhbGx5KHJlbW90ZU1vZHVsZXMpO1xuICAgIHRoaXMucmVmcmVzaEhvb2tzKCk7XG4gICAgdGhpcy5tYXJrUGx1Z2luc0FzTG9hZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgbW9kdWxlcyBhbmQgaGFuZGxlcyBob29raW5nIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIHJlbW90ZU5nTW9kdWxlcyBUaGUgbW9kdWxlcyB0byBsb2FkLlxuICAgKi9cbiAgbG9hZE1vZHVsZXNEeW5hbWljYWxseShyZW1vdGVNb2R1bGVzOiBBcnJheTx7IGZhY3Rvcnk7IG5hbWUgfT4pIHtcbiAgICBmb3IgKGNvbnN0IHsgZmFjdG9yeSwgbmFtZSB9IG9mIHJlbW90ZU1vZHVsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU9yUHJvdmlkZXJzID0gZmFjdG9yeVtuYW1lXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlT3JQcm92aWRlcnMpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkUHJvdmlkZXJzKG1vZHVsZU9yUHJvdmlkZXJzLCBuYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRNb2R1bGUobW9kdWxlT3JQcm92aWRlcnMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke25hbWV9YCwgZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRQcm92aWRlcnMocHJvdmlkZXJzOiBQcm92aWRlcltdLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmplY3RvciA9IG5ldyBTdGFuZGFsb25lUGx1Z2luSW5qZWN0b3Ioe1xuICAgICAgcHJvdmlkZXJzOiBwcm92aWRlcnMsXG4gICAgICBuYW1lOiBgcGx1Z2luc0luamVjdG9yLSR7bmFtZX1gLFxuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yXG4gICAgfSk7XG4gICAgdGhpcy5faW5qZWN0b3JzJC5uZXh0KGluamVjdG9yKTtcbiAgfVxuXG4gIGxvYWRNb2R1bGU8VCA9IHVua25vd24+KHJlbW90ZU5nTW9kdWxlOiBOZ01vZHVsZVJlZjxUPiB8IFR5cGU8VD4pIHtcbiAgICBsZXQgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjxUPjtcbiAgICBpZiAocmVtb3RlTmdNb2R1bGUgaW5zdGFuY2VvZiBOZ01vZHVsZVJlZikge1xuICAgICAgLy8gQU9UXG4gICAgICBtb2R1bGVSZWYgPSByZW1vdGVOZ01vZHVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSklUXG4gICAgICBtb2R1bGVSZWYgPSBjcmVhdGVOZ01vZHVsZShyZW1vdGVOZ01vZHVsZSwgdGhpcy5pbmplY3Rvcik7XG4gICAgfVxuICAgIHRoaXMuX2luamVjdG9ycyQubmV4dChtb2R1bGVSZWYuaW5qZWN0b3IpO1xuICAgIHRoaXMuX3BsdWdpbkRldGFpbHMkLm5leHQoeyBtb2R1bGVSZWYsIHJlbW90ZU5nTW9kdWxlIH0pO1xuICAgIHJldHVybiBtb2R1bGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZWZyZXNoIGFsbCBjdXJyZW50IHJlZ2lzdGVyZWQgaG9va3MuXG4gICAqL1xuICByZWZyZXNoSG9va3MoKSB7XG4gICAgdGhpcy5fcmVmcmVzaCQubmV4dCgpO1xuICB9XG5cbiAgbWFya1BsdWdpbnNBc0xvYWRlZCgpIHtcbiAgICB0aGlzLl9hbGxQbHVnaW5zTG9hZGVkJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgbGlzdCBvZiByZW1vdGVzIHNvIHRoYXQgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhlbS5cbiAgICogVGhlIHJlcXVlc3QgaXMgbWFkZSB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3M6IC9hcHBzLzxjb250ZXh0UGF0aD4vcmVtb3RlRW50cnkuanNcbiAgICogQHBhcmFtIHJlbW90ZXMgTGlzdCBvZiByZW1vdGVzIHRvIGJlIGxvYWRlZC5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBmcm9tIHJlbW90ZXMuXG4gICAqL1xuICBhc3luYyBsb2FkUmVtb3RlcyhyZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMpIHtcbiAgICBpZiAoIXJlbW90ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmVtb3RlTW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGx1Z2luSWQgaW4gcmVtb3Rlcykge1xuICAgICAgaWYgKHJlbW90ZXMuaGFzT3duUHJvcGVydHkocGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWVzID0gcmVtb3Rlc1twbHVnaW5JZF07XG4gICAgICAgIGNvbnN0IHVybCA9IGAvYXBwcy8ke3BsdWdpbklkfS9yZW1vdGVFbnRyeS5qcz9ub2NhY2hlPSR7ZGF0ZS5nZXRUaW1lKCl9YDtcbiAgICAgICAgbGV0IGF0TGVhc3RPbmVNb2R1bGVMb2FkZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIG1vZHVsZU5hbWVzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlbW90ZU1vZHVsZXMucHVzaChhd2FpdCB0aGlzLmxvYWRSZW1vdGVNb2R1bGUodXJsLCBwbHVnaW5JZCwgbW9kdWxlTmFtZSkpO1xuICAgICAgICAgICAgYXRMZWFzdE9uZU1vZHVsZUxvYWRlZFN1Y2Nlc3NmdWxseSA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IGxvYWQgcmVtb3RlIG1vZHVsZSAnJXMnIGZyb20gdXJsOmAsIG1vZHVsZU5hbWUsIHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgc3VjY2Vzc2Z1bGx5IGxvYWRlZCByZW1vdGVzIHRvIHRoZSBsaXN0XG4gICAgICAgIGlmIChhdExlYXN0T25lTW9kdWxlTG9hZGVkU3VjY2Vzc2Z1bGx5KSB7XG4gICAgICAgICAgdGhpcy5fY29udGV4dFBhdGhzRnJvbVdoZXJlUmVtb3Rlc0hhdmVCZWVuTG9hZGVkJC5uZXh0KFxuICAgICAgICAgICAgdGhpcy5fY29udGV4dFBhdGhzRnJvbVdoZXJlUmVtb3Rlc0hhdmVCZWVuTG9hZGVkJC52YWx1ZS5jb25jYXQocGx1Z2luSWQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlTW9kdWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIGxpc3Qgb2YgcmVtb3RlcyBhbmQgdHVybnMgaXQgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB1bmlvbiBvZiBjb3JyZXNwb25kaW5nIHJlbW90ZXMuXG4gICAqIEBwYXJhbSBtZlJlbW90ZXMgTGlzdCBvZiB0aGUgcmVtb3Rlcy5cbiAgICogQHJldHVybnMgUmV0dXJucyBvYmplY3Qgd2l0aCBtZXJnZWQgcmVtb3Rlcy5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBzdGF0aWMgZnVuY3Rpb24gbWVyZ2VSZW1vdGVzIGFzIHRoaXMgaXMgYSBwdXJlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAqKkV4YW1wbGUqKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlbW90ZXNBOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHsgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnLCAnbW9kdWxlQiddIH07XG4gICAqIGNvbnN0IHJlbW90ZXNCOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHsgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnXSwgY29udGV4dFBhdGhCOiBbJ21vZHVsZVonXSB9O1xuICAgKiBjb25zdCBtZXJnZWRSZW1vdGVzOkFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IG1lcmdlTUZSZW1vdGVzKFtyZW1vdGVzQSwgcmVtb3Rlc0JdKTtcbiAgICogLy8gUmVzdWx0XG4gICAqIHtcbiAgICogIGNvbnRleHRQYXRoQTogWydtb2R1bGVBJywgJ21vZHVsZUInXSxcbiAgICogIGNvbnRleHRQYXRoQjogWydtb2R1bGVaJ11cbiAgICogfVxuICAgKlxuICAgKiBgYGBcbiAgICovXG4gIG1lcmdlTUZSZW1vdGVzKG1mUmVtb3RlczogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zW10pOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMge1xuICAgIHJldHVybiBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UubWVyZ2VSZW1vdGVzKG1mUmVtb3Rlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIFVSTCByZW1vdGVzIGNhY2hlLlxuICAgKi9cbiAgY2xlYXJVUkxSZW1vdGVzQ2FjaGUoKSB7XG4gICAgdGhpcy51cmxSZW1vdGVzQ2FjaGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcmVtb3RlcyBsaXN0IGZyb20gdGhlIFVSTC5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgbGlzdCBvZiByZW1vdGVzLlxuICAgKi9cbiAgbG9hZFVybFJlbW90ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnVybFJlbW90ZXNDYWNoZSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIGNvbnN0IHJlbW90ZXMgPSBwYXJhbXMuZ2V0KCdyZW1vdGVzJyk7XG4gICAgICBpZiAocmVtb3Rlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudXJsUmVtb3Rlc0NhY2hlID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQocmVtb3RlcykpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIHJlbW90ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsUmVtb3Rlc0NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUmVtb3RlTW9kdWxlKFxuICAgIHJlbW90ZUVudHJ5VXJsOiBzdHJpbmcsXG4gICAgcmVtb3RlQ29udGV4dFBhdGg6IHN0cmluZyxcbiAgICBleHBvc2VkTW9kdWxlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZmFjdG9yeTogRmFjdG9yeSB9PiB7XG4gICAgaWYgKCF0aGlzLnJlbW90ZVNjcmlwdFNldC5oYXMocmVtb3RlRW50cnlVcmwpKSB7XG4gICAgICB0aGlzLnJlbW90ZVNjcmlwdFNldC5hZGQocmVtb3RlRW50cnlVcmwpO1xuICAgICAgYXdhaXQgdGhpcy5sb2FkUmVtb3RlRW50cnkocmVtb3RlRW50cnlVcmwpO1xuICAgIH1cbiAgICBsZXQgY29udGV4dFBhdGg6IHN0cmluZyA9IHJlbW90ZUNvbnRleHRQYXRoO1xuICAgIGlmIChjb250ZXh0UGF0aC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IHJlbW90ZUNvbnRleHRQYXRoLnNwbGl0KCdAJylbMF07XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvb2t1cEV4cG9zZWRNb2R1bGUoY2FtZWxDYXNlKGNvbnRleHRQYXRoKSwgZXhwb3NlZE1vZHVsZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRSZW1vdGVFbnRyeShyZW1vdGVFbnRyeVVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0LnNyYyA9IHJlbW90ZUVudHJ5VXJsO1xuXG4gICAgICBzY3JpcHQub25lcnJvciA9IHJlamVjdDtcblxuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpOyAvLyB3aW5kb3cgaXMgdGhlIGdsb2JhbCBuYW1lc3BhY2VcbiAgICAgIH07XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvb2t1cEV4cG9zZWRNb2R1bGUoXG4gICAgcmVtb3RlTmFtZTogc3RyaW5nLFxuICAgIGV4cG9zZWRNb2R1bGU6IHN0cmluZ1xuICApOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBmYWN0b3J5OiBGYWN0b3J5IH0+IHtcbiAgICAvLyBJbml0aWFsaXplcyB0aGUgc2hhcmUgc2NvcGUuIFRoaXMgZmlsbHMgaXQgd2l0aCBrbm93biBwcm92aWRlZCBtb2R1bGVzIGZyb20gdGhpcyBidWlsZCBhbmQgYWxsIHJlbW90ZXNcbiAgICB0cnkge1xuICAgICAgYXdhaXQgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fKCdkZWZhdWx0Jyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBNb2R1bGUgJXMgY291bGQgbm90IGJlIGxvYWRlZC4gTW9kdWxlIEZlZGVyYXRpb24gaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi5gLFxuICAgICAgICBleHBvc2VkTW9kdWxlLFxuICAgICAgICBleFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IGNvbnRhaW5lcjogQ29udGFpbmVyID0gd2luZG93W3JlbW90ZU5hbWVdO1xuXG4gICAgLyoqXG4gICAgICogTVRNLTYwODUwOiBJbiBjYXNlIG9mIGUuZy4gdGhlIGNvY2twaXQgYXBwIGJlaW5nIGNsb25lZCB0byBhIGRpZmZlcmVudCBjb250ZXh0IHBhdGhcbiAgICAgKiB0aGUgc2VsZiBzY29wZWQgcGx1Z2lucyBvZiBjb2NrcGl0IHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIG5ldyBjb250ZXh0IHBhdGguXG4gICAgICogQnV0IHRoZSByZW1vdGVFbnRyeS5qcyB3aWxsIHN0aWxsIHJlZ2lzdGVyIHRoZSByZW1vdGVzIHdpdGggdGhlIG9yaWdpbmFsIGNvbnRleHQgcGF0aCxcbiAgICAgKiBhcyB0aGlzIGlzIGhhcmRjb2RlZCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogV2UgdGhlcmVmb3JlIGFkZCBhIGZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IHBhdGggaW4gY2FzZSB0aGVyZSBpcyBubyBjb250YWluZXIgZm9yIHRoZSByZW1vdGVOYW1lXG4gICAgICovXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrUmVtb3RlTmFtZTogc3RyaW5nID0gY2FtZWxDYXNlKF9fT1JJR0lOQUxfQ09OVEVYVF9QQVRIX18pO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgQXR0cmlidXRlIFwiJXNcIiBub3QgZGVmaW5lZCBvbiB3aW5kb3cgb2JqZWN0IHdoaWxlIHRyeWluZyB0byBsb2FkIFwiJXNcIi4gVXNpbmcgXCIlc1wiIGFzIGZhbGxiYWNrLmAsXG4gICAgICAgIHJlbW90ZU5hbWUsXG4gICAgICAgIGV4cG9zZWRNb2R1bGUsXG4gICAgICAgIGZhbGxiYWNrUmVtb3RlTmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnRhaW5lciA9IHdpbmRvd1tmYWxsYmFja1JlbW90ZU5hbWVdO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRhaW5lciwgaXQgbWF5IHByb3ZpZGUgc2hhcmVkIG1vZHVsZXNcbiAgICBsZXQgZmFjdG9yeTogRmFjdG9yeTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyLmluaXQoX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fLmRlZmF1bHQpO1xuICAgICAgZmFjdG9yeSA9IChhd2FpdCBjb250YWluZXIuZ2V0KGV4cG9zZWRNb2R1bGUpKSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBNb2R1bGUgJXMgY291bGQgbm90IGJlIGxvYWRlZC5gLCBleHBvc2VkTW9kdWxlLCBleCk7XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IGV4cG9zZWRNb2R1bGUsIGZhY3RvcnkgfTtcbiAgfVxufVxuIl19