@igo2/geo 16.3.0 → 17.0.0-next.2

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 (576) hide show
  1. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +30 -14
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +35 -17
  3. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +18 -11
  4. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +8 -62
  5. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +49 -20
  6. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +22 -10
  7. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +32 -16
  8. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +8 -71
  9. package/esm2022/lib/catalog/catalog-library/index.mjs +9 -0
  10. package/esm2022/lib/catalog/catalog.module.mjs +9 -37
  11. package/esm2022/lib/catalog/index.mjs +7 -1
  12. package/esm2022/lib/catalog/shared/catalog.service.mjs +16 -9
  13. package/esm2022/lib/catalog/shared/index.mjs +1 -1
  14. package/esm2022/lib/datasource/index.mjs +1 -1
  15. package/esm2022/lib/datasource/shared/capabilities.service.mjs +5 -5
  16. package/esm2022/lib/datasource/shared/datasource.service.mjs +11 -13
  17. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
  18. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +1 -1
  19. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +1 -1
  20. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +1 -1
  21. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +1 -1
  22. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +1 -1
  23. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +1 -1
  24. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
  25. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +1 -1
  26. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +1 -1
  27. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +1 -1
  28. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +1 -1
  29. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
  30. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +1 -1
  31. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
  32. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +1 -1
  33. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +1 -1
  34. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +5 -5
  35. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +1 -1
  36. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +1 -1
  37. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
  38. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +1 -1
  39. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
  40. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +1 -1
  41. package/esm2022/lib/datasource/shared/index.mjs +1 -1
  42. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +2 -2
  43. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +6 -6
  44. package/esm2022/lib/datasource/shared/options/options.service.mjs +1 -1
  45. package/esm2022/lib/datasource/utils/tilegrid.mjs +1 -1
  46. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +28 -13
  47. package/esm2022/lib/directions/directions-buttons/index.mjs +1 -1
  48. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +44 -19
  49. package/esm2022/lib/directions/directions-inputs/index.mjs +1 -1
  50. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +36 -16
  51. package/esm2022/lib/directions/directions-results/index.mjs +1 -1
  52. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +2 -2
  53. package/esm2022/lib/directions/directions-sources/index.mjs +1 -1
  54. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +7 -7
  55. package/esm2022/lib/directions/directions.component.mjs +20 -12
  56. package/esm2022/lib/directions/directions.module.mjs +17 -70
  57. package/esm2022/lib/directions/index.mjs +1 -1
  58. package/esm2022/lib/directions/shared/directions-source.service.mjs +1 -1
  59. package/esm2022/lib/directions/shared/directions.enum.mjs +1 -1
  60. package/esm2022/lib/directions/shared/directions.service.mjs +13 -9
  61. package/esm2022/lib/directions/shared/directions.utils.mjs +1 -1
  62. package/esm2022/lib/directions/shared/index.mjs +1 -1
  63. package/esm2022/lib/download/download-button/download-button.component.mjs +21 -11
  64. package/esm2022/lib/download/download-button/index.mjs +1 -1
  65. package/esm2022/lib/download/download.module.mjs +10 -27
  66. package/esm2022/lib/download/index.mjs +1 -1
  67. package/esm2022/lib/download/shared/download.interface.mjs +1 -1
  68. package/esm2022/lib/download/shared/download.service.mjs +7 -7
  69. package/esm2022/lib/download/shared/index.mjs +1 -1
  70. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +21 -10
  71. package/esm2022/lib/draw/draw/draw-popup.component.mjs +41 -18
  72. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +19 -9
  73. package/esm2022/lib/draw/draw/draw.component.mjs +54 -24
  74. package/esm2022/lib/draw/draw/draw.module.mjs +7 -104
  75. package/esm2022/lib/draw/drawingTool.module.mjs +8 -7
  76. package/esm2022/lib/draw/index.mjs +1 -1
  77. package/esm2022/lib/draw/shared/draw-icon.service.mjs +7 -7
  78. package/esm2022/lib/draw/shared/draw.utils.mjs +1 -1
  79. package/esm2022/lib/draw/shared/index.mjs +1 -1
  80. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +28 -13
  81. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +8 -7
  82. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +8 -27
  83. package/esm2022/lib/feature/feature-details/index.mjs +9 -0
  84. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +8 -8
  85. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +8 -11
  86. package/esm2022/lib/feature/feature.module.mjs +9 -10
  87. package/esm2022/lib/feature/index.mjs +8 -2
  88. package/esm2022/lib/feature/shared/feature-store.utils.mjs +1 -1
  89. package/esm2022/lib/feature/shared/feature.enums.mjs +1 -1
  90. package/esm2022/lib/feature/shared/feature.utils.mjs +1 -1
  91. package/esm2022/lib/feature/shared/store.mjs +1 -1
  92. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +1 -1
  93. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +1 -1
  94. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +1 -1
  95. package/esm2022/lib/feature/shared/strategies/index.mjs +1 -1
  96. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +1 -1
  97. package/esm2022/lib/feature/shared/strategies/loading.mjs +1 -1
  98. package/esm2022/lib/feature/shared/strategies/search.mjs +4 -4
  99. package/esm2022/lib/feature/shared/strategies/selection.mjs +1 -1
  100. package/esm2022/lib/feature/shared/strategies.utils.mjs +1 -1
  101. package/esm2022/lib/filter/filter.module.mjs +47 -177
  102. package/esm2022/lib/filter/index.mjs +36 -1
  103. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +29 -15
  104. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +46 -20
  105. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +54 -23
  106. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +13 -10
  107. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +45 -18
  108. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +18 -12
  109. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +42 -18
  110. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +8 -7
  111. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +21 -12
  112. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +6 -5
  113. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +5 -5
  114. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +1 -1
  115. package/esm2022/lib/filter/shared/ogc-filter.mjs +1 -1
  116. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +5 -5
  117. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +1 -1
  118. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +9 -7
  119. package/esm2022/lib/filter/shared/time-filter.enum.mjs +1 -1
  120. package/esm2022/lib/filter/shared/time-filter.interface.mjs +1 -1
  121. package/esm2022/lib/filter/shared/time-filter.service.mjs +5 -5
  122. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +66 -28
  123. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +34 -17
  124. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +34 -15
  125. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +28 -14
  126. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +47 -20
  127. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +31 -13
  128. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +8 -7
  129. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +16 -10
  130. package/esm2022/lib/geo.module.mjs +5 -43
  131. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +7 -7
  132. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +33 -16
  133. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +8 -43
  134. package/esm2022/lib/geometry/geometry-form-field/index.mjs +9 -0
  135. package/esm2022/lib/geometry/geometry.module.mjs +9 -10
  136. package/esm2022/lib/geometry/index.mjs +2 -3
  137. package/esm2022/lib/geometry/shared/controls/draw.mjs +1 -1
  138. package/esm2022/lib/geometry/shared/controls/index.mjs +1 -1
  139. package/esm2022/lib/geometry/shared/controls/modify.mjs +1 -1
  140. package/esm2022/lib/geometry/shared/controls/slice.mjs +1 -1
  141. package/esm2022/lib/geometry/shared/geometry.utils.mjs +1 -1
  142. package/esm2022/lib/geometry/shared/index.mjs +1 -1
  143. package/esm2022/lib/import-export/export-button/export-button.component.mjs +20 -10
  144. package/esm2022/lib/import-export/export-button/index.mjs +1 -1
  145. package/esm2022/lib/import-export/import-export/import-export.component.mjs +56 -22
  146. package/esm2022/lib/import-export/import-export/index.mjs +1 -1
  147. package/esm2022/lib/import-export/import-export.module.mjs +10 -81
  148. package/esm2022/lib/import-export/index.mjs +9 -1
  149. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +13 -10
  150. package/esm2022/lib/import-export/shared/export.errors.mjs +1 -1
  151. package/esm2022/lib/import-export/shared/export.service.mjs +7 -7
  152. package/esm2022/lib/import-export/shared/export.utils.mjs +1 -1
  153. package/esm2022/lib/import-export/shared/import.service.mjs +7 -7
  154. package/esm2022/lib/import-export/shared/import.utils.mjs +1 -1
  155. package/esm2022/lib/import-export/shared/index.mjs +1 -1
  156. package/esm2022/lib/layer/index.mjs +19 -1
  157. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +35 -16
  158. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +43 -17
  159. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +13 -11
  160. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +8 -7
  161. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +28 -13
  162. package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +10 -9
  163. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +48 -18
  164. package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +1 -1
  165. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +33 -14
  166. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +5 -5
  167. package/esm2022/lib/layer/layer.module.mjs +16 -93
  168. package/esm2022/lib/layer/shared/clusterParam.mjs +1 -1
  169. package/esm2022/lib/layer/shared/layer.service.mjs +8 -8
  170. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
  171. package/esm2022/lib/layer/shared/layers/any-layer.mjs +1 -1
  172. package/esm2022/lib/layer/shared/layers/image-layer.mjs +1 -1
  173. package/esm2022/lib/layer/shared/layers/index.mjs +1 -1
  174. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +1 -1
  175. package/esm2022/lib/layer/shared/layers/layer.mjs +1 -1
  176. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +1 -1
  177. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +1 -1
  178. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +1 -1
  179. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +21 -11
  180. package/esm2022/lib/layer/utils/image-watcher.mjs +1 -1
  181. package/esm2022/lib/layer/utils/layer.utils.mjs +1 -1
  182. package/esm2022/lib/layer/utils/outputLegend.mjs +1 -1
  183. package/esm2022/lib/layer/utils/tile-watcher.mjs +1 -1
  184. package/esm2022/lib/layer/utils/vector-watcher.mjs +1 -1
  185. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +27 -14
  186. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +8 -8
  187. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +24 -13
  188. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +15 -11
  189. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +1 -1
  190. package/esm2022/lib/map/home-extent-button/index.mjs +1 -1
  191. package/esm2022/lib/map/index.mjs +32 -1
  192. package/esm2022/lib/map/info-section/info-section.component.mjs +7 -7
  193. package/esm2022/lib/map/map-browser/map-browser.component.mjs +8 -8
  194. package/esm2022/lib/map/map-center/map-center.component.mjs +6 -6
  195. package/esm2022/lib/map/map.module.mjs +36 -66
  196. package/esm2022/lib/map/menu-button/menu-button.component.mjs +23 -13
  197. package/esm2022/lib/map/offline-button/offline-button.component.mjs +21 -11
  198. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +23 -11
  199. package/esm2022/lib/map/shared/controllers/controller.mjs +1 -1
  200. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +1 -1
  201. package/esm2022/lib/map/shared/controllers/geolocation.mjs +1 -1
  202. package/esm2022/lib/map/shared/controllers/index.mjs +1 -1
  203. package/esm2022/lib/map/shared/controllers/view.mjs +1 -1
  204. package/esm2022/lib/map/shared/hover-feature.directive.mjs +10 -9
  205. package/esm2022/lib/map/shared/index.mjs +1 -1
  206. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +1 -1
  207. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +10 -9
  208. package/esm2022/lib/map/shared/map.interface.mjs +1 -1
  209. package/esm2022/lib/map/shared/map.mjs +1 -1
  210. package/esm2022/lib/map/shared/map.service.mjs +5 -5
  211. package/esm2022/lib/map/shared/map.utils.mjs +1 -1
  212. package/esm2022/lib/map/shared/mapOffline.directive.mjs +11 -8
  213. package/esm2022/lib/map/shared/projection.interfaces.mjs +1 -1
  214. package/esm2022/lib/map/shared/projection.service.mjs +7 -7
  215. package/esm2022/lib/map/shared/projection.utils.mjs +1 -1
  216. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +6 -6
  217. package/esm2022/lib/map/utils/layer-watcher.mjs +1 -1
  218. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +23 -13
  219. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +13 -9
  220. package/esm2022/lib/measure/index.mjs +2 -3
  221. package/esm2022/lib/measure/measure.module.mjs +8 -5
  222. package/esm2022/lib/measure/measurer/index.mjs +6 -0
  223. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +6 -5
  224. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +18 -11
  225. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +27 -13
  226. package/esm2022/lib/measure/measurer/measurer.component.mjs +40 -20
  227. package/esm2022/lib/measure/measurer/measurer.module.mjs +7 -69
  228. package/esm2022/lib/measure/shared/index.mjs +1 -1
  229. package/esm2022/lib/measure/shared/measure.utils.mjs +1 -1
  230. package/esm2022/lib/metadata/index.mjs +6 -1
  231. package/esm2022/lib/metadata/metadata-button/index.mjs +1 -1
  232. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +35 -18
  233. package/esm2022/lib/metadata/metadata.module.mjs +10 -31
  234. package/esm2022/lib/metadata/shared/index.mjs +1 -1
  235. package/esm2022/lib/metadata/shared/metadata.service.mjs +5 -5
  236. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +7 -7
  237. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +8 -10
  238. package/esm2022/lib/offline/geoDB/index.mjs +1 -1
  239. package/esm2022/lib/offline/index.mjs +1 -1
  240. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +5 -5
  241. package/esm2022/lib/offline/shared/geo-network.service.mjs +7 -7
  242. package/esm2022/lib/offline/shared/index.mjs +1 -1
  243. package/esm2022/lib/overlay/index.mjs +1 -1
  244. package/esm2022/lib/overlay/overlay.module.mjs +10 -8
  245. package/esm2022/lib/overlay/shared/index.mjs +1 -1
  246. package/esm2022/lib/overlay/shared/overlay.directive.mjs +8 -7
  247. package/esm2022/lib/overlay/shared/overlay.mjs +1 -1
  248. package/esm2022/lib/overlay/shared/overlay.service.mjs +5 -5
  249. package/esm2022/lib/print/index.mjs +1 -1
  250. package/esm2022/lib/print/print/print.component.mjs +7 -7
  251. package/esm2022/lib/print/print-form/index.mjs +1 -1
  252. package/esm2022/lib/print/print-form/print-form.component.mjs +36 -16
  253. package/esm2022/lib/print/print.module.mjs +10 -54
  254. package/esm2022/lib/print/shared/index.mjs +1 -1
  255. package/esm2022/lib/print/shared/print.service.mjs +18 -12
  256. package/esm2022/lib/query/index.mjs +1 -1
  257. package/esm2022/lib/query/query.module.mjs +7 -8
  258. package/esm2022/lib/query/shared/index.mjs +1 -1
  259. package/esm2022/lib/query/shared/query-search-source.mjs +6 -6
  260. package/esm2022/lib/query/shared/query-search-source.providers.mjs +2 -2
  261. package/esm2022/lib/query/shared/query.directive.mjs +8 -7
  262. package/esm2022/lib/query/shared/query.enums.mjs +1 -1
  263. package/esm2022/lib/query/shared/query.service.mjs +8 -10
  264. package/esm2022/lib/search/index.mjs +14 -5
  265. package/esm2022/lib/search/search-bar/search-bar.component.mjs +38 -18
  266. package/esm2022/lib/search/search-bar/search-bar.module.mjs +8 -61
  267. package/esm2022/lib/search/search-results/index.mjs +10 -0
  268. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +44 -19
  269. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +30 -16
  270. package/esm2022/lib/search/search-results/search-results-item.component.mjs +22 -12
  271. package/esm2022/lib/search/search-results/search-results.component.mjs +26 -14
  272. package/esm2022/lib/search/search-results/search-results.module.mjs +8 -91
  273. package/esm2022/lib/search/search-selector/search-selector.component.mjs +27 -12
  274. package/esm2022/lib/search/search-selector/search-selector.module.mjs +8 -44
  275. package/esm2022/lib/search/search-settings/search-settings.component.mjs +40 -15
  276. package/esm2022/lib/search/search-settings/search-settings.module.mjs +7 -47
  277. package/esm2022/lib/search/search.module.mjs +10 -13
  278. package/esm2022/lib/search/shared/index.mjs +1 -1
  279. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +10 -9
  280. package/esm2022/lib/search/shared/search-source.service.mjs +1 -1
  281. package/esm2022/lib/search/shared/search.service.mjs +7 -7
  282. package/esm2022/lib/search/shared/search.utils.mjs +1 -1
  283. package/esm2022/lib/search/shared/sources/cadastre.mjs +12 -9
  284. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +4 -2
  285. package/esm2022/lib/search/shared/sources/coordinates.mjs +15 -13
  286. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +4 -2
  287. package/esm2022/lib/search/shared/sources/icherche.mjs +20 -18
  288. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +4 -2
  289. package/esm2022/lib/search/shared/sources/ilayer.mjs +14 -12
  290. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +4 -2
  291. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
  292. package/esm2022/lib/search/shared/sources/nominatim.mjs +8 -8
  293. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +3 -2
  294. package/esm2022/lib/search/shared/sources/source.mjs +1 -1
  295. package/esm2022/lib/search/shared/sources/storedqueries.mjs +15 -13
  296. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +4 -2
  297. package/esm2022/lib/search/shared/sources/workspace.mjs +11 -10
  298. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +4 -2
  299. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +1 -1
  300. package/esm2022/lib/style/shared/datasource/index.mjs +1 -1
  301. package/esm2022/lib/style/shared/feature/feature-style.mjs +1 -1
  302. package/esm2022/lib/style/shared/feature/index.mjs +1 -1
  303. package/esm2022/lib/style/shared/overlay/index.mjs +1 -1
  304. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +1 -1
  305. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +1 -1
  306. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +1 -1
  307. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +1 -1
  308. package/esm2022/lib/style/shared/vector/index.mjs +1 -1
  309. package/esm2022/lib/style/style-list/index.mjs +1 -1
  310. package/esm2022/lib/style/style-list/style-list.interface.mjs +1 -1
  311. package/esm2022/lib/style/style-list/style-list.module.mjs +5 -5
  312. package/esm2022/lib/style/style-list/style-list.service.mjs +5 -5
  313. package/esm2022/lib/style/style-modal/drawing/index.mjs +1 -1
  314. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +40 -17
  315. package/esm2022/lib/style/style-modal/index.mjs +1 -1
  316. package/esm2022/lib/style/style-modal/layer/index.mjs +1 -1
  317. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +28 -14
  318. package/esm2022/lib/style/style-modal/layer-button/index.mjs +1 -1
  319. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +13 -9
  320. package/esm2022/lib/style/style-modal/shared/index.mjs +1 -1
  321. package/esm2022/lib/style/style-service/draw-style.service.mjs +5 -5
  322. package/esm2022/lib/style/style-service/index.mjs +1 -1
  323. package/esm2022/lib/style/style-service/style.service.mjs +4 -4
  324. package/esm2022/lib/style/style.module.mjs +12 -57
  325. package/esm2022/lib/toast/index.mjs +1 -1
  326. package/esm2022/lib/toast/toast.component.mjs +19 -11
  327. package/esm2022/lib/toast/toast.module.mjs +10 -30
  328. package/esm2022/lib/utils/id-generator.mjs +1 -1
  329. package/esm2022/lib/utils/index.mjs +1 -1
  330. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +1 -1
  331. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +7 -7
  332. package/esm2022/lib/wkt/index.mjs +1 -1
  333. package/esm2022/lib/wkt/shared/index.mjs +1 -1
  334. package/esm2022/lib/wkt/shared/wkt.service.mjs +5 -5
  335. package/esm2022/lib/wkt/wkt.module.mjs +8 -5
  336. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +11 -10
  337. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +8 -24
  338. package/esm2022/lib/workspace/index.mjs +1 -1
  339. package/esm2022/lib/workspace/shared/edition-workspace.mjs +1 -1
  340. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +15 -11
  341. package/esm2022/lib/workspace/shared/feature-workspace.mjs +1 -1
  342. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +12 -10
  343. package/esm2022/lib/workspace/shared/index.mjs +1 -1
  344. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +1 -1
  345. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +12 -10
  346. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +10 -8
  347. package/esm2022/lib/workspace/shared/workspace.utils.mjs +2 -2
  348. package/esm2022/lib/workspace/widgets/index.mjs +1 -1
  349. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +7 -7
  350. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +8 -13
  351. package/esm2022/lib/workspace/widgets/widgets.mjs +1 -1
  352. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +7 -6
  353. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +8 -10
  354. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +7 -6
  355. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +8 -10
  356. package/esm2022/lib/workspace/workspace.module.mjs +10 -35
  357. package/esm2022/public_api.mjs +11 -12
  358. package/fesm2022/igo2-geo.mjs +34474 -34608
  359. package/fesm2022/igo2-geo.mjs.map +1 -1
  360. package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +1 -1
  361. package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +1 -1
  362. package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +1 -1
  363. package/lib/catalog/catalog-browser/catalog-browser.module.d.ts +2 -14
  364. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +3 -2
  365. package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +1 -1
  366. package/lib/catalog/catalog-library/catalog-library.component.d.ts +3 -2
  367. package/lib/catalog/catalog-library/catalog-library.module.d.ts +3 -18
  368. package/lib/catalog/catalog-library/index.d.ts +5 -0
  369. package/lib/catalog/catalog.module.d.ts +6 -9
  370. package/lib/catalog/index.d.ts +2 -0
  371. package/lib/catalog/shared/catalog.service.d.ts +3 -1
  372. package/lib/datasource/shared/datasource.service.d.ts +4 -5
  373. package/lib/datasource/shared/options/options-api.providers.d.ts +1 -1
  374. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +4 -2
  375. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +2 -2
  376. package/lib/directions/directions-results/directions-results.component.d.ts +2 -2
  377. package/lib/directions/directions-sources/directions-source.provider.d.ts +1 -1
  378. package/lib/directions/directions-sources/osrm-directions-source.d.ts +1 -1
  379. package/lib/directions/directions.component.d.ts +2 -2
  380. package/lib/directions/directions.module.d.ts +9 -20
  381. package/lib/directions/shared/directions.service.d.ts +3 -1
  382. package/lib/directions/shared/directions.utils.d.ts +1 -1
  383. package/lib/download/download-button/download-button.component.d.ts +1 -1
  384. package/lib/download/download.module.d.ts +4 -6
  385. package/lib/download/shared/download.service.d.ts +1 -1
  386. package/lib/draw/draw/draw-layer-popup.component.d.ts +1 -1
  387. package/lib/draw/draw/draw-popup.component.d.ts +5 -5
  388. package/lib/draw/draw/draw-shorcuts.component.d.ts +1 -1
  389. package/lib/draw/draw/draw.component.d.ts +2 -2
  390. package/lib/draw/draw/draw.module.d.ts +2 -25
  391. package/lib/draw/drawingTool.module.d.ts +3 -0
  392. package/lib/draw/shared/draw-icon.service.d.ts +1 -1
  393. package/lib/feature/feature-details/feature-details.component.d.ts +7 -4
  394. package/lib/feature/feature-details/feature-details.directive.d.ts +1 -1
  395. package/lib/feature/feature-details/feature-details.module.d.ts +2 -6
  396. package/lib/feature/feature-details/index.d.ts +5 -0
  397. package/lib/feature/feature-form/feature-form.component.d.ts +2 -2
  398. package/lib/feature/feature-form/feature-form.module.d.ts +2 -4
  399. package/lib/feature/feature.module.d.ts +6 -4
  400. package/lib/feature/index.d.ts +3 -1
  401. package/lib/filter/filter.module.d.ts +4 -28
  402. package/lib/filter/index.d.ts +16 -0
  403. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +3 -3
  404. package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +3 -3
  405. package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +4 -4
  406. package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +1 -1
  407. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +2 -2
  408. package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +3 -3
  409. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +3 -3
  410. package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +1 -1
  411. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +3 -3
  412. package/lib/filter/shared/filterable-datasource.pipe.d.ts +1 -1
  413. package/lib/filter/shared/spatial-filter.service.d.ts +2 -1
  414. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +6 -5
  415. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +2 -2
  416. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +1 -1
  417. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  418. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +3 -3
  419. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  420. package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +1 -1
  421. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +1 -1
  422. package/lib/geo.module.d.ts +14 -24
  423. package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +1 -1
  424. package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +1 -1
  425. package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +2 -10
  426. package/lib/geometry/geometry-form-field/index.d.ts +5 -0
  427. package/lib/geometry/geometry.module.d.ts +5 -3
  428. package/lib/geometry/index.d.ts +1 -2
  429. package/lib/import-export/export-button/export-button.component.d.ts +1 -1
  430. package/lib/import-export/import-export/import-export.component.d.ts +5 -2
  431. package/lib/import-export/import-export.module.d.ts +4 -15
  432. package/lib/import-export/index.d.ts +4 -0
  433. package/lib/import-export/shared/drop-geo-file.directive.d.ts +3 -2
  434. package/lib/import-export/shared/export.service.d.ts +1 -1
  435. package/lib/import-export/shared/export.utils.d.ts +1 -1
  436. package/lib/import-export/shared/import.service.d.ts +1 -1
  437. package/lib/import-export/shared/import.utils.d.ts +1 -1
  438. package/lib/layer/index.d.ts +8 -0
  439. package/lib/layer/layer-item/layer-item.component.d.ts +2 -2
  440. package/lib/layer/layer-legend/layer-legend.component.d.ts +3 -2
  441. package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +2 -2
  442. package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +1 -1
  443. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +1 -1
  444. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +2 -2
  445. package/lib/layer/layer-list/layer-list.component.d.ts +1 -1
  446. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +1 -1
  447. package/lib/layer/layer.module.d.ts +4 -18
  448. package/lib/layer/shared/layer.service.d.ts +1 -1
  449. package/lib/layer/shared/layers/image-layer.d.ts +1 -1
  450. package/lib/layer/shared/layers/layer.d.ts +1 -1
  451. package/lib/layer/shared/layers/layer.interface.d.ts +1 -1
  452. package/lib/layer/shared/layers/tile-layer.d.ts +1 -1
  453. package/lib/layer/shared/layers/vector-layer.d.ts +1 -1
  454. package/lib/layer/shared/layers/vectortile-layer.d.ts +1 -1
  455. package/lib/layer/track-feature-button/track-feature-button.component.d.ts +1 -1
  456. package/lib/layer/utils/image-watcher.d.ts +1 -1
  457. package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +2 -2
  458. package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +1 -1
  459. package/lib/map/geolocate-button/geolocate-button.component.d.ts +2 -2
  460. package/lib/map/home-extent-button/home-extent-button.component.d.ts +2 -2
  461. package/lib/map/index.d.ts +14 -0
  462. package/lib/map/info-section/info-section.component.d.ts +1 -1
  463. package/lib/map/map-browser/map-browser.component.d.ts +2 -2
  464. package/lib/map/map-center/map-center.component.d.ts +1 -1
  465. package/lib/map/map.module.d.ts +4 -7
  466. package/lib/map/menu-button/menu-button.component.d.ts +2 -2
  467. package/lib/map/offline-button/offline-button.component.d.ts +2 -2
  468. package/lib/map/rotation-button/rotation-button.component.d.ts +1 -1
  469. package/lib/map/shared/controllers/geolocation.d.ts +2 -1
  470. package/lib/map/shared/hover-feature.directive.d.ts +2 -2
  471. package/lib/map/shared/map-pointer-position.directive.d.ts +2 -2
  472. package/lib/map/shared/map.d.ts +2 -1
  473. package/lib/map/shared/mapOffline.directive.d.ts +3 -2
  474. package/lib/map/shared/projection.service.d.ts +1 -1
  475. package/lib/map/swipe-control/swipe-control.component.d.ts +1 -1
  476. package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +2 -2
  477. package/lib/map/zoom-button/zoom-button.component.d.ts +1 -1
  478. package/lib/measure/index.d.ts +1 -2
  479. package/lib/measure/measure.module.d.ts +3 -0
  480. package/lib/measure/measurer/index.d.ts +5 -0
  481. package/lib/measure/measurer/measure-format.pipe.d.ts +1 -1
  482. package/lib/measure/measurer/measurer-dialog.component.d.ts +1 -1
  483. package/lib/measure/measurer/measurer-item.component.d.ts +1 -1
  484. package/lib/measure/measurer/measurer.component.d.ts +4 -4
  485. package/lib/measure/measurer/measurer.module.d.ts +3 -18
  486. package/lib/measure/shared/measure.utils.d.ts +1 -1
  487. package/lib/metadata/index.d.ts +2 -0
  488. package/lib/metadata/metadata-button/metadata-button.component.d.ts +2 -2
  489. package/lib/metadata/metadata.module.d.ts +4 -7
  490. package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +1 -1
  491. package/lib/offline/geoDB/geoDB.service.d.ts +2 -3
  492. package/lib/offline/shared/geo-network.service.d.ts +1 -1
  493. package/lib/overlay/overlay.module.d.ts +4 -1
  494. package/lib/overlay/shared/overlay.directive.d.ts +1 -1
  495. package/lib/print/print/print.component.d.ts +1 -1
  496. package/lib/print/print-form/print-form.component.d.ts +2 -2
  497. package/lib/print/print.module.d.ts +4 -12
  498. package/lib/print/shared/print.service.d.ts +4 -1
  499. package/lib/query/query.module.d.ts +4 -4
  500. package/lib/query/shared/query-search-source.providers.d.ts +1 -1
  501. package/lib/query/shared/query.directive.d.ts +1 -1
  502. package/lib/query/shared/query.service.d.ts +2 -3
  503. package/lib/search/index.d.ts +6 -4
  504. package/lib/search/search-bar/search-bar.component.d.ts +2 -2
  505. package/lib/search/search-bar/search-bar.module.d.ts +2 -16
  506. package/lib/search/search-results/index.d.ts +6 -0
  507. package/lib/search/search-results/save-feature-dialog.component.d.ts +2 -2
  508. package/lib/search/search-results/search-results-add-button.component.d.ts +2 -2
  509. package/lib/search/search-results/search-results-item.component.d.ts +1 -1
  510. package/lib/search/search-results/search-results.component.d.ts +2 -2
  511. package/lib/search/search-results/search-results.module.d.ts +3 -21
  512. package/lib/search/search-selector/search-selector.component.d.ts +1 -1
  513. package/lib/search/search-selector/search-selector.module.d.ts +2 -11
  514. package/lib/search/search-settings/search-settings.component.d.ts +3 -2
  515. package/lib/search/search-settings/search-settings.module.d.ts +2 -12
  516. package/lib/search/search.module.d.ts +6 -7
  517. package/lib/search/shared/search-pointer-summary.directive.d.ts +2 -2
  518. package/lib/search/shared/search.service.d.ts +1 -1
  519. package/lib/search/shared/sources/cadastre.d.ts +2 -1
  520. package/lib/search/shared/sources/cadastre.providers.d.ts +4 -2
  521. package/lib/search/shared/sources/coordinates.d.ts +2 -1
  522. package/lib/search/shared/sources/coordinates.providers.d.ts +4 -2
  523. package/lib/search/shared/sources/icherche.d.ts +2 -1
  524. package/lib/search/shared/sources/icherche.providers.d.ts +5 -3
  525. package/lib/search/shared/sources/ilayer.d.ts +2 -1
  526. package/lib/search/shared/sources/ilayer.providers.d.ts +4 -2
  527. package/lib/search/shared/sources/nominatim.d.ts +1 -1
  528. package/lib/search/shared/sources/nominatim.providers.d.ts +3 -2
  529. package/lib/search/shared/sources/source.d.ts +1 -1
  530. package/lib/search/shared/sources/storedqueries.d.ts +2 -1
  531. package/lib/search/shared/sources/storedqueries.providers.d.ts +5 -3
  532. package/lib/search/shared/sources/workspace.d.ts +2 -1
  533. package/lib/search/shared/sources/workspace.providers.d.ts +4 -2
  534. package/lib/style/style-modal/drawing/style-modal-drawing.component.d.ts +1 -1
  535. package/lib/style/style-modal/layer/style-modal-layer.component.d.ts +1 -1
  536. package/lib/style/style-modal/layer-button/style-modal-layer-button.component.d.ts +1 -1
  537. package/lib/style/style.module.d.ts +5 -16
  538. package/lib/toast/toast.component.d.ts +1 -1
  539. package/lib/toast/toast.module.d.ts +4 -6
  540. package/lib/utils/propertyTypeDetector/propertyTypeDetector.service.d.ts +1 -1
  541. package/lib/wkt/wkt.module.d.ts +3 -0
  542. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +2 -2
  543. package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +2 -6
  544. package/lib/workspace/shared/edition-workspace.d.ts +1 -1
  545. package/lib/workspace/shared/edition-workspace.service.d.ts +3 -1
  546. package/lib/workspace/shared/feature-workspace.service.d.ts +2 -1
  547. package/lib/workspace/shared/wfs-workspace.service.d.ts +2 -1
  548. package/lib/workspace/shared/wms-workspace.service.d.ts +2 -1
  549. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  550. package/lib/workspace/widgets/ogc-filter/ogc-filter.module.d.ts +2 -6
  551. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +1 -1
  552. package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +2 -3
  553. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +1 -1
  554. package/lib/workspace/workspace-updator/workspace-updator.module.d.ts +2 -3
  555. package/lib/workspace/workspace.module.d.ts +5 -9
  556. package/locale/en.geo.json +3 -3
  557. package/locale/fr.geo.json +3 -3
  558. package/package.json +14 -12
  559. package/public_api.d.ts +10 -11
  560. package/src/geo-theme.scss +23 -23
  561. package/src/lib/filter/filter.theming.scss +13 -13
  562. package/src/lib/filter/ogc-filter-selection/ogc-filter-selection.theming.scss +18 -18
  563. package/src/lib/filter/time-filter-form/time-filter-form.theming.scss +5 -5
  564. package/src/lib/layer/layer-item/layer-item.theme.scss +33 -33
  565. package/src/lib/layer/layer-legend/layer-legend.theming.scss +10 -10
  566. package/src/lib/layer/layer-list-tool/layer-list-tool.theming.scss +34 -34
  567. package/src/lib/layer/layer.theming.scss +10 -10
  568. package/src/lib/map/map-browser/map-browser.theming.scss +46 -46
  569. package/src/lib/map/map.theming.scss +9 -9
  570. package/src/lib/map/menu-button/menu-button.theming.scss +20 -20
  571. package/src/lib/map/zoom-button/zoom-button.theming.scss +32 -32
  572. package/src/style/style.scss +1 -1
  573. package/esm2022/lib/datasource/datasource.module.mjs +0 -22
  574. package/esm2022/lib/search/search-bar/search-url-param.directive.mjs +0 -40
  575. package/lib/datasource/datasource.module.d.ts +0 -8
  576. package/lib/search/search-bar/search-url-param.directive.d.ts +0 -13
