@igo2/geo 16.3.0 → 17.0.0-next.10

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 (663) hide show
  1. package/assets/icons/cross_black_18px.svg +88 -88
  2. package/assets/icons/place_blue_36px.svg +55 -55
  3. package/assets/icons/place_green_36px.svg +55 -55
  4. package/assets/icons/place_red_36px.svg +55 -55
  5. package/assets/icons/place_yellow_36px.svg +55 -55
  6. package/assets/images/north-direction.png +0 -0
  7. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +32 -14
  8. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +38 -19
  9. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +19 -11
  10. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +8 -62
  11. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +49 -20
  12. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +23 -11
  13. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +48 -16
  14. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +12 -71
  15. package/esm2022/lib/catalog/catalog-library/index.mjs +4 -0
  16. package/esm2022/lib/catalog/catalog.module.mjs +18 -39
  17. package/esm2022/lib/catalog/index.mjs +2 -1
  18. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +1 -1
  19. package/esm2022/lib/catalog/shared/catalog.enum.mjs +1 -1
  20. package/esm2022/lib/catalog/shared/catalog.interface.mjs +1 -1
  21. package/esm2022/lib/catalog/shared/catalog.service.mjs +16 -9
  22. package/esm2022/lib/catalog/shared/catalogs.mjs +1 -1
  23. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +1 -1
  24. package/esm2022/lib/datasource/shared/capabilities.service.mjs +5 -5
  25. package/esm2022/lib/datasource/shared/datasource.service.mjs +11 -13
  26. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
  27. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
  28. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +1 -1
  29. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +1 -1
  30. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
  31. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +1 -1
  32. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +1 -1
  33. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
  34. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +1 -1
  35. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
  36. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +1 -1
  37. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  38. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +1 -1
  39. package/esm2022/lib/datasource/shared/datasources/index.mjs +1 -1
  40. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +1 -1
  41. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +1 -1
  42. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +1 -1
  43. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  44. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +1 -1
  45. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
  46. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +1 -1
  47. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
  48. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +1 -1
  49. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +5 -5
  50. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
  51. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +1 -1
  52. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +1 -1
  53. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  54. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +1 -1
  55. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  56. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +1 -1
  57. package/esm2022/lib/datasource/shared/index.mjs +1 -1
  58. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +2 -2
  59. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +6 -6
  60. package/esm2022/lib/datasource/shared/options/options.service.mjs +1 -1
  61. package/esm2022/lib/datasource/utils/tilegrid.mjs +1 -1
  62. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +28 -13
  63. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +44 -19
  64. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +36 -16
  65. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -2
  66. package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
  67. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +9 -2
  68. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +72 -41
  69. package/esm2022/lib/directions/directions.component.mjs +83 -21
  70. package/esm2022/lib/directions/directions.module.mjs +14 -73
  71. package/esm2022/lib/directions/directions.provider.mjs +16 -0
  72. package/esm2022/lib/directions/index.mjs +2 -1
  73. package/esm2022/lib/directions/shared/directions.interface.mjs +1 -1
  74. package/esm2022/lib/directions/shared/directions.service.mjs +37 -27
  75. package/esm2022/lib/directions/shared/directions.utils.mjs +22 -22
  76. package/esm2022/lib/directions/shared/store.mjs +2 -2
  77. package/esm2022/lib/download/download-button/download-button.component.mjs +21 -11
  78. package/esm2022/lib/download/download.module.mjs +10 -27
  79. package/esm2022/lib/download/shared/download.service.mjs +7 -7
  80. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +21 -10
  81. package/esm2022/lib/draw/draw/draw-popup.component.mjs +41 -18
  82. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +22 -9
  83. package/esm2022/lib/draw/draw/draw.component.mjs +55 -25
  84. package/esm2022/lib/draw/draw/draw.module.mjs +7 -104
  85. package/esm2022/lib/draw/drawingTool.module.mjs +8 -7
  86. package/esm2022/lib/draw/shared/draw-icon.service.mjs +7 -7
  87. package/esm2022/lib/draw/shared/draw.enum.mjs +1 -1
  88. package/esm2022/lib/draw/shared/draw.interface.mjs +1 -1
  89. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  90. package/esm2022/lib/environment/environment.interface.mjs +1 -1
  91. package/esm2022/lib/environment/index.mjs +1 -1
  92. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +29 -13
  93. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +8 -7
  94. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +14 -27
  95. package/esm2022/lib/feature/feature-details/index.mjs +4 -0
  96. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +9 -9
  97. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +8 -11
  98. package/esm2022/lib/feature/feature.module.mjs +18 -12
  99. package/esm2022/lib/feature/index.mjs +3 -2
  100. package/esm2022/lib/feature/shared/feature-store.utils.mjs +1 -1
  101. package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
  102. package/esm2022/lib/feature/shared/feature.utils.mjs +2 -2
  103. package/esm2022/lib/feature/shared/index.mjs +1 -1
  104. package/esm2022/lib/feature/shared/store.mjs +2 -2
  105. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +2 -2
  106. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +2 -2
  107. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +2 -2
  108. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +2 -2
  109. package/esm2022/lib/feature/shared/strategies/loading.mjs +2 -2
  110. package/esm2022/lib/feature/shared/strategies/search.mjs +5 -5
  111. package/esm2022/lib/feature/shared/strategies/selection.mjs +2 -2
  112. package/esm2022/lib/feature/shared/strategies.utils.mjs +1 -1
  113. package/esm2022/lib/filter/filter.module.mjs +47 -177
  114. package/esm2022/lib/filter/index.mjs +2 -1
  115. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +29 -15
  116. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +46 -20
  117. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +56 -25
  118. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +17 -14
  119. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +59 -34
  120. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +18 -12
  121. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +42 -18
  122. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +8 -7
  123. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +21 -12
  124. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +6 -5
  125. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +5 -5
  126. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +1 -1
  127. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +1 -1
  128. package/esm2022/lib/filter/shared/ogc-filter.mjs +46 -3
  129. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +5 -5
  130. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +1 -1
  131. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +9 -7
  132. package/esm2022/lib/filter/shared/time-filter.enum.mjs +1 -1
  133. package/esm2022/lib/filter/shared/time-filter.interface.mjs +1 -1
  134. package/esm2022/lib/filter/shared/time-filter.service.mjs +5 -5
  135. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +66 -28
  136. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +35 -18
  137. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +35 -16
  138. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +28 -14
  139. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +51 -24
  140. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +31 -13
  141. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +8 -7
  142. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +16 -10
  143. package/esm2022/lib/geo.module.mjs +5 -43
  144. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +7 -7
  145. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +34 -17
  146. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +12 -43
  147. package/esm2022/lib/geometry/geometry-form-field/index.mjs +4 -0
  148. package/esm2022/lib/geometry/geometry.module.mjs +9 -10
  149. package/esm2022/lib/geometry/index.mjs +2 -3
  150. package/esm2022/lib/geometry/shared/controls/draw.mjs +1 -1
  151. package/esm2022/lib/geometry/shared/controls/modify.mjs +1 -1
  152. package/esm2022/lib/geometry/shared/controls/slice.mjs +1 -1
  153. package/esm2022/lib/geometry/shared/geometry.errors.mjs +1 -1
  154. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +1 -1
  155. package/esm2022/lib/geometry/shared/geometry.utils.mjs +1 -1
  156. package/esm2022/lib/import-export/export-button/export-button.component.mjs +20 -10
  157. package/esm2022/lib/import-export/import-export/import-export.component.mjs +58 -22
  158. package/esm2022/lib/import-export/import-export.module.mjs +15 -81
  159. package/esm2022/lib/import-export/index.mjs +2 -1
  160. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +19 -66
  161. package/esm2022/lib/import-export/shared/export.interface.mjs +1 -1
  162. package/esm2022/lib/import-export/shared/export.service.mjs +14 -8
  163. package/esm2022/lib/import-export/shared/export.type.mjs +1 -1
  164. package/esm2022/lib/import-export/shared/export.utils.mjs +2 -2
  165. package/esm2022/lib/import-export/shared/import.errors.mjs +1 -1
  166. package/esm2022/lib/import-export/shared/import.interface.mjs +1 -1
  167. package/esm2022/lib/import-export/shared/import.service.mjs +7 -7
  168. package/esm2022/lib/import-export/shared/import.utils.mjs +1 -1
  169. package/esm2022/lib/layer/index.mjs +2 -1
  170. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +35 -16
  171. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +45 -17
  172. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +13 -11
  173. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +8 -7
  174. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +28 -13
  175. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +10 -9
  176. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +49 -18
  177. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +1 -1
  178. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +33 -14
  179. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +5 -5
  180. package/esm2022/lib/layer/layer.module.mjs +27 -93
  181. package/esm2022/lib/layer/shared/clusterParam.mjs +1 -1
  182. package/esm2022/lib/layer/shared/layer.service.mjs +13 -13
  183. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  184. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  185. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
  186. package/esm2022/lib/layer/shared/layers/image-layer.mjs +1 -1
  187. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -1
  188. package/esm2022/lib/layer/shared/layers/layer.mjs +1 -1
  189. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +1 -1
  190. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +1 -1
  191. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +1 -1
  192. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +1 -1
  193. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +1 -1
  194. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +1 -1
  195. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +1 -1
  196. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +21 -11
  197. package/esm2022/lib/layer/utils/image-watcher.mjs +1 -1
  198. package/esm2022/lib/layer/utils/layer.utils.mjs +1 -1
  199. package/esm2022/lib/layer/utils/outputLegend.mjs +1 -1
  200. package/esm2022/lib/layer/utils/tile-watcher.mjs +1 -1
  201. package/esm2022/lib/layer/utils/vector-watcher.mjs +1 -1
  202. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +1 -1
  203. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +27 -14
  204. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -8
  205. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +28 -17
  206. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +15 -11
  207. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +1 -1
  208. package/esm2022/lib/map/home-extent-button/index.mjs +1 -1
  209. package/esm2022/lib/map/index.mjs +1 -1
  210. package/esm2022/lib/map/info-section/info-section.component.mjs +7 -7
  211. package/esm2022/lib/map/map-browser/map-browser.component.mjs +8 -8
  212. package/esm2022/lib/map/map-center/map-center.component.mjs +6 -6
  213. package/esm2022/lib/map/map.module.mjs +51 -81
  214. package/esm2022/lib/map/menu-button/menu-button.component.mjs +23 -13
  215. package/esm2022/lib/map/offline-button/offline-button.component.mjs +21 -11
  216. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +23 -11
  217. package/esm2022/lib/map/shared/controllers/controller.mjs +1 -1
  218. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  219. package/esm2022/lib/map/shared/controllers/geolocation.mjs +1 -1
  220. package/esm2022/lib/map/shared/controllers/index.mjs +1 -1
  221. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  222. package/esm2022/lib/map/shared/hover-feature.directive.mjs +11 -10
  223. package/esm2022/lib/map/shared/index.mjs +1 -1
  224. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +3 -3
  225. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +10 -9
  226. package/esm2022/lib/map/shared/map.abstract.mjs +1 -1
  227. package/esm2022/lib/map/shared/map.interface.mjs +1 -1
  228. package/esm2022/lib/map/shared/map.mjs +1 -1
  229. package/esm2022/lib/map/shared/map.service.mjs +5 -5
  230. package/esm2022/lib/map/shared/map.utils.mjs +1 -1
  231. package/esm2022/lib/map/shared/mapOffline.directive.mjs +11 -8
  232. package/esm2022/lib/map/shared/projection.interfaces.mjs +1 -1
  233. package/esm2022/lib/map/shared/projection.service.mjs +7 -7
  234. package/esm2022/lib/map/shared/projection.utils.mjs +60 -1
  235. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +6 -6
  236. package/esm2022/lib/map/utils/layer-watcher.mjs +1 -1
  237. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +26 -16
  238. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +13 -9
  239. package/esm2022/lib/measure/index.mjs +2 -3
  240. package/esm2022/lib/measure/measure.module.mjs +8 -5
  241. package/esm2022/lib/measure/measurer/index.mjs +6 -0
  242. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +6 -5
  243. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +18 -11
  244. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +27 -13
  245. package/esm2022/lib/measure/measurer/measurer.component.mjs +40 -20
  246. package/esm2022/lib/measure/measurer/measurer.module.mjs +7 -69
  247. package/esm2022/lib/measure/shared/measure.enum.mjs +1 -1
  248. package/esm2022/lib/measure/shared/measure.interfaces.mjs +1 -1
  249. package/esm2022/lib/measure/shared/measure.utils.mjs +1 -1
  250. package/esm2022/lib/metadata/index.mjs +2 -1
  251. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +35 -18
  252. package/esm2022/lib/metadata/metadata.module.mjs +14 -31
  253. package/esm2022/lib/metadata/shared/metadata.interface.mjs +1 -1
  254. package/esm2022/lib/metadata/shared/metadata.service.mjs +5 -5
  255. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +7 -7
  256. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +1 -1
  257. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +1 -1
  258. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +8 -10
  259. package/esm2022/lib/offline/layerDB/index.mjs +1 -1
  260. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +1 -1
  261. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +5 -5
  262. package/esm2022/lib/offline/shared/geo-network.service.mjs +7 -7
  263. package/esm2022/lib/overlay/overlay.module.mjs +10 -8
  264. package/esm2022/lib/overlay/shared/overlay.directive.mjs +8 -7
  265. package/esm2022/lib/overlay/shared/overlay.enum.mjs +1 -1
  266. package/esm2022/lib/overlay/shared/overlay.mjs +1 -1
  267. package/esm2022/lib/overlay/shared/overlay.service.mjs +5 -5
  268. package/esm2022/lib/overlay/shared/overlay.utils.mjs +1 -1
  269. package/esm2022/lib/print/print/print.component.mjs +8 -8
  270. package/esm2022/lib/print/print-form/print-form.component.mjs +49 -17
  271. package/esm2022/lib/print/print.module.mjs +10 -54
  272. package/esm2022/lib/print/shared/geopdf.mjs +1 -1
  273. package/esm2022/lib/print/shared/print.interface.mjs +1 -1
  274. package/esm2022/lib/print/shared/print.service.mjs +180 -127
  275. package/esm2022/lib/print/shared/print.type.mjs +1 -1
  276. package/esm2022/lib/query/query.module.mjs +7 -8
  277. package/esm2022/lib/query/shared/index.mjs +2 -1
  278. package/esm2022/lib/query/shared/query-search-source.mjs +6 -6
  279. package/esm2022/lib/query/shared/query-search-source.providers.mjs +2 -2
  280. package/esm2022/lib/query/shared/query.directive.mjs +8 -7
  281. package/esm2022/lib/query/shared/query.interfaces.mjs +1 -1
  282. package/esm2022/lib/query/shared/query.service.mjs +8 -10
  283. package/esm2022/lib/query/shared/query.utils.mjs +1 -1
  284. package/esm2022/lib/search/index.mjs +3 -5
  285. package/esm2022/lib/search/search-bar/search-bar.component.mjs +42 -19
  286. package/esm2022/lib/search/search-bar/search-bar.module.mjs +8 -61
  287. package/esm2022/lib/search/search-results/index.mjs +5 -0
  288. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +44 -19
  289. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +34 -18
  290. package/esm2022/lib/search/search-results/search-results-item.component.mjs +23 -12
  291. package/esm2022/lib/search/search-results/search-results.component.mjs +28 -14
  292. package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
  293. package/esm2022/lib/search/search-results/search-results.module.mjs +8 -91
  294. package/esm2022/lib/search/search-selector/search-selector.component.mjs +27 -12
  295. package/esm2022/lib/search/search-selector/search-selector.module.mjs +8 -44
  296. package/esm2022/lib/search/search-settings/search-settings.component.mjs +40 -15
  297. package/esm2022/lib/search/search-settings/search-settings.module.mjs +7 -47
  298. package/esm2022/lib/search/search.module.mjs +24 -13
  299. package/esm2022/lib/search/shared/index.mjs +2 -1
  300. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +11 -10
  301. package/esm2022/lib/search/shared/search-source-service.providers.mjs +1 -1
  302. package/esm2022/lib/search/shared/search-source.service.mjs +1 -1
  303. package/esm2022/lib/search/shared/search.enums.mjs +1 -1
  304. package/esm2022/lib/search/shared/search.interfaces.mjs +1 -1
  305. package/esm2022/lib/search/shared/search.provider.mjs +20 -0
  306. package/esm2022/lib/search/shared/search.service.mjs +32 -13
  307. package/esm2022/lib/search/shared/search.utils.mjs +2 -2
  308. package/esm2022/lib/search/shared/sources/cadastre.mjs +13 -10
  309. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +11 -2
  310. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +1 -1
  311. package/esm2022/lib/search/shared/sources/coordinates.mjs +16 -14
  312. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +14 -2
  313. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +32 -0
  314. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +1 -1
  315. package/esm2022/lib/search/shared/sources/icherche.mjs +28 -21
  316. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +23 -2
  317. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
  318. package/esm2022/lib/search/shared/sources/ilayer.mjs +14 -12
  319. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +14 -2
  320. package/esm2022/lib/search/shared/sources/index.mjs +1 -1
  321. package/esm2022/lib/search/shared/sources/nominatim.mjs +10 -10
  322. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +10 -2
  323. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -2
  324. package/esm2022/lib/search/shared/sources/source.mjs +1 -1
  325. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +1 -1
  326. package/esm2022/lib/search/shared/sources/storedqueries.mjs +17 -15
  327. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +17 -2
  328. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +1 -1
  329. package/esm2022/lib/search/shared/sources/workspace.mjs +12 -11
  330. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +11 -2
  331. package/esm2022/lib/style/index.mjs +1 -1
  332. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +1 -1
  333. package/esm2022/lib/style/shared/feature/feature-style.mjs +3 -2
  334. package/esm2022/lib/style/shared/font.enum.mjs +1 -1
  335. package/esm2022/lib/style/shared/index.mjs +1 -1
  336. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +1 -1
  337. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +1 -1
  338. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +1 -1
  339. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +1 -1
  340. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +1 -1
  341. package/esm2022/lib/style/style-list/style-list.module.mjs +5 -5
  342. package/esm2022/lib/style/style-list/style-list.provider.mjs +1 -1
  343. package/esm2022/lib/style/style-list/style-list.service.mjs +5 -5
  344. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +40 -17
  345. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +28 -14
  346. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +13 -9
  347. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +1 -1
  348. package/esm2022/lib/style/style-service/draw-style.service.mjs +5 -5
  349. package/esm2022/lib/style/style-service/style.service.mjs +4 -4
  350. package/esm2022/lib/style/style.module.mjs +12 -57
  351. package/esm2022/lib/toast/toast.component.mjs +21 -11
  352. package/esm2022/lib/toast/toast.module.mjs +10 -30
  353. package/esm2022/lib/utils/googleLinks.mjs +1 -1
  354. package/esm2022/lib/utils/id-generator.mjs +1 -1
  355. package/esm2022/lib/utils/osmLinks.mjs +1 -1
  356. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +1 -1
  357. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +7 -7
  358. package/esm2022/lib/wkt/shared/wkt.service.mjs +19 -19
  359. package/esm2022/lib/wkt/wkt.module.mjs +8 -5
  360. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +11 -10
  361. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +8 -24
  362. package/esm2022/lib/workspace/confirmation-popup/index.mjs +1 -1
  363. package/esm2022/lib/workspace/shared/edition-workspace.mjs +2 -2
  364. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +19 -14
  365. package/esm2022/lib/workspace/shared/feature-workspace.mjs +2 -2
  366. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +14 -11
  367. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +2 -2
  368. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +14 -11
  369. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +12 -9
  370. package/esm2022/lib/workspace/shared/workspace.utils.mjs +4 -4
  371. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +7 -7
  372. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +8 -13
  373. package/esm2022/lib/workspace/widgets/widgets.mjs +2 -2
  374. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +9 -8
  375. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +8 -10
  376. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +7 -6
  377. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +8 -10
  378. package/esm2022/lib/workspace/workspace.module.mjs +11 -36
  379. package/esm2022/public_api.mjs +11 -12
  380. package/fesm2022/igo2-geo.mjs +23027 -22793
  381. package/fesm2022/igo2-geo.mjs.map +1 -1
  382. package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +3 -3
  383. package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +2 -2
  384. package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +2 -2
  385. package/lib/catalog/catalog-browser/catalog-browser.module.d.ts +2 -14
  386. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +4 -3
  387. package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +1 -1
  388. package/lib/catalog/catalog-library/catalog-library.component.d.ts +6 -3
  389. package/lib/catalog/catalog-library/catalog-library.module.d.ts +6 -18
  390. package/lib/catalog/catalog-library/index.d.ts +3 -0
  391. package/lib/catalog/catalog.module.d.ts +9 -9
  392. package/lib/catalog/index.d.ts +1 -0
  393. package/lib/catalog/shared/catalog.interface.d.ts +1 -1
  394. package/lib/catalog/shared/catalog.service.d.ts +3 -1
  395. package/lib/datasource/shared/datasource.service.d.ts +4 -5
  396. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +2 -3
  397. package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +2 -3
  398. package/lib/datasource/shared/datasources/datasource.d.ts +1 -2
  399. package/lib/datasource/shared/datasources/feature-datasource.d.ts +2 -3
  400. package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +2 -3
  401. package/lib/datasource/shared/datasources/websocket-datasource.d.ts +1 -2
  402. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +2 -3
  403. package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +1 -2
  404. package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +1 -2
  405. package/lib/datasource/shared/options/options-api.providers.d.ts +1 -1
  406. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +4 -2
  407. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +2 -2
  408. package/lib/directions/directions-results/directions-results.component.d.ts +2 -2
  409. package/lib/directions/directions-sources/directions-source.d.ts +7 -3
  410. package/lib/directions/directions-sources/directions-source.interface.d.ts +19 -6
  411. package/lib/directions/directions-sources/directions-source.provider.d.ts +3 -1
  412. package/lib/directions/directions-sources/osrm-directions-source.d.ts +20 -11
  413. package/lib/directions/directions.component.d.ts +16 -4
  414. package/lib/directions/directions.module.d.ts +4 -16
  415. package/lib/directions/directions.provider.d.ts +3 -0
  416. package/lib/directions/index.d.ts +1 -0
  417. package/lib/directions/shared/directions.interface.d.ts +2 -9
  418. package/lib/directions/shared/directions.service.d.ts +7 -3
  419. package/lib/directions/shared/directions.utils.d.ts +2 -2
  420. package/lib/directions/shared/store.d.ts +1 -1
  421. package/lib/download/download-button/download-button.component.d.ts +1 -1
  422. package/lib/download/download.module.d.ts +4 -6
  423. package/lib/download/shared/download.service.d.ts +1 -1
  424. package/lib/draw/draw/draw-layer-popup.component.d.ts +1 -1
  425. package/lib/draw/draw/draw-popup.component.d.ts +5 -5
  426. package/lib/draw/draw/draw-shorcuts.component.d.ts +3 -1
  427. package/lib/draw/draw/draw.component.d.ts +3 -3
  428. package/lib/draw/draw/draw.module.d.ts +2 -25
  429. package/lib/draw/drawingTool.module.d.ts +3 -0
  430. package/lib/draw/shared/draw-icon.service.d.ts +1 -1
  431. package/lib/environment/environment.interface.d.ts +2 -1
  432. package/lib/feature/feature-details/feature-details.component.d.ts +8 -5
  433. package/lib/feature/feature-details/feature-details.directive.d.ts +1 -1
  434. package/lib/feature/feature-details/feature-details.module.d.ts +5 -6
  435. package/lib/feature/feature-details/index.d.ts +3 -0
  436. package/lib/feature/feature-form/feature-form.component.d.ts +2 -3
  437. package/lib/feature/feature-form/feature-form.module.d.ts +2 -4
  438. package/lib/feature/feature.module.d.ts +9 -4
  439. package/lib/feature/index.d.ts +2 -1
  440. package/lib/feature/shared/feature.interfaces.d.ts +1 -1
  441. package/lib/feature/shared/feature.utils.d.ts +1 -1
  442. package/lib/feature/shared/store.d.ts +1 -1
  443. package/lib/feature/shared/strategies/geo-properties.d.ts +1 -1
  444. package/lib/feature/shared/strategies/in-map-extent.d.ts +1 -1
  445. package/lib/feature/shared/strategies/in-map-resolution.d.ts +1 -1
  446. package/lib/feature/shared/strategies/loading-layer.d.ts +1 -1
  447. package/lib/feature/shared/strategies/loading.d.ts +1 -1
  448. package/lib/feature/shared/strategies/search.d.ts +1 -1
  449. package/lib/feature/shared/strategies/selection.d.ts +1 -1
  450. package/lib/filter/filter.module.d.ts +23 -28
  451. package/lib/filter/index.d.ts +1 -0
  452. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +3 -3
  453. package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +3 -3
  454. package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +5 -5
  455. package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +1 -1
  456. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +5 -5
  457. package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +3 -3
  458. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +3 -3
  459. package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +1 -1
  460. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +3 -3
  461. package/lib/filter/shared/filterable-datasource.pipe.d.ts +1 -1
  462. package/lib/filter/shared/ogc-filter.d.ts +7 -0
  463. package/lib/filter/shared/ogc-filter.interface.d.ts +2 -3
  464. package/lib/filter/shared/spatial-filter.service.d.ts +2 -1
  465. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +7 -6
  466. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +3 -3
  467. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +2 -2
  468. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  469. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +3 -3
  470. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  471. package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +1 -1
  472. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +1 -1
  473. package/lib/geo.module.d.ts +14 -24
  474. package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +2 -3
  475. package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +1 -1
  476. package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +5 -10
  477. package/lib/geometry/geometry-form-field/index.d.ts +3 -0
  478. package/lib/geometry/geometry.module.d.ts +5 -3
  479. package/lib/geometry/index.d.ts +1 -2
  480. package/lib/geometry/shared/controls/draw.d.ts +4 -4
  481. package/lib/geometry/shared/controls/slice.d.ts +4 -4
  482. package/lib/geometry/shared/geometry.interfaces.d.ts +1 -1
  483. package/lib/import-export/export-button/export-button.component.d.ts +1 -1
  484. package/lib/import-export/import-export/import-export.component.d.ts +7 -4
  485. package/lib/import-export/import-export.module.d.ts +8 -15
  486. package/lib/import-export/index.d.ts +1 -0
  487. package/lib/import-export/shared/drop-geo-file.directive.d.ts +5 -5
  488. package/lib/import-export/shared/export.service.d.ts +1 -1
  489. package/lib/import-export/shared/export.utils.d.ts +2 -2
  490. package/lib/import-export/shared/import.service.d.ts +1 -1
  491. package/lib/import-export/shared/import.utils.d.ts +2 -2
  492. package/lib/layer/index.d.ts +1 -0
  493. package/lib/layer/layer-item/layer-item.component.d.ts +2 -2
  494. package/lib/layer/layer-legend/layer-legend.component.d.ts +3 -2
  495. package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +2 -2
  496. package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +1 -1
  497. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +1 -1
  498. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +2 -2
  499. package/lib/layer/layer-list/layer-list.component.d.ts +1 -1
  500. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +1 -1
  501. package/lib/layer/layer.module.d.ts +14 -18
  502. package/lib/layer/shared/layer.service.d.ts +1 -1
  503. package/lib/layer/shared/layers/image-layer.d.ts +1 -1
  504. package/lib/layer/shared/layers/layer.d.ts +1 -1
  505. package/lib/layer/shared/layers/layer.interface.d.ts +1 -1
  506. package/lib/layer/shared/layers/tile-layer.d.ts +1 -1
  507. package/lib/layer/shared/layers/vector-layer.d.ts +4 -5
  508. package/lib/layer/shared/layers/vector-layer.interface.d.ts +1 -2
  509. package/lib/layer/shared/layers/vectortile-layer.d.ts +1 -1
  510. package/lib/layer/track-feature-button/track-feature-button.component.d.ts +1 -1
  511. package/lib/layer/utils/image-watcher.d.ts +1 -1
  512. package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +2 -2
  513. package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +1 -1
  514. package/lib/map/geolocate-button/geolocate-button.component.d.ts +2 -2
  515. package/lib/map/home-extent-button/home-extent-button.component.d.ts +2 -2
  516. package/lib/map/info-section/info-section.component.d.ts +1 -1
  517. package/lib/map/map-browser/map-browser.component.d.ts +2 -2
  518. package/lib/map/map-center/map-center.component.d.ts +1 -1
  519. package/lib/map/map.module.d.ts +35 -21
  520. package/lib/map/menu-button/menu-button.component.d.ts +2 -2
  521. package/lib/map/offline-button/offline-button.component.d.ts +2 -2
  522. package/lib/map/rotation-button/rotation-button.component.d.ts +1 -1
  523. package/lib/map/shared/controllers/geolocation.d.ts +2 -1
  524. package/lib/map/shared/hover-feature.directive.d.ts +2 -2
  525. package/lib/map/shared/map-pointer-position.directive.d.ts +2 -2
  526. package/lib/map/shared/map.d.ts +2 -1
  527. package/lib/map/shared/mapOffline.directive.d.ts +3 -2
  528. package/lib/map/shared/projection.service.d.ts +1 -1
  529. package/lib/map/shared/projection.utils.d.ts +11 -0
  530. package/lib/map/swipe-control/swipe-control.component.d.ts +1 -1
  531. package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +2 -2
  532. package/lib/map/zoom-button/zoom-button.component.d.ts +1 -1
  533. package/lib/measure/index.d.ts +1 -2
  534. package/lib/measure/measure.module.d.ts +3 -0
  535. package/lib/measure/measurer/index.d.ts +5 -0
  536. package/lib/measure/measurer/measure-format.pipe.d.ts +1 -1
  537. package/lib/measure/measurer/measurer-dialog.component.d.ts +1 -1
  538. package/lib/measure/measurer/measurer-item.component.d.ts +1 -1
  539. package/lib/measure/measurer/measurer.component.d.ts +4 -4
  540. package/lib/measure/measurer/measurer.module.d.ts +3 -18
  541. package/lib/measure/shared/measure.utils.d.ts +1 -1
  542. package/lib/metadata/index.d.ts +1 -0
  543. package/lib/metadata/metadata-button/metadata-button.component.d.ts +2 -2
  544. package/lib/metadata/metadata.module.d.ts +6 -7
  545. package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +1 -1
  546. package/lib/offline/geoDB/geoDB.service.d.ts +2 -3
  547. package/lib/offline/shared/geo-network.service.d.ts +1 -1
  548. package/lib/overlay/overlay.module.d.ts +4 -1
  549. package/lib/overlay/shared/overlay.directive.d.ts +1 -1
  550. package/lib/print/print/print.component.d.ts +1 -1
  551. package/lib/print/print-form/print-form.component.d.ts +5 -2
  552. package/lib/print/print.module.d.ts +4 -12
  553. package/lib/print/shared/print.interface.d.ts +1 -0
  554. package/lib/print/shared/print.service.d.ts +31 -18
  555. package/lib/query/query.module.d.ts +4 -4
  556. package/lib/query/shared/index.d.ts +1 -0
  557. package/lib/query/shared/query-search-source.providers.d.ts +1 -1
  558. package/lib/query/shared/query.directive.d.ts +1 -1
  559. package/lib/query/shared/query.interfaces.d.ts +1 -2
  560. package/lib/query/shared/query.service.d.ts +2 -3
  561. package/lib/search/index.d.ts +2 -4
  562. package/lib/search/search-bar/search-bar.component.d.ts +4 -3
  563. package/lib/search/search-bar/search-bar.module.d.ts +2 -16
  564. package/lib/search/search-results/index.d.ts +4 -0
  565. package/lib/search/search-results/save-feature-dialog.component.d.ts +2 -2
  566. package/lib/search/search-results/search-results-add-button.component.d.ts +4 -4
  567. package/lib/search/search-results/search-results-item.component.d.ts +1 -1
  568. package/lib/search/search-results/search-results.component.d.ts +3 -3
  569. package/lib/search/search-results/search-results.directive.d.ts +3 -0
  570. package/lib/search/search-results/search-results.module.d.ts +3 -21
  571. package/lib/search/search-selector/search-selector.component.d.ts +1 -1
  572. package/lib/search/search-selector/search-selector.module.d.ts +2 -11
  573. package/lib/search/search-settings/search-settings.component.d.ts +3 -2
  574. package/lib/search/search-settings/search-settings.module.d.ts +2 -12
  575. package/lib/search/search.module.d.ts +14 -7
  576. package/lib/search/shared/index.d.ts +1 -0
  577. package/lib/search/shared/search-pointer-summary.directive.d.ts +2 -2
  578. package/lib/search/shared/search-source.service.d.ts +1 -1
  579. package/lib/search/shared/search.interfaces.d.ts +12 -10
  580. package/lib/search/shared/search.provider.d.ts +8 -0
  581. package/lib/search/shared/search.service.d.ts +8 -3
  582. package/lib/search/shared/sources/cadastre.d.ts +2 -1
  583. package/lib/search/shared/sources/cadastre.providers.d.ts +6 -2
  584. package/lib/search/shared/sources/coordinates.d.ts +2 -1
  585. package/lib/search/shared/sources/coordinates.providers.d.ts +6 -2
  586. package/lib/search/shared/sources/icherche-icons.d.ts +7 -0
  587. package/lib/search/shared/sources/icherche.d.ts +2 -1
  588. package/lib/search/shared/sources/icherche.providers.d.ts +10 -14
  589. package/lib/search/shared/sources/ilayer.d.ts +2 -1
  590. package/lib/search/shared/sources/ilayer.providers.d.ts +6 -2
  591. package/lib/search/shared/sources/nominatim.d.ts +1 -1
  592. package/lib/search/shared/sources/nominatim.providers.d.ts +5 -2
  593. package/lib/search/shared/sources/source.d.ts +2 -2
  594. package/lib/search/shared/sources/source.interfaces.d.ts +16 -0
  595. package/lib/search/shared/sources/storedqueries.d.ts +2 -1
  596. package/lib/search/shared/sources/storedqueries.providers.d.ts +8 -3
  597. package/lib/search/shared/sources/workspace.d.ts +2 -1
  598. package/lib/search/shared/sources/workspace.providers.d.ts +6 -2
  599. package/lib/style/shared/vector/conversion.utils.d.ts +2 -3
  600. package/lib/style/style-modal/drawing/style-modal-drawing.component.d.ts +1 -1
  601. package/lib/style/style-modal/layer/style-modal-layer.component.d.ts +1 -1
  602. package/lib/style/style-modal/layer-button/style-modal-layer-button.component.d.ts +1 -1
  603. package/lib/style/style.module.d.ts +5 -16
  604. package/lib/toast/toast.component.d.ts +2 -2
  605. package/lib/toast/toast.module.d.ts +4 -6
  606. package/lib/utils/propertyTypeDetector/propertyTypeDetector.service.d.ts +1 -1
  607. package/lib/wkt/shared/wkt.service.d.ts +1 -1
  608. package/lib/wkt/wkt.module.d.ts +3 -0
  609. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +2 -2
  610. package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +2 -6
  611. package/lib/workspace/shared/edition-workspace.d.ts +2 -2
  612. package/lib/workspace/shared/edition-workspace.service.d.ts +5 -2
  613. package/lib/workspace/shared/feature-workspace.d.ts +1 -1
  614. package/lib/workspace/shared/feature-workspace.service.d.ts +2 -1
  615. package/lib/workspace/shared/wfs-workspace.d.ts +1 -1
  616. package/lib/workspace/shared/wfs-workspace.service.d.ts +2 -1
  617. package/lib/workspace/shared/wms-workspace.service.d.ts +2 -1
  618. package/lib/workspace/shared/workspace.utils.d.ts +2 -1
  619. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +3 -2
  620. package/lib/workspace/widgets/ogc-filter/ogc-filter.module.d.ts +2 -6
  621. package/lib/workspace/widgets/widgets.d.ts +1 -1
  622. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +2 -2
  623. package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +2 -3
  624. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +2 -2
  625. package/lib/workspace/workspace-updator/workspace-updator.module.d.ts +2 -3
  626. package/lib/workspace/workspace.module.d.ts +5 -9
  627. package/locale/en.geo.json +824 -818
  628. package/locale/fr.geo.json +825 -819
  629. package/package.json +14 -12
  630. package/public_api.d.ts +10 -11
  631. package/src/_index.scss +2 -2
  632. package/src/geo-theme.scss +23 -23
  633. package/src/lib/catalog/catalog-browser/catalog-browser.theming.scss +22 -22
  634. package/src/lib/catalog/catalog.theming.scss +5 -5
  635. package/src/lib/directions/directions-results/directions-results.theming.scss +10 -10
  636. package/src/lib/directions/directions.theming.scss +6 -6
  637. package/src/lib/draw/draw.theming.scss +32 -32
  638. package/src/lib/feature/feature-details/feature-details.theming.scss +16 -16
  639. package/src/lib/feature/feature.theming.scss +4 -4
  640. package/src/lib/filter/filter.theming.scss +13 -13
  641. package/src/lib/filter/ogc-filter-selection/ogc-filter-selection.theming.scss +18 -18
  642. package/src/lib/filter/time-filter-form/time-filter-form.theming.scss +5 -5
  643. package/src/lib/layer/layer-item/layer-item.theme.scss +33 -33
  644. package/src/lib/layer/layer-legend/layer-legend.theming.scss +10 -10
  645. package/src/lib/layer/layer-list-tool/layer-list-tool.theming.scss +34 -34
  646. package/src/lib/layer/layer.theming.scss +10 -10
  647. package/src/lib/map/map-browser/map-browser.theming.scss +46 -46
  648. package/src/lib/map/map.theming.scss +9 -9
  649. package/src/lib/map/menu-button/menu-button.theming.scss +20 -20
  650. package/src/lib/map/zoom-button/zoom-button.theming.scss +32 -32
  651. package/src/lib/measure/measure.theming.scss +5 -5
  652. package/src/lib/measure/measurer/measurer.theming.scss +26 -26
  653. package/src/lib/search/search-bar/search-bar.theming.scss +33 -33
  654. package/src/lib/search/search-results/search-results-item.theme.scss +20 -20
  655. package/src/lib/search/search.theming.scss +7 -7
  656. package/src/lib/workspace/confirmation-popup/confirmation-popup.theming.scss +14 -14
  657. package/src/lib/workspace/workspace.theming.scss +6 -6
  658. package/src/style/style.scss +1 -1
  659. package/style/style.css +2 -1
  660. package/esm2022/lib/datasource/datasource.module.mjs +0 -22
  661. package/esm2022/lib/search/search-bar/search-url-param.directive.mjs +0 -40
  662. package/lib/datasource/datasource.module.d.ts +0 -8
  663. package/lib/search/search-bar/search-url-param.directive.d.ts +0 -13
