@igo2/geo 18.0.0-next.9 → 18.0.1-next.1

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 (607) hide show
  1. package/fesm2022/igo2-geo.mjs +23016 -22107
  2. package/fesm2022/igo2-geo.mjs.map +1 -1
  3. package/lib/datasource/shared/capabilities.service.d.ts +7 -2
  4. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +2 -2
  5. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +5 -5
  6. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +57 -20
  7. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +115 -13
  8. package/lib/directions/directions-results/directions-results.component.d.ts +50 -16
  9. package/lib/directions/directions-sources/directions-source.d.ts +2 -2
  10. package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
  11. package/lib/directions/directions.component.d.ts +5 -5
  12. package/lib/directions/shared/directions.enum.d.ts +42 -1
  13. package/lib/directions/shared/directions.interface.d.ts +50 -25
  14. package/lib/directions/shared/directions.service.d.ts +46 -8
  15. package/lib/directions/shared/directions.utils.d.ts +102 -23
  16. package/lib/directions/shared/store.d.ts +3 -3
  17. package/lib/download/download-button/download-button.component.d.ts +4 -8
  18. package/lib/download/shared/download.service.d.ts +1 -1
  19. package/lib/draw/draw/draw.component.d.ts +2 -2
  20. package/lib/draw/shared/draw.utils.d.ts +2 -1
  21. package/lib/environment/environment.interface.d.ts +2 -0
  22. package/lib/feature/shared/feature-store.utils.d.ts +1 -1
  23. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  24. package/lib/feature/shared/store.d.ts +1 -1
  25. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  26. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  27. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +2 -2
  28. package/lib/filter/shared/filterable-datasource.pipe.d.ts +2 -2
  29. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +3 -3
  30. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -5
  31. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -5
  32. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  33. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +5 -5
  34. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  35. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +2 -7
  36. package/lib/import-export/export-button/export-button.component.d.ts +3 -7
  37. package/lib/import-export/import-export/import-export.component.d.ts +1 -2
  38. package/lib/import-export/shared/export.service.d.ts +2 -2
  39. package/lib/layer/index.d.ts +9 -4
  40. package/lib/layer/layer-group/index.d.ts +1 -0
  41. package/lib/layer/layer-group/layer-group.component.d.ts +30 -0
  42. package/lib/layer/layer-item/layer-item.component.d.ts +19 -42
  43. package/lib/layer/layer-legend/layer-legend.component.d.ts +2 -5
  44. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +6 -7
  45. package/lib/layer/layer-list/index.d.ts +0 -2
  46. package/lib/layer/layer-list/layer-list.component.d.ts +51 -128
  47. package/lib/layer/layer-list-tool/index.d.ts +0 -1
  48. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +19 -26
  49. package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +5 -1
  50. package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +9 -8
  51. package/lib/layer/layer-search/index.d.ts +1 -0
  52. package/lib/layer/layer-search/layer-search.component.d.ts +16 -0
  53. package/lib/layer/layer-unavailable/index.d.ts +2 -0
  54. package/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.d.ts +10 -0
  55. package/lib/layer/layer-unavailable/layer-unavailable.component.d.ts +11 -0
  56. package/lib/layer/layer-viewer/index.d.ts +2 -0
  57. package/lib/layer/layer-viewer/layer-viewer.component.d.ts +52 -0
  58. package/lib/layer/layer-viewer/layer-viewer.interface.d.ts +22 -0
  59. package/lib/layer/layer-viewer-bottom-actions/index.d.ts +1 -0
  60. package/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.d.ts +44 -0
  61. package/lib/layer/layer-visibility-button/index.d.ts +1 -0
  62. package/lib/layer/layer-visibility-button/layer-visibility-button.component.d.ts +22 -0
  63. package/lib/layer/layer.module.d.ts +18 -6
  64. package/lib/layer/shared/index.d.ts +1 -0
  65. package/lib/layer/shared/layer-controller.d.ts +81 -0
  66. package/lib/layer/shared/layer-selection.d.ts +14 -0
  67. package/lib/layer/shared/layer.service.d.ts +9 -5
  68. package/lib/layer/shared/layers/any-layer.d.ts +3 -6
  69. package/lib/layer/shared/layers/any-layer.interface.d.ts +8 -6
  70. package/lib/layer/shared/layers/image-layer.d.ts +5 -2
  71. package/lib/layer/shared/layers/image-layer.interface.d.ts +1 -4
  72. package/lib/layer/shared/layers/index.d.ts +5 -0
  73. package/lib/layer/shared/layers/layer-base.d.ts +75 -0
  74. package/lib/layer/shared/layers/layer-group.d.ts +32 -0
  75. package/lib/layer/shared/layers/layer-group.interface.d.ts +8 -0
  76. package/lib/layer/shared/layers/layer.d.ts +27 -45
  77. package/lib/layer/shared/layers/layer.interface.d.ts +23 -41
  78. package/lib/layer/shared/layers/linked/index.d.ts +3 -0
  79. package/lib/layer/shared/layers/linked/linked-layer.d.ts +35 -0
  80. package/lib/layer/shared/layers/linked/linked-layer.interface.d.ts +32 -0
  81. package/lib/layer/shared/layers/linked/linked-layer.utils.d.ts +9 -0
  82. package/lib/layer/shared/layers/tile-layer.d.ts +5 -2
  83. package/lib/layer/shared/layers/vector-layer.d.ts +7 -3
  84. package/lib/layer/shared/layers/vectortile-layer.d.ts +5 -2
  85. package/lib/layer/utils/layer.utils.d.ts +12 -2
  86. package/lib/layer/utils/outputLegend.d.ts +2 -2
  87. package/lib/map/shared/controllers/geolocation.interface.d.ts +2 -1
  88. package/lib/map/shared/hover-feature.directive.d.ts +0 -1
  89. package/lib/map/shared/linkedLayers.utils.d.ts +13 -17
  90. package/lib/map/shared/map.abstract.d.ts +12 -29
  91. package/lib/map/shared/map.d.ts +10 -85
  92. package/lib/map/shared/map.service.d.ts +1 -1
  93. package/lib/map/shared/map.utils.d.ts +5 -3
  94. package/lib/map/utils/index.d.ts +1 -0
  95. package/lib/map/utils/layer-watcher.d.ts +18 -8
  96. package/lib/measure/measurer/measurer.component.d.ts +0 -8
  97. package/lib/metadata/metadata-button/metadata-button.component.d.ts +3 -7
  98. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  99. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  100. package/lib/offline/offline.provider.d.ts +1 -1
  101. package/lib/query/shared/query.service.d.ts +1 -1
  102. package/lib/query/shared/query.utils.d.ts +2 -1
  103. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  104. package/lib/search/shared/search-pointer-summary.directive.d.ts +0 -1
  105. package/lib/search/shared/sources/workspace.interfaces.d.ts +1 -1
  106. package/lib/style/style-list/style-list.provider.d.ts +1 -8
  107. package/lib/style/style-list/style-list.service.d.ts +1 -1
  108. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  109. package/locale/en.geo.json +104 -89
  110. package/locale/fr.geo.json +103 -89
  111. package/package.json +15 -17
  112. package/src/geo-theme.scss +1 -1
  113. package/src/lib/directions/directions-inputs/directions-inputs.theming.scss +21 -0
  114. package/src/lib/directions/directions.theming.scss +2 -0
  115. package/src/lib/layer/layer-group/layer-group.theme.scss +28 -0
  116. package/src/lib/layer/layer-item/layer-item.theme.scss +4 -9
  117. package/src/lib/layer/layer-legend/layer-legend.theme.scss +30 -0
  118. package/src/lib/layer/layer-list/layer-list.theme.scss +51 -0
  119. package/src/lib/layer/layer-unavailable/layer-unavailable.theme.scss +19 -0
  120. package/src/lib/layer/layer-viewer/_layer-viewer.theme.scss +16 -0
  121. package/src/lib/layer/layer-visibility-button/layer-visibility-button.theme.scss +27 -0
  122. package/src/lib/layer/layer.theming.scss +14 -3
  123. package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
  124. package/src/style/style.scss +1 -1
  125. package/esm2022/igo2-geo.mjs +0 -5
  126. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +0 -234
  127. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +0 -274
  128. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +0 -243
  129. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +0 -19
  130. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +0 -136
  131. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +0 -60
  132. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +0 -232
  133. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +0 -24
  134. package/esm2022/lib/catalog/catalog-library/index.mjs +0 -4
  135. package/esm2022/lib/catalog/catalog.module.mjs +0 -26
  136. package/esm2022/lib/catalog/index.mjs +0 -6
  137. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +0 -32
  138. package/esm2022/lib/catalog/shared/catalog.enum.mjs +0 -16
  139. package/esm2022/lib/catalog/shared/catalog.interface.mjs +0 -2
  140. package/esm2022/lib/catalog/shared/catalog.service.mjs +0 -706
  141. package/esm2022/lib/catalog/shared/catalogs.mjs +0 -75
  142. package/esm2022/lib/catalog/shared/index.mjs +0 -5
  143. package/esm2022/lib/datasource/index.mjs +0 -3
  144. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +0 -17
  145. package/esm2022/lib/datasource/shared/capabilities.service.mjs +0 -441
  146. package/esm2022/lib/datasource/shared/datasource.service.mjs +0 -258
  147. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +0 -2
  148. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +0 -2
  149. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +0 -2
  150. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +0 -222
  151. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +0 -2
  152. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +0 -118
  153. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +0 -2
  154. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +0 -24
  155. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +0 -3
  156. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +0 -2
  157. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +0 -40
  158. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +0 -2
  159. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +0 -52
  160. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +0 -2
  161. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +0 -70
  162. package/esm2022/lib/datasource/shared/datasources/index.mjs +0 -36
  163. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +0 -2
  164. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +0 -33
  165. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +0 -2
  166. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +0 -14
  167. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +0 -2
  168. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +0 -60
  169. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +0 -2
  170. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +0 -17
  171. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +0 -2
  172. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +0 -56
  173. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +0 -2
  174. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +0 -137
  175. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +0 -170
  176. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +0 -2
  177. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +0 -227
  178. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +0 -224
  179. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +0 -2
  180. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +0 -18
  181. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +0 -2
  182. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +0 -11
  183. package/esm2022/lib/datasource/shared/index.mjs +0 -6
  184. package/esm2022/lib/datasource/shared/options/index.mjs +0 -5
  185. package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +0 -2
  186. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +0 -15
  187. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +0 -85
  188. package/esm2022/lib/datasource/shared/options/options.service.mjs +0 -3
  189. package/esm2022/lib/datasource/utils/index.mjs +0 -2
  190. package/esm2022/lib/datasource/utils/tilegrid.mjs +0 -20
  191. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +0 -197
  192. package/esm2022/lib/directions/directions-buttons/index.mjs +0 -2
  193. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +0 -218
  194. package/esm2022/lib/directions/directions-inputs/index.mjs +0 -2
  195. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +0 -143
  196. package/esm2022/lib/directions/directions-results/index.mjs +0 -2
  197. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +0 -5
  198. package/esm2022/lib/directions/directions-sources/directions-source.mjs +0 -3
  199. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +0 -23
  200. package/esm2022/lib/directions/directions-sources/index.mjs +0 -5
  201. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +0 -159
  202. package/esm2022/lib/directions/directions.component.mjs +0 -413
  203. package/esm2022/lib/directions/directions.module.mjs +0 -46
  204. package/esm2022/lib/directions/directions.provider.mjs +0 -16
  205. package/esm2022/lib/directions/index.mjs +0 -8
  206. package/esm2022/lib/directions/shared/directions-source.service.mjs +0 -18
  207. package/esm2022/lib/directions/shared/directions.enum.mjs +0 -28
  208. package/esm2022/lib/directions/shared/directions.interface.mjs +0 -2
  209. package/esm2022/lib/directions/shared/directions.service.mjs +0 -213
  210. package/esm2022/lib/directions/shared/directions.utils.mjs +0 -559
  211. package/esm2022/lib/directions/shared/index.mjs +0 -6
  212. package/esm2022/lib/directions/shared/store.mjs +0 -21
  213. package/esm2022/lib/download/download-button/download-button.component.mjs +0 -60
  214. package/esm2022/lib/download/download-button/index.mjs +0 -2
  215. package/esm2022/lib/download/download.module.mjs +0 -24
  216. package/esm2022/lib/download/index.mjs +0 -3
  217. package/esm2022/lib/download/shared/download.interface.mjs +0 -2
  218. package/esm2022/lib/download/shared/download.service.mjs +0 -67
  219. package/esm2022/lib/download/shared/index.mjs +0 -3
  220. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +0 -42
  221. package/esm2022/lib/draw/draw/draw-popup.component.mjs +0 -421
  222. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +0 -28
  223. package/esm2022/lib/draw/draw/draw.component.mjs +0 -1143
  224. package/esm2022/lib/draw/draw/draw.module.mjs +0 -19
  225. package/esm2022/lib/draw/drawingTool.module.mjs +0 -18
  226. package/esm2022/lib/draw/index.mjs +0 -3
  227. package/esm2022/lib/draw/shared/draw-icon.service.mjs +0 -30
  228. package/esm2022/lib/draw/shared/draw.enum.mjs +0 -21
  229. package/esm2022/lib/draw/shared/draw.interface.mjs +0 -2
  230. package/esm2022/lib/draw/shared/draw.utils.mjs +0 -125
  231. package/esm2022/lib/draw/shared/index.mjs +0 -5
  232. package/esm2022/lib/environment/environment.interface.mjs +0 -2
  233. package/esm2022/lib/environment/index.mjs +0 -2
  234. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +0 -306
  235. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +0 -56
  236. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +0 -26
  237. package/esm2022/lib/feature/feature-details/index.mjs +0 -4
  238. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +0 -101
  239. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +0 -19
  240. package/esm2022/lib/feature/feature.module.mjs +0 -26
  241. package/esm2022/lib/feature/index.mjs +0 -5
  242. package/esm2022/lib/feature/shared/feature-store.utils.mjs +0 -27
  243. package/esm2022/lib/feature/shared/feature.enums.mjs +0 -9
  244. package/esm2022/lib/feature/shared/feature.interfaces.mjs +0 -2
  245. package/esm2022/lib/feature/shared/feature.utils.mjs +0 -332
  246. package/esm2022/lib/feature/shared/index.mjs +0 -8
  247. package/esm2022/lib/feature/shared/store.mjs +0 -143
  248. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +0 -216
  249. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +0 -116
  250. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +0 -99
  251. package/esm2022/lib/feature/shared/strategies/index.mjs +0 -8
  252. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +0 -103
  253. package/esm2022/lib/feature/shared/strategies/loading.mjs +0 -136
  254. package/esm2022/lib/feature/shared/strategies/search.mjs +0 -158
  255. package/esm2022/lib/feature/shared/strategies/selection.mjs +0 -384
  256. package/esm2022/lib/feature/shared/strategies.utils.mjs +0 -37
  257. package/esm2022/lib/filter/filter.module.mjs +0 -131
  258. package/esm2022/lib/filter/index.mjs +0 -17
  259. package/esm2022/lib/filter/ogc-filter-button/index.mjs +0 -2
  260. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +0 -141
  261. package/esm2022/lib/filter/ogc-filter-form/index.mjs +0 -2
  262. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +0 -325
  263. package/esm2022/lib/filter/ogc-filter-selection/index.mjs +0 -2
  264. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +0 -787
  265. package/esm2022/lib/filter/ogc-filter-time/index.mjs +0 -3
  266. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +0 -201
  267. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +0 -665
  268. package/esm2022/lib/filter/ogc-filterable-form/index.mjs +0 -2
  269. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +0 -66
  270. package/esm2022/lib/filter/ogc-filterable-item/index.mjs +0 -2
  271. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +0 -244
  272. package/esm2022/lib/filter/ogc-filterable-list/index.mjs +0 -3
  273. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +0 -37
  274. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +0 -32
  275. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +0 -56
  276. package/esm2022/lib/filter/shared/index.mjs +0 -12
  277. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +0 -72
  278. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +0 -30
  279. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +0 -2
  280. package/esm2022/lib/filter/shared/ogc-filter.mjs +0 -756
  281. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +0 -47
  282. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +0 -23
  283. package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +0 -2
  284. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +0 -282
  285. package/esm2022/lib/filter/shared/time-filter.enum.mjs +0 -13
  286. package/esm2022/lib/filter/shared/time-filter.interface.mjs +0 -2
  287. package/esm2022/lib/filter/shared/time-filter.service.mjs +0 -107
  288. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +0 -2
  289. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +0 -875
  290. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +0 -2
  291. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +0 -197
  292. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +0 -2
  293. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +0 -126
  294. package/esm2022/lib/filter/time-filter-button/index.mjs +0 -2
  295. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +0 -70
  296. package/esm2022/lib/filter/time-filter-form/index.mjs +0 -2
  297. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +0 -534
  298. package/esm2022/lib/filter/time-filter-item/index.mjs +0 -2
  299. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +0 -90
  300. package/esm2022/lib/filter/time-filter-list/index.mjs +0 -3
  301. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +0 -37
  302. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +0 -35
  303. package/esm2022/lib/geo.module.mjs +0 -63
  304. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +0 -559
  305. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +0 -170
  306. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +0 -24
  307. package/esm2022/lib/geometry/geometry-form-field/index.mjs +0 -4
  308. package/esm2022/lib/geometry/geometry.module.mjs +0 -18
  309. package/esm2022/lib/geometry/index.mjs +0 -3
  310. package/esm2022/lib/geometry/shared/controls/draw.mjs +0 -340
  311. package/esm2022/lib/geometry/shared/controls/index.mjs +0 -4
  312. package/esm2022/lib/geometry/shared/controls/modify.mjs +0 -538
  313. package/esm2022/lib/geometry/shared/controls/slice.mjs +0 -190
  314. package/esm2022/lib/geometry/shared/geometry.errors.mjs +0 -24
  315. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +0 -2
  316. package/esm2022/lib/geometry/shared/geometry.utils.mjs +0 -113
  317. package/esm2022/lib/geometry/shared/index.mjs +0 -5
  318. package/esm2022/lib/import-export/export-button/export-button.component.mjs +0 -62
  319. package/esm2022/lib/import-export/export-button/index.mjs +0 -2
  320. package/esm2022/lib/import-export/import-export/import-export.component.mjs +0 -865
  321. package/esm2022/lib/import-export/import-export/index.mjs +0 -2
  322. package/esm2022/lib/import-export/import-export.module.mjs +0 -31
  323. package/esm2022/lib/import-export/index.mjs +0 -5
  324. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +0 -114
  325. package/esm2022/lib/import-export/shared/export.errors.mjs +0 -15
  326. package/esm2022/lib/import-export/shared/export.interface.mjs +0 -2
  327. package/esm2022/lib/import-export/shared/export.service.mjs +0 -375
  328. package/esm2022/lib/import-export/shared/export.type.mjs +0 -13
  329. package/esm2022/lib/import-export/shared/export.utils.mjs +0 -51
  330. package/esm2022/lib/import-export/shared/import.errors.mjs +0 -39
  331. package/esm2022/lib/import-export/shared/import.interface.mjs +0 -2
  332. package/esm2022/lib/import-export/shared/import.service.mjs +0 -221
  333. package/esm2022/lib/import-export/shared/import.utils.mjs +0 -203
  334. package/esm2022/lib/import-export/shared/index.mjs +0 -11
  335. package/esm2022/lib/layer/index.mjs +0 -11
  336. package/esm2022/lib/layer/layer-item/index.mjs +0 -2
  337. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +0 -281
  338. package/esm2022/lib/layer/layer-legend/index.mjs +0 -2
  339. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +0 -290
  340. package/esm2022/lib/layer/layer-legend-item/index.mjs +0 -2
  341. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +0 -85
  342. package/esm2022/lib/layer/layer-legend-list/index.mjs +0 -3
  343. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +0 -55
  344. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +0 -111
  345. package/esm2022/lib/layer/layer-list/index.mjs +0 -4
  346. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -70
  347. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +0 -841
  348. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +0 -19
  349. package/esm2022/lib/layer/layer-list-tool/index.mjs +0 -5
  350. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +0 -125
  351. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
  352. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +0 -2
  353. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +0 -21
  354. package/esm2022/lib/layer/layer.module.mjs +0 -89
  355. package/esm2022/lib/layer/shared/clusterParam.mjs +0 -2
  356. package/esm2022/lib/layer/shared/index.mjs +0 -5
  357. package/esm2022/lib/layer/shared/layer.enums.mjs +0 -2
  358. package/esm2022/lib/layer/shared/layer.service.mjs +0 -300
  359. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +0 -2
  360. package/esm2022/lib/layer/shared/layers/any-layer.mjs +0 -2
  361. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +0 -2
  362. package/esm2022/lib/layer/shared/layers/image-layer.mjs +0 -70
  363. package/esm2022/lib/layer/shared/layers/index.mjs +0 -13
  364. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +0 -17
  365. package/esm2022/lib/layer/shared/layers/layer.mjs +0 -187
  366. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +0 -2
  367. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +0 -2
  368. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +0 -50
  369. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +0 -2
  370. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +0 -570
  371. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +0 -2
  372. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +0 -107
  373. package/esm2022/lib/layer/track-feature-button/index.mjs +0 -2
  374. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +0 -54
  375. package/esm2022/lib/layer/utils/image-watcher.mjs +0 -62
  376. package/esm2022/lib/layer/utils/index.mjs +0 -6
  377. package/esm2022/lib/layer/utils/layer.utils.mjs +0 -11
  378. package/esm2022/lib/layer/utils/outputLegend.mjs +0 -28
  379. package/esm2022/lib/layer/utils/tile-watcher.mjs +0 -52
  380. package/esm2022/lib/layer/utils/vector-watcher.mjs +0 -50
  381. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +0 -20
  382. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +0 -87
  383. package/esm2022/lib/map/baselayers-switcher/index.mjs +0 -3
  384. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +0 -120
  385. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +0 -78
  386. package/esm2022/lib/map/geolocate-button/index.mjs +0 -2
  387. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +0 -73
  388. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +0 -2
  389. package/esm2022/lib/map/home-extent-button/index.mjs +0 -3
  390. package/esm2022/lib/map/index.mjs +0 -14
  391. package/esm2022/lib/map/info-section/index.mjs +0 -2
  392. package/esm2022/lib/map/info-section/info-section.component.mjs +0 -15
  393. package/esm2022/lib/map/map-browser/index.mjs +0 -2
  394. package/esm2022/lib/map/map-browser/map-browser.component.mjs +0 -67
  395. package/esm2022/lib/map/map-center/index.mjs +0 -2
  396. package/esm2022/lib/map/map-center/map-center.component.mjs +0 -57
  397. package/esm2022/lib/map/map.module.mjs +0 -89
  398. package/esm2022/lib/map/menu-button/index.mjs +0 -2
  399. package/esm2022/lib/map/menu-button/menu-button.component.mjs +0 -57
  400. package/esm2022/lib/map/offline-button/index.mjs +0 -2
  401. package/esm2022/lib/map/offline-button/offline-button.component.mjs +0 -53
  402. package/esm2022/lib/map/rotation-button/index.mjs +0 -2
  403. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +0 -58
  404. package/esm2022/lib/map/shared/controllers/controller.mjs +0 -44
  405. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +0 -8
  406. package/esm2022/lib/map/shared/controllers/geolocation.mjs +0 -431
  407. package/esm2022/lib/map/shared/controllers/index.mjs +0 -5
  408. package/esm2022/lib/map/shared/controllers/view.mjs +0 -361
  409. package/esm2022/lib/map/shared/hover-feature.directive.mjs +0 -489
  410. package/esm2022/lib/map/shared/index.mjs +0 -15
  411. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +0 -248
  412. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +0 -122
  413. package/esm2022/lib/map/shared/map.abstract.mjs +0 -23
  414. package/esm2022/lib/map/shared/map.enums.mjs +0 -6
  415. package/esm2022/lib/map/shared/map.interface.mjs +0 -2
  416. package/esm2022/lib/map/shared/map.mjs +0 -437
  417. package/esm2022/lib/map/shared/map.service.mjs +0 -29
  418. package/esm2022/lib/map/shared/map.utils.mjs +0 -455
  419. package/esm2022/lib/map/shared/mapOffline.directive.mjs +0 -110
  420. package/esm2022/lib/map/shared/projection.interfaces.mjs +0 -2
  421. package/esm2022/lib/map/shared/projection.service.mjs +0 -67
  422. package/esm2022/lib/map/shared/projection.utils.mjs +0 -122
  423. package/esm2022/lib/map/swipe-control/index.mjs +0 -2
  424. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +0 -213
  425. package/esm2022/lib/map/utils/layer-watcher.mjs +0 -80
  426. package/esm2022/lib/map/wake-lock-button/index.mjs +0 -2
  427. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +0 -103
  428. package/esm2022/lib/map/zoom-button/index.mjs +0 -2
  429. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +0 -35
  430. package/esm2022/lib/measure/index.mjs +0 -3
  431. package/esm2022/lib/measure/measure.module.mjs +0 -20
  432. package/esm2022/lib/measure/measurer/index.mjs +0 -6
  433. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +0 -40
  434. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +0 -38
  435. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +0 -143
  436. package/esm2022/lib/measure/measurer/measurer.component.mjs +0 -966
  437. package/esm2022/lib/measure/measurer/measurer.module.mjs +0 -20
  438. package/esm2022/lib/measure/shared/index.mjs +0 -4
  439. package/esm2022/lib/measure/shared/measure.enum.mjs +0 -37
  440. package/esm2022/lib/measure/shared/measure.interfaces.mjs +0 -2
  441. package/esm2022/lib/measure/shared/measure.utils.mjs +0 -497
  442. package/esm2022/lib/metadata/index.mjs +0 -4
  443. package/esm2022/lib/metadata/metadata-button/index.mjs +0 -2
  444. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +0 -108
  445. package/esm2022/lib/metadata/metadata.module.mjs +0 -29
  446. package/esm2022/lib/metadata/shared/index.mjs +0 -3
  447. package/esm2022/lib/metadata/shared/metadata.interface.mjs +0 -2
  448. package/esm2022/lib/metadata/shared/metadata.service.mjs +0 -18
  449. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +0 -130
  450. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +0 -6
  451. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +0 -2
  452. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +0 -172
  453. package/esm2022/lib/offline/geoDB/index.mjs +0 -5
  454. package/esm2022/lib/offline/index.mjs +0 -6
  455. package/esm2022/lib/offline/layerDB/index.mjs +0 -3
  456. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +0 -2
  457. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +0 -83
  458. package/esm2022/lib/offline/offline.interface.mjs +0 -2
  459. package/esm2022/lib/offline/offline.provider.mjs +0 -51
  460. package/esm2022/lib/offline/shared/geo-network.service.mjs +0 -79
  461. package/esm2022/lib/offline/shared/index.mjs +0 -2
  462. package/esm2022/lib/overlay/index.mjs +0 -2
  463. package/esm2022/lib/overlay/shared/index.mjs +0 -4
  464. package/esm2022/lib/overlay/shared/overlay.enum.mjs +0 -8
  465. package/esm2022/lib/overlay/shared/overlay.mjs +0 -139
  466. package/esm2022/lib/overlay/shared/overlay.utils.mjs +0 -17
  467. package/esm2022/lib/print/index.mjs +0 -4
  468. package/esm2022/lib/print/print/print.component.mjs +0 -116
  469. package/esm2022/lib/print/print-form/index.mjs +0 -2
  470. package/esm2022/lib/print/print-form/print-form.component.mjs +0 -320
  471. package/esm2022/lib/print/print.module.mjs +0 -20
  472. package/esm2022/lib/print/shared/geopdf.mjs +0 -68
  473. package/esm2022/lib/print/shared/index.mjs +0 -5
  474. package/esm2022/lib/print/shared/print.interface.mjs +0 -2
  475. package/esm2022/lib/print/shared/print.service.mjs +0 -1136
  476. package/esm2022/lib/print/shared/print.type.mjs +0 -30
  477. package/esm2022/lib/query/index.mjs +0 -2
  478. package/esm2022/lib/query/query.module.mjs +0 -27
  479. package/esm2022/lib/query/shared/index.mjs +0 -8
  480. package/esm2022/lib/query/shared/query-search-source.mjs +0 -35
  481. package/esm2022/lib/query/shared/query-search-source.providers.mjs +0 -22
  482. package/esm2022/lib/query/shared/query.directive.mjs +0 -286
  483. package/esm2022/lib/query/shared/query.enums.mjs +0 -32
  484. package/esm2022/lib/query/shared/query.interfaces.mjs +0 -2
  485. package/esm2022/lib/query/shared/query.service.mjs +0 -753
  486. package/esm2022/lib/query/shared/query.utils.mjs +0 -41
  487. package/esm2022/lib/search/index.mjs +0 -10
  488. package/esm2022/lib/search/search-bar/search-bar.component.mjs +0 -483
  489. package/esm2022/lib/search/search-bar/search-bar.module.mjs +0 -19
  490. package/esm2022/lib/search/search-results/index.mjs +0 -5
  491. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +0 -101
  492. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +0 -427
  493. package/esm2022/lib/search/search-results/search-results-item.component.mjs +0 -119
  494. package/esm2022/lib/search/search-results/search-results.component.mjs +0 -297
  495. package/esm2022/lib/search/search-results/search-results.directive.mjs +0 -7
  496. package/esm2022/lib/search/search-results/search-results.module.mjs +0 -20
  497. package/esm2022/lib/search/search-selector/search-selector.component.mjs +0 -118
  498. package/esm2022/lib/search/search-selector/search-selector.module.mjs +0 -19
  499. package/esm2022/lib/search/search-settings/search-settings.component.mjs +0 -264
  500. package/esm2022/lib/search/search-settings/search-settings.module.mjs +0 -19
  501. package/esm2022/lib/search/search.module.mjs +0 -77
  502. package/esm2022/lib/search/shared/index.mjs +0 -10
  503. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +0 -337
  504. package/esm2022/lib/search/shared/search-source-service.providers.mjs +0 -20
  505. package/esm2022/lib/search/shared/search-source.service.mjs +0 -56
  506. package/esm2022/lib/search/shared/search.enums.mjs +0 -4
  507. package/esm2022/lib/search/shared/search.interfaces.mjs +0 -2
  508. package/esm2022/lib/search/shared/search.provider.mjs +0 -20
  509. package/esm2022/lib/search/shared/search.service.mjs +0 -149
  510. package/esm2022/lib/search/shared/search.utils.mjs +0 -92
  511. package/esm2022/lib/search/shared/sources/cadastre.mjs +0 -142
  512. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +0 -32
  513. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +0 -2
  514. package/esm2022/lib/search/shared/sources/coordinates.mjs +0 -168
  515. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +0 -52
  516. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +0 -32
  517. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +0 -2
  518. package/esm2022/lib/search/shared/sources/icherche.mjs +0 -816
  519. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +0 -87
  520. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +0 -2
  521. package/esm2022/lib/search/shared/sources/ilayer.mjs +0 -339
  522. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +0 -58
  523. package/esm2022/lib/search/shared/sources/index.mjs +0 -23
  524. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +0 -2
  525. package/esm2022/lib/search/shared/sources/nominatim.mjs +0 -263
  526. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +0 -31
  527. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +0 -13
  528. package/esm2022/lib/search/shared/sources/source.mjs +0 -221
  529. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +0 -2
  530. package/esm2022/lib/search/shared/sources/storedqueries.mjs +0 -454
  531. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +0 -56
  532. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +0 -2
  533. package/esm2022/lib/search/shared/sources/workspace.mjs +0 -192
  534. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +0 -31
  535. package/esm2022/lib/style/index.mjs +0 -5
  536. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +0 -360
  537. package/esm2022/lib/style/shared/datasource/index.mjs +0 -2
  538. package/esm2022/lib/style/shared/feature/feature-style.mjs +0 -162
  539. package/esm2022/lib/style/shared/feature/index.mjs +0 -2
  540. package/esm2022/lib/style/shared/font.enum.mjs +0 -17
  541. package/esm2022/lib/style/shared/index.mjs +0 -5
  542. package/esm2022/lib/style/shared/overlay/index.mjs +0 -3
  543. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +0 -39
  544. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +0 -88
  545. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +0 -78
  546. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +0 -27
  547. package/esm2022/lib/style/shared/vector/index.mjs +0 -4
  548. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +0 -2
  549. package/esm2022/lib/style/style-list/index.mjs +0 -5
  550. package/esm2022/lib/style/style-list/style-list.interface.mjs +0 -2
  551. package/esm2022/lib/style/style-list/style-list.module.mjs +0 -23
  552. package/esm2022/lib/style/style-list/style-list.provider.mjs +0 -21
  553. package/esm2022/lib/style/style-list/style-list.service.mjs +0 -52
  554. package/esm2022/lib/style/style-modal/drawing/index.mjs +0 -2
  555. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +0 -193
  556. package/esm2022/lib/style/style-modal/index.mjs +0 -5
  557. package/esm2022/lib/style/style-modal/layer/index.mjs +0 -2
  558. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +0 -142
  559. package/esm2022/lib/style/style-modal/layer-button/index.mjs +0 -2
  560. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +0 -44
  561. package/esm2022/lib/style/style-modal/shared/index.mjs +0 -2
  562. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +0 -2
  563. package/esm2022/lib/style/style-service/draw-style.service.mjs +0 -255
  564. package/esm2022/lib/style/style-service/index.mjs +0 -3
  565. package/esm2022/lib/style/style-service/style.service.mjs +0 -393
  566. package/esm2022/lib/style/style.module.mjs +0 -46
  567. package/esm2022/lib/toast/index.mjs +0 -2
  568. package/esm2022/lib/toast/toast.component.mjs +0 -99
  569. package/esm2022/lib/toast/toast.module.mjs +0 -24
  570. package/esm2022/lib/utils/googleLinks.mjs +0 -13
  571. package/esm2022/lib/utils/id-generator.mjs +0 -112
  572. package/esm2022/lib/utils/index.mjs +0 -5
  573. package/esm2022/lib/utils/osmLinks.mjs +0 -9
  574. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +0 -3
  575. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +0 -2
  576. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +0 -64
  577. package/esm2022/lib/wkt/index.mjs +0 -2
  578. package/esm2022/lib/wkt/shared/index.mjs +0 -2
  579. package/esm2022/lib/wkt/shared/wkt.service.mjs +0 -235
  580. package/esm2022/lib/wkt/wkt.module.mjs +0 -25
  581. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +0 -36
  582. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +0 -19
  583. package/esm2022/lib/workspace/confirmation-popup/index.mjs +0 -3
  584. package/esm2022/lib/workspace/index.mjs +0 -8
  585. package/esm2022/lib/workspace/shared/edition-workspace.mjs +0 -299
  586. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +0 -718
  587. package/esm2022/lib/workspace/shared/feature-workspace.mjs +0 -41
  588. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +0 -113
  589. package/esm2022/lib/workspace/shared/index.mjs +0 -8
  590. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +0 -41
  591. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +0 -106
  592. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +0 -230
  593. package/esm2022/lib/workspace/shared/workspace.utils.mjs +0 -185
  594. package/esm2022/lib/workspace/widgets/index.mjs +0 -4
  595. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +0 -48
  596. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +0 -19
  597. package/esm2022/lib/workspace/widgets/widgets.mjs +0 -15
  598. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +0 -168
  599. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
  600. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +0 -136
  601. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +0 -19
  602. package/esm2022/lib/workspace/workspace.module.mjs +0 -32
  603. package/esm2022/public_api.mjs +0 -56
  604. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +0 -19
  605. package/lib/layer/layer-list/layer-list.enum.d.ts +0 -15
  606. package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +0 -5
  607. package/src/lib/layer/layer-legend/layer-legend.theming.scss +0 -10