@@ -1,23 +1,34 @@
1
+ import { NgFor, NgIf } from '@angular/common';
1
2
  import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { UntypedFormControl } from '@angular/forms';
3
+ import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
4
+ import { provideMomentDateAdapter } from '@angular/material-moment-adapter';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { MatOptionModule } from '@angular/material/core';
7
+ import { MatDatepickerModule } from '@angular/material/datepicker';
8
+ import { MatFormFieldModule } from '@angular/material/form-field';
9
+ import { MatIconModule } from '@angular/material/icon';
10
+ import { MatInputModule } from '@angular/material/input';
11
+ import { MatSelectModule } from '@angular/material/select';
12
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
13
+ import { MatTooltipModule } from '@angular/material/tooltip';
14
+ import { TranslateModule } from '@ngx-translate/core';
3
15
  import { default as moment } from 'moment';
4
16
  import { OgcFilterOperator } from '../../filter/shared/ogc-filter.enum';
5
17
  import { OGCFilterTimeService } from '../shared/ogc-filter-time.service';
18
+ import { OgcFilterTimeSliderComponent } from './ogc-filter-time-slider.component';
6
19
  import * as i0 from "@angular/core";
7
20
  import * as i1 from "../shared/ogc-filter-time.service";
8
- import * as i2 from "@angular/common";
21
+ import * as i2 from "@angular/material/slide-toggle";
9
22
  import * as i3 from "@angular/forms";
10
- import * as i4 from "@angular/material/core";
11
- import * as i5 from "@angular/material/icon";
12
- import * as i6 from "@angular/material/button";
13
- import * as i7 from "@angular/material/slide-toggle";
14
- import * as i8 from "@angular/material/form-field";
15
- import * as i9 from "@angular/material/input";
23
+ import * as i4 from "@angular/material/form-field";
24
+ import * as i5 from "@angular/material/input";
25
+ import * as i6 from "@angular/material/datepicker";
26
+ import * as i7 from "@angular/material/button";
27
+ import * as i8 from "@angular/material/tooltip";
28
+ import * as i9 from "@angular/material/icon";
16
29
  import * as i10 from "@angular/material/select";
