@igo2/geo 18.0.0-next.1 → 18.0.0-next.11

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 (443) hide show
  1. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +4 -4
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +7 -9
  3. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +16 -13
  4. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +5 -5
  5. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +4 -4
  6. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +4 -4
  7. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +4 -4
  8. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +5 -5
  9. package/esm2022/lib/catalog/catalog.module.mjs +5 -5
  10. package/esm2022/lib/catalog/shared/catalog.enum.mjs +1 -1
  11. package/esm2022/lib/catalog/shared/catalog.service.mjs +4 -4
  12. package/esm2022/lib/datasource/shared/capabilities.service.mjs +4 -4
  13. package/esm2022/lib/datasource/shared/datasource.service.mjs +4 -4
  14. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
  15. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +9 -1
  16. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
  17. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +8 -1
  18. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
  19. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +8 -1
  20. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
  21. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +8 -1
  22. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
  23. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +8 -1
  24. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  25. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +8 -1
  26. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
  27. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +4 -1
  28. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
  29. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +1 -1
  30. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
  31. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +8 -1
  32. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  33. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +1 -1
  34. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +1 -1
  35. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  36. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +73 -2
  37. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +4 -4
  38. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  39. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +8 -1
  40. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +7 -5
  41. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  42. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +1 -1
  43. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  44. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +1 -1
  45. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +4 -4
  46. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +153 -104
  47. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +179 -85
  48. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +95 -46
  49. package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
  50. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +4 -4
  51. package/esm2022/lib/directions/directions.component.mjs +57 -33
  52. package/esm2022/lib/directions/directions.module.mjs +5 -5
  53. package/esm2022/lib/directions/shared/directions.enum.mjs +51 -7
  54. package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
  55. package/esm2022/lib/directions/shared/directions.service.mjs +125 -99
  56. package/esm2022/lib/directions/shared/directions.utils.mjs +281 -318
  57. package/esm2022/lib/directions/shared/store.mjs +2 -2
  58. package/esm2022/lib/download/download-button/download-button.component.mjs +10 -22
  59. package/esm2022/lib/download/download.module.mjs +5 -5
  60. package/esm2022/lib/download/shared/download.service.mjs +4 -4
  61. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +4 -4
  62. package/esm2022/lib/draw/draw/draw-popup.component.mjs +4 -4
  63. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +4 -4
  64. package/esm2022/lib/draw/draw/draw.component.mjs +8 -15
  65. package/esm2022/lib/draw/draw/draw.module.mjs +5 -5
  66. package/esm2022/lib/draw/drawingTool.module.mjs +5 -5
  67. package/esm2022/lib/draw/shared/draw-icon.service.mjs +4 -4
  68. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  69. package/esm2022/lib/environment/environment.interface.mjs +1 -1
  70. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +5 -5
  71. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +4 -4
  72. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +5 -5
  73. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +4 -4
  74. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +5 -5
  75. package/esm2022/lib/feature/feature.module.mjs +5 -5
  76. package/esm2022/lib/feature/shared/feature-store.utils.mjs +7 -6
  77. package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
  78. package/esm2022/lib/feature/shared/store.mjs +1 -1
  79. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +3 -3
  80. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +7 -4
  81. package/esm2022/lib/feature/shared/strategies/selection.mjs +5 -4
  82. package/esm2022/lib/filter/filter.module.mjs +5 -5
  83. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +6 -6
  84. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +4 -4
  85. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +4 -4
  86. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +4 -4
  87. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +4 -4
  88. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +4 -4
  89. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +5 -5
  90. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +8 -6
  91. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +4 -4
  92. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +11 -4
  93. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +4 -4
  94. package/esm2022/lib/filter/shared/ogc-filter.mjs +7 -2
  95. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +4 -4
  96. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +4 -4
  97. package/esm2022/lib/filter/shared/time-filter.service.mjs +4 -4
  98. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +4 -4
  99. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +5 -11
  100. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +5 -11
  101. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +5 -5
  102. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +15 -12
  103. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +5 -5
  104. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +7 -5
  105. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +7 -18
  106. package/esm2022/lib/geo.module.mjs +5 -5
  107. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +4 -4
  108. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +4 -4
  109. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +5 -5
  110. package/esm2022/lib/geometry/geometry.module.mjs +5 -5
  111. package/esm2022/lib/import-export/export-button/export-button.component.mjs +7 -20
  112. package/esm2022/lib/import-export/import-export/import-export.component.mjs +215 -323
  113. package/esm2022/lib/import-export/import-export.module.mjs +5 -5
  114. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +4 -4
  115. package/esm2022/lib/import-export/shared/export.interface.mjs +1 -1
  116. package/esm2022/lib/import-export/shared/export.service.mjs +257 -91
  117. package/esm2022/lib/import-export/shared/export.type.mjs +9 -9
  118. package/esm2022/lib/import-export/shared/export.utils.mjs +5 -1
  119. package/esm2022/lib/import-export/shared/import.service.mjs +4 -4
  120. package/esm2022/lib/import-export/shared/import.utils.mjs +3 -3
  121. package/esm2022/lib/layer/index.mjs +10 -5
  122. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  123. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  124. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +62 -129
  125. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +7 -10
  126. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +4 -4
  127. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +8 -9
  128. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +16 -23
  129. package/esm2022/lib/layer/layer-list/index.mjs +1 -3
  130. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +177 -776
  131. package/esm2022/lib/layer/layer-list-tool/index.mjs +1 -2
  132. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +52 -85
  133. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -2
  134. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +57 -17
  135. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  136. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  137. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  138. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +25 -0
  139. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  140. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  141. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  142. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  143. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  144. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  145. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  146. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  147. package/esm2022/lib/layer/layer.module.mjs +54 -36
  148. package/esm2022/lib/layer/shared/index.mjs +2 -1
  149. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  150. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  151. package/esm2022/lib/layer/shared/layer.service.mjs +73 -27
  152. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  153. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  154. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  155. package/esm2022/lib/layer/shared/layers/image-layer.mjs +8 -3
  156. package/esm2022/lib/layer/shared/layers/index.mjs +6 -1
  157. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  158. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  159. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  160. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -11
  161. package/esm2022/lib/layer/shared/layers/layer.mjs +114 -118
  162. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  163. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  164. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  165. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  166. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +8 -3
  167. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +22 -19
  168. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +8 -3
  169. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +4 -4
  170. package/esm2022/lib/layer/utils/layer.utils.mjs +47 -1
  171. package/esm2022/lib/layer/utils/outputLegend.mjs +5 -1
  172. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +6 -6
  173. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +11 -9
  174. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +4 -4
  175. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +4 -4
  176. package/esm2022/lib/map/info-section/info-section.component.mjs +4 -4
  177. package/esm2022/lib/map/map-browser/map-browser.component.mjs +4 -4
  178. package/esm2022/lib/map/map-center/map-center.component.mjs +4 -4
  179. package/esm2022/lib/map/map.module.mjs +5 -5
  180. package/esm2022/lib/map/menu-button/menu-button.component.mjs +4 -4
  181. package/esm2022/lib/map/offline-button/offline-button.component.mjs +4 -4
  182. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +4 -4
  183. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  184. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  185. package/esm2022/lib/map/shared/hover-feature.directive.mjs +5 -13
  186. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +113 -123
  187. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +4 -4
  188. package/esm2022/lib/map/shared/map.abstract.mjs +4 -3
  189. package/esm2022/lib/map/shared/map.mjs +7 -243
  190. package/esm2022/lib/map/shared/map.service.mjs +4 -4
  191. package/esm2022/lib/map/shared/map.utils.mjs +3 -3
  192. package/esm2022/lib/map/shared/mapOffline.directive.mjs +12 -8
  193. package/esm2022/lib/map/shared/projection.service.mjs +4 -4
  194. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +4 -4
  195. package/esm2022/lib/map/utils/index.mjs +2 -0
  196. package/esm2022/lib/map/utils/layer-watcher.mjs +45 -13
  197. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +4 -5
  198. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +4 -4
  199. package/esm2022/lib/measure/measure.module.mjs +5 -5
  200. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +4 -4
  201. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +4 -4
  202. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +4 -4
  203. package/esm2022/lib/measure/measurer/measurer.component.mjs +10 -28
  204. package/esm2022/lib/measure/measurer/measurer.module.mjs +5 -5
  205. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +11 -23
  206. package/esm2022/lib/metadata/metadata.module.mjs +5 -5
  207. package/esm2022/lib/metadata/shared/metadata.service.mjs +4 -4
  208. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +5 -8
  209. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +21 -22
  210. package/esm2022/lib/offline/index.mjs +3 -1
  211. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +16 -17
  212. package/esm2022/lib/offline/offline.interface.mjs +2 -0
  213. package/esm2022/lib/offline/offline.provider.mjs +51 -0
  214. package/esm2022/lib/offline/shared/geo-network.service.mjs +15 -16
  215. package/esm2022/lib/overlay/shared/overlay.mjs +3 -2
  216. package/esm2022/lib/print/print/print.component.mjs +4 -4
  217. package/esm2022/lib/print/print-form/print-form.component.mjs +4 -4
  218. package/esm2022/lib/print/print.module.mjs +5 -5
  219. package/esm2022/lib/print/shared/print.service.mjs +6 -6
  220. package/esm2022/lib/query/query.module.mjs +5 -5
  221. package/esm2022/lib/query/shared/query-search-source.mjs +4 -4
  222. package/esm2022/lib/query/shared/query.directive.mjs +12 -8
  223. package/esm2022/lib/query/shared/query.service.mjs +10 -10
  224. package/esm2022/lib/query/shared/query.utils.mjs +5 -1
  225. package/esm2022/lib/search/search-bar/search-bar.component.mjs +4 -4
  226. package/esm2022/lib/search/search-bar/search-bar.module.mjs +5 -5
  227. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +4 -4
  228. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +18 -12
  229. package/esm2022/lib/search/search-results/search-results-item.component.mjs +4 -4
  230. package/esm2022/lib/search/search-results/search-results.component.mjs +4 -4
  231. package/esm2022/lib/search/search-results/search-results.module.mjs +5 -5
  232. package/esm2022/lib/search/search-selector/search-selector.component.mjs +4 -4
  233. package/esm2022/lib/search/search-selector/search-selector.module.mjs +5 -5
  234. package/esm2022/lib/search/search-settings/search-settings.component.mjs +4 -4
  235. package/esm2022/lib/search/search-settings/search-settings.module.mjs +5 -5
  236. package/esm2022/lib/search/search.module.mjs +5 -5
  237. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +5 -14
  238. package/esm2022/lib/search/shared/search.service.mjs +4 -4
  239. package/esm2022/lib/search/shared/sources/cadastre.mjs +4 -4
  240. package/esm2022/lib/search/shared/sources/coordinates.mjs +7 -7
  241. package/esm2022/lib/search/shared/sources/icherche.mjs +10 -10
  242. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
  243. package/esm2022/lib/search/shared/sources/ilayer.mjs +7 -7
  244. package/esm2022/lib/search/shared/sources/nominatim.mjs +4 -4
  245. package/esm2022/lib/search/shared/sources/storedqueries.mjs +7 -7
  246. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
  247. package/esm2022/lib/search/shared/sources/workspace.mjs +4 -4
  248. package/esm2022/lib/style/style-list/style-list.module.mjs +5 -5
  249. package/esm2022/lib/style/style-list/style-list.service.mjs +4 -4
  250. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +4 -4
  251. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +4 -4
  252. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +4 -4
  253. package/esm2022/lib/style/style-service/draw-style.service.mjs +4 -4
  254. package/esm2022/lib/style/style-service/style.service.mjs +4 -4
  255. package/esm2022/lib/style/style.module.mjs +5 -5
  256. package/esm2022/lib/toast/toast.component.mjs +4 -4
  257. package/esm2022/lib/toast/toast.module.mjs +5 -5
  258. package/esm2022/lib/utils/id-generator.mjs +1 -1
  259. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +4 -4
  260. package/esm2022/lib/wkt/shared/wkt.service.mjs +4 -4
  261. package/esm2022/lib/wkt/wkt.module.mjs +5 -5
  262. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +4 -4
  263. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +5 -5
  264. package/esm2022/lib/workspace/shared/edition-workspace.mjs +6 -4
  265. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +22 -20
  266. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +4 -4
  267. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +20 -5
  268. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +25 -7
  269. package/esm2022/lib/workspace/shared/workspace.utils.mjs +6 -3
  270. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +5 -5
  271. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +5 -5
  272. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +9 -5
  273. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +5 -5
  274. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +7 -6
  275. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +5 -5
  276. package/esm2022/lib/workspace/workspace.module.mjs +5 -5
  277. package/fesm2022/igo2-geo.mjs +19538 -18321
  278. package/fesm2022/igo2-geo.mjs.map +1 -1
  279. package/lib/catalog/shared/catalog.enum.d.ts +1 -3
  280. package/lib/datasource/shared/capabilities.service.d.ts +7 -2
  281. package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +1 -0
  282. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +1 -0
  283. package/lib/datasource/shared/datasources/carto-datasource.d.ts +1 -0
  284. package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +0 -2
  285. package/lib/datasource/shared/datasources/cluster-datasource.d.ts +1 -0
  286. package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +0 -1
  287. package/lib/datasource/shared/datasources/datasource.d.ts +1 -0
  288. package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -2
  289. package/lib/datasource/shared/datasources/feature-datasource.d.ts +1 -0
  290. package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +0 -3
  291. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +1 -0
  292. package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +0 -2
  293. package/lib/datasource/shared/datasources/mvt-datasource.d.ts +1 -0
  294. package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +0 -2
  295. package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +0 -2
  296. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +1 -0
  297. package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +0 -2
  298. package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +0 -2
  299. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +16 -0
  300. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +3 -4
  301. package/lib/datasource/shared/datasources/wms-datasource.d.ts +1 -0
  302. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +7 -7
  303. package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +0 -2
  304. package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +0 -2
  305. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
  306. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
  307. package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
  308. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  309. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  310. package/lib/directions/directions.component.d.ts +5 -5
  311. package/lib/directions/shared/directions.enum.d.ts +42 -1
  312. package/lib/directions/shared/directions.interface.d.ts +50 -25
  313. package/lib/directions/shared/directions.service.d.ts +46 -8
  314. package/lib/directions/shared/directions.utils.d.ts +102 -23
  315. package/lib/directions/shared/store.d.ts +3 -3
  316. package/lib/download/download-button/download-button.component.d.ts +4 -8
  317. package/lib/download/shared/download.service.d.ts +1 -1
  318. package/lib/draw/draw/draw.component.d.ts +2 -2
  319. package/lib/draw/shared/draw.utils.d.ts +2 -1
  320. package/lib/environment/environment.interface.d.ts +2 -0
  321. package/lib/feature/shared/feature-store.utils.d.ts +2 -2
  322. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  323. package/lib/feature/shared/store.d.ts +2 -2
  324. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  325. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  326. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
  327. package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
  328. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
  329. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
  330. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
  331. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  332. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
  333. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  334. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
  335. package/lib/import-export/export-button/export-button.component.d.ts +3 -7
  336. package/lib/import-export/import-export/import-export.component.d.ts +23 -16
  337. package/lib/import-export/shared/export.interface.d.ts +10 -3
  338. package/lib/import-export/shared/export.service.d.ts +28 -15
  339. package/lib/import-export/shared/export.type.d.ts +8 -16
  340. package/lib/import-export/shared/export.utils.d.ts +2 -0
  341. package/lib/layer/index.d.ts +9 -4
  342. package/lib/layer/layer-group/index.d.ts +1 -0
  343. package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
  344. package/lib/layer/layer-item/layer-item.component.d.ts +19 -38
  345. package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
  346. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
  347. package/lib/layer/layer-list/index.d.ts +0 -2
  348. package/lib/layer/layer-list/layer-list.component.d.ts +51 -123
  349. package/lib/layer/layer-list-tool/index.d.ts +0 -1
  350. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
  351. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
  352. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
  353. package/lib/layer/layer-search/index.d.ts +1 -0
  354. package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
  355. package/lib/layer/layer-unavailable/index.d.ts +2 -0
  356. package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
  357. package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
  358. package/lib/layer/layer-viewer/index.d.ts +2 -0
  359. package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
  360. package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
  361. package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
  362. package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
  363. package/lib/layer/layer-visibility-button/index.d.ts +1 -0
  364. package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
  365. package/lib/layer/layer.module.d.ts +18 -6
  366. package/lib/layer/shared/index.d.ts +1 -0
  367. package/lib/layer/shared/layer-controller.d.ts +81 -0
  368. package/lib/layer/shared/layer-selection.d.ts +14 -0
  369. package/lib/layer/shared/layer.service.d.ts +17 -8
  370. package/lib/layer/shared/layers/any-layer.d.ts +3 -6
  371. package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
  372. package/lib/layer/shared/layers/image-layer.d.ts +5 -2
  373. package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
  374. package/lib/layer/shared/layers/index.d.ts +5 -0
  375. package/lib/layer/shared/layers/layer-base.d.ts +75 -0
  376. package/lib/layer/shared/layers/layer-group.d.ts +32 -0
  377. package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
  378. package/lib/layer/shared/layers/layer.d.ts +28 -49
  379. package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
  380. package/lib/layer/shared/layers/linked/index.d.ts +3 -0
  381. package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
  382. package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
  383. package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
  384. package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
  385. package/lib/layer/shared/layers/vector-layer.d.ts +8 -7
  386. package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
  387. package/lib/layer/utils/layer.utils.d.ts +12 -2
  388. package/lib/layer/utils/outputLegend.d.ts +2 -2
  389. package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
  390. package/lib/map/shared/hover-feature.directive.d.ts +0 -1
  391. package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
  392. package/lib/map/shared/map.abstract.d.ts +12 -29
  393. package/lib/map/shared/map.d.ts +10 -85
  394. package/lib/map/shared/map.service.d.ts +1 -1
  395. package/lib/map/shared/map.utils.d.ts +5 -3
  396. package/lib/map/utils/index.d.ts +1 -0
  397. package/lib/map/utils/layer-watcher.d.ts +18 -8
  398. package/lib/measure/measurer/measurer.component.d.ts +0 -8
  399. package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
  400. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  401. package/lib/offline/index.d.ts +2 -0
  402. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  403. package/lib/offline/offline.interface.d.ts +3 -0
  404. package/lib/offline/offline.provider.d.ts +3 -0
  405. package/lib/offline/shared/geo-network.service.d.ts +3 -3
  406. package/lib/overlay/shared/overlay.d.ts +2 -1
  407. package/lib/query/shared/query.service.d.ts +1 -1
  408. package/lib/query/shared/query.utils.d.ts +2 -1
  409. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  410. package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
  411. package/lib/search/shared/sources/cadastre.providers.d.ts +1 -1
  412. package/lib/search/shared/sources/coordinates.providers.d.ts +1 -1
  413. package/lib/search/shared/sources/icherche.providers.d.ts +1 -1
  414. package/lib/search/shared/sources/ilayer.interfaces.d.ts +1 -1
  415. package/lib/search/shared/sources/ilayer.providers.d.ts +1 -1
  416. package/lib/search/shared/sources/nominatim.providers.d.ts +1 -1
  417. package/lib/search/shared/sources/storedqueries.providers.d.ts +2 -2
  418. package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
  419. package/lib/search/shared/sources/workspace.providers.d.ts +1 -1
  420. package/lib/utils/id-generator.d.ts +5 -5
  421. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  422. package/locale/en.geo.json +114 -92
  423. package/locale/fr.geo.json +113 -92
  424. package/package.json +6 -7
  425. package/src/_index.scss +2 -1
  426. package/src/geo-theme.scss +1 -1
  427. package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
  428. package/src/lib/directions/directions.theming.scss +2 -0
  429. package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
  430. package/src/lib/layer/layer-item/layer-item.theme.scss +12 -9
  431. package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
  432. package/src/lib/layer/layer-list/layer-list.theme.scss +50 -0
  433. package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
  434. package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
  435. package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
  436. package/src/lib/layer/layer.theming.scss +14 -3
  437. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
  438. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
  439. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
  440. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
  441. package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
  442. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
  443. package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
