@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,570 +0,0 @@
1
- import { ObjectUtils } from '@igo2/utils';
2
- import { unByKey } from 'ol/Observable';
3
- import { asArray as ColorAsArray } from 'ol/color';
4
- import { easeOut } from 'ol/easing';
5
- import * as olformat from 'ol/format';
6
- import olLayerVector from 'ol/layer/Vector';
7
- import * as olproj from 'ol/proj';
8
- import olProjection from 'ol/proj/Projection';
9
- import { getVectorContext } from 'ol/render';
10
- import { fromEvent, of, zip } from 'rxjs';
11
- import { catchError, concatMap, debounceTime, delay, first } from 'rxjs/operators';
12
- import { FeatureDataSource } from '../../../datasource/shared/datasources/feature-datasource';
13
- import { buildUrl, defaultMaxFeatures } from '../../../datasource/shared/datasources/wms-wfs.utils';
14
- import { getResolutionFromScale } from '../../../map/shared/map.utils';
15
- import { InsertSourceInsertDBEnum } from '../../../offline/geoDB/geoDB.enums';
16
- import { olStyleToBasicIgoStyle } from '../../../style/shared/vector/conversion.utils';
17
- import { VectorWatcher } from '../../utils/vector-watcher';
18
- import { Layer } from './layer';
19
- export class VectorLayer extends Layer {
20
- messageService;
21
- authInterceptor;
22
- geoNetworkService;
23
- geoDBService;
24
- layerDBService;
25
- previousLoadExtent;
26
- previousLoadResolution;
27
- previousOgcFilters;
28
- xhrAccumulator = [];
29
- watcher;
30
- trackFeatureListenerId;
31
- get browsable() {
32
- return this.options.browsable !== false;
33
- }
34
- get exportable() {
35
- return this.options.exportable !== false;
36
- }
37
- constructor(options, messageService, authInterceptor, geoNetworkService, geoDBService, layerDBService) {
38
- super(options, messageService, authInterceptor);
39
- this.messageService = messageService;
40
- this.authInterceptor = authInterceptor;
41
- this.geoNetworkService = geoNetworkService;
42
- this.geoDBService = geoDBService;
43
- this.layerDBService = layerDBService;
44
- this.watcher = new VectorWatcher(this);
45
- this.status$ = this.watcher.status$;
46
- }
47
- createOlLayer() {
48
- const initialOpacityValue = this.options.opacity || 1;
49
- const initialVisibleValue = this.options.visible !== false;
50
- const initialMinResValue = this.options.minResolution ||
51
- getResolutionFromScale(Number(this.options.minScaleDenom));
52
- const initialMaxResValue = this.options.maxResolution ||
53
- getResolutionFromScale(Number(this.options.maxScaleDenom));
54
- const so = this.options.sourceOptions;
55
- if (this.dataSource instanceof FeatureDataSource) {
56
- if (so?.preload?.bypassResolution || so?.preload?.bypassVisible) {
57
- this.options.opacity = 0;
58
- if (so.preload.bypassResolution &&
59
- (this.options.minResolution || this.options.maxResolution)) {
60
- this.options.minResolution = 0;
61
- this.options.maxResolution = Infinity;
62
- }
63
- if (so.preload.bypassVisible && !initialVisibleValue) {
64
- this.options.visible = true;
65
- }
66
- }
67
- }
68
- const olOptions = Object.assign({}, this.options, {
69
- source: this.options.source.ol,
70
- sourceOptions: this.options.sourceOptions || this.options.source.options
71
- });
72
- if (this.options.animation) {
73
- this.dataSource.ol.on('addfeature', function (e) {
74
- this.flash(e.feature);
75
- }.bind(this));
76
- }
77
- if (this.options.idbInfo?.storeToIdb && this.geoDBService) {
78
- if (this.options.idbInfo.firstLoad) {
79
- this.maintainFeaturesInIdb();
80
- }
81
- this.dataSource.ol.once('featuresloadend', () => {
82
- this.dataSource.ol.on('addfeature', () => this.maintainFeaturesInIdb());
83
- this.dataSource.ol.on('changefeature', () => this.maintainFeaturesInIdb());
84
- this.dataSource.ol.on('clear', () => this.maintainFeaturesInIdb());
85
- this.dataSource.ol.on('removefeature', () => this.maintainFeaturesInIdb());
86
- });
87
- }
88
- if (this.dataSource instanceof FeatureDataSource &&
89
- (so?.preload?.bypassResolution || so?.preload?.bypassVisible)) {
90
- this.dataSource.ol.once('featuresloadend', () => {
91
- if (initialOpacityValue) {
92
- this.opacity = initialOpacityValue;
93
- }
94
- if (so.preload.bypassResolution) {
95
- this.minResolution = initialMinResValue;
96
- this.maxResolution = initialMaxResValue;
97
- }
98
- if (so.preload.bypassVisible) {
99
- this.visible = initialVisibleValue;
100
- }
101
- });
102
- }
103
- if (this.options.trackFeature) {
104
- this.enableTrackFeature(this.options.trackFeature);
105
- }
106
- const vector = new olLayerVector(olOptions);
107
- const vectorSource = vector.getSource();
108
- const url = vectorSource.getUrl();
109
- if (typeof url === 'function') {
110
- return vector;
111
- }
112
- if (url || olOptions.sourceOptions?.type === 'wfs') {
113
- let loader;
114
- const wfsOptions = olOptions.sourceOptions;
115
- if (wfsOptions?.type === 'wfs' &&
116
- (wfsOptions.params || wfsOptions.paramsWFS)) {
117
- loader = (extent, resolution, proj, success, failure) => {
118
- this.customWFSLoader(vectorSource, wfsOptions, this.authInterceptor, extent, resolution, proj, success, failure);
119
- };
120
- }
121
- else {
122
- loader = (extent, resolution, proj, success, failure) => {
123
- this.customLoader(vectorSource, url, extent, resolution, proj, success, failure);
124
- };
125
- }
126
- if (loader) {
127
- vectorSource.setLoader(loader);
128
- }
129
- }
130
- else if (this.options.idbInfo?.storeToIdb && this.geoDBService) {
131
- const idbLoader = (extent, resolution, proj, success, failure) => {
132
- this.customIDBLoader(vectorSource, olOptions.id, extent, proj, success, failure);
133
- };
134
- if (idbLoader) {
135
- vectorSource.setLoader(idbLoader);
136
- }
137
- }
138
- if (this.options.idbInfo?.storeToIdb && this.geoDBService) {
139
- vector.once('sourceready', () => {
140
- if (this.options.idbInfo.firstLoad) {
141
- this.maintainOptionsInIdb();
142
- }
143
- fromEvent(vector, 'change')
144
- .pipe(debounceTime(750))
145
- .subscribe(() => this.maintainOptionsInIdb());
146
- vector.on('change:zIndex', () => this.maintainOptionsInIdb());
147
- });
148
- }
149
- return vector;
150
- }
151
- removeLayerFromIDB() {
152
- if (this.geoDBService && this.layerDBService) {
153
- zip(this.geoDBService.deleteByKey(this.id), this.layerDBService.deleteByKey(this.id)).subscribe();
154
- }
155
- }
156
- maintainOptionsInIdb() {
157
- this.options.igoStyle.igoStyleObject = olStyleToBasicIgoStyle(this.ol);
158
- const layerData = ObjectUtils.removeUndefined({
159
- layerId: this.id,
160
- detailedContextUri: this.options.idbInfo.contextUri,
161
- sourceOptions: {
162
- id: this.id,
163
- type: 'vector',
164
- queryable: true
165
- },
166
- layerOptions: {
167
- workspace: this.options.workspace,
168
- zIndex: this.ol ? this.zIndex : 1000000,
169
- id: this.id,
170
- isIgoInternalLayer: this.isIgoInternalLayer,
171
- title: this.title,
172
- igoStyle: this.options.igoStyle,
173
- idbInfo: Object.assign({}, this.options.idbInfo, { firstLoad: false })
174
- },
175
- insertEvent: `${this.title}-${this.id}-${new Date()}`
176
- });
177
- this.layerDBService.update(layerData);
178
- }
179
- maintainFeaturesInIdb() {
180
- const dsFeatures = this.dataSource.ol.getFeatures();
181
- const geojsonObject = JSON.parse(new olformat.GeoJSON().writeFeatures(dsFeatures, {
182
- dataProjection: 'EPSG:4326',
183
- featureProjection: this.dataSource.ol.getProjection() || 'EPSG:3857'
184
- }));
185
- this.geoDBService.update(this.id, this.id, geojsonObject, InsertSourceInsertDBEnum.User, `${this.title}-${this.id}-${new Date()}`);
186
- }
187
- flash(feature) {
188
- const start = new Date().getTime();
189
- const listenerKey = this.ol.on('postrender', animate.bind(this));
190
- function animate(event) {
191
- const vectorContext = getVectorContext(event);
192
- const frameState = event.frameState;
193
- const flashGeom = feature.getGeometry().clone();
194
- const elapsed = frameState.time - start;
195
- const elapsedRatio = elapsed / this.options.animation.duration;
196
- const opacity = easeOut(1 - elapsedRatio);
197
- const newColor = ColorAsArray(this.options.animation.color || 'red');
198
- newColor[3] = opacity;
199
- let style = this.ol
200
- .getStyleFunction()
201
- .call(this, feature)
202
- .find((style2) => {
203
- return style2.getImage();
204
- });
205
- if (!style) {
206
- style = this.ol.getStyleFunction().call(this, feature)[0];
207
- }
208
- const styleClone = style.clone();
209
- switch (feature.getGeometry().getType()) {
210
- case 'Point':
211
- if (styleClone.getImage() !== null &&
212
- typeof styleClone.getImage().getRadius === 'function') {
213
- const radius = easeOut(elapsedRatio) * (styleClone.getImage().getRadius() * 3);
214
- styleClone.getImage().setRadius(radius);
215
- styleClone.getImage().setOpacity(opacity);
216
- }
217
- break;
218
- case 'LineString':
219
- // TODO
220
- if (styleClone.getImage()) {
221
- styleClone.getImage().getStroke().setColor(newColor);
222
- styleClone
223
- .getImage()
224
- .getStroke()
225
- .setWidth(easeOut(elapsedRatio) *
226
- (styleClone.getImage().getStroke().getWidth() * 3));
227
- }
228
- if (styleClone.getStroke()) {
229
- styleClone.getStroke().setColor(newColor);
230
- styleClone
231
- .getStroke()
232
- .setWidth(easeOut(elapsedRatio) * (styleClone.getStroke().getWidth() * 3));
233
- }
234
- break;
235
- case 'Polygon':
236
- // TODO
237
- if (styleClone.getImage()) {
238
- styleClone.getImage().getFill().setColor(newColor);
239
- }
240
- if (styleClone.getFill()) {
241
- styleClone.getFill().setColor(newColor);
242
- }
243
- break;
244
- }
245
- styleClone.setText('');
246
- vectorContext.setStyle(styleClone);
247
- vectorContext.drawGeometry(flashGeom);
248
- if (elapsed > this.options.animation.duration) {
249
- unByKey(listenerKey);
250
- // remove last geometry
251
- // there is a little flash before feature disappear, better solution ?
252
- this.map.ol.render();
253
- return;
254
- }
255
- // tell OpenLayers to continue postcompose animation
256
- this.map.ol.render();
257
- }
258
- }
259
- setMap(map) {
260
- if (map === undefined) {
261
- this.watcher.unsubscribe();
262
- }
263
- else {
264
- this.watcher.subscribe(() => void 1);
265
- }
266
- super.setMap(map);
267
- }
268
- setExtent(extent) {
269
- this.options.extent = extent;
270
- }
271
- onUnwatch() {
272
- this.dataSource.onUnwatch();
273
- this.stopAnimation();
274
- }
275
- stopAnimation() {
276
- this.dataSource.ol.un('addfeature', function (e) {
277
- if (this.visible) {
278
- this.flash(e.feature);
279
- }
280
- }.bind(this));
281
- }
282
- enableTrackFeature(id) {
283
- this.trackFeatureListenerId = this.dataSource.ol.on('addfeature', this.trackFeature.bind(this, id));
284
- }
285
- centerMapOnFeature(id) {
286
- const feat = this.dataSource.ol.getFeatureById(id);
287
- if (feat) {
288
- this.map.ol
289
- .getView()
290
- .setCenter(feat.getGeometry().getCoordinates());
291
- }
292
- }
293
- trackFeature(id, feat) {
294
- if (feat.feature.getId() === id && this.visible) {
295
- this.centerMapOnFeature(id);
296
- }
297
- }
298
- disableTrackFeature() {
299
- unByKey(this.trackFeatureListenerId);
300
- }
301
- /**
302
- * Custom loader for a WFS datasource
303
- * @internal
304
- * @param vectorSource the vector source to be created
305
- * @param options olOptions from source
306
- * @param interceptor the interceptor of the data
307
- * @param extent the extent of the requested data
308
- * @param resolution the current resolution
309
- * @param proj the projection to retrieve the data
310
- * @param success success callback
311
- * @param failure failure callback
312
- * @param randomParam random parameter to ensure cache is not causing problems in retrieving new data
313
- */
314
- customWFSLoader(vectorSource, options, interceptor, extent, resolution, proj, success, failure, randomParam) {
315
- {
316
- const paramsWFS = options.paramsWFS;
317
- const wfsProj = paramsWFS.srsName
318
- ? new olProjection({ code: paramsWFS.srsName })
319
- : proj;
320
- const currentExtent = olproj.transformExtent(extent, proj, wfsProj);
321
- const ogcFilters = options.ogcFilters;
322
- if ((this.previousLoadExtent &&
323
- this.previousLoadExtent !== currentExtent) ||
324
- (this.previousLoadResolution &&
325
- this.previousLoadResolution !== resolution) ||
326
- (this.previousOgcFilters && this.previousOgcFilters !== ogcFilters)) {
327
- vectorSource.removeLoadedExtent(this.previousLoadExtent);
328
- for (const xhr of this.xhrAccumulator) {
329
- xhr.abort();
330
- }
331
- }
332
- this.previousLoadExtent = currentExtent;
333
- this.previousLoadResolution = resolution;
334
- this.previousOgcFilters = ogcFilters;
335
- paramsWFS.srsName = paramsWFS.srsName || proj.getCode();
336
- const url = buildUrl(options, currentExtent, wfsProj, ogcFilters, randomParam);
337
- let startIndex = 0;
338
- if (paramsWFS.version === '2.0.0' &&
339
- paramsWFS.maxFeatures > defaultMaxFeatures) {
340
- const nbOfFeature = 1000;
341
- while (startIndex < paramsWFS.maxFeatures) {
342
- let alteredUrl = url.replace('count=' + paramsWFS.maxFeatures, 'count=' + nbOfFeature);
343
- alteredUrl = alteredUrl.replace('startIndex=0', '0');
344
- alteredUrl += '&startIndex=' + startIndex;
345
- alteredUrl.replace(/&&/g, '&');
346
- this.getFeatures(vectorSource, currentExtent, wfsProj, proj, alteredUrl, success, failure);
347
- startIndex += nbOfFeature;
348
- }
349
- }
350
- else {
351
- this.getFeatures(vectorSource, currentExtent, wfsProj, proj, url, success, failure);
352
- }
353
- }
354
- }
355
- /**
356
- * Custom loader to get feature from a WFS datasource
357
- * @internal
358
- * @param vectorSource the vector source to be created
359
- * @param extent the extent of the requested data
360
- * @param dataProjection the projection of the retrieved data
361
- * @param featureProjection the projection of the created features
362
- * @param url the url string to retrieve the data
363
- * @param success success callback
364
- * @param failure failure callback
365
- */
366
- getFeatures(vectorSource, extent, dataProjection, featureProjection, url, success, failure) {
367
- const xhr = new XMLHttpRequest();
368
- const alteredUrlWithKeyAuth = this.authInterceptor.alterUrlWithKeyAuth(url);
369
- let modifiedUrl = url;
370
- if (alteredUrlWithKeyAuth) {
371
- modifiedUrl = alteredUrlWithKeyAuth;
372
- }
373
- xhr.open('GET', modifiedUrl);
374
- if (this.authInterceptor) {
375
- this.authInterceptor.interceptXhr(xhr, modifiedUrl);
376
- }
377
- const onError = () => {
378
- vectorSource.removeLoadedExtent(extent);
379
- failure();
380
- };
381
- xhr.onerror = onError;
382
- xhr.onload = () => {
383
- if (xhr.status === 200 && xhr.responseText.length > 0) {
384
- const features = vectorSource
385
- .getFormat()
386
- .readFeatures(xhr.responseText, {
387
- dataProjection,
388
- featureProjection
389
- });
390
- if (features) {
391
- vectorSource.addFeatures(features);
392
- success(features);
393
- }
394
- else {
395
- success([]);
396
- }
397
- }
398
- else {
399
- onError();
400
- }
401
- };
402
- this.xhrAccumulator.push(xhr);
403
- xhr.send();
404
- }
405
- /**
406
- * Custom loader for vector layer.
407
- * @internal
408
- * @param vectorSource the vector source to be created
409
- * @param url the url string or function to retrieve the data
410
- * @param extent the extent of the requested data
411
- * @param resolution the current resolution
412
- * @param projection the projection to retrieve the data
413
- */
414
- customLoader(vectorSource, url, extent, resolution, projection, success, failure) {
415
- const xhr = new XMLHttpRequest();
416
- let modifiedUrl = url;
417
- if (typeof url !== 'function') {
418
- const alteredUrlWithKeyAuth = this.authInterceptor.alterUrlWithKeyAuth(url);
419
- if (alteredUrlWithKeyAuth) {
420
- modifiedUrl = alteredUrlWithKeyAuth;
421
- }
422
- }
423
- if (this.geoNetworkService && typeof url !== 'function') {
424
- const format = vectorSource.getFormat();
425
- const type = format.getType();
426
- const responseType = type;
427
- const onError = () => {
428
- vectorSource.removeLoadedExtent(extent);
429
- failure();
430
- };
431
- const options = { responseType };
432
- this.geoNetworkService.geoDBService
433
- .get(url)
434
- .pipe(delay(750))
435
- .pipe(concatMap((r) => r
436
- ? of(r)
437
- : this.geoNetworkService.get(modifiedUrl, options).pipe(first(), catchError((res) => {
438
- onError();
439
- throw res;
440
- }))))
441
- .subscribe((content) => {
442
- if (content) {
443
- const format = vectorSource.getFormat();
444
- const type = format.getType();
445
- let source;
446
- if (type === 'json' || type === 'text') {
447
- source = content;
448
- }
449
- else if (type === 'xml') {
450
- source = content;
451
- if (!source) {
452
- source = new DOMParser().parseFromString(content, 'application/xml');
453
- }
454
- }
455
- else if (type === 'arraybuffer') {
456
- source = content;
457
- }
458
- if (source) {
459
- const features = format.readFeatures(source, {
460
- extent,
461
- featureProjection: projection
462
- });
463
- vectorSource.addFeatures(features);
464
- success(features);
465
- }
466
- else {
467
- onError();
468
- }
469
- }
470
- });
471
- }
472
- else {
473
- xhr.open('GET', modifiedUrl);
474
- const format = vectorSource.getFormat();
475
- if (format.getType() === 'arraybuffer') {
476
- xhr.responseType = 'arraybuffer';
477
- }
478
- if (this.authInterceptor) {
479
- this.authInterceptor.interceptXhr(xhr, modifiedUrl);
480
- }
481
- const onError = () => {
482
- vectorSource.removeLoadedExtent(extent);
483
- failure();
484
- };
485
- xhr.onerror = onError;
486
- xhr.onload = () => {
487
- // status will be 0 for file:// urls
488
- if (!xhr.status || (xhr.status >= 200 && xhr.status < 300)) {
489
- const type = format.getType();
490
- let source;
491
- if (type === 'json' || type === 'text') {
492
- source = xhr.responseText;
493
- }
494
- else if (type === 'xml') {
495
- source = xhr.responseXML;
496
- if (!source) {
497
- source = new DOMParser().parseFromString(xhr.responseText, 'application/xml');
498
- }
499
- }
500
- else if (type === 'arraybuffer') {
501
- source = xhr.response;
502
- }
503
- if (source) {
504
- const features = format.readFeatures(source, {
505
- extent,
506
- featureProjection: projection
507
- });
508
- vectorSource.addFeatures(features);
509
- success(features);
510
- }
511
- else {
512
- onError();
513
- }
514
- }
515
- else {
516
- onError();
517
- }
518
- };
519
- xhr.send();
520
- }
521
- }
522
- /**
523
- * Custom loader for vector layer.
524
- * @internal
525
- * @param vectorSource the vector source to be created
526
- * @param layerID the url string or function to retrieve the data
527
- * @param extent the extent of the requested data
528
- * @param resolution the current resolution
529
- * @param projection the projection to retrieve the data
530
- */
531
- customIDBLoader(vectorSource, layerID, extent, projection, success, failure) {
532
- if (this.geoNetworkService) {
533
- const onError = () => {
534
- vectorSource.removeLoadedExtent(extent);
535
- failure();
536
- };
537
- this.geoNetworkService.geoDBService.get(layerID).subscribe((content) => {
538
- if (content) {
539
- const format = vectorSource.getFormat();
540
- const type = format.getType();
541
- let source;
542
- if (type === 'json' || type === 'text') {
543
- source = content;
544
- }
545
- else if (type === 'xml') {
546
- source = content;
547
- if (!source) {
548
- source = new DOMParser().parseFromString(content, 'application/xml');
549
- }
550
- }
551
- else if (type === 'arraybuffer') {
552
- source = content;
553
- }
554
- if (source) {
555
- const features = format.readFeatures(source, {
556
- extent,
557
- featureProjection: projection
558
- });
559
- vectorSource.addFeatures(features, format.readProjection(source));
560
- success(features);
561
- }
562
- else {
563
- onError();
564
- }
565
- }
566
- });
567
- }
568
- }
569
- }
570
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLWxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvbGF5ZXIvc2hhcmVkL2xheWVycy92ZWN0b3ItbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUkxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLElBQUksWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJcEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxhQUFhLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLEtBQUssRUFDTixNQUFNLGdCQUFnQixDQUFDO0FBSXhCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBSzlGLE9BQU8sRUFDTCxRQUFRLEVBQ1Isa0JBQWtCLEVBQ25CLE1BQU0sc0RBQXNELENBQUM7QUFNOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFROUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0NBQStDLENB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QUM7eUJBQU0sSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7d0JBQzFCLE1BQU0sR0FBRyxPQUFPLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs0QkFDWixNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQ3RDLE9BQU8sRUFDUCxpQkFBaUIsQ0FDbEIsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7eUJBQU0sSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sR0FBRyxPQUFPLENBQUM7b0JBQ25CLENBQUM7b0JBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQzt3QkFDWCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTs0QkFDM0MsTUFBTTs0QkFDTixpQkFBaUIsRUFBRSxVQUFVO3lCQUM5QixDQUFDLENBQUM7d0JBQ0gsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUNsRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLEVBQUUsQ0FBQztvQkFDWixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tICdAaWdvMi9hdXRoJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9tZXNzYWdlJztcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5pbXBvcnQgb2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCB7IHVuQnlLZXkgfSBmcm9tICdvbC9PYnNlcnZhYmxlJztcbmltcG9ydCB7IGFzQXJyYXkgYXMgQ29sb3JBc0FycmF5IH0gZnJvbSAnb2wvY29sb3InO1xuaW1wb3J0IHsgZWFzZU91dCB9IGZyb20gJ29sL2Vhc2luZyc7XG5pbXBvcnQgQmFzZUV2ZW50IGZyb20gJ29sL2V2ZW50cy9FdmVudCc7XG5pbXBvcnQgeyBFeHRlbnQgfSBmcm9tICdvbC9leHRlbnQnO1xuaW1wb3J0IHsgRmVhdHVyZUxvYWRlciB9IGZyb20gJ29sL2ZlYXR1cmVsb2FkZXInO1xuaW1wb3J0ICogYXMgb2xmb3JtYXQgZnJvbSAnb2wvZm9ybWF0JztcbmltcG9ydCBvbExheWVyVmVjdG9yIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgKiBhcyBvbHByb2ogZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgb2xQcm9qZWN0aW9uIGZyb20gJ29sL3Byb2ovUHJvamVjdGlvbic7XG5pbXBvcnQgeyBnZXRWZWN0b3JDb250ZXh0IH0gZnJvbSAnb2wvcmVuZGVyJztcbmltcG9ydCBvbFNvdXJjZVZlY3RvciBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50LCBvZiwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGZpcnN0XG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQXJjR0lTUmVzdERhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9hcmNnaXNyZXN0LWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgQ2x1c3RlckRhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9jbHVzdGVyLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9mZWF0dXJlLWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvZmVhdHVyZS1kYXRhc291cmNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBXZWJTb2NrZXREYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvd2Vic29ja2V0LWRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgV0ZTRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL3dmcy1kYXRhc291cmNlJztcbmltcG9ydCB7IFdGU0RhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvd2ZzLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIGJ1aWxkVXJsLFxuICBkZWZhdWx0TWF4RmVhdHVyZXNcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvd21zLXdmcy51dGlscyc7XG5pbXBvcnQge1xuICBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXG4gIE9nY0ZpbHRlcnNPcHRpb25zXG59IGZyb20gJy4uLy4uLy4uL2ZpbHRlci9zaGFyZWQvb2djLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBJZ29NYXAsIE1hcEV4dGVudCB9IGZyb20gJy4uLy4uLy4uL21hcC9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0UmVzb2x1dGlvbkZyb21TY2FsZSB9IGZyb20gJy4uLy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCB7IEluc2VydFNvdXJjZUluc2VydERCRW51bSB9IGZyb20gJy4uLy4uLy4uL29mZmxpbmUvZ2VvREIvZ2VvREIuZW51bXMnO1xuaW1wb3J0IHsgR2VvREJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vb2ZmbGluZS9nZW9EQi9nZW9EQi5zZXJ2aWNlJztcbmltcG9ydCB7IExheWVyREJEYXRhIH0gZnJvbSAnLi4vLi4vLi4vb2ZmbGluZS9sYXllckRCL2xheWVyREIuaW50ZXJmYWNlJztcbmltcG9ydCB7IExheWVyREJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vb2ZmbGluZS9sYXllckRCL2xheWVyREIuc2VydmljZSc7XG5pbXBvcnQge1xuICBHZW9OZXR3b3JrU2VydmljZSxcbiAgU2ltcGxlR2V0T3B0aW9uc1xufSBmcm9tICcuLi8uLi8uLi9vZmZsaW5lL3NoYXJlZC9nZW8tbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IG9sU3R5bGVUb0Jhc2ljSWdvU3R5bGUgfSBmcm9tICcuLi8uLi8uLi9zdHlsZS9zaGFyZWQvdmVjdG9yL2NvbnZlcnNpb24udXRpbHMnO1xuaW1wb3J0IHsgVmVjdG9yV2F0Y2hlciB9IGZyb20gJy4uLy4uL3V0aWxzL3ZlY3Rvci13YXRjaGVyJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi9sYXllcic7XG5pbXBvcnQgdHlwZSB7IFZlY3RvckxheWVyT3B0aW9ucyB9IGZyb20gJy4vdmVjdG9yLWxheWVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBWZWN0b3JMYXllciBleHRlbmRzIExheWVyIHtcbiAgcHJpdmF0ZSBwcmV2aW91c0xvYWRFeHRlbnQ6IEV4dGVudDtcbiAgcHJpdmF0ZSBwcmV2aW91c0xvYWRSZXNvbHV0aW9uOiBudW1iZXI7XG4gIHByaXZhdGUgcHJldmlvdXNPZ2NGaWx0ZXJzOiBPZ2NGaWx0ZXJzT3B0aW9ucztcbiAgcHJpdmF0ZSB4aHJBY2N1bXVsYXRvcjogWE1MSHR0cFJlcXVlc3RbXSA9IFtdO1xuICBkZWNsYXJlIHB1YmxpYyBkYXRhU291cmNlOlxuICAgIHwgRmVhdHVyZURhdGFTb3VyY2VcbiAgICB8IFdGU0RhdGFTb3VyY2VcbiAgICB8IEFyY0dJU1Jlc3REYXRhU291cmNlXG4gICAgfCBXZWJTb2NrZXREYXRhU291cmNlXG4gICAgfCBDbHVzdGVyRGF0YVNvdXJjZTtcbiAgZGVjbGFyZSBwdWJsaWMgb3B0aW9uczogVmVjdG9yTGF5ZXJPcHRpb25zO1xuICBkZWNsYXJlIHB1YmxpYyBvbDogb2xMYXllclZlY3RvcjxvbFNvdXJjZVZlY3Rvcj47XG4gIHByaXZhdGUgd2F0Y2hlcjogVmVjdG9yV2F0Y2hlcjtcbiAgcHJpdmF0ZSB0cmFja0ZlYXR1cmVMaXN0ZW5lcklkO1xuXG4gIGdldCBicm93c2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5icm93c2FibGUgIT09IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGV4cG9ydGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHBvcnRhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFZlY3RvckxheWVyT3B0aW9ucyxcbiAgICBwdWJsaWMgbWVzc2FnZVNlcnZpY2U/OiBNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgYXV0aEludGVyY2VwdG9yPzogQXV0aEludGVyY2VwdG9yLFxuICAgIHByaXZhdGUgZ2VvTmV0d29ya1NlcnZpY2U/OiBHZW9OZXR3b3JrU2VydmljZSxcbiAgICBwdWJsaWMgZ2VvREJTZXJ2aWNlPzogR2VvREJTZXJ2aWNlLFxuICAgIHB1YmxpYyBsYXllckRCU2VydmljZT86IExheWVyREJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMsIG1lc3NhZ2VTZXJ2aWNlLCBhdXRoSW50ZXJjZXB0b3IpO1xuICAgIHRoaXMud2F0Y2hlciA9IG5ldyBWZWN0b3JXYXRjaGVyKHRoaXMpO1xuICAgIHRoaXMuc3RhdHVzJCA9IHRoaXMud2F0Y2hlci5zdGF0dXMkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU9sTGF5ZXIoKTogb2xMYXllclZlY3RvcjxvbFNvdXJjZVZlY3Rvcj4ge1xuICAgIGNvbnN0IGluaXRpYWxPcGFjaXR5VmFsdWUgPSB0aGlzLm9wdGlvbnMub3BhY2l0eSB8fCAxO1xuICAgIGNvbnN0IGluaXRpYWxWaXNpYmxlVmFsdWUgPSB0aGlzLm9wdGlvbnMudmlzaWJsZSAhPT0gZmFsc2U7XG4gICAgY29uc3QgaW5pdGlhbE1pblJlc1ZhbHVlID1cbiAgICAgIHRoaXMub3B0aW9ucy5taW5SZXNvbHV0aW9uIHx8XG4gICAgICBnZXRSZXNvbHV0aW9uRnJvbVNjYWxlKE51bWJlcih0aGlzLm9wdGlvbnMubWluU2NhbGVEZW5vbSkpO1xuICAgIGNvbnN0IGluaXRpYWxNYXhSZXNWYWx1ZSA9XG4gICAgICB0aGlzLm9wdGlvbnMubWF4UmVzb2x1dGlvbiB8fFxuICAgICAgZ2V0UmVzb2x1dGlvbkZyb21TY2FsZShOdW1iZXIodGhpcy5vcHRpb25zLm1heFNjYWxlRGVub20pKTtcbiAgICBjb25zdCBzbyA9IHRoaXMub3B0aW9ucy5zb3VyY2VPcHRpb25zIGFzIEZlYXR1cmVEYXRhU291cmNlT3B0aW9ucztcbiAgICBpZiAodGhpcy5kYXRhU291cmNlIGluc3RhbmNlb2YgRmVhdHVyZURhdGFTb3VyY2UpIHtcbiAgICAgIGlmIChzbz8ucHJlbG9hZD8uYnlwYXNzUmVzb2x1dGlvbiB8fCBzbz8ucHJlbG9hZD8uYnlwYXNzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMub3BhY2l0eSA9IDA7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzby5wcmVsb2FkLmJ5cGFzc1Jlc29sdXRpb24gJiZcbiAgICAgICAgICAodGhpcy5vcHRpb25zLm1pblJlc29sdXRpb24gfHwgdGhpcy5vcHRpb25zLm1heFJlc29sdXRpb24pXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5taW5SZXNvbHV0aW9uID0gMDtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubWF4UmVzb2x1dGlvbiA9IEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzby5wcmVsb2FkLmJ5cGFzc1Zpc2libGUgJiYgIWluaXRpYWxWaXNpYmxlVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIHtcbiAgICAgIHNvdXJjZTogdGhpcy5vcHRpb25zLnNvdXJjZS5vbCBhcyBvbFNvdXJjZVZlY3RvcixcbiAgICAgIHNvdXJjZU9wdGlvbnM6IHRoaXMub3B0aW9ucy5zb3VyY2VPcHRpb25zIHx8IHRoaXMub3B0aW9ucy5zb3VyY2Uub3B0aW9uc1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5vbC5vbihcbiAgICAgICAgJ2FkZGZlYXR1cmUnLFxuICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHRoaXMuZmxhc2goZS5mZWF0dXJlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmlkYkluZm8/LnN0b3JlVG9JZGIgJiYgdGhpcy5nZW9EQlNlcnZpY2UpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWRiSW5mby5maXJzdExvYWQpIHtcbiAgICAgICAgdGhpcy5tYWludGFpbkZlYXR1cmVzSW5JZGIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5vbC5vbmNlKCdmZWF0dXJlc2xvYWRlbmQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5vbC5vbignYWRkZmVhdHVyZScsICgpID0+IHRoaXMubWFpbnRhaW5GZWF0dXJlc0luSWRiKCkpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uub2wub24oJ2NoYW5nZWZlYXR1cmUnLCAoKSA9PlxuICAgICAgICAgIHRoaXMubWFpbnRhaW5GZWF0dXJlc0luSWRiKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLm9sLm9uKCdjbGVhcicsICgpID0+IHRoaXMubWFpbnRhaW5GZWF0dXJlc0luSWRiKCkpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uub2wub24oJ3JlbW92ZWZlYXR1cmUnLCAoKSA9PlxuICAgICAgICAgIHRoaXMubWFpbnRhaW5GZWF0dXJlc0luSWRiKClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEZlYXR1cmVEYXRhU291cmNlICYmXG4gICAgICAoc28/LnByZWxvYWQ/LmJ5cGFzc1Jlc29sdXRpb24gfHwgc28/LnByZWxvYWQ/LmJ5cGFzc1Zpc2libGUpXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uub2wub25jZSgnZmVhdHVyZXNsb2FkZW5kJywgKCkgPT4ge1xuICAgICAgICBpZiAoaW5pdGlhbE9wYWNpdHlWYWx1ZSkge1xuICAgICAgICAgIHRoaXMub3BhY2l0eSA9IGluaXRpYWxPcGFjaXR5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvLnByZWxvYWQuYnlwYXNzUmVzb2x1dGlvbikge1xuICAgICAgICAgIHRoaXMubWluUmVzb2x1dGlvbiA9IGluaXRpYWxNaW5SZXNWYWx1ZTtcbiAgICAgICAgICB0aGlzLm1heFJlc29sdXRpb24gPSBpbml0aWFsTWF4UmVzVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvLnByZWxvYWQuYnlwYXNzVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGluaXRpYWxWaXNpYmxlVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tGZWF0dXJlKSB7XG4gICAgICB0aGlzLmVuYWJsZVRyYWNrRmVhdHVyZSh0aGlzLm9wdGlvbnMudHJhY2tGZWF0dXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3IgPSBuZXcgb2xMYXllclZlY3RvcihvbE9wdGlvbnMpO1xuICAgIGNvbnN0IHZlY3RvclNvdXJjZSA9IHZlY3Rvci5nZXRTb3VyY2UoKSBhcyBvbFNvdXJjZVZlY3RvcjtcbiAgICBjb25zdCB1cmwgPSB2ZWN0b3JTb3VyY2UuZ2V0VXJsKCk7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB2ZWN0b3I7XG4gICAgfVxuICAgIGlmICh1cmwgfHwgb2xPcHRpb25zLnNvdXJjZU9wdGlvbnM/LnR5cGUgPT09ICd3ZnMnKSB7XG4gICAgICBsZXQgbG9hZGVyOiBGZWF0dXJlTG9hZGVyO1xuICAgICAgY29uc3Qgd2ZzT3B0aW9ucyA9IG9sT3B0aW9ucy5zb3VyY2VPcHRpb25zIGFzIFdGU0RhdGFTb3VyY2VPcHRpb25zO1xuICAgICAgaWYgKFxuICAgICAgICB3ZnNPcHRpb25zPy50eXBlID09PSAnd2ZzJyAmJlxuICAgICAgICAod2ZzT3B0aW9ucy5wYXJhbXMgfHwgd2ZzT3B0aW9ucy5wYXJhbXNXRlMpXG4gICAgICApIHtcbiAgICAgICAgbG9hZGVyID0gKGV4dGVudCwgcmVzb2x1dGlvbiwgcHJvaiwgc3VjY2VzcywgZmFpbHVyZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY3VzdG9tV0ZTTG9hZGVyKFxuICAgICAgICAgICAgdmVjdG9yU291cmNlLFxuICAgICAgICAgICAgd2ZzT3B0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuYXV0aEludGVyY2VwdG9yLFxuICAgICAgICAgICAgZXh0ZW50LFxuICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgIHByb2osXG4gICAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgICAgZmFpbHVyZVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkZXIgPSAoZXh0ZW50LCByZXNvbHV0aW9uLCBwcm9qLCBzdWNjZXNzLCBmYWlsdXJlKSA9PiB7XG4gICAgICAgICAgdGhpcy5jdXN0b21Mb2FkZXIoXG4gICAgICAgICAgICB2ZWN0b3JTb3VyY2UsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBleHRlbnQsXG4gICAgICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICAgICAgcHJvaixcbiAgICAgICAgICAgIHN1Y2Nlc3MsXG4gICAgICAgICAgICBmYWlsdXJlXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChsb2FkZXIpIHtcbiAgICAgICAgdmVjdG9yU291cmNlLnNldExvYWRlcihsb2FkZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmlkYkluZm8/LnN0b3JlVG9JZGIgJiYgdGhpcy5nZW9EQlNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IGlkYkxvYWRlciA9IChleHRlbnQsIHJlc29sdXRpb24sIHByb2osIHN1Y2Nlc3MsIGZhaWx1cmUpID0+IHtcbiAgICAgICAgdGhpcy5jdXN0b21JREJMb2FkZXIoXG4gICAgICAgICAgdmVjdG9yU291cmNlLFxuICAgICAgICAgIG9sT3B0aW9ucy5pZCxcbiAgICAgICAgICBleHRlbnQsXG4gICAgICAgICAgcHJvaixcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIGZhaWx1cmVcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoaWRiTG9hZGVyKSB7XG4gICAgICAgIHZlY3RvclNvdXJjZS5zZXRMb2FkZXIoaWRiTG9hZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmlkYkluZm8/LnN0b3JlVG9JZGIgJiYgdGhpcy5nZW9EQlNlcnZpY2UpIHtcbiAgICAgIHZlY3Rvci5vbmNlKCdzb3VyY2VyZWFkeScsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZGJJbmZvLmZpcnN0TG9hZCkge1xuICAgICAgICAgIHRoaXMubWFpbnRhaW5PcHRpb25zSW5JZGIoKTtcbiAgICAgICAgfVxuICAgICAgICBmcm9tRXZlbnQ8QmFzZUV2ZW50Pih2ZWN0b3IsICdjaGFuZ2UnKVxuICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSg3NTApKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5tYWludGFpbk9wdGlvbnNJbklkYigpKTtcbiAgICAgICAgdmVjdG9yLm9uKCdjaGFuZ2U6ekluZGV4JywgKCkgPT4gdGhpcy5tYWludGFpbk9wdGlvbnNJbklkYigpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yO1xuICB9XG5cbiAgcmVtb3ZlTGF5ZXJGcm9tSURCKCkge1xuICAgIGlmICh0aGlzLmdlb0RCU2VydmljZSAmJiB0aGlzLmxheWVyREJTZXJ2aWNlKSB7XG4gICAgICB6aXAoXG4gICAgICAgIHRoaXMuZ2VvREJTZXJ2aWNlLmRlbGV0ZUJ5S2V5KHRoaXMuaWQpLFxuICAgICAgICB0aGlzLmxheWVyREJTZXJ2aWNlLmRlbGV0ZUJ5S2V5KHRoaXMuaWQpXG4gICAgICApLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFpbnRhaW5PcHRpb25zSW5JZGIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmlnb1N0eWxlLmlnb1N0eWxlT2JqZWN0ID0gb2xTdHlsZVRvQmFzaWNJZ29TdHlsZSh0aGlzLm9sKTtcbiAgICBjb25zdCBsYXllckRhdGE6IExheWVyREJEYXRhID0gT2JqZWN0VXRpbHMucmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgIGxheWVySWQ6IHRoaXMuaWQsXG4gICAgICBkZXRhaWxlZENvbnRleHRVcmk6IHRoaXMub3B0aW9ucy5pZGJJbmZvLmNvbnRleHRVcmksXG4gICAgICBzb3VyY2VPcHRpb25zOiB7XG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgICAgcXVlcnlhYmxlOiB0cnVlXG4gICAgICB9LFxuICAgICAgbGF5ZXJPcHRpb25zOiB7XG4gICAgICAgIHdvcmtzcGFjZTogdGhpcy5vcHRpb25zLndvcmtzcGFjZSxcbiAgICAgICAgekluZGV4OiB0aGlzLm9sID8gdGhpcy56SW5kZXggOiAxMDAwMDAwLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0aGlzLmlzSWdvSW50ZXJuYWxMYXllcixcbiAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgIGlnb1N0eWxlOiB0aGlzLm9wdGlvbnMuaWdvU3R5bGUsXG4gICAgICAgIGlkYkluZm86IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucy5pZGJJbmZvLCB7IGZpcnN0TG9hZDogZmFsc2UgfSlcbiAgICAgIH0sXG4gICAgICBpbnNlcnRFdmVudDogYCR7dGhpcy50aXRsZX0tJHt0aGlzLmlkfS0ke25ldyBEYXRlKCl9YFxuICAgIH0pO1xuICAgIHRoaXMubGF5ZXJEQlNlcnZpY2UudXBkYXRlKGxheWVyRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIG1haW50YWluRmVhdHVyZXNJbklkYigpIHtcbiAgICBjb25zdCBkc0ZlYXR1cmVzID0gdGhpcy5kYXRhU291cmNlLm9sLmdldEZlYXR1cmVzKCk7XG4gICAgY29uc3QgZ2VvanNvbk9iamVjdCA9IEpTT04ucGFyc2UoXG4gICAgICBuZXcgb2xmb3JtYXQuR2VvSlNPTigpLndyaXRlRmVhdHVyZXMoZHNGZWF0dXJlcywge1xuICAgICAgICBkYXRhUHJvamVjdGlvbjogJ0VQU0c6NDMyNicsXG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiB0aGlzLmRhdGFTb3VyY2Uub2wuZ2V0UHJvamVjdGlvbigpIHx8ICdFUFNHOjM4NTcnXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5nZW9EQlNlcnZpY2UudXBkYXRlKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIHRoaXMuaWQsXG4gICAgICBnZW9qc29uT2JqZWN0LFxuICAgICAgSW5zZXJ0U291cmNlSW5zZXJ0REJFbnVtLlVzZXIsXG4gICAgICBgJHt0aGlzLnRpdGxlfS0ke3RoaXMuaWR9LSR7bmV3IERhdGUoKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmbGFzaChmZWF0dXJlKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBsaXN0ZW5lcktleSA9IHRoaXMub2wub24oJ3Bvc3RyZW5kZXInLCBhbmltYXRlLmJpbmQodGhpcykpO1xuXG4gICAgZnVuY3Rpb24gYW5pbWF0ZShldmVudCkge1xuICAgICAgY29uc3QgdmVjdG9yQ29udGV4dCA9IGdldFZlY3RvckNvbnRleHQoZXZlbnQpO1xuICAgICAgY29uc3QgZnJhbWVTdGF0ZSA9IGV2ZW50LmZyYW1lU3RhdGU7XG4gICAgICBjb25zdCBmbGFzaEdlb20gPSBmZWF0dXJlLmdldEdlb21ldHJ5KCkuY2xvbmUoKTtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBmcmFtZVN0YXRlLnRpbWUgLSBzdGFydDtcbiAgICAgIGNvbnN0IGVsYXBzZWRSYXRpbyA9IGVsYXBzZWQgLyB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLmR1cmF0aW9uO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVhc2VPdXQoMSAtIGVsYXBzZWRSYXRpbyk7XG4gICAgICBjb25zdCBuZXdDb2xvciA9IENvbG9yQXNBcnJheSh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLmNvbG9yIHx8ICdyZWQnKTtcbiAgICAgIG5ld0NvbG9yWzNdID0gb3BhY2l0eTtcbiAgICAgIGxldCBzdHlsZSA9IHRoaXMub2xcbiAgICAgICAgLmdldFN0eWxlRnVuY3Rpb24oKVxuICAgICAgICAuY2FsbCh0aGlzLCBmZWF0dXJlKVxuICAgICAgICAuZmluZCgoc3R5bGUyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0eWxlMi5nZXRJbWFnZSgpO1xuICAgICAgICB9KTtcbiAgICAgIGlmICghc3R5bGUpIHtcbiAgICAgICAgc3R5bGUgPSB0aGlzLm9sLmdldFN0eWxlRnVuY3Rpb24oKS5jYWxsKHRoaXMsIGZlYXR1cmUpWzBdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3R5bGVDbG9uZSA9IHN0eWxlLmNsb25lKCk7XG5cbiAgICAgIHN3aXRjaCAoZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSkge1xuICAgICAgICBjYXNlICdQb2ludCc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRJbWFnZSgpICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Ygc3R5bGVDbG9uZS5nZXRJbWFnZSgpLmdldFJhZGl1cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmFkaXVzID1cbiAgICAgICAgICAgICAgZWFzZU91dChlbGFwc2VkUmF0aW8pICogKHN0eWxlQ2xvbmUuZ2V0SW1hZ2UoKS5nZXRSYWRpdXMoKSAqIDMpO1xuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRJbWFnZSgpLnNldFJhZGl1cyhyYWRpdXMpO1xuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRJbWFnZSgpLnNldE9wYWNpdHkob3BhY2l0eSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICBpZiAoc3R5bGVDbG9uZS5nZXRJbWFnZSgpKSB7XG4gICAgICAgICAgICBzdHlsZUNsb25lLmdldEltYWdlKCkuZ2V0U3Ryb2tlKCkuc2V0Q29sb3IobmV3Q29sb3IpO1xuICAgICAgICAgICAgc3R5bGVDbG9uZVxuICAgICAgICAgICAgICAuZ2V0SW1hZ2UoKVxuICAgICAgICAgICAgICAuZ2V0U3Ryb2tlKClcbiAgICAgICAgICAgICAgLnNldFdpZHRoKFxuICAgICAgICAgICAgICAgIGVhc2VPdXQoZWxhcHNlZFJhdGlvKSAqXG4gICAgICAgICAgICAgICAgICAoc3R5bGVDbG9uZS5nZXRJbWFnZSgpLmdldFN0cm9rZSgpLmdldFdpZHRoKCkgKiAzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3R5bGVDbG9uZS5nZXRTdHJva2UoKSkge1xuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRTdHJva2UoKS5zZXRDb2xvcihuZXdDb2xvcik7XG4gICAgICAgICAgICBzdHlsZUNsb25lXG4gICAgICAgICAgICAgIC5nZXRTdHJva2UoKVxuICAgICAgICAgICAgICAuc2V0V2lkdGgoXG4gICAgICAgICAgICAgICAgZWFzZU91dChlbGFwc2VkUmF0aW8pICogKHN0eWxlQ2xvbmUuZ2V0U3Ryb2tlKCkuZ2V0V2lkdGgoKSAqIDMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgaWYgKHN0eWxlQ2xvbmUuZ2V0SW1hZ2UoKSkge1xuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRJbWFnZSgpLmdldEZpbGwoKS5zZXRDb2xvcihuZXdDb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHlsZUNsb25lLmdldEZpbGwoKSkge1xuICAgICAgICAgICAgc3R5bGVDbG9uZS5nZXRGaWxsKCkuc2V0Q29sb3IobmV3Q29sb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3R5bGVDbG9uZS5zZXRUZXh0KCcnKTtcbiAgICAgIHZlY3RvckNvbnRleHQuc2V0U3R5bGUoc3R5bGVDbG9uZSk7XG4gICAgICB2ZWN0b3JDb250ZXh0LmRyYXdHZW9tZXRyeShmbGFzaEdlb20pO1xuXG4gICAgICBpZiAoZWxhcHNlZCA+IHRoaXMub3B0aW9ucy5hbmltYXRpb24uZHVyYXRpb24pIHtcbiAgICAgICAgdW5CeUtleShsaXN0ZW5lcktleSk7XG4gICAgICAgIC8vIHJlbW92ZSBsYXN0IGdlb21ldHJ5XG4gICAgICAgIC8vIHRoZXJlIGlzIGEgbGl0dGxlIGZsYXNoIGJlZm9yZSBmZWF0dXJlIGRpc2FwcGVhciwgYmV0dGVyIHNvbHV0aW9uID9cbiAgICAgICAgdGhpcy5tYXAub2wucmVuZGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIHRlbGwgT3BlbkxheWVycyB0byBjb250aW51ZSBwb3N0Y29tcG9zZSBhbmltYXRpb25cbiAgICAgIHRoaXMubWFwLm9sLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXAobWFwOiBJZ29NYXAgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMud2F0Y2hlci51bnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndhdGNoZXIuc3Vic2NyaWJlKCgpID0+IHZvaWQgMSk7XG4gICAgfVxuICAgIHN1cGVyLnNldE1hcChtYXApO1xuICB9XG5cbiAgcHVibGljIHNldEV4dGVudChleHRlbnQ6IE1hcEV4dGVudCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5leHRlbnQgPSBleHRlbnQ7XG4gIH1cblxuICBwdWJsaWMgb25VbndhdGNoKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5vblVud2F0Y2goKTtcbiAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wQW5pbWF0aW9uKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5vbC51bihcbiAgICAgICdhZGRmZWF0dXJlJyxcbiAgICAgIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmZsYXNoKGUuZmVhdHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH0uYmluZCh0aGlzKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlVHJhY2tGZWF0dXJlKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICB0aGlzLnRyYWNrRmVhdHVyZUxpc3RlbmVySWQgPSB0aGlzLmRhdGFTb3VyY2Uub2wub24oXG4gICAgICAnYWRkZmVhdHVyZScsXG4gICAgICB0aGlzLnRyYWNrRmVhdHVyZS5iaW5kKHRoaXMsIGlkKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGNlbnRlck1hcE9uRmVhdHVyZShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgZmVhdCA9IHRoaXMuZGF0YVNvdXJjZS5vbC5nZXRGZWF0dXJlQnlJZChpZCk7XG4gICAgaWYgKGZlYXQpIHtcbiAgICAgIHRoaXMubWFwLm9sXG4gICAgICAgIC5nZXRWaWV3KClcbiAgICAgICAgLnNldENlbnRlcigoZmVhdC5nZXRHZW9tZXRyeSgpIGFzIGFueSkuZ2V0Q29vcmRpbmF0ZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRyYWNrRmVhdHVyZShpZCwgZmVhdCkge1xuICAgIGlmIChmZWF0LmZlYXR1cmUuZ2V0SWQoKSA9PT0gaWQgJiYgdGhpcy52aXNpYmxlKSB7XG4gICAgICB0aGlzLmNlbnRlck1hcE9uRmVhdHVyZShpZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2FibGVUcmFja0ZlYXR1cmUoKSB7XG4gICAgdW5CeUtleSh0aGlzLnRyYWNrRmVhdHVyZUxpc3RlbmVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBsb2FkZXIgZm9yIGEgV0ZTIGRhdGFzb3VyY2VcbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSB2ZWN0b3JTb3VyY2UgdGhlIHZlY3RvciBzb3VyY2UgdG8gYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvbE9wdGlvbnMgZnJvbSBzb3VyY2VcbiAgICogQHBhcmFtIGludGVyY2VwdG9yIHRoZSBpbnRlcmNlcHRvciBvZiB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBleHRlbnQgb2YgdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqIEBwYXJhbSByZXNvbHV0aW9uIHRoZSBjdXJyZW50IHJlc29sdXRpb25cbiAgICogQHBhcmFtIHByb2ogdGhlIHByb2plY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRhdGFcbiAgICogQHBhcmFtIHN1Y2Nlc3Mgc3VjY2VzcyBjYWxsYmFja1xuICAgKiBAcGFyYW0gZmFpbHVyZSBmYWlsdXJlIGNhbGxiYWNrXG4gICAqIEBwYXJhbSByYW5kb21QYXJhbSByYW5kb20gcGFyYW1ldGVyIHRvIGVuc3VyZSBjYWNoZSBpcyBub3QgY2F1c2luZyBwcm9ibGVtcyBpbiByZXRyaWV2aW5nIG5ldyBkYXRhXG4gICAqL1xuICBwdWJsaWMgY3VzdG9tV0ZTTG9hZGVyKFxuICAgIHZlY3RvclNvdXJjZTogb2xTb3VyY2VWZWN0b3IsXG4gICAgb3B0aW9uczogV0ZTRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgaW50ZXJjZXB0b3I6IEF1dGhJbnRlcmNlcHRvcixcbiAgICBleHRlbnQ6IEV4dGVudCxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgcHJvajogb2xQcm9qZWN0aW9uLFxuICAgIHN1Y2Nlc3M6IChmZWF0dXJlczogb2xGZWF0dXJlW10pID0+IHZvaWQsXG4gICAgZmFpbHVyZTogKCkgPT4gdm9pZCxcbiAgICByYW5kb21QYXJhbT86IGJvb2xlYW5cbiAgKSB7XG4gICAge1xuICAgICAgY29uc3QgcGFyYW1zV0ZTID0gb3B0aW9ucy5wYXJhbXNXRlM7XG4gICAgICBjb25zdCB3ZnNQcm9qID0gcGFyYW1zV0ZTLnNyc05hbWVcbiAgICAgICAgPyBuZXcgb2xQcm9qZWN0aW9uKHsgY29kZTogcGFyYW1zV0ZTLnNyc05hbWUgfSlcbiAgICAgICAgOiBwcm9qO1xuICAgICAgY29uc3QgY3VycmVudEV4dGVudCA9IG9scHJvai50cmFuc2Zvcm1FeHRlbnQoZXh0ZW50LCBwcm9qLCB3ZnNQcm9qKTtcbiAgICAgIGNvbnN0IG9nY0ZpbHRlcnMgPSAob3B0aW9ucyBhcyBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnMpLm9nY0ZpbHRlcnM7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMucHJldmlvdXNMb2FkRXh0ZW50ICYmXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0xvYWRFeHRlbnQgIT09IGN1cnJlbnRFeHRlbnQpIHx8XG4gICAgICAgICh0aGlzLnByZXZpb3VzTG9hZFJlc29sdXRpb24gJiZcbiAgICAgICAgICB0aGlzLnByZXZpb3VzTG9hZFJlc29sdXRpb24gIT09IHJlc29sdXRpb24pIHx8XG4gICAgICAgICh0aGlzLnByZXZpb3VzT2djRmlsdGVycyAmJiB0aGlzLnByZXZpb3VzT2djRmlsdGVycyAhPT0gb2djRmlsdGVycylcbiAgICAgICkge1xuICAgICAgICB2ZWN0b3JTb3VyY2UucmVtb3ZlTG9hZGVkRXh0ZW50KHRoaXMucHJldmlvdXNMb2FkRXh0ZW50KTtcbiAgICAgICAgZm9yIChjb25zdCB4aHIgb2YgdGhpcy54aHJBY2N1bXVsYXRvcikge1xuICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmlvdXNMb2FkRXh0ZW50ID0gY3VycmVudEV4dGVudDtcbiAgICAgIHRoaXMucHJldmlvdXNMb2FkUmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICB0aGlzLnByZXZpb3VzT2djRmlsdGVycyA9IG9nY0ZpbHRlcnM7XG5cbiAgICAgIHBhcmFtc1dGUy5zcnNOYW1lID0gcGFyYW1zV0ZTLnNyc05hbWUgfHwgcHJvai5nZXRDb2RlKCk7XG5cbiAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVXJsKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjdXJyZW50RXh0ZW50LFxuICAgICAgICB3ZnNQcm9qLFxuICAgICAgICBvZ2NGaWx0ZXJzLFxuICAgICAgICByYW5kb21QYXJhbVxuICAgICAgKTtcbiAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgIGlmIChcbiAgICAgICAgcGFyYW1zV0ZTLnZlcnNpb24gPT09ICcyLjAuMCcgJiZcbiAgICAgICAgcGFyYW1zV0ZTLm1heEZlYXR1cmVzID4gZGVmYXVsdE1heEZlYXR1cmVzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmJPZkZlYXR1cmUgPSAxMDAwO1xuICAgICAgICB3aGlsZSAoc3RhcnRJbmRleCA8IHBhcmFtc1dGUy5tYXhGZWF0dXJlcykge1xuICAgICAgICAgIGxldCBhbHRlcmVkVXJsID0gdXJsLnJlcGxhY2UoXG4gICAgICAgICAgICAnY291bnQ9JyArIHBhcmFtc1dGUy5tYXhGZWF0dXJlcyxcbiAgICAgICAgICAgICdjb3VudD0nICsgbmJPZkZlYXR1cmVcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsdGVyZWRVcmwgPSBhbHRlcmVkVXJsLnJlcGxhY2UoJ3N0YXJ0SW5kZXg9MCcsICcwJyk7XG4gICAgICAgICAgYWx0ZXJlZFVybCArPSAnJnN0YXJ0SW5kZXg9JyArIHN0YXJ0SW5kZXg7XG4gICAgICAgICAgYWx0ZXJlZFVybC5yZXBsYWNlKC8mJi9nLCAnJicpO1xuICAgICAgICAgIHRoaXMuZ2V0RmVhdHVyZXMoXG4gICAgICAgICAgICB2ZWN0b3JTb3VyY2UsXG4gICAgICAgICAgICBjdXJyZW50RXh0ZW50LFxuICAgICAgICAgICAgd2ZzUHJvaixcbiAgICAgICAgICAgIHByb2osXG4gICAgICAgICAgICBhbHRlcmVkVXJsLFxuICAgICAgICAgICAgc3VjY2VzcyxcbiAgICAgICAgICAgIGZhaWx1cmVcbiAgICAgICAgICApO1xuICAgICAgICAgIHN0YXJ0SW5kZXggKz0gbmJPZkZlYXR1cmU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0RmVhdHVyZXMoXG4gICAgICAgICAgdmVjdG9yU291cmNlLFxuICAgICAgICAgIGN1cnJlbnRFeHRlbnQsXG4gICAgICAgICAgd2ZzUHJvaixcbiAgICAgICAgICBwcm9qLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdWNjZXNzLFxuICAgICAgICAgIGZhaWx1cmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIGxvYWRlciB0byBnZXQgZmVhdHVyZSBmcm9tIGEgV0ZTIGRhdGFzb3VyY2VcbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSB2ZWN0b3JTb3VyY2UgdGhlIHZlY3RvciBzb3VyY2UgdG8gYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBleHRlbnQgb2YgdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqIEBwYXJhbSBkYXRhUHJvamVjdGlvbiB0aGUgcHJvamVjdGlvbiBvZiB0aGUgcmV0cmlldmVkIGRhdGFcbiAgICogQHBhcmFtIGZlYXR1cmVQcm9qZWN0aW9uIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSBjcmVhdGVkIGZlYXR1cmVzXG4gICAqIEBwYXJhbSB1cmwgdGhlIHVybCBzdHJpbmcgdG8gcmV0cmlldmUgdGhlIGRhdGFcbiAgICogQHBhcmFtIHN1Y2Nlc3Mgc3VjY2VzcyBjYWxsYmFja1xuICAgKiBAcGFyYW0gZmFpbHVyZSBmYWlsdXJlIGNhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGdldEZlYXR1cmVzKFxuICAgIHZlY3RvclNvdXJjZTogb2xTb3VyY2VWZWN0b3IsXG4gICAgZXh0ZW50OiBFeHRlbnQsXG4gICAgZGF0YVByb2plY3Rpb246IG9sUHJvamVjdGlvbixcbiAgICBmZWF0dXJlUHJvamVjdGlvbjogb2xQcm9qZWN0aW9uLFxuICAgIHVybDogc3RyaW5nLFxuICAgIHN1Y2Nlc3M6IChmZWF0dXJlczogb2xGZWF0dXJlW10pID0+IHZvaWQsXG4gICAgZmFpbHVyZTogKCkgPT4gdm9pZFxuICApIHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjb25zdCBhbHRlcmVkVXJsV2l0aEtleUF1dGggPSB0aGlzLmF1dGhJbnRlcmNlcHRvci5hbHRlclVybFdpdGhLZXlBdXRoKHVybCk7XG4gICAgbGV0IG1vZGlmaWVkVXJsID0gdXJsO1xuICAgIGlmIChhbHRlcmVkVXJsV2l0aEtleUF1dGgpIHtcbiAgICAgIG1vZGlmaWVkVXJsID0gYWx0ZXJlZFVybFdpdGhLZXlBdXRoO1xuICAgIH1cblxuICAgIHhoci5vcGVuKCdHRVQnLCBtb2RpZmllZFVybCk7XG4gICAgaWYgKHRoaXMuYXV0aEludGVyY2VwdG9yKSB7XG4gICAgICB0aGlzLmF1dGhJbnRlcmNlcHRvci5pbnRlcmNlcHRYaHIoeGhyLCBtb2RpZmllZFVybCk7XG4gICAgfVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICB2ZWN0b3JTb3VyY2UucmVtb3ZlTG9hZGVkRXh0ZW50KGV4dGVudCk7XG4gICAgICBmYWlsdXJlKCk7XG4gICAgfTtcbiAgICB4aHIub25lcnJvciA9IG9uRXJyb3I7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiB4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB2ZWN0b3JTb3VyY2VcbiAgICAgICAgICAuZ2V0Rm9ybWF0KClcbiAgICAgICAgICAucmVhZEZlYXR1cmVzKHhoci5yZXNwb25zZVRleHQsIHtcbiAgICAgICAgICAgIGRhdGFQcm9qZWN0aW9uLFxuICAgICAgICAgICAgZmVhdHVyZVByb2plY3Rpb25cbiAgICAgICAgICB9KSBhcyBvbEZlYXR1cmVbXTtcbiAgICAgICAgaWYgKGZlYXR1cmVzKSB7XG4gICAgICAgICAgdmVjdG9yU291cmNlLmFkZEZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICAgICAgICBzdWNjZXNzKGZlYXR1cmVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZXNzKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25FcnJvcigpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy54aHJBY2N1bXVsYXRvci5wdXNoKHhocik7XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gbG9hZGVyIGZvciB2ZWN0b3IgbGF5ZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0gdmVjdG9yU291cmNlIHRoZSB2ZWN0b3Igc291cmNlIHRvIGJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHVybCB0aGUgdXJsIHN0cmluZyBvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBleHRlbnQgb2YgdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqIEBwYXJhbSByZXNvbHV0aW9uIHRoZSBjdXJyZW50IHJlc29sdXRpb25cbiAgICogQHBhcmFtIHByb2plY3Rpb24gdGhlIHByb2plY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgY3VzdG9tTG9hZGVyKFxuICAgIHZlY3RvclNvdXJjZTogb2xTb3VyY2VWZWN0b3IsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZXh0ZW50OiBFeHRlbnQsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHByb2plY3Rpb246IG9sUHJvamVjdGlvbixcbiAgICBzdWNjZXNzOiAoZmVhdHVyZXM6IG9sRmVhdHVyZVtdKSA9PiB2b2lkLFxuICAgIGZhaWx1cmU6ICgpID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgbGV0IG1vZGlmaWVkVXJsID0gdXJsO1xuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBhbHRlcmVkVXJsV2l0aEtleUF1dGggPVxuICAgICAgICB0aGlzLmF1dGhJbnRlcmNlcHRvci5hbHRlclVybFdpdGhLZXlBdXRoKHVybCk7XG4gICAgICBpZiAoYWx0ZXJlZFVybFdpdGhLZXlBdXRoKSB7XG4gICAgICAgIG1vZGlmaWVkVXJsID0gYWx0ZXJlZFVybFdpdGhLZXlBdXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdlb05ldHdvcmtTZXJ2aWNlICYmIHR5cGVvZiB1cmwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGZvcm1hdCA9IHZlY3RvclNvdXJjZS5nZXRGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBmb3JtYXQuZ2V0VHlwZSgpO1xuXG4gICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0eXBlO1xuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgdmVjdG9yU291cmNlLnJlbW92ZUxvYWRlZEV4dGVudChleHRlbnQpO1xuICAgICAgICBmYWlsdXJlKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvcHRpb25zOiBTaW1wbGVHZXRPcHRpb25zID0geyByZXNwb25zZVR5cGUgfTtcbiAgICAgIHRoaXMuZ2VvTmV0d29ya1NlcnZpY2UuZ2VvREJTZXJ2aWNlXG4gICAgICAgIC5nZXQodXJsKVxuICAgICAgICAucGlwZShkZWxheSg3NTApKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjb25jYXRNYXAoKHIpID0+XG4gICAgICAgICAgICByXG4gICAgICAgICAgICAgID8gb2YocilcbiAgICAgICAgICAgICAgOiB0aGlzLmdlb05ldHdvcmtTZXJ2aWNlLmdldChtb2RpZmllZFVybCBhcyBzdHJpbmcsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gdmVjdG9yU291cmNlLmdldEZvcm1hdCgpO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZvcm1hdC5nZXRUeXBlKCk7XG4gICAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdqc29uJyB8fCB0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgc291cmNlID0gY29udGVudDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3htbCcpIHtcbiAgICAgICAgICAgICAgc291cmNlID0gY29udGVudDtcbiAgICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94bWwnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXlidWZmZXInKSB7XG4gICAgICAgICAgICAgIHNvdXJjZSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gZm9ybWF0LnJlYWRGZWF0dXJlcyhzb3VyY2UsIHtcbiAgICAgICAgICAgICAgICBleHRlbnQsXG4gICAgICAgICAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb25cbiAgICAgICAgICAgICAgfSkgYXMgT2xGZWF0dXJlW107XG4gICAgICAgICAgICAgIHZlY3RvclNvdXJjZS5hZGRGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgICAgICAgICAgIHN1Y2Nlc3MoZmVhdHVyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb25FcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCBtb2RpZmllZFVybCBhcyBzdHJpbmcpO1xuICAgICAgY29uc3QgZm9ybWF0ID0gdmVjdG9yU291cmNlLmdldEZvcm1hdCgpO1xuICAgICAgaWYgKGZvcm1hdC5nZXRUeXBlKCkgPT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hdXRoSW50ZXJjZXB0b3IpIHtcbiAgICAgICAgdGhpcy5hdXRoSW50ZXJjZXB0b3IuaW50ZXJjZXB0WGhyKHhociwgbW9kaWZpZWRVcmwgYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgdmVjdG9yU291cmNlLnJlbW92ZUxvYWRlZEV4dGVudChleHRlbnQpO1xuICAgICAgICBmYWlsdXJlKCk7XG4gICAgICB9O1xuICAgICAgeGhyLm9uZXJyb3IgPSBvbkVycm9yO1xuICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgLy8gc3RhdHVzIHdpbGwgYmUgMCBmb3IgZmlsZTovLyB1cmxzXG4gICAgICAgIGlmICgheGhyLnN0YXR1cyB8fCAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkpIHtcbiAgICAgICAgICBjb25zdCB0eXBlID0gZm9ybWF0LmdldFR5cGUoKTtcbiAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgIGlmICh0eXBlID09PSAnanNvbicgfHwgdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3htbCcpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IHhoci5yZXNwb25zZVhNTDtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoXG4gICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veG1sJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICAgICAgc291cmNlID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGZvcm1hdC5yZWFkRmVhdHVyZXMoc291cmNlLCB7XG4gICAgICAgICAgICAgIGV4dGVudCxcbiAgICAgICAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb25cbiAgICAgICAgICAgIH0pIGFzIE9sRmVhdHVyZVtdO1xuICAgICAgICAgICAgdmVjdG9yU291cmNlLmFkZEZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICAgICAgICAgIHN1Y2Nlc3MoZmVhdHVyZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvbkVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBsb2FkZXIgZm9yIHZlY3RvciBsYXllci5cbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSB2ZWN0b3JTb3VyY2UgdGhlIHZlY3RvciBzb3VyY2UgdG8gYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0gbGF5ZXJJRCB0aGUgdXJsIHN0cmluZyBvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBleHRlbnQgb2YgdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqIEBwYXJhbSByZXNvbHV0aW9uIHRoZSBjdXJyZW50IHJlc29sdXRpb25cbiAgICogQHBhcmFtIHByb2plY3Rpb24gdGhlIHByb2plY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRhdGFcbiAgICovXG4gIHByaXZhdGUgY3VzdG9tSURCTG9hZGVyKFxuICAgIHZlY3RvclNvdXJjZSxcbiAgICBsYXllcklELFxuICAgIGV4dGVudCxcbiAgICBwcm9qZWN0aW9uLFxuICAgIHN1Y2Nlc3MsXG4gICAgZmFpbHVyZVxuICApIHtcbiAgICBpZiAodGhpcy5nZW9OZXR3b3JrU2VydmljZSkge1xuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgdmVjdG9yU291cmNlLnJlbW92ZUxvYWRlZEV4dGVudChleHRlbnQpO1xuICAgICAgICBmYWlsdXJlKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5nZW9OZXR3b3JrU2VydmljZS5nZW9EQlNlcnZpY2UuZ2V0KGxheWVySUQpLnN1YnNjcmliZSgoY29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IHZlY3RvclNvdXJjZS5nZXRGb3JtYXQoKTtcbiAgICAgICAgICBjb25zdCB0eXBlID0gZm9ybWF0LmdldFR5cGUoKTtcbiAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgIGlmICh0eXBlID09PSAnanNvbicgfHwgdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBjb250ZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3htbCcpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3htbCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IGNvbnRlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gZm9ybWF0LnJlYWRGZWF0dXJlcyhzb3VyY2UsIHtcbiAgICAgICAgICAgICAgZXh0ZW50LFxuICAgICAgICAgICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2ZWN0b3JTb3VyY2UuYWRkRmVhdHVyZXMoZmVhdHVyZXMsIGZvcm1hdC5yZWFkUHJvamVjdGlvbihzb3VyY2UpKTtcbiAgICAgICAgICAgIHN1Y2Nlc3MoZmVhdHVyZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvbkVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==