@@ -1,16 +1,32 @@
1
1
  import { SelectionModel } from '@angular/cdk/collections';
2
2
  import { NestedTreeControl } from '@angular/cdk/tree';
3
+ import { AsyncPipe, NgFor, NgIf } from '@angular/common';
3
4
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
4
- import { UntypedFormControl } from '@angular/forms';
5
- import { MatTreeNestedDataSource } from '@angular/material/tree';
6
- import { EntityStore, EntityStoreFilterSelectionStrategy, EntityTableColumnRenderer } from '@igo2/common';
7
- import { LanguageService, MessageService } from '@igo2/core';
5
+ import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import { MatCheckboxModule } from '@angular/material/checkbox';
8
+ import { MatOptionModule } from '@angular/material/core';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import { MatInputModule } from '@angular/material/input';
12
+ import { MatRadioModule } from '@angular/material/radio';
13
+ import { MatSelectModule } from '@angular/material/select';
14
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
15
+ import { MatTableModule } from '@angular/material/table';
16
+ import { MatTooltipModule } from '@angular/material/tooltip';
17
+ import { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';
18
+ import { EntityStore, EntityStoreFilterSelectionStrategy, EntityTableColumnRenderer, EntityTableComponent } from '@igo2/common/entity';
19
+ import { LanguageService } from '@igo2/core/language';
20
+ import { IgoLanguageModule } from '@igo2/core/language';
21
+ import { MessageService } from '@igo2/core/message';
8
22
  import * as olproj from 'ol/proj';
9
23
  import * as olStyle from 'ol/style';
10
24
  import { BehaviorSubject } from 'rxjs';
11
25
  import { debounceTime } from 'rxjs/operators';
12
26
  import { FeatureDataSource } from '../../../datasource/shared';
27
+ import { GeometryType } from '../../../draw';
13
28
  import { FeatureMotion, FeatureStoreSelectionStrategy } from '../../../feature';
29
+ import { GeometryFormFieldInputComponent } from '../../../geometry/geometry-form-field/geometry-form-field-input.component';
14
30
  import { VectorLayer } from '../../../layer/shared';
15
31
  import { IgoMap } from '../../../map/shared/map';
16
32
  import { MeasureLengthUnit } from '../../../measure';
@@ -19,24 +35,22 @@ import { SpatialFilterService } from '../../shared/spatial-filter.service';
19
35
  import { SpatialFilterItemType } from './../../shared/spatial-filter.enum';
20
36
  import * as i0 from "@angular/core";
21
37
  import * as i1 from "../../shared/spatial-filter.service";
22
- import * as i2 from "@igo2/core";
23
- import * as i3 from "@angular/common";
38
+ import * as i2 from "@igo2/core/message";
39
+ import * as i3 from "@igo2/core/language";
24
40
  import * as i4 from "@angular/forms";
25
- import * as i5 from "@angular/material/core";
26
- import * as i6 from "@angular/material/icon";
27
- import * as i7 from "@angular/material/button";
28
- import * as i8 from "@angular/material/radio";
29
- import * as i9 from "@angular/material/table";
30
- import * as i10 from "@angular/material/tree";
31
- import * as i11 from "@angular/material/checkbox";
32
- import * as i12 from "@angular/material/slide-toggle";
33
- import * as i13 from "@angular/material/form-field";
34
- import * as i14 from "@angular/material/input";
35
- import * as i15 from "@angular/material/select";
41
+ import * as i5 from "@angular/material/slide-toggle";
42
+ import * as i6 from "@angular/material/form-field";
43
+ import * as i7 from "@angular/material/input";
44
+ import * as i8 from "@angular/material/select";
45
+ import * as i9 from "@angular/material/core";
46
+ import * as i10 from "@angular/material/radio";
47
+ import * as i11 from "@angular/material/table";
48
+ import * as i12 from "@angular/material/checkbox";
49
+ import * as i13 from "@angular/material/tree";
50
+ import * as i14 from "@angular/material/button";
51
+ import * as i15 from "@angular/material/icon";
36
52
  import * as i16 from "@angular/material/tooltip";
37
- import * as i17 from "@igo2/common";
38
- import * as i18 from "../../../geometry/geometry-form-field/geometry-form-field-input.component";
39
- import * as i19 from "@ngx-translate/core";
53
+ import * as i17 from "@ngx-translate/core";
40
54
  /**
41
55
  * Spatial-Filter-Item (search parameters)
42
56
  */
@@ -76,7 +90,7 @@ export class SpatialFilterItemComponent {
76
90
  image: new olStyle.Circle({
77
91
  radius: this.radius /
78
92
  Math.cos((Math.PI / 180) * coordinates[1]) /
79
- resolution,
93
+ resolution, // Latitude correction
80
94
  stroke: new olStyle.Stroke({
81
95
  width: 2,
82
96
  color: 'rgba(0, 153, 255)'
@@ -201,7 +215,10 @@ export class SpatialFilterItemComponent {
201
215
  formControl = new UntypedFormControl();
202
216
  geometryType;
203
217
  geometryTypeField = false;
204
- geometryTypes = ['Point', 'Polygon'];
218
+ geometryTypes = [
219
+ GeometryType.Point,
220
+ GeometryType.Polygon
221
+ ];
205
222
  drawGuideField = false;
206
223
  drawGuide = null;
207
224
  drawGuidePlaceholder = '';
@@ -779,13 +796,34 @@ export class SpatialFilterItemComponent {
779
796
  columns
780
797
  };
781
798
  }
782
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpatialFilterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SpatialFilterService }, { token: i2.MessageService }, { token: i2.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
783
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SpatialFilterItemComponent, selector: "igo-spatial-filter-item", inputs: { map: "map", type: "type", queryType: "queryType", zone: "zone", loading: "loading", store: "store", layers: "layers", allLayers: "allLayers", thematicLength: "thematicLength" }, outputs: { toggleSearch: "toggleSearch", itemTypeChange: "itemTypeChange", thematicChange: "thematicChange", drawZoneEvent: "drawZoneEvent", bufferEvent: "bufferEvent", zoneWithBufferChange: "zoneWithBufferChange", measureUnitChange: "measureUnitChange", radiusEvent: "radiusEvent", freehandControl: "freehandControl", predefinedRadius: "predefinedRadius", clearButtonEvent: "clearButtonEvent", clearSearchEvent: "clearSearchEvent", export: "export", openWorkspace: "openWorkspace", entityChange: "entityChange" }, ngImport: i0, template: "<igo-geometry-form-field-input\r\n [formControl]=\"formControl\"\r\n [map]=\"map\"\r\n [geometryType]=\"geometryType\"\r\n [drawGuide]=\"drawGuide$ | async\"\r\n [measure]=\"measure\"\r\n [drawControlIsActive]=\"drawControlIsActive\"\r\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\r\n [drawStyle]=\"drawStyle$ | async\"\r\n [overlayStyle]=\"overlayStyle$ | async\"\r\n [radius]=\"radius\"\r\n [predefinedRadius]=\"predefinedRadius\"\r\n>\r\n</igo-geometry-form-field-input>\r\n\r\n<div class=\"header\">\r\n <mat-slide-toggle\r\n *ngIf=\"!isPredefined()\"\r\n [checked]=\"drawControlIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onDrawControlChange()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\r\n </mat-slide-toggle>\r\n <mat-slide-toggle\r\n *ngIf=\"!isPredefined()\"\r\n [checked]=\"freehandDrawIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onfreehandControlChange()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\r\n </mat-slide-toggle>\r\n</div>\r\n\r\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\r\n <mat-form-field class=\"buffer\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\r\n [formControl]=\"bufferFormControl\"\r\n [value]=\"0\"\r\n [readonly]=\"this.formControl.value === null\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select\r\n [value]=\"measureUnit\"\r\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let measureUnit of measureUnits\"\r\n [value]=\"measureUnit\"\r\n >\r\n {{ 'igo.geo.measure.' + measureUnit | translate }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</div>\r\n\r\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\r\n <mat-form-field class=\"radius\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\r\n [formControl]=\"radiusFormControl\"\r\n [value]=\"1000\"\r\n (input)=\"getRadius()\"\r\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select\r\n [value]=\"measureUnit\"\r\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let measureUnit of measureUnits\"\r\n [value]=\"measureUnit\"\r\n >\r\n {{ 'igo.geo.measure.' + measureUnit | translate }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</div>\r\n\r\n<mat-label class=\"title mat-typography\"\r\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\r\n</mat-label>\r\n<mat-radio-group [value]=\"selectedItemType\">\r\n <mat-radio-button\r\n *ngFor=\"let item of itemType\"\r\n [value]=\"item\"\r\n (change)=\"onItemTypeChange($event)\"\r\n >\r\n {{ 'igo.geo.spatialFilter.' + item | translate }}\r\n </mat-radio-button>\r\n</mat-radio-group>\r\n\r\n<div\r\n class=\"thematics\"\r\n *ngIf=\"\r\n (selectedItemType === 'Thematics' && !tableTemplate) ||\r\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\r\n \"\r\n>\r\n <mat-table>\r\n <!-- Name Column -->\r\n <ng-container matColumnDef=\"name\">\r\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\r\n 'igo.geo.spatialFilter.Thematics' | translate\r\n }}</mat-header-cell>\r\n </ng-container>\r\n\r\n <!-- Select Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"isAllSelected()\"\r\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\r\n >\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\r\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\r\n </mat-table>\r\n\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <!-- This is the tree node template for leaf nodes -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\r\n <li class=\"mat-tree-node\">\r\n <!-- use a disabled button to provide padding for tree leaf -->\r\n <button mat-icon-button disabled></button>\r\n {{ node.name }}\r\n <mat-checkbox\r\n class=\"tree-check\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? onToggleChange(node) : null\"\r\n [checked]=\"selectedThematics.isSelected(node)\"\r\n >\r\n </mat-checkbox>\r\n </li>\r\n </mat-tree-node>\r\n\r\n <!-- This is the tree node template for expandable nodes -->\r\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n <div class=\"mat-tree-node\">\r\n <button mat-icon-button (click)=\"onToggleClick(node)\">\r\n <mat-icon\r\n [svgIcon]=\"\r\n treeControl.isExpanded(node) ? 'chevron-down' : 'chevron-right'\r\n \"\r\n ></mat-icon>\r\n </button>\r\n {{ node.name }}\r\n <mat-checkbox\r\n class=\"tree-check-2\"\r\n (change)=\"$event ? childrensToggle(node) : null\"\r\n [checked]=\"isAllSelected(node)\"\r\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\r\n >\r\n </mat-checkbox>\r\n </div>\r\n <ul\r\n class=\"tree-ul\"\r\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </ul>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n</div>\r\n\r\n<div class=\"buttons\">\r\n <button\r\n *ngIf=\"isPredefined()\"\r\n mat-raised-button\r\n class=\"clear-search-button\"\r\n [disabled]=\"disabledClearSearch()\"\r\n (click)=\"clearSearch()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"isPolygon() || isPoint()\"\r\n mat-raised-button\r\n class=\"clear-form-button\"\r\n [disabled]=\"this.formControl.value === null\"\r\n (click)=\"clearDrawZone()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"search-button\"\r\n [disabled]=\"disableSearchButton()\"\r\n color=\"primary\"\r\n (click)=\"toggleSearchButton()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"remove-button\"\r\n [disabled]=\"allLayers.length === 0\"\r\n (click)=\"clearButton()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"export-button\"\r\n [disabled]=\"!store.entities$.getValue().length\"\r\n (click)=\"export.emit()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\r\n </button>\r\n</div>\r\n\r\n<button\r\n class=\"chevron-down\"\r\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\r\n mat-icon-button\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\r\n (click)=\"toggleVisibleList()\"\r\n>\r\n <mat-icon svgIcon=\"chevron-down\"></mat-icon>\r\n</button>\r\n\r\n<div\r\n class=\"results\"\r\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\r\n>\r\n <button\r\n *ngIf=\"listIsVisible\"\r\n mat-icon-button\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\r\n (click)=\"toggleVisibleList()\"\r\n >\r\n <mat-icon svgIcon=\"chevron-up\"></mat-icon>\r\n </button>\r\n <igo-entity-table\r\n class=\"results-list\"\r\n [template]=\"tableTemplate\"\r\n [store]=\"store\"\r\n (entitySelectChange)=\"entityChange.emit($event)\"\r\n >\r\n </igo-entity-table>\r\n</div>\r\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i8.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i10.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["role", "disabled", "tabIndex", "matNestedTreeNode"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i10.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i10.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i10.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i10.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i10.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "component", type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i12.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatLabel, selector: "mat-label" }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i15.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i17.EntityTableComponent, selector: "igo-entity-table", inputs: ["store", "paginator", "template", "scrollBehavior", "sortNullsFirst", "withPaginator", "paginatorOptions"], outputs: ["entityClick", "entitySelectChange", "entitySortChange"] }, { kind: "component", type: i18.GeometryFormFieldInputComponent, selector: "igo-geometry-form-field-input", inputs: ["map", "geometryType", "drawGuide", "measure", "drawControlIsActive", "freehandDrawIsActive", "predefinedRadius", "controlOptions", "drawStyle", "overlayStyle", "value", "radius"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
799
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialFilterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SpatialFilterService }, { token: i2.MessageService }, { token: i3.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
800
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialFilterItemComponent, isStandalone: true, selector: "igo-spatial-filter-item", inputs: { map: "map", type: "type", queryType: "queryType", zone: "zone", loading: "loading", store: "store", layers: "layers", allLayers: "allLayers", thematicLength: "thematicLength" }, outputs: { toggleSearch: "toggleSearch", itemTypeChange: "itemTypeChange", thematicChange: "thematicChange", drawZoneEvent: "drawZoneEvent", bufferEvent: "bufferEvent", zoneWithBufferChange: "zoneWithBufferChange", measureUnitChange: "measureUnitChange", radiusEvent: "radiusEvent", freehandControl: "freehandControl", predefinedRadius: "predefinedRadius", clearButtonEvent: "clearButtonEvent", clearSearchEvent: "clearSearchEvent", export: "export", openWorkspace: "openWorkspace", entityChange: "entityChange" }, ngImport: i0, template: "<igo-geometry-form-field-input\n [formControl]=\"formControl\"\n [map]=\"map\"\n [geometryType]=\"geometryType\"\n [drawGuide]=\"drawGuide$ | async\"\n [measure]=\"measure\"\n [drawControlIsActive]=\"drawControlIsActive\"\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\n [drawStyle]=\"drawStyle$ | async\"\n [overlayStyle]=\"overlayStyle$ | async\"\n [radius]=\"radius\"\n [predefinedRadius]=\"$any(predefinedRadius)\"\n>\n</igo-geometry-form-field-input>\n\n<div class=\"header\">\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onDrawControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\n </mat-slide-toggle>\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"freehandDrawIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onfreehandControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\n </mat-slide-toggle>\n</div>\n\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\n <mat-form-field class=\"buffer\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\n [formControl]=\"bufferFormControl\"\n [value]=\"0\"\n [readonly]=\"this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\n <mat-form-field class=\"radius\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\n [formControl]=\"radiusFormControl\"\n [value]=\"1000\"\n (input)=\"getRadius()\"\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<mat-label class=\"title mat-typography\"\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\n</mat-label>\n<mat-radio-group [value]=\"selectedItemType\">\n <mat-radio-button\n *ngFor=\"let item of itemType\"\n [value]=\"item\"\n (change)=\"onItemTypeChange($event)\"\n >\n {{ 'igo.geo.spatialFilter.' + item | translate }}\n </mat-radio-button>\n</mat-radio-group>\n\n<div\n class=\"thematics\"\n *ngIf=\"\n (selectedItemType === 'Thematics' && !tableTemplate) ||\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\n \"\n>\n <mat-table>\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\n 'igo.geo.spatialFilter.Thematics' | translate\n }}</mat-header-cell>\n </ng-container>\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\n >\n </mat-checkbox>\n </mat-header-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li class=\"mat-tree-node\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <button mat-icon-button disabled></button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? onToggleChange(node) : null\"\n [checked]=\"selectedThematics.isSelected(node)\"\n >\n </mat-checkbox>\n </li>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"mat-tree-node\">\n <button mat-icon-button (click)=\"onToggleClick(node)\">\n <mat-icon>{{\n treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\n }}</mat-icon>\n </button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check-2\"\n (change)=\"$event ? childrensToggle(node) : null\"\n [checked]=\"isAllSelected(node)\"\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\n >\n </mat-checkbox>\n </div>\n <ul\n class=\"tree-ul\"\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\n >\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </mat-nested-tree-node>\n </mat-tree>\n</div>\n\n<div class=\"buttons\">\n <button\n *ngIf=\"isPredefined()\"\n mat-raised-button\n class=\"clear-search-button\"\n [disabled]=\"disabledClearSearch()\"\n (click)=\"clearSearch()\"\n >\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\n </button>\n\n <button\n *ngIf=\"isPolygon() || isPoint()\"\n mat-raised-button\n class=\"clear-form-button\"\n [disabled]=\"this.formControl.value === null\"\n (click)=\"clearDrawZone()\"\n >\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"search-button\"\n [disabled]=\"disableSearchButton()\"\n color=\"primary\"\n (click)=\"toggleSearchButton()\"\n >\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"remove-button\"\n [disabled]=\"allLayers.length === 0\"\n (click)=\"clearButton()\"\n >\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"export-button\"\n [disabled]=\"!store.entities$.getValue().length\"\n (click)=\"export.emit()\"\n >\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\n </button>\n</div>\n\n<button\n class=\"expand-more\"\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n>\n <mat-icon>expand_more</mat-icon>\n</button>\n\n<div\n class=\"results\"\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\n>\n <button\n *ngIf=\"listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n >\n <mat-icon>expand_less</mat-icon>\n </button>\n <igo-entity-table\n class=\"results-list\"\n [template]=\"tableTemplate\"\n [store]=\"store\"\n (entitySelectChange)=\"entityChange.emit($event)\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"], dependencies: [{ kind: "component", type: GeometryFormFieldInputComponent, selector: "igo-geometry-form-field-input", inputs: ["map", "geometryType", "drawGuide", "measure", "drawControlIsActive", "freehandDrawIsActive", "predefinedRadius", "controlOptions", "drawStyle", "overlayStyle", "value", "radius"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i10.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i13.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i13.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i13.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i13.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: EntityTableComponent, selector: "igo-entity-table", inputs: ["store", "paginator", "template", "scrollBehavior", "sortNullsFirst", "withPaginator", "paginatorOptions"], outputs: ["entityClick", "entitySelectChange", "entitySortChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i17.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
784
801
  }
785
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpatialFilterItemComponent, decorators: [{
802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialFilterItemComponent, decorators: [{
786
803
  type: Component,
787
- args: [{ selector: 'igo-spatial-filter-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<igo-geometry-form-field-input\r\n [formControl]=\"formControl\"\r\n [map]=\"map\"\r\n [geometryType]=\"geometryType\"\r\n [drawGuide]=\"drawGuide$ | async\"\r\n [measure]=\"measure\"\r\n [drawControlIsActive]=\"drawControlIsActive\"\r\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\r\n [drawStyle]=\"drawStyle$ | async\"\r\n [overlayStyle]=\"overlayStyle$ | async\"\r\n [radius]=\"radius\"\r\n [predefinedRadius]=\"predefinedRadius\"\r\n>\r\n</igo-geometry-form-field-input>\r\n\r\n<div class=\"header\">\r\n <mat-slide-toggle\r\n *ngIf=\"!isPredefined()\"\r\n [checked]=\"drawControlIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onDrawControlChange()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\r\n </mat-slide-toggle>\r\n <mat-slide-toggle\r\n *ngIf=\"!isPredefined()\"\r\n [checked]=\"freehandDrawIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onfreehandControlChange()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\r\n </mat-slide-toggle>\r\n</div>\r\n\r\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\r\n <mat-form-field class=\"buffer\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\r\n [formControl]=\"bufferFormControl\"\r\n [value]=\"0\"\r\n [readonly]=\"this.formControl.value === null\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select\r\n [value]=\"measureUnit\"\r\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let measureUnit of measureUnits\"\r\n [value]=\"measureUnit\"\r\n >\r\n {{ 'igo.geo.measure.' + measureUnit | translate }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</div>\r\n\r\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\r\n <mat-form-field class=\"radius\">\r\n <input\r\n type=\"number\"\r\n matInput\r\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\r\n [formControl]=\"radiusFormControl\"\r\n [value]=\"1000\"\r\n (input)=\"getRadius()\"\r\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"unit-field\">\r\n <mat-select\r\n [value]=\"measureUnit\"\r\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let measureUnit of measureUnits\"\r\n [value]=\"measureUnit\"\r\n >\r\n {{ 'igo.geo.measure.' + measureUnit | translate }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</div>\r\n\r\n<mat-label class=\"title mat-typography\"\r\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\r\n</mat-label>\r\n<mat-radio-group [value]=\"selectedItemType\">\r\n <mat-radio-button\r\n *ngFor=\"let item of itemType\"\r\n [value]=\"item\"\r\n (change)=\"onItemTypeChange($event)\"\r\n >\r\n {{ 'igo.geo.spatialFilter.' + item | translate }}\r\n </mat-radio-button>\r\n</mat-radio-group>\r\n\r\n<div\r\n class=\"thematics\"\r\n *ngIf=\"\r\n (selectedItemType === 'Thematics' && !tableTemplate) ||\r\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\r\n \"\r\n>\r\n <mat-table>\r\n <!-- Name Column -->\r\n <ng-container matColumnDef=\"name\">\r\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\r\n 'igo.geo.spatialFilter.Thematics' | translate\r\n }}</mat-header-cell>\r\n </ng-container>\r\n\r\n <!-- Select Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"isAllSelected()\"\r\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\r\n >\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\r\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\r\n </mat-table>\r\n\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <!-- This is the tree node template for leaf nodes -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\r\n <li class=\"mat-tree-node\">\r\n <!-- use a disabled button to provide padding for tree leaf -->\r\n <button mat-icon-button disabled></button>\r\n {{ node.name }}\r\n <mat-checkbox\r\n class=\"tree-check\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? onToggleChange(node) : null\"\r\n [checked]=\"selectedThematics.isSelected(node)\"\r\n >\r\n </mat-checkbox>\r\n </li>\r\n </mat-tree-node>\r\n\r\n <!-- This is the tree node template for expandable nodes -->\r\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n <div class=\"mat-tree-node\">\r\n <button mat-icon-button (click)=\"onToggleClick(node)\">\r\n <mat-icon\r\n [svgIcon]=\"\r\n treeControl.isExpanded(node) ? 'chevron-down' : 'chevron-right'\r\n \"\r\n ></mat-icon>\r\n </button>\r\n {{ node.name }}\r\n <mat-checkbox\r\n class=\"tree-check-2\"\r\n (change)=\"$event ? childrensToggle(node) : null\"\r\n [checked]=\"isAllSelected(node)\"\r\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\r\n >\r\n </mat-checkbox>\r\n </div>\r\n <ul\r\n class=\"tree-ul\"\r\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </ul>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n</div>\r\n\r\n<div class=\"buttons\">\r\n <button\r\n *ngIf=\"isPredefined()\"\r\n mat-raised-button\r\n class=\"clear-search-button\"\r\n [disabled]=\"disabledClearSearch()\"\r\n (click)=\"clearSearch()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"isPolygon() || isPoint()\"\r\n mat-raised-button\r\n class=\"clear-form-button\"\r\n [disabled]=\"this.formControl.value === null\"\r\n (click)=\"clearDrawZone()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"search-button\"\r\n [disabled]=\"disableSearchButton()\"\r\n color=\"primary\"\r\n (click)=\"toggleSearchButton()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"remove-button\"\r\n [disabled]=\"allLayers.length === 0\"\r\n (click)=\"clearButton()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\r\n </button>\r\n\r\n <button\r\n mat-raised-button\r\n class=\"export-button\"\r\n [disabled]=\"!store.entities$.getValue().length\"\r\n (click)=\"export.emit()\"\r\n >\r\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\r\n </button>\r\n</div>\r\n\r\n<button\r\n class=\"chevron-down\"\r\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\r\n mat-icon-button\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\r\n (click)=\"toggleVisibleList()\"\r\n>\r\n <mat-icon svgIcon=\"chevron-down\"></mat-icon>\r\n</button>\r\n\r\n<div\r\n class=\"results\"\r\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\r\n>\r\n <button\r\n *ngIf=\"listIsVisible\"\r\n mat-icon-button\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\r\n (click)=\"toggleVisibleList()\"\r\n >\r\n <mat-icon svgIcon=\"chevron-up\"></mat-icon>\r\n </button>\r\n <igo-entity-table\r\n class=\"results-list\"\r\n [template]=\"tableTemplate\"\r\n [store]=\"store\"\r\n (entitySelectChange)=\"entityChange.emit($event)\"\r\n >\r\n </igo-entity-table>\r\n</div>\r\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"] }]
788
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SpatialFilterService }, { type: i2.MessageService }, { type: i2.LanguageService }]; }, propDecorators: { map: [{
804
+ args: [{ selector: 'igo-spatial-filter-item', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
805
+ GeometryFormFieldInputComponent,
806
+ FormsModule,
807
+ ReactiveFormsModule,
808
+ NgIf,
809
+ MatSlideToggleModule,
810
+ MatFormFieldModule,
811
+ MatInputModule,
812
+ MatSelectModule,
813
+ NgFor,
814
+ MatOptionModule,
815
+ MatRadioModule,
816
+ MatTableModule,
817
+ MatCheckboxModule,
818
+ MatTreeModule,
819
+ MatButtonModule,
820
+ MatIconModule,
821
+ MatTooltipModule,
822
+ EntityTableComponent,
823
+ AsyncPipe,
824
+ IgoLanguageModule
825
+ ], template: "<igo-geometry-form-field-input\n [formControl]=\"formControl\"\n [map]=\"map\"\n [geometryType]=\"geometryType\"\n [drawGuide]=\"drawGuide$ | async\"\n [measure]=\"measure\"\n [drawControlIsActive]=\"drawControlIsActive\"\n [freehandDrawIsActive]=\"freehandDrawIsActive\"\n [drawStyle]=\"drawStyle$ | async\"\n [overlayStyle]=\"overlayStyle$ | async\"\n [radius]=\"radius\"\n [predefinedRadius]=\"$any(predefinedRadius)\"\n>\n</igo-geometry-form-field-input>\n\n<div class=\"header\">\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"drawControlIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onDrawControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.drawControl' | translate }}\n </mat-slide-toggle>\n <mat-slide-toggle\n *ngIf=\"!isPredefined()\"\n [checked]=\"freehandDrawIsActive\"\n [labelPosition]=\"'before'\"\n (change)=\"onfreehandControlChange()\"\n >\n {{ 'igo.geo.spatialFilter.freehandControl' | translate }}\n </mat-slide-toggle>\n</div>\n\n<div class=\"buffer-unit\" *ngIf=\"isPolygon()\">\n <mat-form-field class=\"buffer\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.buffer' | translate }}\"\n [formControl]=\"bufferFormControl\"\n [value]=\"0\"\n [readonly]=\"this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<div class=\"radius-unit\" *ngIf=\"isPoint()\">\n <mat-form-field class=\"radius\">\n <input\n type=\"number\"\n matInput\n placeholder=\"{{ 'igo.geo.spatialFilter.radius' | translate }}\"\n [formControl]=\"radiusFormControl\"\n [value]=\"1000\"\n (input)=\"getRadius()\"\n [readonly]=\"this.freehandDrawIsActive && this.formControl.value === null\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"unit-field\">\n <mat-select\n [value]=\"measureUnit\"\n (selectionChange)=\"onMeasureUnitChange($event.value)\"\n >\n <mat-option\n *ngFor=\"let measureUnit of measureUnits\"\n [value]=\"measureUnit\"\n >\n {{ 'igo.geo.measure.' + measureUnit | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>\n\n<mat-label class=\"title mat-typography\"\n >{{ 'igo.geo.spatialFilter.search' | translate }} :\n</mat-label>\n<mat-radio-group [value]=\"selectedItemType\">\n <mat-radio-button\n *ngFor=\"let item of itemType\"\n [value]=\"item\"\n (change)=\"onItemTypeChange($event)\"\n >\n {{ 'igo.geo.spatialFilter.' + item | translate }}\n </mat-radio-button>\n</mat-radio-group>\n\n<div\n class=\"thematics\"\n *ngIf=\"\n (selectedItemType === 'Thematics' && !tableTemplate) ||\n (selectedItemType === 'Thematics' && tableTemplate && !listIsVisible)\n \"\n>\n <mat-table>\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef class=\"thematics-header\">{{\n 'igo.geo.spatialFilter.Thematics' | translate\n }}</mat-header-cell>\n </ng-container>\n\n <!-- Select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef class=\"checks-header\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"isAllSelected()\"\n [indeterminate]=\"selectedThematics.hasValue() && !isAllSelected()\"\n >\n </mat-checkbox>\n </mat-header-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\n <li class=\"mat-tree-node\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <button mat-icon-button disabled></button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? onToggleChange(node) : null\"\n [checked]=\"selectedThematics.isSelected(node)\"\n >\n </mat-checkbox>\n </li>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\n <div class=\"mat-tree-node\">\n <button mat-icon-button (click)=\"onToggleClick(node)\">\n <mat-icon>{{\n treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\n }}</mat-icon>\n </button>\n {{ node.name }}\n <mat-checkbox\n class=\"tree-check-2\"\n (change)=\"$event ? childrensToggle(node) : null\"\n [checked]=\"isAllSelected(node)\"\n [indeterminate]=\"hasChildrenSelected(node) && !isAllSelected(node)\"\n >\n </mat-checkbox>\n </div>\n <ul\n class=\"tree-ul\"\n [class.example-tree-invisible]=\"!treeControl.isExpanded(node)\"\n >\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </mat-nested-tree-node>\n </mat-tree>\n</div>\n\n<div class=\"buttons\">\n <button\n *ngIf=\"isPredefined()\"\n mat-raised-button\n class=\"clear-search-button\"\n [disabled]=\"disabledClearSearch()\"\n (click)=\"clearSearch()\"\n >\n {{ 'igo.geo.spatialFilter.clearSearch' | translate }}\n </button>\n\n <button\n *ngIf=\"isPolygon() || isPoint()\"\n mat-raised-button\n class=\"clear-form-button\"\n [disabled]=\"this.formControl.value === null\"\n (click)=\"clearDrawZone()\"\n >\n {{ 'igo.geo.spatialFilter.clearForm' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"search-button\"\n [disabled]=\"disableSearchButton()\"\n color=\"primary\"\n (click)=\"toggleSearchButton()\"\n >\n {{ 'igo.geo.spatialFilter.goSearch' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"remove-button\"\n [disabled]=\"allLayers.length === 0\"\n (click)=\"clearButton()\"\n >\n {{ 'igo.geo.spatialFilter.removeLayer' | translate }}\n </button>\n\n <button\n mat-raised-button\n class=\"export-button\"\n [disabled]=\"!store.entities$.getValue().length\"\n (click)=\"export.emit()\"\n >\n {{ 'igo.geo.spatialFilter.exportLayer' | translate }}\n </button>\n</div>\n\n<button\n class=\"expand-more\"\n *ngIf=\"store.all().length && tableTemplate && !listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.showSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n>\n <mat-icon>expand_more</mat-icon>\n</button>\n\n<div\n class=\"results\"\n *ngIf=\"store.all().length && tableTemplate && listIsVisible\"\n>\n <button\n *ngIf=\"listIsVisible\"\n mat-icon-button\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.spatialFilter.hideSearchResults' | translate\"\n (click)=\"toggleVisibleList()\"\n >\n <mat-icon>expand_less</mat-icon>\n </button>\n <igo-entity-table\n class=\"results-list\"\n [template]=\"tableTemplate\"\n [store]=\"store\"\n (entitySelectChange)=\"entityChange.emit($event)\"\n >\n </igo-entity-table>\n</div>\n", styles: [":host .header{margin-top:5px;width:100%}:host .mat-mdc-slide-toggle{padding:5px;width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-form-field{width:100%}:host .mat-mdc-slide-toggle ::ng-deep .mdc-label{margin-left:0;width:calc(100% - 60px)}:host .title{margin-left:5px;font-size:initial}:host .mat-mdc-radio-group{display:flex;flex-direction:column}:host .mat-mdc-radio-button{display:inline-flex;position:relative;margin-left:12px}:host .mat-mdc-form-field{margin-top:5px}:host .mat-column-select{overflow:auto}:host .buttons{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:16px 0}:host .thematics{max-height:35%;overflow:auto;margin-top:5px;width:98%}:host .results{overflow:auto;max-height:250px;width:98%}:host .mat-column-typeResults{max-width:100px;margin-right:5px}:host .buffer-unit,:host .radius-unit{display:flex;width:100%;padding:5px;box-sizing:border-box}:host .radius,:host .buffer{flex-flow:column nowrap;flex:2}:host .unit-field{flex:1;margin-left:8px}:host .example-tree-invisible{display:none}:host .tree-ul{margin:0;padding:0 0 0 20px;list-style-type:none}:host .tree-check,:host .tree-check-2{position:relative;margin-left:auto;margin-right:5px}:host .thematics-header{max-width:250px}:host .checks-header{padding:none;max-width:calc(100% - 316px);overflow:hidden}:host .mat-mdc-checkbox{padding:5px}:host .mat-tree-node{position:relative;min-height:42px;width:280px}:host .mat-mdc-header-cell{height:56px}:host .results{max-height:45%;width:98%}:host .results igo-entity-table ::ng-deep div.table-container{overflow:unset}\n"] }]
826
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SpatialFilterService }, { type: i2.MessageService }, { type: i3.LanguageService }], propDecorators: { map: [{
789
827
  type: Input
790
828
  }], type: [{
791
829
  type: Input
@@ -834,4 +872,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
834
872
  }], entityChange: [{
835
873
  type: Output
836
874
  }] } });
837
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXIvc3BhdGlhbC1maWx0ZXItaXRlbS9zcGF0aWFsLWZpbHRlci1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci9zcGF0aWFsLWZpbHRlci1pdGVtL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtDQUFrQyxFQUNsQyx5QkFBeUIsRUFFMUIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFNN0QsT0FBTyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxVQUFVLENBQUM7QUFFcEMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlD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QkFHRixjQUFjO3NCQURqQixLQUFLO2dCQVNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBOZXN0ZWRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRW50aXR5U3RvcmUsXHJcbiAgRW50aXR5U3RvcmVGaWx0ZXJTZWxlY3Rpb25TdHJhdGVneSxcclxuICBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLFxyXG4gIEVudGl0eVRhYmxlVGVtcGxhdGVcclxufSBmcm9tICdAaWdvMi9jb21tb24nO1xyXG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XHJcblxyXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xyXG5pbXBvcnQgdHlwZSB7IFR5cGUgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcclxuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcclxuaW1wb3J0IE9sUG9pbnQgZnJvbSAnb2wvZ2VvbS9Qb2ludCc7XHJcbmltcG9ydCAqIGFzIG9scHJvaiBmcm9tICdvbC9wcm9qJztcclxuaW1wb3J0ICogYXMgb2xTdHlsZSBmcm9tICdvbC9zdHlsZSc7XHJcblxyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkJztcclxuaW1wb3J0IHsgRmVhdHVyZU1vdGlvbiwgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi8uLi9mZWF0dXJlJztcclxuaW1wb3J0IHsgR2VvSlNPTkdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2dlb21ldHJ5LmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBMYXllciwgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi8uLi9sYXllci9zaGFyZWQnO1xyXG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi8uLi9tYXAvc2hhcmVkL21hcCc7XHJcbmltcG9ydCB7IE1lYXN1cmVMZW5ndGhVbml0IH0gZnJvbSAnLi4vLi4vLi4vbWVhc3VyZSc7XHJcbmltcG9ydCB7XHJcbiAgU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZSxcclxuICBTcGF0aWFsRmlsdGVyVHlwZVxyXG59IGZyb20gJy4uLy4uL3NoYXJlZC9zcGF0aWFsLWZpbHRlci5lbnVtJztcclxuaW1wb3J0IHsgU3BhdGlhbEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc3BhdGlhbC1maWx0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLy4uLy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZSB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL3NwYXRpYWwtZmlsdGVyLmVudW0nO1xyXG5pbXBvcnQgeyBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgfSBmcm9tICcuLy4uLy4uL3NoYXJlZC9zcGF0aWFsLWZpbHRlci5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNwYXRpYWwtRmlsdGVyLUl0ZW0gKHNlYXJjaCBwYXJhbWV0ZXJzKVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZ28tc3BhdGlhbC1maWx0ZXItaXRlbScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3BhdGlhbEZpbHRlckl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgbWFwOiBJZ29NYXA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHR5cGUoKTogU3BhdGlhbEZpbHRlclR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG4gIHNldCB0eXBlKHR5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlKSB7XHJcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZW9tZXRyeVR5cGVzLmZpbmRJbmRleCgoZ2VvbSkgPT4gZ2VvbSA9PT0gdGhpcy50eXBlKTtcclxuICAgIHRoaXMuZ2VvbWV0cnlUeXBlID0gdGhpcy5nZW9tZXRyeVR5cGVzW2luZGV4XTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgIHRoaXMucmFkaXVzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5kcmF3R3VpZGUkLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmRyYXdTdHlsZSQubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgIC8vIE5lY2Vzc2FyeSB0byBrZWVwIHJlZmVyZW5jZSB0byB0aGUgZ2VvbWV0cnkgZm9ybSBmaWVsZCBpbnB1dFxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICBjb25zdCBnZW9qc29uOiBHZW9KU09OR2VvbWV0cnkgPSB7XHJcbiAgICAgICAgdHlwZTogJ1BvaW50JyxcclxuICAgICAgICBjb29yZGluYXRlczogJydcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShnZW9qc29uKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOZWNlc3NhcnkgdG8gYXBwbHkgdGhlIHJpZ2h0IHN0eWxlIHdoZW4gZ2VvbWV0cnkgdHlwZSBpcyBQb2ludFxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcclxuICAgICAgdGhpcy5yYWRpdXMgPSAxMDAwOyAvLyBCYXNlIHJhZGl1c1xyXG4gICAgICB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMucmFkaXVzKTtcclxuICAgICAgdGhpcy5Qb2ludFN0eWxlID0gKFxyXG4gICAgICAgIGZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcclxuICAgICAgICByZXNvbHV0aW9uOiBudW1iZXJcclxuICAgICAgKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBPbFBvaW50O1xyXG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gb2xwcm9qLnRyYW5zZm9ybShcclxuICAgICAgICAgIGdlb20uZ2V0Q29vcmRpbmF0ZXMoKSxcclxuICAgICAgICAgIHRoaXMubWFwLnByb2plY3Rpb24sXHJcbiAgICAgICAgICAnRVBTRzo0MzI2J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBvbFN0eWxlLlN0eWxlKHtcclxuICAgICAgICAgIGltYWdlOiBuZXcgb2xTdHlsZS5DaXJjbGUoe1xyXG4gICAgICAgICAgICByYWRpdXM6XHJcbiAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgL1xyXG4gICAgICAgICAgICAgIE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIGNvb3JkaW5hdGVzWzFdKSAvXHJcbiAgICAgICAgICAgICAgcmVzb2x1dGlvbiwgLy8gTGF0aXR1ZGUgY29ycmVjdGlvblxyXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IDIsXHJcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1KSdcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGZpbGw6IG5ldyBvbFN0eWxlLkZpbGwoe1xyXG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSwgMC4yKSdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMub3ZlcmxheVN0eWxlID0gdGhpcy5Qb2ludFN0eWxlO1xyXG4gICAgICB0aGlzLmRyYXdTdHlsZSQubmV4dCh0aGlzLm92ZXJsYXlTdHlsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJZiBnZW9tZXRyeSB0eXBlcyBpcyBQb2x5Z29uXHJcbiAgICAgIHRoaXMucmFkaXVzID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLlBvbHlTdHlsZSA9ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IG9sU3R5bGUuU3R5bGUoe1xyXG4gICAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xyXG4gICAgICAgICAgICB3aWR0aDogMixcclxuICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1KSdcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmlsbDogbmV3IG9sU3R5bGUuRmlsbCh7XHJcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSwgMC4yKSdcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gWzAsIDE1MywgMjU1XTtcclxuICAgICAgY29uc3QgZHJhd1N0eWxlID0gKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgb2xTdHlsZS5TdHlsZSh7XHJcbiAgICAgICAgICBpbWFnZTogbmV3IG9sU3R5bGUuQ2lyY2xlKHtcclxuICAgICAgICAgICAgcmFkaXVzOiA4LFxyXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IDIsXHJcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1KSdcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGZpbGw6IG5ldyBvbFN0eWxlLkZpbGwoe1xyXG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSwgMC4yKSdcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgc3Ryb2tlOiBuZXcgb2xTdHlsZS5TdHJva2Uoe1xyXG4gICAgICAgICAgICBjb2xvcjogY29sb3IuY29uY2F0KFsxXSksXHJcbiAgICAgICAgICAgIHdpZHRoOiAyXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGZpbGw6IG5ldyBvbFN0eWxlLkZpbGwoe1xyXG4gICAgICAgICAgICBjb2xvcjogY29sb3IuY29uY2F0KFswLjJdKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5vdmVybGF5U3R5bGUgPSB0aGlzLlBvbHlTdHlsZTtcclxuICAgICAgdGhpcy5kcmF3U3R5bGUkLm5leHQoZHJhd1N0eWxlKTtcclxuICAgIH1cclxuICAgIHRoaXMub3ZlcmxheVN0eWxlJC5uZXh0KHRoaXMub3ZlcmxheVN0eWxlKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfdHlwZTogU3BhdGlhbEZpbHRlclR5cGU7XHJcblxyXG4gIEBJbnB1dCgpIHF1ZXJ5VHlwZTogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZTtcclxuXHJcbiAgQElucHV0KCkgem9uZTogRmVhdHVyZTtcclxuXHJcbiAgQElucHV0KCkgbG9hZGluZztcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgc3RvcmUoKTogRW50aXR5U3RvcmU8RmVhdHVyZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlO1xyXG4gIH1cclxuICBzZXQgc3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlPEZlYXR1cmU+KSB7XHJcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xyXG4gICAgdGhpcy5fc3RvcmUuZW50aXRpZXMkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3N0b3JlOiBFbnRpdHlTdG9yZTxGZWF0dXJlPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQXZhaWxhYmxlIG1lYXN1cmUgdW5pdHMgZm9yIHRoZSBtZWFzdXJlIHR5cGUgZ2l2ZW5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBnZXQgbWVhc3VyZVVuaXRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzLCBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzXTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGxheWVyczogTGF5ZXJbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBhbGxMYXllcnM6IExheWVyW10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgdGhlbWF0aWNMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90aGVtYXRpY0xlbmd0aDtcclxuICB9XHJcbiAgc2V0IHRoZW1hdGljTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3RoZW1hdGljTGVuZ3RoID0gdmFsdWU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3RoZW1hdGljTGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gIEBPdXRwdXQoKSB0b2dnbGVTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKSBpdGVtVHlwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U3BhdGlhbEZpbHRlckl0ZW1UeXBlPigpO1xyXG5cclxuICBAT3V0cHV0KCkgdGhlbWF0aWNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdPigpO1xyXG5cclxuICBAT3V0cHV0KCkgZHJhd1pvbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RmVhdHVyZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGJ1ZmZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIHpvbmVXaXRoQnVmZmVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGZWF0dXJlPigpO1xyXG4gIEBPdXRwdXQoKSBtZWFzdXJlVW5pdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TWVhc3VyZUxlbmd0aFVuaXQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSByYWRpdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBmcmVlaGFuZENvbnRyb2wgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQE91dHB1dCgpIHByZWRlZmluZWRSYWRpdXMgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBjbGVhckJ1dHRvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgY2xlYXJTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIGV4cG9ydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIG9wZW5Xb3Jrc3BhY2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGVudGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwdWJsaWMgaXRlbVR5cGU6IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZVtdID0gW1xyXG4gICAgU3BhdGlhbEZpbHRlckl0ZW1UeXBlLkFkZHJlc3MsXHJcbiAgICBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzXHJcbiAgXTtcclxuICBwdWJsaWMgc2VsZWN0ZWRJdGVtVHlwZTogU3BhdGlhbEZpbHRlckl0ZW1UeXBlID1cclxuICAgIFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5BZGRyZXNzO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFNvdXJjZUFkZHJlc3M7XHJcblxyXG4gIHRyZWVDb250cm9sOiBOZXN0ZWRUcmVlQ29udHJvbDxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+ID1cclxuICAgIG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+KChub2RlKSA9PiBub2RlLmNoaWxkcmVuKTtcclxuXHJcbiAgLy8gRm9yIHRoZW1hdGljcyBhbmQgcmVzdWx0cyB0YWJsZXNcclxuICBwdWJsaWMgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ25hbWUnLCAnc2VsZWN0J107XHJcbiAgcHVibGljIGNoaWxkcmVuczogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcclxuICBwdWJsaWMgZ3JvdXBzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHB1YmxpYyB0aGVtYXRpY3M6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdID0gW107XHJcbiAgcHVibGljIGRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8U3BhdGlhbEZpbHRlclRoZW1hdGljPigpO1xyXG4gIHB1YmxpYyBzZWxlY3RlZFRoZW1hdGljcyA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+KFxyXG4gICAgdHJ1ZSxcclxuICAgIFtdXHJcbiAgKTtcclxuXHJcbiAgLy8gRm9yIGdlb21ldHJ5IGZvcm0gZmllbGQgaW5wdXRcclxuICB2YWx1ZSQ6IEJlaGF2aW9yU3ViamVjdDxHZW9KU09OR2VvbWV0cnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xyXG4gIGRyYXdHdWlkZSQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcclxuICBvdmVybGF5U3R5bGUkOiBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKVxyXG4gID4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XHJcbiAgZHJhd1N0eWxlJDogQmVoYXZpb3JTdWJqZWN0PFxyXG4gICAgb2xTdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xTdHlsZS5TdHlsZSlcclxuICA+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xyXG5cclxuICBwcml2YXRlIHZhbHVlJCQ6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIHJhZGl1c0NoYW5nZXMkJDogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgYnVmZmVyQ2hhbmdlcyQkOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHB1YmxpYyBmb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBwdWJsaWMgZ2VvbWV0cnlUeXBlOiBUeXBlIHwgc3RyaW5nO1xyXG4gIHB1YmxpYyBnZW9tZXRyeVR5cGVGaWVsZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBnZW9tZXRyeVR5cGVzOiBzdHJpbmdbXSA9IFsnUG9pbnQnLCAnUG9seWdvbiddO1xyXG4gIHB1YmxpYyBkcmF3R3VpZGVGaWVsZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkcmF3R3VpZGU6IG51bWJlciA9IG51bGw7XHJcbiAgcHVibGljIGRyYXdHdWlkZVBsYWNlaG9sZGVyID0gJyc7XHJcbiAgcHVibGljIG1lYXN1cmUgPSBmYWxzZTtcclxuICBwdWJsaWMgZHJhd0NvbnRyb2xJc0FjdGl2ZSA9IHRydWU7XHJcbiAgcHVibGljIGZyZWVoYW5kRHJhd0lzQWN0aXZlID0gZmFsc2U7XHJcbiAgcHVibGljIGRyYXdTdHlsZTogb2xTdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xTdHlsZS5TdHlsZSk7XHJcbiAgcHVibGljIGRyYXdab25lO1xyXG4gIHB1YmxpYyBvdmVybGF5U3R5bGU6IG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpO1xyXG4gIHB1YmxpYyBQb2ludFN0eWxlOiBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKTtcclxuICBwdWJsaWMgUG9seVN0eWxlOiBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKTtcclxuXHJcbiAgcHVibGljIHJhZGl1czogbnVtYmVyO1xyXG4gIHB1YmxpYyBidWZmZXI6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHJhZGl1c0Zvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyBidWZmZXJGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgcHVibGljIG1lYXN1cmVVbml0OiBNZWFzdXJlTGVuZ3RoVW5pdCA9IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycztcclxuICBwdWJsaWMgem9uZVdpdGhCdWZmZXI7XHJcblxyXG4gIHB1YmxpYyBsaXN0SXNWaXNpYmxlID0gdHJ1ZTtcclxuICBwdWJsaWMgdGFibGVUZW1wbGF0ZTogRW50aXR5VGFibGVUZW1wbGF0ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgc3BhdGlhbEZpbHRlclNlcnZpY2U6IFNwYXRpYWxGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcclxuICAgICAgLmxvYWRUaGVtYXRpY3NMaXN0KClcclxuICAgICAgLnN1YnNjcmliZSgoaXRlbXM6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpY1tdKSA9PiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgICB0aGlzLmNoaWxkcmVucy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbnMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8udGVycmFwaS5saW1pdGVzJylcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGxpbWl0czogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xyXG4gICAgICAgICAgbmFtZTogdGhpcy5ncm91cHNbMF0sXHJcbiAgICAgICAgICBjaGlsZHJlbjogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMudGhlbWF0aWNzLnB1c2gobGltaXRzKTtcclxuICAgICAgICB0aGlzLmNoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkLmdyb3VwICYmIHRoaXMuZ3JvdXBzLmluZGV4T2YoY2hpbGQuZ3JvdXApID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKGNoaWxkLmdyb3VwKTtcclxuICAgICAgICAgICAgY29uc3QgdGhlbWF0aWM6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyA9IHtcclxuICAgICAgICAgICAgICBuYW1lOiBjaGlsZC5ncm91cCxcclxuICAgICAgICAgICAgICBjaGlsZHJlbjogW11cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFjaGlsZC5ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLkFkbVJlZ2lvbidcclxuICAgICAgICAgICAgICAgICkgfHxcclxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8udGVycmFwaS5NdW4nKSB8fFxyXG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgICAgJ2lnby5nZW8udGVycmFwaS5BcnJvbmQnXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLkNpcmNGZWQnXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLkNpcmNQcm92J1xyXG4gICAgICAgICAgICAgICAgKSB8fFxyXG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgICAgJ2lnby5nZW8udGVycmFwaS5EaXJSZWcnXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cclxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkuTVJDJykgfHxcclxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuUmVnVG91cidcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGQuZ3JvdXAgPSBsaW1pdHMubmFtZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxyXG4gICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkucm91dGVzJylcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGQuZ3JvdXAgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcclxuICAgICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuZ3JvdXAudHJhbnNwb3J0J1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGhlbWF0aWM6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYyA9IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGNoaWxkLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNoaWxkLnNvdXJjZVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudGhlbWF0aWNzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVucykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQuZ3JvdXAgPT09IHRoZW1hdGljLm5hbWUpIHtcclxuICAgICAgICAgICAgICB0aGVtYXRpYy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMudGhlbWF0aWNzO1xyXG5cclxuICAgIHRoaXMuZHJhd0d1aWRlJC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy52YWx1ZSQubmV4dChcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgOiB1bmRlZmluZWRcclxuICAgICk7XHJcbiAgICB0aGlzLnZhbHVlJCQgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoXHJcbiAgICAgICh2YWx1ZTogR2VvSlNPTkdlb21ldHJ5KSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlJC5uZXh0KHZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuZHJhd1pvbmUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlIGFzIEZlYXR1cmU7XHJcbiAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kcmF3Wm9uZUV2ZW50LmVtaXQodGhpcy5kcmF3Wm9uZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5idWZmZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlJC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICB0aGlzLmRyYXdab25lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnZhbHVlJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdldFJhZGl1cygpO1xyXG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmFkaXVzQ2hhbmdlcyQkID0gdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5nZXRSYWRpdXMoKTtcclxuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJ1ZmZlckNoYW5nZXMkJCA9IHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycyAmJlxyXG4gICAgICAgICAgdmFsdWUgPiAwICYmXHJcbiAgICAgICAgICB2YWx1ZSA8PSAxMDAwMDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuYnVmZmVyID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQodmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zcGF0aWFsRmlsdGVyU2VydmljZVxyXG4gICAgICAgICAgICAubG9hZEJ1ZmZlckdlb21ldHJ5KHRoaXMuZHJhd1pvbmUsIFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb24sIHZhbHVlKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChmZWF0dXJlR2VvbTogRmVhdHVyZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXIgPSBmZWF0dXJlR2VvbTtcclxuICAgICAgICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyQ2hhbmdlLmVtaXQodGhpcy56b25lV2l0aEJ1ZmZlcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmXHJcbiAgICAgICAgICB2YWx1ZSA+IDAgJiZcclxuICAgICAgICAgIHZhbHVlIDw9IDEwMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYnVmZmVyRXZlbnQuZW1pdCh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNwYXRpYWxGaWx0ZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5sb2FkQnVmZmVyR2VvbWV0cnkoXHJcbiAgICAgICAgICAgICAgdGhpcy5kcmF3Wm9uZSxcclxuICAgICAgICAgICAgICBTcGF0aWFsRmlsdGVyVHlwZS5Qb2x5Z29uLFxyXG4gICAgICAgICAgICAgIHZhbHVlICogMTAwMFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZlYXR1cmVHZW9tOiBGZWF0dXJlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy56b25lV2l0aEJ1ZmZlciA9IGZlYXR1cmVHZW9tO1xyXG4gICAgICAgICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXJDaGFuZ2UuZW1pdCh0aGlzLnpvbmVXaXRoQnVmZmVyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYnVmZmVyRXZlbnQuZW1pdCh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgdmFsdWUgPCAwIHx8XHJcbiAgICAgICAgICAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzICYmIHZhbHVlID4gMTAwMDAwKSB8fFxyXG4gICAgICAgICAgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiYgdmFsdWUgPiAxMDApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xyXG4gICAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hbGVydChcclxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5idWZmZXJBbGVydCcsXHJcbiAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIud2FybmluZydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZFN0cmF0ZWd5ID0gbmV3IEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3koe30pO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uU3RyYXRlZ3kgPSBuZXcgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3koe1xyXG4gICAgICBsYXllcjogbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgICB6SW5kZXg6IDMwMCxcclxuICAgICAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHN0eWxlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgc2hvd0luTGF5ZXJMaXN0OiBmYWxzZSxcclxuICAgICAgICBleHBvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICBicm93c2FibGU6IGZhbHNlXHJcbiAgICAgIH0pLFxyXG4gICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICBoaXRUb2xlcmFuY2U6IDE1LFxyXG4gICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uRGVmYXVsdCxcclxuICAgICAgbWFueTogdHJ1ZSxcclxuICAgICAgZHJhZ0JveDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdG9yZS5hZGRTdHJhdGVneShzZWxlY3Rpb25TdHJhdGVneSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnN0b3JlLmFkZFN0cmF0ZWd5KHNlbGVjdGVkUmVjb3JkU3RyYXRlZ3ksIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVuc3Vic2NyaWJlIHRvIHRoZSB2YWx1ZSBzdHJlYW1cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudmFsdWUkJC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5yYWRpdXNDaGFuZ2VzJCQudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYnVmZmVyQ2hhbmdlcyQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmNkUmVmLmRldGFjaCgpO1xyXG4gICAgaWYgKHRoaXMucmFkaXVzQ2hhbmdlcyQkKSB7XHJcbiAgICAgIHRoaXMucmFkaXVzQ2hhbmdlcyQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy52YWx1ZSQkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUkJC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25JdGVtVHlwZUNoYW5nZShldmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID0gZXZlbnQudmFsdWU7XHJcbiAgICB0aGlzLml0ZW1UeXBlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1UeXBlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbWVhc3VyZSB1bml0XHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgb25NZWFzdXJlVW5pdENoYW5nZSh1bml0OiBNZWFzdXJlTGVuZ3RoVW5pdCkge1xyXG4gICAgaWYgKHVuaXQgPT09IHRoaXMubWVhc3VyZVVuaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9IHVuaXQ7XHJcbiAgICAgIHRoaXMubWVhc3VyZVVuaXRDaGFuZ2UuZW1pdCh0aGlzLm1lYXN1cmVVbml0KTtcclxuICAgICAgaWYgKHRoaXMuaXNQb2x5Z29uKCkpIHtcclxuICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnNcclxuICAgICAgICAgID8gdGhpcy5idWZmZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnZhbHVlICogMTAwMClcclxuICAgICAgICAgIDogdGhpcy5idWZmZXJGb3JtQ29udHJvbC5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnZhbHVlIC8gMTAwMFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQb2ludCgpKSB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXHJcbiAgICAgICAgICA/IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSAqIDEwMDApXHJcbiAgICAgICAgICA6IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSAvIDEwMDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNQcmVkZWZpbmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGlzUG9seWdvbigpIHtcclxuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb247XHJcbiAgfVxyXG5cclxuICBpc1BvaW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQ7XHJcbiAgfVxyXG5cclxuICBoYXNDaGlsZChfOiBudW1iZXIsIG5vZGU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xyXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVDbGljayhub2RlOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcclxuICAgIHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVxyXG4gICAgICA/IHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2Uobm9kZSlcclxuICAgICAgOiB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcclxuICB9XHJcblxyXG4gIGlzQWxsU2VsZWN0ZWQobm9kZT86IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xyXG4gICAgbGV0IG51bVNlbGVjdGVkO1xyXG4gICAgbGV0IG51bU5vZGVzID0gMDtcclxuICAgIGlmICghbm9kZSkge1xyXG4gICAgICBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3Vwcy5pbmRleE9mKHRoZW1hdGljLm5hbWUpID09PSAtMSkge1xyXG4gICAgICAgICAgbnVtTm9kZXMrKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmNoaWxkcmVucy5mb3JFYWNoKChjaGlsZHJlbikgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLnRoZW1hdGljcy5maW5kKFxyXG4gICAgICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljLnNvdXJjZSA9PT0gY2hpbGRyZW4uc291cmNlXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBudW1Ob2RlcysrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBudW1TZWxlY3RlZCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljID09PSBjaGlsZHJlblxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgbnVtTm9kZXMrKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChudW1Ob2RlcyA+PSAxKSB7XHJcbiAgICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtTm9kZXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNDaGlsZHJlblNlbGVjdGVkKG5vZGU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xyXG4gICAgbGV0IGJvb2wgPSBmYWxzZTtcclxuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAgICh0aGVtYXRpYykgPT4gdGhlbWF0aWMuc291cmNlID09PSBjaGlsZC5zb3VyY2VcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIGJvb2wgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBib29sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgaGVhZGVyIGNoZWNrYm94XHJcbiAgICovXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKCkgPyB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLmNsZWFyKCkgOiB0aGlzLnNlbGVjdEFsbCgpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZCkge1xyXG4gICAgICBzZWxlY3RlZFRoZW1hdGljc05hbWUucHVzaCh0aGVtYXRpYyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XHJcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hpbGQoMCwgdGhlbWF0aWMpKSB7XHJcbiAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZCh0aGVtYXRpYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hpbGQoMCwgdGhlbWF0aWMpKSB7XHJcbiAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlKHRoZW1hdGljKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KHNlbGVjdGVkVGhlbWF0aWNzTmFtZSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGwobm9kZT86IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmluZGV4T2YodGhlbWF0aWMubmFtZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdCh0aGVtYXRpYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGRyZW4pID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxyXG4gICAgICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljLnNvdXJjZSA9PT0gY2hpbGRyZW4uc291cmNlXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdChjaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc0NoaWxkKDAsIG5vZGUpKSB7XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZHJlbikgPT5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0KGNoaWxkcmVuKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoaWxkcmVuc1RvZ2dsZShub2RlOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcclxuICAgIHRoaXMuaXNBbGxTZWxlY3RlZChub2RlKVxyXG4gICAgICA/IG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuZGVzZWxlY3QoY2hpbGQpKVxyXG4gICAgICA6IHRoaXMuc2VsZWN0QWxsKG5vZGUpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZCkge1xyXG4gICAgICBzZWxlY3RlZFRoZW1hdGljc05hbWUucHVzaCh0aGVtYXRpYyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChub2RlKTtcclxuICAgIHRoaXMudGhlbWF0aWNDaGFuZ2UuZW1pdChzZWxlY3RlZFRoZW1hdGljc05hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgY2hhbmdlcyB0byB0aGUgdGhlbWF0aWNzIHNlbGVjdGVkIHRyZWUgYW5kIGVtaXQgZXZlbnRcclxuICAgKi9cclxuICBvblRvZ2dsZUNoYW5nZShub2RlU2VsZWN0ZWQ6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xyXG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQuZmluZChcclxuICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljLnNvdXJjZSA9PT0gbm9kZVNlbGVjdGVkLnNvdXJjZVxyXG4gICAgICApICE9PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICBzZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGRyZW4pID0+IHtcclxuICAgICAgaWYgKGNoaWxkcmVuID09PSBub2RlU2VsZWN0ZWQgJiYgc2VsZWN0ZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QoY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGlsZHJlbiA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5kZXNlbGVjdChjaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy50aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcclxuICAgICAgaWYgKHRoZW1hdGljID09PSBub2RlU2VsZWN0ZWQgJiYgc2VsZWN0ZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QodGhlbWF0aWMpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGVtYXRpYyA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5kZXNlbGVjdCh0aGVtYXRpYyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZCkge1xyXG4gICAgICBzZWxlY3RlZFRoZW1hdGljc05hbWUucHVzaCh0aGVtYXRpYyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRoZW1hdGljQ2hhbmdlLmVtaXQoc2VsZWN0ZWRUaGVtYXRpY3NOYW1lKTtcclxuICB9XHJcblxyXG4gIG9uRHJhd0NvbnRyb2xDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmRyYXdDb250cm9sSXNBY3RpdmUgPSAhdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgb25mcmVlaGFuZENvbnRyb2xDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmZyZWVoYW5kRHJhd0lzQWN0aXZlID0gIXRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmU7XHJcbiAgICB0aGlzLmZyZWVoYW5kQ29udHJvbC5lbWl0KHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpO1xyXG4gICAgaWYgKHRoaXMuaXNQb2ludCgpKSB7XHJcbiAgICAgIHRoaXMucHJlZGVmaW5lZFJhZGl1cy5lbWl0KCF0aGlzLmZyZWVoYW5kRHJhd0lzQWN0aXZlKTtcclxuICAgICAgaWYgKHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpIHtcclxuICAgICAgICB0aGlzLm92ZXJsYXlTdHlsZSQubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICAgIHRoaXMuZHJhd1N0eWxlJC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucHJlZGVmaW5lZFJhZGl1cy5lbWl0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExhdW5jaCBzZWFyY2ggYnV0dG9uXHJcbiAgICovXHJcbiAgdG9nZ2xlU2VhcmNoQnV0dG9uKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUHJlZGVmaW5lZCgpKSB7XHJcbiAgICAgIGlmICh0aGlzLmJ1ZmZlciA+IDApIHtcclxuICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyLm1ldGEgPSB7XHJcbiAgICAgICAgICBpZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdGl0bGU6ICdab25lJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy56b25lV2l0aEJ1ZmZlci5wcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgbm9tOiAnWm9uZScsXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLnpvbmVXaXRoQnVmZmVyKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmRyYXdab25lLm1ldGEgPSB7XHJcbiAgICAgICAgICBpZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdGl0bGU6ICdab25lJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kcmF3Wm9uZS5wcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgbm9tOiAnWm9uZScsXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgc3RyaW5nXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNQb2ludCgpKSB7XHJcbiAgICAgIHRoaXMucmFkaXVzRXZlbnQuZW1pdCh0aGlzLnJhZGl1cyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQb2x5Z29uKCkpIHtcclxuICAgICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KHRoaXMuYnVmZmVyKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlU2VhcmNoLmVtaXQoKTtcclxuICAgIHRoaXMuc3RvcmUuZW50aXRpZXMkLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCAmJiB0aGlzLmxheWVycy5sZW5ndGggPT09IHRoaXMudGhlbWF0aWNMZW5ndGggKyAxKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuV29ya3NwYWNlLmVtaXQoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlVGVtcGxhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXVuY2ggY2xlYXIgYnV0dG9uIChjbGVhciBzdG9yZSBhbmQgbWFwIGxheWVycylcclxuICAgKi9cclxuICBjbGVhckJ1dHRvbigpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5zdG9yZSkge1xyXG4gICAgICB0aGlzLnN0b3JlLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1BvaW50KCkgfHwgdGhpcy5pc1BvbHlnb24oKSkge1xyXG4gICAgICB0aGlzLmRyYXdab25lID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xyXG4gICAgdGhpcy5idWZmZXIgPSAwO1xyXG4gICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KDApO1xyXG4gICAgdGhpcy5jbGVhckJ1dHRvbkV2ZW50LmVtaXQoKTtcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy50YWJsZVRlbXBsYXRlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJEcmF3Wm9uZSgpIHtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoMCk7XHJcbiAgICB0aGlzLmJ1ZmZlciA9IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXVuY2ggY2xlYXIgc2VhcmNoIChjbGVhciBmaWVsZCBpZiB0eXBlIGlzIHByZWRlZmluZWQpXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLmNsZWFyKCk7XHJcbiAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xyXG4gICAgdGhpcy5idWZmZXIgPSAwO1xyXG4gICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KDApO1xyXG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KFtdKTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2hFdmVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZnkgY29uZGl0aW9ucyBvZiBpbmNvbXBsZXRlIGZpZWxkcyBvciBidXN5IHNlcnZpY2VcclxuICAgKi9cclxuICBkaXNhYmxlU2VhcmNoQnV0dG9uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUHJlZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcykge1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5VHlwZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuem9uZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5xdWVyeVR5cGUgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgdGhpcy56b25lICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2x5Z29uIHx8XHJcbiAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnRcclxuICAgICkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcyAmJlxyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IG51bGxcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSBudWxsXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZENsZWFyU2VhcmNoKCkge1xyXG4gICAgbGV0IGRpc2FibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzc1xyXG4gICAgICA/IChkaXNhYmxlID0gdGhpcy5xdWVyeVR5cGUgPT09IHVuZGVmaW5lZClcclxuICAgICAgOiAoZGlzYWJsZSA9XHJcbiAgICAgICAgICB0aGlzLnF1ZXJ5VHlwZSA9PT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCk7XHJcblxyXG4gICAgcmV0dXJuIGRpc2FibGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYW5hZ2UgcmFkaXVzIHZhbHVlIGF0IHVzZXIgY2hhbmdlXHJcbiAgICovXHJcbiAgZ2V0UmFkaXVzKCkge1xyXG4gICAgbGV0IGZvcm1WYWx1ZTtcclxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVyc1xyXG4gICAgICAgID8gKGZvcm1WYWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUucmFkaXVzKVxyXG4gICAgICAgIDogKGZvcm1WYWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUucmFkaXVzIC8gMTAwMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3JtVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQpIHtcclxuICAgICAgaWYgKCF0aGlzLmZyZWVoYW5kRHJhd0lzQWN0aXZlKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSA8IDAgfHxcclxuICAgICAgICAgICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnMgJiZcclxuICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSA+PSAxMDAwMDApIHx8XHJcbiAgICAgICAgICAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuS2lsb21ldGVycyAmJlxyXG4gICAgICAgICAgICB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnZhbHVlID49IDEwMClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXHJcbiAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIucmFkaXVzQWxlcnQnLFxyXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5yYWRpdXMgPSAxMDAwO1xyXG4gICAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXHJcbiAgICAgICAgICAgID8gdGhpcy5yYWRpdXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnJhZGl1cylcclxuICAgICAgICAgICAgOiB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMucmFkaXVzIC8gMTAwMCk7XHJcbiAgICAgICAgICB0aGlzLmRyYXdHdWlkZSQubmV4dCh0aGlzLnJhZGl1cyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmb3JtVmFsdWUpIHtcclxuICAgICAgICAgIGlmIChmb3JtVmFsdWUgPj0gMTAwMDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yYWRpdXNBbGVydCcsXHJcbiAgICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci53YXJuaW5nJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmb3JtVmFsdWUgIT09IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtVmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnMpIHtcclxuICAgICAgICB0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSAqIDEwMDA7XHJcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMgKiAxMDAwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm92ZXJsYXlTdHlsZSQubmV4dCh0aGlzLlBvaW50U3R5bGUpO1xyXG4gICAgICB0aGlzLmRyYXdTdHlsZSQubmV4dCh0aGlzLlBvaW50U3R5bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVmlzaWJsZUxpc3QoKSB7XHJcbiAgICB0aGlzLmxpc3RJc1Zpc2libGUgPSAhdGhpcy5saXN0SXNWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVUYWJsZVRlbXBsYXRlKCkge1xyXG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHtcclxuICAgICAgbmFtZTogJ21ldGEudGl0bGUnLFxyXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci50eXBlJ1xyXG4gICAgICApLFxyXG4gICAgICByZW5kZXJlcjogRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5VbnNhbml0aXplZEhUTUxcclxuICAgIH07XHJcbiAgICBjb25zdCBuYW1lQ29sdW1uID0ge1xyXG4gICAgICBuYW1lOiAncHJvcGVydGllcy5ub20nLFxyXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zZWFyY2hSZXN1bHRzJ1xyXG4gICAgICApLFxyXG4gICAgICByZW5kZXJlcjogRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5VbnNhbml0aXplZEhUTUxcclxuICAgIH07XHJcbiAgICBjb25zdCBjb2x1bW5zID0gW3R5cGVDb2x1bW4sIG5hbWVDb2x1bW5dO1xyXG5cclxuICAgIHRoaXMudGFibGVUZW1wbGF0ZSA9IHtcclxuICAgICAgc2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICBzb3J0OiB0cnVlLFxyXG4gICAgICBjb2x1bW5zXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCI8aWdvLWdlb21ldHJ5LWZvcm0tZmllbGQtaW5wdXRcclxuICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxyXG4gIFttYXBdPVwibWFwXCJcclxuICBbZ2VvbWV0cnlUeXBlXT1cImdlb21ldHJ5VHlwZVwiXHJcbiAgW2RyYXdHdWlkZV09XCJkcmF3R3VpZGUkIHwgYXN5bmNcIlxyXG4gIFttZWFzdXJlXT1cIm1lYXN1cmVcIlxyXG4gIFtkcmF3Q29udHJvbElzQWN0aXZlXT1cImRyYXdDb250cm9sSXNBY3RpdmVcIlxyXG4gIFtmcmVlaGFuZERyYXdJc0FjdGl2ZV09XCJmcmVlaGFuZERyYXdJc0FjdGl2ZVwiXHJcbiAgW2RyYXdTdHlsZV09XCJkcmF3U3R5bGUkIHwgYXN5bmNcIlxyXG4gIFtvdmVybGF5U3R5bGVdPVwib3ZlcmxheVN0eWxlJCB8IGFzeW5jXCJcclxuICBbcmFkaXVzXT1cInJhZGl1c1wiXHJcbiAgW3ByZWRlZmluZWRSYWRpdXNdPVwicHJlZGVmaW5lZFJhZGl1c1wiXHJcbj5cclxuPC9pZ28tZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dD5cclxuXHJcbjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICA8bWF0LXNsaWRlLXRvZ2dsZVxyXG4gICAgKm5nSWY9XCIhaXNQcmVkZWZpbmVkKClcIlxyXG4gICAgW2NoZWNrZWRdPVwiZHJhd0NvbnRyb2xJc0FjdGl2ZVwiXHJcbiAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXHJcbiAgICAoY2hhbmdlKT1cIm9uRHJhd0NvbnRyb2xDaGFuZ2UoKVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5kcmF3Q29udHJvbCcgfCB0cmFuc2xhdGUgfX1cclxuICA8L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICpuZ0lmPVwiIWlzUHJlZGVmaW5lZCgpXCJcclxuICAgIFtjaGVja2VkXT1cImZyZWVoYW5kRHJhd0lzQWN0aXZlXCJcclxuICAgIFtsYWJlbFBvc2l0aW9uXT1cIidiZWZvcmUnXCJcclxuICAgIChjaGFuZ2UpPVwib25mcmVlaGFuZENvbnRyb2xDaGFuZ2UoKVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5mcmVlaGFuZENvbnRyb2wnIHwgdHJhbnNsYXRlIH19XHJcbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJidWZmZXItdW5pdFwiICpuZ0lmPVwiaXNQb2x5Z29uKClcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJidWZmZXJcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgbWF0SW5wdXRcclxuICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmJ1ZmZlcicgfCB0cmFuc2xhdGUgfX1cIlxyXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiYnVmZmVyRm9ybUNvbnRyb2xcIlxyXG4gICAgICBbdmFsdWVdPVwiMFwiXHJcbiAgICAgIFtyZWFkb25seV09XCJ0aGlzLmZvcm1Db250cm9sLnZhbHVlID09PSBudWxsXCJcclxuICAgIC8+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidW5pdC1maWVsZFwiPlxyXG4gICAgPG1hdC1zZWxlY3RcclxuICAgICAgW3ZhbHVlXT1cIm1lYXN1cmVVbml0XCJcclxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1lYXN1cmVVbml0Q2hhbmdlKCRldmVudC52YWx1ZSlcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBtZWFzdXJlVW5pdCBvZiBtZWFzdXJlVW5pdHNcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLicgKyBtZWFzdXJlVW5pdCB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwicmFkaXVzLXVuaXRcIiAqbmdJZj1cImlzUG9pbnQoKVwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInJhZGl1c1wiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICBtYXRJbnB1dFxyXG4gICAgICBwbGFjZWhvbGRlcj1cInt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIucmFkaXVzJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJyYWRpdXNGb3JtQ29udHJvbFwiXHJcbiAgICAgIFt2YWx1ZV09XCIxMDAwXCJcclxuICAgICAgKGlucHV0KT1cImdldFJhZGl1cygpXCJcclxuICAgICAgW3JlYWRvbmx5XT1cInRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUgJiYgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA9PT0gbnVsbFwiXHJcbiAgICAvPlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInVuaXQtZmllbGRcIj5cclxuICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXHJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NZWFzdXJlVW5pdENoYW5nZSgkZXZlbnQudmFsdWUpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAqbmdGb3I9XCJsZXQgbWVhc3VyZVVuaXQgb2YgbWVhc3VyZVVuaXRzXCJcclxuICAgICAgICBbdmFsdWVdPVwibWVhc3VyZVVuaXRcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgJ2lnby5nZW8ubWVhc3VyZS4nICsgbWVhc3VyZVVuaXQgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgPC9tYXQtc2VsZWN0PlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcbjwvZGl2PlxyXG5cclxuPG1hdC1sYWJlbCBjbGFzcz1cInRpdGxlIG1hdC10eXBvZ3JhcGh5XCJcclxuICA+e3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zZWFyY2gnIHwgdHJhbnNsYXRlIH19IDpcclxuPC9tYXQtbGFiZWw+XHJcbjxtYXQtcmFkaW8tZ3JvdXAgW3ZhbHVlXT1cInNlbGVjdGVkSXRlbVR5cGVcIj5cclxuICA8bWF0LXJhZGlvLWJ1dHRvblxyXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVR5cGVcIlxyXG4gICAgW3ZhbHVlXT1cIml0ZW1cIlxyXG4gICAgKGNoYW5nZSk9XCJvbkl0ZW1UeXBlQ2hhbmdlKCRldmVudClcIlxyXG4gID5cclxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuJyArIGl0ZW0gfCB0cmFuc2xhdGUgfX1cclxuICA8L21hdC1yYWRpby1idXR0b24+XHJcbjwvbWF0LXJhZGlvLWdyb3VwPlxyXG5cclxuPGRpdlxyXG4gIGNsYXNzPVwidGhlbWF0aWNzXCJcclxuICAqbmdJZj1cIlxyXG4gICAgKHNlbGVjdGVkSXRlbVR5cGUgPT09ICdUaGVtYXRpY3MnICYmICF0YWJsZVRlbXBsYXRlKSB8fFxyXG4gICAgKHNlbGVjdGVkSXRlbVR5cGUgPT09ICdUaGVtYXRpY3MnICYmIHRhYmxlVGVtcGxhdGUgJiYgIWxpc3RJc1Zpc2libGUpXHJcbiAgXCJcclxuPlxyXG4gIDxtYXQtdGFibGU+XHJcbiAgICA8IS0tIE5hbWUgQ29sdW1uIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XHJcbiAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ0aGVtYXRpY3MtaGVhZGVyXCI+e3tcclxuICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLlRoZW1hdGljcycgfCB0cmFuc2xhdGVcclxuICAgICAgfX08L21hdC1oZWFkZXItY2VsbD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gU2VsZWN0IENvbHVtbiAtLT5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcbiAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJjaGVja3MtaGVhZGVyXCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGVkVGhlbWF0aWNzLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L21hdC1oZWFkZXItY2VsbD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LWhlYWRlci1yb3c+XHJcbiAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cclxuICA8L21hdC10YWJsZT5cclxuXHJcbiAgPG1hdC10cmVlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cclxuICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBsZWFmIG5vZGVzIC0tPlxyXG4gICAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIiBtYXRUcmVlTm9kZVRvZ2dsZT5cclxuICAgICAgPGxpIGNsYXNzPVwibWF0LXRyZWUtbm9kZVwiPlxyXG4gICAgICAgIDwhLS0gdXNlIGEgZGlzYWJsZWQgYnV0dG9uIHRvIHByb3ZpZGUgcGFkZGluZyBmb3IgdHJlZSBsZWFmIC0tPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGRpc2FibGVkPjwvYnV0dG9uPlxyXG4gICAgICAgIHt7IG5vZGUubmFtZSB9fVxyXG4gICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgIGNsYXNzPVwidHJlZS1jaGVja1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gb25Ub2dnbGVDaGFuZ2Uobm9kZSkgOiBudWxsXCJcclxuICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkVGhlbWF0aWNzLmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC9saT5cclxuICAgIDwvbWF0LXRyZWUtbm9kZT5cclxuXHJcbiAgICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgZXhwYW5kYWJsZSBub2RlcyAtLT5cclxuICAgIDxtYXQtbmVzdGVkLXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1hdC10cmVlLW5vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25Ub2dnbGVDbGljayhub2RlKVwiPlxyXG4gICAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAgIFtzdmdJY29uXT1cIlxyXG4gICAgICAgICAgICAgIHRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnY2hldnJvbi1kb3duJyA6ICdjaGV2cm9uLXJpZ2h0J1xyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAge3sgbm9kZS5uYW1lIH19XHJcbiAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgY2xhc3M9XCJ0cmVlLWNoZWNrLTJcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBjaGlsZHJlbnNUb2dnbGUobm9kZSkgOiBudWxsXCJcclxuICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaGFzQ2hpbGRyZW5TZWxlY3RlZChub2RlKSAmJiAhaXNBbGxTZWxlY3RlZChub2RlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHVsXHJcbiAgICAgICAgY2xhc3M9XCJ0cmVlLXVsXCJcclxuICAgICAgICBbY2xhc3MuZXhhbXBsZS10cmVlLWludmlzaWJsZV09XCIhdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdFRyZWVOb2RlT3V0bGV0PjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3VsPlxyXG4gICAgPC9tYXQtbmVzdGVkLXRyZWUtbm9kZT5cclxuICA8L21hdC10cmVlPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJidXR0b25zXCI+XHJcbiAgPGJ1dHRvblxyXG4gICAgKm5nSWY9XCJpc1ByZWRlZmluZWQoKVwiXHJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnV0dG9uXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZENsZWFyU2VhcmNoKClcIlxyXG4gICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIlxyXG4gID5cclxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuY2xlYXJTZWFyY2gnIHwgdHJhbnNsYXRlIH19XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxidXR0b25cclxuICAgICpuZ0lmPVwiaXNQb2x5Z29uKCkgfHwgaXNQb2ludCgpXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICBjbGFzcz1cImNsZWFyLWZvcm0tYnV0dG9uXCJcclxuICAgIFtkaXNhYmxlZF09XCJ0aGlzLmZvcm1Db250cm9sLnZhbHVlID09PSBudWxsXCJcclxuICAgIChjbGljayk9XCJjbGVhckRyYXdab25lKClcIlxyXG4gID5cclxuICAgIHt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuY2xlYXJGb3JtJyB8IHRyYW5zbGF0ZSB9fVxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uXHJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgY2xhc3M9XCJzZWFyY2gtYnV0dG9uXCJcclxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlU2VhcmNoQnV0dG9uKClcIlxyXG4gICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVTZWFyY2hCdXR0b24oKVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5nb1NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgIGNsYXNzPVwicmVtb3ZlLWJ1dHRvblwiXHJcbiAgICBbZGlzYWJsZWRdPVwiYWxsTGF5ZXJzLmxlbmd0aCA9PT0gMFwiXHJcbiAgICAoY2xpY2spPVwiY2xlYXJCdXR0b24oKVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yZW1vdmVMYXllcicgfCB0cmFuc2xhdGUgfX1cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiXHJcbiAgICBbZGlzYWJsZWRdPVwiIXN0b3JlLmVudGl0aWVzJC5nZXRWYWx1ZSgpLmxlbmd0aFwiXHJcbiAgICAoY2xpY2spPVwiZXhwb3J0LmVtaXQoKVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5leHBvcnRMYXllcicgfCB0cmFuc2xhdGUgfX1cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48YnV0dG9uXHJcbiAgY2xhc3M9XCJjaGV2cm9uLWRvd25cIlxyXG4gICpuZ0lmPVwic3RvcmUuYWxsKCkubGVuZ3RoICYmIHRhYmxlVGVtcGxhdGUgJiYgIWxpc3RJc1Zpc2libGVcIlxyXG4gIG1hdC1pY29uLWJ1dHRvblxyXG4gIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc2hvd1NlYXJjaFJlc3VsdHMnIHwgdHJhbnNsYXRlXCJcclxuICAoY2xpY2spPVwidG9nZ2xlVmlzaWJsZUxpc3QoKVwiXHJcbj5cclxuICA8bWF0LWljb24gc3ZnSWNvbj1cImNoZXZyb24tZG93blwiPjwvbWF0LWljb24+XHJcbjwvYnV0dG9uPlxyXG5cclxuPGRpdlxyXG4gIGNsYXNzPVwicmVzdWx0c1wiXHJcbiAgKm5nSWY9XCJzdG9yZS5hbGwoKS5sZW5ndGggJiYgdGFibGVUZW1wbGF0ZSAmJiBsaXN0SXNWaXNpYmxlXCJcclxuPlxyXG4gIDxidXR0b25cclxuICAgICpuZ0lmPVwibGlzdElzVmlzaWJsZVwiXHJcbiAgICBtYXQtaWNvbi1idXR0b25cclxuICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5oaWRlU2VhcmNoUmVzdWx0cycgfCB0cmFuc2xhdGVcIlxyXG4gICAgKGNsaWNrKT1cInRvZ2dsZVZpc2libGVMaXN0KClcIlxyXG4gID5cclxuICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY2hldnJvbi11cFwiPjwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgPGlnby1lbnRpdHktdGFibGVcclxuICAgIGNsYXNzPVwicmVzdWx0cy1saXN0XCJcclxuICAgIFt0ZW1wbGF0ZV09XCJ0YWJsZVRlbXBsYXRlXCJcclxuICAgIFtzdG9yZV09XCJzdG9yZVwiXHJcbiAgICAoZW50aXR5U2VsZWN0Q2hhbmdlKT1cImVudGl0eUNoYW5nZS5lbWl0KCRldmVudClcIlxyXG4gID5cclxuICA8L2lnby1lbnRpdHktdGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=
875
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1maWx0ZXItaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9maWx0ZXIvc3BhdGlhbC1maWx0ZXIvc3BhdGlhbC1maWx0ZXItaXRlbS9zcGF0aWFsLWZpbHRlci1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9zcGF0aWFsLWZpbHRlci9zcGF0aWFsLWZpbHRlci1pdGVtL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FB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QkFDTCxlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3dCQUNwQixTQUFTO3dCQUNULGlCQUFpQjtxQkFDbEI7b0xBR1EsR0FBRztzQkFBWCxLQUFLO2dCQUdGLElBQUk7c0JBRFAsS0FBSztnQkFtR0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUdGLEtBQUs7c0JBRFIsS0FBSztnQkFvQkcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0YsY0FBYztzQkFEakIsS0FBSztnQkFTSSxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IE5lc3RlZFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUNvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRUcmVlTW9kdWxlLCBNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xuXG5pbXBvcnQge1xuICBFbnRpdHlTdG9yZSxcbiAgRW50aXR5U3RvcmVGaWx0ZXJTZWxlY3Rpb25TdHJhdGVneSxcbiAgRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcixcbiAgRW50aXR5VGFibGVDb21wb25lbnQsXG4gIEVudGl0eVRhYmxlVGVtcGxhdGVcbn0gZnJvbSAnQGlnbzIvY29tbW9uL2VudGl0eSc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IElnb0xhbmd1YWdlTW9kdWxlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvbWVzc2FnZSc7XG5cbmltcG9ydCBPbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IE9sUG9pbnQgZnJvbSAnb2wvZ2VvbS9Qb2ludCc7XG5pbXBvcnQgKiBhcyBvbHByb2ogZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgKiBhcyBvbFN0eWxlIGZyb20gJ29sL3N0eWxlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRmVhdHVyZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhc291cmNlL3NoYXJlZCc7XG5pbXBvcnQgeyBHZW9tZXRyeVR5cGUgfSBmcm9tICcuLi8uLi8uLi9kcmF3JztcbmltcG9ydCB7IEZlYXR1cmVNb3Rpb24sIEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vLi4vZmVhdHVyZSc7XG5pbXBvcnQgeyBHZW9tZXRyeUZvcm1GaWVsZElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZ2VvbWV0cnkvZ2VvbWV0cnktZm9ybS1maWVsZC9nZW9tZXRyeS1mb3JtLWZpZWxkLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9KU09OR2VvbWV0cnkgfSBmcm9tICcuLi8uLi8uLi9nZW9tZXRyeS9zaGFyZWQvZ2VvbWV0cnkuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMYXllciwgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi8uLi9sYXllci9zaGFyZWQnO1xuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHsgTWVhc3VyZUxlbmd0aFVuaXQgfSBmcm9tICcuLi8uLi8uLi9tZWFzdXJlJztcbmltcG9ydCB7XG4gIFNwYXRpYWxGaWx0ZXJRdWVyeVR5cGUsXG4gIFNwYXRpYWxGaWx0ZXJUeXBlXG59IGZyb20gJy4uLy4uL3NoYXJlZC9zcGF0aWFsLWZpbHRlci5lbnVtJztcbmltcG9ydCB7IFNwYXRpYWxGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NwYXRpYWwtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4vLi4vLi4vLi4vZmVhdHVyZS9zaGFyZWQvZmVhdHVyZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZSB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL3NwYXRpYWwtZmlsdGVyLmVudW0nO1xuaW1wb3J0IHsgU3BhdGlhbEZpbHRlclRoZW1hdGljIH0gZnJvbSAnLi8uLi8uLi9zaGFyZWQvc3BhdGlhbC1maWx0ZXIuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBTcGF0aWFsLUZpbHRlci1JdGVtIChzZWFyY2ggcGFyYW1ldGVycylcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLXNwYXRpYWwtZmlsdGVyLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1maWx0ZXItaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtZmlsdGVyLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBHZW9tZXRyeUZvcm1GaWVsZElucHV0Q29tcG9uZW50LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdJZixcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE5nRm9yLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRUcmVlTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgRW50aXR5VGFibGVDb21wb25lbnQsXG4gICAgQXN5bmNQaXBlLFxuICAgIElnb0xhbmd1YWdlTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbEZpbHRlckl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIEBJbnB1dCgpIG1hcDogSWdvTWFwO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB0eXBlKCk6IFNwYXRpYWxGaWx0ZXJUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuICBzZXQgdHlwZSh0eXBlOiBTcGF0aWFsRmlsdGVyVHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZW9tZXRyeVR5cGVzLmZpbmRJbmRleChcbiAgICAgIChnZW9tKSA9PiBnZW9tID09PSAodGhpcy50eXBlIGFzIGFueSlcbiAgICApO1xuICAgIHRoaXMuZ2VvbWV0cnlUeXBlID0gdGhpcy5nZW9tZXRyeVR5cGVzW2luZGV4XTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5yYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kcmF3R3VpZGUkLm5leHQobnVsbCk7XG4gICAgdGhpcy5kcmF3U3R5bGUkLm5leHQodW5kZWZpbmVkKTtcblxuICAgIC8vIE5lY2Vzc2FyeSB0byBrZWVwIHJlZmVyZW5jZSB0byB0aGUgZ2VvbWV0cnkgZm9ybSBmaWVsZCBpbnB1dFxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGdlb2pzb246IEdlb0pTT05HZW9tZXRyeSA9IHtcbiAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgY29vcmRpbmF0ZXM6ICcnXG4gICAgICB9O1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShnZW9qc29uKTtcbiAgICB9XG5cbiAgICAvLyBOZWNlc3NhcnkgdG8gYXBwbHkgdGhlIHJpZ2h0IHN0eWxlIHdoZW4gZ2VvbWV0cnkgdHlwZSBpcyBQb2ludFxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XG4gICAgICB0aGlzLnJhZGl1cyA9IDEwMDA7IC8vIEJhc2UgcmFkaXVzXG4gICAgICB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMucmFkaXVzKTtcbiAgICAgIHRoaXMuUG9pbnRTdHlsZSA9IChcbiAgICAgICAgZmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxuICAgICAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBnZW9tID0gZmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIE9sUG9pbnQ7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gb2xwcm9qLnRyYW5zZm9ybShcbiAgICAgICAgICBnZW9tLmdldENvb3JkaW5hdGVzKCksXG4gICAgICAgICAgdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgICAgICAnRVBTRzo0MzI2J1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgICAgIGltYWdlOiBuZXcgb2xTdHlsZS5DaXJjbGUoe1xuICAgICAgICAgICAgcmFkaXVzOlxuICAgICAgICAgICAgICB0aGlzLnJhZGl1cyAvXG4gICAgICAgICAgICAgIE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIGNvb3JkaW5hdGVzWzFdKSAvXG4gICAgICAgICAgICAgIHJlc29sdXRpb24sIC8vIExhdGl0dWRlIGNvcnJlY3Rpb25cbiAgICAgICAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgICAgICAgd2lkdGg6IDIsXG4gICAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSknXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbGw6IG5ldyBvbFN0eWxlLkZpbGwoe1xuICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMCwgMTUzLCAyNTUsIDAuMiknXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMub3ZlcmxheVN0eWxlID0gdGhpcy5Qb2ludFN0eWxlO1xuICAgICAgdGhpcy5kcmF3U3R5bGUkLm5leHQodGhpcy5vdmVybGF5U3R5bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBnZW9tZXRyeSB0eXBlcyBpcyBQb2x5Z29uXG4gICAgICB0aGlzLnJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuUG9seVN0eWxlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IG9sU3R5bGUuU3R5bGUoe1xuICAgICAgICAgIHN0cm9rZTogbmV3IG9sU3R5bGUuU3Ryb2tlKHtcbiAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1KSdcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWxsOiBuZXcgb2xTdHlsZS5GaWxsKHtcbiAgICAgICAgICAgIGNvbG9yOiAncmdiYSgwLCAxNTMsIDI1NSwgMC4yKSdcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBjb25zdCBjb2xvciA9IFswLCAxNTMsIDI1NV07XG4gICAgICBjb25zdCBkcmF3U3R5bGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgb2xTdHlsZS5TdHlsZSh7XG4gICAgICAgICAgaW1hZ2U6IG5ldyBvbFN0eWxlLkNpcmNsZSh7XG4gICAgICAgICAgICByYWRpdXM6IDgsXG4gICAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMCwgMTUzLCAyNTUpJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaWxsOiBuZXcgb2xTdHlsZS5GaWxsKHtcbiAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDE1MywgMjU1LCAwLjIpJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdHJva2U6IG5ldyBvbFN0eWxlLlN0cm9rZSh7XG4gICAgICAgICAgICBjb2xvcjogY29sb3IuY29uY2F0KFsxXSksXG4gICAgICAgICAgICB3aWR0aDogMlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGZpbGw6IG5ldyBvbFN0eWxlLkZpbGwoe1xuICAgICAgICAgICAgY29sb3I6IGNvbG9yLmNvbmNhdChbMC4yXSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLm92ZXJsYXlTdHlsZSA9IHRoaXMuUG9seVN0eWxlO1xuICAgICAgdGhpcy5kcmF3U3R5bGUkLm5leHQoZHJhd1N0eWxlKTtcbiAgICB9XG4gICAgdGhpcy5vdmVybGF5U3R5bGUkLm5leHQodGhpcy5vdmVybGF5U3R5bGUpO1xuICB9XG4gIHByaXZhdGUgX3R5cGU6IFNwYXRpYWxGaWx0ZXJUeXBlO1xuXG4gIEBJbnB1dCgpIHF1ZXJ5VHlwZTogU3BhdGlhbEZpbHRlclF1ZXJ5VHlwZTtcblxuICBASW5wdXQoKSB6b25lOiBGZWF0dXJlO1xuXG4gIEBJbnB1dCgpIGxvYWRpbmc7XG5cbiAgQElucHV0KClcbiAgZ2V0IHN0b3JlKCk6IEVudGl0eVN0b3JlPEZlYXR1cmU+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmU7XG4gIH1cbiAgc2V0IHN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZTxGZWF0dXJlPikge1xuICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgdGhpcy5fc3RvcmUuZW50aXRpZXMkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIF9zdG9yZTogRW50aXR5U3RvcmU8RmVhdHVyZT47XG5cbiAgLyoqXG4gICAqIEF2YWlsYWJsZSBtZWFzdXJlIHVuaXRzIGZvciB0aGUgbWVhc3VyZSB0eXBlIGdpdmVuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IG1lYXN1cmVVbml0cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnMsIE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnNdO1xuICB9XG5cbiAgQElucHV0KCkgbGF5ZXJzOiBMYXllcltdID0gW107XG5cbiAgQElucHV0KCkgYWxsTGF5ZXJzOiBMYXllcltdID0gW107XG5cbiAgQElucHV0KClcbiAgZ2V0IHRoZW1hdGljTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RoZW1hdGljTGVuZ3RoO1xuICB9XG4gIHNldCB0aGVtYXRpY0xlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhlbWF0aWNMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF90aGVtYXRpY0xlbmd0aDogbnVtYmVyO1xuXG4gIEBPdXRwdXQoKSB0b2dnbGVTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGl0ZW1UeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTcGF0aWFsRmlsdGVySXRlbVR5cGU+KCk7XG5cbiAgQE91dHB1dCgpIHRoZW1hdGljQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXT4oKTtcblxuICBAT3V0cHV0KCkgZHJhd1pvbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RmVhdHVyZT4oKTtcblxuICBAT3V0cHV0KCkgYnVmZmVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHpvbmVXaXRoQnVmZmVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGZWF0dXJlPigpO1xuICBAT3V0cHV0KCkgbWVhc3VyZVVuaXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1lYXN1cmVMZW5ndGhVbml0PigpO1xuXG4gIEBPdXRwdXQoKSByYWRpdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgZnJlZWhhbmRDb250cm9sID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgcHJlZGVmaW5lZFJhZGl1cyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAT3V0cHV0KCkgY2xlYXJCdXR0b25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgY2xlYXJTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgZXhwb3J0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBvcGVuV29ya3NwYWNlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZW50aXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHVibGljIGl0ZW1UeXBlOiBTcGF0aWFsRmlsdGVySXRlbVR5cGVbXSA9IFtcbiAgICBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcyxcbiAgICBTcGF0aWFsRmlsdGVySXRlbVR5cGUuVGhlbWF0aWNzXG4gIF07XG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1UeXBlOiBTcGF0aWFsRmlsdGVySXRlbVR5cGUgPVxuICAgIFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5BZGRyZXNzO1xuICBwdWJsaWMgc2VsZWN0ZWRTb3VyY2VBZGRyZXNzO1xuXG4gIHRyZWVDb250cm9sOiBOZXN0ZWRUcmVlQ29udHJvbDxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+ID1cbiAgICBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8U3BhdGlhbEZpbHRlclRoZW1hdGljPigobm9kZSkgPT4gbm9kZS5jaGlsZHJlbik7XG5cbiAgLy8gRm9yIHRoZW1hdGljcyBhbmQgcmVzdWx0cyB0YWJsZXNcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gWyduYW1lJywgJ3NlbGVjdCddO1xuICBwdWJsaWMgY2hpbGRyZW5zOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXSA9IFtdO1xuICBwdWJsaWMgZ3JvdXBzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgdGhlbWF0aWNzOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXSA9IFtdO1xuICBwdWJsaWMgZGF0YVNvdXJjZSA9IG5ldyBNYXRUcmVlTmVzdGVkRGF0YVNvdXJjZTxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+KCk7XG4gIHB1YmxpYyBzZWxlY3RlZFRoZW1hdGljcyA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxTcGF0aWFsRmlsdGVyVGhlbWF0aWM+KFxuICAgIHRydWUsXG4gICAgW11cbiAgKTtcblxuICAvLyBGb3IgZ2VvbWV0cnkgZm9ybSBmaWVsZCBpbnB1dFxuICB2YWx1ZSQ6IEJlaGF2aW9yU3ViamVjdDxHZW9KU09OR2VvbWV0cnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuICBkcmF3R3VpZGUkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIG92ZXJsYXlTdHlsZSQ6IEJlaGF2aW9yU3ViamVjdDxcbiAgICBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKVxuICA+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuICBkcmF3U3R5bGUkOiBCZWhhdmlvclN1YmplY3Q8XG4gICAgb2xTdHlsZS5TdHlsZSB8ICgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4gb2xTdHlsZS5TdHlsZSlcbiAgPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcblxuICBwcml2YXRlIHZhbHVlJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByYWRpdXNDaGFuZ2VzJCQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBidWZmZXJDaGFuZ2VzJCQ6IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgZm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIHB1YmxpYyBnZW9tZXRyeVR5cGU6IEdlb21ldHJ5VHlwZTtcbiAgcHVibGljIGdlb21ldHJ5VHlwZUZpZWxkID0gZmFsc2U7XG4gIHB1YmxpYyBnZW9tZXRyeVR5cGVzOiBHZW9tZXRyeVR5cGVbXSA9IFtcbiAgICBHZW9tZXRyeVR5cGUuUG9pbnQsXG4gICAgR2VvbWV0cnlUeXBlLlBvbHlnb25cbiAgXTtcbiAgcHVibGljIGRyYXdHdWlkZUZpZWxkID0gZmFsc2U7XG4gIHB1YmxpYyBkcmF3R3VpZGU6IG51bWJlciA9IG51bGw7XG4gIHB1YmxpYyBkcmF3R3VpZGVQbGFjZWhvbGRlciA9ICcnO1xuICBwdWJsaWMgbWVhc3VyZSA9IGZhbHNlO1xuICBwdWJsaWMgZHJhd0NvbnRyb2xJc0FjdGl2ZSA9IHRydWU7XG4gIHB1YmxpYyBmcmVlaGFuZERyYXdJc0FjdGl2ZSA9IGZhbHNlO1xuICBwdWJsaWMgZHJhd1N0eWxlOiBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKTtcbiAgcHVibGljIGRyYXdab25lO1xuICBwdWJsaWMgb3ZlcmxheVN0eWxlOiBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKTtcbiAgcHVibGljIFBvaW50U3R5bGU6IG9sU3R5bGUuU3R5bGUgfCAoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IG9sU3R5bGUuU3R5bGUpO1xuICBwdWJsaWMgUG9seVN0eWxlOiBvbFN0eWxlLlN0eWxlIHwgKChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiBvbFN0eWxlLlN0eWxlKTtcblxuICBwdWJsaWMgcmFkaXVzOiBudW1iZXI7XG4gIHB1YmxpYyBidWZmZXI6IG51bWJlciA9IDA7XG4gIHB1YmxpYyByYWRpdXNGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcbiAgcHVibGljIGJ1ZmZlckZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuXG4gIHB1YmxpYyBtZWFzdXJlVW5pdDogTWVhc3VyZUxlbmd0aFVuaXQgPSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnM7XG4gIHB1YmxpYyB6b25lV2l0aEJ1ZmZlcjtcblxuICBwdWJsaWMgbGlzdElzVmlzaWJsZSA9IHRydWU7XG4gIHB1YmxpYyB0YWJsZVRlbXBsYXRlOiBFbnRpdHlUYWJsZVRlbXBsYXRlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc3BhdGlhbEZpbHRlclNlcnZpY2U6IFNwYXRpYWxGaWx0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgIC5sb2FkVGhlbWF0aWNzTGlzdCgpXG4gICAgICAuc3Vic2NyaWJlKChpdGVtczogU3BhdGlhbEZpbHRlclRoZW1hdGljW10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbnMucHVzaChpdGVtKTtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyb3Vwcy5wdXNoKFxuICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkubGltaXRlcycpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbWl0czogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xuICAgICAgICAgIG5hbWU6IHRoaXMuZ3JvdXBzWzBdLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRoZW1hdGljcy5wdXNoKGxpbWl0cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLmdyb3VwICYmIHRoaXMuZ3JvdXBzLmluZGV4T2YoY2hpbGQuZ3JvdXApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMucHVzaChjaGlsZC5ncm91cCk7XG4gICAgICAgICAgICBjb25zdCB0aGVtYXRpYzogU3BhdGlhbEZpbHRlclRoZW1hdGljID0ge1xuICAgICAgICAgICAgICBuYW1lOiBjaGlsZC5ncm91cCxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFjaGlsZC5ncm91cCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgJ2lnby5nZW8udGVycmFwaS5BZG1SZWdpb24nXG4gICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnRlcnJhcGkuTXVuJykgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuQXJyb25kJ1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuQ2lyY0ZlZCdcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLkNpcmNQcm92J1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdpZ28uZ2VvLnRlcnJhcGkuRGlyUmVnJ1xuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgY2hpbGQubmFtZSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby50ZXJyYXBpLk1SQycpIHx8XG4gICAgICAgICAgICAgIGNoaWxkLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnaWdvLmdlby50ZXJyYXBpLlJlZ1RvdXInXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNoaWxkLmdyb3VwID0gbGltaXRzLm5hbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC5uYW1lID09PVxuICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby50ZXJyYXBpLnJvdXRlcycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2hpbGQuZ3JvdXAgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmdyb3VwLnRyYW5zcG9ydCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRoZW1hdGljOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogY2hpbGQubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgc291cmNlOiBjaGlsZC5zb3VyY2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGhpcy50aGVtYXRpY3MucHVzaCh0aGVtYXRpYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGhlbWF0aWNzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW5zKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuZ3JvdXAgPT09IHRoZW1hdGljLm5hbWUpIHtcbiAgICAgICAgICAgICAgdGhlbWF0aWMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnRoZW1hdGljcztcblxuICAgIHRoaXMuZHJhd0d1aWRlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMudmFsdWUkLm5leHQoXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgdGhpcy52YWx1ZSQkID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgKHZhbHVlOiBHZW9KU09OR2VvbWV0cnkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSQubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5kcmF3Wm9uZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgYXMgRmVhdHVyZTtcbiAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd1pvbmVFdmVudC5lbWl0KHRoaXMuZHJhd1pvbmUpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICB0aGlzLmRyYXdab25lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMudmFsdWUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldFJhZGl1cygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJhZGl1c0NoYW5nZXMkJCA9IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldFJhZGl1cygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1ZmZlckNoYW5nZXMkJCA9IHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnMgJiZcbiAgICAgICAgICB2YWx1ZSA+IDAgJiZcbiAgICAgICAgICB2YWx1ZSA8PSAxMDAwMDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQodmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkQnVmZmVyR2VvbWV0cnkodGhpcy5kcmF3Wm9uZSwgU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbiwgdmFsdWUpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChmZWF0dXJlR2VvbTogRmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyID0gZmVhdHVyZUdlb207XG4gICAgICAgICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXJDaGFuZ2UuZW1pdCh0aGlzLnpvbmVXaXRoQnVmZmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiZcbiAgICAgICAgICB2YWx1ZSA+IDAgJiZcbiAgICAgICAgICB2YWx1ZSA8PSAxMDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5idWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQodmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3BhdGlhbEZpbHRlclNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkQnVmZmVyR2VvbWV0cnkoXG4gICAgICAgICAgICAgIHRoaXMuZHJhd1pvbmUsXG4gICAgICAgICAgICAgIFNwYXRpYWxGaWx0ZXJUeXBlLlBvbHlnb24sXG4gICAgICAgICAgICAgIHZhbHVlICogMTAwMFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZmVhdHVyZUdlb206IEZlYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy56b25lV2l0aEJ1ZmZlciA9IGZlYXR1cmVHZW9tO1xuICAgICAgICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyQ2hhbmdlLmVtaXQodGhpcy56b25lV2l0aEJ1ZmZlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuYnVmZmVyID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KHZhbHVlKTtcbiAgICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB2YWx1ZSA8IDAgfHxcbiAgICAgICAgICAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzICYmIHZhbHVlID4gMTAwMDAwKSB8fFxuICAgICAgICAgICh0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5LaWxvbWV0ZXJzICYmIHZhbHVlID4gMTAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xuICAgICAgICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5idWZmZXJBbGVydCcsXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZFN0cmF0ZWd5ID0gbmV3IEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3koe30pO1xuICAgIGNvbnN0IHNlbGVjdGlvblN0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcbiAgICAgIGxheWVyOiBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgICAgICB6SW5kZXg6IDMwMCxcbiAgICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICAgICAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2hvd0luTGF5ZXJMaXN0OiBmYWxzZSxcbiAgICAgICAgZXhwb3J0YWJsZTogZmFsc2UsXG4gICAgICAgIGJyb3dzYWJsZTogZmFsc2VcbiAgICAgIH0pLFxuICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgIGhpdFRvbGVyYW5jZTogMTUsXG4gICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uRGVmYXVsdCxcbiAgICAgIG1hbnk6IHRydWUsXG4gICAgICBkcmFnQm94OiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JlLmFkZFN0cmF0ZWd5KHNlbGVjdGlvblN0cmF0ZWd5LCB0cnVlKTtcbiAgICB0aGlzLnN0b3JlLmFkZFN0cmF0ZWd5KHNlbGVjdGVkUmVjb3JkU3RyYXRlZ3ksIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSB0byB0aGUgdmFsdWUgc3RyZWFtXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52YWx1ZSQkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yYWRpdXNDaGFuZ2VzJCQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmJ1ZmZlckNoYW5nZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2RSZWYuZGV0YWNoKCk7XG4gICAgaWYgKHRoaXMucmFkaXVzQ2hhbmdlcyQkKSB7XG4gICAgICB0aGlzLnJhZGl1c0NoYW5nZXMkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy52YWx1ZSQkKSB7XG4gICAgICB0aGlzLnZhbHVlJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBvbkl0ZW1UeXBlQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID0gZXZlbnQudmFsdWU7XG4gICAgdGhpcy5pdGVtVHlwZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtZWFzdXJlIHVuaXRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbk1lYXN1cmVVbml0Q2hhbmdlKHVuaXQ6IE1lYXN1cmVMZW5ndGhVbml0KSB7XG4gICAgaWYgKHVuaXQgPT09IHRoaXMubWVhc3VyZVVuaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9IHVuaXQ7XG4gICAgICB0aGlzLm1lYXN1cmVVbml0Q2hhbmdlLmVtaXQodGhpcy5tZWFzdXJlVW5pdCk7XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oKSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVVbml0ID09PSBNZWFzdXJlTGVuZ3RoVW5pdC5NZXRlcnNcbiAgICAgICAgICA/IHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5idWZmZXJGb3JtQ29udHJvbC52YWx1ZSAqIDEwMDApXG4gICAgICAgICAgOiB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnZhbHVlIC8gMTAwMFxuICAgICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BvaW50KCkpIHtcbiAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXG4gICAgICAgICAgPyB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgKiAxMDAwKVxuICAgICAgICAgIDogdGhpcy5yYWRpdXNGb3JtQ29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSAvIDEwMDBcbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNQcmVkZWZpbmVkKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlByZWRlZmluZWQ7XG4gIH1cblxuICBpc1BvbHlnb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbjtcbiAgfVxuXG4gIGlzUG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9pbnQ7XG4gIH1cblxuICBoYXNDaGlsZChfOiBudW1iZXIsIG5vZGU6IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uVG9nZ2xlQ2xpY2sobm9kZTogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICA/IHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2Uobm9kZSlcbiAgICAgIDogdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSk7XG4gIH1cblxuICBpc0FsbFNlbGVjdGVkKG5vZGU/OiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcbiAgICBsZXQgbnVtU2VsZWN0ZWQ7XG4gICAgbGV0IG51bU5vZGVzID0gMDtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGg7XG4gICAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xuICAgICAgICBpZiAodGhpcy5ncm91cHMuaW5kZXhPZih0aGVtYXRpYy5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICBudW1Ob2RlcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy50aGVtYXRpY3MuZmluZChcbiAgICAgICAgICAgICh0aGVtYXRpYykgPT4gdGhlbWF0aWMuc291cmNlID09PSBjaGlsZHJlbi5zb3VyY2VcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIG51bU5vZGVzKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TZWxlY3RlZCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZHJlbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICAgKHRoZW1hdGljKSA9PiB0aGVtYXRpYyA9PT0gY2hpbGRyZW5cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIG51bU5vZGVzKys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChudW1Ob2RlcyA+PSAxKSB7XG4gICAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bU5vZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaGFzQ2hpbGRyZW5TZWxlY3RlZChub2RlOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWMpIHtcbiAgICBsZXQgYm9vbCA9IGZhbHNlO1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICh0aGVtYXRpYykgPT4gdGhlbWF0aWMuc291cmNlID09PSBjaGlsZC5zb3VyY2VcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGJvb2wgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBib29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGhlYWRlciBjaGVja2JveFxuICAgKi9cbiAgbWFzdGVyVG9nZ2xlKCkge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpID8gdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5jbGVhcigpIDogdGhpcy5zZWxlY3RBbGwoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkVGhlbWF0aWNzTmFtZS5wdXNoKHRoZW1hdGljKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NoaWxkKDAsIHRoZW1hdGljKSkge1xuICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoZW1hdGljKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhlbWF0aWNzLmZvckVhY2goKHRoZW1hdGljKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NoaWxkKDAsIHRoZW1hdGljKSkge1xuICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2UodGhlbWF0aWMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KHNlbGVjdGVkVGhlbWF0aWNzTmFtZSk7XG4gIH1cblxuICBzZWxlY3RBbGwobm9kZT86IFNwYXRpYWxGaWx0ZXJUaGVtYXRpYykge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhpcy50aGVtYXRpY3MuZm9yRWFjaCgodGhlbWF0aWMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmluZGV4T2YodGhlbWF0aWMubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QodGhlbWF0aWMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAgICAgKHRoZW1hdGljKSA9PiB0aGVtYXRpYy5zb3VyY2UgPT09IGNoaWxkcmVuLnNvdXJjZVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3QoY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaGFzQ2hpbGQoMCwgbm9kZSkpIHtcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZHJlbikgPT5cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdChjaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGlsZHJlbnNUb2dnbGUobm9kZTogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKG5vZGUpXG4gICAgICA/IG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuZGVzZWxlY3QoY2hpbGQpKVxuICAgICAgOiB0aGlzLnNlbGVjdEFsbChub2RlKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWF0aWNzTmFtZTogU3BhdGlhbEZpbHRlclRoZW1hdGljW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRoZW1hdGljIG9mIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkVGhlbWF0aWNzTmFtZS5wdXNoKHRoZW1hdGljKTtcbiAgICB9XG4gICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSk7XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KHNlbGVjdGVkVGhlbWF0aWNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgY2hhbmdlcyB0byB0aGUgdGhlbWF0aWNzIHNlbGVjdGVkIHRyZWUgYW5kIGVtaXQgZXZlbnRcbiAgICovXG4gIG9uVG9nZ2xlQ2hhbmdlKG5vZGVTZWxlY3RlZDogU3BhdGlhbEZpbHRlclRoZW1hdGljKSB7XG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5maW5kKFxuICAgICAgICAodGhlbWF0aWMpID0+IHRoZW1hdGljLnNvdXJjZSA9PT0gbm9kZVNlbGVjdGVkLnNvdXJjZVxuICAgICAgKSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGRyZW4pID0+IHtcbiAgICAgIGlmIChjaGlsZHJlbiA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLnNlbGVjdChjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGRyZW4gPT09IG5vZGVTZWxlY3RlZCAmJiBzZWxlY3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWF0aWNzLmRlc2VsZWN0KGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRoZW1hdGljcy5mb3JFYWNoKCh0aGVtYXRpYykgPT4ge1xuICAgICAgaWYgKHRoZW1hdGljID09PSBub2RlU2VsZWN0ZWQgJiYgc2VsZWN0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0KHRoZW1hdGljKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGVtYXRpYyA9PT0gbm9kZVNlbGVjdGVkICYmIHNlbGVjdGVkID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuZGVzZWxlY3QodGhlbWF0aWMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtYXRpY3NOYW1lOiBTcGF0aWFsRmlsdGVyVGhlbWF0aWNbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGhlbWF0aWMgb2YgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWRUaGVtYXRpY3NOYW1lLnB1c2godGhlbWF0aWMpO1xuICAgIH1cbiAgICB0aGlzLnRoZW1hdGljQ2hhbmdlLmVtaXQoc2VsZWN0ZWRUaGVtYXRpY3NOYW1lKTtcbiAgfVxuXG4gIG9uRHJhd0NvbnRyb2xDaGFuZ2UoKSB7XG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gIXRoaXMuZHJhd0NvbnRyb2xJc0FjdGl2ZTtcbiAgfVxuXG4gIG9uZnJlZWhhbmRDb250cm9sQ2hhbmdlKCkge1xuICAgIHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUgPSAhdGhpcy5mcmVlaGFuZERyYXdJc0FjdGl2ZTtcbiAgICB0aGlzLmZyZWVoYW5kQ29udHJvbC5lbWl0KHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpO1xuICAgIGlmICh0aGlzLmlzUG9pbnQoKSkge1xuICAgICAgdGhpcy5wcmVkZWZpbmVkUmFkaXVzLmVtaXQoIXRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpO1xuICAgICAgaWYgKHRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5U3R5bGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kcmF3U3R5bGUkLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVkZWZpbmVkUmFkaXVzLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2ggc2VhcmNoIGJ1dHRvblxuICAgKi9cbiAgdG9nZ2xlU2VhcmNoQnV0dG9uKCkge1xuICAgIGlmICghdGhpcy5pc1ByZWRlZmluZWQoKSkge1xuICAgICAgaWYgKHRoaXMuYnVmZmVyID4gMCkge1xuICAgICAgICB0aGlzLnpvbmVXaXRoQnVmZmVyLm1ldGEgPSB7XG4gICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0aXRsZTogJ1pvbmUnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuem9uZVdpdGhCdWZmZXIucHJvcGVydGllcyA9IHtcbiAgICAgICAgICBub206ICdab25lJyxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgc3RyaW5nXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZHJhd1pvbmVFdmVudC5lbWl0KHRoaXMuem9uZVdpdGhCdWZmZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kcmF3Wm9uZS5tZXRhID0ge1xuICAgICAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICAgICAgdGl0bGU6ICdab25lJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYXdab25lLnByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgbm9tOiAnWm9uZScsXG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlIGFzIHN0cmluZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYXdab25lRXZlbnQuZW1pdCh0aGlzLmRyYXdab25lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQb2ludCgpKSB7XG4gICAgICB0aGlzLnJhZGl1c0V2ZW50LmVtaXQodGhpcy5yYWRpdXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BvbHlnb24oKSkge1xuICAgICAgdGhpcy5idWZmZXJFdmVudC5lbWl0KHRoaXMuYnVmZmVyKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVTZWFyY2guZW1pdCgpO1xuICAgIHRoaXMuc3RvcmUuZW50aXRpZXMkLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggJiYgdGhpcy5sYXllcnMubGVuZ3RoID09PSB0aGlzLnRoZW1hdGljTGVuZ3RoICsgMSkge1xuICAgICAgICB0aGlzLm9wZW5Xb3Jrc3BhY2UuZW1pdCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlVGVtcGxhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2ggY2xlYXIgYnV0dG9uIChjbGVhciBzdG9yZSBhbmQgbWFwIGxheWVycylcbiAgICovXG4gIGNsZWFyQnV0dG9uKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc3RvcmUpIHtcbiAgICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQb2ludCgpIHx8IHRoaXMuaXNQb2x5Z29uKCkpIHtcbiAgICAgIHRoaXMuZHJhd1pvbmUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoMCk7XG4gICAgdGhpcy5idWZmZXIgPSAwO1xuICAgIHRoaXMuYnVmZmVyRXZlbnQuZW1pdCgwKTtcbiAgICB0aGlzLmNsZWFyQnV0dG9uRXZlbnQuZW1pdCgpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudGFibGVUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsZWFyRHJhd1pvbmUoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xuICAgIHRoaXMuYnVmZmVyRm9ybUNvbnRyb2wuc2V0VmFsdWUoMCk7XG4gICAgdGhpcy5idWZmZXIgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaCBjbGVhciBzZWFyY2ggKGNsZWFyIGZpZWxkIGlmIHR5cGUgaXMgcHJlZGVmaW5lZClcbiAgICovXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3MuY2xlYXIoKTtcbiAgICB0aGlzLmJ1ZmZlckZvcm1Db250cm9sLnNldFZhbHVlKDApO1xuICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICB0aGlzLmJ1ZmZlckV2ZW50LmVtaXQoMCk7XG4gICAgdGhpcy50aGVtYXRpY0NoYW5nZS5lbWl0KFtdKTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBjb25kaXRpb25zIG9mIGluY29tcGxldGUgZmllbGRzIG9yIGJ1c3kgc2VydmljZVxuICAgKi9cbiAgZGlzYWJsZVNlYXJjaEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5QcmVkZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzcykge1xuICAgICAgICBpZiAodGhpcy5xdWVyeVR5cGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnpvbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbVR5cGUgPT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5UaGVtYXRpY3MpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucXVlcnlUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB0aGlzLnpvbmUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtYXRpY3Muc2VsZWN0ZWQubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gU3BhdGlhbEZpbHRlclR5cGUuUG9seWdvbiB8fFxuICAgICAgdGhpcy50eXBlID09PSBTcGF0aWFsRmlsdGVyVHlwZS5Qb2ludFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbVR5cGUgPT09IFNwYXRpYWxGaWx0ZXJJdGVtVHlwZS5BZGRyZXNzICYmXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtVHlwZSA9PT0gU3BhdGlhbEZpbHRlckl0ZW1UeXBlLlRoZW1hdGljcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZGlzYWJsZWRDbGVhclNlYXJjaCgpIHtcbiAgICBsZXQgZGlzYWJsZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1UeXBlID09PSBTcGF0aWFsRmlsdGVySXRlbVR5cGUuQWRkcmVzc1xuICAgICAgPyAoZGlzYWJsZSA9IHRoaXMucXVlcnlUeXBlID09PSB1bmRlZmluZWQpXG4gICAgICA6IChkaXNhYmxlID1cbiAgICAgICAgICB0aGlzLnF1ZXJ5VHlwZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1hdGljcy5zZWxlY3RlZC5sZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGRpc2FibGU7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlIHJhZGl1cyB2YWx1ZSBhdCB1c2VyIGNoYW5nZVxuICAgKi9cbiAgZ2V0UmFkaXVzKCkge1xuICAgIGxldCBmb3JtVmFsdWU7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVyc1xuICAgICAgICA/IChmb3JtVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlLnJhZGl1cylcbiAgICAgICAgOiAoZm9ybVZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZS5yYWRpdXMgLyAxMDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybVZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFNwYXRpYWxGaWx0ZXJUeXBlLlBvaW50KSB7XG4gICAgICBpZiAoIXRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgPCAwIHx8XG4gICAgICAgICAgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0Lk1ldGVycyAmJlxuICAgICAgICAgICAgdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZSA+PSAxMDAwMDApIHx8XG4gICAgICAgICAgKHRoaXMubWVhc3VyZVVuaXQgPT09IE1lYXN1cmVMZW5ndGhVbml0LktpbG9tZXRlcnMgJiZcbiAgICAgICAgICAgIHRoaXMucmFkaXVzRm9ybUNvbnRyb2wudmFsdWUgPj0gMTAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFsZXJ0KFxuICAgICAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yYWRpdXNBbGVydCcsXG4gICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnJhZGl1cyA9IDEwMDA7XG4gICAgICAgICAgdGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzXG4gICAgICAgICAgICA/IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5yYWRpdXMpXG4gICAgICAgICAgICA6IHRoaXMucmFkaXVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5yYWRpdXMgLyAxMDAwKTtcbiAgICAgICAgICB0aGlzLmRyYXdHdWlkZSQubmV4dCh0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm9ybVZhbHVlKSB7XG4gICAgICAgICAgaWYgKGZvcm1WYWx1ZSA+PSAxMDAwMDApIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIucmFkaXVzQWxlcnQnLFxuICAgICAgICAgICAgICAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLndhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZm9ybVZhbHVlICE9PSB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnNldFZhbHVlKGZvcm1WYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tZWFzdXJlVW5pdCA9PT0gTWVhc3VyZUxlbmd0aFVuaXQuTWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXNGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1c0Zvcm1Db250cm9sLnZhbHVlICogMTAwMDtcbiAgICAgICAgdGhpcy5kcmF3R3VpZGUkLm5leHQodGhpcy5yYWRpdXMgKiAxMDAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3ZlcmxheVN0eWxlJC5uZXh0KHRoaXMuUG9pbnRTdHlsZSk7XG4gICAgICB0aGlzLmRyYXdTdHlsZSQubmV4dCh0aGlzLlBvaW50U3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVZpc2libGVMaXN0KCkge1xuICAgIHRoaXMubGlzdElzVmlzaWJsZSA9ICF0aGlzLmxpc3RJc1Zpc2libGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhYmxlVGVtcGxhdGUoKSB7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHtcbiAgICAgIG5hbWU6ICdtZXRhLnRpdGxlJyxcbiAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci50eXBlJ1xuICAgICAgKSxcbiAgICAgIHJlbmRlcmVyOiBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLlVuc2FuaXRpemVkSFRNTFxuICAgIH07XG4gICAgY29uc3QgbmFtZUNvbHVtbiA9IHtcbiAgICAgIG5hbWU6ICdwcm9wZXJ0aWVzLm5vbScsXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuc2VhcmNoUmVzdWx0cydcbiAgICAgICksXG4gICAgICByZW5kZXJlcjogRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5VbnNhbml0aXplZEhUTUxcbiAgICB9O1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbdHlwZUNvbHVtbiwgbmFtZUNvbHVtbl07XG5cbiAgICB0aGlzLnRhYmxlVGVtcGxhdGUgPSB7XG4gICAgICBzZWxlY3Rpb246IHRydWUsXG4gICAgICBzb3J0OiB0cnVlLFxuICAgICAgY29sdW1uc1xuICAgIH07XG4gIH1cbn1cbiIsIjxpZ28tZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dFxuICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICBbbWFwXT1cIm1hcFwiXG4gIFtnZW9tZXRyeVR5cGVdPVwiZ2VvbWV0cnlUeXBlXCJcbiAgW2RyYXdHdWlkZV09XCJkcmF3R3VpZGUkIHwgYXN5bmNcIlxuICBbbWVhc3VyZV09XCJtZWFzdXJlXCJcbiAgW2RyYXdDb250cm9sSXNBY3RpdmVdPVwiZHJhd0NvbnRyb2xJc0FjdGl2ZVwiXG4gIFtmcmVlaGFuZERyYXdJc0FjdGl2ZV09XCJmcmVlaGFuZERyYXdJc0FjdGl2ZVwiXG4gIFtkcmF3U3R5bGVdPVwiZHJhd1N0eWxlJCB8IGFzeW5jXCJcbiAgW292ZXJsYXlTdHlsZV09XCJvdmVybGF5U3R5bGUkIHwgYXN5bmNcIlxuICBbcmFkaXVzXT1cInJhZGl1c1wiXG4gIFtwcmVkZWZpbmVkUmFkaXVzXT1cIiRhbnkocHJlZGVmaW5lZFJhZGl1cylcIlxuPlxuPC9pZ28tZ2VvbWV0cnktZm9ybS1maWVsZC1pbnB1dD5cblxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICpuZ0lmPVwiIWlzUHJlZGVmaW5lZCgpXCJcbiAgICBbY2hlY2tlZF09XCJkcmF3Q29udHJvbElzQWN0aXZlXCJcbiAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXG4gICAgKGNoYW5nZSk9XCJvbkRyYXdDb250cm9sQ2hhbmdlKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5kcmF3Q29udHJvbCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICpuZ0lmPVwiIWlzUHJlZGVmaW5lZCgpXCJcbiAgICBbY2hlY2tlZF09XCJmcmVlaGFuZERyYXdJc0FjdGl2ZVwiXG4gICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxuICAgIChjaGFuZ2UpPVwib25mcmVlaGFuZENvbnRyb2xDaGFuZ2UoKVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmZyZWVoYW5kQ29udHJvbCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJidWZmZXItdW5pdFwiICpuZ0lmPVwiaXNQb2x5Z29uKClcIj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiYnVmZmVyXCI+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgIG1hdElucHV0XG4gICAgICBwbGFjZWhvbGRlcj1cInt7ICdpZ28uZ2VvLnNwYXRpYWxGaWx0ZXIuYnVmZmVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBbZm9ybUNvbnRyb2xdPVwiYnVmZmVyRm9ybUNvbnRyb2xcIlxuICAgICAgW3ZhbHVlXT1cIjBcIlxuICAgICAgW3JlYWRvbmx5XT1cInRoaXMuZm9ybUNvbnRyb2wudmFsdWUgPT09IG51bGxcIlxuICAgIC8+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidW5pdC1maWVsZFwiPlxuICAgIDxtYXQtc2VsZWN0XG4gICAgICBbdmFsdWVdPVwibWVhc3VyZVVuaXRcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1lYXN1cmVVbml0Q2hhbmdlKCRldmVudC52YWx1ZSlcIlxuICAgID5cbiAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBtZWFzdXJlVW5pdCBvZiBtZWFzdXJlVW5pdHNcIlxuICAgICAgICBbdmFsdWVdPVwibWVhc3VyZVVuaXRcIlxuICAgICAgPlxuICAgICAgICB7eyAnaWdvLmdlby5tZWFzdXJlLicgKyBtZWFzdXJlVW5pdCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicmFkaXVzLXVuaXRcIiAqbmdJZj1cImlzUG9pbnQoKVwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJyYWRpdXNcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgbWF0SW5wdXRcbiAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yYWRpdXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIFtmb3JtQ29udHJvbF09XCJyYWRpdXNGb3JtQ29udHJvbFwiXG4gICAgICBbdmFsdWVdPVwiMTAwMFwiXG4gICAgICAoaW5wdXQpPVwiZ2V0UmFkaXVzKClcIlxuICAgICAgW3JlYWRvbmx5XT1cInRoaXMuZnJlZWhhbmREcmF3SXNBY3RpdmUgJiYgdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA9PT0gbnVsbFwiXG4gICAgLz5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ1bml0LWZpZWxkXCI+XG4gICAgPG1hdC1zZWxlY3RcbiAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uTWVhc3VyZVVuaXRDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiXG4gICAgPlxuICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG1lYXN1cmVVbml0IG9mIG1lYXN1cmVVbml0c1wiXG4gICAgICAgIFt2YWx1ZV09XCJtZWFzdXJlVW5pdFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdpZ28uZ2VvLm1lYXN1cmUuJyArIG1lYXN1cmVVbml0IHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjxtYXQtbGFiZWwgY2xhc3M9XCJ0aXRsZSBtYXQtdHlwb2dyYXBoeVwiXG4gID57eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLnNlYXJjaCcgfCB0cmFuc2xhdGUgfX0gOlxuPC9tYXQtbGFiZWw+XG48bWF0LXJhZGlvLWdyb3VwIFt2YWx1ZV09XCJzZWxlY3RlZEl0ZW1UeXBlXCI+XG4gIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVR5cGVcIlxuICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAoY2hhbmdlKT1cIm9uSXRlbVR5cGVDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLicgKyBpdGVtIHwgdHJhbnNsYXRlIH19XG4gIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbjwvbWF0LXJhZGlvLWdyb3VwPlxuXG48ZGl2XG4gIGNsYXNzPVwidGhlbWF0aWNzXCJcbiAgKm5nSWY9XCJcbiAgICAoc2VsZWN0ZWRJdGVtVHlwZSA9PT0gJ1RoZW1hdGljcycgJiYgIXRhYmxlVGVtcGxhdGUpIHx8XG4gICAgKHNlbGVjdGVkSXRlbVR5cGUgPT09ICdUaGVtYXRpY3MnICYmIHRhYmxlVGVtcGxhdGUgJiYgIWxpc3RJc1Zpc2libGUpXG4gIFwiXG4+XG4gIDxtYXQtdGFibGU+XG4gICAgPCEtLSBOYW1lIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ0aGVtYXRpY3MtaGVhZGVyXCI+e3tcbiAgICAgICAgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5UaGVtYXRpY3MnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTZWxlY3QgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiY2hlY2tzLWhlYWRlclwiPlxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0ZWRUaGVtYXRpY3MuaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgPC9tYXQtdGFibGU+XG5cbiAgPG1hdC10cmVlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cbiAgICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgbGVhZiBub2RlcyAtLT5cbiAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiIG1hdFRyZWVOb2RlVG9nZ2xlPlxuICAgICAgPGxpIGNsYXNzPVwibWF0LXRyZWUtbm9kZVwiPlxuICAgICAgICA8IS0tIHVzZSBhIGRpc2FibGVkIGJ1dHRvbiB0byBwcm92aWRlIHBhZGRpbmcgZm9yIHRyZWUgbGVhZiAtLT5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+PC9idXR0b24+XG4gICAgICAgIHt7IG5vZGUubmFtZSB9fVxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgY2xhc3M9XCJ0cmVlLWNoZWNrXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG9uVG9nZ2xlQ2hhbmdlKG5vZGUpIDogbnVsbFwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRUaGVtYXRpY3MuaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICA8L2xpPlxuICAgIDwvbWF0LXRyZWUtbm9kZT5cblxuICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICAgIDxtYXQtbmVzdGVkLXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtdHJlZS1ub2RlXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvblRvZ2dsZUNsaWNrKG5vZGUpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnt7XG4gICAgICAgICAgICB0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpID8gJ2V4cGFuZF9tb3JlJyA6ICdjaGV2cm9uX3JpZ2h0J1xuICAgICAgICAgIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIHt7IG5vZGUubmFtZSB9fVxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgY2xhc3M9XCJ0cmVlLWNoZWNrLTJcIlxuICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gY2hpbGRyZW5zVG9nZ2xlKG5vZGUpIDogbnVsbFwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaGFzQ2hpbGRyZW5TZWxlY3RlZChub2RlKSAmJiAhaXNBbGxTZWxlY3RlZChub2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICA8L2Rpdj5cbiAgICAgIDx1bFxuICAgICAgICBjbGFzcz1cInRyZWUtdWxcIlxuICAgICAgICBbY2xhc3MuZXhhbXBsZS10cmVlLWludmlzaWJsZV09XCIhdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0VHJlZU5vZGVPdXRsZXQ+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvbWF0LW5lc3RlZC10cmVlLW5vZGU+XG4gIDwvbWF0LXRyZWU+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiaXNQcmVkZWZpbmVkKClcIlxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRDbGVhclNlYXJjaCgpXCJcbiAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5zcGF0aWFsRmlsdGVyLmNsZWFyU2VhcmNoJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJpc1BvbHlnb24oKSB8fCBpc1BvaW50KClcIlxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgY2xhc3M9XCJjbGVhci1mb3JtLWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cInRoaXMuZm9ybUNvbnRyb2wudmFsdWUgPT09IG51bGxcIlxuICAgIChjbGljayk9XCJjbGVhckRyYXdab25lKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5jbGVhckZvcm0nIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNsYXNzPVwic2VhcmNoLWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVTZWFyY2hCdXR0b24oKVwiXG4gICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAoY2xpY2spPVwidG9nZ2xlU2VhcmNoQnV0dG9uKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5nb1NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgY2xhc3M9XCJyZW1vdmUtYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiYWxsTGF5ZXJzLmxlbmd0aCA9PT0gMFwiXG4gICAgKGNsaWNrKT1cImNsZWFyQnV0dG9uKClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5yZW1vdmVMYXllcicgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgY2xhc3M9XCJleHBvcnQtYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiIXN0b3JlLmVudGl0aWVzJC5nZXRWYWx1ZSgpLmxlbmd0aFwiXG4gICAgKGNsaWNrKT1cImV4cG9ydC5lbWl0KClcIlxuICA+XG4gICAge3sgJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5leHBvcnRMYXllcicgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPGJ1dHRvblxuICBjbGFzcz1cImV4cGFuZC1tb3JlXCJcbiAgKm5nSWY9XCJzdG9yZS5hbGwoKS5sZW5ndGggJiYgdGFibGVUZW1wbGF0ZSAmJiAhbGlzdElzVmlzaWJsZVwiXG4gIG1hdC1pY29uLWJ1dHRvblxuICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uc3BhdGlhbEZpbHRlci5zaG93U2VhcmNoUmVzdWx0cycgfCB0cmFuc2xhdGVcIlxuICAoY2xpY2spPVwidG9nZ2xlVmlzaWJsZUxpc3QoKVwiXG4+XG4gIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG48L2J1dHRvbj5cblxuPGRpdlxuICBjbGFzcz1cInJlc3VsdHNcIlxuICAqbmdJZj1cInN0b3JlLmFsbCgpLmxlbmd0aCAmJiB0YWJsZVRlbXBsYXRlICYmIGxpc3RJc1Zpc2libGVcIlxuPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJsaXN0SXNWaXNpYmxlXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5zcGF0aWFsRmlsdGVyLmhpZGVTZWFyY2hSZXN1bHRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZVZpc2libGVMaXN0KClcIlxuICA+XG4gICAgPG1hdC1pY29uPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxpZ28tZW50aXR5LXRhYmxlXG4gICAgY2xhc3M9XCJyZXN1bHRzLWxpc3RcIlxuICAgIFt0ZW1wbGF0ZV09XCJ0YWJsZVRlbXBsYXRlXCJcbiAgICBbc3RvcmVdPVwic3RvcmVcIlxuICAgIChlbnRpdHlTZWxlY3RDaGFuZ2UpPVwiZW50aXR5Q2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gID5cbiAgPC9pZ28tZW50aXR5LXRhYmxlPlxuPC9kaXY+XG4iXX0=