@@ -1,86 +1,28 @@
1
- import { BehaviorSubject, combineLatest } from 'rxjs';
2
- import { map } from 'rxjs/operators';
3
- import { getResolutionFromScale } from '../../../map/shared/map.utils';
4
- export class Layer {
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { isLayerLinked, isLinkMaster } from '../../shared/layers/linked/linked-layer.utils';
3
+ import { isLayerItem, isSaveableLayer } from '../../utils/layer.utils';
4
+ import { LayerBase } from './layer-base';
5
+ import { Linked } from './linked/linked-layer';
6
+ export class Layer extends LayerBase {
5
7
  options;
6
8
  messageService;
7
9
  authInterceptor;
8
- geoDBService;
9
- layerDBService;
10
- collapsed;
11
- dataSource;
12
- legend;
13
- legendCollapsed = true;
14
- firstLoadComponent = true;
15
- map;
10
+ parent;
16
11
  ol;
17
- olLoadingProblem = false;
18
- status$;
19
12
  hasBeenVisible$ = new BehaviorSubject(undefined);
20
- hasBeenVisible$$;
13
+ legend;
14
+ legendCollapsed = true;
15
+ link;
16
+ linkMaster;
21
17
  resolution$$;
22
- /**
23
- * Define if a layer is generated by code OR defined by layer/context user layer.
24
- * Useful for filtering layers list in mapOffline.directive or in the sharemap...
25
- * return false by default.
26
- */
27
- get isIgoInternalLayer() {
28
- return this.options.isIgoInternalLayer || false;
29
- }
30
18
  get id() {
31
- return this.options.id || this.dataSource.id;
32
- }
33
- get alias() {
34
- return this.options.alias;
35
- }
36
- get title() {
37
- return this.options.title;
38
- }
39
- set title(title) {
40
- this.options.title = title;
41
- }
42
- get zIndex() {
43
- return this.ol.getZIndex();
44
- }
45
- set zIndex(zIndex) {
46
- this.ol.setZIndex(zIndex);
47
- }
48
- get baseLayer() {
49
- return this.options.baseLayer;
50
- }
51
- set baseLayer(baseLayer) {
52
- this.options.baseLayer = baseLayer;
53
- }
54
- get opacity() {
55
- return this.ol.get('opacity');
56
- }
57
- set opacity(opacity) {
58
- this.ol.setOpacity(opacity);
59
- }
60
- set isInResolutionsRange(value) {
61
- this.isInResolutionsRange$.next(value);
19
+ return String(this.options.id || this.dataSource.id);
62
20
  }
63
- get isInResolutionsRange() {
64
- return this.isInResolutionsRange$.value;
65
- }
66
- isInResolutionsRange$ = new BehaviorSubject(false);
67
- set maxResolution(value) {
68
- this.ol.setMaxResolution(value === 0 ? 0 : value || Infinity);
69
- this.updateInResolutionsRange();
70
- }
71
- get maxResolution() {
72
- return this.ol.getMaxResolution();
73
- }
74
- set minResolution(value) {
75
- this.ol.setMinResolution(value || 0);
76
- this.updateInResolutionsRange();
77
- }
78
- get minResolution() {
79
- return this.ol.getMinResolution();
21
+ get visible() {
22
+ return super.visible;
80
23
  }
81
24
  set visible(value) {
82
- this.ol.setVisible(value);
83
- this.visible$.next(value);
25
+ super.visible = value;
84
26
  if (!this.hasBeenVisible$.value && value) {
85
27
  this.hasBeenVisible$.next(value);
86
28
  }
@@ -90,67 +32,121 @@ export class Layer {
90
32
  .map((message) => this.showMessage(message));
91
33
  }
92
34
  }
93
- get visible() {
94
- return this.visible$.value;
35
+ get maxResolution() {
36
+ return super.maxResolution;
37
+ }
38
+ set maxResolution(value) {
39
+ super.maxResolution = value;
40
+ this.updateInResolutionsRange();
41
+ }
42
+ get minResolution() {
43
+ return super.minResolution;
95
44
  }
96
- visible$ = new BehaviorSubject(undefined);
97
- get displayed() {
98
- return this.visible && this.isInResolutionsRange;
45
+ set minResolution(value) {
46
+ super.minResolution = value;
47
+ this.updateInResolutionsRange();
99
48
  }
100
- displayed$ = combineLatest([
101
- this.isInResolutionsRange$,
102
- this.visible$
103
- ]).pipe(map((bunch) => bunch[0] && bunch[1]));
104
- get showInLayerList() {
105
- return this.options.showInLayerList !== false;
49
+ get saveableOptions() {
50
+ if (!isSaveableLayer(this)) {
51
+ return undefined;
52
+ }
53
+ return {
54
+ ...super.saveableOptions,
55
+ sourceOptions: this.dataSource.saveableOptions
56
+ };
106
57
  }
107
- constructor(options, messageService, authInterceptor, geoDBService, layerDBService) {
58
+ constructor(options, messageService, authInterceptor) {
59
+ super(options);
108
60
  this.options = options;
109
61
  this.messageService = messageService;
110
62
  this.authInterceptor = authInterceptor;
111
- this.geoDBService = geoDBService;
112
- this.layerDBService = layerDBService;
113
63
  this.dataSource = options.source;
114
- this.ol = this.createOlLayer();
115
- if (options.zIndex !== undefined) {
116
- this.zIndex = options.zIndex;
117
- }
118
- if (options.baseLayer && options.visible === undefined) {
119
- options.visible = false;
120
- }
121
- this.maxResolution =
122
- options.maxResolution ||
123
- getResolutionFromScale(Number(options.maxScaleDenom));
124
- this.minResolution =
125
- options.minResolution ||
126
- getResolutionFromScale(Number(options.minScaleDenom));
127
- this.visible = options.visible === undefined ? true : options.visible;
128
- this.opacity = options.opacity === undefined ? 1 : options.opacity;
129
- if (options.legendOptions &&
130
- (options.legendOptions.url || options.legendOptions.html)) {
131
- this.legend = this.dataSource.setLegend(options.legendOptions);
132
- }
133
64
  this.legendCollapsed = options.legendOptions
134
65
  ? options.legendOptions.collapsed
135
66
  ? options.legendOptions.collapsed
136
67
  : true
137
68
  : true;
69
+ if (options.legendOptions &&
70
+ (options.legendOptions.url || options.legendOptions.html)) {
71
+ this.legend = this.dataSource.setLegend(options.legendOptions);
72
+ }
73
+ this.ol = this.createOlLayer();
138
74
  this.ol.set('_layer', this, true);
75
+ super.afterCreated();
76
+ }
77
+ init(map) {
78
+ super.init(map);
79
+ map.layerWatcher.watchLayer(this);
80
+ this.observeResolution();
81
+ this.hasBeenVisible$.subscribe(() => {
82
+ if (this.options.messages && this.visible) {
83
+ this.options.messages.map((message) => {
84
+ this.showMessage(message);
85
+ });
86
+ }
87
+ });
88
+ this.createLink();
89
+ }
90
+ createLink() {
91
+ if (!isLinkMaster(this) || this.link) {
92
+ return;
93
+ }
94
+ this.link = new Linked(this);
139
95
  }
140
- setMap(map) {
141
- this.map = map;
96
+ remove() {
97
+ super.remove();
142
98
  this.unobserveResolution();
143
- if (map !== undefined) {
144
- this.observeResolution();
145
- this.hasBeenVisible$$ = this.hasBeenVisible$.subscribe(() => {
146
- if (this.options.messages && this.visible) {
147
- this.options.messages.map((message) => {
148
- this.showMessage(message);
149
- });
150
- }
151
- });
99
+ this.map.layerWatcher.unwatchLayer(this);
100
+ if (isLinkMaster(this)) {
101
+ this.link?.deleteChildren(this.map.layerController);
102
+ this.link?.destroy();
103
+ }
104
+ if (isLayerLinked(this)) {
105
+ if (!this.linkMaster) {
106
+ return;
107
+ }
108
+ const masterLayer = this.linkMaster.layer;
109
+ const hasSync = this.linkMaster.hasSyncDeletion(this);
110
+ this.linkMaster.remove(this);
111
+ if (hasSync && masterLayer) {
112
+ this.map.layerController.remove(masterLayer);
113
+ }
152
114
  }
153
115
  }
116
+ add(parent) {
117
+ super.add(parent);
118
+ if (isLayerLinked(this)) {
119
+ if (isLinkMaster(this)) {
120
+ this.link.init();
121
+ }
122
+ this.createLinkWithParent();
123
+ }
124
+ }
125
+ moveTo(parent) {
126
+ super.moveTo(parent);
127
+ if (isLayerLinked(this)) {
128
+ this.link?.move(this, parent);
129
+ this.linkMaster?.move(this, parent);
130
+ }
131
+ }
132
+ createLinkWithParent() {
133
+ const masterLayer = this.findParentByLinkId(this.map.layerController.all, this.options.linkedLayers.linkId);
134
+ if (masterLayer) {
135
+ this.linkMaster = masterLayer.link;
136
+ masterLayer?.link.add(this);
137
+ }
138
+ }
139
+ findParentByLinkId(layers, id) {
140
+ return layers.find((layer) => {
141
+ if (!isLayerItem(layer)) {
142
+ return;
143
+ }
144
+ if (layer.options.linkedLayers?.links) {
145
+ return layer.options.linkedLayers.links.some((l) => l.linkedIds.includes(id));
146
+ }
147
+ return false;
148
+ });
149
+ }
154
150
  showMessage(message) {
155
151
  if (!this.messageService) {
156
152
  return;
@@ -179,4 +175,4 @@ export class Layer {
179
175
  }
180
176
  }
181
177
  }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9zaGFyZWQvbGF5ZXJzL2xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFDTCxlQUFlLEVBSWYsYUFBYSxFQUNkLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3JDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBS3ZFLE1BQU0sT0FBZ0IsS0FBSztJQXFIaEI7SUFDRztJQUNBO0lBQ0E7SUFDSDtJQXhIRixTQUFTLENBQVU7SUFDbkIsVUFBVSxDQUFhO0lBQ3ZCLE1BQU0sQ0FBVztJQUNqQixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUMxQixHQUFHLENBQVU7SUFDYixFQUFFLENBQW9CO0lBQ3RCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixPQUFPLENBQXlCO0lBQ2hDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxTQUFTLENBQUMsQ0FBQztJQUN6RCxnQkFBZ0IsQ0FBZTtJQUMvQixZQUFZLENBQWU7SUFFbkM7Ozs7T0FJRztJQUNILElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FB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UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekMsTUFBTSxhQUFhLEdBQ2pCLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDbkUsSUFBSSxDQUFDLG9CQUFvQjtnQkFDdkIsVUFBVSxJQUFJLGFBQWEsSUFBSSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSAnQGlnbzIvYXV0aCc7XG5pbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5pbXBvcnQgeyBTdWJqZWN0U3RhdHVzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgb2xMYXllciBmcm9tICdvbC9sYXllci9MYXllcic7XG5pbXBvcnQgb2xTb3VyY2UgZnJvbSAnb2wvc291cmNlL1NvdXJjZSc7XG5cbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBjb21iaW5lTGF0ZXN0XG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi8uLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9kYXRhc291cmNlLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE1hcEJhc2UgfSBmcm9tICcuLi8uLi8uLi9tYXAvc2hhcmVkL21hcC5hYnN0cmFjdCc7XG5pbXBvcnQgeyBnZXRSZXNvbHV0aW9uRnJvbVNjYWxlIH0gZnJvbSAnLi4vLi4vLi4vbWFwL3NoYXJlZC9tYXAudXRpbHMnO1xuaW1wb3J0IHsgR2VvREJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vb2ZmbGluZS9nZW9EQi9nZW9EQi5zZXJ2aWNlJztcbmltcG9ydCB7IExheWVyREJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vb2ZmbGluZS9sYXllckRCL2xheWVyREIuc2VydmljZSc7XG5pbXBvcnQgeyBMYXllck9wdGlvbnMgfSBmcm9tICcuL2xheWVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXllciB7XG4gIHB1YmxpYyBjb2xsYXBzZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICBwdWJsaWMgbGVnZW5kOiBMZWdlbmRbXTtcbiAgcHVibGljIGxlZ2VuZENvbGxhcHNlZCA9IHRydWU7XG4gIHB1YmxpYyBmaXJzdExvYWRDb21wb25lbnQgPSB0cnVlO1xuICBwdWJsaWMgbWFwOiBNYXBCYXNlO1xuICBwdWJsaWMgb2w6IG9sTGF5ZXI8b2xTb3VyY2U+O1xuICBwdWJsaWMgb2xMb2FkaW5nUHJvYmxlbSA9IGZhbHNlO1xuICBwdWJsaWMgc3RhdHVzJDogU3ViamVjdDxTdWJqZWN0U3RhdHVzPjtcbiAgcHVibGljIGhhc0JlZW5WaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBoYXNCZWVuVmlzaWJsZSQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVzb2x1dGlvbiQkOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIERlZmluZSBpZiBhIGxheWVyIGlzIGdlbmVyYXRlZCBieSBjb2RlIE9SIGRlZmluZWQgYnkgbGF5ZXIvY29udGV4dCB1c2VyIGxheWVyLlxuICAgKiBVc2VmdWwgZm9yIGZpbHRlcmluZyBsYXllcnMgbGlzdCBpbiBtYXBPZmZsaW5lLmRpcmVjdGl2ZSBvciBpbiB0aGUgc2hhcmVtYXAuLi5cbiAgICogcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBnZXQgaXNJZ29JbnRlcm5hbExheWVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaXNJZ29JbnRlcm5hbExheWVyIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pZCB8fCB0aGlzLmRhdGFTb3VyY2UuaWQ7XG4gIH1cblxuICBnZXQgYWxpYXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsaWFzO1xuICB9XG5cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50aXRsZTtcbiAgfVxuXG4gIHNldCB0aXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGl0bGU7XG4gIH1cblxuICBnZXQgekluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub2wuZ2V0WkluZGV4KCk7XG4gIH1cblxuICBzZXQgekluZGV4KHpJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5vbC5zZXRaSW5kZXgoekluZGV4KTtcbiAgfVxuXG4gIGdldCBiYXNlTGF5ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5iYXNlTGF5ZXI7XG4gIH1cblxuICBzZXQgYmFzZUxheWVyKGJhc2VMYXllcjogYm9vbGVhbikge1xuICAgIHRoaXMub3B0aW9ucy5iYXNlTGF5ZXIgPSBiYXNlTGF5ZXI7XG4gIH1cblxuICBnZXQgb3BhY2l0eSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9sLmdldCgnb3BhY2l0eScpO1xuICB9XG5cbiAgc2V0IG9wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgdGhpcy5vbC5zZXRPcGFjaXR5KG9wYWNpdHkpO1xuICB9XG5cbiAgc2V0IGlzSW5SZXNvbHV0aW9uc1JhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0luUmVzb2x1dGlvbnNSYW5nZSQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzSW5SZXNvbHV0aW9uc1JhbmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5SZXNvbHV0aW9uc1JhbmdlJC52YWx1ZTtcbiAgfVxuICByZWFkb25seSBpc0luUmVzb2x1dGlvbnNSYW5nZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBzZXQgbWF4UmVzb2x1dGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vbC5zZXRNYXhSZXNvbHV0aW9uKHZhbHVlID09PSAwID8gMCA6IHZhbHVlIHx8IEluZmluaXR5KTtcbiAgICB0aGlzLnVwZGF0ZUluUmVzb2x1dGlvbnNSYW5nZSgpO1xuICB9XG4gIGdldCBtYXhSZXNvbHV0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub2wuZ2V0TWF4UmVzb2x1dGlvbigpO1xuICB9XG5cbiAgc2V0IG1pblJlc29sdXRpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub2wuc2V0TWluUmVzb2x1dGlvbih2YWx1ZSB8fCAwKTtcbiAgICB0aGlzLnVwZGF0ZUluUmVzb2x1dGlvbnNSYW5nZSgpO1xuICB9XG4gIGdldCBtaW5SZXNvbHV0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub2wuZ2V0TWluUmVzb2x1dGlvbigpO1xuICB9XG5cbiAgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9sLnNldFZpc2libGUodmFsdWUpO1xuICAgIHRoaXMudmlzaWJsZSQubmV4dCh2YWx1ZSk7XG4gICAgaWYgKCF0aGlzLmhhc0JlZW5WaXNpYmxlJC52YWx1ZSAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy5oYXNCZWVuVmlzaWJsZSQubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1lc3NhZ2VzICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLm9wdGlvbnM/Lm1lc3NhZ2VzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IG0ub3B0aW9ucz8uc2hvd09uRWFjaExheWVyVmlzaWJpbGl0eSlcbiAgICAgICAgLm1hcCgobWVzc2FnZSkgPT4gdGhpcy5zaG93TWVzc2FnZShtZXNzYWdlKSk7XG4gICAgfVxuICB9XG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGUkLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IHZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuXG4gIGdldCBkaXNwbGF5ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZSAmJiB0aGlzLmlzSW5SZXNvbHV0aW9uc1JhbmdlO1xuICB9XG4gIHJlYWRvbmx5IGRpc3BsYXllZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlzSW5SZXNvbHV0aW9uc1JhbmdlJCxcbiAgICB0aGlzLnZpc2libGUkXG4gIF0pLnBpcGUobWFwKChidW5jaDogW2Jvb2xlYW4sIGJvb2xlYW5dKSA9PiBidW5jaFswXSAmJiBidW5jaFsxXSkpO1xuXG4gIGdldCBzaG93SW5MYXllckxpc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93SW5MYXllckxpc3QgIT09IGZhbHNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wdGlvbnM6IExheWVyT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZVNlcnZpY2U/OiBNZXNzYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYXV0aEludGVyY2VwdG9yPzogQXV0aEludGVyY2VwdG9yLFxuICAgIHByb3RlY3RlZCBnZW9EQlNlcnZpY2U/OiBHZW9EQlNlcnZpY2UsXG4gICAgcHVibGljIGxheWVyREJTZXJ2aWNlPzogTGF5ZXJEQlNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5kYXRhU291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG5cbiAgICB0aGlzLm9sID0gdGhpcy5jcmVhdGVPbExheWVyKCk7XG4gICAgaWYgKG9wdGlvbnMuekluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuekluZGV4ID0gb3B0aW9ucy56SW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYmFzZUxheWVyICYmIG9wdGlvbnMudmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm1heFJlc29sdXRpb24gPVxuICAgICAgb3B0aW9ucy5tYXhSZXNvbHV0aW9uIHx8XG4gICAgICBnZXRSZXNvbHV0aW9uRnJvbVNjYWxlKE51bWJlcihvcHRpb25zLm1heFNjYWxlRGVub20pKTtcbiAgICB0aGlzLm1pblJlc29sdXRpb24gPVxuICAgICAgb3B0aW9ucy5taW5SZXNvbHV0aW9uIHx8XG4gICAgICBnZXRSZXNvbHV0aW9uRnJvbVNjYWxlKE51bWJlcihvcHRpb25zLm1pblNjYWxlRGVub20pKTtcblxuICAgIHRoaXMudmlzaWJsZSA9IG9wdGlvbnMudmlzaWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMudmlzaWJsZTtcbiAgICB0aGlzLm9wYWNpdHkgPSBvcHRpb25zLm9wYWNpdHkgPT09IHVuZGVmaW5lZCA/IDEgOiBvcHRpb25zLm9wYWNpdHk7XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmxlZ2VuZE9wdGlvbnMgJiZcbiAgICAgIChvcHRpb25zLmxlZ2VuZE9wdGlvbnMudXJsIHx8IG9wdGlvbnMubGVnZW5kT3B0aW9ucy5odG1sKVxuICAgICkge1xuICAgICAgdGhpcy5sZWdlbmQgPSB0aGlzLmRhdGFTb3VyY2Uuc2V0TGVnZW5kKG9wdGlvbnMubGVnZW5kT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5sZWdlbmRDb2xsYXBzZWQgPSBvcHRpb25zLmxlZ2VuZE9wdGlvbnNcbiAgICAgID8gb3B0aW9ucy5sZWdlbmRPcHRpb25zLmNvbGxhcHNlZFxuICAgICAgICA/IG9wdGlvbnMubGVnZW5kT3B0aW9ucy5jb2xsYXBzZWRcbiAgICAgICAgOiB0cnVlXG4gICAgICA6IHRydWU7XG5cbiAgICB0aGlzLm9sLnNldCgnX2xheWVyJywgdGhpcywgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlT2xMYXllcigpOiBvbExheWVyPG9sU291cmNlPjtcblxuICBzZXRNYXAobWFwOiBNYXBCYXNlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5tYXAgPSBtYXA7XG5cbiAgICB0aGlzLnVub2JzZXJ2ZVJlc29sdXRpb24oKTtcbiAgICBpZiAobWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZVJlc29sdXRpb24oKTtcbiAgICAgIHRoaXMuaGFzQmVlblZpc2libGUkJCA9IHRoaXMuaGFzQmVlblZpc2libGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVzc2FnZXMgJiYgdGhpcy52aXNpYmxlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93TWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UubWVzc2FnZShtZXNzYWdlIGFzIE1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlUmVzb2x1dGlvbigpIHtcbiAgICB0aGlzLnJlc29sdXRpb24kJCA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnJlc29sdXRpb24kLnN1YnNjcmliZSgoKSA9PlxuICAgICAgdGhpcy51cGRhdGVJblJlc29sdXRpb25zUmFuZ2UoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVub2JzZXJ2ZVJlc29sdXRpb24oKSB7XG4gICAgaWYgKHRoaXMucmVzb2x1dGlvbiQkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVzb2x1dGlvbiQkLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnJlc29sdXRpb24kJCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluUmVzb2x1dGlvbnNSYW5nZSgpIHtcbiAgICBpZiAodGhpcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKTtcbiAgICAgIGNvbnN0IG1pblJlc29sdXRpb24gPSB0aGlzLm1pblJlc29sdXRpb247XG4gICAgICBjb25zdCBtYXhSZXNvbHV0aW9uID1cbiAgICAgICAgdGhpcy5tYXhSZXNvbHV0aW9uID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IHRoaXMubWF4UmVzb2x1dGlvbjtcbiAgICAgIHRoaXMuaXNJblJlc29sdXRpb25zUmFuZ2UgPVxuICAgICAgICByZXNvbHV0aW9uID49IG1pblJlc29sdXRpb24gJiYgcmVzb2x1dGlvbiA8PSBtYXhSZXNvbHV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzSW5SZXNvbHV0aW9uc1JhbmdlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9zaGFyZWQvbGF5ZXJzL2xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBSXJELE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxFQUNiLE1BQU0sK0NBQStDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLGNBQWMsQ0FBQztBQUd6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsTUFBTSxPQUFnQixLQUFNLFNBQVEsU0FBUztJQTJEbEM7SUFDRztJQUNBO0lBM0RaLE1BQU0sQ0FBYTtJQUVuQixFQUFFLENBQWtCO0lBQ3BCLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxTQUFTLENBQUMsQ0FBQztJQUMxRCxNQUFNLENBQVc7SUFDakIsZUFBZSxHQUFHLElBQUksQ0FBQztJQUN2QixJQUFJLENBQVU7SUFDZCxVQUFVLENBQVU7SUFDWixZQUFZLENBQWU7SUFFbkMsSUFBSSxFQUFFO1FBQ0osT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFjO1FBQ3hCLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QyxJ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QztJQUNILENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekMsTUFBTSxhQUFhLEdBQ2pCLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDbkUsSUFBSSxDQUFDLG9CQUFvQjtnQkFDdkIsVUFBVSxJQUFJLGFBQWEsSUFBSSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQy9ELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSAnQGlnbzIvYXV0aCc7XG5pbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5cbmltcG9ydCBPbExheWVyIGZyb20gJ29sL2xheWVyL0xheWVyJztcbmltcG9ydCB7IFNvdXJjZSB9IGZyb20gJ29sL3NvdXJjZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IERhdGFTb3VyY2UsIExlZ2VuZCB9IGZyb20gJy4uLy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzJztcbmltcG9ydCB0eXBlIHsgTWFwQmFzZSB9IGZyb20gJy4uLy4uLy4uL21hcC9zaGFyZWQvbWFwLmFic3RyYWN0JztcbmltcG9ydCB7XG4gIGlzTGF5ZXJMaW5rZWQsXG4gIGlzTGlua01hc3RlclxufSBmcm9tICcuLi8uLi9zaGFyZWQvbGF5ZXJzL2xpbmtlZC9saW5rZWQtbGF5ZXIudXRpbHMnO1xuaW1wb3J0IHsgaXNMYXllckl0ZW0sIGlzU2F2ZWFibGVMYXllciB9IGZyb20gJy4uLy4uL3V0aWxzL2xheWVyLnV0aWxzJztcbmltcG9ydCB7IEFueUxheWVyIH0gZnJvbSAnLi9hbnktbGF5ZXInO1xuaW1wb3J0IHsgTGF5ZXJCYXNlLCBMYXllckdyb3VwQmFzZSB9IGZyb20gJy4vbGF5ZXItYmFzZSc7XG5pbXBvcnQgeyB0eXBlIExheWVyR3JvdXAgfSBmcm9tICcuL2xheWVyLWdyb3VwJztcbmltcG9ydCB7IHR5cGUgTGF5ZXJPcHRpb25zIH0gZnJvbSAnLi9sYXllci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlua2VkIH0gZnJvbSAnLi9saW5rZWQvbGlua2VkLWxheWVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExheWVyIGV4dGVuZHMgTGF5ZXJCYXNlIHtcbiAgZGVjbGFyZSBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICBwYXJlbnQ6IExheWVyR3JvdXA7XG5cbiAgb2w6IE9sTGF5ZXI8U291cmNlPjtcbiAgaGFzQmVlblZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuICBsZWdlbmQ6IExlZ2VuZFtdO1xuICBsZWdlbmRDb2xsYXBzZWQgPSB0cnVlO1xuICBsaW5rPzogTGlua2VkO1xuICBsaW5rTWFzdGVyPzogTGlua2VkO1xuICBwcml2YXRlIHJlc29sdXRpb24kJDogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5vcHRpb25zLmlkIHx8IHRoaXMuZGF0YVNvdXJjZS5pZCk7XG4gIH1cblxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gc3VwZXIudmlzaWJsZTtcbiAgfVxuICBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyLnZpc2libGUgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMuaGFzQmVlblZpc2libGUkLnZhbHVlICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLmhhc0JlZW5WaXNpYmxlJC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubWVzc2FnZXMgJiYgdmFsdWUpIHtcbiAgICAgIHRoaXMub3B0aW9ucz8ubWVzc2FnZXNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gbS5vcHRpb25zPy5zaG93T25FYWNoTGF5ZXJWaXNpYmlsaXR5KVxuICAgICAgICAubWFwKChtZXNzYWdlKSA9PiB0aGlzLnNob3dNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbWF4UmVzb2x1dGlvbigpIHtcbiAgICByZXR1cm4gc3VwZXIubWF4UmVzb2x1dGlvbjtcbiAgfVxuICBzZXQgbWF4UmVzb2x1dGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIubWF4UmVzb2x1dGlvbiA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlSW5SZXNvbHV0aW9uc1JhbmdlKCk7XG4gIH1cblxuICBnZXQgbWluUmVzb2x1dGlvbigpIHtcbiAgICByZXR1cm4gc3VwZXIubWluUmVzb2x1dGlvbjtcbiAgfVxuICBzZXQgbWluUmVzb2x1dGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIubWluUmVzb2x1dGlvbiA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlSW5SZXNvbHV0aW9uc1JhbmdlKCk7XG4gIH1cblxuICBnZXQgc2F2ZWFibGVPcHRpb25zKCk6IFBhcnRpYWw8TGF5ZXJPcHRpb25zPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpc1NhdmVhYmxlTGF5ZXIodGhpcykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnNhdmVhYmxlT3B0aW9ucyxcbiAgICAgIHNvdXJjZU9wdGlvbnM6IHRoaXMuZGF0YVNvdXJjZS5zYXZlYWJsZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wdGlvbnM6IExheWVyT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZVNlcnZpY2U/OiBNZXNzYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYXV0aEludGVyY2VwdG9yPzogQXV0aEludGVyY2VwdG9yXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5kYXRhU291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG5cbiAgICB0aGlzLmxlZ2VuZENvbGxhcHNlZCA9IG9wdGlvbnMubGVnZW5kT3B0aW9uc1xuICAgICAgPyBvcHRpb25zLmxlZ2VuZE9wdGlvbnMuY29sbGFwc2VkXG4gICAgICAgID8gb3B0aW9ucy5sZWdlbmRPcHRpb25zLmNvbGxhcHNlZFxuICAgICAgICA6IHRydWVcbiAgICAgIDogdHJ1ZTtcblxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMubGVnZW5kT3B0aW9ucyAmJlxuICAgICAgKG9wdGlvbnMubGVnZW5kT3B0aW9ucy51cmwgfHwgb3B0aW9ucy5sZWdlbmRPcHRpb25zLmh0bWwpXG4gICAgKSB7XG4gICAgICB0aGlzLmxlZ2VuZCA9IHRoaXMuZGF0YVNvdXJjZS5zZXRMZWdlbmQob3B0aW9ucy5sZWdlbmRPcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLm9sID0gdGhpcy5jcmVhdGVPbExheWVyKCk7XG4gICAgdGhpcy5vbC5zZXQoJ19sYXllcicsIHRoaXMsIHRydWUpO1xuXG4gICAgc3VwZXIuYWZ0ZXJDcmVhdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlT2xMYXllcigpOiBPbExheWVyPFNvdXJjZT47XG5cbiAgaW5pdChtYXA6IE1hcEJhc2UpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0KG1hcCk7XG5cbiAgICBtYXAubGF5ZXJXYXRjaGVyLndhdGNoTGF5ZXIodGhpcyk7XG5cbiAgICB0aGlzLm9ic2VydmVSZXNvbHV0aW9uKCk7XG4gICAgdGhpcy5oYXNCZWVuVmlzaWJsZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubWVzc2FnZXMgJiYgdGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY3JlYXRlTGluaygpO1xuICB9XG5cbiAgY3JlYXRlTGluaygpOiB2b2lkIHtcbiAgICBpZiAoIWlzTGlua01hc3Rlcih0aGlzKSB8fCB0aGlzLmxpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5saW5rID0gbmV3IExpbmtlZCh0aGlzKTtcbiAgfVxuXG4gIHJlbW92ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZW1vdmUoKTtcblxuICAgIHRoaXMudW5vYnNlcnZlUmVzb2x1dGlvbigpO1xuXG4gICAgdGhpcy5tYXAubGF5ZXJXYXRjaGVyLnVud2F0Y2hMYXllcih0aGlzKTtcblxuICAgIGlmIChpc0xpbmtNYXN0ZXIodGhpcykpIHtcbiAgICAgIHRoaXMubGluaz8uZGVsZXRlQ2hpbGRyZW4odGhpcy5tYXAubGF5ZXJDb250cm9sbGVyKTtcbiAgICAgIHRoaXMubGluaz8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmIChpc0xheWVyTGlua2VkKHRoaXMpKSB7XG4gICAgICBpZiAoIXRoaXMubGlua01hc3Rlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtYXN0ZXJMYXllciA9IHRoaXMubGlua01hc3Rlci5sYXllcjtcbiAgICAgIGNvbnN0IGhhc1N5bmMgPSB0aGlzLmxpbmtNYXN0ZXIuaGFzU3luY0RlbGV0aW9uKHRoaXMpO1xuXG4gICAgICB0aGlzLmxpbmtNYXN0ZXIucmVtb3ZlKHRoaXMpO1xuXG4gICAgICBpZiAoaGFzU3luYyAmJiBtYXN0ZXJMYXllcikge1xuICAgICAgICB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIucmVtb3ZlKG1hc3RlckxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGQocGFyZW50PzogTGF5ZXJHcm91cEJhc2UpOiB2b2lkIHtcbiAgICBzdXBlci5hZGQocGFyZW50KTtcblxuICAgIGlmIChpc0xheWVyTGlua2VkKHRoaXMpKSB7XG4gICAgICBpZiAoaXNMaW5rTWFzdGVyKHRoaXMpKSB7XG4gICAgICAgIHRoaXMubGluay5pbml0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3JlYXRlTGlua1dpdGhQYXJlbnQoKTtcbiAgICB9XG4gIH1cblxuICBtb3ZlVG8ocGFyZW50PzogTGF5ZXJHcm91cCk6IHZvaWQge1xuICAgIHN1cGVyLm1vdmVUbyhwYXJlbnQpO1xuXG4gICAgaWYgKGlzTGF5ZXJMaW5rZWQodGhpcykpIHtcbiAgICAgIHRoaXMubGluaz8ubW92ZSh0aGlzLCBwYXJlbnQpO1xuICAgICAgdGhpcy5saW5rTWFzdGVyPy5tb3ZlKHRoaXMsIHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaW5rV2l0aFBhcmVudCgpIHtcbiAgICBjb25zdCBtYXN0ZXJMYXllciA9IHRoaXMuZmluZFBhcmVudEJ5TGlua0lkKFxuICAgICAgdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLmFsbCxcbiAgICAgIHRoaXMub3B0aW9ucy5saW5rZWRMYXllcnMubGlua0lkXG4gICAgKTtcbiAgICBpZiAobWFzdGVyTGF5ZXIpIHtcbiAgICAgIHRoaXMubGlua01hc3RlciA9IG1hc3RlckxheWVyLmxpbms7XG4gICAgICBtYXN0ZXJMYXllcj8ubGluay5hZGQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyZW50QnlMaW5rSWQobGF5ZXJzOiBBbnlMYXllcltdLCBpZDogc3RyaW5nKTogTGF5ZXIge1xuICAgIHJldHVybiBsYXllcnMuZmluZCgobGF5ZXIpID0+IHtcbiAgICAgIGlmICghaXNMYXllckl0ZW0obGF5ZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChsYXllci5vcHRpb25zLmxpbmtlZExheWVycz8ubGlua3MpIHtcbiAgICAgICAgcmV0dXJuIGxheWVyLm9wdGlvbnMubGlua2VkTGF5ZXJzLmxpbmtzLnNvbWUoKGwpID0+XG4gICAgICAgICAgbC5saW5rZWRJZHMuaW5jbHVkZXMoaWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSkgYXMgTGF5ZXI7XG4gIH1cblxuICBwcml2YXRlIHNob3dNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZVNlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5tZXNzYWdlKG1lc3NhZ2UgYXMgTWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVSZXNvbHV0aW9uKCkge1xuICAgIHRoaXMucmVzb2x1dGlvbiQkID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIucmVzb2x1dGlvbiQuc3Vic2NyaWJlKCgpID0+XG4gICAgICB0aGlzLnVwZGF0ZUluUmVzb2x1dGlvbnNSYW5nZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5vYnNlcnZlUmVzb2x1dGlvbigpIHtcbiAgICBpZiAodGhpcy5yZXNvbHV0aW9uJCQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXNvbHV0aW9uJCQudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMucmVzb2x1dGlvbiQkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5SZXNvbHV0aW9uc1JhbmdlKCkge1xuICAgIGlmICh0aGlzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpO1xuICAgICAgY29uc3QgbWluUmVzb2x1dGlvbiA9IHRoaXMubWluUmVzb2x1dGlvbjtcbiAgICAgIGNvbnN0IG1heFJlc29sdXRpb24gPVxuICAgICAgICB0aGlzLm1heFJlc29sdXRpb24gPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogdGhpcy5tYXhSZXNvbHV0aW9uO1xuICAgICAgdGhpcy5pc0luUmVzb2x1dGlvbnNSYW5nZSA9XG4gICAgICAgIHJlc29sdXRpb24gPj0gbWluUmVzb2x1dGlvbiAmJiByZXNvbHV0aW9uIDw9IG1heFJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNJblJlc29sdXRpb25zUmFuZ2UgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './linked-layer';
2
+ export * from './linked-layer.interface';
3
+ export * from './linked-layer.utils';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9sYXllci9zaGFyZWQvbGF5ZXJzL2xpbmtlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGlua2VkLWxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGlua2VkLWxheWVyLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpbmtlZC1sYXllci51dGlscyc7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ export var LinkedProperties;
2
+ (function (LinkedProperties) {
3
+ LinkedProperties["OPACITY"] = "opacity";
4
+ LinkedProperties["VISIBLE"] = "visible";
5
+ LinkedProperties["DISPLAYED"] = "displayed";
6
+ LinkedProperties["OGCFILTERS"] = "ogcFilters";
7
+ LinkedProperties["MINRESOLUTION"] = "minResolution";
8
+ LinkedProperties["MAXRESOLUTION"] = "maxResolution";
9
+ LinkedProperties["ZINDEX"] = "zIndex";
10
+ LinkedProperties["TIMEFILTER"] = "timeFilter";
11
+ })(LinkedProperties || (LinkedProperties = {}));
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2VkLWxheWVyLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2xheWVyL3NoYXJlZC9sYXllcnMvbGlua2VkL2xpbmtlZC1sYXllci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEJBLE1BQU0sQ0FBTixJQUFZLGdCQVNYO0FBVEQsV0FBWSxnQkFBZ0I7SUFDMUIsdUNBQW1CLENBQUE7SUFDbkIsdUNBQW1CLENBQUE7SUFDbkIsMkNBQXVCLENBQUE7SUFDdkIsNkNBQXlCLENBQUE7SUFDekIsbURBQStCLENBQUE7SUFDL0IsbURBQStCLENBQUE7SUFDL0IscUNBQWlCLENBQUE7SUFDakIsNkNBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQVRXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFTM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFueUxheWVyIH0gZnJvbSAnLi4vYW55LWxheWVyJztcbmltcG9ydCB0eXBlIHsgTGF5ZXIgfSBmcm9tICcuLi9sYXllcic7XG5cbmV4cG9ydCB0eXBlIEFueVByb3BlcnR5T3B0aW9ucyA9IFppbmRleFByb3BlcnR5T3B0aW9ucyB8IEJhc2VQcm9wZXJ0eU9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgWmluZGV4UHJvcGVydHlPcHRpb25zIGV4dGVuZHMgQmFzZVByb3BlcnR5T3B0aW9ucyB7XG4gIGluaXRpYWxPcmRlcjogQW55TGF5ZXJbXTtcbn1cblxuaW50ZXJmYWNlIEJhc2VQcm9wZXJ0eU9wdGlvbnMge1xuICBsYXllcnM6IExheWVyW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXJzTGluayB7XG4gIGxpbmtJZDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCB2YWx1ZSBpcyB0cnVlICovXG4gIHNob3dJbk1pbmlCYXNlTWFwPzogYm9vbGVhbjtcbiAgbGlua3M/OiBMYXllcnNMaW5rUHJvcGVydGllc1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBMYXllcnNMaW5rUHJvcGVydGllcyB7XG4gIGJpZGlyZWN0aW9ubmFsPzogYm9vbGVhbjtcbiAgbGlua2VkSWRzOiBzdHJpbmdbXTtcbiAgc3luY2VkRGVsZXRlOiBib29sZWFuO1xuICBwcm9wZXJ0aWVzOiBMaW5rZWRQcm9wZXJ0aWVzW107XG59XG5cbmV4cG9ydCBlbnVtIExpbmtlZFByb3BlcnRpZXMge1xuICBPUEFDSVRZID0gJ29wYWNpdHknLFxuICBWSVNJQkxFID0gJ3Zpc2libGUnLFxuICBESVNQTEFZRUQgPSAnZGlzcGxheWVkJyxcbiAgT0dDRklMVEVSUyA9ICdvZ2NGaWx0ZXJzJyxcbiAgTUlOUkVTT0xVVElPTiA9ICdtaW5SZXNvbHV0aW9uJyxcbiAgTUFYUkVTT0xVVElPTiA9ICdtYXhSZXNvbHV0aW9uJyxcbiAgWklOREVYID0gJ3pJbmRleCcsXG4gIFRJTUVGSUxURVIgPSAndGltZUZpbHRlcidcbn1cbiJdfQ==
@@ -0,0 +1,242 @@
1
+ import { findLayerByLinkId, getLayersByDeletion, handleLayerPropertyChange } from '../../../../map/shared/linkedLayers.utils';
2
+ import { LayerWatcher } from '../../../../map/utils/layer-watcher';
3
+ import { isLayerItem, sortLayersByZindex } from '../../../utils/layer.utils';
4
+ import { LinkedProperties } from './linked-layer.interface';
5
+ export class Linked {
6
+ layer;
7
+ children = [];
8
+ watcher = new LayerWatcher();
9
+ bidirectionnalChildren = [];
10
+ childrenByProperty = new Map();
11
+ disabledProperties = [];
12
+ constructor(layer) {
13
+ this.layer = layer;
14
+ this.init();
15
+ this.watcher.watchLayer(layer);
16
+ this.watcher.propertyChange$.subscribe((change) => {
17
+ if (!change) {
18
+ return;
19
+ }
20
+ this.handleChange(change);
21
+ });
22
+ }
23
+ get options() {
24
+ return this.layer.options;
25
+ }
26
+ get links() {
27
+ return this.layer.options.linkedLayers.links;
28
+ }
29
+ get map() {
30
+ return this.layer.map;
31
+ }
32
+ init() {
33
+ const children = this.findChildren(this.map.layerController.all, this.links);
34
+ this.links.forEach((link) => {
35
+ link.properties.forEach((property) => {
36
+ let options = this.getByProperty(property);
37
+ if (property === LinkedProperties.ZINDEX) {
38
+ const layers = [this.layer, ...children];
39
+ options = this.initZIndexLinkOptions(options, layers);
40
+ }
41
+ this.childrenByProperty.set(property, options);
42
+ });
43
+ });
44
+ children.forEach((child) => this.add(child));
45
+ }
46
+ initZIndexLinkOptions(options, layers) {
47
+ options.initialOrder = sortLayersByZindex(layers, 'desc');
48
+ return options;
49
+ }
50
+ destroy() {
51
+ this.children.forEach((child) => {
52
+ this.remove(child);
53
+ });
54
+ this.unwatch();
55
+ }
56
+ add(layer) {
57
+ if (!this.children.includes(layer)) {
58
+ this.children.push(layer);
59
+ }
60
+ this.getLayerLinks(layer).forEach((link) => {
61
+ if (link.bidirectionnal) {
62
+ if (this.bidirectionnalChildren.includes(layer)) {
63
+ return;
64
+ }
65
+ this.bidirectionnalChildren.push(layer);
66
+ this.watcher.watchLayer(layer);
67
+ }
68
+ link.properties.forEach((property) => {
69
+ const options = this.getByProperty(property);
70
+ if (options.layers.includes(layer)) {
71
+ return;
72
+ }
73
+ // We have a property displayed for layer out of resolution or in a group
74
+ // If the visiblity is linked, we need to reflect the displayed value
75
+ if (property === LinkedProperties.VISIBLE && !layer.showInLayerList) {
76
+ const displayedOptions = this.getByProperty(LinkedProperties.DISPLAYED);
77
+ displayedOptions.layers.push(layer);
78
+ this.childrenByProperty.set(LinkedProperties.DISPLAYED, displayedOptions);
79
+ }
80
+ if (property === LinkedProperties.ZINDEX) {
81
+ const zIndexOptions = options;
82
+ if (!zIndexOptions.initialOrder.includes(layer)) {
83
+ zIndexOptions.initialOrder = sortLayersByZindex([...zIndexOptions.initialOrder, layer], 'desc');
84
+ }
85
+ }
86
+ options.layers.push(layer);
87
+ this.childrenByProperty.set(property, options);
88
+ if (layer[property] !== this.layer[property]) {
89
+ this.handleChange({
90
+ event: {
91
+ key: property,
92
+ oldValue: layer[property],
93
+ value: this.layer[property]
94
+ },
95
+ layer: this.layer
96
+ });
97
+ }
98
+ });
99
+ });
100
+ }
101
+ hasSyncDeletion(layer) {
102
+ return this.getLayerLinks(layer).some((link) => link.syncedDelete);
103
+ }
104
+ remove(layer) {
105
+ layer.linkMaster = undefined;
106
+ this.removeArrayItem(layer, this.children, 'id');
107
+ this.getLayerLinks(layer).forEach((link) => {
108
+ if (link.bidirectionnal) {
109
+ this.watcher.unwatchLayer(layer);
110
+ }
111
+ link.properties.forEach((property) => {
112
+ const options = this.getByProperty(property);
113
+ this.removeArrayItem(layer, options.layers, 'id');
114
+ this.childrenByProperty.set(property, options);
115
+ });
116
+ });
117
+ }
118
+ deleteChildren(controller) {
119
+ const layers = getLayersByDeletion(this.children, this.links);
120
+ layers?.forEach((layer) => {
121
+ this.remove(layer);
122
+ controller.remove(layer);
123
+ });
124
+ }
125
+ move(layer, parent) {
126
+ if (this.propertyIsDisabled(LinkedProperties.ZINDEX)) {
127
+ return;
128
+ }
129
+ const options = this.getByProperty(LinkedProperties.ZINDEX);
130
+ if (!options.layers.length) {
131
+ return;
132
+ }
133
+ const linkedLayers = this.getLinkedLayersOnZindex(layer.id);
134
+ this.disable(LinkedProperties.ZINDEX);
135
+ const index = options.initialOrder.findIndex((l) => l.id === layer.id);
136
+ linkedLayers?.forEach((linkLayer) => {
137
+ if (!linkLayer.showInLayerList) {
138
+ linkLayer.zIndex = layer.zIndex;
139
+ if (parent !== linkLayer.parent) {
140
+ linkLayer.reset(parent);
141
+ }
142
+ return;
143
+ }
144
+ const linkedIndex = options.initialOrder.findIndex((l) => l.id === linkLayer.id);
145
+ linkedIndex < index
146
+ ? this.map.layerController.moveAbove(layer, linkLayer)
147
+ : this.map.layerController.moveBelow(layer, linkLayer);
148
+ });
149
+ this.enable(LinkedProperties.ZINDEX);
150
+ }
151
+ disable(...properties) {
152
+ properties.forEach((property) => {
153
+ if (this.disabledProperties.includes(property)) {
154
+ return;
155
+ }
156
+ this.disabledProperties.push(property);
157
+ });
158
+ this.bidirectionnalChildren.forEach((layer) => {
159
+ this.watcher.unwatchLayer(layer);
160
+ });
161
+ }
162
+ enable(...properties) {
163
+ properties.forEach((property) => {
164
+ const index = this.disabledProperties.findIndex((disableProperty) => disableProperty === property);
165
+ if (index > -1) {
166
+ this.disabledProperties.splice(index, 1);
167
+ }
168
+ });
169
+ this.bidirectionnalChildren.forEach((layer) => {
170
+ this.watcher.watchLayer(layer);
171
+ });
172
+ }
173
+ getByProperty(property) {
174
+ return this.childrenByProperty.get(property) ?? { layers: [] };
175
+ }
176
+ propertyIsDisabled(property) {
177
+ return this.disabledProperties.includes(property);
178
+ }
179
+ getLayerLinks(layer) {
180
+ const linkId = layer.options.linkedLayers.linkId;
181
+ return this.links.filter((link) => link.linkedIds.includes(linkId));
182
+ }
183
+ removeArrayItem(item, array, key = 'id') {
184
+ const index = array.findIndex((n) => n[key] === item[key]);
185
+ if (index !== -1) {
186
+ array.splice(index, 1);
187
+ }
188
+ }
189
+ getLinkedLayersOnZindex(id) {
190
+ return [...this.getByProperty(LinkedProperties.ZINDEX).layers]
191
+ ?.concat(this.layer)
192
+ .filter((layer) => layer.id !== id);
193
+ }
194
+ unwatch() {
195
+ this.watcher.unwatch();
196
+ }
197
+ handleChange = (change) => {
198
+ const isMasterChage = change.layer.id === this.layer.id;
199
+ const property = change.event.key;
200
+ if (this.propertyIsDisabled(property)) {
201
+ return;
202
+ }
203
+ const options = this.getByProperty(property);
204
+ let layers = [...options.layers];
205
+ if (!layers?.length && isMasterChage) {
206
+ return;
207
+ }
208
+ if (!isMasterChage) {
209
+ layers = layers.filter((n) => n.id !== change.layer.id);
210
+ layers.push(this.layer);
211
+ }
212
+ if (property === LinkedProperties.DISPLAYED && isMasterChage) {
213
+ return this.handleDisplayChange(change, layers);
214
+ }
215
+ handleLayerPropertyChange(layers, change, this.map.viewController);
216
+ };
217
+ handleDisplayChange(change, children) {
218
+ const affectedProperties = [
219
+ LinkedProperties.DISPLAYED,
220
+ LinkedProperties.VISIBLE
221
+ ];
222
+ this.disable(...affectedProperties);
223
+ children.forEach((child) => {
224
+ if (!child.showInLayerList) {
225
+ child.visible = !!change.event.value;
226
+ }
227
+ });
228
+ this.enable(...affectedProperties);
229
+ }
230
+ findChildren(layers, links) {
231
+ const layersFiltered = layers.filter((n) => isLayerItem(n));
232
+ return links.reduce((linked, link) => {
233
+ const layerFromLink = link.linkedIds
234
+ .map((id) => {
235
+ return findLayerByLinkId(layersFiltered, id);
236
+ })
237
+ .filter(Boolean);
238
+ return linked.concat(layerFromLink);
239
+ }, []);
240
+ }
241
+ }
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2VkLWxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvc2hhcmVkL2xheWVycy9saW5rZWQvbGlua2VkLWxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUMxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFDTCxZQUFZLEVBRWIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFLN0UsT0FBTyxFQUdMLGdCQUFnQixFQUVqQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE1BQU0sT0FBTyxNQUFNO0lBT0U7SUFOWCxRQUFRLEdBQVksRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzdCLHNCQUFzQixHQUFZLEVBQUUsQ0FBQztJQUNyQyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBd0MsQ0FBQztJQUNyRSxrQkFBa0IsR0FBdUIsRUFBRSxDQUFDO0lBRXBELFlBQW1CLEtBQVk7UUFBWixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVaLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxP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QUNsQixLQUE2QjtRQUU3QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQVksQ0FBQztRQUV2RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFlLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVM7aUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNWLE9BQU8saUJBQWlCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZpbmRMYXllckJ5TGlua0lkLFxuICBnZXRMYXllcnNCeURlbGV0aW9uLFxuICBoYW5kbGVMYXllclByb3BlcnR5Q2hhbmdlXG59IGZyb20gJy4uLy4uLy4uLy4uL21hcC9zaGFyZWQvbGlua2VkTGF5ZXJzLnV0aWxzJztcbmltcG9ydCB7XG4gIExheWVyV2F0Y2hlcixcbiAgTGF5ZXJXYXRjaGVyQ2hhbmdlXG59IGZyb20gJy4uLy4uLy4uLy4uL21hcC91dGlscy9sYXllci13YXRjaGVyJztcbmltcG9ydCB7IGlzTGF5ZXJJdGVtLCBzb3J0TGF5ZXJzQnlaaW5kZXggfSBmcm9tICcuLi8uLi8uLi91dGlscy9sYXllci51dGlscyc7XG5pbXBvcnQgdHlwZSB7IExheWVyQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2xheWVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBBbnlMYXllciB9IGZyb20gJy4uL2FueS1sYXllcic7XG5pbXBvcnQgdHlwZSB7IExheWVyIH0gZnJvbSAnLi4vbGF5ZXInO1xuaW1wb3J0IHR5cGUgeyBMYXllckdyb3VwIH0gZnJvbSAnLi4vbGF5ZXItZ3JvdXAnO1xuaW1wb3J0IHtcbiAgQW55UHJvcGVydHlPcHRpb25zLFxuICBMYXllcnNMaW5rUHJvcGVydGllcyxcbiAgTGlua2VkUHJvcGVydGllcyxcbiAgWmluZGV4UHJvcGVydHlPcHRpb25zXG59IGZyb20gJy4vbGlua2VkLWxheWVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rZWQge1xuICBwcml2YXRlIGNoaWxkcmVuOiBMYXllcltdID0gW107XG4gIHByaXZhdGUgd2F0Y2hlciA9IG5ldyBMYXllcldhdGNoZXIoKTtcbiAgcHJpdmF0ZSBiaWRpcmVjdGlvbm5hbENoaWxkcmVuOiBMYXllcltdID0gW107XG4gIHByaXZhdGUgY2hpbGRyZW5CeVByb3BlcnR5ID0gbmV3IE1hcDxMaW5rZWRQcm9wZXJ0aWVzLCBBbnlQcm9wZXJ0eU9wdGlvbnM+KCk7XG4gIHByaXZhdGUgZGlzYWJsZWRQcm9wZXJ0aWVzOiBMaW5rZWRQcm9wZXJ0aWVzW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGF5ZXI6IExheWVyKSB7XG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICB0aGlzLndhdGNoZXIud2F0Y2hMYXllcihsYXllcik7XG5cbiAgICB0aGlzLndhdGNoZXIucHJvcGVydHlDaGFuZ2UkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZShjaGFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIub3B0aW9ucztcbiAgfVxuXG4gIGdldCBsaW5rcygpIHtcbiAgICByZXR1cm4gdGhpcy5sYXllci5vcHRpb25zLmxpbmtlZExheWVycy5saW5rcyE7XG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiB0aGlzLmxheWVyLm1hcDtcbiAgfVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpbmRDaGlsZHJlbihcbiAgICAgIHRoaXMubWFwLmxheWVyQ29udHJvbGxlci5hbGwsXG4gICAgICB0aGlzLmxpbmtzXG4gICAgKTtcblxuICAgIHRoaXMubGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgbGluay5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5nZXRCeVByb3BlcnR5KHByb3BlcnR5KTtcblxuICAgICAgICBpZiAocHJvcGVydHkgPT09IExpbmtlZFByb3BlcnRpZXMuWklOREVYKSB7XG4gICAgICAgICAgY29uc3QgbGF5ZXJzID0gW3RoaXMubGF5ZXIsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5pbml0WkluZGV4TGlua09wdGlvbnMoXG4gICAgICAgICAgICBvcHRpb25zIGFzIFppbmRleFByb3BlcnR5T3B0aW9ucyxcbiAgICAgICAgICAgIGxheWVyc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoaWxkcmVuQnlQcm9wZXJ0eS5zZXQocHJvcGVydHksIG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gdGhpcy5hZGQoY2hpbGQpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFpJbmRleExpbmtPcHRpb25zKFxuICAgIG9wdGlvbnM6IFppbmRleFByb3BlcnR5T3B0aW9ucyxcbiAgICBsYXllcnM6IExheWVyW11cbiAgKSB7XG4gICAgb3B0aW9ucy5pbml0aWFsT3JkZXIgPSBzb3J0TGF5ZXJzQnlaaW5kZXgobGF5ZXJzLCAnZGVzYycpO1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlKGNoaWxkKTtcbiAgICB9KTtcbiAgICB0aGlzLnVud2F0Y2goKTtcbiAgfVxuXG4gIGFkZChsYXllcjogTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4uaW5jbHVkZXMobGF5ZXIpKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0TGF5ZXJMaW5rcyhsYXllcikuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgaWYgKGxpbmsuYmlkaXJlY3Rpb25uYWwpIHtcbiAgICAgICAgaWYgKHRoaXMuYmlkaXJlY3Rpb25uYWxDaGlsZHJlbi5pbmNsdWRlcyhsYXllcikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaWRpcmVjdGlvbm5hbENoaWxkcmVuLnB1c2gobGF5ZXIpO1xuICAgICAgICB0aGlzLndhdGNoZXIud2F0Y2hMYXllcihsYXllcik7XG4gICAgICB9XG5cbiAgICAgIGxpbmsucHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRCeVByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgaWYgKG9wdGlvbnMubGF5ZXJzLmluY2x1ZGVzKGxheWVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGhhdmUgYSBwcm9wZXJ0eSBkaXNwbGF5ZWQgZm9yIGxheWVyIG91dCBvZiByZXNvbHV0aW9uIG9yIGluIGEgZ3JvdXBcbiAgICAgICAgLy8gSWYgdGhlIHZpc2libGl0eSBpcyBsaW5rZWQsIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGUgZGlzcGxheWVkIHZhbHVlXG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gTGlua2VkUHJvcGVydGllcy5WSVNJQkxFICYmICFsYXllci5zaG93SW5MYXllckxpc3QpIHtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5ZWRPcHRpb25zID0gdGhpcy5nZXRCeVByb3BlcnR5KFxuICAgICAgICAgICAgTGlua2VkUHJvcGVydGllcy5ESVNQTEFZRURcbiAgICAgICAgICApO1xuICAgICAgICAgIGRpc3BsYXllZE9wdGlvbnMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW5CeVByb3BlcnR5LnNldChcbiAgICAgICAgICAgIExpbmtlZFByb3BlcnRpZXMuRElTUExBWUVELFxuICAgICAgICAgICAgZGlzcGxheWVkT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkgPT09IExpbmtlZFByb3BlcnRpZXMuWklOREVYKSB7XG4gICAgICAgICAgY29uc3QgekluZGV4T3B0aW9ucyA9IG9wdGlvbnMgYXMgWmluZGV4UHJvcGVydHlPcHRpb25zO1xuICAgICAgICAgIGlmICghekluZGV4T3B0aW9ucy5pbml0aWFsT3JkZXIuaW5jbHVkZXMobGF5ZXIpKSB7XG4gICAgICAgICAgICB6SW5kZXhPcHRpb25zLmluaXRpYWxPcmRlciA9IHNvcnRMYXllcnNCeVppbmRleChcbiAgICAgICAgICAgICAgWy4uLnpJbmRleE9wdGlvbnMuaW5pdGlhbE9yZGVyLCBsYXllcl0sXG4gICAgICAgICAgICAgICdkZXNjJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHkuc2V0KHByb3BlcnR5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAobGF5ZXJbcHJvcGVydHldICE9PSB0aGlzLmxheWVyW3Byb3BlcnR5XSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHtcbiAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgIGtleTogcHJvcGVydHksXG4gICAgICAgICAgICAgIG9sZFZhbHVlOiBsYXllcltwcm9wZXJ0eV0sXG4gICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmxheWVyW3Byb3BlcnR5XVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxheWVyOiB0aGlzLmxheWVyXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaGFzU3luY0RlbGV0aW9uKGxheWVyOiBMYXllcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldExheWVyTGlua3MobGF5ZXIpLnNvbWUoKGxpbmspID0+IGxpbmsuc3luY2VkRGVsZXRlKTtcbiAgfVxuXG4gIHJlbW92ZShsYXllcjogTGF5ZXIpOiB2b2lkIHtcbiAgICBsYXllci5saW5rTWFzdGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVtb3ZlQXJyYXlJdGVtKGxheWVyLCB0aGlzLmNoaWxkcmVuLCAnaWQnKTtcblxuICAgIHRoaXMuZ2V0TGF5ZXJMaW5rcyhsYXllcikuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgaWYgKGxpbmsuYmlkaXJlY3Rpb25uYWwpIHtcbiAgICAgICAgdGhpcy53YXRjaGVyLnVud2F0Y2hMYXllcihsYXllcik7XG4gICAgICB9XG5cbiAgICAgIGxpbmsucHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRCeVByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5yZW1vdmVBcnJheUl0ZW0obGF5ZXIsIG9wdGlvbnMubGF5ZXJzLCAnaWQnKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHkuc2V0KHByb3BlcnR5LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlQ2hpbGRyZW4oY29udHJvbGxlcjogTGF5ZXJDb250cm9sbGVyKTogdm9pZCB7XG4gICAgY29uc3QgbGF5ZXJzID0gZ2V0TGF5ZXJzQnlEZWxldGlvbih0aGlzLmNoaWxkcmVuLCB0aGlzLmxpbmtzKTtcbiAgICBsYXllcnM/LmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZShsYXllcik7XG4gICAgICBjb250cm9sbGVyLnJlbW92ZShsYXllcik7XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlKGxheWVyOiBMYXllciwgcGFyZW50PzogTGF5ZXJHcm91cCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BlcnR5SXNEaXNhYmxlZChMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRCeVByb3BlcnR5KFxuICAgICAgTGlua2VkUHJvcGVydGllcy5aSU5ERVhcbiAgICApIGFzIFppbmRleFByb3BlcnR5T3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMubGF5ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmtlZExheWVycyA9IHRoaXMuZ2V0TGlua2VkTGF5ZXJzT25aaW5kZXgobGF5ZXIuaWQpO1xuXG4gICAgdGhpcy5kaXNhYmxlKExpbmtlZFByb3BlcnRpZXMuWklOREVYKTtcblxuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5pbml0aWFsT3JkZXIuZmluZEluZGV4KChsKSA9PiBsLmlkID09PSBsYXllci5pZCk7XG4gICAgbGlua2VkTGF5ZXJzPy5mb3JFYWNoKChsaW5rTGF5ZXIpID0+IHtcbiAgICAgIGlmICghbGlua0xheWVyLnNob3dJbkxheWVyTGlzdCkge1xuICAgICAgICBsaW5rTGF5ZXIuekluZGV4ID0gbGF5ZXIuekluZGV4O1xuICAgICAgICBpZiAocGFyZW50ICE9PSBsaW5rTGF5ZXIucGFyZW50KSB7XG4gICAgICAgICAgbGlua0xheWVyLnJlc2V0KHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rZWRJbmRleCA9IG9wdGlvbnMuaW5pdGlhbE9yZGVyLmZpbmRJbmRleChcbiAgICAgICAgKGwpID0+IGwuaWQgPT09IGxpbmtMYXllci5pZFxuICAgICAgKTtcbiAgICAgIGxpbmtlZEluZGV4IDwgaW5kZXhcbiAgICAgICAgPyB0aGlzLm1hcC5sYXllckNvbnRyb2xsZXIubW92ZUFib3ZlKGxheWVyLCBsaW5rTGF5ZXIpXG4gICAgICAgIDogdGhpcy5tYXAubGF5ZXJDb250cm9sbGVyLm1vdmVCZWxvdyhsYXllciwgbGlua0xheWVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZW5hYmxlKExpbmtlZFByb3BlcnRpZXMuWklOREVYKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZSguLi5wcm9wZXJ0aWVzOiBMaW5rZWRQcm9wZXJ0aWVzW10pOiB2b2lkIHtcbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZFByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzYWJsZWRQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5iaWRpcmVjdGlvbm5hbENoaWxkcmVuLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICB0aGlzLndhdGNoZXIudW53YXRjaExheWVyKGxheWVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlKC4uLnByb3BlcnRpZXM6IExpbmtlZFByb3BlcnRpZXNbXSk6IHZvaWQge1xuICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kaXNhYmxlZFByb3BlcnRpZXMuZmluZEluZGV4KFxuICAgICAgICAoZGlzYWJsZVByb3BlcnR5KSA9PiBkaXNhYmxlUHJvcGVydHkgPT09IHByb3BlcnR5XG4gICAgICApO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZFByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYmlkaXJlY3Rpb25uYWxDaGlsZHJlbi5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgdGhpcy53YXRjaGVyLndhdGNoTGF5ZXIobGF5ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCeVByb3BlcnR5KHByb3BlcnR5OiBMaW5rZWRQcm9wZXJ0aWVzKTogQW55UHJvcGVydHlPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbkJ5UHJvcGVydHkuZ2V0KHByb3BlcnR5KSA/PyB7IGxheWVyczogW10gfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlJc0Rpc2FibGVkKHByb3BlcnR5OiBMaW5rZWRQcm9wZXJ0aWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF5ZXJMaW5rcyhsYXllcjogTGF5ZXIpOiBMYXllcnNMaW5rUHJvcGVydGllc1tdIHtcbiAgICBjb25zdCBsaW5rSWQgPSBsYXllci5vcHRpb25zLmxpbmtlZExheWVycyEubGlua0lkO1xuICAgIHJldHVybiB0aGlzLmxpbmtzLmZpbHRlcigobGluaykgPT4gbGluay5saW5rZWRJZHMuaW5jbHVkZXMobGlua0lkKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUFycmF5SXRlbTxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0+KFxuICAgIGl0ZW06IFQsXG4gICAgYXJyYXk6IFRbXSxcbiAgICBrZXk6IGtleW9mIFQgPSAnaWQnXG4gICkge1xuICAgIGNvbnN0IGluZGV4ID0gYXJyYXkuZmluZEluZGV4KChuKSA9PiBuW2tleV0gPT09IGl0ZW1ba2V5XSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldExpbmtlZExheWVyc09uWmluZGV4KGlkOiBzdHJpbmcpOiBMYXllcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZ2V0QnlQcm9wZXJ0eShMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWCkubGF5ZXJzXVxuICAgICAgPy5jb25jYXQodGhpcy5sYXllcilcbiAgICAgIC5maWx0ZXIoKGxheWVyKSA9PiBsYXllci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bndhdGNoKCk6IHZvaWQge1xuICAgIHRoaXMud2F0Y2hlci51bndhdGNoKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5nZSA9IChjaGFuZ2U6IExheWVyV2F0Y2hlckNoYW5nZSkgPT4ge1xuICAgIGNvbnN0IGlzTWFzdGVyQ2hhZ2UgPSBjaGFuZ2UubGF5ZXIuaWQgPT09IHRoaXMubGF5ZXIuaWQ7XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IGNoYW5nZS5ldmVudC5rZXkgYXMgTGlua2VkUHJvcGVydGllcztcbiAgICBpZiAodGhpcy5wcm9wZXJ0eUlzRGlzYWJsZWQocHJvcGVydHkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0QnlQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgbGV0IGxheWVycyA9IFsuLi5vcHRpb25zLmxheWVyc107XG4gICAgaWYgKCFsYXllcnM/Lmxlbmd0aCAmJiBpc01hc3RlckNoYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc01hc3RlckNoYWdlKSB7XG4gICAgICBsYXllcnMgPSBsYXllcnMuZmlsdGVyKChuKSA9PiBuLmlkICE9PSBjaGFuZ2UubGF5ZXIuaWQpO1xuICAgICAgbGF5ZXJzLnB1c2godGhpcy5sYXllcik7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnR5ID09PSBMaW5rZWRQcm9wZXJ0aWVzLkRJU1BMQVlFRCAmJiBpc01hc3RlckNoYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEaXNwbGF5Q2hhbmdlKGNoYW5nZSwgbGF5ZXJzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVMYXllclByb3BlcnR5Q2hhbmdlKGxheWVycywgY2hhbmdlLCB0aGlzLm1hcC52aWV3Q29udHJvbGxlcik7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVEaXNwbGF5Q2hhbmdlKGNoYW5nZTogTGF5ZXJXYXRjaGVyQ2hhbmdlLCBjaGlsZHJlbjogTGF5ZXJbXSkge1xuICAgIGNvbnN0IGFmZmVjdGVkUHJvcGVydGllcyA9IFtcbiAgICAgIExpbmtlZFByb3BlcnRpZXMuRElTUExBWUVELFxuICAgICAgTGlua2VkUHJvcGVydGllcy5WSVNJQkxFXG4gICAgXTtcbiAgICB0aGlzLmRpc2FibGUoLi4uYWZmZWN0ZWRQcm9wZXJ0aWVzKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKCFjaGlsZC5zaG93SW5MYXllckxpc3QpIHtcbiAgICAgICAgY2hpbGQudmlzaWJsZSA9ICEhY2hhbmdlLmV2ZW50LnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZW5hYmxlKC4uLmFmZmVjdGVkUHJvcGVydGllcyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDaGlsZHJlbihcbiAgICBsYXllcnM6IEFueUxheWVyW10sXG4gICAgbGlua3M6IExheWVyc0xpbmtQcm9wZXJ0aWVzW11cbiAgKTogTGF5ZXJbXSB7XG4gICAgY29uc3QgbGF5ZXJzRmlsdGVyZWQgPSBsYXllcnMuZmlsdGVyKChuKSA9PiBpc0xheWVySXRlbShuKSkgYXMgTGF5ZXJbXTtcblxuICAgIHJldHVybiBsaW5rcy5yZWR1Y2UoKGxpbmtlZDogTGF5ZXJbXSwgbGluaykgPT4ge1xuICAgICAgY29uc3QgbGF5ZXJGcm9tTGluayA9IGxpbmsubGlua2VkSWRzXG4gICAgICAgIC5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZpbmRMYXllckJ5TGlua0lkKGxheWVyc0ZpbHRlcmVkLCBpZCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgIHJldHVybiBsaW5rZWQuY29uY2F0KGxheWVyRnJvbUxpbmspO1xuICAgIH0sIFtdKTtcbiAgfVxufVxuIl19