17
- import * as i11 from "@angular/material/tooltip";
18
- import * as i12 from "@angular/material/datepicker";
19
- import * as i13 from "./ogc-filter-time-slider.component";
20
- import * as i14 from "@ngx-translate/core";
30
+ import * as i11 from "@angular/material/core";
31
+ import * as i12 from "@ngx-translate/core";
21
32
  export class OgcFilterTimeComponent {
22
33
  ogcFilterTimeService;
23
34
  datasource;
@@ -612,13 +623,29 @@ export class OgcFilterTimeComponent {
612
623
  isValidDate(date) {
613
624
  return date instanceof Date && !isNaN(date.getTime());
614
625
  }
615
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OgcFilterTimeComponent, deps: [{ token: i1.OGCFilterTimeService }], target: i0.ɵɵFactoryTarget.Component });
616
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OgcFilterTimeComponent, selector: "igo-ogc-filter-time", inputs: { datasource: "datasource", currentFilter: "currentFilter" }, outputs: { changeProperty: "changeProperty" }, viewQueries: [{ propertyName: "endDatepickerTime", first: true, predicate: ["endDatepickerTime"], descendants: true }, { propertyName: "beginDatepickerTime", first: true, predicate: ["beginDatepickerTime"], descendants: true }, { propertyName: "beginTime", first: true, predicate: ["beginTime"], descendants: true }, { propertyName: "endTime", first: true, predicate: ["endTime"], descendants: true }], ngImport: i0, template: "<div class=\"datetime-container\">\r\n <mat-slide-toggle\r\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\r\n [(ngModel)]=\"sliderMode\"\r\n (change)=\"modeChange($event)\"\r\n >\r\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\r\n </mat-slide-toggle>\r\n\r\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\r\n <igo-ogc-filter-time-slider\r\n [begin]=\"beginValue\"\r\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\r\n [currentFilter]=\"currentFilter\"\r\n [datasource]=\"datasource\"\r\n (changeProperty)=\"changePropertyByPass($event)\"\r\n >\r\n </igo-ogc-filter-time-slider>\r\n </div>\r\n\r\n <div *ngIf=\"!sliderMode\">\r\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\r\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \r\n with the datepicker -->\r\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\r\n <input\r\n matInput\r\n class=\"year-input-only-year\"\r\n value=\"{{ onlyYearBegin }}\"\r\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"beginDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n\r\n <mat-datepicker\r\n panelClass=\"datepicker-year\"\r\n #beginDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"beginValue\"\r\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\r\n >\r\n </mat-datepicker>\r\n\r\n <input\r\n #beginYear\r\n class=\"year-input-hide\"\r\n matInput\r\n [matDatepicker]=\"beginDatepicker\"\r\n enabled=\"false\"\r\n readonly=\"true\"\r\n [value]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [min]=\"handleDate(datasource.options.minDate)\"\r\n [max]=\"\r\n endValue && !restrictedToStep()\r\n ? endValue\r\n : handleDate(datasource.options.maxDate)\r\n \"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\r\n <input\r\n matInput\r\n class=\"year-input-only-year\"\r\n value=\"{{ onlyYearEnd }}\"\r\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"endDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n panelClass=\"datepicker-year\"\r\n #endDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"endValue\"\r\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\r\n >\r\n </mat-datepicker>\r\n\r\n <input\r\n #endYear\r\n class=\"year-input-hide\"\r\n matInput\r\n [matDatepicker]=\"endDatepicker\"\r\n enabled=\"false\"\r\n readonly=\"true\"\r\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\r\n [min]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [max]=\"handleDate(datasource.options.maxDate)\"\r\n />\r\n </mat-form-field>\r\n <div class=\"actions-container\">\r\n <button\r\n class=\"reset-button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"resetFilter()\"\r\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\r\n [disabled]=\"filterStateDisable\"\r\n >\r\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\r\n </button>\r\n <mat-slide-toggle\r\n class=\"toggle-filter-state\"\r\n (change)=\"toggleFilterState()\"\r\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [checked]=\"!filterStateDisable\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n </div>\r\n\r\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\r\n <div class=\"datetime-input\">\r\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"beginDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n #begin\r\n matInput\r\n [matDatepicker]=\"beginDatepicker\"\r\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n [matDatepickerFilter]=\"filterBeginFunction\"\r\n [value]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [min]=\"handleDate(datasource.options.minDate)\"\r\n [max]=\"\r\n endValue && !restrictedToStep()\r\n ? endValue\r\n : handleDate(datasource.options.maxDate)\r\n \"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <span class=\"filler\"></span>\r\n <mat-datepicker\r\n #beginDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"beginValue\"\r\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\r\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\r\n >\r\n </mat-datepicker>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\r\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"beginHourFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n >\r\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\r\n hour\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"beginMinuteFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let minute of beginMinutes\"\r\n [value]=\"minute\"\r\n >{{ minute }}</mat-option\r\n >\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\r\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"endDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n #end\r\n matInput\r\n [matDatepicker]=\"endDatepicker\"\r\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\r\n [matDatepickerFilter]=\"filterEndFunction\"\r\n [value]=\"\r\n endValue ? endValue : handleDate(datasource.options.maxDate)\r\n \"\r\n [min]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [max]=\"handleDate(datasource.options.maxDate)\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <span class=\"filler\"></span>\r\n <mat-datepicker\r\n #endDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"endValue\"\r\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\r\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\r\n >\r\n </mat-datepicker>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\r\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"endHourFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\r\n >\r\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\r\n hour\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"endMinuteFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\r\n >\r\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\r\n minute\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions-container\">\r\n <button\r\n class=\"reset-button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"resetFilter()\"\r\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\r\n [disabled]=\"filterStateDisable\"\r\n >\r\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\r\n </button>\r\n <mat-slide-toggle\r\n class=\"toggle-filter-state\"\r\n (change)=\"toggleFilterState()\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\r\n [checked]=\"!filterStateDisable\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.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: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i12.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i12.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i13.OgcFilterTimeSliderComponent, selector: "igo-ogc-filter-time-slider", inputs: ["currentFilter", "begin", "max", "datasource"], outputs: ["changeProperty"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] });
626
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: OgcFilterTimeComponent, deps: [{ token: i1.OGCFilterTimeService }], target: i0.ɵɵFactoryTarget.Component });
627
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: OgcFilterTimeComponent, isStandalone: true, selector: "igo-ogc-filter-time", inputs: { datasource: "datasource", currentFilter: "currentFilter" }, outputs: { changeProperty: "changeProperty" }, providers: [OGCFilterTimeService, provideMomentDateAdapter()], viewQueries: [{ propertyName: "endDatepickerTime", first: true, predicate: ["endDatepickerTime"], descendants: true }, { propertyName: "beginDatepickerTime", first: true, predicate: ["beginDatepickerTime"], descendants: true }, { propertyName: "beginTime", first: true, predicate: ["beginTime"], descendants: true }, { propertyName: "endTime", first: true, predicate: ["endTime"], descendants: true }], ngImport: i0, template: "<div class=\"datetime-container\">\n <mat-slide-toggle\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\n [(ngModel)]=\"sliderMode\"\n (change)=\"modeChange($event)\"\n >\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\n </mat-slide-toggle>\n\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\n <igo-ogc-filter-time-slider\n [begin]=\"beginValue\"\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\n [currentFilter]=\"currentFilter\"\n [datasource]=\"datasource\"\n (changeProperty)=\"changePropertyByPass($event)\"\n >\n </igo-ogc-filter-time-slider>\n </div>\n\n <div *ngIf=\"!sliderMode\">\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \n with the datepicker -->\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearBegin }}\"\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n\n <input\n #beginYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"beginDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n />\n </mat-form-field>\n\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearEnd }}\"\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n\n <input\n #endYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"endDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n />\n </mat-form-field>\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\n <div class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #begin\n matInput\n [matDatepicker]=\"beginDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\n [matDatepickerFilter]=\"filterBeginFunction\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option\n *ngFor=\"let minute of beginMinutes\"\n [value]=\"minute\"\n >{{ minute }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #end\n matInput\n [matDatepicker]=\"endDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\n [matDatepickerFilter]=\"filterEndFunction\"\n [value]=\"\n endValue ? endValue : handleDate(datasource.options.maxDate)\n \"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\n minute\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2.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: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: OgcFilterTimeSliderComponent, selector: "igo-ogc-filter-time-slider", inputs: ["currentFilter", "begin", "max", "datasource"], outputs: ["changeProperty"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.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: MatDatepickerModule }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.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: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
617
628
  }