@@ -1,865 +0,0 @@
1
- import { AsyncPipe, KeyValuePipe, NgClass, NgFor, NgIf } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { FormControl, FormsModule, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatButtonToggleModule } from '@angular/material/button-toggle';
6
- import { MatOptionModule } from '@angular/material/core';
7
- import { MatFormFieldModule } from '@angular/material/form-field';
8
- import { MatInputModule } from '@angular/material/input';
9
- import { MatSelectModule } from '@angular/material/select';
10
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
11
- import { MatTooltipModule } from '@angular/material/tooltip';
12
- import { ConfirmDialogService } from '@igo2/common/confirm-dialog';
13
- import { CustomHtmlComponent } from '@igo2/common/custom-html';
14
- import { SpinnerComponent } from '@igo2/common/spinner';
15
- import { ConfigService } from '@igo2/core/config';
16
- import { LanguageService } from '@igo2/core/language';
17
- import { IgoLanguageModule } from '@igo2/core/language';
18
- import { MessageService } from '@igo2/core/message';
19
- import { StorageService } from '@igo2/core/storage';
20
- import olPoint from 'ol/geom/Point';
21
- import { BehaviorSubject, lastValueFrom } from 'rxjs';
22
- import { skipWhile } from 'rxjs/operators';
23
- import { DownloadService } from '../../download/shared/download.service';
24
- import { LayerService } from '../../layer/shared/layer.service';
25
- import { VectorLayer } from '../../layer/shared/layers/vector-layer';
26
- import { computeProjectionsConstraints } from '../../map/shared';
27
- import { IgoMap } from '../../map/shared/map';
28
- import { StyleListService } from '../../style/style-list/style-list.service';
29
- import { StyleService } from '../../style/style-service/style.service';
30
- import { ExportService } from '../shared/export.service';
31
- import { CsvSeparator, ExportFormat, ExportFormatLegacy } from '../shared/export.type';
32
- import { handleFileExportError, handleFileExportSuccess, isCsvExport } from '../shared/export.utils';
33
- import { ImportService } from '../shared/import.service';
34
- import { handleFileImportError, handleFileImportSuccess } from '../shared/import.utils';
35
- import * as i0 from "@angular/core";
36
- import * as i1 from "../shared/import.service";
37
- import * as i2 from "../shared/export.service";
38
- import * as i3 from "@igo2/core/language";
39
- import * as i4 from "@igo2/core/message";
40
- import * as i5 from "../../style/style-list/style-list.service";
41
- import * as i6 from "../../style/style-service/style.service";
42
- import * as i7 from "@angular/forms";
43
- import * as i8 from "@igo2/core/config";
44
- import * as i9 from "@igo2/core/storage";
45
- import * as i10 from "../../download/shared/download.service";
46
- import * as i11 from "../../layer/shared/layer.service";
47
- import * as i12 from "@igo2/common/confirm-dialog";
48
- import * as i13 from "@angular/material/button-toggle";
49
- import * as i14 from "@angular/material/form-field";
50
- import * as i15 from "@angular/material/select";
51
- import * as i16 from "@angular/material/core";
52
- import * as i17 from "@angular/material/tooltip";
53
- import * as i18 from "@angular/material/button";
54
- import * as i19 from "@angular/material/slide-toggle";
55
- import * as i20 from "@angular/material/input";
56
- import * as i21 from "@ngx-translate/core";
57
- export class ImportExportComponent {
58
- importService;
59
- exportService;
60
- languageService;
61
- messageService;
62
- styleListService;
63
- styleService;
64
- formBuilder;
65
- config;
66
- storageService;
67
- downloadService;
68
- layerService;
69
- confirmDialogService;
70
- form;
71
- importForm;
72
- formats$ = new BehaviorSubject(undefined);
73
- exportableLayers$ = new BehaviorSubject([]);
74
- loading$ = new BehaviorSubject(false);
75
- forceNaming = false;
76
- controlFormat = 'format';
77
- csvSeparators = CsvSeparator;
78
- isCsvExport = isCsvExport;
79
- layers$$;
80
- exportableLayers$$;
81
- formats$$;
82
- formLayer$$;
83
- exportOptions$$;
84
- importHtmlClarifications;
85
- exportHtmlClarifications;
86
- espgCodeRegex = new RegExp('^\\d{4,6}');
87
- clientSideFileSizeMax;
88
- fileSizeMb;
89
- projections$ = new BehaviorSubject([]);
90
- projectionsConstraints;
91
- popupChecked = false;
92
- configFormats;
93
- previousLayerSpecs$ = new BehaviorSubject(undefined);
94
- selectFirstProj = false;
95
- map;
96
- contextUri;
97
- _projectionsLimitations = {};
98
- set projectionsLimitations(value) {
99
- this._projectionsLimitations = value;
100
- this.computeProjections();
101
- }
102
- get projectionsLimitations() {
103
- return this._projectionsLimitations || {};
104
- }
105
- /**
106
- * Store that holds the available workspaces.
107
- */
108
- store;
109
- selectedMode = 'import';
110
- selectMode = new EventEmitter();
111
- exportOptions$ = new BehaviorSubject(undefined);
112
- exportOptionsChange = new EventEmitter();
113
- get layers() {
114
- return this.form.get('layers').value;
115
- }
116
- set layers(value) {
117
- this.form.patchValue({ layers: value });
118
- }
119
- get inputProj() {
120
- return this.importForm.get('inputProj').value;
121
- }
122
- set inputProj(value) {
123
- this.importForm.patchValue({ inputProj: value });
124
- }
125
- get popupAllowed() {
126
- return (this.storageService.get('importExportPopupAllowed') || false);
127
- }
128
- set popupAllowed(value) {
129
- this.storageService.set('importExportPopupAllowed', value);
130
- }
131
- constructor(importService, exportService, languageService, messageService, styleListService, styleService, formBuilder, config, storageService, downloadService, layerService, confirmDialogService) {
132
- this.importService = importService;
133
- this.exportService = exportService;
134
- this.languageService = languageService;
135
- this.messageService = messageService;
136
- this.styleListService = styleListService;
137
- this.styleService = styleService;
138
- this.formBuilder = formBuilder;
139
- this.config = config;
140
- this.storageService = storageService;
141
- this.downloadService = downloadService;
142
- this.layerService = layerService;
143
- this.confirmDialogService = confirmDialogService;
144
- this.loadConfig();
145
- this.buildForm();
146
- this.computeProjections();
147
- this.importHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.importHtmlClarifications');
148
- this.exportHtmlClarifications = this.languageService.translate.instant('igo.geo.importExportForm.exportHtmlClarifications');
149
- }
150
- ngOnInit() {
151
- this.layers$$ = this.map.layers$.subscribe((layers) => {
152
- this.exportableLayers$.next(layers.filter((layer) => {
153
- return ((layer instanceof VectorLayer && layer.exportable === true) ||
154
- (layer.dataSource.options.download &&
155
- layer.dataSource.options.download.url));
156
- }));
157
- });
158
- const configFileSizeMb = this.config.getConfig('importExport.clientSideFileSizeMaxMb');
159
- this.clientSideFileSizeMax =
160
- (configFileSizeMb ? configFileSizeMb : 30) * Math.pow(1024, 2);
161
- this.fileSizeMb = this.clientSideFileSizeMax / Math.pow(1024, 2);
162
- this.exportOptions$$ = this.exportOptions$
163
- .pipe(skipWhile((exportOptions) => !exportOptions))
164
- .subscribe((exportOptions) => {
165
- this.form.patchValue(exportOptions, { emitEvent: true });
166
- if (exportOptions.layers) {
167
- this.computeFormats(exportOptions.layers.map((l) => this.map.getLayerById(l)));
168
- }
169
- });
170
- this.formLayer$$ = this.form
171
- .get('format')
172
- .valueChanges.subscribe((format) => {
173
- if (!this.popupChecked &&
174
- this.form.get('layers').value?.length > 1 &&
175
- this.isOgreOrLink(format)) {
176
- if (!this.handlePopup(true)) {
177
- this.form.patchValue({ format: undefined }, { emitEvent: false });
178
- }
179
- }
180
- });
181
- this.formLayer$$ = this.form
182
- .get('layers')
183
- .valueChanges.subscribe((layersId) => {
184
- this.handlePreviousLayerSpecs();
185
- const selectedLayers = layersId instanceof Array ? layersId : [layersId];
186
- this.form.patchValue({ layers: selectedLayers }, { emitEvent: false });
187
- const layers = selectedLayers.map((l) => this.map.getLayerById(l));
188
- this.computeFormats(layers);
189
- if (this.formats$.value.indexOf(this.form.value.format) === -1) {
190
- this.form.patchValue({ format: undefined });
191
- }
192
- this.loading$.next(true);
193
- const previousSpecs = [];
194
- layers.forEach((layer) => {
195
- if (layer instanceof VectorLayer &&
196
- layer.dataSource.ol.getFeatures().length === 0) {
197
- previousSpecs.push({
198
- id: layer.id,
199
- visible: layer.visible,
200
- opacity: layer.opacity,
201
- queryable: layer.queryable
202
- });
203
- layer.opacity = 0;
204
- layer.visible = true;
205
- }
206
- });
207
- this.previousLayerSpecs$.next(previousSpecs);
208
- setTimeout(() => {
209
- this.loading$.next(false);
210
- }, 500);
211
- });
212
- this.formats$$ = this.formats$
213
- .pipe(skipWhile((formats) => !formats))
214
- .subscribe((formats) => {
215
- if (formats.length === 1) {
216
- this.form.patchValue({ format: formats[0] });
217
- }
218
- });
219
- this.exportableLayers$$ = this.exportableLayers$
220
- .pipe(skipWhile((layers) => !layers))
221
- .subscribe((layers) => {
222
- if (layers.length === 1) {
223
- this.form.patchValue({ layers: layers[0].id });
224
- }
225
- });
226
- if (this.selectFirstProj) {
227
- if (this.projections$.value.length === 0) {
228
- this.importForm.patchValue({
229
- inputProj: {
230
- translateKey: 'nad83',
231
- alias: 'NAD83',
232
- code: 'EPSG:4326',
233
- zone: ''
234
- }
235
- });
236
- }
237
- else {
238
- this.importForm.patchValue({ inputProj: this.projections$.value[0] });
239
- }
240
- }
241
- else {
242
- this.importForm.patchValue({ inputProj: undefined });
243
- }
244
- }
245
- computeProjections() {
246
- this.projectionsConstraints = computeProjectionsConstraints(this.projectionsLimitations);
247
- const projections = [];
248
- if (this.projectionsConstraints.nad83) {
249
- projections.push({
250
- translateKey: 'nad83',
251
- alias: 'NAD83',
252
- code: 'EPSG:4269',
253
- zone: '',
254
- extent: undefined,
255
- def: undefined
256
- });
257
- }
258
- if (this.projectionsConstraints.wgs84) {
259
- projections.push({
260
- translateKey: 'wgs84',
261
- alias: 'WGS84',
262
- code: 'EPSG:4326',
263
- zone: '',
264
- extent: undefined,
265
- def: undefined
266
- });
267
- }
268
- if (this.projectionsConstraints.webMercator) {
269
- projections.push({
270
- translateKey: 'webMercator',
271
- alias: 'Web Mercator',
272
- code: 'EPSG:3857',
273
- zone: '',
274
- extent: undefined,
275
- def: undefined
276
- });
277
- }
278
- if (this.projectionsConstraints.mtm) {
279
- // all mtm zones
280
- const minZone = this.projectionsConstraints.mtmZone.minZone;
281
- const maxZone = this.projectionsConstraints.mtmZone.maxZone;
282
- for (let mtmZone = minZone; mtmZone <= maxZone; mtmZone++) {
283
- const code = mtmZone < 10 ? `EPSG:3218${mtmZone}` : `EPSG:321${80 + mtmZone}`;
284
- projections.push({
285
- translateKey: 'mtm',
286
- alias: `MTM ${mtmZone}`,
287
- code,
288
- zone: `${mtmZone}`,
289
- extent: undefined,
290
- def: undefined
291
- });
292
- }
293
- }
294
- if (this.projectionsConstraints.utm) {
295
- // all utm zones
296
- const minZone = this.projectionsConstraints.utmZone.minZone;
297
- const maxZone = this.projectionsConstraints.utmZone.maxZone;
298
- for (let utmZone = minZone; utmZone <= maxZone; utmZone++) {
299
- const code = utmZone < 10 ? `EPSG:3260${utmZone}` : `EPSG:326${utmZone}`;
300
- projections.push({
301
- translateKey: 'utm',
302
- alias: `UTM ${utmZone}`,
303
- code,
304
- zone: `${utmZone}`,
305
- extent: undefined,
306
- def: undefined
307
- });
308
- }
309
- }
310
- let configProjection = [];
311
- if (this.projectionsConstraints.projFromConfig) {
312
- configProjection = (this.config.getConfig('projections') ||
313
- []);
314
- }
315
- this.projections$.next(configProjection.concat(projections));
316
- }
317
- getLayerTitleById(id) {
318
- return this.map.getLayerById(id)?.title;
319
- }
320
- layerHasSelectedFeatures(layer) {
321
- const wksFromLayer = this.exportService.getWorkspaceByLayerId(layer.id, this.store);
322
- if (wksFromLayer) {
323
- const recs = wksFromLayer.entityStore.stateView.firstBy((record) => {
324
- return record.state.selected === true;
325
- });
326
- return recs ? true : false;
327
- }
328
- }
329
- onlySelected(event, id) {
330
- let layersWithSelection = this.form.value.layersWithSelection;
331
- if (event.checked) {
332
- layersWithSelection.push(id);
333
- }
334
- else {
335
- layersWithSelection = layersWithSelection.filter((layerId) => layerId !== id);
336
- }
337
- this.form.patchValue({ layersWithSelection });
338
- }
339
- onlySelectedClick(event, id) {
340
- if (this.form.value.layers.find((layerId) => layerId === id)) {
341
- event.stopPropagation();
342
- }
343
- }
344
- inLayersIdToExportSelectionOnly(layer) {
345
- return this.form.value.layersWithSelection.find((layerId) => layerId === layer.id)
346
- ? true
347
- : false;
348
- }
349
- ngOnDestroy() {
350
- this.layers$$.unsubscribe();
351
- this.exportableLayers$$.unsubscribe();
352
- this.formats$$.unsubscribe();
353
- this.formLayer$$.unsubscribe();
354
- if (this.exportOptions$$) {
355
- this.exportOptions$$.unsubscribe();
356
- }
357
- this.exportOptionsChange.emit(this.form.value);
358
- this.handlePreviousLayerSpecs();
359
- }
360
- handlePreviousLayerSpecs() {
361
- const previousSpecs = this.previousLayerSpecs$.value;
362
- if (previousSpecs && previousSpecs.length) {
363
- previousSpecs.forEach((specs) => {
364
- const previousLayer = this.map.getLayerById(specs.id);
365
- previousLayer.visible = specs.visible;
366
- previousLayer.opacity = specs.opacity;
367
- previousLayer.queryable = specs.queryable;
368
- });
369
- }
370
- this.previousLayerSpecs$.next(undefined);
371
- }
372
- importFiles(files) {
373
- let inputProj = this.inputProj.code;
374
- if (this.espgCodeRegex.test(inputProj)) {
375
- inputProj = `EPSG:${inputProj}`;
376
- }
377
- this.loading$.next(true);
378
- for (const file of files) {
379
- this.importService.import(file, inputProj).subscribe((features) => this.onFileImportSuccess(file, features), (error) => this.onFileImportError(file, error), () => {
380
- this.loading$.next(false);
381
- });
382
- }
383
- }
384
- handlePopup(preCheck = true) {
385
- const p1 = window.open('', 'popup', 'width=1, height=1');
386
- p1.close();
387
- const p2 = window.open('', 'popup', 'width=1, height=1');
388
- if (!p2 || p2.closed || typeof p2.closed === 'undefined' || p2 === null) {
389
- this.onPopupBlockedError(preCheck);
390
- this.popupAllowed = false;
391
- }
392
- else {
393
- p2.close();
394
- this.popupAllowed = true;
395
- this.popupChecked = true;
396
- }
397
- return this.popupAllowed;
398
- }
399
- isOgreOrLink(format) {
400
- const ogreFormats = Object.keys(ExportService.ogreFormats);
401
- return ogreFormats.indexOf(format) >= 0 || format === 'URL';
402
- }
403
- async handleExportFormSubmit(data) {
404
- this.loading$.next(true);
405
- if (!this.popupChecked &&
406
- data.layers.length > 1 &&
407
- this.isOgreOrLink(data.format) &&
408
- !this.popupAllowed) {
409
- this.handlePopup();
410
- }
411
- const isCSV = isCsvExport(data.format);
412
- if (data.format === 'Excel') {
413
- try {
414
- await this.exportService.exportExcel(this.map, this.store, data);
415
- this.loading$.next(false);
416
- return this.onFileExportSuccess();
417
- }
418
- catch (error) {
419
- this.onFileExportError(error);
420
- throw error;
421
- }
422
- }
423
- let fileName = '';
424
- for (const layerId of data.layers) {
425
- this.loading$.next(true);
426
- const layer = this.map.getLayerById(layerId);
427
- const features = await lastValueFrom(this.exportService.getFeatures(this.map, layer, data, this.store)).catch((error) => {
428
- this.onFileExportError(error);
429
- throw error;
430
- });
431
- const geomTypes = this.exportService.getGeomTypes(features, data.format);
432
- if (!isCSV || !data.combineLayers || data.layers.length === 1) {
433
- fileName = layer.title;
434
- if (data.name) {
435
- fileName = data.name;
436
- }
437
- }
438
- else {
439
- fileName = this.languageService.translate.instant('igo.geo.export.combinedLayers');
440
- }
441
- if (data.format === 'URL') {
442
- this.handleUrlExport(layer);
443
- }
444
- if (data.format === 'GPX') {
445
- this.validateGpxExport(geomTypes);
446
- }
447
- if (geomTypes.length === 0) {
448
- this.loading$.next(false);
449
- this.messageService.error('igo.geo.export.nothing.text', 'igo.geo.export.nothing.title', { timeOut: 20000 });
450
- }
451
- if (!isCSV || !data.combineLayers) {
452
- geomTypes.forEach((geomType) => {
453
- if (geomType.type) {
454
- fileName += geomType.type;
455
- }
456
- this.handleExport(geomType.features, data, fileName);
457
- });
458
- }
459
- this.loading$.next(false);
460
- }
461
- if (isCSV) {
462
- this.handleCsvExport(data, fileName);
463
- }
464
- }
465
- handleUrlExport(layer) {
466
- const { download = null } = layer.dataSource.options;
467
- if (download?.url || download?.dynamicUrl) {
468
- setTimeout(() => {
469
- const url = download.url ?? download.dynamicUrl;
470
- url.match(/service=wfs/gi)
471
- ? this.downloadService.open(layer)
472
- : window.open(url, '_blank');
473
- this.loading$.next(false);
474
- }, 500);
475
- return;
476
- }
477
- }
478
- validateGpxExport(geomTypes) {
479
- const gpxFeatureCnt = geomTypes.length;
480
- geomTypes = geomTypes.filter((geomType) => ['LineString', 'Point'].includes(geomType.type));
481
- const gpxFeatureCntPointOrPoly = geomTypes.length;
482
- if (gpxFeatureCnt > gpxFeatureCntPointOrPoly) {
483
- this.messageService.error('igo.geo.export.gpx.error.poly.text', 'igo.geo.export.gpx.error.poly.title', { timeOut: 20000 });
484
- }
485
- }
486
- async handleCsvExport(data, fileName) {
487
- const featuresCSV = [];
488
- if (data.combineLayers) {
489
- let previousFeature = undefined;
490
- const geomTypes = await this.getAllLayerGeomTypes(data);
491
- geomTypes.forEach((geomType) => {
492
- geomType.features.forEach((currentFeature) => {
493
- if (data.separator) {
494
- if (previousFeature) {
495
- if (currentFeature.get('_featureStore').layer.options.title !==
496
- previousFeature.get('_featureStore').layer.options.title) {
497
- const titleEmptyRows = this.createTitleEmptyRows(previousFeature, currentFeature);
498
- featuresCSV.push(titleEmptyRows[2]);
499
- featuresCSV.push(titleEmptyRows[0]);
500
- featuresCSV.push(titleEmptyRows[1]);
501
- }
502
- }
503
- else {
504
- const titleEmptyRows = this.createTitleEmptyRows(currentFeature, currentFeature);
505
- featuresCSV.push(titleEmptyRows[0]);
506
- }
507
- }
508
- featuresCSV.push(currentFeature);
509
- previousFeature = currentFeature;
510
- });
511
- });
512
- }
513
- this.handleExport(featuresCSV, data, fileName);
514
- }
515
- handleExport(features, options, fileName) {
516
- this.exportService
517
- .export(features, options, fileName, this.map.projectionCode)
518
- .subscribe({
519
- error: (error) => this.onFileExportError(error),
520
- complete: () => {
521
- this.onFileExportSuccess();
522
- features.forEach((feature) => {
523
- this.circleToPoint(feature);
524
- });
525
- this.loading$.next(false);
526
- }
527
- });
528
- }
529
- async getAllLayerGeomTypes(data) {
530
- return data.layers.reduce(async (typesPromise, layerId) => {
531
- const types = await typesPromise;
532
- const layer = this.map.getLayerById(layerId);
533
- const features = await lastValueFrom(this.exportService.getFeatures(this.map, layer, data, this.store)).catch((error) => {
534
- this.onFileExportError(error);
535
- throw error;
536
- });
537
- const geomTypes = this.exportService.getGeomTypes(features, data.format);
538
- return types.concat(geomTypes);
539
- }, Promise.resolve([]));
540
- }
541
- createTitleEmptyRows(previousFeature, currentFeature) {
542
- const titleRow = currentFeature.clone();
543
- const headerRow = currentFeature.clone();
544
- const emptyRow = currentFeature.clone();
545
- const previousFeatureKeys = previousFeature.getKeys();
546
- let firstKeyPrevious = '';
547
- for (const key in previousFeatureKeys) {
548
- if (previousFeatureKeys[key] !== 'geometry') {
549
- firstKeyPrevious = previousFeatureKeys[key];
550
- break;
551
- }
552
- }
553
- const currentFeatureKeys = currentFeature.getKeys();
554
- let firstKeyCurrent = '';
555
- for (const key in currentFeatureKeys) {
556
- if (currentFeatureKeys[key] !== 'geometry') {
557
- firstKeyCurrent = currentFeatureKeys[key];
558
- break;
559
- }
560
- }
561
- const allKeys = currentFeature.getKeys();
562
- previousFeatureKeys.forEach((previousKey) => {
563
- if (allKeys.includes(previousKey) && previousKey !== firstKeyPrevious) {
564
- allKeys.push(previousKey);
565
- }
566
- });
567
- allKeys.unshift(firstKeyPrevious);
568
- let firstKeyAll = '';
569
- for (const key in allKeys) {
570
- if (allKeys[key] !== 'geometry') {
571
- firstKeyAll = allKeys[key];
572
- break;
573
- }
574
- }
575
- allKeys.forEach((key) => {
576
- const sameKeys = previousFeatureKeys.length === currentFeatureKeys.length &&
577
- previousFeatureKeys.every((value, index) => value === currentFeatureKeys[index]);
578
- if (key === firstKeyAll && !sameKeys) {
579
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title +
580
- ' ===============>', true);
581
- headerRow.set(key, key, true);
582
- emptyRow.unset(key, true);
583
- }
584
- else if (key === firstKeyAll && sameKeys) {
585
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
586
- headerRow.set(key, key, true);
587
- emptyRow.unset(key, true);
588
- }
589
- else if (key === firstKeyCurrent) {
590
- titleRow.set(key, currentFeature.get('_featureStore').layer.options.title, true);
591
- headerRow.set(key, key, true);
592
- emptyRow.unset(key, true);
593
- }
594
- else if (key !== 'geometry') {
595
- titleRow.unset(key, true);
596
- headerRow.set(key, key, true);
597
- emptyRow.unset(key, true);
598
- }
599
- else {
600
- titleRow.unset(key, true);
601
- emptyRow.unset(key, true);
602
- }
603
- if (!currentFeatureKeys.includes(key)) {
604
- headerRow.unset(key, true);
605
- }
606
- });
607
- const titleEmptyRows = [titleRow, headerRow, emptyRow];
608
- return titleEmptyRows;
609
- }
610
- circleToPoint(feature) {
611
- const radius = feature.get('rad');
612
- if (radius) {
613
- const point = new olPoint([
614
- feature.get('longitude'),
615
- feature.get('latitude')
616
- ]);
617
- point.transform('EPSG:4326', feature.get('_projection'));
618
- feature.setGeometry(point);
619
- }
620
- }
621
- buildForm() {
622
- this.importForm = this.formBuilder.group({
623
- inputProj: ['', [Validators.required]]
624
- });
625
- const form = this.formBuilder.group({
626
- format: ['', [Validators.required]],
627
- layers: [[], [Validators.required]],
628
- layersWithSelection: [[]],
629
- combineLayers: [true, [Validators.required]],
630
- separator: [false, [Validators.required]],
631
- featureInMapExtent: [false, [Validators.required]]
632
- });
633
- if (this.forceNaming) {
634
- form.addControl('name', new FormControl('', [Validators.required]));
635
- }
636
- form
637
- .get('format')
638
- .valueChanges.subscribe((format) => this.handleCsvForm(form, format));
639
- this.form = form;
640
- }
641
- handleCsvForm(form, format) {
642
- format === 'CSV'
643
- ? form.addControl('csvSeparator', new FormControl('auto', [Validators.required]))
644
- : form.removeControl('csvSeparator');
645
- }
646
- onFileImportSuccess(file, features) {
647
- const importExportOptions = this.config.getConfig('importExport');
648
- const confirmDialogService = importExportOptions?.allowToStoreLayer
649
- ? this.confirmDialogService
650
- : undefined;
651
- if (!importExportOptions?.importWithStyle) {
652
- handleFileImportSuccess(file, features, this.map, this.contextUri, this.messageService, this.layerService, confirmDialogService);
653
- }
654
- else {
655
- handleFileImportSuccess(file, features, this.map, this.contextUri, this.messageService, this.layerService, confirmDialogService, this.styleListService, this.styleService);
656
- }
657
- }
658
- onFileImportError(file, error) {
659
- this.loading$.next(false);
660
- handleFileImportError(file, error, this.messageService, this.fileSizeMb);
661
- }
662
- onPopupBlockedError(preCheck = true) {
663
- this.loading$.next(false);
664
- const extraMessage = preCheck
665
- ? 'igo.geo.export.popupBlocked.selectAgain'
666
- : 'igo.geo.export.popupBlocked.retry';
667
- this.messageService.error('igo.geo.export.popupBlocked.text', 'igo.geo.export.popupBlocked.title', { timeOut: 20000 }, { extraMessage });
668
- }
669
- onFileExportError(error) {
670
- this.loading$.next(false);
671
- handleFileExportError(error, this.messageService);
672
- }
673
- loadConfig() {
674
- const forceNamingConfig = this.config.getConfig('importExport.forceNaming');
675
- this.forceNaming =
676
- forceNamingConfig !== undefined ? forceNamingConfig : false;
677
- this.configFormats = this.config.getConfig('importExport.formats');
678
- this.computeFormats();
679
- }
680
- computeFormats(layers) {
681
- let appliedformats = [...ExportFormat];
682
- const formatsType = {
683
- onlyUrl: false,
684
- onlyVector: false,
685
- vectorAndUrl: false,
686
- customList: false
687
- };
688
- const customList = [];
689
- if (layers?.length) {
690
- layers.forEach((layer) => {
691
- if (!layer) {
692
- return;
693
- }
694
- if (layer.dataSource.options.download?.allowedFormats) {
695
- formatsType.customList = true;
696
- customList.push({
697
- layer: layer.title,
698
- formats: this.validateListFormat(layer.dataSource.options.download.allowedFormats)
699
- });
700
- }
701
- else if (!(layer instanceof VectorLayer) &&
702
- layer.dataSource.options.download &&
703
- layer.dataSource.options.download.url) {
704
- formatsType.onlyUrl = true;
705
- }
706
- else if (layer.dataSource.options.download &&
707
- (layer.dataSource.options.download.url ||
708
- layer.dataSource.options.download.dynamicUrl)) {
709
- formatsType.vectorAndUrl = true;
710
- }
711
- else if (layer instanceof VectorLayer) {
712
- formatsType.onlyVector = true;
713
- }
714
- });
715
- const hasUrl = this.formats$.value.includes('URL');
716
- if (formatsType.onlyUrl === true && formatsType.onlyVector === false) {
717
- appliedformats = ['URL'];
718
- }
719
- else if (formatsType.onlyVector === true &&
720
- formatsType.onlyUrl === false) {
721
- this.computeFormats(); // reset
722
- if (hasUrl) {
723
- appliedformats = [...this.formats$.value].filter((key) => key !== 'URL');
724
- }
725
- }
726
- else if (formatsType.vectorAndUrl === true &&
727
- formatsType.onlyUrl === false &&
728
- formatsType.onlyVector === false) {
729
- this.computeFormats(); // reset
730
- if (!hasUrl) {
731
- const keys = [...this.formats$.value];
732
- keys.push('URL');
733
- appliedformats = keys;
734
- }
735
- }
736
- }
737
- appliedformats = this.getAvailableFormats(appliedformats);
738
- if (formatsType.customList) {
739
- let commonFormats;
740
- const layersWithCustomFormats = [];
741
- let previousCustomListFormats = customList[0].formats;
742
- customList.map((list) => {
743
- layersWithCustomFormats.push(list.layer);
744
- commonFormats = list.formats.filter((value) => previousCustomListFormats.includes(value));
745
- previousCustomListFormats = list.formats;
746
- });
747
- const finalFormats = commonFormats.filter((value) => appliedformats.includes(value));
748
- if (finalFormats.length > 0) {
749
- this.formats$.next(finalFormats);
750
- if (layers && layers.length) {
751
- if (layers.length > 1) {
752
- this.messageService.alert('igo.geo.export.customList.text', 'igo.geo.export.customList.title', undefined, { value: layersWithCustomFormats.join() });
753
- }
754
- }
755
- }
756
- else {
757
- this.formats$.next([]);
758
- this.messageService.alert('igo.geo.export.noFormat.text', 'igo.geo.export.noFormat.title');
759
- }
760
- return;
761
- }
762
- else {
763
- this.formats$.next(appliedformats);
764
- }
765
- }
766
- getAvailableFormats(layerFormats) {
767
- if (!this.configFormats) {
768
- return layerFormats;
769
- }
770
- const availableFormats = this.validateListFormat(this.configFormats);
771
- return layerFormats.filter((layerFormat) => availableFormats.includes(layerFormat));
772
- }
773
- validateListFormat(formats) {
774
- const allUppercaseFormats = [...ExportFormat, ...ExportFormatLegacy].map((f) => f.toUpperCase());
775
- return formats
776
- .filter((format) => {
777
- if (allUppercaseFormats.includes(format.toUpperCase())) {
778
- return format;
779
- }
780
- })
781
- .map((format) => {
782
- const csvFormats = ['CSV', 'CSVcomma', 'CSVsemicolon'].map((f) => f.toUpperCase());
783
- if (csvFormats.includes(format.toUpperCase())) {
784
- return 'CSV';
785
- }
786
- else if (this.compareString('Excel', format)) {
787
- return 'Excel';
788
- }
789
- else if (this.compareString('GML', format)) {
790
- return 'GML';
791
- }
792
- else if (this.compareString('GPX', format)) {
793
- return 'GPX';
794
- }
795
- else if (this.compareString('GeoJSON', format)) {
796
- return 'GeoJSON';
797
- }
798
- else if (this.compareString('KML', format)) {
799
- return 'KML';
800
- }
801
- else if (this.compareString('Shapefile', format)) {
802
- return 'Shapefile';
803
- }
804
- else if (this.compareString('URL', format)) {
805
- return 'URL';
806
- }
807
- });
808
- }
809
- compareString(value1, value2) {
810
- return value1.toUpperCase() === value2.toUpperCase();
811
- }
812
- modeChanged(mode) {
813
- this.selectMode.emit(mode);
814
- }
815
- onFileExportSuccess() {
816
- handleFileExportSuccess(this.messageService);
817
- }
818
- onImportExportChange(event) {
819
- this.selectedMode = event.value;
820
- }
821
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportExportComponent, deps: [{ token: i1.ImportService }, { token: i2.ExportService }, { token: i3.LanguageService }, { token: i4.MessageService }, { token: i5.StyleListService }, { token: i6.StyleService }, { token: i7.UntypedFormBuilder }, { token: i8.ConfigService }, { token: i9.StorageService }, { token: i10.DownloadService }, { token: i11.LayerService }, { token: i12.ConfirmDialogService }], target: i0.ɵɵFactoryTarget.Component });
822
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ImportExportComponent, isStandalone: true, selector: "igo-import-export", inputs: { selectFirstProj: "selectFirstProj", map: "map", contextUri: "contextUri", projectionsLimitations: "projectionsLimitations", store: "store", selectedMode: "selectedMode", exportOptions$: "exportOptions$" }, outputs: { selectMode: "selectMode", exportOptionsChange: "exportOptionsChange" }, providers: [ConfirmDialogService], ngImport: i0, template: "<div class=\"import-export-toggle\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\"\n >\n <mat-button-toggle [value]=\"'import'\">\n {{ 'igo.geo.importExportForm.importTabTitle' | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{ 'igo.geo.importExportForm.exportTabTitle' | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"importForm\"\n *ngIf=\"selectedMode === 'import'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.importProjPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of projections$ | async\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle *ngIf=\"projection.translateKey\">\n {{\n 'igo.geo.importExportForm.projections.' + projection.translateKey\n | translate: projection\n }}\n </span>\n <span matListItemTitle *ngIf=\"!projection.translateKey\">\n {{ projection.alias }}\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n importForm.invalid\n ? ('igo.geo.importExportForm.projections.choose' | translate)\n : ('igo.geo.importExportForm.importButton' | translate)\n \"\n class=\"igo-form-button-group\"\n >\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n >\n {{ 'igo.geo.importExportForm.importButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n hidden\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($any($event.target).files)\"\n />\n </div>\n</form>\n<section *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n <li>\n {{ 'igo.geo.importExportForm.importFormatAuthorized' | translate }}\n </li>\n <li>{{ 'igo.geo.importExportForm.importShpZip' | translate }}</li>\n </ul>\n </div>\n <igo-custom-html\n *ngIf=\"importHtmlClarifications !== ''\"\n [html]=\"importHtmlClarifications\"\n >\n </igo-custom-html>\n</section>\n\n<section\n *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\"\n>\n <h4>{{ 'igo.geo.importExportForm.exportNoLayersExportable' | translate }}</h4>\n</section>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportLayerPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"layers\" multiple>\n <mat-select-trigger>\n {{ layers.length ? getLayerTitleById(layers[0]) : '' }}\n <span *ngIf=\"layers.length > 1\" class=\"export-select-trigger\">\n (+{{ layers.length - 1 }}\n {{\n (layers?.length === 2\n ? 'igo.geo.importExportForm.other'\n : 'igo.geo.importExportForm.others'\n ) | translate\n }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of exportableLayers$ | async\"\n [ngClass]=\"{\n 'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)\n }\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle>{{ layer.title }}</span>\n <span matListItemTitle>\n <mat-slide-toggle\n *ngIf=\"layerHasSelectedFeatures(layer)\"\n (click)=\"onlySelectedClick($event, layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event, layer.id)\"\n >\n <small>{{\n 'igo.geo.importExportForm.exportSelectedFeature' | translate\n }}</small>\n </mat-slide-toggle>\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportFormatPlaceholder' | translate\n }}</mat-label>\n <mat-select formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of formats$ | async\" [value]=\"format\">\n {{ 'igo.geo.export.format.' + format | translate }}\n </mat-option>\n </ng-container>\n <mat-option *ngIf=\"(formats$ | async).length === 0\" disabled=\"true\">\n {{ 'igo.geo.export.noFormat.title' | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n class=\"igo-input-container\"\n *ngIf=\"forceNaming && form.value.format !== 'URL'\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"name\"\n placeholder=\"{{\n 'igo.geo.importExportForm.exportFileNamePlaceholder' | translate\n }}\"\n />\n </mat-form-field>\n </div>\n\n <ng-container *ngIf=\"this.isCsvExport(form.value.format)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{ 'igo.geo.export.separator' | translate }}</mat-label>\n <mat-select formControlName=\"csvSeparator\">\n <mat-option\n *ngFor=\"let separator of csvSeparators\"\n [value]=\"separator\"\n >\n {{ 'igo.geo.export.csv.separator.' + separator | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"layers.length > 1\" class=\"export-combine-layers\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportCombineResults' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div\n *ngIf=\"layers.length > 1 && form.value.combineLayers\"\n class=\"export-separator\"\n >\n <mat-slide-toggle formControlName=\"separator\" [labelPosition]=\"'before'\">\n {{ 'igo.geo.importExportForm.exportSeparator' | translate }}\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <div class=\"export-options\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportFeatureInExtent' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\"\n >\n {{\n form.value.format !== 'URL'\n ? ('igo.geo.importExportForm.exportButton' | translate)\n : form.value.layers.length > 1\n ? ('igo.geo.importExportForm.exportButtonLinks' | translate)\n : ('igo.geo.importExportForm.exportButtonLink' | translate)\n }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html\n *ngIf=\"exportHtmlClarifications !== ''\"\n [html]=\"exportHtmlClarifications\"\n >\n </igo-custom-html>\n</form>\n", styles: [":host mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}:host .import-export-toggle{padding:10px;text-align:center}:host .import-export-toggle mat-button-toggle-group{width:100%}:host .import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host h4{padding:0 5px}:host .igo-form{padding:15px 5px}:host .igo-input-container mat-form-field{width:100%}:host .igo-form-button-group{text-align:center;padding-top:10px}:host igo-spinner{position:absolute;padding-left:10px}:host .export-options mat-slide-toggle,:host .export-combine-layers mat-slide-toggle,:host .export-separator mat-slide-toggle{width:100%;padding:10px}:host .export-options mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-separator mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .export-options mat-slide-toggle ::ng-deep .mdc-label,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-label,:host .export-separator mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .export-select-trigger{opacity:.75;font-size:.75em}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i13.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i13.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i14.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i14.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i15.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i15.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i16.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i18.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: SpinnerComponent, selector: "igo-spinner", inputs: ["shown"] }, { kind: "component", type: CustomHtmlComponent, selector: "igo-custom-html", inputs: ["html"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i19.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i20.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i21.TranslatePipe, name: "translate" }] });
823
- }
824
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImportExportComponent, decorators: [{
825
- type: Component,
826
- args: [{ selector: 'igo-import-export', standalone: true, imports: [
827
- MatButtonToggleModule,
828
- NgIf,
829
- FormsModule,
830
- ReactiveFormsModule,
831
- MatFormFieldModule,
832
- MatSelectModule,
833
- NgFor,
834
- MatOptionModule,
835
- MatTooltipModule,
836
- MatButtonModule,
837
- SpinnerComponent,
838
- CustomHtmlComponent,
839
- NgClass,
840
- MatSlideToggleModule,
841
- MatInputModule,
842
- AsyncPipe,
843
- KeyValuePipe,
844
- IgoLanguageModule
845
- ], providers: [ConfirmDialogService], template: "<div class=\"import-export-toggle\">\n <mat-button-toggle-group\n [value]=\"selectedMode\"\n (change)=\"onImportExportChange($event)\"\n >\n <mat-button-toggle [value]=\"'import'\">\n {{ 'igo.geo.importExportForm.importTabTitle' | translate }}\n </mat-button-toggle>\n <mat-button-toggle [value]=\"'export'\">\n {{ 'igo.geo.importExportForm.exportTabTitle' | translate }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"importForm\"\n *ngIf=\"selectedMode === 'import'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.importProjPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"inputProj\">\n <mat-option\n *ngFor=\"let projection of projections$ | async\"\n [value]=\"projection\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle *ngIf=\"projection.translateKey\">\n {{\n 'igo.geo.importExportForm.projections.' + projection.translateKey\n | translate: projection\n }}\n </span>\n <span matListItemTitle *ngIf=\"!projection.translateKey\">\n {{ projection.alias }}\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"\n importForm.invalid\n ? ('igo.geo.importExportForm.projections.choose' | translate)\n : ('igo.geo.importExportForm.importButton' | translate)\n \"\n class=\"igo-form-button-group\"\n >\n <button\n [disabled]=\"importForm.invalid || (loading$ | async)\"\n mat-raised-button\n type=\"button\"\n (click)=\"fileInput.click()\"\n >\n {{ 'igo.geo.importExportForm.importButton' | translate }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n <input\n hidden\n #fileInput\n type=\"file\"\n [style.display]=\"'none'\"\n (click)=\"fileInput.value = null\"\n (change)=\"importFiles($any($event.target).files)\"\n />\n </div>\n</form>\n<section *ngIf=\"selectedMode === 'import'\">\n <div *ngIf=\"importHtmlClarifications === ''\">\n <h4>{{ 'igo.geo.importExportForm.importClarifications' | translate }}</h4>\n <ul>\n <li>\n {{\n 'igo.geo.importExportForm.importSizeMax'\n | translate: { size: fileSizeMb }\n }}\n </li>\n <li>\n {{ 'igo.geo.importExportForm.importFormatAuthorized' | translate }}\n </li>\n <li>{{ 'igo.geo.importExportForm.importShpZip' | translate }}</li>\n </ul>\n </div>\n <igo-custom-html\n *ngIf=\"importHtmlClarifications !== ''\"\n [html]=\"importHtmlClarifications\"\n >\n </igo-custom-html>\n</section>\n\n<section\n *ngIf=\"(exportableLayers$ | async).length === 0 && selectedMode === 'export'\"\n>\n <h4>{{ 'igo.geo.importExportForm.exportNoLayersExportable' | translate }}</h4>\n</section>\n\n<form\n class=\"igo-form\"\n [formGroup]=\"form\"\n *ngIf=\"(exportableLayers$ | async).length > 0 && selectedMode === 'export'\"\n>\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportLayerPlaceholder' | translate\n }}</mat-label>\n <mat-select [(value)]=\"layers\" multiple>\n <mat-select-trigger>\n {{ layers.length ? getLayerTitleById(layers[0]) : '' }}\n <span *ngIf=\"layers.length > 1\" class=\"export-select-trigger\">\n (+{{ layers.length - 1 }}\n {{\n (layers?.length === 2\n ? 'igo.geo.importExportForm.other'\n : 'igo.geo.importExportForm.others'\n ) | translate\n }})\n </span>\n </mat-select-trigger>\n <mat-option\n *ngFor=\"let layer of exportableLayers$ | async\"\n [ngClass]=\"{\n 'igo-export-layer-mat-option': layerHasSelectedFeatures(layer)\n }\"\n [value]=\"layer.id\"\n (click)=\"$event.stopPropagation()\"\n >\n <span matListItemTitle>{{ layer.title }}</span>\n <span matListItemTitle>\n <mat-slide-toggle\n *ngIf=\"layerHasSelectedFeatures(layer)\"\n (click)=\"onlySelectedClick($event, layer.id)\"\n (checked)=\"inLayersIdToExportSelectionOnly(layer)\"\n (change)=\"onlySelected($event, layer.id)\"\n >\n <small>{{\n 'igo.geo.importExportForm.exportSelectedFeature' | translate\n }}</small>\n </mat-slide-toggle>\n </span>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{\n 'igo.geo.importExportForm.exportFormatPlaceholder' | translate\n }}</mat-label>\n <mat-select formControlName=\"format\">\n <ng-container *ngIf=\"(formats$ | async).length !== 0\">\n <mat-option *ngFor=\"let format of formats$ | async\" [value]=\"format\">\n {{ 'igo.geo.export.format.' + format | translate }}\n </mat-option>\n </ng-container>\n <mat-option *ngIf=\"(formats$ | async).length === 0\" disabled=\"true\">\n {{ 'igo.geo.export.noFormat.title' | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div\n class=\"igo-input-container\"\n *ngIf=\"forceNaming && form.value.format !== 'URL'\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"name\"\n placeholder=\"{{\n 'igo.geo.importExportForm.exportFileNamePlaceholder' | translate\n }}\"\n />\n </mat-form-field>\n </div>\n\n <ng-container *ngIf=\"this.isCsvExport(form.value.format)\">\n <div class=\"igo-input-container\">\n <mat-form-field>\n <mat-label>{{ 'igo.geo.export.separator' | translate }}</mat-label>\n <mat-select formControlName=\"csvSeparator\">\n <mat-option\n *ngFor=\"let separator of csvSeparators\"\n [value]=\"separator\"\n >\n {{ 'igo.geo.export.csv.separator.' + separator | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"layers.length > 1\" class=\"export-combine-layers\">\n <mat-slide-toggle\n formControlName=\"combineLayers\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportCombineResults' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div\n *ngIf=\"layers.length > 1 && form.value.combineLayers\"\n class=\"export-separator\"\n >\n <mat-slide-toggle formControlName=\"separator\" [labelPosition]=\"'before'\">\n {{ 'igo.geo.importExportForm.exportSeparator' | translate }}\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <div class=\"export-options\" *ngIf=\"form.value.format !== 'URL'\">\n <mat-slide-toggle\n formControlName=\"featureInMapExtent\"\n [labelPosition]=\"'before'\"\n >\n {{ 'igo.geo.importExportForm.exportFeatureInExtent' | translate }}\n </mat-slide-toggle>\n </div>\n\n <div class=\"igo-form-button-group\">\n <button\n mat-raised-button\n type=\"button\"\n [disabled]=\"!form.valid || (loading$ | async)\"\n (click)=\"handleExportFormSubmit(form.value)\"\n >\n {{\n form.value.format !== 'URL'\n ? ('igo.geo.importExportForm.exportButton' | translate)\n : form.value.layers.length > 1\n ? ('igo.geo.importExportForm.exportButtonLinks' | translate)\n : ('igo.geo.importExportForm.exportButtonLink' | translate)\n }}\n </button>\n <igo-spinner [shown]=\"loading$ | async\"></igo-spinner>\n </div>\n\n <igo-custom-html\n *ngIf=\"exportHtmlClarifications !== ''\"\n [html]=\"exportHtmlClarifications\"\n >\n </igo-custom-html>\n</form>\n", styles: [":host mat-option.igo-export-layer-mat-option{height:5em;line-height:1em}:host .import-export-toggle{padding:10px;text-align:center}:host .import-export-toggle mat-button-toggle-group{width:100%}:host .import-export-toggle mat-button-toggle-group mat-button-toggle{width:50%}:host h4{padding:0 5px}:host .igo-form{padding:15px 5px}:host .igo-input-container mat-form-field{width:100%}:host .igo-form-button-group{text-align:center;padding-top:10px}:host igo-spinner{position:absolute;padding-left:10px}:host .export-options mat-slide-toggle,:host .export-combine-layers mat-slide-toggle,:host .export-separator mat-slide-toggle{width:100%;padding:10px}:host .export-options mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-form-field,:host .export-separator mat-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .export-options mat-slide-toggle ::ng-deep .mdc-label,:host .export-combine-layers mat-slide-toggle ::ng-deep .mdc-label,:host .export-separator mat-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .export-select-trigger{opacity:.75;font-size:.75em}\n"] }]
846
- }], ctorParameters: () => [{ type: i1.ImportService }, { type: i2.ExportService }, { type: i3.LanguageService }, { type: i4.MessageService }, { type: i5.StyleListService }, { type: i6.StyleService }, { type: i7.UntypedFormBuilder }, { type: i8.ConfigService }, { type: i9.StorageService }, { type: i10.DownloadService }, { type: i11.LayerService }, { type: i12.ConfirmDialogService }], propDecorators: { selectFirstProj: [{
847
- type: Input
848
- }], map: [{
849
- type: Input
850
- }], contextUri: [{
851
- type: Input
852
- }], projectionsLimitations: [{
853
- type: Input
854
- }], store: [{
855
- type: Input
856
- }], selectedMode: [{
857
- type: Input
858
- }], selectMode: [{
859
- type: Output
860
- }], exportOptions$: [{
861
- type: Input
862
- }], exportOptionsChange: [{
863
- type: Output
864
- }] } });
865
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L2ltcG9ydC1leHBvcnQvaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFFWCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUVMLG9CQUFvQixFQUNyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8s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aW1wb3J0IHsgQXN5bmNQaXBlLCBLZXlWYWx1ZVBpcGUsIE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7XG4gIE1hdFNsaWRlVG9nZ2xlQ2hhbmdlLFxuICBNYXRTbGlkZVRvZ2dsZU1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9jb25maXJtLWRpYWxvZyc7XG5pbXBvcnQgeyBDdXN0b21IdG1sQ29tcG9uZW50IH0gZnJvbSAnQGlnbzIvY29tbW9uL2N1c3RvbS1odG1sJztcbmltcG9ydCB7IEVudGl0eVJlY29yZCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9lbnRpdHknO1xuaW1wb3J0IHsgU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BpZ28yL2NvbW1vbi9zcGlubmVyJztcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU3RvcmUgfSBmcm9tICdAaWdvMi9jb21tb24vd29ya3NwYWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IElnb0xhbmd1YWdlTW9kdWxlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvc3RvcmFnZSc7XG5cbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEZlYXR1cmUgfSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5pbXBvcnQgb2xQb2ludCBmcm9tICdvbC9nZW9tL1BvaW50JztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNraXBXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9kYXRhc291cmNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEb3dubG9hZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9kb3dubG9hZC9zaGFyZWQvZG93bmxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vLi4vZmVhdHVyZS9zaGFyZWQvZmVhdHVyZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IExheWVyU2VydmljZSB9IGZyb20gJy4uLy4uL2xheWVyL3NoYXJlZC9sYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IEFueUxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9hbnktbGF5ZXInO1xuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL2xheWVyJztcbmltcG9ydCB7IFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy92ZWN0b3ItbGF5ZXInO1xuaW1wb3J0IHsgSW5wdXRQcm9qZWN0aW9ucywgUHJvamVjdGlvbnNMaW1pdGF0aW9uc09wdGlvbnMgfSBmcm9tICcuLi8uLi9tYXAvJztcbmltcG9ydCB7IGNvbXB1dGVQcm9qZWN0aW9uc0NvbnN0cmFpbnRzIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZCc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBTdHlsZUxpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGUtbGlzdC9zdHlsZS1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3R5bGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGUtc2VydmljZS9zdHlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydE9wdGlvbnMsIEdlb21ldHJ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3NoYXJlZC9leHBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQW55RXhwb3J0Rm9ybWF0LFxuICBDc3ZTZXBhcmF0b3IsXG4gIEV4cG9ydEZvcm1hdCxcbiAgRXhwb3J0Rm9ybWF0TGVnYWN5XG59IGZyb20gJy4uL3NoYXJlZC9leHBvcnQudHlwZSc7XG5pbXBvcnQge1xuICBoYW5kbGVGaWxlRXhwb3J0RXJyb3IsXG4gIGhhbmRsZUZpbGVFeHBvcnRTdWNjZXNzLFxuICBpc0NzdkV4cG9ydFxufSBmcm9tICcuLi9zaGFyZWQvZXhwb3J0LnV0aWxzJztcbmltcG9ydCB7IEltcG9ydEV4cG9ydFNlcnZpY2VPcHRpb25zIH0gZnJvbSAnLi4vc2hhcmVkL2ltcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW1wb3J0U2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9pbXBvcnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBoYW5kbGVGaWxlSW1wb3J0RXJyb3IsXG4gIGhhbmRsZUZpbGVJbXBvcnRTdWNjZXNzXG59IGZyb20gJy4uL3NoYXJlZC9pbXBvcnQudXRpbHMnO1xuXG50eXBlIFNlbGVjdE1vZGUgPSAnaW1wb3J0JyB8ICdleHBvcnQnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLWltcG9ydC1leHBvcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1wb3J0LWV4cG9ydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltcG9ydC1leHBvcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSxcbiAgICBOZ0lmLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBOZ0ZvcixcbiAgICBNYXRPcHRpb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgU3Bpbm5lckNvbXBvbmVudCxcbiAgICBDdXN0b21IdG1sQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0U2xpZGVUb2dnbGVNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIEtleVZhbHVlUGlwZSxcbiAgICBJZ29MYW5ndWFnZU1vZHVsZVxuICBdLFxuICBwcm92aWRlcnM6IFtDb25maXJtRGlhbG9nU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgSW1wb3J0RXhwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGltcG9ydEZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIHB1YmxpYyBmb3JtYXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RXhwb3J0Rm9ybWF0W10+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyBleHBvcnRhYmxlTGF5ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QW55TGF5ZXJbXT4oW10pO1xuICBwdWJsaWMgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGZvcmNlTmFtaW5nID0gZmFsc2U7XG4gIHB1YmxpYyBjb250cm9sRm9ybWF0ID0gJ2Zvcm1hdCc7XG5cbiAgY3N2U2VwYXJhdG9ycyA9IENzdlNlcGFyYXRvcjtcbiAgaXNDc3ZFeHBvcnQgPSBpc0NzdkV4cG9ydDtcblxuICBwcml2YXRlIGxheWVycyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZXhwb3J0YWJsZUxheWVycyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybWF0cyQkOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZm9ybUxheWVyJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBleHBvcnRPcHRpb25zJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgaW1wb3J0SHRtbENsYXJpZmljYXRpb25zOiBzdHJpbmc7XG4gIHB1YmxpYyBleHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnM6IHN0cmluZztcblxuICBwcml2YXRlIGVzcGdDb2RlUmVnZXggPSBuZXcgUmVnRXhwKCdeXFxcXGR7NCw2fScpO1xuICBwcml2YXRlIGNsaWVudFNpZGVGaWxlU2l6ZU1heDogbnVtYmVyO1xuICBwdWJsaWMgZmlsZVNpemVNYjogbnVtYmVyO1xuXG4gIHB1YmxpYyBwcm9qZWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElucHV0UHJvamVjdGlvbnNbXT4oW10pO1xuICBwcml2YXRlIHByb2plY3Rpb25zQ29uc3RyYWludHM6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zO1xuXG4gIHB1YmxpYyBwb3B1cENoZWNrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25maWdGb3JtYXRzOiBBbnlFeHBvcnRGb3JtYXRbXTtcblxuICBwcml2YXRlIHByZXZpb3VzTGF5ZXJTcGVjcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB2aXNpYmxlOiBib29sZWFuO1xuICAgICAgb3BhY2l0eTogbnVtYmVyO1xuICAgICAgcXVlcnlhYmxlOiBib29sZWFuO1xuICAgIH1bXVxuICA+KHVuZGVmaW5lZCk7XG5cbiAgQElucHV0KCkgc2VsZWN0Rmlyc3RQcm9qID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbWFwOiBJZ29NYXA7XG5cbiAgQElucHV0KCkgY29udGV4dFVyaTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3Byb2plY3Rpb25zTGltaXRhdGlvbnM6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zID0ge307XG4gIEBJbnB1dCgpXG4gIHNldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKHZhbHVlOiBQcm9qZWN0aW9uc0xpbWl0YXRpb25zT3B0aW9ucykge1xuICAgIHRoaXMuX3Byb2plY3Rpb25zTGltaXRhdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbXB1dGVQcm9qZWN0aW9ucygpO1xuICB9XG4gIGdldCBwcm9qZWN0aW9uc0xpbWl0YXRpb25zKCk6IFByb2plY3Rpb25zTGltaXRhdGlvbnNPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdGlvbnNMaW1pdGF0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGF0IGhvbGRzIHRoZSBhdmFpbGFibGUgd29ya3NwYWNlcy5cbiAgICovXG4gIEBJbnB1dCgpIHN0b3JlOiBXb3Jrc3BhY2VTdG9yZTtcblxuICBASW5wdXQoKSBzZWxlY3RlZE1vZGU6IFNlbGVjdE1vZGUgPSAnaW1wb3J0JztcblxuICBAT3V0cHV0KCkgc2VsZWN0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0TW9kZT4oKTtcblxuICBASW5wdXQoKSBleHBvcnRPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RXhwb3J0T3B0aW9ucz4odW5kZWZpbmVkKTtcblxuICBAT3V0cHV0KCkgZXhwb3J0T3B0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwb3J0T3B0aW9ucz4oKTtcblxuICBnZXQgbGF5ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdsYXllcnMnKS52YWx1ZTtcbiAgfVxuICBzZXQgbGF5ZXJzKHZhbHVlKSB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBsYXllcnM6IHZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0IGlucHV0UHJvaigpIHtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRGb3JtLmdldCgnaW5wdXRQcm9qJykudmFsdWU7XG4gIH1cbiAgc2V0IGlucHV0UHJvaih2YWx1ZSkge1xuICAgIHRoaXMuaW1wb3J0Rm9ybS5wYXRjaFZhbHVlKHsgaW5wdXRQcm9qOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGdldCBwb3B1cEFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgnaW1wb3J0RXhwb3J0UG9wdXBBbGxvd2VkJykgYXMgYm9vbGVhbikgfHwgZmFsc2VcbiAgICApO1xuICB9XG5cbiAgc2V0IHBvcHVwQWxsb3dlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KCdpbXBvcnRFeHBvcnRQb3B1cEFsbG93ZWQnLCB2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGltcG9ydFNlcnZpY2U6IEltcG9ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBleHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdHlsZUxpc3RTZXJ2aWNlOiBTdHlsZUxpc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3R5bGVTZXJ2aWNlOiBTdHlsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG93bmxvYWRTZXJ2aWNlOiBEb3dubG9hZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYXllclNlcnZpY2U6IExheWVyU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1EaWFsb2dTZXJ2aWNlOiBDb25maXJtRGlhbG9nU2VydmljZVxuICApIHtcbiAgICB0aGlzLmxvYWRDb25maWcoKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMuY29tcHV0ZVByb2plY3Rpb25zKCk7XG4gICAgdGhpcy5pbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0SHRtbENsYXJpZmljYXRpb25zJ1xuICAgICk7XG4gICAgdGhpcy5leHBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0SHRtbENsYXJpZmljYXRpb25zJ1xuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxheWVycyQkID0gdGhpcy5tYXAubGF5ZXJzJC5zdWJzY3JpYmUoKGxheWVycykgPT4ge1xuICAgICAgdGhpcy5leHBvcnRhYmxlTGF5ZXJzJC5uZXh0KFxuICAgICAgICBsYXllcnMuZmlsdGVyKChsYXllcjogTGF5ZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGxheWVyIGluc3RhbmNlb2YgVmVjdG9yTGF5ZXIgJiYgbGF5ZXIuZXhwb3J0YWJsZSA9PT0gdHJ1ZSkgfHxcbiAgICAgICAgICAgIChsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQgJiZcbiAgICAgICAgICAgICAgbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLnVybClcbiAgICAgICAgICApO1xuICAgICAgICB9KSBhcyBBbnlMYXllcltdXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVTaXplTWIgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoXG4gICAgICAnaW1wb3J0RXhwb3J0LmNsaWVudFNpZGVGaWxlU2l6ZU1heE1iJ1xuICAgICk7XG4gICAgdGhpcy5jbGllbnRTaWRlRmlsZVNpemVNYXggPVxuICAgICAgKGNvbmZpZ0ZpbGVTaXplTWIgPyBjb25maWdGaWxlU2l6ZU1iIDogMzApICogTWF0aC5wb3coMTAyNCwgMik7XG4gICAgdGhpcy5maWxlU2l6ZU1iID0gdGhpcy5jbGllbnRTaWRlRmlsZVNpemVNYXggLyBNYXRoLnBvdygxMDI0LCAyKTtcblxuICAgIHRoaXMuZXhwb3J0T3B0aW9ucyQkID0gdGhpcy5leHBvcnRPcHRpb25zJFxuICAgICAgLnBpcGUoc2tpcFdoaWxlKChleHBvcnRPcHRpb25zKSA9PiAhZXhwb3J0T3B0aW9ucykpXG4gICAgICAuc3Vic2NyaWJlKChleHBvcnRPcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKGV4cG9ydE9wdGlvbnMsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICBpZiAoZXhwb3J0T3B0aW9ucy5sYXllcnMpIHtcbiAgICAgICAgICB0aGlzLmNvbXB1dGVGb3JtYXRzKFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9ucy5sYXllcnMubWFwKChsKSA9PiB0aGlzLm1hcC5nZXRMYXllckJ5SWQobCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5mb3JtTGF5ZXIkJCA9IHRoaXMuZm9ybVxuICAgICAgLmdldCgnZm9ybWF0JylcbiAgICAgIC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChmb3JtYXQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLnBvcHVwQ2hlY2tlZCAmJlxuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ2xheWVycycpLnZhbHVlPy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgdGhpcy5pc09ncmVPckxpbmsoZm9ybWF0KVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFuZGxlUG9wdXAodHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiB1bmRlZmluZWQgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmZvcm1MYXllciQkID0gdGhpcy5mb3JtXG4gICAgICAuZ2V0KCdsYXllcnMnKVxuICAgICAgLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGxheWVyc0lkKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUHJldmlvdXNMYXllclNwZWNzKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGF5ZXJzID1cbiAgICAgICAgICBsYXllcnNJZCBpbnN0YW5jZW9mIEFycmF5ID8gbGF5ZXJzSWQgOiBbbGF5ZXJzSWRdO1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyczogc2VsZWN0ZWRMYXllcnMgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBzZWxlY3RlZExheWVycy5tYXAoKGwpID0+IHRoaXMubWFwLmdldExheWVyQnlJZChsKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZUZvcm1hdHMobGF5ZXJzKTtcblxuICAgICAgICBpZiAodGhpcy5mb3JtYXRzJC52YWx1ZS5pbmRleE9mKHRoaXMuZm9ybS52YWx1ZS5mb3JtYXQpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgZm9ybWF0OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3BlY3M6IHtcbiAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgICAgICAgb3BhY2l0eTogbnVtYmVyO1xuICAgICAgICAgIHF1ZXJ5YWJsZTogYm9vbGVhbjtcbiAgICAgICAgfVtdID0gW107XG4gICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGxheWVyIGluc3RhbmNlb2YgVmVjdG9yTGF5ZXIgJiZcbiAgICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub2wuZ2V0RmVhdHVyZXMoKS5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByZXZpb3VzU3BlY3MucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgICAgICAgdmlzaWJsZTogbGF5ZXIudmlzaWJsZSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogbGF5ZXIub3BhY2l0eSxcbiAgICAgICAgICAgICAgcXVlcnlhYmxlOiAobGF5ZXIgYXMgYW55KS5xdWVyeWFibGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGF5ZXIub3BhY2l0eSA9IDA7XG4gICAgICAgICAgICBsYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNMYXllclNwZWNzJC5uZXh0KHByZXZpb3VzU3BlY3MpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmZvcm1hdHMkJCA9IHRoaXMuZm9ybWF0cyRcbiAgICAgIC5waXBlKHNraXBXaGlsZSgoZm9ybWF0cykgPT4gIWZvcm1hdHMpKVxuICAgICAgLnN1YnNjcmliZSgoZm9ybWF0cykgPT4ge1xuICAgICAgICBpZiAoZm9ybWF0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGZvcm1hdDogZm9ybWF0c1swXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmV4cG9ydGFibGVMYXllcnMkJCA9IHRoaXMuZXhwb3J0YWJsZUxheWVycyRcbiAgICAgIC5waXBlKHNraXBXaGlsZSgobGF5ZXJzKSA9PiAhbGF5ZXJzKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxheWVycykgPT4ge1xuICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgbGF5ZXJzOiBsYXllcnNbMF0uaWQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0Rmlyc3RQcm9qKSB7XG4gICAgICBpZiAodGhpcy5wcm9qZWN0aW9ucyQudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuaW1wb3J0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBpbnB1dFByb2o6IHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZUtleTogJ25hZDgzJyxcbiAgICAgICAgICAgIGFsaWFzOiAnTkFEODMnLFxuICAgICAgICAgICAgY29kZTogJ0VQU0c6NDMyNicsXG4gICAgICAgICAgICB6b25lOiAnJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmltcG9ydEZvcm0ucGF0Y2hWYWx1ZSh7IGlucHV0UHJvajogdGhpcy5wcm9qZWN0aW9ucyQudmFsdWVbMF0gfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1wb3J0Rm9ybS5wYXRjaFZhbHVlKHsgaW5wdXRQcm9qOiB1bmRlZmluZWQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlUHJvamVjdGlvbnMoKSB7XG4gICAgdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzID0gY29tcHV0ZVByb2plY3Rpb25zQ29uc3RyYWludHMoXG4gICAgICB0aGlzLnByb2plY3Rpb25zTGltaXRhdGlvbnNcbiAgICApO1xuICAgIGNvbnN0IHByb2plY3Rpb25zOiBJbnB1dFByb2plY3Rpb25zW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubmFkODMpIHtcbiAgICAgIHByb2plY3Rpb25zLnB1c2goe1xuICAgICAgICB0cmFuc2xhdGVLZXk6ICduYWQ4MycsXG4gICAgICAgIGFsaWFzOiAnTkFEODMnLFxuICAgICAgICBjb2RlOiAnRVBTRzo0MjY5JyxcbiAgICAgICAgem9uZTogJycsXG4gICAgICAgIGV4dGVudDogdW5kZWZpbmVkLFxuICAgICAgICBkZWY6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMud2dzODQpIHtcbiAgICAgIHByb2plY3Rpb25zLnB1c2goe1xuICAgICAgICB0cmFuc2xhdGVLZXk6ICd3Z3M4NCcsXG4gICAgICAgIGFsaWFzOiAnV0dTODQnLFxuICAgICAgICBjb2RlOiAnRVBTRzo0MzI2JyxcbiAgICAgICAgem9uZTogJycsXG4gICAgICAgIGV4dGVudDogdW5kZWZpbmVkLFxuICAgICAgICBkZWY6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMud2ViTWVyY2F0b3IpIHtcbiAgICAgIHByb2plY3Rpb25zLnB1c2goe1xuICAgICAgICB0cmFuc2xhdGVLZXk6ICd3ZWJNZXJjYXRvcicsXG4gICAgICAgIGFsaWFzOiAnV2ViIE1lcmNhdG9yJyxcbiAgICAgICAgY29kZTogJ0VQU0c6Mzg1NycsXG4gICAgICAgIHpvbmU6ICcnLFxuICAgICAgICBleHRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZGVmOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubXRtKSB7XG4gICAgICAvLyBhbGwgbXRtIHpvbmVzXG4gICAgICBjb25zdCBtaW5ab25lID0gdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLm10bVpvbmUubWluWm9uZTtcbiAgICAgIGNvbnN0IG1heFpvbmUgPSB0aGlzLnByb2plY3Rpb25zQ29uc3RyYWludHMubXRtWm9uZS5tYXhab25lO1xuXG4gICAgICBmb3IgKGxldCBtdG1ab25lID0gbWluWm9uZTsgbXRtWm9uZSA8PSBtYXhab25lOyBtdG1ab25lKyspIHtcbiAgICAgICAgY29uc3QgY29kZSA9XG4gICAgICAgICAgbXRtWm9uZSA8IDEwID8gYEVQU0c6MzIxOCR7bXRtWm9uZX1gIDogYEVQU0c6MzIxJHs4MCArIG10bVpvbmV9YDtcbiAgICAgICAgcHJvamVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgdHJhbnNsYXRlS2V5OiAnbXRtJyxcbiAgICAgICAgICBhbGlhczogYE1UTSAke210bVpvbmV9YCxcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHpvbmU6IGAke210bVpvbmV9YCxcbiAgICAgICAgICBleHRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWY6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bSkge1xuICAgICAgLy8gYWxsIHV0bSB6b25lc1xuICAgICAgY29uc3QgbWluWm9uZSA9IHRoaXMucHJvamVjdGlvbnNDb25zdHJhaW50cy51dG1ab25lLm1pblpvbmU7XG4gICAgICBjb25zdCBtYXhab25lID0gdGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnV0bVpvbmUubWF4Wm9uZTtcblxuICAgICAgZm9yIChsZXQgdXRtWm9uZSA9IG1pblpvbmU7IHV0bVpvbmUgPD0gbWF4Wm9uZTsgdXRtWm9uZSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPVxuICAgICAgICAgIHV0bVpvbmUgPCAxMCA/IGBFUFNHOjMyNjAke3V0bVpvbmV9YCA6IGBFUFNHOjMyNiR7dXRtWm9uZX1gO1xuICAgICAgICBwcm9qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0cmFuc2xhdGVLZXk6ICd1dG0nLFxuICAgICAgICAgIGFsaWFzOiBgVVRNICR7dXRtWm9uZX1gLFxuICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgem9uZTogYCR7dXRtWm9uZX1gLFxuICAgICAgICAgIGV4dGVudDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZjogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjb25maWdQcm9qZWN0aW9uOiBJbnB1dFByb2plY3Rpb25zW10gPSBbXTtcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uc0NvbnN0cmFpbnRzLnByb2pGcm9tQ29uZmlnKSB7XG4gICAgICBjb25maWdQcm9qZWN0aW9uID0gKHRoaXMuY29uZmlnLmdldENvbmZpZygncHJvamVjdGlvbnMnKSB8fFxuICAgICAgICBbXSkgYXMgSW5wdXRQcm9qZWN0aW9uc1tdO1xuICAgIH1cblxuICAgIHRoaXMucHJvamVjdGlvbnMkLm5leHQoY29uZmlnUHJvamVjdGlvbi5jb25jYXQocHJvamVjdGlvbnMpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYXllclRpdGxlQnlJZChpZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldExheWVyQnlJZChpZCk/LnRpdGxlO1xuICB9XG5cbiAgbGF5ZXJIYXNTZWxlY3RlZEZlYXR1cmVzKGxheWVyOiBMYXllcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHdrc0Zyb21MYXllciA9IHRoaXMuZXhwb3J0U2VydmljZS5nZXRXb3Jrc3BhY2VCeUxheWVySWQoXG4gICAgICBsYXllci5pZCxcbiAgICAgIHRoaXMuc3RvcmVcbiAgICApO1xuICAgIGlmICh3a3NGcm9tTGF5ZXIpIHtcbiAgICAgIGNvbnN0IHJlY3MgPSB3a3NGcm9tTGF5ZXIuZW50aXR5U3RvcmUuc3RhdGVWaWV3LmZpcnN0QnkoXG4gICAgICAgIChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlPikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWNvcmQuc3RhdGUuc2VsZWN0ZWQgPT09IHRydWU7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVjcyA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25seVNlbGVjdGVkKGV2ZW50OiBNYXRTbGlkZVRvZ2dsZUNoYW5nZSwgaWQ6IHN0cmluZykge1xuICAgIGxldCBsYXllcnNXaXRoU2VsZWN0aW9uID0gdGhpcy5mb3JtLnZhbHVlLmxheWVyc1dpdGhTZWxlY3Rpb247XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGxheWVyc1dpdGhTZWxlY3Rpb24ucHVzaChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc1dpdGhTZWxlY3Rpb24gPSBsYXllcnNXaXRoU2VsZWN0aW9uLmZpbHRlcihcbiAgICAgICAgKGxheWVySWQpID0+IGxheWVySWQgIT09IGlkXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxheWVyc1dpdGhTZWxlY3Rpb24gfSk7XG4gIH1cblxuICBwdWJsaWMgb25seVNlbGVjdGVkQ2xpY2soZXZlbnQsIGlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbHVlLmxheWVycy5maW5kKChsYXllcklkKSA9PiBsYXllcklkID09PSBpZCkpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbkxheWVyc0lkVG9FeHBvcnRTZWxlY3Rpb25Pbmx5KGxheWVyOiBMYXllcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm0udmFsdWUubGF5ZXJzV2l0aFNlbGVjdGlvbi5maW5kKFxuICAgICAgKGxheWVySWQpID0+IGxheWVySWQgPT09IGxheWVyLmlkXG4gICAgKVxuICAgICAgPyB0cnVlXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5sYXllcnMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZXhwb3J0YWJsZUxheWVycyQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtYXRzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm1MYXllciQkLnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuZXhwb3J0T3B0aW9ucyQkKSB7XG4gICAgICB0aGlzLmV4cG9ydE9wdGlvbnMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmV4cG9ydE9wdGlvbnNDaGFuZ2UuZW1pdCh0aGlzLmZvcm0udmFsdWUpO1xuICAgIHRoaXMuaGFuZGxlUHJldmlvdXNMYXllclNwZWNzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVByZXZpb3VzTGF5ZXJTcGVjcygpIHtcbiAgICBjb25zdCBwcmV2aW91c1NwZWNzID0gdGhpcy5wcmV2aW91c0xheWVyU3BlY3MkLnZhbHVlO1xuICAgIGlmIChwcmV2aW91c1NwZWNzICYmIHByZXZpb3VzU3BlY3MubGVuZ3RoKSB7XG4gICAgICBwcmV2aW91c1NwZWNzLmZvckVhY2goKHNwZWNzKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGF5ZXIgPSB0aGlzLm1hcC5nZXRMYXllckJ5SWQoc3BlY3MuaWQpO1xuICAgICAgICBwcmV2aW91c0xheWVyLnZpc2libGUgPSBzcGVjcy52aXNpYmxlO1xuICAgICAgICBwcmV2aW91c0xheWVyLm9wYWNpdHkgPSBzcGVjcy5vcGFjaXR5O1xuICAgICAgICAocHJldmlvdXNMYXllciBhcyBhbnkpLnF1ZXJ5YWJsZSA9IHNwZWNzLnF1ZXJ5YWJsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXZpb3VzTGF5ZXJTcGVjcyQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgaW1wb3J0RmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGxldCBpbnB1dFByb2ogPSB0aGlzLmlucHV0UHJvai5jb2RlO1xuICAgIGlmICh0aGlzLmVzcGdDb2RlUmVnZXgudGVzdChpbnB1dFByb2opKSB7XG4gICAgICBpbnB1dFByb2ogPSBgRVBTRzoke2lucHV0UHJvan1gO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRoaXMuaW1wb3J0U2VydmljZS5pbXBvcnQoZmlsZSwgaW5wdXRQcm9qKS5zdWJzY3JpYmUoXG4gICAgICAgIChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiB0aGlzLm9uRmlsZUltcG9ydFN1Y2Nlc3MoZmlsZSwgZmVhdHVyZXMpLFxuICAgICAgICAoZXJyb3I6IEVycm9yKSA9PiB0aGlzLm9uRmlsZUltcG9ydEVycm9yKGZpbGUsIGVycm9yKSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9wdXAocHJlQ2hlY2sgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcDEgPSB3aW5kb3cub3BlbignJywgJ3BvcHVwJywgJ3dpZHRoPTEsIGhlaWdodD0xJyk7XG4gICAgcDEuY2xvc2UoKTtcbiAgICBjb25zdCBwMiA9IHdpbmRvdy5vcGVuKCcnLCAncG9wdXAnLCAnd2lkdGg9MSwgaGVpZ2h0PTEnKTtcbiAgICBpZiAoIXAyIHx8IHAyLmNsb3NlZCB8fCB0eXBlb2YgcDIuY2xvc2VkID09PSAndW5kZWZpbmVkJyB8fCBwMiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5vblBvcHVwQmxvY2tlZEVycm9yKHByZUNoZWNrKTtcbiAgICAgIHRoaXMucG9wdXBBbGxvd2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAyLmNsb3NlKCk7XG4gICAgICB0aGlzLnBvcHVwQWxsb3dlZCA9IHRydWU7XG4gICAgICB0aGlzLnBvcHVwQ2hlY2tlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBvcHVwQWxsb3dlZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNPZ3JlT3JMaW5rKGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9ncmVGb3JtYXRzID0gT2JqZWN0LmtleXMoRXhwb3J0U2VydmljZS5vZ3JlRm9ybWF0cyk7XG4gICAgcmV0dXJuIG9ncmVGb3JtYXRzLmluZGV4T2YoZm9ybWF0KSA+PSAwIHx8IGZvcm1hdCA9PT0gJ1VSTCc7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFeHBvcnRGb3JtU3VibWl0KGRhdGE6IEV4cG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5wb3B1cENoZWNrZWQgJiZcbiAgICAgIGRhdGEubGF5ZXJzLmxlbmd0aCA+IDEgJiZcbiAgICAgIHRoaXMuaXNPZ3JlT3JMaW5rKGRhdGEuZm9ybWF0KSAmJlxuICAgICAgIXRoaXMucG9wdXBBbGxvd2VkXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZVBvcHVwKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNDU1YgPSBpc0NzdkV4cG9ydChkYXRhLmZvcm1hdCk7XG5cbiAgICBpZiAoZGF0YS5mb3JtYXQgPT09ICdFeGNlbCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRFeGNlbCh0aGlzLm1hcCwgdGhpcy5zdG9yZSwgZGF0YSk7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uRmlsZUV4cG9ydFN1Y2Nlc3MoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMub25GaWxlRXhwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZmlsZU5hbWUgPSAnJztcblxuICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiBkYXRhLmxheWVycykge1xuICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLm1hcC5nZXRMYXllckJ5SWQobGF5ZXJJZCk7XG4gICAgICBjb25zdCBmZWF0dXJlcyA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuZXhwb3J0U2VydmljZS5nZXRGZWF0dXJlcyh0aGlzLm1hcCwgbGF5ZXIsIGRhdGEsIHRoaXMuc3RvcmUpXG4gICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm9uRmlsZUV4cG9ydEVycm9yKGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdlb21UeXBlcyA9IHRoaXMuZXhwb3J0U2VydmljZS5nZXRHZW9tVHlwZXMoZmVhdHVyZXMsIGRhdGEuZm9ybWF0KTtcbiAgICAgIGlmICghaXNDU1YgfHwgIWRhdGEuY29tYmluZUxheWVycyB8fCBkYXRhLmxheWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBsYXllci50aXRsZTtcbiAgICAgICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgICAgIGZpbGVOYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlTmFtZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLmV4cG9ydC5jb21iaW5lZExheWVycydcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuZm9ybWF0ID09PSAnVVJMJykge1xuICAgICAgICB0aGlzLmhhbmRsZVVybEV4cG9ydChsYXllcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUdweEV4cG9ydChnZW9tVHlwZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2VvbVR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICdpZ28uZ2VvLmV4cG9ydC5ub3RoaW5nLnRleHQnLFxuICAgICAgICAgICdpZ28uZ2VvLmV4cG9ydC5ub3RoaW5nLnRpdGxlJyxcbiAgICAgICAgICB7IHRpbWVPdXQ6IDIwMDAwIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NTViB8fCAhZGF0YS5jb21iaW5lTGF5ZXJzKSB7XG4gICAgICAgIGdlb21UeXBlcy5mb3JFYWNoKChnZW9tVHlwZSkgPT4ge1xuICAgICAgICAgIGlmIChnZW9tVHlwZS50eXBlKSB7XG4gICAgICAgICAgICBmaWxlTmFtZSArPSBnZW9tVHlwZS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhhbmRsZUV4cG9ydChnZW9tVHlwZS5mZWF0dXJlcywgZGF0YSwgZmlsZU5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ1NWKSB7XG4gICAgICB0aGlzLmhhbmRsZUNzdkV4cG9ydChkYXRhLCBmaWxlTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVVcmxFeHBvcnQobGF5ZXI6IExheWVyKTogdm9pZCB7XG4gICAgY29uc3QgeyBkb3dubG9hZCA9IG51bGwgfTogRGF0YVNvdXJjZU9wdGlvbnMgPSBsYXllci5kYXRhU291cmNlLm9wdGlvbnM7XG4gICAgaWYgKGRvd25sb2FkPy51cmwgfHwgZG93bmxvYWQ/LmR5bmFtaWNVcmwpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBkb3dubG9hZC51cmwgPz8gZG93bmxvYWQuZHluYW1pY1VybDtcbiAgICAgICAgdXJsLm1hdGNoKC9zZXJ2aWNlPXdmcy9naSlcbiAgICAgICAgICA/IHRoaXMuZG93bmxvYWRTZXJ2aWNlLm9wZW4obGF5ZXIpXG4gICAgICAgICAgOiB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUdweEV4cG9ydChnZW9tVHlwZXM6IEdlb21ldHJ5Q29sbGVjdGlvbltdKTogdm9pZCB7XG4gICAgY29uc3QgZ3B4RmVhdHVyZUNudCA9IGdlb21UeXBlcy5sZW5ndGg7XG4gICAgZ2VvbVR5cGVzID0gZ2VvbVR5cGVzLmZpbHRlcigoZ2VvbVR5cGUpID0+XG4gICAgICBbJ0xpbmVTdHJpbmcnLCAnUG9pbnQnXS5pbmNsdWRlcyhnZW9tVHlwZS50eXBlKVxuICAgICk7XG4gICAgY29uc3QgZ3B4RmVhdHVyZUNudFBvaW50T3JQb2x5ID0gZ2VvbVR5cGVzLmxlbmd0aDtcbiAgICBpZiAoZ3B4RmVhdHVyZUNudCA+IGdweEZlYXR1cmVDbnRQb2ludE9yUG9seSkge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgJ2lnby5nZW8uZXhwb3J0LmdweC5lcnJvci5wb2x5LnRleHQnLFxuICAgICAgICAnaWdvLmdlby5leHBvcnQuZ3B4LmVycm9yLnBvbHkudGl0bGUnLFxuICAgICAgICB7IHRpbWVPdXQ6IDIwMDAwIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDc3ZFeHBvcnQoZGF0YTogRXhwb3J0T3B0aW9ucywgZmlsZU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGZlYXR1cmVzQ1NWID0gW107XG5cbiAgICBpZiAoZGF0YS5jb21iaW5lTGF5ZXJzKSB7XG4gICAgICBsZXQgcHJldmlvdXNGZWF0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZ2VvbVR5cGVzID0gYXdhaXQgdGhpcy5nZXRBbGxMYXllckdlb21UeXBlcyhkYXRhKTtcbiAgICAgIGdlb21UeXBlcy5mb3JFYWNoKChnZW9tVHlwZSkgPT4ge1xuICAgICAgICBnZW9tVHlwZS5mZWF0dXJlcy5mb3JFYWNoKChjdXJyZW50RmVhdHVyZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLnNlcGFyYXRvcikge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRmVhdHVyZSkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VycmVudEZlYXR1cmUuZ2V0KCdfZmVhdHVyZVN0b3JlJykubGF5ZXIub3B0aW9ucy50aXRsZSAhPT1cbiAgICAgICAgICAgICAgICBwcmV2aW91c0ZlYXR1cmUuZ2V0KCdfZmVhdHVyZVN0b3JlJykubGF5ZXIub3B0aW9ucy50aXRsZVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUVtcHR5Um93cyA9IHRoaXMuY3JlYXRlVGl0bGVFbXB0eVJvd3MoXG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0ZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RmVhdHVyZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNDU1YucHVzaCh0aXRsZUVtcHR5Um93c1syXSk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNDU1YucHVzaCh0aXRsZUVtcHR5Um93c1swXSk7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNDU1YucHVzaCh0aXRsZUVtcHR5Um93c1sxXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpdGxlRW1wdHlSb3dzID0gdGhpcy5jcmVhdGVUaXRsZUVtcHR5Um93cyhcbiAgICAgICAgICAgICAgICBjdXJyZW50RmVhdHVyZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50RmVhdHVyZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmZWF0dXJlc0NTVi5wdXNoKHRpdGxlRW1wdHlSb3dzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmVhdHVyZXNDU1YucHVzaChjdXJyZW50RmVhdHVyZSk7XG4gICAgICAgICAgcHJldmlvdXNGZWF0dXJlID0gY3VycmVudEZlYXR1cmU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVFeHBvcnQoZmVhdHVyZXNDU1YsIGRhdGEsIGZpbGVOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXhwb3J0KFxuICAgIGZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIGZpbGVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlXG4gICAgICAuZXhwb3J0KGZlYXR1cmVzLCBvcHRpb25zLCBmaWxlTmFtZSwgdGhpcy5tYXAucHJvamVjdGlvbkNvZGUpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHRoaXMub25GaWxlRXhwb3J0RXJyb3IoZXJyb3IpLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25GaWxlRXhwb3J0U3VjY2VzcygpO1xuXG4gICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaXJjbGVUb1BvaW50KGZlYXR1cmUpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFsbExheWVyR2VvbVR5cGVzKFxuICAgIGRhdGE6IEV4cG9ydE9wdGlvbnNcbiAgKTogUHJvbWlzZTxHZW9tZXRyeUNvbGxlY3Rpb25bXT4ge1xuICAgIHJldHVybiBkYXRhLmxheWVycy5yZWR1Y2UoYXN5bmMgKHR5cGVzUHJvbWlzZSwgbGF5ZXJJZCkgPT4ge1xuICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0eXBlc1Byb21pc2U7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMubWFwLmdldExheWVyQnlJZChsYXllcklkKTtcbiAgICAgIGNvbnN0IGZlYXR1cmVzID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmdldEZlYXR1cmVzKHRoaXMubWFwLCBsYXllciwgZGF0YSwgdGhpcy5zdG9yZSlcbiAgICAgICkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMub25GaWxlRXhwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ2VvbVR5cGVzID0gdGhpcy5leHBvcnRTZXJ2aWNlLmdldEdlb21UeXBlcyhmZWF0dXJlcywgZGF0YS5mb3JtYXQpO1xuICAgICAgcmV0dXJuIHR5cGVzLmNvbmNhdChnZW9tVHlwZXMpO1xuICAgIH0sIFByb21pc2UucmVzb2x2ZShbXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUaXRsZUVtcHR5Um93cyhwcmV2aW91c0ZlYXR1cmUsIGN1cnJlbnRGZWF0dXJlKSB7XG4gICAgY29uc3QgdGl0bGVSb3cgPSBjdXJyZW50RmVhdHVyZS5jbG9uZSgpO1xuICAgIGNvbnN0IGhlYWRlclJvdyA9IGN1cnJlbnRGZWF0dXJlLmNsb25lKCk7XG4gICAgY29uc3QgZW1wdHlSb3cgPSBjdXJyZW50RmVhdHVyZS5jbG9uZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzRmVhdHVyZUtleXM6IHN0cmluZ1tdID0gcHJldmlvdXNGZWF0dXJlLmdldEtleXMoKTtcbiAgICBsZXQgZmlyc3RLZXlQcmV2aW91cyA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHByZXZpb3VzRmVhdHVyZUtleXMpIHtcbiAgICAgIGlmIChwcmV2aW91c0ZlYXR1cmVLZXlzW2tleV0gIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgZmlyc3RLZXlQcmV2aW91cyA9IHByZXZpb3VzRmVhdHVyZUtleXNba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEZlYXR1cmVLZXlzOiBzdHJpbmdbXSA9IGN1cnJlbnRGZWF0dXJlLmdldEtleXMoKTtcbiAgICBsZXQgZmlyc3RLZXlDdXJyZW50ID0gJyc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3VycmVudEZlYXR1cmVLZXlzKSB7XG4gICAgICBpZiAoY3VycmVudEZlYXR1cmVLZXlzW2tleV0gIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgZmlyc3RLZXlDdXJyZW50ID0gY3VycmVudEZlYXR1cmVLZXlzW2tleV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhbGxLZXlzOiBzdHJpbmdbXSA9IGN1cnJlbnRGZWF0dXJlLmdldEtleXMoKTtcbiAgICBwcmV2aW91c0ZlYXR1cmVLZXlzLmZvckVhY2goKHByZXZpb3VzS2V5KSA9PiB7XG4gICAgICBpZiAoYWxsS2V5cy5pbmNsdWRlcyhwcmV2aW91c0tleSkgJiYgcHJldmlvdXNLZXkgIT09IGZpcnN0S2V5UHJldmlvdXMpIHtcbiAgICAgICAgYWxsS2V5cy5wdXNoKHByZXZpb3VzS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhbGxLZXlzLnVuc2hpZnQoZmlyc3RLZXlQcmV2aW91cyk7XG5cbiAgICBsZXQgZmlyc3RLZXlBbGwgPSAnJztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICBpZiAoYWxsS2V5c1trZXldICE9PSAnZ2VvbWV0cnknKSB7XG4gICAgICAgIGZpcnN0S2V5QWxsID0gYWxsS2V5c1trZXldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYWxsS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHNhbWVLZXlzOiBib29sZWFuID1cbiAgICAgICAgcHJldmlvdXNGZWF0dXJlS2V5cy5sZW5ndGggPT09IGN1cnJlbnRGZWF0dXJlS2V5cy5sZW5ndGggJiZcbiAgICAgICAgcHJldmlvdXNGZWF0dXJlS2V5cy5ldmVyeShcbiAgICAgICAgICAodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gY3VycmVudEZlYXR1cmVLZXlzW2luZGV4XVxuICAgICAgICApO1xuICAgICAgaWYgKGtleSA9PT0gZmlyc3RLZXlBbGwgJiYgIXNhbWVLZXlzKSB7XG4gICAgICAgIHRpdGxlUm93LnNldChcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgY3VycmVudEZlYXR1cmUuZ2V0KCdfZmVhdHVyZVN0b3JlJykubGF5ZXIub3B0aW9ucy50aXRsZSArXG4gICAgICAgICAgICAnID09PT09PT09PT09PT09PT4nLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaGVhZGVyUm93LnNldChrZXksIGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gZmlyc3RLZXlBbGwgJiYgc2FtZUtleXMpIHtcbiAgICAgICAgdGl0bGVSb3cuc2V0KFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjdXJyZW50RmVhdHVyZS5nZXQoJ19mZWF0dXJlU3RvcmUnKS5sYXllci5vcHRpb25zLnRpdGxlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaGVhZGVyUm93LnNldChrZXksIGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gZmlyc3RLZXlDdXJyZW50KSB7XG4gICAgICAgIHRpdGxlUm93LnNldChcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgY3VycmVudEZlYXR1cmUuZ2V0KCdfZmVhdHVyZVN0b3JlJykubGF5ZXIub3B0aW9ucy50aXRsZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGhlYWRlclJvdy5zZXQoa2V5LCBrZXksIHRydWUpO1xuICAgICAgICBlbXB0eVJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChrZXkgIT09ICdnZW9tZXRyeScpIHtcbiAgICAgICAgdGl0bGVSb3cudW5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaGVhZGVyUm93LnNldChrZXksIGtleSwgdHJ1ZSk7XG4gICAgICAgIGVtcHR5Um93LnVuc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZVJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgICBlbXB0eVJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWN1cnJlbnRGZWF0dXJlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGhlYWRlclJvdy51bnNldChrZXksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRpdGxlRW1wdHlSb3dzID0gW3RpdGxlUm93LCBoZWFkZXJSb3csIGVtcHR5Um93XTtcbiAgICByZXR1cm4gdGl0bGVFbXB0eVJvd3M7XG4gIH1cblxuICBwcml2YXRlIGNpcmNsZVRvUG9pbnQoZmVhdHVyZTogT2xGZWF0dXJlKSB7XG4gICAgY29uc3QgcmFkaXVzOiBudW1iZXIgPSBmZWF0dXJlLmdldCgncmFkJyk7XG5cbiAgICBpZiAocmFkaXVzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IG5ldyBvbFBvaW50KFtcbiAgICAgICAgZmVhdHVyZS5nZXQoJ2xvbmdpdHVkZScpLFxuICAgICAgICBmZWF0dXJlLmdldCgnbGF0aXR1ZGUnKVxuICAgICAgXSk7XG4gICAgICBwb2ludC50cmFuc2Zvcm0oJ0VQU0c6NDMyNicsIGZlYXR1cmUuZ2V0KCdfcHJvamVjdGlvbicpKTtcbiAgICAgIGZlYXR1cmUuc2V0R2VvbWV0cnkocG9pbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKCkge1xuICAgIHRoaXMuaW1wb3J0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgaW5wdXRQcm9qOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGZvcm1hdDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgbGF5ZXJzOiBbW10sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBsYXllcnNXaXRoU2VsZWN0aW9uOiBbW11dLFxuICAgICAgY29tYmluZUxheWVyczogW3RydWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzZXBhcmF0b3I6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGZlYXR1cmVJbk1hcEV4dGVudDogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5mb3JjZU5hbWluZykge1xuICAgICAgZm9ybS5hZGRDb250cm9sKCduYW1lJywgbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pKTtcbiAgICB9XG5cbiAgICBmb3JtXG4gICAgICAuZ2V0KCdmb3JtYXQnKVxuICAgICAgLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGZvcm1hdDogRXhwb3J0Rm9ybWF0KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZUNzdkZvcm0oZm9ybSwgZm9ybWF0KVxuICAgICAgKTtcblxuICAgIHRoaXMuZm9ybSA9IGZvcm07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNzdkZvcm0oZm9ybTogRm9ybUdyb3VwLCBmb3JtYXQ6IEV4cG9ydEZvcm1hdCk6IHZvaWQge1xuICAgIGZvcm1hdCA9PT0gJ0NTVidcbiAgICAgID8gZm9ybS5hZGRDb250cm9sKFxuICAgICAgICAgICdjc3ZTZXBhcmF0b3InLFxuICAgICAgICAgIG5ldyBGb3JtQ29udHJvbCgnYXV0bycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgKVxuICAgICAgOiBmb3JtLnJlbW92ZUNvbnRyb2woJ2NzdlNlcGFyYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbGVJbXBvcnRTdWNjZXNzKGZpbGU6IEZpbGUsIGZlYXR1cmVzOiBGZWF0dXJlW10pIHtcbiAgICBjb25zdCBpbXBvcnRFeHBvcnRPcHRpb25zID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydCdcbiAgICApIGFzIEltcG9ydEV4cG9ydFNlcnZpY2VPcHRpb25zO1xuICAgIGNvbnN0IGNvbmZpcm1EaWFsb2dTZXJ2aWNlID0gaW1wb3J0RXhwb3J0T3B0aW9ucz8uYWxsb3dUb1N0b3JlTGF5ZXJcbiAgICAgID8gdGhpcy5jb25maXJtRGlhbG9nU2VydmljZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFpbXBvcnRFeHBvcnRPcHRpb25zPy5pbXBvcnRXaXRoU3R5bGUpIHtcbiAgICAgIGhhbmRsZUZpbGVJbXBvcnRTdWNjZXNzKFxuICAgICAgICBmaWxlLFxuICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgdGhpcy5tYXAsXG4gICAgICAgIHRoaXMuY29udGV4dFVyaSxcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZSxcbiAgICAgICAgdGhpcy5sYXllclNlcnZpY2UsXG4gICAgICAgIGNvbmZpcm1EaWFsb2dTZXJ2aWNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVGaWxlSW1wb3J0U3VjY2VzcyhcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZmVhdHVyZXMsXG4gICAgICAgIHRoaXMubWFwLFxuICAgICAgICB0aGlzLmNvbnRleHRVcmksXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UsXG4gICAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlLFxuICAgICAgICBjb25maXJtRGlhbG9nU2VydmljZSxcbiAgICAgICAgdGhpcy5zdHlsZUxpc3RTZXJ2aWNlLFxuICAgICAgICB0aGlzLnN0eWxlU2VydmljZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRmlsZUltcG9ydEVycm9yKGZpbGU6IEZpbGUsIGVycm9yOiBFcnJvcikge1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgaGFuZGxlRmlsZUltcG9ydEVycm9yKGZpbGUsIGVycm9yLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCB0aGlzLmZpbGVTaXplTWIpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBvcHVwQmxvY2tlZEVycm9yKHByZUNoZWNrID0gdHJ1ZSkge1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgY29uc3QgZXh0cmFNZXNzYWdlID0gcHJlQ2hlY2tcbiAgICAgID8gJ2lnby5nZW8uZXhwb3J0LnBvcHVwQmxvY2tlZC5zZWxlY3RBZ2FpbidcbiAgICAgIDogJ2lnby5nZW8uZXhwb3J0LnBvcHVwQmxvY2tlZC5yZXRyeSc7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICdpZ28uZ2VvLmV4cG9ydC5wb3B1cEJsb2NrZWQudGV4dCcsXG4gICAgICAnaWdvLmdlby5leHBvcnQucG9wdXBCbG9ja2VkLnRpdGxlJyxcbiAgICAgIHsgdGltZU91dDogMjAwMDAgfSxcbiAgICAgIHsgZXh0cmFNZXNzYWdlIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbGVFeHBvcnRFcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIGhhbmRsZUZpbGVFeHBvcnRFcnJvcihlcnJvciwgdGhpcy5tZXNzYWdlU2VydmljZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRDb25maWcoKSB7XG4gICAgY29uc3QgZm9yY2VOYW1pbmdDb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ2ltcG9ydEV4cG9ydC5mb3JjZU5hbWluZycpO1xuICAgIHRoaXMuZm9yY2VOYW1pbmcgPVxuICAgICAgZm9yY2VOYW1pbmdDb25maWcgIT09IHVuZGVmaW5lZCA/IGZvcmNlTmFtaW5nQ29uZmlnIDogZmFsc2U7XG5cbiAgICB0aGlzLmNvbmZpZ0Zvcm1hdHMgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ2ltcG9ydEV4cG9ydC5mb3JtYXRzJyk7XG4gICAgdGhpcy5jb21wdXRlRm9ybWF0cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRm9ybWF0cyhsYXllcnM/OiBBbnlMYXllcltdKSB7XG4gICAgbGV0IGFwcGxpZWRmb3JtYXRzOiBFeHBvcnRGb3JtYXRbXSA9IFsuLi5FeHBvcnRGb3JtYXRdO1xuICAgIGNvbnN0IGZvcm1hdHNUeXBlID0ge1xuICAgICAgb25seVVybDogZmFsc2UsXG4gICAgICBvbmx5VmVjdG9yOiBmYWxzZSxcbiAgICAgIHZlY3RvckFuZFVybDogZmFsc2UsXG4gICAgICBjdXN0b21MaXN0OiBmYWxzZVxuICAgIH07XG4gICAgY29uc3QgY3VzdG9tTGlzdCA9IFtdO1xuICAgIGlmIChsYXllcnM/Lmxlbmd0aCkge1xuICAgICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZD8uYWxsb3dlZEZvcm1hdHMpIHtcbiAgICAgICAgICBmb3JtYXRzVHlwZS5jdXN0b21MaXN0ID0gdHJ1ZTtcbiAgICAgICAgICBjdXN0b21MaXN0LnB1c2goe1xuICAgICAgICAgICAgbGF5ZXI6IGxheWVyLnRpdGxlLFxuICAgICAgICAgICAgZm9ybWF0czogdGhpcy52YWxpZGF0ZUxpc3RGb3JtYXQoXG4gICAgICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZC5hbGxvd2VkRm9ybWF0c1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICEobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikgJiZcbiAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQgJiZcbiAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQudXJsXG4gICAgICAgICkge1xuICAgICAgICAgIGZvcm1hdHNUeXBlLm9ubHlVcmwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZCAmJlxuICAgICAgICAgIChsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQudXJsIHx8XG4gICAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9wdGlvbnMuZG93bmxvYWQuZHluYW1pY1VybClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9ybWF0c1R5cGUudmVjdG9yQW5kVXJsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXllciBpbnN0YW5jZW9mIFZlY3RvckxheWVyKSB7XG4gICAgICAgICAgZm9ybWF0c1R5cGUub25seVZlY3RvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgaGFzVXJsID0gdGhpcy5mb3JtYXRzJC52YWx1ZS5pbmNsdWRlcygnVVJMJyk7XG5cbiAgICAgIGlmIChmb3JtYXRzVHlwZS5vbmx5VXJsID09PSB0cnVlICYmIGZvcm1hdHNUeXBlLm9ubHlWZWN0b3IgPT09IGZhbHNlKSB7XG4gICAgICAgIGFwcGxpZWRmb3JtYXRzID0gWydVUkwnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZvcm1hdHNUeXBlLm9ubHlWZWN0b3IgPT09IHRydWUgJiZcbiAgICAgICAgZm9ybWF0c1R5cGUub25seVVybCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbXB1dGVGb3JtYXRzKCk7IC8vIHJlc2V0XG4gICAgICAgIGlmIChoYXNVcmwpIHtcbiAgICAgICAgICBhcHBsaWVkZm9ybWF0cyA9IFsuLi50aGlzLmZvcm1hdHMkLnZhbHVlXS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiBrZXkgIT09ICdVUkwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZm9ybWF0c1R5cGUudmVjdG9yQW5kVXJsID09PSB0cnVlICYmXG4gICAgICAgIGZvcm1hdHNUeXBlLm9ubHlVcmwgPT09IGZhbHNlICYmXG4gICAgICAgIGZvcm1hdHNUeXBlLm9ubHlWZWN0b3IgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb21wdXRlRm9ybWF0cygpOyAvLyByZXNldFxuICAgICAgICBpZiAoIWhhc1VybCkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBbLi4udGhpcy5mb3JtYXRzJC52YWx1ZV07XG4gICAgICAgICAga2V5cy5wdXNoKCdVUkwnKTtcbiAgICAgICAgICBhcHBsaWVkZm9ybWF0cyA9IGtleXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBsaWVkZm9ybWF0cyA9IHRoaXMuZ2V0QXZhaWxhYmxlRm9ybWF0cyhhcHBsaWVkZm9ybWF0cyk7XG5cbiAgICBpZiAoZm9ybWF0c1R5cGUuY3VzdG9tTGlzdCkge1xuICAgICAgbGV0IGNvbW1vbkZvcm1hdHM7XG4gICAgICBjb25zdCBsYXllcnNXaXRoQ3VzdG9tRm9ybWF0cyA9IFtdO1xuICAgICAgbGV0IHByZXZpb3VzQ3VzdG9tTGlzdEZvcm1hdHMgPSBjdXN0b21MaXN0WzBdLmZvcm1hdHM7XG4gICAgICBjdXN0b21MaXN0Lm1hcCgobGlzdCkgPT4ge1xuICAgICAgICBsYXllcnNXaXRoQ3VzdG9tRm9ybWF0cy5wdXNoKGxpc3QubGF5ZXIpO1xuICAgICAgICBjb21tb25Gb3JtYXRzID0gbGlzdC5mb3JtYXRzLmZpbHRlcigodmFsdWUpID0+XG4gICAgICAgICAgcHJldmlvdXNDdXN0b21MaXN0Rm9ybWF0cy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgcHJldmlvdXNDdXN0b21MaXN0Rm9ybWF0cyA9IGxpc3QuZm9ybWF0cztcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZmluYWxGb3JtYXRzID0gY29tbW9uRm9ybWF0cy5maWx0ZXIoKHZhbHVlKSA9PlxuICAgICAgICBhcHBsaWVkZm9ybWF0cy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICk7XG4gICAgICBpZiAoZmluYWxGb3JtYXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb3JtYXRzJC5uZXh0KGZpbmFsRm9ybWF0cyk7XG5cbiAgICAgICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICAgICAnaWdvLmdlby5leHBvcnQuY3VzdG9tTGlzdC50ZXh0JyxcbiAgICAgICAgICAgICAgJ2lnby5nZW8uZXhwb3J0LmN1c3RvbUxpc3QudGl0bGUnLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHsgdmFsdWU6IGxheWVyc1dpdGhDdXN0b21Gb3JtYXRzLmpvaW4oKSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtYXRzJC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcbiAgICAgICAgICAnaWdvLmdlby5leHBvcnQubm9Gb3JtYXQudGV4dCcsXG4gICAgICAgICAgJ2lnby5nZW8uZXhwb3J0Lm5vRm9ybWF0LnRpdGxlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1hdHMkLm5leHQoYXBwbGllZGZvcm1hdHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXZhaWxhYmxlRm9ybWF0cyhsYXllckZvcm1hdHM6IEV4cG9ydEZvcm1hdFtdKTogRXhwb3J0Rm9ybWF0W10ge1xuICAgIGlmICghdGhpcy5jb25maWdGb3JtYXRzKSB7XG4gICAgICByZXR1cm4gbGF5ZXJGb3JtYXRzO1xuICAgIH1cbiAgICBjb25zdCBhdmFpbGFibGVGb3JtYXRzID0gdGhpcy52YWxpZGF0ZUxpc3RGb3JtYXQodGhpcy5jb25maWdGb3JtYXRzKTtcbiAgICByZXR1cm4gbGF5ZXJGb3JtYXRzLmZpbHRlcigobGF5ZXJGb3JtYXQpID0+XG4gICAgICBhdmFpbGFibGVGb3JtYXRzLmluY2x1ZGVzKGxheWVyRm9ybWF0KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlTGlzdEZvcm1hdChmb3JtYXRzOiBBbnlFeHBvcnRGb3JtYXRbXSk6IEV4cG9ydEZvcm1hdFtdIHtcbiAgICBjb25zdCBhbGxVcHBlcmNhc2VGb3JtYXRzID0gWy4uLkV4cG9ydEZvcm1hdCwgLi4uRXhwb3J0Rm9ybWF0TGVnYWN5XS5tYXAoXG4gICAgICAoZikgPT4gZi50b1VwcGVyQ2FzZSgpXG4gICAgKTtcblxuICAgIHJldHVybiBmb3JtYXRzXG4gICAgICAuZmlsdGVyKChmb3JtYXQpID0+IHtcbiAgICAgICAgaWYgKGFsbFVwcGVyY2FzZUZvcm1hdHMuaW5jbHVkZXMoZm9ybWF0LnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5tYXAoKGZvcm1hdCkgPT4ge1xuICAgICAgICBjb25zdCBjc3ZGb3JtYXRzOiBzdHJpbmdbXSA9IChcbiAgICAgICAgICBbJ0NTVicsICdDU1Zjb21tYScsICdDU1ZzZW1pY29sb24nXSBzYXRpc2ZpZXMgQW55RXhwb3J0Rm9ybWF0W11cbiAgICAgICAgKS5tYXAoKGYpID0+IGYudG9VcHBlckNhc2UoKSk7XG4gICAgICAgIGlmIChjc3ZGb3JtYXRzLmluY2x1ZGVzKGZvcm1hdC50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgIHJldHVybiAnQ1NWJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBhcmVTdHJpbmc8RXhwb3J0Rm9ybWF0PignRXhjZWwnLCBmb3JtYXQpKSB7XG4gICAgICAgICAgcmV0dXJuICdFeGNlbCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ0dNTCcsIGZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gJ0dNTCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ0dQWCcsIGZvcm1hdCkpIHtcbiAgICAgICAgICByZXR1cm4gJ0dQWCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJlU3RyaW5nPEV4cG9ydEZvcm1hdD4oJ0dlb0pTT04nLCBmb3JtYXQpKSB7XG4gICAgICAgICAgcmV0dXJuICdHZW9KU09OJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBhcmVTdHJpbmc8RXhwb3J0Rm9ybWF0PignS01MJywgZm9ybWF0KSkge1xuICAgICAgICAgIHJldHVybiAnS01MJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBhcmVTdHJpbmc8RXhwb3J0Rm9ybWF0PignU2hhcGVmaWxlJywgZm9ybWF0KSkge1xuICAgICAgICAgIHJldHVybiAnU2hhcGVmaWxlJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBhcmVTdHJpbmc8RXhwb3J0Rm9ybWF0PignVVJMJywgZm9ybWF0KSkge1xuICAgICAgICAgIHJldHVybiAnVVJMJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBhcmVTdHJpbmc8VCBleHRlbmRzIHN0cmluZz4odmFsdWUxOiBULCB2YWx1ZTI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZTEudG9VcHBlckNhc2UoKSA9PT0gdmFsdWUyLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgbW9kZUNoYW5nZWQobW9kZTogU2VsZWN0TW9kZSkge1xuICAgIHRoaXMuc2VsZWN0TW9kZS5lbWl0KG1vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkZpbGVFeHBvcnRTdWNjZXNzKCkge1xuICAgIGhhbmRsZUZpbGVFeHBvcnRTdWNjZXNzKHRoaXMubWVzc2FnZVNlcnZpY2UpO1xuICB9XG5cbiAgb25JbXBvcnRFeHBvcnRDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IGV2ZW50LnZhbHVlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW1wb3J0LWV4cG9ydC10b2dnbGVcIj5cbiAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXG4gICAgW3ZhbHVlXT1cInNlbGVjdGVkTW9kZVwiXG4gICAgKGNoYW5nZSk9XCJvbkltcG9ydEV4cG9ydENoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiJ2ltcG9ydCdcIj5cbiAgICAgIHt7ICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0VGFiVGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIidleHBvcnQnXCI+XG4gICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydFRhYlRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG48L2Rpdj5cblxuPGZvcm1cbiAgY2xhc3M9XCJpZ28tZm9ybVwiXG4gIFtmb3JtR3JvdXBdPVwiaW1wb3J0Rm9ybVwiXG4gICpuZ0lmPVwic2VsZWN0ZWRNb2RlID09PSAnaW1wb3J0J1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydFByb2pQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcbiAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJpbnB1dFByb2pcIj5cbiAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJvamVjdGlvbiBvZiBwcm9qZWN0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgICAgW3ZhbHVlXT1cInByb2plY3Rpb25cIlxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1UaXRsZSAqbmdJZj1cInByb2plY3Rpb24udHJhbnNsYXRlS2V5XCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLnByb2plY3Rpb25zLicgKyBwcm9qZWN0aW9uLnRyYW5zbGF0ZUtleVxuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiBwcm9qZWN0aW9uXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBtYXRMaXN0SXRlbVRpdGxlICpuZ0lmPVwiIXByb2plY3Rpb24udHJhbnNsYXRlS2V5XCI+XG4gICAgICAgICAgICB7eyBwcm9qZWN0aW9uLmFsaWFzIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICBpbXBvcnRGb3JtLmludmFsaWRcbiAgICAgICAgPyAoJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5wcm9qZWN0aW9ucy5jaG9vc2UnIHwgdHJhbnNsYXRlKVxuICAgICAgICA6ICgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydEJ1dHRvbicgfCB0cmFuc2xhdGUpXG4gICAgXCJcbiAgICBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwiaW1wb3J0Rm9ybS5pbnZhbGlkIHx8IChsb2FkaW5nJCB8IGFzeW5jKVwiXG4gICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgID5cbiAgICAgIHt7ICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0QnV0dG9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxpZ28tc3Bpbm5lciBbc2hvd25dPVwibG9hZGluZyQgfCBhc3luY1wiPjwvaWdvLXNwaW5uZXI+XG4gICAgPGlucHV0XG4gICAgICBoaWRkZW5cbiAgICAgICNmaWxlSW5wdXRcbiAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIidub25lJ1wiXG4gICAgICAoY2xpY2spPVwiZmlsZUlucHV0LnZhbHVlID0gbnVsbFwiXG4gICAgICAoY2hhbmdlKT1cImltcG9ydEZpbGVzKCRhbnkoJGV2ZW50LnRhcmdldCkuZmlsZXMpXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvZm9ybT5cbjxzZWN0aW9uICpuZ0lmPVwic2VsZWN0ZWRNb2RlID09PSAnaW1wb3J0J1wiPlxuICA8ZGl2ICpuZ0lmPVwiaW1wb3J0SHRtbENsYXJpZmljYXRpb25zID09PSAnJ1wiPlxuICAgIDxoND57eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydENsYXJpZmljYXRpb25zJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgPHVsPlxuICAgICAgPGxpPlxuICAgICAgICB7e1xuICAgICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uaW1wb3J0U2l6ZU1heCdcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHNpemU6IGZpbGVTaXplTWIgfVxuICAgICAgICB9fVxuICAgICAgPC9saT5cbiAgICAgIDxsaT5cbiAgICAgICAge3sgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5pbXBvcnRGb3JtYXRBdXRob3JpemVkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9saT5cbiAgICAgIDxsaT57eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmltcG9ydFNocFppcCcgfCB0cmFuc2xhdGUgfX08L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuICA8aWdvLWN1c3RvbS1odG1sXG4gICAgKm5nSWY9XCJpbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnMgIT09ICcnXCJcbiAgICBbaHRtbF09XCJpbXBvcnRIdG1sQ2xhcmlmaWNhdGlvbnNcIlxuICA+XG4gIDwvaWdvLWN1c3RvbS1odG1sPlxuPC9zZWN0aW9uPlxuXG48c2VjdGlvblxuICAqbmdJZj1cIihleHBvcnRhYmxlTGF5ZXJzJCB8IGFzeW5jKS5sZW5ndGggPT09IDAgJiYgc2VsZWN0ZWRNb2RlID09PSAnZXhwb3J0J1wiXG4+XG4gIDxoND57eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydE5vTGF5ZXJzRXhwb3J0YWJsZScgfCB0cmFuc2xhdGUgfX08L2g0PlxuPC9zZWN0aW9uPlxuXG48Zm9ybVxuICBjbGFzcz1cImlnby1mb3JtXCJcbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgKm5nSWY9XCIoZXhwb3J0YWJsZUxheWVycyQgfCBhc3luYykubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1vZGUgPT09ICdleHBvcnQnXCJcbj5cbiAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPnt7XG4gICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0TGF5ZXJQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcbiAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJsYXllcnNcIiBtdWx0aXBsZT5cbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICB7eyBsYXllcnMubGVuZ3RoID8gZ2V0TGF5ZXJUaXRsZUJ5SWQobGF5ZXJzWzBdKSA6ICcnIH19XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsYXllcnMubGVuZ3RoID4gMVwiIGNsYXNzPVwiZXhwb3J0LXNlbGVjdC10cmlnZ2VyXCI+XG4gICAgICAgICAgICAoK3t7IGxheWVycy5sZW5ndGggLSAxIH19XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAobGF5ZXJzPy5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgICA/ICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0ub3RoZXInXG4gICAgICAgICAgICAgICAgOiAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLm90aGVycydcbiAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX0pXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGF5ZXIgb2YgZXhwb3J0YWJsZUxheWVycyQgfCBhc3luY1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2lnby1leHBvcnQtbGF5ZXItbWF0LW9wdGlvbic6IGxheWVySGFzU2VsZWN0ZWRGZWF0dXJlcyhsYXllcilcbiAgICAgICAgICB9XCJcbiAgICAgICAgICBbdmFsdWVdPVwibGF5ZXIuaWRcIlxuICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1UaXRsZT57eyBsYXllci50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBtYXRMaXN0SXRlbVRpdGxlPlxuICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgKm5nSWY9XCJsYXllckhhc1NlbGVjdGVkRmVhdHVyZXMobGF5ZXIpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9ubHlTZWxlY3RlZENsaWNrKCRldmVudCwgbGF5ZXIuaWQpXCJcbiAgICAgICAgICAgICAgKGNoZWNrZWQpPVwiaW5MYXllcnNJZFRvRXhwb3J0U2VsZWN0aW9uT25seShsYXllcilcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9ubHlTZWxlY3RlZCgkZXZlbnQsIGxheWVyLmlkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzbWFsbD57e1xuICAgICAgICAgICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0U2VsZWN0ZWRGZWF0dXJlJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICB9fTwvc21hbGw+XG4gICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPnt7XG4gICAgICAgICdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0Rm9ybWF0UGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybWF0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZm9ybWF0cyQgfCBhc3luYykubGVuZ3RoICE9PSAwXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGZvcm1hdCBvZiBmb3JtYXRzJCB8IGFzeW5jXCIgW3ZhbHVlXT1cImZvcm1hdFwiPlxuICAgICAgICAgICAge3sgJ2lnby5nZW8uZXhwb3J0LmZvcm1hdC4nICsgZm9ybWF0IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCIoZm9ybWF0cyQgfCBhc3luYykubGVuZ3RoID09PSAwXCIgZGlzYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAge3sgJ2lnby5nZW8uZXhwb3J0Lm5vRm9ybWF0LnRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaWdvLWlucHV0LWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJmb3JjZU5hbWluZyAmJiBmb3JtLnZhbHVlLmZvcm1hdCAhPT0gJ1VSTCdcIlxuICA+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7XG4gICAgICAgICAgJ2lnby5nZW8uaW1wb3J0RXhwb3J0Rm9ybS5leHBvcnRGaWxlTmFtZVBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVxuICAgICAgICB9fVwiXG4gICAgICAvPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGlzLmlzQ3N2RXhwb3J0KGZvcm0udmFsdWUuZm9ybWF0KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ28taW5wdXQtY29udGFpbmVyXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+e3sgJ2lnby5nZW8uZXhwb3J0LnNlcGFyYXRvcicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3N2U2VwYXJhdG9yXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzZXBhcmF0b3Igb2YgY3N2U2VwYXJhdG9yc1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VwYXJhdG9yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnaWdvLmdlby5leHBvcnQuY3N2LnNlcGFyYXRvci4nICsgc2VwYXJhdG9yIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJsYXllcnMubGVuZ3RoID4gMVwiIGNsYXNzPVwiZXhwb3J0LWNvbWJpbmUtbGF5ZXJzXCI+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21iaW5lTGF5ZXJzXCJcbiAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxuICAgICAgPlxuICAgICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydENvbWJpbmVSZXN1bHRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJsYXllcnMubGVuZ3RoID4gMSAmJiBmb3JtLnZhbHVlLmNvbWJpbmVMYXllcnNcIlxuICAgICAgY2xhc3M9XCJleHBvcnQtc2VwYXJhdG9yXCJcbiAgICA+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBmb3JtQ29udHJvbE5hbWU9XCJzZXBhcmF0b3JcIiBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiPlxuICAgICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydFNlcGFyYXRvcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImV4cG9ydC1vcHRpb25zXCIgKm5nSWY9XCJmb3JtLnZhbHVlLmZvcm1hdCAhPT0gJ1VSTCdcIj5cbiAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmVhdHVyZUluTWFwRXh0ZW50XCJcbiAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcbiAgICA+XG4gICAgICB7eyAnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEZlYXR1cmVJbkV4dGVudCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWQgfHwgKGxvYWRpbmckIHwgYXN5bmMpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVFeHBvcnRGb3JtU3VibWl0KGZvcm0udmFsdWUpXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBmb3JtLnZhbHVlLmZvcm1hdCAhPT0gJ1VSTCdcbiAgICAgICAgICA/ICgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEJ1dHRvbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiBmb3JtLnZhbHVlLmxheWVycy5sZW5ndGggPiAxXG4gICAgICAgICAgICA/ICgnaWdvLmdlby5pbXBvcnRFeHBvcnRGb3JtLmV4cG9ydEJ1dHRvbkxpbmtzJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogKCdpZ28uZ2VvLmltcG9ydEV4cG9ydEZvcm0uZXhwb3J0QnV0dG9uTGluaycgfCB0cmFuc2xhdGUpXG4gICAgICB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxpZ28tc3Bpbm5lciBbc2hvd25dPVwibG9hZGluZyQgfCBhc3luY1wiPjwvaWdvLXNwaW5uZXI+XG4gIDwvZGl2PlxuXG4gIDxpZ28tY3VzdG9tLWh0bWxcbiAgICAqbmdJZj1cImV4cG9ydEh0bWxDbGFyaWZpY2F0aW9ucyAhPT0gJydcIlxuICAgIFtodG1sXT1cImV4cG9ydEh0bWxDbGFyaWZpY2F0aW9uc1wiXG4gID5cbiAgPC9pZ28tY3VzdG9tLWh0bWw+XG48L2Zvcm0+XG4iXX0=