618
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OgcFilterTimeComponent, decorators: [{
629
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: OgcFilterTimeComponent, decorators: [{
619
630
  type: Component,
620
- args: [{ selector: 'igo-ogc-filter-time', template: "<div class=\"datetime-container\">\r\n <mat-slide-toggle\r\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\r\n [(ngModel)]=\"sliderMode\"\r\n (change)=\"modeChange($event)\"\r\n >\r\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\r\n </mat-slide-toggle>\r\n\r\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\r\n <igo-ogc-filter-time-slider\r\n [begin]=\"beginValue\"\r\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\r\n [currentFilter]=\"currentFilter\"\r\n [datasource]=\"datasource\"\r\n (changeProperty)=\"changePropertyByPass($event)\"\r\n >\r\n </igo-ogc-filter-time-slider>\r\n </div>\r\n\r\n <div *ngIf=\"!sliderMode\">\r\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\r\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \r\n with the datepicker -->\r\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\r\n <input\r\n matInput\r\n class=\"year-input-only-year\"\r\n value=\"{{ onlyYearBegin }}\"\r\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"beginDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n\r\n <mat-datepicker\r\n panelClass=\"datepicker-year\"\r\n #beginDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"beginValue\"\r\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\r\n >\r\n </mat-datepicker>\r\n\r\n <input\r\n #beginYear\r\n class=\"year-input-hide\"\r\n matInput\r\n [matDatepicker]=\"beginDatepicker\"\r\n enabled=\"false\"\r\n readonly=\"true\"\r\n [value]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [min]=\"handleDate(datasource.options.minDate)\"\r\n [max]=\"\r\n endValue && !restrictedToStep()\r\n ? endValue\r\n : handleDate(datasource.options.maxDate)\r\n \"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\r\n <input\r\n matInput\r\n class=\"year-input-only-year\"\r\n value=\"{{ onlyYearEnd }}\"\r\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"endDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <mat-datepicker\r\n panelClass=\"datepicker-year\"\r\n #endDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"endValue\"\r\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\r\n >\r\n </mat-datepicker>\r\n\r\n <input\r\n #endYear\r\n class=\"year-input-hide\"\r\n matInput\r\n [matDatepicker]=\"endDatepicker\"\r\n enabled=\"false\"\r\n readonly=\"true\"\r\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\r\n [min]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [max]=\"handleDate(datasource.options.maxDate)\"\r\n />\r\n </mat-form-field>\r\n <div class=\"actions-container\">\r\n <button\r\n class=\"reset-button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"resetFilter()\"\r\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\r\n [disabled]=\"filterStateDisable\"\r\n >\r\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\r\n </button>\r\n <mat-slide-toggle\r\n class=\"toggle-filter-state\"\r\n (change)=\"toggleFilterState()\"\r\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [checked]=\"!filterStateDisable\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n </div>\r\n\r\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\r\n <div class=\"datetime-input\">\r\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"beginDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n #begin\r\n matInput\r\n [matDatepicker]=\"beginDatepicker\"\r\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n [matDatepickerFilter]=\"filterBeginFunction\"\r\n [value]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [min]=\"handleDate(datasource.options.minDate)\"\r\n [max]=\"\r\n endValue && !restrictedToStep()\r\n ? endValue\r\n : handleDate(datasource.options.maxDate)\r\n \"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <span class=\"filler\"></span>\r\n <mat-datepicker\r\n #beginDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"beginValue\"\r\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\r\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\r\n >\r\n </mat-datepicker>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\r\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"beginHourFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n >\r\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\r\n hour\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"beginMinuteFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\r\n >\r\n <mat-option\r\n *ngFor=\"let minute of beginMinutes\"\r\n [value]=\"minute\"\r\n >{{ minute }}</mat-option\r\n >\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\r\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"endDatepicker\"\r\n [disabled]=\"filterStateDisable\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n #end\r\n matInput\r\n [matDatepicker]=\"endDatepicker\"\r\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\r\n [matDatepickerFilter]=\"filterEndFunction\"\r\n [value]=\"\r\n endValue ? endValue : handleDate(datasource.options.maxDate)\r\n \"\r\n [min]=\"\r\n beginValue ? beginValue : handleDate(datasource.options.minDate)\r\n \"\r\n [max]=\"handleDate(datasource.options.maxDate)\"\r\n [disabled]=\"filterStateDisable\"\r\n />\r\n <span class=\"filler\"></span>\r\n <mat-datepicker\r\n #endDatepicker\r\n [startView]=\"calendarView()\"\r\n [startAt]=\"endValue\"\r\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\r\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\r\n >\r\n </mat-datepicker>\r\n </mat-form-field>\r\n\r\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\r\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"endHourFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\r\n >\r\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\r\n hour\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\r\n <mat-select\r\n [formControl]=\"endMinuteFormControl\"\r\n [attr.disabled]=\"!currentFilter.active\"\r\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\r\n >\r\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\r\n minute\r\n }}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions-container\">\r\n <button\r\n class=\"reset-button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"resetFilter()\"\r\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\r\n [disabled]=\"filterStateDisable\"\r\n >\r\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\r\n </button>\r\n <mat-slide-toggle\r\n class=\"toggle-filter-state\"\r\n (change)=\"toggleFilterState()\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\r\n [checked]=\"!filterStateDisable\"\r\n >\r\n </mat-slide-toggle>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"] }]
621
- }], ctorParameters: function () { return [{ type: i1.OGCFilterTimeService }]; }, propDecorators: { datasource: [{
631
+ args: [{ selector: 'igo-ogc-filter-time', standalone: true, imports: [
632
+ NgIf,
633
+ MatSlideToggleModule,
634
+ FormsModule,
635
+ OgcFilterTimeSliderComponent,
636
+ MatFormFieldModule,
637
+ MatInputModule,
638
+ MatDatepickerModule,
639
+ MatButtonModule,
640
+ MatTooltipModule,
641
+ MatIconModule,
642
+ MatSelectModule,
643
+ ReactiveFormsModule,
644
+ NgFor,
645
+ MatOptionModule,
646
+ TranslateModule
647
+ ], providers: [OGCFilterTimeService, provideMomentDateAdapter()], template: "<div class=\"datetime-container\">\n <mat-slide-toggle\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\n [(ngModel)]=\"sliderMode\"\n (change)=\"modeChange($event)\"\n >\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\n </mat-slide-toggle>\n\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\n <igo-ogc-filter-time-slider\n [begin]=\"beginValue\"\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\n [currentFilter]=\"currentFilter\"\n [datasource]=\"datasource\"\n (changeProperty)=\"changePropertyByPass($event)\"\n >\n </igo-ogc-filter-time-slider>\n </div>\n\n <div *ngIf=\"!sliderMode\">\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \n with the datepicker -->\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearBegin }}\"\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n\n <input\n #beginYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"beginDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n />\n </mat-form-field>\n\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearEnd }}\"\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n\n <input\n #endYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"endDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n />\n </mat-form-field>\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\n <div class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #begin\n matInput\n [matDatepicker]=\"beginDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\n [matDatepickerFilter]=\"filterBeginFunction\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option\n *ngFor=\"let minute of beginMinutes\"\n [value]=\"minute\"\n >{{ minute }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #end\n matInput\n [matDatepicker]=\"endDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\n [matDatepickerFilter]=\"filterEndFunction\"\n [value]=\"\n endValue ? endValue : handleDate(datasource.options.maxDate)\n \"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\n minute\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon svgIcon=\"{{ resetIcon }}\"></mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"] }]
648
+ }], ctorParameters: () => [{ type: i1.OGCFilterTimeService }], propDecorators: { datasource: [{
622
649
  type: Input
623
650
  }], currentFilter: [{
624
651
  type: Input
@@ -637,4 +664,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
637
664
  type: ViewChild,
638
665
  args: ['endTime']
639
666
  }] } });
640
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVl6RSxNQUFNLE9BQU8sc0JBQXNCO0lBd0ZkO0lBdkZWLFVBQVUsQ0FBMEI7SUFDcEMsYUFBYSxDQUFNO0lBQ2xCLGNBQWMsR0FJbkIsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUU3QixVQUFVLENBQVc7SUFDckIsUUFBUSxDQUFXO0lBQ25CLFlBQVksQ0FBVztJQUN2QixVQUFVLENBQVc7SUFDckIsb0JBQW9CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0lBQ2hELHNCQUFzQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUNsRCxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDOUMsb0JBQW9CLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxD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TUFBTSxHQUFHLEtBQUssQ0FBQztTQUNuQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBVTtRQUM1QixPQUFPLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQzt3R0FydEJVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLG1rQkMxQm5DLG1tV0EwUkE7OzRGRGhRYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UscUJBQXFCOzJHQUt0QixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFnQ3lCLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0ksbUJBQW1CO3NCQUFwRCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDUixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0EsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgZGVmYXVsdCBhcyBtb21lbnQgfSBmcm9tICdtb21lbnQnO1xyXG5cclxuaW1wb3J0IHsgT2djRmlsdGVyT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9maWx0ZXIvc2hhcmVkL29nYy1maWx0ZXIuZW51bSc7XHJcbmltcG9ydCB7IE9HQ0ZpbHRlclRpbWVTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL29nYy1maWx0ZXItdGltZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBPZ2NGaWx0ZXJEdXJpbmdPcHRpb25zLFxyXG4gIE9nY0ZpbHRlcmFibGVEYXRhU291cmNlLFxyXG4gIE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xyXG59IGZyb20gJy4uL3NoYXJlZC9vZ2MtZmlsdGVyLmludGVyZmFjZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1vZ2MtZmlsdGVyLXRpbWUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vZ2MtZmlsdGVyLXRpbWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL29nYy1maWx0ZXItdGltZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPZ2NGaWx0ZXJUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBkYXRhc291cmNlOiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZTtcclxuICBASW5wdXQoKSBjdXJyZW50RmlsdGVyOiBhbnk7XHJcbiAgQE91dHB1dCgpIGNoYW5nZVByb3BlcnR5OiBFdmVudEVtaXR0ZXI8e1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICAgIHBvczogbnVtYmVyO1xyXG4gICAgcmVmcmVzaEZpbHRlcjogYm9vbGVhbjtcclxuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBiZWdpbkhvdXJzOiBudW1iZXJbXTtcclxuICBlbmRIb3VyczogbnVtYmVyW107XHJcbiAgYmVnaW5NaW51dGVzOiBudW1iZXJbXTtcclxuICBlbmRNaW51dGVzOiBudW1iZXJbXTtcclxuICBiZWdpbkhvdXJGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBiZWdpbk1pbnV0ZUZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIGVuZEhvdXJGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBlbmRNaW51dGVGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBfYmVnaW5WYWx1ZTogRGF0ZTtcclxuICBfZW5kVmFsdWU6IERhdGU7XHJcbiAgcmVhZG9ubHkgX2RlZmF1bHRNaW46IHN0cmluZyA9ICcxOTAwLTAxLTAxJztcclxuICByZWFkb25seSBfZGVmYXVsdE1heDogc3RyaW5nID0gJzIwNTItMDEtMDYnO1xyXG4gIHJlYWRvbmx5IF9kZWZhdWx0RGlzcGxheUZvcm1hdDogc3RyaW5nID0gJ0REL01NL1lZWVkgSEg6bW0gQSc7XHJcbiAgcmVhZG9ubHkgX2RlZmF1bHRTbGlkZXJNb2RlRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgb2djRmlsdGVyT3BlcmF0b3IgPSBPZ2NGaWx0ZXJPcGVyYXRvcjtcclxuICBwdWJsaWMgc2xpZGVyTW9kZSA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBkZWZhdWx0U3RlcE1pbGxpc2Vjb25kID0gNjAwMDA7XHJcbiAgcHVibGljIG9wdGlvbnM6IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9ucztcclxuXHJcbiAgcHVibGljIG9ubHlZZWFyQmVnaW46IG51bWJlcjtcclxuICBwdWJsaWMgb25seVllYXJFbmQ6IG51bWJlcjtcclxuICBwdWJsaWMgY2FsZW5kYXJUeXBlWWVhciA9IGZhbHNlO1xyXG4gIHB1YmxpYyByZXNldEljb24gPSAncmVwbGF5JztcclxuICBwdWJsaWMgZmlsdGVyU3RhdGVEaXNhYmxlOiBib29sZWFuO1xyXG5cclxuICBAVmlld0NoaWxkKCdlbmREYXRlcGlja2VyVGltZScpIGVuZERhdGVwaWNrZXJUaW1lOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2JlZ2luRGF0ZXBpY2tlclRpbWUnKSBiZWdpbkRhdGVwaWNrZXJUaW1lOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2JlZ2luVGltZScpIGJlZ2luVGltZTogSFRNTElucHV0RWxlbWVudDtcclxuICBAVmlld0NoaWxkKCdlbmRUaW1lJykgZW5kVGltZTogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgZ2V0IHN0ZXAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5zdGVwRGF0ZVxyXG4gICAgICA/IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLnN0ZXBEYXRlXHJcbiAgICAgIDogdGhpcy5jdXJyZW50RmlsdGVyLnN0ZXA7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RlcE1pbGxpc2Vjb25kcygpOiBudW1iZXIge1xyXG4gICAgY29uc3Qgc3RlcCA9IG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzTWlsbGlzZWNvbmRzKCk7XHJcbiAgICByZXR1cm4gc3RlcCA9PT0gMCA/IHRoaXMuZGVmYXVsdFN0ZXBNaWxsaXNlY29uZCA6IHN0ZXA7XHJcbiAgfVxyXG5cclxuICBzZXQgYmVnaW5WYWx1ZShiZWdpbjogRGF0ZSkge1xyXG4gICAgdGhpcy5fYmVnaW5WYWx1ZSA9IGJlZ2luO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJlZ2luVmFsdWUoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmVnaW5WYWx1ZTtcclxuICB9XHJcblxyXG4gIHNldCBlbmRWYWx1ZShlbmQ6IERhdGUpIHtcclxuICAgIHRoaXMuX2VuZFZhbHVlID0gZW5kO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVuZFZhbHVlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNsaWRlckludGVydmFsKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlckludGVydmFsID09PSB1bmRlZmluZWRcclxuICAgICAgPyAyMDAwXHJcbiAgICAgIDogdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlckludGVydmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1heERhdGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlXHJcbiAgICAgID8gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRNYXg7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheUZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlci5kaXNwbGF5Rm9ybWF0XHJcbiAgICAgID8gdGhpcy5jdXJyZW50RmlsdGVyLmRpc3BsYXlGb3JtYXRcclxuICAgICAgOiB0aGlzLl9kZWZhdWx0RGlzcGxheUZvcm1hdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJCZWdpbkZ1bmN0aW9uO1xyXG4gIHB1YmxpYyBmaWx0ZXJFbmRGdW5jdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIG9nY0ZpbHRlclRpbWVTZXJ2aWNlOiBPR0NGaWx0ZXJUaW1lU2VydmljZSkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlck9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlck9wdGlvbnMuZW5hYmxlZCA9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlck9wdGlvbnMuZW5hYmxlZCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5zbGlkZXJPcHRpb25zLmVuYWJsZWRcclxuICAgICAgICAgIDogdGhpcy5fZGVmYXVsdFNsaWRlck1vZGVFbmFibGVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iZWdpblZhbHVlID0gdGhpcy5wYXJzZUZpbHRlcih0aGlzLmhhbmRsZU1pbigpKTtcclxuICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnBhcnNlRmlsdGVyKHRoaXMuaGFuZGxlTWF4KCkpO1xyXG5cclxuICAgIHRoaXMub25seVllYXJCZWdpbiA9IHRoaXMuYmVnaW5WYWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5vbmx5WWVhckVuZCA9IHRoaXMuZW5kVmFsdWUuZ2V0VVRDRnVsbFllYXIoKTtcclxuICAgIHRoaXMuY2FsZW5kYXJUeXBlWWVhciA9IHRoaXMuaXNDYWxlbmRhclllYXJNb2RlKCk7XHJcbiAgICB0aGlzLnNldEZpbHRlclN0YXRlRGlzYWJsZSgpO1xyXG4gICAgdGhpcy51cGRhdGVIb3Vyc01pbnV0ZXNBcnJheSgpO1xyXG4gICAgLy8gdXBkYXRlIHZhbHVlIGZvciBub3cgdmFsdWVcclxuICAgIHRoaXMudXBkYXRlVmFsdWVzKCk7XHJcbiAgICB0aGlzLmRhdGVGaWx0ZXIodGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uLCAnYmVnaW4nKTtcclxuICAgIHRoaXMuZGF0ZUZpbHRlcih0aGlzLmZpbHRlckVuZEZ1bmN0aW9uLCAnZW5kJyk7XHJcbiAgfVxyXG5cclxuICBwYXJzZUZpbHRlcihmaWx0ZXIpOiBEYXRlIHtcclxuICAgIGlmICghZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xyXG4gICAgfSBlbHNlIGlmIChpc05hTihuZXcgRGF0ZShmaWx0ZXIpLmdldFRpbWUoKSkpIHtcclxuICAgICAgaWYgKGZpbHRlci5zZWFyY2goJ25vdycpID49IDApIHtcclxuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGZpbHRlci5tYXRjaCgveWVhcnN8bW9udGhzfHdlZWtzfGRheXN8aG91cnN8c2Vjb25kcy8pO1xyXG4gICAgICAgIGlmIChmaWx0ZXIubWF0Y2goL1xcKy8pKSB7XHJcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbEludCA9IHBhcnNlSW50KFxyXG4gICAgICAgICAgICBmaWx0ZXIuc3Vic3RyaW5nKGZpbHRlci5zZWFyY2goJysnKSArIDEsIGludGVydmFsLmluZGV4KSxcclxuICAgICAgICAgICAgMTBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gbW9tZW50KCkuYWRkKGludGVydmFsSW50LCBpbnRlcnZhbFswXSkudG9EYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIubWF0Y2goL1xcLS8pKSB7XHJcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbEludCA9IHBhcnNlSW50KFxyXG4gICAgICAgICAgICBmaWx0ZXIuc3Vic3RyaW5nKGZpbHRlci5zZWFyY2goJy0nKSArIDEsIGludGVydmFsLmluZGV4KSxcclxuICAgICAgICAgICAgMTBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gbW9tZW50KCkuc3VidHJhY3QoaW50ZXJ2YWxJbnQsIGludGVydmFsWzBdKS50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbHRlci5zZWFyY2goJ3RvZGF5JykgPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IF9ub3cgPSBtb21lbnQoKS5lbmRPZignZGF5JykudG9EYXRlKCk7XHJcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBmaWx0ZXIubWF0Y2goL3llYXJzfG1vbnRoc3x3ZWVrc3xkYXlzfGhvdXJzfHNlY29uZHMvKTtcclxuICAgICAgICBpZiAoZmlsdGVyLm1hdGNoKC9cXCsvKSkge1xyXG4gICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbnQgPSBwYXJzZUludChcclxuICAgICAgICAgICAgZmlsdGVyLnN1YnN0cmluZyhmaWx0ZXIuc2VhcmNoKCcrJykgKyAxLCBpbnRlcnZhbC5pbmRleCksXHJcbiAgICAgICAgICAgIDEwXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIG1vbWVudChfbm93KS5hZGQoaW50ZXJ2YWxJbnQsIGludGVydmFsWzBdKS50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5tYXRjaCgvXFwtLykpIHtcclxuICAgICAgICAgIGNvbnN0IGludGVydmFsSW50ID0gcGFyc2VJbnQoXHJcbiAgICAgICAgICAgIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLnNlYXJjaCgnLScpICsgMSwgaW50ZXJ2YWwuaW5kZXgpLFxyXG4gICAgICAgICAgICAxMFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBtb21lbnQoX25vdykuc3VidHJhY3QoaW50ZXJ2YWxJbnQsIGludGVydmFsWzBdKS50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9ub3c7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLmNhbGVuZGFyTW9kZVllYXIpIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZShmaWx0ZXIpO1xyXG4gICAgICByZXR1cm4gZGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIgPyBuZXcgRGF0ZShmaWx0ZXIpIDogbmV3IERhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZVRlbXBvcmFsUHJvcGVydHkodmFsdWUsIHBvc2l0aW9uPywgcmVmcmVzaEZpbHRlciA9IHRydWUpIHtcclxuICAgIGlmICghdGhpcy5pc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbHVlVG1wID0gdGhpcy5nZXREYXRlVGltZSh2YWx1ZSwgcG9zaXRpb24pO1xyXG4gICAgaWYgKHRoaXMuaXNDYWxlbmRhclllYXJNb2RlKCkpIHtcclxuICAgICAgbGV0IGRhdGVTdHJpbmdGcm9tWWVhck5vdGltZTtcclxuICAgICAgaWYgKHBvc2l0aW9uID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5iZWdpblZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vbmx5WWVhckJlZ2luID0gdGhpcy5iZWdpblZhbHVlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgZGF0ZVN0cmluZ0Zyb21ZZWFyTm90aW1lID0gYCR7dGhpcy5vbmx5WWVhckJlZ2lufS0wMS0wMWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMub25seVllYXJFbmQgPSB0aGlzLmVuZFZhbHVlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgZGF0ZVN0cmluZ0Zyb21ZZWFyTm90aW1lID0gYCR7dGhpcy5vbmx5WWVhckVuZH0tMDEtMDFgO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNhbGwgc2VydmljZSB3aXRoIHN0cmluZyBkYXRlIHdpdGhvdXQgdGltZVxyXG4gICAgICB0aGlzLmNoYW5nZVByb3BlcnR5Lm5leHQoe1xyXG4gICAgICAgIHZhbHVlOiBkYXRlU3RyaW5nRnJvbVllYXJOb3RpbWUsXHJcbiAgICAgICAgcG9zOiBwb3NpdGlvbixcclxuICAgICAgICByZWZyZXNoRmlsdGVyXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocG9zaXRpb24gPT09IDIgJiYgdGhpcy5jYWxlbmRhclR5cGUoKSA9PT0gJ2RhdGUnICYmICF0aGlzLnNsaWRlck1vZGUpIHtcclxuICAgICAgLyogQWJvdmUgbW9udGg6IHNlZSB5ZWFyU2VsZWN0ZWQgb3IgbW9udGhTZWxlY3RlZCAqL1xyXG4gICAgICB2YWx1ZVRtcCA9IG1vbWVudCh2YWx1ZVRtcCkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gMSkge1xyXG4gICAgICB0aGlzLmJlZ2luVmFsdWUgPSB2YWx1ZVRtcDtcclxuICAgICAgaWYgKHRoaXMucmVzdHJpY3RlZFRvU3RlcCgpKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUZW1wb3JhbFByb3BlcnR5KFxyXG4gICAgICAgICAgdGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5hZGRTdGVwKHZhbHVlVG1wLCB0aGlzLnN0ZXBNaWxsaXNlY29uZHMpLFxyXG4gICAgICAgICAgMixcclxuICAgICAgICAgIHJlZnJlc2hGaWx0ZXJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZFZhbHVlID0gdmFsdWVUbXA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUhvdXJzTWludXRlc0FycmF5KCk7XHJcbiAgICB0aGlzLmNoYW5nZVByb3BlcnR5Lm5leHQoe1xyXG4gICAgICB2YWx1ZTogdmFsdWVUbXAudG9JU09TdHJpbmcoKSxcclxuICAgICAgcG9zOiBwb3NpdGlvbixcclxuICAgICAgcmVmcmVzaEZpbHRlclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlKHZhbHVlKTogRGF0ZSB7XHJcbiAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSAnJykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5jdXJyZW50RmlsdGVyLmNhbGVuZGFyTW9kZVllYXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgY2FsZW5kYXJUeXBlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XHJcbiAgICAgIHJldHVybiAneWVhcic7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwTWlsbGlzZWNvbmRzIDwgODY0MDAwMDApIHtcclxuICAgICAgcmV0dXJuICdkYXRldGltZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2RhdGUnO1xyXG4gIH1cclxuXHJcbiAgaXNDYWxlbmRhclllYXJNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJUeXBlKCkgPT09ICd5ZWFyJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHllYXJPbmx5SW5wdXRDaGFuZ2UoY2hhbmdlRXZlbnQsIGRhdGVQaWNrZXI/OiBhbnksIHByb3BlcnR5Pzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB5ZWFyID0gY2hhbmdlRXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZSh5ZWFyKTtcclxuICAgIHRoaXMueWVhclNlbGVjdGVkKGRhdGUsIGRhdGVQaWNrZXIsIHByb3BlcnR5KTtcclxuICB9XHJcblxyXG4gIHllYXJTZWxlY3RlZChcclxuICAgIHllYXIsXHJcbiAgICBkYXRlUGlja2VyPzogYW55LFxyXG4gICAgcHJvcGVydHk/OiBzdHJpbmcsXHJcbiAgICByZWZyZXNoRmlsdGVyID0gdHJ1ZVxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzWWVhckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKGRhdGVQaWNrZXIpIHtcclxuICAgICAgICBkYXRlUGlja2VyLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3BlcnR5ID09PSAnZW5kJykge1xyXG4gICAgICAgIC8vIGNoYW5nZSB2YWx1ZSAwMSBqYW4gdG8gMzEgZGVjIHNhbWUgeWVhclxyXG4gICAgICAgIHllYXIgPSBtb21lbnQoeWVhcikuZW5kT2YoJ3llYXInKS50b0RhdGUoKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2JlZ2luJyAmJlxyXG4gICAgICAgIHRoaXMucmVzdHJpY3RlZFRvU3RlcCgpICYmXHJcbiAgICAgICAgIXRoaXMuY2FsZW5kYXJUeXBlWWVhclxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnllYXJTZWxlY3RlZCh5ZWFyLCB1bmRlZmluZWQsICdlbmQnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXHJcbiAgICAgICAgeWVhcixcclxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2JlZ2luJyA/IDEgOiAyLFxyXG4gICAgICAgIHJlZnJlc2hGaWx0ZXJcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vbnRoU2VsZWN0ZWQoXHJcbiAgICBtb250aCxcclxuICAgIGRhdGVQaWNrZXI/OiBhbnksXHJcbiAgICBwcm9wZXJ0eT86IHN0cmluZyxcclxuICAgIHJlZnJlc2hGaWx0ZXIgPSB0cnVlXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNNb250aER1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKGRhdGVQaWNrZXIpIHtcclxuICAgICAgICBkYXRlUGlja2VyLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3BlcnR5ID09PSAnZW5kJykge1xyXG4gICAgICAgIG1vbnRoID0gbW9tZW50KG1vbnRoKS5lbmRPZignbW9udGgnKS50b0RhdGUoKTtcclxuICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSA9PT0gJ2JlZ2luJyAmJiB0aGlzLnJlc3RyaWN0ZWRUb1N0ZXAoKSkge1xyXG4gICAgICAgIHRoaXMubW9udGhTZWxlY3RlZChtb250aCwgdW5kZWZpbmVkLCAnZW5kJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGFuZ2VUZW1wb3JhbFByb3BlcnR5KFxyXG4gICAgICAgIG1vbnRoLFxyXG4gICAgICAgIHByb3BlcnR5ID09PSAnYmVnaW4nID8gMSA6IDIsXHJcbiAgICAgICAgcmVmcmVzaEZpbHRlclxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsZW5kYXJWaWV3KCkge1xyXG4gICAgY29uc3QgdGVzdCA9IHRoaXMuc3RlcE1pbGxpc2Vjb25kcztcclxuICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhcclxuICAgICAgdGhpcy5wYXJzZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuZW5kKS5nZXRUaW1lKCkgLVxyXG4gICAgICAgIHRoaXMucGFyc2VGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyLmJlZ2luKS5nZXRUaW1lKClcclxuICAgICk7XHJcbiAgICBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNZZWFyRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICByZXR1cm4gJ211bHRpLXllYXInO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICByZXR1cm4gJ3llYXInO1xyXG4gICAgfSBlbHNlIGlmICh0ZXN0IDwgODY0MDAwMDAgJiYgZGlmZiA8IDg2NDAwMDAwKSB7XHJcbiAgICAgIHJldHVybiAnY2xvY2snO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdtb250aCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyKHR5cGU6IHN0cmluZywgZGF0ZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGNvbnN0IGRpZmYgPSBkYXRlVmFsdWUuZ2V0VGltZSgpIC0gbmV3IERhdGUodGhpcy5oYW5kbGVNaW4oKSkuZ2V0VGltZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc1llYXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIGNvbnN0IG1vbnRoRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXHJcbiAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICd5ZWFycycsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoRGlmZlBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZVBsdXMxKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ3llYXJzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc1llYXJzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNZZWFycygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICBjb25zdCBtb250aERpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnbW9udGhzJyxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0eXBlID09PSAnZW5kJykge1xyXG4gICAgICAgIGNvbnN0IGRhdGVWYWx1ZVBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZSkuYWRkKDEsICdkJyk7XHJcbiAgICAgICAgY29uc3QgbW9udGhEaWZmUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlUGx1czEpLmRpZmYoXHJcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXHJcbiAgICAgICAgICAnbW9udGhzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc01vbnRocygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmVnaW4nKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID1cclxuICAgICAgICAgIG1vbnRoRGlmZiAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzTW9udGhzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzV2Vla0R1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgY29uc3Qgd2Vla0RpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnd2Vla3MnLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlKS5hZGQoMSwgJ2QnKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGlmZlBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZVBsdXMxKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ3dlZWtzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgd2Vla0RpZmZQbHVzMSAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzV2Vla3MoKSA9PT0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JlZ2luJykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XHJcbiAgICAgICAgICB3ZWVrRGlmZiAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzV2Vla3MoKSA9PT0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNEYXlEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIGNvbnN0IGRheURpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnZGF5cycsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xyXG4gICAgICAgIGNvbnN0IGRheURpZmZQbHVzMSA9IG1vbWVudChkYXRlVmFsdWVQbHVzMSkuZGlmZihcclxuICAgICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAgICdkYXlzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IF9tb2QgPSBkYXlEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0RheXMoKTtcclxuICAgICAgICB0aGlzLmZpbHRlckVuZEZ1bmN0aW9uID1cclxuICAgICAgICAgIChfbW9kIDwgMC4wMDAwMDAxICYmIF9tb2QgPiAtMC4wMDAwMDAxKSB8fCBfbW9kID09PSAwOyAvLyAxIG1pbGxpc2Vjb25kID0gMS4xNTc0MDc0MDc0MDc0MDc2ZS04XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICBjb25zdCBfbW9kID0gKGRheURpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0RheXMoKSkgKyAxO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XHJcbiAgICAgICAgICAoX21vZCA8IDAuMDAwMDAwMSAmJiBfbW9kID4gLTAuMDAwMDAwMSAmJiBfbW9kICE9PSAwKSB8fCBfbW9kID09PSAxOyAvLyAxIG1pbGxpc2Vjb25kID0gMS4xNTc0MDc0MDc0MDc0MDc2ZS04XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzSG91ckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgY29uc3QgaG91ckRpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ2hvdXJzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgaG91ckRpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0hvdXJzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICBjb25zdCBob3VyRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXHJcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXHJcbiAgICAgICAgICAnaG91cnMnLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID1cclxuICAgICAgICAgIGhvdXJEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNIb3VycygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01pbnV0ZUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJFbmRGdW5jdGlvbiA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPSBkaWZmICUgdGhpcy5zdGVwTWlsbGlzZWNvbmRzID09PSAwO1xyXG4gICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID0gZGlmZiAlIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA9PT0gMDtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGdldERhdGVUaW1lKGRhdGUsIHBvcykge1xyXG4gICAgY29uc3QgdmFsdWV0bXAgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGxldCB2YWx1ZXRtcDI7XHJcbiAgICBpZiAoIXRoaXMuc2xpZGVyTW9kZSkge1xyXG4gICAgICBzd2l0Y2ggKHBvcykge1xyXG4gICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XHJcbiAgICAgICAgICAgIHZhbHVldG1wMiA9IHZhbHVldG1wLnNldEhvdXJzKDAsIDApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVldG1wMiA9IHZhbHVldG1wLnNldEhvdXJzKFxyXG4gICAgICAgICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIDI6IHtcclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuY2FsZW5kYXJNb2RlWWVhcikge1xyXG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycygwLCAwKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycyhcclxuICAgICAgICAgICAgICB0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVldG1wMiA/IHZhbHVldG1wMiA6IHZhbHVldG1wKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU1pbnV0ZUluY3JlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01pbnV0ZUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA8IDM2MDAwMDApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGVwTWlsbGlzZWNvbmRzIC8gMTAwMCA9PT0gNjBcclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGVwTWlsbGlzZWNvbmRzICUgMzYwMDAwMCkgLyA2MDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0hvdXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiA2MDtcclxuICAgIH1cclxuICAgIHJldHVybiAxO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSG91ckluY3JlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0hvdXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwIC8gNjAgLyA2MDtcclxuICAgIH1cclxuICAgIHJldHVybiAxO1xyXG4gIH1cclxuXHJcbiAgZnVsbEJlZ2luSG91cnNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5iZWdpbkhvdXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZW5ndGg6XHJcbiAgICAgICAgICAgICh0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC52YWx1ZSAtIDApIC8gdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KCkgKyAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iZWdpbkhvdXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7IGxlbmd0aDogKDIzIC0gMCkgLyB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKSArIDEgfSxcclxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iZWdpbkhvdXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJlZ2luVmFsdWUuZ2V0SG91cnMoKSk7XHJcbiAgfVxyXG5cclxuICBmdWxsRW5kSG91cnNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5lbmRIb3VycyA9IEFycmF5LmZyb20oXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGVuZ3RoOlxyXG4gICAgICAgICAgICAoMjMgLSB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLnZhbHVlKSAvXHJcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KCkgK1xyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT5cclxuICAgICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wudmFsdWUgKyBpICogdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KClcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kSG91cnMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoMjMgLSAwKSAvIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpICsgMSB9LFxyXG4gICAgICAgIChfLCBpKSA9PiAwICsgaSAqIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmVuZFZhbHVlLmdldEhvdXJzKCkpO1xyXG4gIH1cclxuXHJcbiAgZnVsbEJlZ2luTWludXRlc0FycmF5KGNoZWNrRW5kVmFsdWU/KSB7XHJcbiAgICBpZiAoY2hlY2tFbmRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmJlZ2luTWludXRlcyA9IEFycmF5LmZyb20oXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGVuZ3RoOlxyXG4gICAgICAgICAgICAodGhpcy5lbmRNaW51dGVGb3JtQ29udHJvbC52YWx1ZSAtIDApIC9cclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpICtcclxuICAgICAgICAgICAgMVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iZWdpbk1pbnV0ZXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuYmVnaW5WYWx1ZS5nZXRNaW51dGVzKCkpO1xyXG4gIH1cclxuXHJcbiAgZnVsbEVuZE1pbnV0ZXNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5lbmRNaW51dGVzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZW5ndGg6XHJcbiAgICAgICAgICAgICg1OSAtIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC52YWx1ZSkgL1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgK1xyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT5cclxuICAgICAgICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC52YWx1ZSArIGkgKiB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZE1pbnV0ZXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmRNaW51dGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmVuZFZhbHVlLmdldE1pbnV0ZXMoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIb3Vyc01pbnV0ZXNBcnJheSgpIHtcclxuICAgIGNvbnN0IGJlZ2luVG1wID0gbmV3IERhdGUodGhpcy5iZWdpblZhbHVlKTtcclxuICAgIGNvbnN0IGVuZFRtcCA9IG5ldyBEYXRlKHRoaXMuZW5kVmFsdWUpO1xyXG4gICAgaWYgKGJlZ2luVG1wLnNldEhvdXJzKDAsIDApID09PSBlbmRUbXAuc2V0SG91cnMoMCwgMCkpIHtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5Ib3Vyc0FycmF5KHRydWUpO1xyXG4gICAgICB0aGlzLmZ1bGxFbmRIb3Vyc0FycmF5KHRydWUpO1xyXG4gICAgICBpZiAodGhpcy5iZWdpblZhbHVlLmdldEhvdXJzKCkgPT09IHRoaXMuZW5kVmFsdWUuZ2V0SG91cnMoKSkge1xyXG4gICAgICAgIHRoaXMuZnVsbEJlZ2luTWludXRlc0FycmF5KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZnVsbEVuZE1pbnV0ZXNBcnJheSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5Ib3Vyc0FycmF5KCk7XHJcbiAgICAgIHRoaXMuZnVsbEVuZEhvdXJzQXJyYXkoKTtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5NaW51dGVzQXJyYXkoKTtcclxuICAgICAgdGhpcy5mdWxsRW5kTWludXRlc0FycmF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZhbHVlcygpIHtcclxuICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh0aGlzLmJlZ2luVmFsdWUsIDEsIGZhbHNlKTtcclxuICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh0aGlzLmVuZFZhbHVlLCAyLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0cmljdGVkVG9TdGVwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlci5yZXN0cmljdFRvU3RlcFxyXG4gICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5yZXN0cmljdFRvU3RlcFxyXG4gICAgICA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZU1pbigpIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW5cclxuICAgICAgPyB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW5cclxuICAgICAgOiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlXHJcbiAgICAgID8gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZVxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHRNaW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlTWF4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlci5lbmRcclxuICAgICAgPyB0aGlzLmN1cnJlbnRGaWx0ZXIuZW5kXHJcbiAgICAgIDogdGhpcy5kYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZVxyXG4gICAgICA/IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcclxuICAgICAgOiB0aGlzLl9kZWZhdWx0TWF4O1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlUHJvcGVydHlCeVBhc3MoZXZlbnQpIHtcclxuICAgIHRoaXMuY2hhbmdlUHJvcGVydHkubmV4dChldmVudCk7XHJcbiAgfVxyXG5cclxuICBtb2RlQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZpbHRlclN0YXRlRGlzYWJsZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTdGF0ZURpc2FibGUgPSAhdGhpcy5jdXJyZW50RmlsdGVyLmFjdGl2ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU3RhdGVEaXNhYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhclR5cGUoKSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJTdGF0ZURpc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmJlZ2luTWludXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZW5kSG91ckZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLmVuYWJsZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldERhdGVGcm9tU3RyaW5nV2l0aG91dFRpbWUoc3RyaW5nRGF0ZTogc3RyaW5nKTogRGF0ZSB7XHJcbiAgICAvLyB3YXJuaW5nIGNyZWF0ZSBkYXRlIHdpdGggbm8gdGltZSBtYWtlIGEgZGF0ZSBVVEMgd2l0aCBUWiBhbmQgdGhlIGRhdGUgY3JlYXRlIG1heWJlIG5vdCB0aGUgc2FtZSB5ZWFyLCBtb250aCBhbmQgZGF5XHJcbiAgICAvLyBleGVtcGxlOlxyXG4gICAgLy8gbmV3IERhdGUoJzIwMjItMDEtMDEnKSAtPiBGcmkgRGVjIDMxIDIwMjEgMTk6MDA6MDAgR01ULTA1MDAgKGhldXJlIG5vcm1hbGUgZGUgbOKAmUVzdCBub3JkLWFtw6lyaWNhaW4pXHJcbiAgICAvLyB0byBjcmVhdGUgc2FtZSBkYXRlIGFzIHN0cmluZywgYWRkIHRpbWUgMDAgaW4gdGhlIGNyZWF0aW9uXHJcbiAgICAvLyBuZXcgRGF0ZSgnMjAyMi0wMS0wMSAwMDowMDowMCcpIC0+IFNhdCBKYW4gMDEgMjAyMiAwMDowMDowMCBHTVQtMDUwMCAoaGV1cmUgbm9ybWFsZSBkZSBs4oCZRXN0IG5vcmQtYW3DqXJpY2FpbilcclxuICAgIGxldCB5ZWFyO1xyXG4gICAgbGV0IG1vbnRoID0gJzAxJztcclxuICAgIGxldCBkYXkgPSAnMDEnO1xyXG4gICAgaWYgKHN0cmluZ0RhdGUubGVuZ3RoID09PSAxMCkge1xyXG4gICAgICBjb25zdCBkYXRlSXRlbXMgPSBzdHJpbmdEYXRlLnNwbGl0KCctJyk7XHJcbiAgICAgIGlmIChkYXRlSXRlbXMubGVuZ3RoICE9PSAzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgJ0Vycm9yIGluIGNvbmZpZyBkYXRlIGJlZ2luLWVuZCBmb3Igb2djRmlsdGVyOiBEYXRlIHdpdGhvdXQgdGltZSBmb3JtYXQgbmVlZCB0byBiZSBZWVlZLU1NLUREIG9yIFlZWVknXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB5ZWFyID0gZGF0ZUl0ZW1zWzBdO1xyXG4gICAgICAgIG1vbnRoID0gZGF0ZUl0ZW1zWzFdO1xyXG4gICAgICAgIGRheSA9IGRhdGVJdGVtc1syXTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChzdHJpbmdEYXRlLmxlbmd0aCA9PT0gNCkge1xyXG4gICAgICB5ZWFyID0gc3RyaW5nRGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0ZShzdHJpbmdEYXRlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gMDA6MDA6MDBgKTtcclxuICB9XHJcblxyXG4gIHJlc2V0RmlsdGVyKCkge1xyXG4gICAgbGV0IGZpbHRlck9yaWdpbkNvbmZpZyA9IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnNcclxuICAgICAgLmZpbHRlcnMgYXMgT2djRmlsdGVyRHVyaW5nT3B0aW9ucztcclxuXHJcbiAgICBsZXQgbWluRGVmYXVsdERhdGU7XHJcbiAgICBsZXQgbWF4RGVmYXVsdERhdGU7XHJcbiAgICBsZXQgbWluRGVmYXVsdElTT1N0cmluZztcclxuICAgIGxldCBtYXhEZWZhdWx0SVNPU3RyaW5nO1xyXG5cclxuICAgIGlmICh0aGlzLmNhbGVuZGFyVHlwZVllYXIpIHtcclxuICAgICAgaWYgKGZpbHRlck9yaWdpbkNvbmZpZy5lbmQgPT09ICd0b2RheScpIHtcclxuICAgICAgICBsZXQgdG9kYXlEYXRlU3RyaW5nTm9UaW1lID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUNBJyk7IC8vICcyMDIyLTAyLTEzJ1xyXG4gICAgICAgIG1heERlZmF1bHRJU09TdHJpbmcgPSBgJHt0b2RheURhdGVTdHJpbmdOb1RpbWUuc3Vic3RyaW5nKDAsIDQpfS0wMS0wMWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWF4RGVmYXVsdElTT1N0cmluZyA9IGAke2ZpbHRlck9yaWdpbkNvbmZpZy5lbmQuc3Vic3RyaW5nKDAsIDQpfS0wMS0wMWA7XHJcbiAgICAgIH1cclxuICAgICAgbWluRGVmYXVsdElTT1N0cmluZyA9IGAke2ZpbHRlck9yaWdpbkNvbmZpZy5iZWdpbi5zdWJzdHJpbmcoMCwgNCl9LTAxLTAxYDtcclxuICAgICAgbWluRGVmYXVsdERhdGUgPSB0aGlzLmdldERhdGVGcm9tU3RyaW5nV2l0aG91dFRpbWUobWluRGVmYXVsdElTT1N0cmluZyk7XHJcbiAgICAgIG1heERlZmF1bHREYXRlID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKG1heERlZmF1bHRJU09TdHJpbmcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWluRGVmYXVsdERhdGUgPSB0aGlzLnBhcnNlRmlsdGVyKGZpbHRlck9yaWdpbkNvbmZpZy5iZWdpbik7XHJcbiAgICAgIG1heERlZmF1bHREYXRlID0gdGhpcy5wYXJzZUZpbHRlcihmaWx0ZXJPcmlnaW5Db25maWcuZW5kKTtcclxuICAgICAgbWluRGVmYXVsdElTT1N0cmluZyA9IG1pbkRlZmF1bHREYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIG1heERlZmF1bHRJU09TdHJpbmcgPSBtYXhEZWZhdWx0RGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jdXJyZW50RmlsdGVyLmJlZ2luICE9PSBtaW5EZWZhdWx0SVNPU3RyaW5nIHx8XHJcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlci5lbmQgIT09IG1heERlZmF1bHRJU09TdHJpbmdcclxuICAgICkge1xyXG4gICAgICB0aGlzLmJlZ2luVmFsdWUgPSBtaW5EZWZhdWx0RGF0ZTtcclxuICAgICAgdGhpcy5lbmRWYWx1ZSA9IG1heERlZmF1bHREYXRlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyU3RhdGUoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLmFjdGl2ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuYWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0RmlsdGVyU3RhdGVEaXNhYmxlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVZhbHVlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhdGV0aW1lLWNvbnRhaW5lclwiPlxyXG4gIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAqbmdJZj1cInRoaXMuY3VycmVudEZpbHRlci5zbGlkZXJPcHRpb25zPy5lbmFibGVkXCJcclxuICAgIFsobmdNb2RlbCldPVwic2xpZGVyTW9kZVwiXHJcbiAgICAoY2hhbmdlKT1cIm1vZGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAge3sgJ2lnby5nZW8uZmlsdGVyLnNsaWRlck1vZGVUaXRsZScgfCB0cmFuc2xhdGUgfX1cclxuICA8L21hdC1zbGlkZS10b2dnbGU+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCIgKm5nSWY9XCJzbGlkZXJNb2RlXCI+XHJcbiAgICA8aWdvLW9nYy1maWx0ZXItdGltZS1zbGlkZXJcclxuICAgICAgW2JlZ2luXT1cImJlZ2luVmFsdWVcIlxyXG4gICAgICBbbWF4XT1cInRoaXMucmVzdHJpY3RlZFRvU3RlcCgpID8gdGhpcy5tYXhEYXRlIDogdGhpcy5lbmRWYWx1ZVwiXHJcbiAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxyXG4gICAgICBbZGF0YXNvdXJjZV09XCJkYXRhc291cmNlXCJcclxuICAgICAgKGNoYW5nZVByb3BlcnR5KT1cImNoYW5nZVByb3BlcnR5QnlQYXNzKCRldmVudClcIlxyXG4gICAgPlxyXG4gICAgPC9pZ28tb2djLWZpbHRlci10aW1lLXNsaWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIiFzbGlkZXJNb2RlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwieWVhci1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cImNhbGVuZGFyVHlwZVllYXJcIj5cclxuICAgICAgPCEtLSB0byBlbXVsYXRlIGEgeWVhci1waWNrZXIsIDIgaW5wdXQ6IGZpcnN0IGlucHV0IHRvIHNob3cgdXNlciBqdXN0IHllYXIgYW5kIHNlY29uZCBpbnB1dCBoaWRlbiBhbmQgYmluZCBcclxuICAgICAgICB3aXRoIHRoZSBkYXRlcGlja2VyICAtLT5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwieWVhci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuc3RhcnRZZWFyJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIGNsYXNzPVwieWVhci1pbnB1dC1vbmx5LXllYXJcIlxyXG4gICAgICAgICAgdmFsdWU9XCJ7eyBvbmx5WWVhckJlZ2luIH19XCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwieWVhck9ubHlJbnB1dENoYW5nZSgkZXZlbnQsIGJlZ2luRGF0ZXBpY2tlciwgJ2JlZ2luJylcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIFtmb3JdPVwiYmVnaW5EYXRlcGlja2VyXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxyXG4gICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuXHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyXHJcbiAgICAgICAgICBwYW5lbENsYXNzPVwiZGF0ZXBpY2tlci15ZWFyXCJcclxuICAgICAgICAgICNiZWdpbkRhdGVwaWNrZXJcclxuICAgICAgICAgIFtzdGFydFZpZXddPVwiY2FsZW5kYXJWaWV3KClcIlxyXG4gICAgICAgICAgW3N0YXJ0QXRdPVwiYmVnaW5WYWx1ZVwiXHJcbiAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInllYXJTZWxlY3RlZCgkZXZlbnQsIGJlZ2luRGF0ZXBpY2tlciwgJ2JlZ2luJylcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxyXG5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICNiZWdpblllYXJcclxuICAgICAgICAgIGNsYXNzPVwieWVhci1pbnB1dC1oaWRlXCJcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJiZWdpbkRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgZW5hYmxlZD1cImZhbHNlXCJcclxuICAgICAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiXHJcbiAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbbWluXT1cImhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXCJcclxuICAgICAgICAgIFttYXhdPVwiXHJcbiAgICAgICAgICAgIGVuZFZhbHVlICYmICFyZXN0cmljdGVkVG9TdGVwKClcclxuICAgICAgICAgICAgICA/IGVuZFZhbHVlXHJcbiAgICAgICAgICAgICAgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwieWVhci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuZW5kWWVhcicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBjbGFzcz1cInllYXItaW5wdXQtb25seS15ZWFyXCJcclxuICAgICAgICAgIHZhbHVlPVwie3sgb25seVllYXJFbmQgfX1cIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJ5ZWFyT25seUlucHV0Q2hhbmdlKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICBbZm9yXT1cImVuZERhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXHJcbiAgICAgICAgPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlclxyXG4gICAgICAgICAgcGFuZWxDbGFzcz1cImRhdGVwaWNrZXIteWVhclwiXHJcbiAgICAgICAgICAjZW5kRGF0ZXBpY2tlclxyXG4gICAgICAgICAgW3N0YXJ0Vmlld109XCJjYWxlbmRhclZpZXcoKVwiXHJcbiAgICAgICAgICBbc3RhcnRBdF09XCJlbmRWYWx1ZVwiXHJcbiAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInllYXJTZWxlY3RlZCgkZXZlbnQsIGVuZERhdGVwaWNrZXIsICdlbmQnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XHJcblxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgI2VuZFllYXJcclxuICAgICAgICAgIGNsYXNzPVwieWVhci1pbnB1dC1oaWRlXCJcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJlbmREYXRlcGlja2VyXCJcclxuICAgICAgICAgIGVuYWJsZWQ9XCJmYWxzZVwiXHJcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVuZFZhbHVlID8gZW5kVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVwiXHJcbiAgICAgICAgICBbbWluXT1cIlxyXG4gICAgICAgICAgICBiZWdpblZhbHVlID8gYmVnaW5WYWx1ZSA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW21heF09XCJoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxyXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZmlsdGVyLnJlc2V0RmlsdGVycycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJ7eyByZXNldEljb24gfX1cIj48L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1maWx0ZXItc3RhdGVcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVGaWx0ZXJTdGF0ZSgpXCJcclxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci50b2dnbGVGaWx0ZXJTdGF0ZScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcclxuICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwiIWZpbHRlclN0YXRlRGlzYWJsZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCJjYWxlbmRhclR5cGUoKSAhPT0gJ3llYXInXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRldGltZS1pbnB1dFwiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRhdGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBbZm9yXT1cImJlZ2luRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxyXG4gICAgICAgICAgPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICNiZWdpblxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJiZWdpbkRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5nZW8udGltZUZpbHRlci5zdGFydERhdGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcclxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShiZWdpbi52YWx1ZSwgMSlcIlxyXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJmaWx0ZXJCZWdpbkZ1bmN0aW9uXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIlxyXG4gICAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW21pbl09XCJoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlKVwiXHJcbiAgICAgICAgICAgIFttYXhdPVwiXHJcbiAgICAgICAgICAgICAgZW5kVmFsdWUgJiYgIXJlc3RyaWN0ZWRUb1N0ZXAoKVxyXG4gICAgICAgICAgICAgICAgPyBlbmRWYWx1ZVxyXG4gICAgICAgICAgICAgICAgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGxlclwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAjYmVnaW5EYXRlcGlja2VyXHJcbiAgICAgICAgICAgIFtzdGFydFZpZXddPVwiY2FsZW5kYXJWaWV3KClcIlxyXG4gICAgICAgICAgICBbc3RhcnRBdF09XCJiZWdpblZhbHVlXCJcclxuICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJ5ZWFyU2VsZWN0ZWQoJGV2ZW50LCBiZWdpbkRhdGVwaWNrZXIsICdiZWdpbicpXCJcclxuICAgICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwibW9udGhTZWxlY3RlZCgkZXZlbnQsIGJlZ2luRGF0ZXBpY2tlciwgJ2JlZ2luJylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FsZW5kYXJUeXBlKCkgPT09ICdkYXRldGltZSdcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImhvdXItaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2lnby5nZW8udGltZUZpbHRlci5ob3VyJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJiZWdpbkhvdXJGb3JtQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcclxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoYmVnaW4udmFsdWUsIDEpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGJlZ2luSG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7XHJcbiAgICAgICAgICAgICAgICBob3VyXHJcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtaW51dGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2lnby5nZW8udGltZUZpbHRlci5taW51dGUnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImJlZ2luTWludXRlRm9ybUNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGJlZ2luLnZhbHVlLCAxKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBiZWdpbk1pbnV0ZXNcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm1pbnV0ZVwiXHJcbiAgICAgICAgICAgICAgICA+e3sgbWludXRlIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhcmVzdHJpY3RlZFRvU3RlcCgpXCIgY2xhc3M9XCJkYXRldGltZS1pbnB1dFwiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRhdGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XHJcbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBbZm9yXT1cImVuZERhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcclxuICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAjZW5kXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImVuZERhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5nZW8udGltZUZpbHRlci5lbmREYXRlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXHJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoZW5kLnZhbHVlLCAyKVwiXHJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImZpbHRlckVuZEZ1bmN0aW9uXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIlxyXG4gICAgICAgICAgICAgIGVuZFZhbHVlID8gZW5kVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbbWluXT1cIlxyXG4gICAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW21heF09XCJoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsbGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyXHJcbiAgICAgICAgICAgICNlbmREYXRlcGlja2VyXHJcbiAgICAgICAgICAgIFtzdGFydFZpZXddPVwiY2FsZW5kYXJWaWV3KClcIlxyXG4gICAgICAgICAgICBbc3RhcnRBdF09XCJlbmRWYWx1ZVwiXHJcbiAgICAgICAgICAgICh5ZWFyU2VsZWN0ZWQpPVwieWVhclNlbGVjdGVkKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcclxuICAgICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwibW9udGhTZWxlY3RlZCgkZXZlbnQsIGVuZERhdGVwaWNrZXIsICdlbmQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYWxlbmRhclR5cGUoKSA9PT0gJ2RhdGV0aW1lJ1wiIGNsYXNzPVwidGltZS1pbnB1dFwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaG91ci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLmhvdXInIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImVuZEhvdXJGb3JtQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcclxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoZW5kLnZhbHVlLCAyKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBlbmRIb3Vyc1wiIFt2YWx1ZV09XCJob3VyXCI+e3tcclxuICAgICAgICAgICAgICAgIGhvdXJcclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1pbnV0ZS1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLm1pbnV0ZScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZW5kTWludXRlRm9ybUNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGVuZC52YWx1ZSwgMilcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBlbmRNaW51dGVzXCIgW3ZhbHVlXT1cIm1pbnV0ZVwiPnt7XHJcbiAgICAgICAgICAgICAgICBtaW51dGVcclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiXHJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5maWx0ZXIucmVzZXRGaWx0ZXJzJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cInt7IHJlc2V0SWNvbiB9fVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWZpbHRlci1zdGF0ZVwiXHJcbiAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUZpbHRlclN0YXRlKClcIlxyXG4gICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcclxuICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZmlsdGVyLnRvZ2dsZUZpbHRlclN0YXRlJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICBbY2hlY2tlZF09XCIhZmlsdGVyU3RhdGVEaXNhYmxlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
667
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFD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QUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7dUdBcnRCVSxzQkFBc0I7MkZBQXRCLHNCQUFzQix1TEFGdEIsQ0FBQyxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLDZhQzVEL0QsK2lWQTBSQSxxMENEOU9JLElBQUksNEZBQ0osb0JBQW9CLGtXQUNwQixXQUFXLCtWQUNYLDRCQUE0Qiw0SkFDNUIsa0JBQWtCLDJhQUNsQixjQUFjLDBXQUNkLG1CQUFtQixpZ0JBQ25CLGVBQWUsMklBQ2YsZ0JBQWdCLDRUQUNoQixhQUFhLG1MQUNiLGVBQWUscXJCQUNmLG1CQUFtQixrTkFDbkIsS0FBSyxrSEFDTCxlQUFlLDhCQUNmLGVBQWU7OzJGQUlOLHNCQUFzQjtrQkF4QmxDLFNBQVM7K0JBQ0UscUJBQXFCLGNBR25CLElBQUksV0FDUDt3QkFDUCxJQUFJO3dCQUNKLG9CQUFvQjt3QkFDcEIsV0FBVzt3QkFDWCw0QkFBNEI7d0JBQzVCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixLQUFLO3dCQUNMLGVBQWU7d0JBQ2YsZUFBZTtxQkFDaEIsYUFDVSxDQUFDLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLENBQUM7eUZBR3BELFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQWdDeUIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDSSxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCO2dCQUNSLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDQSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBVbnR5cGVkRm9ybUNvbnRyb2xcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHByb3ZpZGVNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgbW9tZW50IH0gZnJvbSAnbW9tZW50JztcclxuXHJcbmltcG9ydCB7IE9nY0ZpbHRlck9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vZmlsdGVyL3NoYXJlZC9vZ2MtZmlsdGVyLmVudW0nO1xyXG5pbXBvcnQgeyBPR0NGaWx0ZXJUaW1lU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9vZ2MtZmlsdGVyLXRpbWUuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgT2djRmlsdGVyRHVyaW5nT3B0aW9ucyxcclxuICBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZSxcclxuICBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnNcclxufSBmcm9tICcuLi9zaGFyZWQvb2djLWZpbHRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBPZ2NGaWx0ZXJUaW1lU2xpZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9vZ2MtZmlsdGVyLXRpbWUtc2xpZGVyLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lnby1vZ2MtZmlsdGVyLXRpbWUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9vZ2MtZmlsdGVyLXRpbWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL29nYy1maWx0ZXItdGltZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdJZixcclxuICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBPZ2NGaWx0ZXJUaW1lU2xpZGVyQ29tcG9uZW50LFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTmdGb3IsXHJcbiAgICBNYXRPcHRpb25Nb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW09HQ0ZpbHRlclRpbWVTZXJ2aWNlLCBwcm92aWRlTW9tZW50RGF0ZUFkYXB0ZXIoKV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE9nY0ZpbHRlclRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGRhdGFzb3VyY2U6IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRGaWx0ZXI6IGFueTtcclxuICBAT3V0cHV0KCkgY2hhbmdlUHJvcGVydHk6IEV2ZW50RW1pdHRlcjx7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgcG9zOiBudW1iZXI7XHJcbiAgICByZWZyZXNoRmlsdGVyOiBib29sZWFuO1xyXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGJlZ2luSG91cnM6IG51bWJlcltdO1xyXG4gIGVuZEhvdXJzOiBudW1iZXJbXTtcclxuICBiZWdpbk1pbnV0ZXM6IG51bWJlcltdO1xyXG4gIGVuZE1pbnV0ZXM6IG51bWJlcltdO1xyXG4gIGJlZ2luSG91ckZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIGJlZ2luTWludXRlRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgZW5kSG91ckZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIGVuZE1pbnV0ZUZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIF9iZWdpblZhbHVlOiBEYXRlO1xyXG4gIF9lbmRWYWx1ZTogRGF0ZTtcclxuICByZWFkb25seSBfZGVmYXVsdE1pbjogc3RyaW5nID0gJzE5MDAtMDEtMDEnO1xyXG4gIHJlYWRvbmx5IF9kZWZhdWx0TWF4OiBzdHJpbmcgPSAnMjA1Mi0wMS0wNic7XHJcbiAgcmVhZG9ubHkgX2RlZmF1bHREaXNwbGF5Rm9ybWF0OiBzdHJpbmcgPSAnREQvTU0vWVlZWSBISDptbSBBJztcclxuICByZWFkb25seSBfZGVmYXVsdFNsaWRlck1vZGVFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBvZ2NGaWx0ZXJPcGVyYXRvciA9IE9nY0ZpbHRlck9wZXJhdG9yO1xyXG4gIHB1YmxpYyBzbGlkZXJNb2RlID0gZmFsc2U7XHJcblxyXG4gIHJlYWRvbmx5IGRlZmF1bHRTdGVwTWlsbGlzZWNvbmQgPSA2MDAwMDtcclxuICBwdWJsaWMgb3B0aW9uczogT2djRmlsdGVyYWJsZURhdGFTb3VyY2VPcHRpb25zO1xyXG5cclxuICBwdWJsaWMgb25seVllYXJCZWdpbjogbnVtYmVyO1xyXG4gIHB1YmxpYyBvbmx5WWVhckVuZDogbnVtYmVyO1xyXG4gIHB1YmxpYyBjYWxlbmRhclR5cGVZZWFyID0gZmFsc2U7XHJcbiAgcHVibGljIHJlc2V0SWNvbiA9ICdyZXBsYXknO1xyXG4gIHB1YmxpYyBmaWx0ZXJTdGF0ZURpc2FibGU6IGJvb2xlYW47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2VuZERhdGVwaWNrZXJUaW1lJykgZW5kRGF0ZXBpY2tlclRpbWU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYmVnaW5EYXRlcGlja2VyVGltZScpIGJlZ2luRGF0ZXBpY2tlclRpbWU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYmVnaW5UaW1lJykgYmVnaW5UaW1lOiBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2VuZFRpbWUnKSBlbmRUaW1lOiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICBnZXQgc3RlcCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLnN0ZXBEYXRlXHJcbiAgICAgID8gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMuc3RlcERhdGVcclxuICAgICAgOiB0aGlzLmN1cnJlbnRGaWx0ZXIuc3RlcDtcclxuICB9XHJcblxyXG4gIGdldCBzdGVwTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBzdGVwID0gbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNNaWxsaXNlY29uZHMoKTtcclxuICAgIHJldHVybiBzdGVwID09PSAwID8gdGhpcy5kZWZhdWx0U3RlcE1pbGxpc2Vjb25kIDogc3RlcDtcclxuICB9XHJcblxyXG4gIHNldCBiZWdpblZhbHVlKGJlZ2luOiBEYXRlKSB7XHJcbiAgICB0aGlzLl9iZWdpblZhbHVlID0gYmVnaW47XHJcbiAgfVxyXG5cclxuICBnZXQgYmVnaW5WYWx1ZSgpOiBEYXRlIHtcclxuICAgIHJldHVybiB0aGlzLl9iZWdpblZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGVuZFZhbHVlKGVuZDogRGF0ZSkge1xyXG4gICAgdGhpcy5fZW5kVmFsdWUgPSBlbmQ7XHJcbiAgfVxyXG5cclxuICBnZXQgZW5kVmFsdWUoKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kVmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2xpZGVySW50ZXJ2YWwoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVySW50ZXJ2YWwgPT09IHVuZGVmaW5lZFxyXG4gICAgICA/IDIwMDBcclxuICAgICAgOiB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVySW50ZXJ2YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgbWF4RGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcclxuICAgICAgPyB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlXHJcbiAgICAgIDogdGhpcy5fZGVmYXVsdE1heDtcclxuICB9XHJcblxyXG4gIGdldCBkaXNwbGF5Rm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyLmRpc3BsYXlGb3JtYXRcclxuICAgICAgPyB0aGlzLmN1cnJlbnRGaWx0ZXIuZGlzcGxheUZvcm1hdFxyXG4gICAgICA6IHRoaXMuX2RlZmF1bHREaXNwbGF5Rm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlckJlZ2luRnVuY3Rpb247XHJcbiAgcHVibGljIGZpbHRlckVuZEZ1bmN0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgb2djRmlsdGVyVGltZVNlcnZpY2U6IE9HQ0ZpbHRlclRpbWVTZXJ2aWNlKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucykge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucy5lbmFibGVkID1cclxuICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucy5lbmFibGVkICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgID8gdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlck9wdGlvbnMuZW5hYmxlZFxyXG4gICAgICAgICAgOiB0aGlzLl9kZWZhdWx0U2xpZGVyTW9kZUVuYWJsZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJlZ2luVmFsdWUgPSB0aGlzLnBhcnNlRmlsdGVyKHRoaXMuaGFuZGxlTWluKCkpO1xyXG4gICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMucGFyc2VGaWx0ZXIodGhpcy5oYW5kbGVNYXgoKSk7XHJcblxyXG4gICAgdGhpcy5vbmx5WWVhckJlZ2luID0gdGhpcy5iZWdpblZhbHVlLmdldFVUQ0Z1bGxZZWFyKCk7XHJcbiAgICB0aGlzLm9ubHlZZWFyRW5kID0gdGhpcy5lbmRWYWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5jYWxlbmRhclR5cGVZZWFyID0gdGhpcy5pc0NhbGVuZGFyWWVhck1vZGUoKTtcclxuICAgIHRoaXMuc2V0RmlsdGVyU3RhdGVEaXNhYmxlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUhvdXJzTWludXRlc0FycmF5KCk7XHJcbiAgICAvLyB1cGRhdGUgdmFsdWUgZm9yIG5vdyB2YWx1ZVxyXG4gICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcclxuICAgIHRoaXMuZGF0ZUZpbHRlcih0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24sICdiZWdpbicpO1xyXG4gICAgdGhpcy5kYXRlRmlsdGVyKHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24sICdlbmQnKTtcclxuICB9XHJcblxyXG4gIHBhcnNlRmlsdGVyKGZpbHRlcik6IERhdGUge1xyXG4gICAgaWYgKCFmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTmFOKG5ldyBEYXRlKGZpbHRlcikuZ2V0VGltZSgpKSkge1xyXG4gICAgICBpZiAoZmlsdGVyLnNlYXJjaCgnbm93JykgPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGludGVydmFsID0gZmlsdGVyLm1hdGNoKC95ZWFyc3xtb250aHN8d2Vla3N8ZGF5c3xob3Vyc3xzZWNvbmRzLyk7XHJcbiAgICAgICAgaWYgKGZpbHRlci5tYXRjaCgvXFwrLykpIHtcclxuICAgICAgICAgIGNvbnN0IGludGVydmFsSW50ID0gcGFyc2VJbnQoXHJcbiAgICAgICAgICAgIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLnNlYXJjaCgnKycpICsgMSwgaW50ZXJ2YWwuaW5kZXgpLFxyXG4gICAgICAgICAgICAxMFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBtb21lbnQoKS5hZGQoaW50ZXJ2YWxJbnQsIGludGVydmFsWzBdKS50b0RhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbHRlci5tYXRjaCgvXFwtLykpIHtcclxuICAgICAgICAgIGNvbnN0IGludGVydmFsSW50ID0gcGFyc2VJbnQoXHJcbiAgICAgICAgICAgIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLnNlYXJjaCgnLScpICsgMSwgaW50ZXJ2YWwuaW5kZXgpLFxyXG4gICAgICAgICAgICAxMFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBtb21lbnQoKS5zdWJ0cmFjdChpbnRlcnZhbEludCwgaW50ZXJ2YWxbMF0pLnRvRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmlsdGVyLnNlYXJjaCgndG9kYXknKSA+PSAwKSB7XHJcbiAgICAgICAgY29uc3QgX25vdyA9IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKTtcclxuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGZpbHRlci5tYXRjaCgveWVhcnN8bW9udGhzfHdlZWtzfGRheXN8aG91cnN8c2Vjb25kcy8pO1xyXG4gICAgICAgIGlmIChmaWx0ZXIubWF0Y2goL1xcKy8pKSB7XHJcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbEludCA9IHBhcnNlSW50KFxyXG4gICAgICAgICAgICBmaWx0ZXIuc3Vic3RyaW5nKGZpbHRlci5zZWFyY2goJysnKSArIDEsIGludGVydmFsLmluZGV4KSxcclxuICAgICAgICAgICAgMTBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gbW9tZW50KF9ub3cpLmFkZChpbnRlcnZhbEludCwgaW50ZXJ2YWxbMF0pLnRvRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVyLm1hdGNoKC9cXC0vKSkge1xyXG4gICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbnQgPSBwYXJzZUludChcclxuICAgICAgICAgICAgZmlsdGVyLnN1YnN0cmluZyhmaWx0ZXIuc2VhcmNoKCctJykgKyAxLCBpbnRlcnZhbC5pbmRleCksXHJcbiAgICAgICAgICAgIDEwXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIG1vbWVudChfbm93KS5zdWJ0cmFjdChpbnRlcnZhbEludCwgaW50ZXJ2YWxbMF0pLnRvRGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX25vdztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuY2FsZW5kYXJNb2RlWWVhcikge1xyXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKGZpbHRlcik7XHJcbiAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZpbHRlciA/IG5ldyBEYXRlKGZpbHRlcikgOiBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh2YWx1ZSwgcG9zaXRpb24/LCByZWZyZXNoRmlsdGVyID0gdHJ1ZSkge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWREYXRlKHZhbHVlKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsdWVUbXAgPSB0aGlzLmdldERhdGVUaW1lKHZhbHVlLCBwb3NpdGlvbik7XHJcbiAgICBpZiAodGhpcy5pc0NhbGVuZGFyWWVhck1vZGUoKSkge1xyXG4gICAgICBsZXQgZGF0ZVN0cmluZ0Zyb21ZZWFyTm90aW1lO1xyXG4gICAgICBpZiAocG9zaXRpb24gPT09IDEpIHtcclxuICAgICAgICB0aGlzLmJlZ2luVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9ubHlZZWFyQmVnaW4gPSB0aGlzLmJlZ2luVmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICBkYXRlU3RyaW5nRnJvbVllYXJOb3RpbWUgPSBgJHt0aGlzLm9ubHlZZWFyQmVnaW59LTAxLTAxYDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVuZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vbmx5WWVhckVuZCA9IHRoaXMuZW5kVmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICBkYXRlU3RyaW5nRnJvbVllYXJOb3RpbWUgPSBgJHt0aGlzLm9ubHlZZWFyRW5kfS0wMS0wMWA7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FsbCBzZXJ2aWNlIHdpdGggc3RyaW5nIGRhdGUgd2l0aG91dCB0aW1lXHJcbiAgICAgIHRoaXMuY2hhbmdlUHJvcGVydHkubmV4dCh7XHJcbiAgICAgICAgdmFsdWU6IGRhdGVTdHJpbmdGcm9tWWVhck5vdGltZSxcclxuICAgICAgICBwb3M6IHBvc2l0aW9uLFxyXG4gICAgICAgIHJlZnJlc2hGaWx0ZXJcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gMiAmJiB0aGlzLmNhbGVuZGFyVHlwZSgpID09PSAnZGF0ZScgJiYgIXRoaXMuc2xpZGVyTW9kZSkge1xyXG4gICAgICAvKiBBYm92ZSBtb250aDogc2VlIHllYXJTZWxlY3RlZCBvciBtb250aFNlbGVjdGVkICovXHJcbiAgICAgIHZhbHVlVG1wID0gbW9tZW50KHZhbHVlVG1wKS5lbmRPZignZGF5JykudG9EYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uID09PSAxKSB7XHJcbiAgICAgIHRoaXMuYmVnaW5WYWx1ZSA9IHZhbHVlVG1wO1xyXG4gICAgICBpZiAodGhpcy5yZXN0cmljdGVkVG9TdGVwKCkpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXHJcbiAgICAgICAgICB0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLmFkZFN0ZXAodmFsdWVUbXAsIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyksXHJcbiAgICAgICAgICAyLFxyXG4gICAgICAgICAgcmVmcmVzaEZpbHRlclxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kVmFsdWUgPSB2YWx1ZVRtcDtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlSG91cnNNaW51dGVzQXJyYXkoKTtcclxuICAgIHRoaXMuY2hhbmdlUHJvcGVydHkubmV4dCh7XHJcbiAgICAgIHZhbHVlOiB2YWx1ZVRtcC50b0lTT1N0cmluZygpLFxyXG4gICAgICBwb3M6IHBvc2l0aW9uLFxyXG4gICAgICByZWZyZXNoRmlsdGVyXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGUodmFsdWUpOiBEYXRlIHtcclxuICAgIGlmICghdmFsdWUgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLmN1cnJlbnRGaWx0ZXIuY2FsZW5kYXJNb2RlWWVhcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhclR5cGUoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLmNhbGVuZGFyTW9kZVllYXIpIHtcclxuICAgICAgcmV0dXJuICd5ZWFyJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0ZXBNaWxsaXNlY29uZHMgPCA4NjQwMDAwMCkge1xyXG4gICAgICByZXR1cm4gJ2RhdGV0aW1lJztcclxuICAgIH1cclxuICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgfVxyXG5cclxuICBpc0NhbGVuZGFyWWVhck1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhclR5cGUoKSA9PT0gJ3llYXInKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgeWVhck9ubHlJbnB1dENoYW5nZShjaGFuZ2VFdmVudCwgZGF0ZVBpY2tlcj86IGFueSwgcHJvcGVydHk/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHllYXIgPSBjaGFuZ2VFdmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBkYXRlID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKHllYXIpO1xyXG4gICAgdGhpcy55ZWFyU2VsZWN0ZWQoZGF0ZSwgZGF0ZVBpY2tlciwgcHJvcGVydHkpO1xyXG4gIH1cclxuXHJcbiAgeWVhclNlbGVjdGVkKFxyXG4gICAgeWVhcixcclxuICAgIGRhdGVQaWNrZXI/OiBhbnksXHJcbiAgICBwcm9wZXJ0eT86IHN0cmluZyxcclxuICAgIHJlZnJlc2hGaWx0ZXIgPSB0cnVlXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNZZWFyRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICBpZiAoZGF0ZVBpY2tlcikge1xyXG4gICAgICAgIGRhdGVQaWNrZXIuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgLy8gY2hhbmdlIHZhbHVlIDAxIGphbiB0byAzMSBkZWMgc2FtZSB5ZWFyXHJcbiAgICAgICAgeWVhciA9IG1vbWVudCh5ZWFyKS5lbmRPZigneWVhcicpLnRvRGF0ZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIHByb3BlcnR5ID09PSAnYmVnaW4nICYmXHJcbiAgICAgICAgdGhpcy5yZXN0cmljdGVkVG9TdGVwKCkgJiZcclxuICAgICAgICAhdGhpcy5jYWxlbmRhclR5cGVZZWFyXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMueWVhclNlbGVjdGVkKHllYXIsIHVuZGVmaW5lZCwgJ2VuZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShcclxuICAgICAgICB5ZWFyLFxyXG4gICAgICAgIHByb3BlcnR5ID09PSAnYmVnaW4nID8gMSA6IDIsXHJcbiAgICAgICAgcmVmcmVzaEZpbHRlclxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW9udGhTZWxlY3RlZChcclxuICAgIG1vbnRoLFxyXG4gICAgZGF0ZVBpY2tlcj86IGFueSxcclxuICAgIHByb3BlcnR5Pzogc3RyaW5nLFxyXG4gICAgcmVmcmVzaEZpbHRlciA9IHRydWVcclxuICApIHtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICBpZiAoZGF0ZVBpY2tlcikge1xyXG4gICAgICAgIGRhdGVQaWNrZXIuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgbW9udGggPSBtb21lbnQobW9udGgpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnYmVnaW4nICYmIHRoaXMucmVzdHJpY3RlZFRvU3RlcCgpKSB7XHJcbiAgICAgICAgdGhpcy5tb250aFNlbGVjdGVkKG1vbnRoLCB1bmRlZmluZWQsICdlbmQnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXHJcbiAgICAgICAgbW9udGgsXHJcbiAgICAgICAgcHJvcGVydHkgPT09ICdiZWdpbicgPyAxIDogMixcclxuICAgICAgICByZWZyZXNoRmlsdGVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhclZpZXcoKTogJ21vbnRoJyB8ICd5ZWFyJyB8ICdtdWx0aS15ZWFyJyB7XHJcbiAgICBjb25zdCB0ZXN0ID0gdGhpcy5zdGVwTWlsbGlzZWNvbmRzO1xyXG4gICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKFxyXG4gICAgICB0aGlzLnBhcnNlRmlsdGVyKHRoaXMuY3VycmVudEZpbHRlci5lbmQpLmdldFRpbWUoKSAtXHJcbiAgICAgICAgdGhpcy5wYXJzZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW4pLmdldFRpbWUoKVxyXG4gICAgKTtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc1llYXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiAnbXVsdGkteWVhcic7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzTW9udGhEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiAneWVhcic7XHJcbiAgICB9IGVsc2UgaWYgKHRlc3QgPCA4NjQwMDAwMCAmJiBkaWZmIDwgODY0MDAwMDApIHtcclxuICAgICAgcmV0dXJuICdjbG9jaycgYXMgYW55O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdtb250aCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyKHR5cGU6IHN0cmluZywgZGF0ZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGNvbnN0IGRpZmYgPSBkYXRlVmFsdWUuZ2V0VGltZSgpIC0gbmV3IERhdGUodGhpcy5oYW5kbGVNaW4oKSkuZ2V0VGltZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc1llYXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIGNvbnN0IG1vbnRoRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXHJcbiAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICd5ZWFycycsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoRGlmZlBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZVBsdXMxKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ3llYXJzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc1llYXJzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNZZWFycygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xyXG4gICAgICBjb25zdCBtb250aERpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnbW9udGhzJyxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0eXBlID09PSAnZW5kJykge1xyXG4gICAgICAgIGNvbnN0IGRhdGVWYWx1ZVBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZSkuYWRkKDEsICdkJyk7XHJcbiAgICAgICAgY29uc3QgbW9udGhEaWZmUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlUGx1czEpLmRpZmYoXHJcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXHJcbiAgICAgICAgICAnbW9udGhzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgbW9udGhEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc01vbnRocygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmVnaW4nKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID1cclxuICAgICAgICAgIG1vbnRoRGlmZiAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzTW9udGhzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzV2Vla0R1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgY29uc3Qgd2Vla0RpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnd2Vla3MnLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlKS5hZGQoMSwgJ2QnKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGlmZlBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZVBsdXMxKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ3dlZWtzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgd2Vla0RpZmZQbHVzMSAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzV2Vla3MoKSA9PT0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JlZ2luJykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XHJcbiAgICAgICAgICB3ZWVrRGlmZiAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzV2Vla3MoKSA9PT0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNEYXlEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIGNvbnN0IGRheURpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAnZGF5cycsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xyXG4gICAgICAgIGNvbnN0IGRheURpZmZQbHVzMSA9IG1vbWVudChkYXRlVmFsdWVQbHVzMSkuZGlmZihcclxuICAgICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcclxuICAgICAgICAgICdkYXlzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IF9tb2QgPSBkYXlEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0RheXMoKTtcclxuICAgICAgICB0aGlzLmZpbHRlckVuZEZ1bmN0aW9uID1cclxuICAgICAgICAgIChfbW9kIDwgMC4wMDAwMDAxICYmIF9tb2QgPiAtMC4wMDAwMDAxKSB8fCBfbW9kID09PSAwOyAvLyAxIG1pbGxpc2Vjb25kID0gMS4xNTc0MDc0MDc0MDc0MDc2ZS04XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICBjb25zdCBfbW9kID0gKGRheURpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0RheXMoKSkgKyAxO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XHJcbiAgICAgICAgICAoX21vZCA8IDAuMDAwMDAwMSAmJiBfbW9kID4gLTAuMDAwMDAwMSAmJiBfbW9kICE9PSAwKSB8fCBfbW9kID09PSAxOyAvLyAxIG1pbGxpc2Vjb25kID0gMS4xNTc0MDc0MDc0MDc0MDc2ZS04XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzSG91ckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgY29uc3QgaG91ckRpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxyXG4gICAgICAgICAgJ2hvdXJzJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxyXG4gICAgICAgICAgaG91ckRpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0hvdXJzKCkgPT09IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICBjb25zdCBob3VyRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXHJcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXHJcbiAgICAgICAgICAnaG91cnMnLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID1cclxuICAgICAgICAgIGhvdXJEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNIb3VycygpID09PSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01pbnV0ZUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJFbmRGdW5jdGlvbiA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPSBkaWZmICUgdGhpcy5zdGVwTWlsbGlzZWNvbmRzID09PSAwO1xyXG4gICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID0gZGlmZiAlIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA9PT0gMDtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGdldERhdGVUaW1lKGRhdGUsIHBvcykge1xyXG4gICAgY29uc3QgdmFsdWV0bXAgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGxldCB2YWx1ZXRtcDI7XHJcbiAgICBpZiAoIXRoaXMuc2xpZGVyTW9kZSkge1xyXG4gICAgICBzd2l0Y2ggKHBvcykge1xyXG4gICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XHJcbiAgICAgICAgICAgIHZhbHVldG1wMiA9IHZhbHVldG1wLnNldEhvdXJzKDAsIDApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVldG1wMiA9IHZhbHVldG1wLnNldEhvdXJzKFxyXG4gICAgICAgICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wudmFsdWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIDI6IHtcclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuY2FsZW5kYXJNb2RlWWVhcikge1xyXG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycygwLCAwKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycyhcclxuICAgICAgICAgICAgICB0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC52YWx1ZSxcclxuICAgICAgICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVldG1wMiA/IHZhbHVldG1wMiA6IHZhbHVldG1wKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU1pbnV0ZUluY3JlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01pbnV0ZUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcclxuICAgICAgaWYgKHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA8IDM2MDAwMDApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGVwTWlsbGlzZWNvbmRzIC8gMTAwMCA9PT0gNjBcclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGVwTWlsbGlzZWNvbmRzICUgMzYwMDAwMCkgLyA2MDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0hvdXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiA2MDtcclxuICAgIH1cclxuICAgIHJldHVybiAxO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSG91ckluY3JlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0hvdXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwIC8gNjAgLyA2MDtcclxuICAgIH1cclxuICAgIHJldHVybiAxO1xyXG4gIH1cclxuXHJcbiAgZnVsbEJlZ2luSG91cnNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5iZWdpbkhvdXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZW5ndGg6XHJcbiAgICAgICAgICAgICh0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC52YWx1ZSAtIDApIC8gdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KCkgKyAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iZWdpbkhvdXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7IGxlbmd0aDogKDIzIC0gMCkgLyB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKSArIDEgfSxcclxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iZWdpbkhvdXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJlZ2luVmFsdWUuZ2V0SG91cnMoKSk7XHJcbiAgfVxyXG5cclxuICBmdWxsRW5kSG91cnNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5lbmRIb3VycyA9IEFycmF5LmZyb20oXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGVuZ3RoOlxyXG4gICAgICAgICAgICAoMjMgLSB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLnZhbHVlKSAvXHJcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KCkgK1xyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT5cclxuICAgICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wudmFsdWUgKyBpICogdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KClcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW5kSG91cnMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoMjMgLSAwKSAvIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpICsgMSB9LFxyXG4gICAgICAgIChfLCBpKSA9PiAwICsgaSAqIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuZEhvdXJGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmVuZFZhbHVlLmdldEhvdXJzKCkpO1xyXG4gIH1cclxuXHJcbiAgZnVsbEJlZ2luTWludXRlc0FycmF5KGNoZWNrRW5kVmFsdWU/KSB7XHJcbiAgICBpZiAoY2hlY2tFbmRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmJlZ2luTWludXRlcyA9IEFycmF5LmZyb20oXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGVuZ3RoOlxyXG4gICAgICAgICAgICAodGhpcy5lbmRNaW51dGVGb3JtQ29udHJvbC52YWx1ZSAtIDApIC9cclxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpICtcclxuICAgICAgICAgICAgMVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iZWdpbk1pbnV0ZXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuYmVnaW5WYWx1ZS5nZXRNaW51dGVzKCkpO1xyXG4gIH1cclxuXHJcbiAgZnVsbEVuZE1pbnV0ZXNBcnJheShjaGVja0VuZFZhbHVlPykge1xyXG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcclxuICAgICAgdGhpcy5lbmRNaW51dGVzID0gQXJyYXkuZnJvbShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZW5ndGg6XHJcbiAgICAgICAgICAgICg1OSAtIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC52YWx1ZSkgL1xyXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgK1xyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXywgaSkgPT5cclxuICAgICAgICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC52YWx1ZSArIGkgKiB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZE1pbnV0ZXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXHJcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVNaW51dGVJbmNyZW1lbnQoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmRNaW51dGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmVuZFZhbHVlLmdldE1pbnV0ZXMoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVIb3Vyc01pbnV0ZXNBcnJheSgpIHtcclxuICAgIGNvbnN0IGJlZ2luVG1wID0gbmV3IERhdGUodGhpcy5iZWdpblZhbHVlKTtcclxuICAgIGNvbnN0IGVuZFRtcCA9IG5ldyBEYXRlKHRoaXMuZW5kVmFsdWUpO1xyXG4gICAgaWYgKGJlZ2luVG1wLnNldEhvdXJzKDAsIDApID09PSBlbmRUbXAuc2V0SG91cnMoMCwgMCkpIHtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5Ib3Vyc0FycmF5KHRydWUpO1xyXG4gICAgICB0aGlzLmZ1bGxFbmRIb3Vyc0FycmF5KHRydWUpO1xyXG4gICAgICBpZiAodGhpcy5iZWdpblZhbHVlLmdldEhvdXJzKCkgPT09IHRoaXMuZW5kVmFsdWUuZ2V0SG91cnMoKSkge1xyXG4gICAgICAgIHRoaXMuZnVsbEJlZ2luTWludXRlc0FycmF5KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZnVsbEVuZE1pbnV0ZXNBcnJheSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5Ib3Vyc0FycmF5KCk7XHJcbiAgICAgIHRoaXMuZnVsbEVuZEhvdXJzQXJyYXkoKTtcclxuICAgICAgdGhpcy5mdWxsQmVnaW5NaW51dGVzQXJyYXkoKTtcclxuICAgICAgdGhpcy5mdWxsRW5kTWludXRlc0FycmF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVZhbHVlcygpIHtcclxuICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh0aGlzLmJlZ2luVmFsdWUsIDEsIGZhbHNlKTtcclxuICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh0aGlzLmVuZFZhbHVlLCAyLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXN0cmljdGVkVG9TdGVwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlci5yZXN0cmljdFRvU3RlcFxyXG4gICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5yZXN0cmljdFRvU3RlcFxyXG4gICAgICA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZU1pbigpIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW5cclxuICAgICAgPyB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW5cclxuICAgICAgOiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlXHJcbiAgICAgICAgPyB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlXHJcbiAgICAgICAgOiB0aGlzLl9kZWZhdWx0TWluO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZU1heCgpIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIuZW5kXHJcbiAgICAgID8gdGhpcy5jdXJyZW50RmlsdGVyLmVuZFxyXG4gICAgICA6IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcclxuICAgICAgICA/IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcclxuICAgICAgICA6IHRoaXMuX2RlZmF1bHRNYXg7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQcm9wZXJ0eUJ5UGFzcyhldmVudCkge1xyXG4gICAgdGhpcy5jaGFuZ2VQcm9wZXJ0eS5uZXh0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG1vZGVDaGFuZ2UoZXZlbnQpIHtcclxuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyU3RhdGVEaXNhYmxlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlcikge1xyXG4gICAgICB0aGlzLmZpbHRlclN0YXRlRGlzYWJsZSA9ICF0aGlzLmN1cnJlbnRGaWx0ZXIuYWN0aXZlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJTdGF0ZURpc2FibGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhbGVuZGFyVHlwZSgpID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlclN0YXRlRGlzYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5lbmRIb3VyRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZW5kTWludXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZW5kSG91ckZvcm1Db250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZW5kTWludXRlRm9ybUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZShzdHJpbmdEYXRlOiBzdHJpbmcpOiBEYXRlIHtcclxuICAgIC8vIHdhcm5pbmcgY3JlYXRlIGRhdGUgd2l0aCBubyB0aW1lIG1ha2UgYSBkYXRlIFVUQyB3aXRoIFRaIGFuZCB0aGUgZGF0ZSBjcmVhdGUgbWF5YmUgbm90IHRoZSBzYW1lIHllYXIsIG1vbnRoIGFuZCBkYXlcclxuICAgIC8vIGV4ZW1wbGU6XHJcbiAgICAvLyBuZXcgRGF0ZSgnMjAyMi0wMS0wMScpIC0+IEZyaSBEZWMgMzEgMjAyMSAxOTowMDowMCBHTVQtMDUwMCAoaGV1cmUgbm9ybWFsZSBkZSBs4oCZRXN0IG5vcmQtYW3DqXJpY2FpbilcclxuICAgIC8vIHRvIGNyZWF0ZSBzYW1lIGRhdGUgYXMgc3RyaW5nLCBhZGQgdGltZSAwMCBpbiB0aGUgY3JlYXRpb25cclxuICAgIC8vIG5ldyBEYXRlKCcyMDIyLTAxLTAxIDAwOjAwOjAwJykgLT4gU2F0IEphbiAwMSAyMDIyIDAwOjAwOjAwIEdNVC0wNTAwIChoZXVyZSBub3JtYWxlIGRlIGzigJlFc3Qgbm9yZC1hbcOpcmljYWluKVxyXG4gICAgbGV0IHllYXI7XHJcbiAgICBsZXQgbW9udGggPSAnMDEnO1xyXG4gICAgbGV0IGRheSA9ICcwMSc7XHJcbiAgICBpZiAoc3RyaW5nRGF0ZS5sZW5ndGggPT09IDEwKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVJdGVtcyA9IHN0cmluZ0RhdGUuc3BsaXQoJy0nKTtcclxuICAgICAgaWYgKGRhdGVJdGVtcy5sZW5ndGggIT09IDMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAnRXJyb3IgaW4gY29uZmlnIGRhdGUgYmVnaW4tZW5kIGZvciBvZ2NGaWx0ZXI6IERhdGUgd2l0aG91dCB0aW1lIGZvcm1hdCBuZWVkIHRvIGJlIFlZWVktTU0tREQgb3IgWVlZWSdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHllYXIgPSBkYXRlSXRlbXNbMF07XHJcbiAgICAgICAgbW9udGggPSBkYXRlSXRlbXNbMV07XHJcbiAgICAgICAgZGF5ID0gZGF0ZUl0ZW1zWzJdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHN0cmluZ0RhdGUubGVuZ3RoID09PSA0KSB7XHJcbiAgICAgIHllYXIgPSBzdHJpbmdEYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cmluZ0RhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBEYXRlKGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAwMDowMDowMGApO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXIoKSB7XHJcbiAgICBsZXQgZmlsdGVyT3JpZ2luQ29uZmlnID0gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVyc1xyXG4gICAgICAuZmlsdGVycyBhcyBPZ2NGaWx0ZXJEdXJpbmdPcHRpb25zO1xyXG5cclxuICAgIGxldCBtaW5EZWZhdWx0RGF0ZTtcclxuICAgIGxldCBtYXhEZWZhdWx0RGF0ZTtcclxuICAgIGxldCBtaW5EZWZhdWx0SVNPU3RyaW5nO1xyXG4gICAgbGV0IG1heERlZmF1bHRJU09TdHJpbmc7XHJcblxyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJUeXBlWWVhcikge1xyXG4gICAgICBpZiAoZmlsdGVyT3JpZ2luQ29uZmlnLmVuZCA9PT0gJ3RvZGF5Jykge1xyXG4gICAgICAgIGxldCB0b2RheURhdGVTdHJpbmdOb1RpbWUgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKTsgLy8gJzIwMjItMDItMTMnXHJcbiAgICAgICAgbWF4RGVmYXVsdElTT1N0cmluZyA9IGAke3RvZGF5RGF0ZVN0cmluZ05vVGltZS5zdWJzdHJpbmcoMCwgNCl9LTAxLTAxYDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXhEZWZhdWx0SVNPU3RyaW5nID0gYCR7ZmlsdGVyT3JpZ2luQ29uZmlnLmVuZC5zdWJzdHJpbmcoMCwgNCl9LTAxLTAxYDtcclxuICAgICAgfVxyXG4gICAgICBtaW5EZWZhdWx0SVNPU3RyaW5nID0gYCR7ZmlsdGVyT3JpZ2luQ29uZmlnLmJlZ2luLnN1YnN0cmluZygwLCA0KX0tMDEtMDFgO1xyXG4gICAgICBtaW5EZWZhdWx0RGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZShtaW5EZWZhdWx0SVNPU3RyaW5nKTtcclxuICAgICAgbWF4RGVmYXVsdERhdGUgPSB0aGlzLmdldERhdGVGcm9tU3RyaW5nV2l0aG91dFRpbWUobWF4RGVmYXVsdElTT1N0cmluZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtaW5EZWZhdWx0RGF0ZSA9IHRoaXMucGFyc2VGaWx0ZXIoZmlsdGVyT3JpZ2luQ29uZmlnLmJlZ2luKTtcclxuICAgICAgbWF4RGVmYXVsdERhdGUgPSB0aGlzLnBhcnNlRmlsdGVyKGZpbHRlck9yaWdpbkNvbmZpZy5lbmQpO1xyXG4gICAgICBtaW5EZWZhdWx0SVNPU3RyaW5nID0gbWluRGVmYXVsdERhdGUudG9JU09TdHJpbmcoKTtcclxuICAgICAgbWF4RGVmYXVsdElTT1N0cmluZyA9IG1heERlZmF1bHREYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW4gIT09IG1pbkRlZmF1bHRJU09TdHJpbmcgfHxcclxuICAgICAgdGhpcy5jdXJyZW50RmlsdGVyLmVuZCAhPT0gbWF4RGVmYXVsdElTT1N0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYmVnaW5WYWx1ZSA9IG1pbkRlZmF1bHREYXRlO1xyXG4gICAgICB0aGlzLmVuZFZhbHVlID0gbWF4RGVmYXVsdERhdGU7XHJcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGaWx0ZXJTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuYWN0aXZlID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlci5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlci5hY3RpdmUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRGaWx0ZXJTdGF0ZURpc2FibGUoKTtcclxuICAgIHRoaXMudXBkYXRlVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVmFsaWREYXRlKGRhdGU6IERhdGUpIHtcclxuICAgIHJldHVybiBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtY29udGFpbmVyXCI+XG4gIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgKm5nSWY9XCJ0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucz8uZW5hYmxlZFwiXG4gICAgWyhuZ01vZGVsKV09XCJzbGlkZXJNb2RlXCJcbiAgICAoY2hhbmdlKT1cIm1vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5maWx0ZXIuc2xpZGVyTW9kZVRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgPGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIiAqbmdJZj1cInNsaWRlck1vZGVcIj5cbiAgICA8aWdvLW9nYy1maWx0ZXItdGltZS1zbGlkZXJcbiAgICAgIFtiZWdpbl09XCJiZWdpblZhbHVlXCJcbiAgICAgIFttYXhdPVwidGhpcy5yZXN0cmljdGVkVG9TdGVwKCkgPyB0aGlzLm1heERhdGUgOiB0aGlzLmVuZFZhbHVlXCJcbiAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxuICAgICAgW2RhdGFzb3VyY2VdPVwiZGF0YXNvdXJjZVwiXG4gICAgICAoY2hhbmdlUHJvcGVydHkpPVwiY2hhbmdlUHJvcGVydHlCeVBhc3MoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvaWdvLW9nYy1maWx0ZXItdGltZS1zbGlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCIhc2xpZGVyTW9kZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ5ZWFyLWlucHV0LWNvbnRhaW5lclwiICpuZ0lmPVwiY2FsZW5kYXJUeXBlWWVhclwiPlxuICAgICAgPCEtLSB0byBlbXVsYXRlIGEgeWVhci1waWNrZXIsIDIgaW5wdXQ6IGZpcnN0IGlucHV0IHRvIHNob3cgdXNlciBqdXN0IHllYXIgYW5kIHNlY29uZCBpbnB1dCBoaWRlbiBhbmQgYmluZCBcbiAgICAgICAgd2l0aCB0aGUgZGF0ZXBpY2tlciAgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ5ZWFyLWlucHV0XCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuc3RhcnRZZWFyJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIGNsYXNzPVwieWVhci1pbnB1dC1vbmx5LXllYXJcIlxuICAgICAgICAgIHZhbHVlPVwie3sgb25seVllYXJCZWdpbiB9fVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ5ZWFyT25seUlucHV0Q2hhbmdlKCRldmVudCwgYmVnaW5EYXRlcGlja2VyLCAnYmVnaW4nKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICBbZm9yXT1cImJlZ2luRGF0ZXBpY2tlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cblxuICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICBwYW5lbENsYXNzPVwiZGF0ZXBpY2tlci15ZWFyXCJcbiAgICAgICAgICAjYmVnaW5EYXRlcGlja2VyXG4gICAgICAgICAgW3N0YXJ0Vmlld109XCJjYWxlbmRhclZpZXcoKVwiXG4gICAgICAgICAgW3N0YXJ0QXRdPVwiYmVnaW5WYWx1ZVwiXG4gICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJ5ZWFyU2VsZWN0ZWQoJGV2ZW50LCBiZWdpbkRhdGVwaWNrZXIsICdiZWdpbicpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxuXG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNiZWdpblllYXJcbiAgICAgICAgICBjbGFzcz1cInllYXItaW5wdXQtaGlkZVwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJiZWdpbkRhdGVwaWNrZXJcIlxuICAgICAgICAgIGVuYWJsZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiXG4gICAgICAgICAgICBiZWdpblZhbHVlID8gYmVnaW5WYWx1ZSA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbbWluXT1cImhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXCJcbiAgICAgICAgICBbbWF4XT1cIlxuICAgICAgICAgICAgZW5kVmFsdWUgJiYgIXJlc3RyaWN0ZWRUb1N0ZXAoKVxuICAgICAgICAgICAgICA/IGVuZFZhbHVlXG4gICAgICAgICAgICAgIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwieWVhci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLmVuZFllYXInIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgY2xhc3M9XCJ5ZWFyLWlucHV0LW9ubHkteWVhclwiXG4gICAgICAgICAgdmFsdWU9XCJ7eyBvbmx5WWVhckVuZCB9fVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ5ZWFyT25seUlucHV0Q2hhbmdlKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxuICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgIFtmb3JdPVwiZW5kRGF0ZXBpY2tlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyXG4gICAgICAgICAgcGFuZWxDbGFzcz1cImRhdGVwaWNrZXIteWVhclwiXG4gICAgICAgICAgI2VuZERhdGVwaWNrZXJcbiAgICAgICAgICBbc3RhcnRWaWV3XT1cImNhbGVuZGFyVmlldygpXCJcbiAgICAgICAgICBbc3RhcnRBdF09XCJlbmRWYWx1ZVwiXG4gICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJ5ZWFyU2VsZWN0ZWQoJGV2ZW50LCBlbmREYXRlcGlja2VyLCAnZW5kJylcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2VuZFllYXJcbiAgICAgICAgICBjbGFzcz1cInllYXItaW5wdXQtaGlkZVwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJlbmREYXRlcGlja2VyXCJcbiAgICAgICAgICBlbmFibGVkPVwiZmFsc2VcIlxuICAgICAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVuZFZhbHVlID8gZW5kVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVwiXG4gICAgICAgICAgW21pbl09XCJcbiAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcbiAgICAgICAgICBcIlxuICAgICAgICAgIFttYXhdPVwiaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcIlxuICAgICAgICAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZXNldEZpbHRlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwie3sgcmVzZXRJY29uIH19XCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtZmlsdGVyLXN0YXRlXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUZpbHRlclN0YXRlKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci50b2dnbGVGaWx0ZXJTdGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiIWZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCJjYWxlbmRhclR5cGUoKSAhPT0gJ3llYXInXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGF0ZS1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIFtmb3JdPVwiYmVnaW5EYXRlcGlja2VyXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxuICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNiZWdpblxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImJlZ2luRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5nZW8udGltZUZpbHRlci5zdGFydERhdGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXG4gICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGJlZ2luLnZhbHVlLCAxKVwiXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJmaWx0ZXJCZWdpbkZ1bmN0aW9uXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJcbiAgICAgICAgICAgICAgYmVnaW5WYWx1ZSA/IGJlZ2luVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttaW5dPVwiaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcIlxuICAgICAgICAgICAgW21heF09XCJcbiAgICAgICAgICAgICAgZW5kVmFsdWUgJiYgIXJlc3RyaWN0ZWRUb1N0ZXAoKVxuICAgICAgICAgICAgICAgID8gZW5kVmFsdWVcbiAgICAgICAgICAgICAgICA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGUpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGxlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICAgICNiZWdpbkRhdGVwaWNrZXJcbiAgICAgICAgICAgIFtzdGFydFZpZXddPVwiY2FsZW5kYXJWaWV3KClcIlxuICAgICAgICAgICAgW3N0YXJ0QXRdPVwiYmVnaW5WYWx1ZVwiXG4gICAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInllYXJTZWxlY3RlZCgkZXZlbnQsIGJlZ2luRGF0ZXBpY2tlciwgJ2JlZ2luJylcIlxuICAgICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwibW9udGhTZWxlY3RlZCgkZXZlbnQsIGJlZ2luRGF0ZXBpY2tlciwgJ2JlZ2luJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYWxlbmRhclR5cGUoKSA9PT0gJ2RhdGV0aW1lJ1wiIGNsYXNzPVwidGltZS1pbnB1dFwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImhvdXItaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuaG91cicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJiZWdpbkhvdXJGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShiZWdpbi52YWx1ZSwgMSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBiZWdpbkhvdXJzXCIgW3ZhbHVlXT1cImhvdXJcIj57e1xuICAgICAgICAgICAgICAgIGhvdXJcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtaW51dGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIubWludXRlJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImJlZ2luTWludXRlRm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCIhY3VycmVudEZpbHRlci5hY3RpdmVcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoYmVnaW4udmFsdWUsIDEpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbWludXRlIG9mIGJlZ2luTWludXRlc1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm1pbnV0ZVwiXG4gICAgICAgICAgICAgICAgPnt7IG1pbnV0ZSB9fTwvbWF0LW9wdGlvblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIiFyZXN0cmljdGVkVG9TdGVwKClcIiBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRhdGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBbZm9yXT1cImVuZERhdGVwaWNrZXJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgICAgPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2VuZFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImVuZERhdGVwaWNrZXJcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpZ28uZ2VvLnRpbWVGaWx0ZXIuZW5kRGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoZW5kLnZhbHVlLCAyKVwiXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJmaWx0ZXJFbmRGdW5jdGlvblwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiXG4gICAgICAgICAgICAgIGVuZFZhbHVlID8gZW5kVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttaW5dPVwiXG4gICAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbbWF4XT1cImhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGUpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxsZXJcIj48L3NwYW4+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyXG4gICAgICAgICAgICAjZW5kRGF0ZXBpY2tlclxuICAgICAgICAgICAgW3N0YXJ0Vmlld109XCJjYWxlbmRhclZpZXcoKVwiXG4gICAgICAgICAgICBbc3RhcnRBdF09XCJlbmRWYWx1ZVwiXG4gICAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInllYXJTZWxlY3RlZCgkZXZlbnQsIGVuZERhdGVwaWNrZXIsICdlbmQnKVwiXG4gICAgICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJtb250aFNlbGVjdGVkKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FsZW5kYXJUeXBlKCkgPT09ICdkYXRldGltZSdcIiBjbGFzcz1cInRpbWUtaW5wdXRcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJob3VyLWlucHV0XCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLmhvdXInIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZW5kSG91ckZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGVuZC52YWx1ZSwgMilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBlbmRIb3Vyc1wiIFt2YWx1ZV09XCJob3VyXCI+e3tcbiAgICAgICAgICAgICAgICBob3VyXG4gICAgICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWludXRlLWlucHV0XCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLm1pbnV0ZScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJlbmRNaW51dGVGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShlbmQudmFsdWUsIDIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBlbmRNaW51dGVzXCIgW3ZhbHVlXT1cIm1pbnV0ZVwiPnt7XG4gICAgICAgICAgICAgICAgbWludXRlXG4gICAgICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZXNldEZpbHRlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwie3sgcmVzZXRJY29uIH19XCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtZmlsdGVyLXN0YXRlXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUZpbHRlclN0YXRlKClcIlxuICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZmlsdGVyLnRvZ2dsZUZpbHRlclN0YXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiIWZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=