@igo2/geo 18.0.1-next.2 → 18.0.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.
- package/esm2022/igo2-geo.mjs +5 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +234 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +272 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +19 -0
- package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +136 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +60 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +232 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +24 -0
- package/esm2022/lib/catalog/catalog-library/index.mjs +4 -0
- package/esm2022/lib/catalog/catalog.module.mjs +26 -0
- package/esm2022/lib/catalog/index.mjs +6 -0
- package/esm2022/lib/catalog/shared/catalog.abstract.mjs +32 -0
- package/esm2022/lib/catalog/shared/catalog.enum.mjs +16 -0
- package/esm2022/lib/catalog/shared/catalog.interface.mjs +2 -0
- package/esm2022/lib/catalog/shared/catalog.service.mjs +706 -0
- package/esm2022/lib/catalog/shared/catalogs.mjs +75 -0
- package/esm2022/lib/catalog/shared/index.mjs +5 -0
- package/esm2022/lib/datasource/index.mjs +3 -0
- package/esm2022/lib/datasource/shared/capabilities.interface.mjs +17 -0
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +441 -0
- package/esm2022/lib/datasource/shared/datasource.service.mjs +258 -0
- package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +222 -0
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +118 -0
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +24 -0
- package/esm2022/lib/datasource/shared/datasources/data.service.mjs +3 -0
- package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +42 -0
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +52 -0
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +70 -0
- package/esm2022/lib/datasource/shared/datasources/index.mjs +36 -0
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +33 -0
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +14 -0
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +60 -0
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +17 -0
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +56 -0
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +137 -0
- package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +170 -0
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +227 -0
- package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +224 -0
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +18 -0
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +11 -0
- package/esm2022/lib/datasource/shared/index.mjs +6 -0
- package/esm2022/lib/datasource/shared/options/index.mjs +5 -0
- package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +15 -0
- package/esm2022/lib/datasource/shared/options/options-api.service.mjs +85 -0
- package/esm2022/lib/datasource/shared/options/options.service.mjs +3 -0
- package/esm2022/lib/datasource/utils/index.mjs +2 -0
- package/esm2022/lib/datasource/utils/tilegrid.mjs +20 -0
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +246 -0
- package/esm2022/lib/directions/directions-buttons/index.mjs +2 -0
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +312 -0
- package/esm2022/lib/directions/directions-inputs/index.mjs +2 -0
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +192 -0
- package/esm2022/lib/directions/directions-results/index.mjs +2 -0
- package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -0
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +3 -0
- package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +23 -0
- package/esm2022/lib/directions/directions-sources/index.mjs +5 -0
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +159 -0
- package/esm2022/lib/directions/directions.component.mjs +437 -0
- package/esm2022/lib/directions/directions.module.mjs +46 -0
- package/esm2022/lib/directions/directions.provider.mjs +16 -0
- package/esm2022/lib/directions/index.mjs +8 -0
- package/esm2022/lib/directions/shared/directions-source.service.mjs +18 -0
- package/esm2022/lib/directions/shared/directions.enum.mjs +72 -0
- package/esm2022/lib/directions/shared/directions.interface.mjs +2 -0
- package/esm2022/lib/directions/shared/directions.service.mjs +239 -0
- package/esm2022/lib/directions/shared/directions.utils.mjs +522 -0
- package/esm2022/lib/directions/shared/index.mjs +6 -0
- package/esm2022/lib/directions/shared/store.mjs +21 -0
- package/esm2022/lib/download/download-button/download-button.component.mjs +48 -0
- package/esm2022/lib/download/download-button/index.mjs +2 -0
- package/esm2022/lib/download/download.module.mjs +24 -0
- package/esm2022/lib/download/index.mjs +3 -0
- package/esm2022/lib/download/shared/download.interface.mjs +2 -0
- package/esm2022/lib/download/shared/download.service.mjs +67 -0
- package/esm2022/lib/download/shared/index.mjs +3 -0
- package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +42 -0
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +421 -0
- package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +28 -0
- package/esm2022/lib/draw/draw/draw.component.mjs +1136 -0
- package/esm2022/lib/draw/draw/draw.module.mjs +19 -0
- package/esm2022/lib/draw/drawingTool.module.mjs +18 -0
- package/esm2022/lib/draw/index.mjs +3 -0
- package/esm2022/lib/draw/shared/draw-icon.service.mjs +30 -0
- package/esm2022/lib/draw/shared/draw.enum.mjs +21 -0
- package/esm2022/lib/draw/shared/draw.interface.mjs +2 -0
- package/esm2022/lib/draw/shared/draw.utils.mjs +125 -0
- package/esm2022/lib/draw/shared/index.mjs +5 -0
- package/esm2022/lib/environment/environment.interface.mjs +2 -0
- package/esm2022/lib/environment/index.mjs +2 -0
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +306 -0
- package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +56 -0
- package/esm2022/lib/feature/feature-details/feature-details.module.mjs +26 -0
- package/esm2022/lib/feature/feature-details/index.mjs +4 -0
- package/esm2022/lib/feature/feature-form/feature-form.component.mjs +101 -0
- package/esm2022/lib/feature/feature-form/feature-form.module.mjs +19 -0
- package/esm2022/lib/feature/feature.module.mjs +26 -0
- package/esm2022/lib/feature/index.mjs +5 -0
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +28 -0
- package/esm2022/lib/feature/shared/feature.enums.mjs +9 -0
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +2 -0
- package/esm2022/lib/feature/shared/feature.utils.mjs +332 -0
- package/esm2022/lib/feature/shared/index.mjs +8 -0
- package/esm2022/lib/feature/shared/store.mjs +143 -0
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +216 -0
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +119 -0
- package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +99 -0
- package/esm2022/lib/feature/shared/strategies/index.mjs +8 -0
- package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +103 -0
- package/esm2022/lib/feature/shared/strategies/loading.mjs +136 -0
- package/esm2022/lib/feature/shared/strategies/search.mjs +158 -0
- package/esm2022/lib/feature/shared/strategies/selection.mjs +385 -0
- package/esm2022/lib/feature/shared/strategies.utils.mjs +37 -0
- package/esm2022/lib/filter/filter.module.mjs +131 -0
- package/esm2022/lib/filter/index.mjs +17 -0
- package/esm2022/lib/filter/ogc-filter-button/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +141 -0
- package/esm2022/lib/filter/ogc-filter-form/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +325 -0
- package/esm2022/lib/filter/ogc-filter-selection/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +787 -0
- package/esm2022/lib/filter/ogc-filter-time/index.mjs +3 -0
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +201 -0
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +665 -0
- package/esm2022/lib/filter/ogc-filterable-form/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +66 -0
- package/esm2022/lib/filter/ogc-filterable-item/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +244 -0
- package/esm2022/lib/filter/ogc-filterable-list/index.mjs +3 -0
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +39 -0
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +32 -0
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +63 -0
- package/esm2022/lib/filter/shared/index.mjs +12 -0
- package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
- package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +30 -0
- package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/ogc-filter.mjs +756 -0
- package/esm2022/lib/filter/shared/ogc-filter.service.mjs +47 -0
- package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +23 -0
- package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/spatial-filter.service.mjs +282 -0
- package/esm2022/lib/filter/shared/time-filter.enum.mjs +13 -0
- package/esm2022/lib/filter/shared/time-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/time-filter.service.mjs +107 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +875 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +191 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +120 -0
- package/esm2022/lib/filter/time-filter-button/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +70 -0
- package/esm2022/lib/filter/time-filter-form/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +537 -0
- package/esm2022/lib/filter/time-filter-item/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +90 -0
- package/esm2022/lib/filter/time-filter-list/index.mjs +3 -0
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +39 -0
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +24 -0
- package/esm2022/lib/geo.module.mjs +63 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +559 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +170 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +24 -0
- package/esm2022/lib/geometry/geometry-form-field/index.mjs +4 -0
- package/esm2022/lib/geometry/geometry.module.mjs +18 -0
- package/esm2022/lib/geometry/index.mjs +3 -0
- package/esm2022/lib/geometry/shared/controls/draw.mjs +340 -0
- package/esm2022/lib/geometry/shared/controls/index.mjs +4 -0
- package/esm2022/lib/geometry/shared/controls/modify.mjs +538 -0
- package/esm2022/lib/geometry/shared/controls/slice.mjs +190 -0
- package/esm2022/lib/geometry/shared/geometry.errors.mjs +24 -0
- package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +2 -0
- package/esm2022/lib/geometry/shared/geometry.utils.mjs +113 -0
- package/esm2022/lib/geometry/shared/index.mjs +5 -0
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +49 -0
- package/esm2022/lib/import-export/export-button/index.mjs +2 -0
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +876 -0
- package/esm2022/lib/import-export/import-export/index.mjs +2 -0
- package/esm2022/lib/import-export/import-export.module.mjs +31 -0
- package/esm2022/lib/import-export/index.mjs +5 -0
- package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +114 -0
- package/esm2022/lib/import-export/shared/export.errors.mjs +15 -0
- package/esm2022/lib/import-export/shared/export.interface.mjs +2 -0
- package/esm2022/lib/import-export/shared/export.service.mjs +378 -0
- package/esm2022/lib/import-export/shared/export.type.mjs +13 -0
- package/esm2022/lib/import-export/shared/export.utils.mjs +51 -0
- package/esm2022/lib/import-export/shared/import.errors.mjs +39 -0
- package/esm2022/lib/import-export/shared/import.interface.mjs +2 -0
- package/esm2022/lib/import-export/shared/import.service.mjs +221 -0
- package/esm2022/lib/import-export/shared/import.utils.mjs +203 -0
- package/esm2022/lib/import-export/shared/index.mjs +11 -0
- package/esm2022/lib/layer/index.mjs +16 -0
- package/esm2022/lib/layer/layer-group/index.mjs +2 -0
- package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
- package/esm2022/lib/layer/layer-item/index.mjs +2 -0
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +196 -0
- package/esm2022/lib/layer/layer-legend/index.mjs +2 -0
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +287 -0
- package/esm2022/lib/layer/layer-legend-item/index.mjs +2 -0
- package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +85 -0
- package/esm2022/lib/layer/layer-legend-list/index.mjs +3 -0
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +54 -0
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +104 -0
- package/esm2022/lib/layer/layer-list/index.mjs +2 -0
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +232 -0
- package/esm2022/lib/layer/layer-list-tool/index.mjs +4 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +92 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +61 -0
- package/esm2022/lib/layer/layer-search/index.mjs +2 -0
- package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
- package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +26 -0
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
- package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
- package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
- package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
- package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
- package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
- package/esm2022/lib/layer/layer.module.mjs +107 -0
- package/esm2022/lib/layer/shared/clusterParam.mjs +2 -0
- package/esm2022/lib/layer/shared/index.mjs +6 -0
- package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
- package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
- package/esm2022/lib/layer/shared/layer.enums.mjs +2 -0
- package/esm2022/lib/layer/shared/layer.service.mjs +315 -0
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +75 -0
- package/esm2022/lib/layer/shared/layers/index.mjs +18 -0
- package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
- package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +7 -0
- package/esm2022/lib/layer/shared/layers/layer.mjs +178 -0
- package/esm2022/lib/layer/shared/layers/legend.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +55 -0
- package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +576 -0
- package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +112 -0
- package/esm2022/lib/layer/track-feature-button/index.mjs +2 -0
- package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +54 -0
- package/esm2022/lib/layer/utils/image-watcher.mjs +62 -0
- package/esm2022/lib/layer/utils/index.mjs +6 -0
- package/esm2022/lib/layer/utils/layer.utils.mjs +57 -0
- package/esm2022/lib/layer/utils/outputLegend.mjs +32 -0
- package/esm2022/lib/layer/utils/tile-watcher.mjs +52 -0
- package/esm2022/lib/layer/utils/vector-watcher.mjs +50 -0
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +87 -0
- package/esm2022/lib/map/baselayers-switcher/index.mjs +3 -0
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +122 -0
- package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +78 -0
- package/esm2022/lib/map/geolocate-button/index.mjs +2 -0
- package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +73 -0
- package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +2 -0
- package/esm2022/lib/map/home-extent-button/index.mjs +3 -0
- package/esm2022/lib/map/index.mjs +14 -0
- package/esm2022/lib/map/info-section/index.mjs +2 -0
- package/esm2022/lib/map/info-section/info-section.component.mjs +15 -0
- package/esm2022/lib/map/map-browser/index.mjs +2 -0
- package/esm2022/lib/map/map-browser/map-browser.component.mjs +67 -0
- package/esm2022/lib/map/map-center/index.mjs +2 -0
- package/esm2022/lib/map/map-center/map-center.component.mjs +56 -0
- package/esm2022/lib/map/map.module.mjs +89 -0
- package/esm2022/lib/map/menu-button/index.mjs +2 -0
- package/esm2022/lib/map/menu-button/menu-button.component.mjs +57 -0
- package/esm2022/lib/map/offline-button/index.mjs +2 -0
- package/esm2022/lib/map/offline-button/offline-button.component.mjs +53 -0
- package/esm2022/lib/map/rotation-button/index.mjs +2 -0
- package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +58 -0
- package/esm2022/lib/map/shared/controllers/controller.mjs +44 -0
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +8 -0
- package/esm2022/lib/map/shared/controllers/geolocation.mjs +431 -0
- package/esm2022/lib/map/shared/controllers/index.mjs +5 -0
- package/esm2022/lib/map/shared/controllers/view.mjs +361 -0
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +481 -0
- package/esm2022/lib/map/shared/index.mjs +15 -0
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +238 -0
- package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +122 -0
- package/esm2022/lib/map/shared/map.abstract.mjs +24 -0
- package/esm2022/lib/map/shared/map.enums.mjs +6 -0
- package/esm2022/lib/map/shared/map.interface.mjs +2 -0
- package/esm2022/lib/map/shared/map.mjs +201 -0
- package/esm2022/lib/map/shared/map.service.mjs +29 -0
- package/esm2022/lib/map/shared/map.utils.mjs +455 -0
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +114 -0
- package/esm2022/lib/map/shared/projection.interfaces.mjs +2 -0
- package/esm2022/lib/map/shared/projection.service.mjs +67 -0
- package/esm2022/lib/map/shared/projection.utils.mjs +122 -0
- package/esm2022/lib/map/swipe-control/index.mjs +2 -0
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +211 -0
- package/esm2022/lib/map/utils/index.mjs +2 -0
- package/esm2022/lib/map/utils/layer-watcher.mjs +112 -0
- package/esm2022/lib/map/wake-lock-button/index.mjs +2 -0
- package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +103 -0
- package/esm2022/lib/map/zoom-button/index.mjs +2 -0
- package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +35 -0
- package/esm2022/lib/measure/index.mjs +3 -0
- package/esm2022/lib/measure/measure.module.mjs +20 -0
- package/esm2022/lib/measure/measurer/index.mjs +6 -0
- package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +40 -0
- package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +38 -0
- package/esm2022/lib/measure/measurer/measurer-item.component.mjs +143 -0
- package/esm2022/lib/measure/measurer/measurer.component.mjs +948 -0
- package/esm2022/lib/measure/measurer/measurer.module.mjs +20 -0
- package/esm2022/lib/measure/shared/index.mjs +4 -0
- package/esm2022/lib/measure/shared/measure.enum.mjs +37 -0
- package/esm2022/lib/measure/shared/measure.interfaces.mjs +2 -0
- package/esm2022/lib/measure/shared/measure.utils.mjs +497 -0
- package/esm2022/lib/metadata/index.mjs +4 -0
- package/esm2022/lib/metadata/metadata-button/index.mjs +2 -0
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +96 -0
- package/esm2022/lib/metadata/metadata.module.mjs +29 -0
- package/esm2022/lib/metadata/shared/index.mjs +3 -0
- package/esm2022/lib/metadata/shared/metadata.interface.mjs +2 -0
- package/esm2022/lib/metadata/shared/metadata.service.mjs +18 -0
- package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +130 -0
- package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +6 -0
- package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +2 -0
- package/esm2022/lib/offline/geoDB/geoDB.service.mjs +172 -0
- package/esm2022/lib/offline/geoDB/index.mjs +5 -0
- package/esm2022/lib/offline/index.mjs +6 -0
- package/esm2022/lib/offline/layerDB/index.mjs +3 -0
- package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +2 -0
- package/esm2022/lib/offline/layerDB/layerDB.service.mjs +83 -0
- package/esm2022/lib/offline/offline.interface.mjs +2 -0
- package/esm2022/lib/offline/offline.provider.mjs +50 -0
- package/esm2022/lib/offline/shared/geo-network.service.mjs +79 -0
- package/esm2022/lib/offline/shared/index.mjs +2 -0
- package/esm2022/lib/overlay/index.mjs +2 -0
- package/esm2022/lib/overlay/shared/index.mjs +4 -0
- package/esm2022/lib/overlay/shared/overlay.enum.mjs +8 -0
- package/esm2022/lib/overlay/shared/overlay.mjs +139 -0
- package/esm2022/lib/overlay/shared/overlay.utils.mjs +17 -0
- package/esm2022/lib/print/index.mjs +4 -0
- package/esm2022/lib/print/print/print.component.mjs +116 -0
- package/esm2022/lib/print/print-form/index.mjs +2 -0
- package/esm2022/lib/print/print-form/print-form.component.mjs +320 -0
- package/esm2022/lib/print/print.module.mjs +20 -0
- package/esm2022/lib/print/shared/geopdf.mjs +68 -0
- package/esm2022/lib/print/shared/index.mjs +5 -0
- package/esm2022/lib/print/shared/print.interface.mjs +2 -0
- package/esm2022/lib/print/shared/print.service.mjs +1136 -0
- package/esm2022/lib/print/shared/print.type.mjs +30 -0
- package/esm2022/lib/query/index.mjs +2 -0
- package/esm2022/lib/query/query.module.mjs +27 -0
- package/esm2022/lib/query/shared/index.mjs +8 -0
- package/esm2022/lib/query/shared/query-search-source.mjs +35 -0
- package/esm2022/lib/query/shared/query-search-source.providers.mjs +22 -0
- package/esm2022/lib/query/shared/query.directive.mjs +290 -0
- package/esm2022/lib/query/shared/query.enums.mjs +32 -0
- package/esm2022/lib/query/shared/query.interfaces.mjs +2 -0
- package/esm2022/lib/query/shared/query.service.mjs +753 -0
- package/esm2022/lib/query/shared/query.utils.mjs +45 -0
- package/esm2022/lib/search/index.mjs +10 -0
- package/esm2022/lib/search/search-bar/search-bar.component.mjs +483 -0
- package/esm2022/lib/search/search-bar/search-bar.module.mjs +19 -0
- package/esm2022/lib/search/search-results/index.mjs +5 -0
- package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +101 -0
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +433 -0
- package/esm2022/lib/search/search-results/search-results-item.component.mjs +119 -0
- package/esm2022/lib/search/search-results/search-results.component.mjs +297 -0
- package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
- package/esm2022/lib/search/search-results/search-results.module.mjs +20 -0
- package/esm2022/lib/search/search-selector/search-selector.component.mjs +118 -0
- package/esm2022/lib/search/search-selector/search-selector.module.mjs +19 -0
- package/esm2022/lib/search/search-settings/search-settings.component.mjs +264 -0
- package/esm2022/lib/search/search-settings/search-settings.module.mjs +19 -0
- package/esm2022/lib/search/search.module.mjs +77 -0
- package/esm2022/lib/search/shared/index.mjs +10 -0
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +328 -0
- package/esm2022/lib/search/shared/search-source-service.providers.mjs +20 -0
- package/esm2022/lib/search/shared/search-source.service.mjs +56 -0
- package/esm2022/lib/search/shared/search.enums.mjs +4 -0
- package/esm2022/lib/search/shared/search.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/search.provider.mjs +20 -0
- package/esm2022/lib/search/shared/search.service.mjs +149 -0
- package/esm2022/lib/search/shared/search.utils.mjs +92 -0
- package/esm2022/lib/search/shared/sources/cadastre.mjs +142 -0
- package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +32 -0
- package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/coordinates.mjs +168 -0
- package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +52 -0
- package/esm2022/lib/search/shared/sources/icherche-icons.mjs +32 -0
- package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/icherche.mjs +816 -0
- package/esm2022/lib/search/shared/sources/icherche.providers.mjs +87 -0
- package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/ilayer.mjs +339 -0
- package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +58 -0
- package/esm2022/lib/search/shared/sources/index.mjs +23 -0
- package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/nominatim.mjs +263 -0
- package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +31 -0
- package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -0
- package/esm2022/lib/search/shared/sources/source.mjs +221 -0
- package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/storedqueries.mjs +454 -0
- package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +56 -0
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/workspace.mjs +192 -0
- package/esm2022/lib/search/shared/sources/workspace.providers.mjs +31 -0
- package/esm2022/lib/style/index.mjs +5 -0
- package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +360 -0
- package/esm2022/lib/style/shared/datasource/index.mjs +2 -0
- package/esm2022/lib/style/shared/feature/feature-style.mjs +162 -0
- package/esm2022/lib/style/shared/feature/index.mjs +2 -0
- package/esm2022/lib/style/shared/font.enum.mjs +17 -0
- package/esm2022/lib/style/shared/index.mjs +5 -0
- package/esm2022/lib/style/shared/overlay/index.mjs +3 -0
- package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +39 -0
- package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +88 -0
- package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +78 -0
- package/esm2022/lib/style/shared/vector/conversion.utils.mjs +27 -0
- package/esm2022/lib/style/shared/vector/index.mjs +4 -0
- package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +2 -0
- package/esm2022/lib/style/style-list/index.mjs +5 -0
- package/esm2022/lib/style/style-list/style-list.interface.mjs +2 -0
- package/esm2022/lib/style/style-list/style-list.module.mjs +23 -0
- package/esm2022/lib/style/style-list/style-list.provider.mjs +21 -0
- package/esm2022/lib/style/style-list/style-list.service.mjs +52 -0
- package/esm2022/lib/style/style-modal/drawing/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +193 -0
- package/esm2022/lib/style/style-modal/index.mjs +5 -0
- package/esm2022/lib/style/style-modal/layer/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +142 -0
- package/esm2022/lib/style/style-modal/layer-button/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +44 -0
- package/esm2022/lib/style/style-modal/shared/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +2 -0
- package/esm2022/lib/style/style-service/draw-style.service.mjs +255 -0
- package/esm2022/lib/style/style-service/index.mjs +3 -0
- package/esm2022/lib/style/style-service/style.service.mjs +393 -0
- package/esm2022/lib/style/style.module.mjs +46 -0
- package/esm2022/lib/toast/index.mjs +2 -0
- package/esm2022/lib/toast/toast.component.mjs +99 -0
- package/esm2022/lib/toast/toast.module.mjs +24 -0
- package/esm2022/lib/utils/googleLinks.mjs +13 -0
- package/esm2022/lib/utils/id-generator.mjs +112 -0
- package/esm2022/lib/utils/index.mjs +5 -0
- package/esm2022/lib/utils/osmLinks.mjs +9 -0
- package/esm2022/lib/utils/propertyTypeDetector/index.mjs +3 -0
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +2 -0
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +64 -0
- package/esm2022/lib/wkt/index.mjs +2 -0
- package/esm2022/lib/wkt/shared/index.mjs +2 -0
- package/esm2022/lib/wkt/shared/wkt.service.mjs +235 -0
- package/esm2022/lib/wkt/wkt.module.mjs +25 -0
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +36 -0
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +19 -0
- package/esm2022/lib/workspace/confirmation-popup/index.mjs +3 -0
- package/esm2022/lib/workspace/index.mjs +8 -0
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +301 -0
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +720 -0
- package/esm2022/lib/workspace/shared/feature-workspace.mjs +41 -0
- package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +113 -0
- package/esm2022/lib/workspace/shared/index.mjs +8 -0
- package/esm2022/lib/workspace/shared/wfs-workspace.mjs +41 -0
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +121 -0
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +248 -0
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +188 -0
- package/esm2022/lib/workspace/widgets/index.mjs +4 -0
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +48 -0
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +19 -0
- package/esm2022/lib/workspace/widgets/widgets.mjs +15 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +172 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +137 -0
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +19 -0
- package/esm2022/lib/workspace/workspace.module.mjs +32 -0
- package/esm2022/public_api.mjs +56 -0
- package/fesm2022/igo2-geo.mjs +717 -691
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/datasource/shared/datasources/datasource.d.ts +2 -2
- package/lib/directions/shared/directions.service.d.ts +0 -1
- package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
- package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
- package/lib/style/style-list/style-list.provider.d.ts +8 -1
- package/lib/style/style-list/style-list.service.d.ts +1 -1
- package/package.json +16 -14
- package/src/lib/layer/layer-list/layer-list.theme.scss +1 -2
- package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
- package/src/style/style.scss +1 -1
|
@@ -0,0 +1,787 @@
|
|
|
1
|
+
import { AsyncPipe, NgFor, NgIf, NgStyle } from '@angular/common';
|
|
2
|
+
import { ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core';
|
|
3
|
+
import { FormsModule, ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
|
|
4
|
+
import { MatAutocompleteModule, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
5
|
+
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
6
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
7
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
8
|
+
import { MatOptionModule } from '@angular/material/core';
|
|
9
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
10
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
12
|
+
import { MatInputModule } from '@angular/material/input';
|
|
13
|
+
import { MatRadioModule } from '@angular/material/radio';
|
|
14
|
+
import { MatSelect, MatSelectModule } from '@angular/material/select';
|
|
15
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
16
|
+
import { DOMService } from '@igo2/common/dom';
|
|
17
|
+
import { ConfigService } from '@igo2/core/config';
|
|
18
|
+
import { IgoLanguageModule } from '@igo2/core/language';
|
|
19
|
+
import { BehaviorSubject, Observable, Subject, of } from 'rxjs';
|
|
20
|
+
import { debounceTime } from 'rxjs/operators';
|
|
21
|
+
import { OgcFilterWriter } from '../../filter/shared/ogc-filter';
|
|
22
|
+
import { MapBase } from '../../map';
|
|
23
|
+
import { OgcFilterTimeComponent } from '../ogc-filter-time/ogc-filter-time.component';
|
|
24
|
+
import { OgcFilterOperator } from '../shared/ogc-filter.enum';
|
|
25
|
+
import { OGCFilterService } from '../shared/ogc-filter.service';
|
|
26
|
+
import * as i0 from "@angular/core";
|
|
27
|
+
import * as i1 from "../shared/ogc-filter.service";
|
|
28
|
+
import * as i2 from "@angular/forms";
|
|
29
|
+
import * as i3 from "@igo2/common/dom";
|
|
30
|
+
import * as i4 from "@igo2/core/config";
|
|
31
|
+
import * as i5 from "@angular/material/divider";
|
|
32
|
+
import * as i6 from "@angular/material/form-field";
|
|
33
|
+
import * as i7 from "@angular/material/select";
|
|
34
|
+
import * as i8 from "@angular/material/core";
|
|
35
|
+
import * as i9 from "@angular/material/tooltip";
|
|
36
|
+
import * as i10 from "@angular/material/button-toggle";
|
|
37
|
+
import * as i11 from "@angular/material/checkbox";
|
|
38
|
+
import * as i12 from "@angular/material/radio";
|
|
39
|
+
import * as i13 from "@angular/material/icon";
|
|
40
|
+
import * as i14 from "@angular/material/input";
|
|
41
|
+
import * as i15 from "@angular/material/autocomplete";
|
|
42
|
+
import * as i16 from "@ngx-translate/core";
|
|
43
|
+
import * as i17 from "@angular/material/chips";
|
|
44
|
+
export class OgcFilterSelectionComponent {
|
|
45
|
+
ogcFilterService;
|
|
46
|
+
formBuilder;
|
|
47
|
+
domService;
|
|
48
|
+
configService;
|
|
49
|
+
cdRef;
|
|
50
|
+
sel;
|
|
51
|
+
matAutocomplete;
|
|
52
|
+
refreshFilters;
|
|
53
|
+
datasource;
|
|
54
|
+
map;
|
|
55
|
+
checkboxesIndex = 5;
|
|
56
|
+
radioButtonsIndex = 5;
|
|
57
|
+
baseIndex = 5;
|
|
58
|
+
get currentFilter() {
|
|
59
|
+
return this._currentFilter;
|
|
60
|
+
}
|
|
61
|
+
set currentFilter(value) {
|
|
62
|
+
this._currentFilter = value;
|
|
63
|
+
if (this._currentFilter?.sliderOptions) {
|
|
64
|
+
this._currentFilter.sliderOptions.enabled = false; // remove slider toggle (animation temporelle)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
_currentFilter;
|
|
68
|
+
inputChangeAutocomplete = new Subject();
|
|
69
|
+
ogcFilterOperator = OgcFilterOperator;
|
|
70
|
+
form;
|
|
71
|
+
ogcFilterWriter;
|
|
72
|
+
color = 'primary';
|
|
73
|
+
selectAllSelected = false;
|
|
74
|
+
selectEnabled$ = new BehaviorSubject(undefined);
|
|
75
|
+
selectEnableds$ = new BehaviorSubject([]);
|
|
76
|
+
autocompleteEnableds$ = new BehaviorSubject([]);
|
|
77
|
+
filteredOgcAutocomplete = {};
|
|
78
|
+
applyFiltersTimeout;
|
|
79
|
+
get ogcFiltersSelectors() {
|
|
80
|
+
const ogcSelector = [];
|
|
81
|
+
if (this.datasource?.options?.ogcFilters?.pushButtons) {
|
|
82
|
+
ogcSelector.push(this.datasource?.options?.ogcFilters?.pushButtons);
|
|
83
|
+
}
|
|
84
|
+
if (this.datasource?.options?.ogcFilters?.checkboxes) {
|
|
85
|
+
ogcSelector.push(this.datasource?.options?.ogcFilters?.checkboxes);
|
|
86
|
+
}
|
|
87
|
+
if (this.datasource?.options?.ogcFilters?.radioButtons) {
|
|
88
|
+
ogcSelector.push(this.datasource?.options?.ogcFilters?.radioButtons);
|
|
89
|
+
}
|
|
90
|
+
if (this.datasource?.options?.ogcFilters?.select) {
|
|
91
|
+
ogcSelector.push(this.datasource?.options?.ogcFilters?.select);
|
|
92
|
+
}
|
|
93
|
+
if (this.datasource?.options?.ogcFilters?.autocomplete) {
|
|
94
|
+
ogcSelector.push(this.datasource?.options?.ogcFilters?.autocomplete);
|
|
95
|
+
}
|
|
96
|
+
ogcSelector.sort((a, b) => {
|
|
97
|
+
if (a.order < b.order) {
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
if (a.order > b.order) {
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
return 0;
|
|
104
|
+
});
|
|
105
|
+
return ogcSelector;
|
|
106
|
+
}
|
|
107
|
+
get currentPushButtonsGroup() {
|
|
108
|
+
return this.form.get('pushButtonsGroup').value;
|
|
109
|
+
}
|
|
110
|
+
set currentPushButtonsGroup(value) {
|
|
111
|
+
this.form.patchValue({ pushButtonsGroup: value });
|
|
112
|
+
}
|
|
113
|
+
get currentCheckboxesGroup() {
|
|
114
|
+
return this.form.get('checkboxesGroup').value;
|
|
115
|
+
}
|
|
116
|
+
set currentCheckboxesGroup(value) {
|
|
117
|
+
this.form.patchValue({ checkboxesGroup: value });
|
|
118
|
+
}
|
|
119
|
+
get currentRadioButtonsGroup() {
|
|
120
|
+
return this.form.get('radioButtonsGroup').value;
|
|
121
|
+
}
|
|
122
|
+
set currentRadioButtonsGroup(value) {
|
|
123
|
+
this.form.patchValue({ radioButtonsGroup: value });
|
|
124
|
+
}
|
|
125
|
+
get currentSelectGroup() {
|
|
126
|
+
return this.form.get('selectGroup').value;
|
|
127
|
+
}
|
|
128
|
+
set currentSelectGroup(value) {
|
|
129
|
+
this.form.patchValue({ selectGroup: value });
|
|
130
|
+
this.cdRef.detectChanges();
|
|
131
|
+
}
|
|
132
|
+
get currentAutocompleteGroup() {
|
|
133
|
+
return this.form.get('autocompleteGroup').value;
|
|
134
|
+
}
|
|
135
|
+
set currentAutocompleteGroup(value) {
|
|
136
|
+
this.form.patchValue({ autocompleteGroup: value });
|
|
137
|
+
this.cdRef.detectChanges();
|
|
138
|
+
}
|
|
139
|
+
get selectEnabled() {
|
|
140
|
+
return this.selectEnabled$.value;
|
|
141
|
+
}
|
|
142
|
+
set selectEnabled(value) {
|
|
143
|
+
this.selectEnabled$.next(value);
|
|
144
|
+
clearTimeout(this.applyFiltersTimeout);
|
|
145
|
+
this.currentSelectGroup.computedSelectors.forEach((compSelect) => {
|
|
146
|
+
compSelect.selectors?.forEach((selector) => {
|
|
147
|
+
value === selector
|
|
148
|
+
? (selector.enabled = true)
|
|
149
|
+
: (selector.enabled = false);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
this.applyFiltersTimeout = setTimeout(() => {
|
|
153
|
+
this.applyFilters();
|
|
154
|
+
}, 750);
|
|
155
|
+
}
|
|
156
|
+
get selectEnableds() {
|
|
157
|
+
return this.selectEnableds$.value;
|
|
158
|
+
}
|
|
159
|
+
set selectEnableds(value) {
|
|
160
|
+
this.selectEnableds$.next(value);
|
|
161
|
+
clearTimeout(this.applyFiltersTimeout);
|
|
162
|
+
this.currentSelectGroup.computedSelectors.forEach((compSelect) => {
|
|
163
|
+
compSelect.selectors?.forEach((selector) => {
|
|
164
|
+
value.includes(selector)
|
|
165
|
+
? (selector.enabled = true)
|
|
166
|
+
: (selector.enabled = false);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
this.applyFiltersTimeout = setTimeout(() => {
|
|
170
|
+
this.applyFilters();
|
|
171
|
+
}, 750);
|
|
172
|
+
}
|
|
173
|
+
get autocompleteEnableds() {
|
|
174
|
+
return this.autocompleteEnableds$.value;
|
|
175
|
+
}
|
|
176
|
+
// Updates the currentAutocompleteGroup and applies filters
|
|
177
|
+
set autocompleteEnableds(filterList) {
|
|
178
|
+
this.autocompleteEnableds$.next(filterList);
|
|
179
|
+
clearTimeout(this.applyFiltersTimeout);
|
|
180
|
+
this.currentAutocompleteGroup.computedSelectors.forEach((compSelect) => {
|
|
181
|
+
compSelect.selectors?.forEach((selector) => {
|
|
182
|
+
selector.enabled = false;
|
|
183
|
+
for (const filter of filterList) {
|
|
184
|
+
if (filter === selector.title) {
|
|
185
|
+
selector.enabled = true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
this.applyFiltersTimeout = setTimeout(() => {
|
|
191
|
+
this.applyFilters();
|
|
192
|
+
}, 750);
|
|
193
|
+
}
|
|
194
|
+
// Indicates the checked status of autocomplete checkboxes
|
|
195
|
+
checkedStatus(autocompleteFilter) {
|
|
196
|
+
return this.autocompleteEnableds.includes(autocompleteFilter);
|
|
197
|
+
}
|
|
198
|
+
constructor(ogcFilterService, formBuilder, domService, configService, cdRef) {
|
|
199
|
+
this.ogcFilterService = ogcFilterService;
|
|
200
|
+
this.formBuilder = formBuilder;
|
|
201
|
+
this.domService = domService;
|
|
202
|
+
this.configService = configService;
|
|
203
|
+
this.cdRef = cdRef;
|
|
204
|
+
this.ogcFilterWriter = new OgcFilterWriter();
|
|
205
|
+
this.buildForm();
|
|
206
|
+
}
|
|
207
|
+
buildForm() {
|
|
208
|
+
this.form = this.formBuilder.group({
|
|
209
|
+
pushButtons: [''],
|
|
210
|
+
radioButtons: [''],
|
|
211
|
+
pushButtonsGroup: ['', [Validators.required]],
|
|
212
|
+
checkboxesGroup: ['', [Validators.required]],
|
|
213
|
+
radioButtonsGroup: ['', [Validators.required]],
|
|
214
|
+
selectGroup: ['', [Validators.required]],
|
|
215
|
+
select: [''],
|
|
216
|
+
selectMulti: [''],
|
|
217
|
+
autocompleteGroup: ['', [Validators.required]],
|
|
218
|
+
autocomplete: ['']
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
getPushButtonsGroups() {
|
|
222
|
+
if (this.datasource?.options?.ogcFilters?.pushButtons) {
|
|
223
|
+
return this.datasource.options.ogcFilters.pushButtons.groups;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
getCheckboxesGroups() {
|
|
227
|
+
if (this.datasource?.options?.ogcFilters?.checkboxes) {
|
|
228
|
+
return this.datasource.options.ogcFilters.checkboxes.groups;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
getRadioButtonsGroups() {
|
|
232
|
+
if (this.datasource?.options?.ogcFilters?.radioButtons) {
|
|
233
|
+
return this.datasource.options.ogcFilters.radioButtons.groups;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
getSelectGroups() {
|
|
237
|
+
if (this.datasource?.options?.ogcFilters?.select) {
|
|
238
|
+
return this.datasource.options.ogcFilters.select.groups;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
getAutocompleteGroups() {
|
|
242
|
+
if (this.datasource?.options?.ogcFilters?.autocomplete) {
|
|
243
|
+
return this.datasource.options.ogcFilters.autocomplete.groups;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async ngOnInit() {
|
|
247
|
+
if (this.datasource.options.ogcFilters) {
|
|
248
|
+
if (this.datasource.options.ogcFilters.pushButtons) {
|
|
249
|
+
this.currentPushButtonsGroup =
|
|
250
|
+
this.datasource.options.ogcFilters.pushButtons.groups.find((group) => group.enabled) || this.datasource.options.ogcFilters.pushButtons.groups[0];
|
|
251
|
+
}
|
|
252
|
+
if (this.datasource.options.ogcFilters.checkboxes) {
|
|
253
|
+
this.currentCheckboxesGroup =
|
|
254
|
+
this.datasource.options.ogcFilters.checkboxes.groups.find((group) => group.enabled) || this.datasource.options.ogcFilters.checkboxes.groups[0];
|
|
255
|
+
}
|
|
256
|
+
if (this.datasource.options.ogcFilters.radioButtons) {
|
|
257
|
+
this.currentRadioButtonsGroup =
|
|
258
|
+
this.datasource.options.ogcFilters.radioButtons.groups.find((group) => group.enabled) || this.datasource.options.ogcFilters.radioButtons.groups[0];
|
|
259
|
+
}
|
|
260
|
+
if (this.datasource.options.ogcFilters.select) {
|
|
261
|
+
this.currentSelectGroup =
|
|
262
|
+
this.datasource.options.ogcFilters.select.groups.find((group) => group.enabled) || this.datasource.options.ogcFilters.select.groups[0];
|
|
263
|
+
this.initSelectEnabled();
|
|
264
|
+
await this.getSelectDomValues();
|
|
265
|
+
}
|
|
266
|
+
if (this.datasource.options.ogcFilters.autocomplete) {
|
|
267
|
+
this.currentAutocompleteGroup =
|
|
268
|
+
this.datasource.options.ogcFilters.autocomplete.groups.find((group) => group.enabled) || this.datasource.options.ogcFilters.autocomplete.groups[0];
|
|
269
|
+
this.initAutocompleteEnableds();
|
|
270
|
+
await this.getAutocompleteDomValues();
|
|
271
|
+
}
|
|
272
|
+
this.applyFilters();
|
|
273
|
+
}
|
|
274
|
+
this.form
|
|
275
|
+
.get('pushButtonsGroup')
|
|
276
|
+
.valueChanges.pipe(debounceTime(750))
|
|
277
|
+
.subscribe(() => {
|
|
278
|
+
this.onPushButtonsChangeGroup();
|
|
279
|
+
this.applyFilters();
|
|
280
|
+
});
|
|
281
|
+
this.form
|
|
282
|
+
.get('checkboxesGroup')
|
|
283
|
+
.valueChanges.pipe(debounceTime(750))
|
|
284
|
+
.subscribe(() => {
|
|
285
|
+
this.onCheckboxesChangeGroup();
|
|
286
|
+
this.applyFilters();
|
|
287
|
+
});
|
|
288
|
+
this.form
|
|
289
|
+
.get('radioButtonsGroup')
|
|
290
|
+
.valueChanges.pipe(debounceTime(750))
|
|
291
|
+
.subscribe(() => {
|
|
292
|
+
this.onRadioButtonsChangeGroup();
|
|
293
|
+
this.applyFilters();
|
|
294
|
+
});
|
|
295
|
+
this.form
|
|
296
|
+
.get('selectGroup')
|
|
297
|
+
.valueChanges.pipe(debounceTime(750))
|
|
298
|
+
.subscribe(() => {
|
|
299
|
+
this.onSelectChangeGroup();
|
|
300
|
+
this.applyFilters();
|
|
301
|
+
});
|
|
302
|
+
this.form
|
|
303
|
+
.get('autocompleteGroup')
|
|
304
|
+
.valueChanges.pipe(debounceTime(750))
|
|
305
|
+
.subscribe(() => {
|
|
306
|
+
this.onAutocompleteChangeGroup();
|
|
307
|
+
this.applyFilters();
|
|
308
|
+
});
|
|
309
|
+
this.form
|
|
310
|
+
.get('pushButtons')
|
|
311
|
+
.valueChanges.pipe(debounceTime(750))
|
|
312
|
+
.subscribe(() => {
|
|
313
|
+
this.applyFilters();
|
|
314
|
+
});
|
|
315
|
+
this.form
|
|
316
|
+
.get('radioButtons')
|
|
317
|
+
.valueChanges.pipe(debounceTime(750))
|
|
318
|
+
.subscribe(() => {
|
|
319
|
+
this.applyFilters();
|
|
320
|
+
});
|
|
321
|
+
// Debounce time for autocomplete filter options - value chosen arbitrarily
|
|
322
|
+
this.inputChangeAutocomplete.pipe().subscribe(() => {
|
|
323
|
+
this.getAutocompleteDomValues();
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
initSelectEnabled() {
|
|
327
|
+
const enableds = [];
|
|
328
|
+
let enabled;
|
|
329
|
+
this.currentSelectGroup.computedSelectors.forEach((compSelect) => {
|
|
330
|
+
if (compSelect.multiple) {
|
|
331
|
+
compSelect.selectors?.forEach((selector) => {
|
|
332
|
+
if (selector.enabled) {
|
|
333
|
+
enableds.push(selector);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
this.selectEnableds = enableds;
|
|
337
|
+
this.form.controls['selectMulti'].setValue(enableds);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
compSelect.selectors?.forEach((selector) => {
|
|
341
|
+
if (selector.enabled) {
|
|
342
|
+
enabled = selector;
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
this.form.controls['select'].reset(enabled);
|
|
346
|
+
this.selectEnabled$.subscribe((value) => {
|
|
347
|
+
if (this.form.controls['select'].value !== value) {
|
|
348
|
+
this.form.controls['select'].setValue(value);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
this.selectEnabled = enabled;
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
initAutocompleteEnableds() {
|
|
356
|
+
const enabled = [];
|
|
357
|
+
this.currentAutocompleteGroup.computedSelectors.forEach((compSelect) => {
|
|
358
|
+
compSelect.selectors?.forEach((selector) => {
|
|
359
|
+
if (selector.enabled) {
|
|
360
|
+
const dom = {
|
|
361
|
+
id: selector.filters.expression,
|
|
362
|
+
value: selector.title
|
|
363
|
+
};
|
|
364
|
+
enabled.push(selector.title);
|
|
365
|
+
this.form.controls['autocomplete'].setValue(dom);
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
this.autocompleteEnableds = enabled;
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
getToolTip(selector) {
|
|
372
|
+
let toolTip;
|
|
373
|
+
if (selector.tooltip) {
|
|
374
|
+
if (Array.isArray(selector.tooltip)) {
|
|
375
|
+
toolTip = selector.tooltip.join('\n');
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
toolTip = selector.tooltip;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return toolTip || '';
|
|
382
|
+
}
|
|
383
|
+
async getSelectDomValues() {
|
|
384
|
+
for (const bundle of this.datasource.options.ogcFilters.select.bundles) {
|
|
385
|
+
if (bundle.domSelectors) {
|
|
386
|
+
let domValues;
|
|
387
|
+
for (const domSelector of bundle.domSelectors) {
|
|
388
|
+
let filterDOM;
|
|
389
|
+
for (const domOptions of this.configService.getConfig('dom')) {
|
|
390
|
+
if (domSelector.id === domOptions.id ||
|
|
391
|
+
domSelector.name === domOptions.name) {
|
|
392
|
+
filterDOM = {
|
|
393
|
+
id: domOptions.id,
|
|
394
|
+
url: domOptions.url,
|
|
395
|
+
name: domOptions.name,
|
|
396
|
+
values: domOptions.values
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
filterDOM.url
|
|
401
|
+
? (domValues = (await this.domService.getDomValuesFromURL(filterDOM)))
|
|
402
|
+
: (domValues = filterDOM.values);
|
|
403
|
+
if (domValues) {
|
|
404
|
+
const newBundle = bundle;
|
|
405
|
+
newBundle.selectors = [];
|
|
406
|
+
let selector;
|
|
407
|
+
for (const value of domValues) {
|
|
408
|
+
if (bundle.multiple) {
|
|
409
|
+
let enabled;
|
|
410
|
+
this.selectEnableds?.find((sel) => sel.title === value.value)
|
|
411
|
+
? (enabled = true)
|
|
412
|
+
: (enabled = false);
|
|
413
|
+
selector = {
|
|
414
|
+
title: value.value,
|
|
415
|
+
enabled,
|
|
416
|
+
filters: {
|
|
417
|
+
operator: domSelector.operator,
|
|
418
|
+
propertyName: domSelector.propertyName,
|
|
419
|
+
expression: value.id
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
selector = {
|
|
425
|
+
title: value.value,
|
|
426
|
+
enabled: this.selectEnabled?.title === value.value ? true : false,
|
|
427
|
+
filters: {
|
|
428
|
+
operator: domSelector.operator,
|
|
429
|
+
propertyName: domSelector.propertyName,
|
|
430
|
+
expression: value.id
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
newBundle.selectors.push(selector);
|
|
435
|
+
}
|
|
436
|
+
this.getSelectGroups()
|
|
437
|
+
.find((group) => group.ids.includes(newBundle.id))
|
|
438
|
+
.computedSelectors.find((comp) => comp.title === newBundle.title).selectors = newBundle.selectors;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
this.initSelectEnabled();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Trigger filter refresh (with debounce)
|
|
446
|
+
onInputChange() {
|
|
447
|
+
this.inputChangeAutocomplete.next();
|
|
448
|
+
}
|
|
449
|
+
async getAutocompleteDomValues() {
|
|
450
|
+
for (const bundle of this.datasource.options.ogcFilters.autocomplete
|
|
451
|
+
.bundles) {
|
|
452
|
+
if (bundle.domSelectors) {
|
|
453
|
+
let domValues;
|
|
454
|
+
for (const domSelector of bundle.domSelectors) {
|
|
455
|
+
let filterDOM;
|
|
456
|
+
for (const configDom of this.configService.getConfig('dom')) {
|
|
457
|
+
if (domSelector.id === configDom.id ||
|
|
458
|
+
domSelector.name === configDom.name) {
|
|
459
|
+
filterDOM = {
|
|
460
|
+
id: configDom.id,
|
|
461
|
+
url: configDom.url,
|
|
462
|
+
name: configDom.name,
|
|
463
|
+
values: configDom.values
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
filterDOM.url
|
|
468
|
+
? (domValues = (await this.domService.getDomValuesFromURL(filterDOM)))
|
|
469
|
+
: (domValues = filterDOM.values);
|
|
470
|
+
if (domValues) {
|
|
471
|
+
const newBundle = bundle;
|
|
472
|
+
newBundle.selectors = [];
|
|
473
|
+
let selector;
|
|
474
|
+
for (const domValue of domValues) {
|
|
475
|
+
selector = {
|
|
476
|
+
title: domValue.id,
|
|
477
|
+
enabled: this.autocompleteEnableds?.includes(domValue.value)
|
|
478
|
+
? true
|
|
479
|
+
: false,
|
|
480
|
+
filters: {
|
|
481
|
+
operator: domSelector.operator,
|
|
482
|
+
propertyName: domSelector.propertyName,
|
|
483
|
+
expression: domValue.value
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
newBundle.selectors.push(selector);
|
|
487
|
+
}
|
|
488
|
+
this.getAutocompleteGroups()
|
|
489
|
+
.find((group) => group.ids.includes(newBundle.id))
|
|
490
|
+
.computedSelectors.find((computedSelector) => computedSelector.title === newBundle.title).selectors = newBundle.selectors;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
this.filteredOgcAutocomplete[bundle.id] = new Observable();
|
|
494
|
+
this.cdRef.detectChanges();
|
|
495
|
+
this.filteredOgcAutocomplete[bundle.id] = of(domValues);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
getButtonColor(pushButton) {
|
|
500
|
+
let styles;
|
|
501
|
+
if (pushButton.color && pushButton.enabled) {
|
|
502
|
+
styles = {
|
|
503
|
+
'background-color': `rgba(${pushButton.color})`
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
return styles;
|
|
507
|
+
}
|
|
508
|
+
bundleIsVertical(bundle) {
|
|
509
|
+
return bundle.vertical ? bundle.vertical : false;
|
|
510
|
+
}
|
|
511
|
+
onPushButtonsChangeGroup() {
|
|
512
|
+
this.getPushButtonsGroups().map((group) => (group.enabled = false));
|
|
513
|
+
this.getPushButtonsGroups().find((group) => group === this.currentPushButtonsGroup).enabled = true;
|
|
514
|
+
}
|
|
515
|
+
onCheckboxesChangeGroup() {
|
|
516
|
+
this.getCheckboxesGroups().map((group) => (group.enabled = false));
|
|
517
|
+
this.getCheckboxesGroups().find((group) => group === this.currentCheckboxesGroup).enabled = true;
|
|
518
|
+
}
|
|
519
|
+
onRadioButtonsChangeGroup() {
|
|
520
|
+
this.getRadioButtonsGroups().map((group) => (group.enabled = false));
|
|
521
|
+
this.getRadioButtonsGroups().find((group) => group === this.currentRadioButtonsGroup).enabled = true;
|
|
522
|
+
}
|
|
523
|
+
onSelectChangeGroup() {
|
|
524
|
+
this.getSelectGroups().map((group) => (group.enabled = false));
|
|
525
|
+
this.getSelectGroups().find((group) => group === this.currentSelectGroup).enabled = true;
|
|
526
|
+
}
|
|
527
|
+
onAutocompleteChangeGroup() {
|
|
528
|
+
this.getAutocompleteGroups().map((group) => (group.enabled = false));
|
|
529
|
+
this.getAutocompleteGroups().find((group) => group === this.currentAutocompleteGroup).enabled = true;
|
|
530
|
+
}
|
|
531
|
+
onSelectionChange(currentOgcSelection, selectorType) {
|
|
532
|
+
clearTimeout(this.applyFiltersTimeout);
|
|
533
|
+
if (selectorType === 'radioButton') {
|
|
534
|
+
this.emptyRadioButtons();
|
|
535
|
+
}
|
|
536
|
+
if (currentOgcSelection) {
|
|
537
|
+
currentOgcSelection.enabled = !currentOgcSelection.enabled;
|
|
538
|
+
}
|
|
539
|
+
this.applyFiltersTimeout = setTimeout(() => {
|
|
540
|
+
this.applyFilters();
|
|
541
|
+
}, 750);
|
|
542
|
+
}
|
|
543
|
+
emptyRadioButtons() {
|
|
544
|
+
this.currentRadioButtonsGroup.computedSelectors.forEach((compSelect) => {
|
|
545
|
+
compSelect.selectors.map((selector) => (selector.enabled = false));
|
|
546
|
+
this.applyFiltersTimeout = setTimeout(() => {
|
|
547
|
+
this.applyFilters();
|
|
548
|
+
}, 750);
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
emptySelect() {
|
|
552
|
+
this.selectEnabled = undefined;
|
|
553
|
+
}
|
|
554
|
+
emptyAutocomplete() {
|
|
555
|
+
this.autocompleteEnableds = [];
|
|
556
|
+
this.form.controls['autocomplete'].setValue('');
|
|
557
|
+
this.form.controls['autocomplete'].markAsUntouched();
|
|
558
|
+
}
|
|
559
|
+
toggleAllSelection() {
|
|
560
|
+
if (this.selectAllSelected) {
|
|
561
|
+
const enableds = [];
|
|
562
|
+
this.currentSelectGroup.computedSelectors.forEach((compSelect) => {
|
|
563
|
+
compSelect.selectors?.forEach((selector) => {
|
|
564
|
+
enableds.push(selector);
|
|
565
|
+
});
|
|
566
|
+
});
|
|
567
|
+
this.sel.options.forEach((item) => item.select());
|
|
568
|
+
this.selectEnableds = enableds;
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
this.sel.options.forEach((item) => item.deselect());
|
|
572
|
+
this.selectEnableds = [];
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
selectOptionClick(value, bundle, event) {
|
|
576
|
+
if (bundle.multiple) {
|
|
577
|
+
const enableds = this.selectEnableds;
|
|
578
|
+
let newStatus = true;
|
|
579
|
+
this.sel.options.forEach((item) => {
|
|
580
|
+
if (!item.selected) {
|
|
581
|
+
newStatus = false;
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
this.selectAllSelected = newStatus;
|
|
585
|
+
if (event.isUserInput) {
|
|
586
|
+
if (enableds.length) {
|
|
587
|
+
for (const enabled of enableds) {
|
|
588
|
+
if (enabled.title === value.title) {
|
|
589
|
+
if (enabled.enabled && value.enabled) {
|
|
590
|
+
enableds.splice(enableds.indexOf(enabled), 1);
|
|
591
|
+
this.selectEnableds = enableds;
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
else if (enableds.indexOf(enabled) === enableds.length - 1) {
|
|
596
|
+
enableds.push(value);
|
|
597
|
+
this.selectEnableds = enableds;
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
enableds.push(value);
|
|
604
|
+
this.selectEnableds = enableds;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
this.selectEnabled = value;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
toggleAutocompleteOption(event, toggledFilter) {
|
|
613
|
+
event.stopPropagation();
|
|
614
|
+
this.toggleSelection(toggledFilter);
|
|
615
|
+
}
|
|
616
|
+
toggleSelection(toggledFilter) {
|
|
617
|
+
if (this.autocompleteEnableds.includes(toggledFilter)) {
|
|
618
|
+
this.autocompleteEnableds = this.autocompleteEnableds.filter((enabledFilter) => enabledFilter !== toggledFilter);
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
this.autocompleteEnableds = [...this.autocompleteEnableds, toggledFilter];
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
// Value displayed in the autocomplete input box
|
|
625
|
+
displayFn() {
|
|
626
|
+
return '';
|
|
627
|
+
}
|
|
628
|
+
// Applies filters based on the current group of all filter selection types
|
|
629
|
+
applyFilters() {
|
|
630
|
+
let filterQueryString = '';
|
|
631
|
+
const conditions = [];
|
|
632
|
+
const currentGroups = [
|
|
633
|
+
this.currentPushButtonsGroup,
|
|
634
|
+
this.currentCheckboxesGroup,
|
|
635
|
+
this.currentRadioButtonsGroup,
|
|
636
|
+
this.currentSelectGroup,
|
|
637
|
+
this.currentAutocompleteGroup
|
|
638
|
+
];
|
|
639
|
+
for (const currentGroup of currentGroups) {
|
|
640
|
+
if (currentGroup.computedSelectors) {
|
|
641
|
+
currentGroup.computedSelectors.map((selectorBundle) => {
|
|
642
|
+
const bundleCondition = [];
|
|
643
|
+
selectorBundle.selectors
|
|
644
|
+
?.filter((ogcSelector) => ogcSelector.enabled === true)
|
|
645
|
+
.forEach((enabledSelector) => bundleCondition.push(enabledSelector.filters));
|
|
646
|
+
if (bundleCondition.length >= 1) {
|
|
647
|
+
if (bundleCondition.length === 1) {
|
|
648
|
+
conditions.push(bundleCondition[0]);
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
conditions.push({
|
|
652
|
+
logical: selectorBundle.logical,
|
|
653
|
+
filters: bundleCondition
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
if (this.isTemporalOperator() && this._currentFilter.active) {
|
|
661
|
+
conditions.push(this.datasource.options.ogcFilters.interfaceOgcFilters[0]);
|
|
662
|
+
}
|
|
663
|
+
if (conditions.length >= 1) {
|
|
664
|
+
filterQueryString = this.ogcFilterWriter.buildFilter(conditions.length === 1
|
|
665
|
+
? conditions[0]
|
|
666
|
+
: { logical: 'And', filters: conditions });
|
|
667
|
+
}
|
|
668
|
+
if (this.datasource.options.type === 'wms') {
|
|
669
|
+
this.ogcFilterService.filterByOgc(this.datasource, filterQueryString);
|
|
670
|
+
}
|
|
671
|
+
if (this.datasource.options.type === 'wfs') {
|
|
672
|
+
// TODO: Check how to prevent wfs to refresh when filter icon is pushed...
|
|
673
|
+
this.datasource.ol.refresh();
|
|
674
|
+
}
|
|
675
|
+
this.datasource.setOgcFilters(this.datasource.options.ogcFilters, true);
|
|
676
|
+
}
|
|
677
|
+
isMoreResults(bundle, type) {
|
|
678
|
+
const selectorsLength = bundle.selectors.length;
|
|
679
|
+
const index = type === 'radio' ? this.radioButtonsIndex : this.checkboxesIndex;
|
|
680
|
+
return selectorsLength > index;
|
|
681
|
+
}
|
|
682
|
+
displayMoreResults(type) {
|
|
683
|
+
type === 'radio'
|
|
684
|
+
? (this.radioButtonsIndex += 5)
|
|
685
|
+
: (this.checkboxesIndex += 5);
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
isLessResults(bundle, type) {
|
|
689
|
+
const selectorsLength = bundle.selectors.length;
|
|
690
|
+
const index = type === 'radio' ? this.radioButtonsIndex : this.checkboxesIndex;
|
|
691
|
+
return this.baseIndex !== index && selectorsLength > this.baseIndex;
|
|
692
|
+
}
|
|
693
|
+
displayLessResults(type) {
|
|
694
|
+
type === 'radio'
|
|
695
|
+
? (this.radioButtonsIndex = this.baseIndex)
|
|
696
|
+
: (this.checkboxesIndex = this.baseIndex);
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
isTemporalOperator() {
|
|
700
|
+
return (this.currentFilter?.operator?.toLowerCase() ===
|
|
701
|
+
this.ogcFilterOperator.During.toLowerCase());
|
|
702
|
+
}
|
|
703
|
+
changeProperty(value, pos, refreshFilter = true) {
|
|
704
|
+
const detectedProperty = this.detectProperty(pos);
|
|
705
|
+
if (detectedProperty) {
|
|
706
|
+
this.datasource.options.ogcFilters.interfaceOgcFilters.find((filter) => filter.filterid === this.currentFilter.filterid)[detectedProperty] = value;
|
|
707
|
+
if (refreshFilter) {
|
|
708
|
+
this.applyFilters();
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
detectProperty(pos) {
|
|
713
|
+
switch (this.currentFilter.operator) {
|
|
714
|
+
case OgcFilterOperator.PropertyIsNotEqualTo:
|
|
715
|
+
case OgcFilterOperator.PropertyIsEqualTo:
|
|
716
|
+
case OgcFilterOperator.PropertyIsGreaterThan:
|
|
717
|
+
case OgcFilterOperator.PropertyIsGreaterThanOrEqualTo:
|
|
718
|
+
case OgcFilterOperator.PropertyIsLessThan:
|
|
719
|
+
case OgcFilterOperator.PropertyIsLessThanOrEqualTo:
|
|
720
|
+
return 'expression';
|
|
721
|
+
case OgcFilterOperator.PropertyIsLike:
|
|
722
|
+
return 'pattern';
|
|
723
|
+
case OgcFilterOperator.PropertyIsBetween:
|
|
724
|
+
return pos && pos === 1
|
|
725
|
+
? 'lowerBoundary'
|
|
726
|
+
: pos && pos === 2
|
|
727
|
+
? 'upperBoundary'
|
|
728
|
+
: undefined;
|
|
729
|
+
case OgcFilterOperator.During:
|
|
730
|
+
return pos && pos === 1
|
|
731
|
+
? 'begin'
|
|
732
|
+
: pos && pos === 2
|
|
733
|
+
? 'end'
|
|
734
|
+
: undefined;
|
|
735
|
+
default:
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OgcFilterSelectionComponent, deps: [{ token: i1.OGCFilterService }, { token: i2.UntypedFormBuilder }, { token: i3.DOMService }, { token: i4.ConfigService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
740
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: OgcFilterSelectionComponent, isStandalone: true, selector: "igo-ogc-filter-selection", inputs: { refreshFilters: "refreshFilters", datasource: "datasource", map: "map", checkboxesIndex: "checkboxesIndex", radioButtonsIndex: "radioButtonsIndex", baseIndex: "baseIndex", currentFilter: "currentFilter" }, providers: [DOMService], viewQueries: [{ propertyName: "sel", first: true, predicate: ["selection"], descendants: true }, { propertyName: "matAutocomplete", first: true, predicate: MatAutocompleteTrigger, descendants: true, read: MatAutocompleteTrigger }], ngImport: i0, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let selector of ogcFiltersSelectors\">\n <div\n class=\"pushButtonGroups\"\n *ngIf=\"selector.selectorType === 'pushButton'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getPushButtonsGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"pushButtonsGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentPushButtonsGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getPushButtonsGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentPushButtonsGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <mat-button-toggle-group\n formControlName=\"pushButtons\"\n class=\"mat-typography\"\n appearance=\"legacy\"\n vertical=\"{{ bundleIsVertical(bundle) }}\"\n multiple=\"true\"\n >\n <mat-button-toggle\n *ngFor=\"let ogcPushButton of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcPushButton)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [ngStyle]=\"getButtonColor(ogcPushButton)\"\n [checked]=\"ogcPushButton.enabled\"\n (change)=\"onSelectionChange(ogcPushButton, selector.selectorType)\"\n [value]=\"ogcPushButton\"\n >{{ ogcPushButton.title }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </ng-container>\n </div>\n\n <div class=\"checkboxGroups\" *ngIf=\"selector.selectorType === 'checkbox'\">\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getCheckboxesGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"checkboxesGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentCheckboxesGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getCheckboxesGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentCheckboxesGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <div class=\"checkboxes mat-typography\">\n <mat-checkbox\n *ngFor=\"let ogcCheckbox of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcCheckbox)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [checked]=\"ogcCheckbox.enabled\"\n (change)=\"onSelectionChange(ogcCheckbox, selector.selectorType)\"\n [value]=\"ogcCheckbox\"\n >{{ ogcCheckbox.title }}\n </mat-checkbox>\n </div>\n <p\n *ngIf=\"\n isLessResults(bundle, 'checkbox') ||\n isMoreResults(bundle, 'checkbox')\n \"\n >\n <u\n *ngIf=\"isLessResults(bundle, 'checkbox')\"\n class=\"lessResults mat-typography\"\n (click)=\"displayLessResults('checkbox')\"\n >{{ 'igo.geo.filter.displayLessResults' | translate }}\n </u>\n <u\n *ngIf=\"isMoreResults(bundle, 'checkbox')\"\n class=\"moreResults mat-typography\"\n (click)=\"displayMoreResults('checkbox')\"\n >{{ 'igo.geo.filter.displayMoreResults' | translate }}\n </u>\n </p>\n </ng-container>\n </div>\n\n <div\n class=\"radioButtonGroups\"\n *ngIf=\"selector.selectorType === 'radioButton'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getRadioButtonsGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"radioButtonsGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentRadioButtonsGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getRadioButtonsGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentRadioButtonsGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <mat-radio-group formControlName=\"radioButtons\" class=\"mat-typography\">\n <mat-radio-button\n *ngIf=\"bundle.unfiltered\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (change)=\"emptyRadioButtons()\"\n >{{ 'igo.geo.filter.resetFilters' | translate }}\n </mat-radio-button>\n <mat-radio-button\n *ngFor=\"let ogcRadioButton of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcRadioButton)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [checked]=\"ogcRadioButton.enabled\"\n (change)=\"onSelectionChange(ogcRadioButton, selector.selectorType)\"\n [value]=\"ogcRadioButton\"\n >{{ ogcRadioButton.title }}\n </mat-radio-button>\n <p\n *ngIf=\"\n isLessResults(bundle, 'radio') || isMoreResults(bundle, 'radio')\n \"\n >\n <u\n *ngIf=\"isLessResults(bundle, 'radio')\"\n class=\"lessResults mat-typography\"\n (click)=\"displayLessResults('radio')\"\n >{{ 'igo.geo.filter.displayLessResults' | translate }}\n </u>\n <u\n *ngIf=\"isMoreResults(bundle, 'radio')\"\n class=\"moreResults mat-typography\"\n (click)=\"displayMoreResults('radio')\"\n >{{ 'igo.geo.filter.displayMoreResults' | translate }}\n </u>\n </p>\n </mat-radio-group>\n </ng-container>\n </div>\n\n <div class=\"selectGroups\" *ngIf=\"selector.selectorType === 'select'\">\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getSelectGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"selectGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentSelectGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getSelectGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container *ngFor=\"let bundle of currentSelectGroup.computedSelectors\">\n <h3>{{ bundle.title }}</h3>\n <div class=\"groupsSelector\">\n <mat-button\n *ngIf=\"bundle.unfiltered && !bundle.multiple\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (click)=\"emptySelect()\"\n >\n <mat-icon>filter_alt_off</mat-icon>\n </mat-button>\n <mat-form-field\n [style.width.%]=\"bundle.width ? bundle.width : undefined\"\n >\n <div *ngIf=\"bundle.multiple; else notMulti\">\n <mat-select\n #selection\n [multiple]=\"bundle.multiple\"\n [placeholder]=\"bundle.title\"\n formControlName=\"selectMulti\"\n >\n <div class=\"checkboxes mat-typography\">\n <mat-checkbox\n *ngIf=\"bundle.multiple\"\n [(ngModel)]=\"selectAllSelected\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"toggleAllSelection()\"\n >Tous\n </mat-checkbox>\n </div>\n <mat-option\n *ngFor=\"let ogcSelect of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcSelect)\"\n tooltip-position=\"below\"\n matTooltipDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (onSelectionChange)=\"\n selectOptionClick($event.source.value, bundle, $event)\n \"\n [value]=\"ogcSelect\"\n >{{ ogcSelect.title }}\n </mat-option>\n </mat-select>\n </div>\n <ng-template #notMulti>\n <mat-select [placeholder]=\"bundle.title\" formControlName=\"select\">\n <mat-option\n *ngFor=\"let ogcSelect of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcSelect)\"\n tooltip-position=\"below\"\n matTooltipDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [value]=\"ogcSelect\"\n (onSelectionChange)=\"\n selectOptionClick($event.source.value, bundle)\n \"\n >{{ ogcSelect.title }}\n </mat-option>\n </mat-select>\n </ng-template>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n\n <div\n class=\"autocompleteGroups\"\n *ngIf=\"selector.selectorType === 'autocomplete'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getAutocompleteGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"autocompleteGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentAutocompleteGroup\"\n >\n <mat-option\n *ngFor=\"let autocompleteGroup of getAutocompleteGroups()\"\n [value]=\"autocompleteGroup\"\n >{{ autocompleteGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentAutocompleteGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <div class=\"groupsSelector\">\n <mat-button\n *ngIf=\"bundle.unfiltered\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (click)=\"emptyAutocomplete()\"\n >\n <mat-icon>filter_alt_off</mat-icon>\n </mat-button>\n <mat-form-field\n *ngIf=\"filteredOgcAutocomplete[bundle.id]\"\n floatLabel=\"always\"\n [style.width.%]=\"bundle.width ? bundle.width : undefined\"\n >\n <mat-label>{{ bundle.title }}</mat-label>\n <mat-chip-set\n *ngIf=\"\n filteredOgcAutocomplete[bundle.id] && (bundle.showChips ?? true)\n \"\n >\n <mat-chip\n *ngFor=\"let autocompleteEnabled of autocompleteEnableds\"\n (removed)=\"toggleSelection(autocompleteEnabled)\"\n >\n {{ autocompleteEnabled }}\n <button\n matChipRemove\n [matTooltip]=\"'igo.geo.filter.removeFilter' | translate\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n </mat-chip-set>\n <input\n matInput\n type=\"text\"\n formControlName=\"autocomplete\"\n #input\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChange()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\">\n <mat-option\n *ngFor=\"\n let ogcAutocomplete of filteredOgcAutocomplete[bundle.id]\n | async\n \"\n id=\"mat-option\"\n [matTooltip]=\"getToolTip(ogcAutocomplete)\"\n >\n <div\n (click)=\"\n toggleAutocompleteOption($event, ogcAutocomplete.value)\n \"\n >\n <mat-checkbox\n id=\"mat-checkbox\"\n color=\"primary\"\n [checked]=\"checkedStatus(ogcAutocomplete.value)\"\n (click)=\"\n toggleAutocompleteOption($event, ogcAutocomplete.value)\n \"\n >\n </mat-checkbox>\n {{ ogcAutocomplete.value }}\n </div>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n </div>\n</form>\n\n<div *ngIf=\"isTemporalOperator()\">\n <mat-divider></mat-divider>\n <h3 *ngIf=\"!currentFilter.title\">\n {{ 'igo.geo.filter.reportingDate' | translate }}\n </h3>\n <h3 *ngIf=\"currentFilter.title\">{{ currentFilter.title }}</h3>\n <igo-ogc-filter-time\n [datasource]=\"datasource\"\n [currentFilter]=\"currentFilter\"\n (changeProperty)=\"changeProperty($event.value, $event.pos)\"\n >\n </igo-ogc-filter-time>\n</div>\n", styles: [":host .mat-button-toggle-group{margin:5px;flex-wrap:wrap;box-shadow:none!important;width:95%}:host .checkboxes{flex-wrap:wrap;box-shadow:none}:host .groupsSelector{text-align:center}:host mat-button-toggle{display:inline-flex;border:1.5px solid black;border-radius:5px;margin:5px;white-space:normal;min-height:40px;height:auto;width:142px}:host mat-button-toggle ::ng-deep .mat-button-toggle-label-content{line-height:unset;font-size:small;display:block}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host mat-button-toggle{width:45%}}:host ::ng-deep .material-tooltip{white-space:pre-wrap}:host mat-checkbox,:host mat-radio-button{margin:7px;width:95%;display:inline-flex;font-size:larger}:host mat-checkbox ::ng-deep label,:host mat-radio-button ::ng-deep label{white-space:normal}:host mat-checkbox{vertical-align:middle}:host mat-button{padding-right:10px;cursor:pointer}:host h3{margin:7px;text-align:left}:host u{cursor:pointer;color:#00f;margin:5px}:host p{margin:unset}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.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: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i10.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i10.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i12.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i15.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i15.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: OgcFilterTimeComponent, selector: "igo-ogc-filter-time", inputs: ["datasource", "currentFilter"], outputs: ["changeProperty"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i16.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i17.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: i17.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i17.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }] });
|
|
741
|
+
}
|
|
742
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OgcFilterSelectionComponent, decorators: [{
|
|
743
|
+
type: Component,
|
|
744
|
+
args: [{ selector: 'igo-ogc-filter-selection', providers: [DOMService], standalone: true, imports: [
|
|
745
|
+
FormsModule,
|
|
746
|
+
ReactiveFormsModule,
|
|
747
|
+
NgFor,
|
|
748
|
+
NgIf,
|
|
749
|
+
MatDividerModule,
|
|
750
|
+
MatFormFieldModule,
|
|
751
|
+
MatSelectModule,
|
|
752
|
+
MatTooltipModule,
|
|
753
|
+
MatOptionModule,
|
|
754
|
+
MatButtonToggleModule,
|
|
755
|
+
NgStyle,
|
|
756
|
+
MatCheckboxModule,
|
|
757
|
+
MatRadioModule,
|
|
758
|
+
MatIconModule,
|
|
759
|
+
MatInputModule,
|
|
760
|
+
MatAutocompleteModule,
|
|
761
|
+
OgcFilterTimeComponent,
|
|
762
|
+
AsyncPipe,
|
|
763
|
+
IgoLanguageModule,
|
|
764
|
+
MatChipsModule
|
|
765
|
+
], template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let selector of ogcFiltersSelectors\">\n <div\n class=\"pushButtonGroups\"\n *ngIf=\"selector.selectorType === 'pushButton'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getPushButtonsGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"pushButtonsGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentPushButtonsGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getPushButtonsGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentPushButtonsGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <mat-button-toggle-group\n formControlName=\"pushButtons\"\n class=\"mat-typography\"\n appearance=\"legacy\"\n vertical=\"{{ bundleIsVertical(bundle) }}\"\n multiple=\"true\"\n >\n <mat-button-toggle\n *ngFor=\"let ogcPushButton of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcPushButton)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [ngStyle]=\"getButtonColor(ogcPushButton)\"\n [checked]=\"ogcPushButton.enabled\"\n (change)=\"onSelectionChange(ogcPushButton, selector.selectorType)\"\n [value]=\"ogcPushButton\"\n >{{ ogcPushButton.title }}\n </mat-button-toggle>\n </mat-button-toggle-group>\n </ng-container>\n </div>\n\n <div class=\"checkboxGroups\" *ngIf=\"selector.selectorType === 'checkbox'\">\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getCheckboxesGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"checkboxesGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentCheckboxesGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getCheckboxesGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentCheckboxesGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <div class=\"checkboxes mat-typography\">\n <mat-checkbox\n *ngFor=\"let ogcCheckbox of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcCheckbox)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [checked]=\"ogcCheckbox.enabled\"\n (change)=\"onSelectionChange(ogcCheckbox, selector.selectorType)\"\n [value]=\"ogcCheckbox\"\n >{{ ogcCheckbox.title }}\n </mat-checkbox>\n </div>\n <p\n *ngIf=\"\n isLessResults(bundle, 'checkbox') ||\n isMoreResults(bundle, 'checkbox')\n \"\n >\n <u\n *ngIf=\"isLessResults(bundle, 'checkbox')\"\n class=\"lessResults mat-typography\"\n (click)=\"displayLessResults('checkbox')\"\n >{{ 'igo.geo.filter.displayLessResults' | translate }}\n </u>\n <u\n *ngIf=\"isMoreResults(bundle, 'checkbox')\"\n class=\"moreResults mat-typography\"\n (click)=\"displayMoreResults('checkbox')\"\n >{{ 'igo.geo.filter.displayMoreResults' | translate }}\n </u>\n </p>\n </ng-container>\n </div>\n\n <div\n class=\"radioButtonGroups\"\n *ngIf=\"selector.selectorType === 'radioButton'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getRadioButtonsGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"radioButtonsGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentRadioButtonsGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getRadioButtonsGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentRadioButtonsGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <mat-radio-group formControlName=\"radioButtons\" class=\"mat-typography\">\n <mat-radio-button\n *ngIf=\"bundle.unfiltered\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (change)=\"emptyRadioButtons()\"\n >{{ 'igo.geo.filter.resetFilters' | translate }}\n </mat-radio-button>\n <mat-radio-button\n *ngFor=\"let ogcRadioButton of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcRadioButton)\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [checked]=\"ogcRadioButton.enabled\"\n (change)=\"onSelectionChange(ogcRadioButton, selector.selectorType)\"\n [value]=\"ogcRadioButton\"\n >{{ ogcRadioButton.title }}\n </mat-radio-button>\n <p\n *ngIf=\"\n isLessResults(bundle, 'radio') || isMoreResults(bundle, 'radio')\n \"\n >\n <u\n *ngIf=\"isLessResults(bundle, 'radio')\"\n class=\"lessResults mat-typography\"\n (click)=\"displayLessResults('radio')\"\n >{{ 'igo.geo.filter.displayLessResults' | translate }}\n </u>\n <u\n *ngIf=\"isMoreResults(bundle, 'radio')\"\n class=\"moreResults mat-typography\"\n (click)=\"displayMoreResults('radio')\"\n >{{ 'igo.geo.filter.displayMoreResults' | translate }}\n </u>\n </p>\n </mat-radio-group>\n </ng-container>\n </div>\n\n <div class=\"selectGroups\" *ngIf=\"selector.selectorType === 'select'\">\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getSelectGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"selectGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentSelectGroup\"\n >\n <mat-option\n *ngFor=\"let selectorGroup of getSelectGroups()\"\n [value]=\"selectorGroup\"\n >{{ selectorGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container *ngFor=\"let bundle of currentSelectGroup.computedSelectors\">\n <h3>{{ bundle.title }}</h3>\n <div class=\"groupsSelector\">\n <mat-button\n *ngIf=\"bundle.unfiltered && !bundle.multiple\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (click)=\"emptySelect()\"\n >\n <mat-icon>filter_alt_off</mat-icon>\n </mat-button>\n <mat-form-field\n [style.width.%]=\"bundle.width ? bundle.width : undefined\"\n >\n <div *ngIf=\"bundle.multiple; else notMulti\">\n <mat-select\n #selection\n [multiple]=\"bundle.multiple\"\n [placeholder]=\"bundle.title\"\n formControlName=\"selectMulti\"\n >\n <div class=\"checkboxes mat-typography\">\n <mat-checkbox\n *ngIf=\"bundle.multiple\"\n [(ngModel)]=\"selectAllSelected\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"toggleAllSelection()\"\n >Tous\n </mat-checkbox>\n </div>\n <mat-option\n *ngFor=\"let ogcSelect of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcSelect)\"\n tooltip-position=\"below\"\n matTooltipDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (onSelectionChange)=\"\n selectOptionClick($event.source.value, bundle, $event)\n \"\n [value]=\"ogcSelect\"\n >{{ ogcSelect.title }}\n </mat-option>\n </mat-select>\n </div>\n <ng-template #notMulti>\n <mat-select [placeholder]=\"bundle.title\" formControlName=\"select\">\n <mat-option\n *ngFor=\"let ogcSelect of bundle.selectors\"\n [matTooltip]=\"getToolTip(ogcSelect)\"\n tooltip-position=\"below\"\n matTooltipDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n [value]=\"ogcSelect\"\n (onSelectionChange)=\"\n selectOptionClick($event.source.value, bundle)\n \"\n >{{ ogcSelect.title }}\n </mat-option>\n </mat-select>\n </ng-template>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n\n <div\n class=\"autocompleteGroups\"\n *ngIf=\"selector.selectorType === 'autocomplete'\"\n >\n <mat-divider></mat-divider>\n <div class=\"groupsSelector\" *ngIf=\"getAutocompleteGroups().length > 1\">\n <mat-form-field>\n <mat-select\n formControlName=\"autocompleteGroup\"\n [matTooltip]=\"'igo.geo.layer.legend.selectStyle' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [(value)]=\"currentAutocompleteGroup\"\n >\n <mat-option\n *ngFor=\"let autocompleteGroup of getAutocompleteGroups()\"\n [value]=\"autocompleteGroup\"\n >{{ autocompleteGroup.title }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <ng-container\n *ngFor=\"let bundle of currentAutocompleteGroup.computedSelectors\"\n >\n <h3>{{ bundle.title }}</h3>\n <div class=\"groupsSelector\">\n <mat-button\n *ngIf=\"bundle.unfiltered\"\n mat-icon-button\n color=\"warn\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n matTooltipClass=\"material-tooltip\"\n (click)=\"emptyAutocomplete()\"\n >\n <mat-icon>filter_alt_off</mat-icon>\n </mat-button>\n <mat-form-field\n *ngIf=\"filteredOgcAutocomplete[bundle.id]\"\n floatLabel=\"always\"\n [style.width.%]=\"bundle.width ? bundle.width : undefined\"\n >\n <mat-label>{{ bundle.title }}</mat-label>\n <mat-chip-set\n *ngIf=\"\n filteredOgcAutocomplete[bundle.id] && (bundle.showChips ?? true)\n \"\n >\n <mat-chip\n *ngFor=\"let autocompleteEnabled of autocompleteEnableds\"\n (removed)=\"toggleSelection(autocompleteEnabled)\"\n >\n {{ autocompleteEnabled }}\n <button\n matChipRemove\n [matTooltip]=\"'igo.geo.filter.removeFilter' | translate\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n </mat-chip-set>\n <input\n matInput\n type=\"text\"\n formControlName=\"autocomplete\"\n #input\n [matAutocomplete]=\"auto\"\n (input)=\"onInputChange()\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\">\n <mat-option\n *ngFor=\"\n let ogcAutocomplete of filteredOgcAutocomplete[bundle.id]\n | async\n \"\n id=\"mat-option\"\n [matTooltip]=\"getToolTip(ogcAutocomplete)\"\n >\n <div\n (click)=\"\n toggleAutocompleteOption($event, ogcAutocomplete.value)\n \"\n >\n <mat-checkbox\n id=\"mat-checkbox\"\n color=\"primary\"\n [checked]=\"checkedStatus(ogcAutocomplete.value)\"\n (click)=\"\n toggleAutocompleteOption($event, ogcAutocomplete.value)\n \"\n >\n </mat-checkbox>\n {{ ogcAutocomplete.value }}\n </div>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </ng-container>\n </div>\n </div>\n</form>\n\n<div *ngIf=\"isTemporalOperator()\">\n <mat-divider></mat-divider>\n <h3 *ngIf=\"!currentFilter.title\">\n {{ 'igo.geo.filter.reportingDate' | translate }}\n </h3>\n <h3 *ngIf=\"currentFilter.title\">{{ currentFilter.title }}</h3>\n <igo-ogc-filter-time\n [datasource]=\"datasource\"\n [currentFilter]=\"currentFilter\"\n (changeProperty)=\"changeProperty($event.value, $event.pos)\"\n >\n </igo-ogc-filter-time>\n</div>\n", styles: [":host .mat-button-toggle-group{margin:5px;flex-wrap:wrap;box-shadow:none!important;width:95%}:host .checkboxes{flex-wrap:wrap;box-shadow:none}:host .groupsSelector{text-align:center}:host mat-button-toggle{display:inline-flex;border:1.5px solid black;border-radius:5px;margin:5px;white-space:normal;min-height:40px;height:auto;width:142px}:host mat-button-toggle ::ng-deep .mat-button-toggle-label-content{line-height:unset;font-size:small;display:block}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host mat-button-toggle{width:45%}}:host ::ng-deep .material-tooltip{white-space:pre-wrap}:host mat-checkbox,:host mat-radio-button{margin:7px;width:95%;display:inline-flex;font-size:larger}:host mat-checkbox ::ng-deep label,:host mat-radio-button ::ng-deep label{white-space:normal}:host mat-checkbox{vertical-align:middle}:host mat-button{padding-right:10px;cursor:pointer}:host h3{margin:7px;text-align:left}:host u{cursor:pointer;color:#00f;margin:5px}:host p{margin:unset}\n"] }]
|
|
766
|
+
}], ctorParameters: () => [{ type: i1.OGCFilterService }, { type: i2.UntypedFormBuilder }, { type: i3.DOMService }, { type: i4.ConfigService }, { type: i0.ChangeDetectorRef }], propDecorators: { sel: [{
|
|
767
|
+
type: ViewChild,
|
|
768
|
+
args: ['selection']
|
|
769
|
+
}], matAutocomplete: [{
|
|
770
|
+
type: ViewChild,
|
|
771
|
+
args: [MatAutocompleteTrigger, { read: MatAutocompleteTrigger }]
|
|
772
|
+
}], refreshFilters: [{
|
|
773
|
+
type: Input
|
|
774
|
+
}], datasource: [{
|
|
775
|
+
type: Input
|
|
776
|
+
}], map: [{
|
|
777
|
+
type: Input
|
|
778
|
+
}], checkboxesIndex: [{
|
|
779
|
+
type: Input
|
|
780
|
+
}], radioButtonsIndex: [{
|
|
781
|
+
type: Input
|
|
782
|
+
}], baseIndex: [{
|
|
783
|
+
type: Input
|
|
784
|
+
}], currentFilter: [{
|
|
785
|
+
type: Input
|
|
786
|
+
}] } });
|
|
787
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci1zZWxlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZ2VvL3NyYy9saWIvZmlsdGVyL29nYy1maWx0ZXItc2VsZWN0aW9uL29nYy1maWx0ZXItc2VsZWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXNlbGVjdGlvbi9vZ2MtZmlsdGVyLXNlbGVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUVMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixrQkFBa0IsRUFFbEIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFB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LEdBQUc7c0JBQVgsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdGLGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nRm9yLCBOZ0lmLCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICBNYXRBdXRvY29tcGxldGVUcmlnZ2VyXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2VsZWN0LCBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBET01PcHRpb25zLCBET01TZXJ2aWNlLCBET01WYWx1ZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9kb20nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUvY29uZmlnJztcbmltcG9ydCB7IElnb0xhbmd1YWdlTW9kdWxlIH0gZnJvbSAnQGlnbzIvY29yZS9sYW5ndWFnZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgV01TRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL3dtcy1kYXRhc291cmNlJztcbmltcG9ydCB7IE9nY0ZpbHRlcldyaXRlciB9IGZyb20gJy4uLy4uL2ZpbHRlci9zaGFyZWQvb2djLWZpbHRlcic7XG5pbXBvcnQge1xuICBJZ29PZ2NGaWx0ZXJPYmplY3QsXG4gIE9nY0F1dG9jb21wbGV0ZSxcbiAgT2djRmlsdGVyYWJsZURhdGFTb3VyY2UsXG4gIE9nY1B1c2hCdXR0b24sXG4gIE9nY1NlbGVjdG9yQnVuZGxlLFxuICBTZWxlY3Rvckdyb3VwXG59IGZyb20gJy4uLy4uL2ZpbHRlci9zaGFyZWQvb2djLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWFwQmFzZSB9IGZyb20gJy4uLy4uL21hcCc7XG5pbXBvcnQgeyBPZ2NGaWx0ZXJUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vb2djLWZpbHRlci10aW1lL29nYy1maWx0ZXItdGltZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2djRmlsdGVyT3BlcmF0b3IgfSBmcm9tICcuLi9zaGFyZWQvb2djLWZpbHRlci5lbnVtJztcbmltcG9ydCB7IE9HQ0ZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvb2djLWZpbHRlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWdvLW9nYy1maWx0ZXItc2VsZWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29nYy1maWx0ZXItc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb2djLWZpbHRlci1zZWxlY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbRE9NU2VydmljZV0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nRm9yLFxuICAgIE5nSWYsXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSxcbiAgICBOZ1N0eWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxuICAgIE9nY0ZpbHRlclRpbWVDb21wb25lbnQsXG4gICAgQXN5bmNQaXBlLFxuICAgIElnb0xhbmd1YWdlTW9kdWxlLFxuICAgIE1hdENoaXBzTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgT2djRmlsdGVyU2VsZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgnc2VsZWN0aW9uJykgc2VsOiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgeyByZWFkOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0pXG4gIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICBASW5wdXQoKSByZWZyZXNoRmlsdGVyczogKCkgPT4gdm9pZDtcblxuICBASW5wdXQoKSBkYXRhc291cmNlOiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZTtcblxuICBASW5wdXQoKSBtYXA6IE1hcEJhc2U7XG5cbiAgQElucHV0KCkgY2hlY2tib3hlc0luZGV4ID0gNTtcbiAgQElucHV0KCkgcmFkaW9CdXR0b25zSW5kZXggPSA1O1xuICBASW5wdXQoKSBiYXNlSW5kZXggPSA1O1xuXG4gIEBJbnB1dCgpXG4gIGdldCBjdXJyZW50RmlsdGVyKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXI7XG4gIH1cbiAgc2V0IGN1cnJlbnRGaWx0ZXIodmFsdWUpIHtcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGaWx0ZXI/LnNsaWRlck9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucy5lbmFibGVkID0gZmFsc2U7IC8vIHJlbW92ZSBzbGlkZXIgdG9nZ2xlIChhbmltYXRpb24gdGVtcG9yZWxsZSlcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfY3VycmVudEZpbHRlcjogYW55O1xuICBwcml2YXRlIGlucHV0Q2hhbmdlQXV0b2NvbXBsZXRlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwdWJsaWMgb2djRmlsdGVyT3BlcmF0b3IgPSBPZ2NGaWx0ZXJPcGVyYXRvcjtcblxuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHJpdmF0ZSBvZ2NGaWx0ZXJXcml0ZXI6IE9nY0ZpbHRlcldyaXRlcjtcbiAgcHVibGljIGNvbG9yID0gJ3ByaW1hcnknO1xuICBwdWJsaWMgc2VsZWN0QWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgcHVibGljIHNlbGVjdEVuYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xuICBwdWJsaWMgc2VsZWN0RW5hYmxlZHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHB1YmxpYyBhdXRvY29tcGxldGVFbmFibGVkcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSk7XG4gIHB1YmxpYyBmaWx0ZXJlZE9nY0F1dG9jb21wbGV0ZTogUmVjb3JkPHN0cmluZywgT2JzZXJ2YWJsZTxhbnlbXT4+ID0ge307XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyc1RpbWVvdXQ7XG5cbiAgZ2V0IG9nY0ZpbHRlcnNTZWxlY3RvcnMoKSB7XG4gICAgY29uc3Qgb2djU2VsZWN0b3IgPSBbXTtcbiAgICBpZiAodGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5wdXNoQnV0dG9ucykge1xuICAgICAgb2djU2VsZWN0b3IucHVzaCh0aGlzLmRhdGFzb3VyY2U/Lm9wdGlvbnM/Lm9nY0ZpbHRlcnM/LnB1c2hCdXR0b25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZT8ub3B0aW9ucz8ub2djRmlsdGVycz8uY2hlY2tib3hlcykge1xuICAgICAgb2djU2VsZWN0b3IucHVzaCh0aGlzLmRhdGFzb3VyY2U/Lm9wdGlvbnM/Lm9nY0ZpbHRlcnM/LmNoZWNrYm94ZXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5yYWRpb0J1dHRvbnMpIHtcbiAgICAgIG9nY1NlbGVjdG9yLnB1c2godGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5yYWRpb0J1dHRvbnMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5zZWxlY3QpIHtcbiAgICAgIG9nY1NlbGVjdG9yLnB1c2godGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5zZWxlY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5hdXRvY29tcGxldGUpIHtcbiAgICAgIG9nY1NlbGVjdG9yLnB1c2godGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5hdXRvY29tcGxldGUpO1xuICAgIH1cbiAgICBvZ2NTZWxlY3Rvci5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYS5vcmRlciA8IGIub3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEub3JkZXIgPiBiLm9yZGVyKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9nY1NlbGVjdG9yO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRQdXNoQnV0dG9uc0dyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdwdXNoQnV0dG9uc0dyb3VwJykudmFsdWU7XG4gIH1cbiAgc2V0IGN1cnJlbnRQdXNoQnV0dG9uc0dyb3VwKHZhbHVlKSB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBwdXNoQnV0dG9uc0dyb3VwOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGdldCBjdXJyZW50Q2hlY2tib3hlc0dyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdjaGVja2JveGVzR3JvdXAnKS52YWx1ZTtcbiAgfVxuICBzZXQgY3VycmVudENoZWNrYm94ZXNHcm91cCh2YWx1ZSkge1xuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgY2hlY2tib3hlc0dyb3VwOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGdldCBjdXJyZW50UmFkaW9CdXR0b25zR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3JhZGlvQnV0dG9uc0dyb3VwJykudmFsdWU7XG4gIH1cbiAgc2V0IGN1cnJlbnRSYWRpb0J1dHRvbnNHcm91cCh2YWx1ZSkge1xuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgcmFkaW9CdXR0b25zR3JvdXA6IHZhbHVlIH0pO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnc2VsZWN0R3JvdXAnKS52YWx1ZTtcbiAgfVxuICBzZXQgY3VycmVudFNlbGVjdEdyb3VwKHZhbHVlKSB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBzZWxlY3RHcm91cDogdmFsdWUgfSk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdhdXRvY29tcGxldGVHcm91cCcpLnZhbHVlO1xuICB9XG4gIHNldCBjdXJyZW50QXV0b2NvbXBsZXRlR3JvdXAodmFsdWUpIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGF1dG9jb21wbGV0ZUdyb3VwOiB2YWx1ZSB9KTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEVuYWJsZWQkLnZhbHVlO1xuICB9XG5cbiAgc2V0IHNlbGVjdEVuYWJsZWQodmFsdWUpIHtcbiAgICB0aGlzLnNlbGVjdEVuYWJsZWQkLm5leHQodmFsdWUpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmFwcGx5RmlsdGVyc1RpbWVvdXQpO1xuICAgIHRoaXMuY3VycmVudFNlbGVjdEdyb3VwLmNvbXB1dGVkU2VsZWN0b3JzLmZvckVhY2goKGNvbXBTZWxlY3QpID0+IHtcbiAgICAgIGNvbXBTZWxlY3Quc2VsZWN0b3JzPy5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICB2YWx1ZSA9PT0gc2VsZWN0b3JcbiAgICAgICAgICA/IChzZWxlY3Rvci5lbmFibGVkID0gdHJ1ZSlcbiAgICAgICAgICA6IChzZWxlY3Rvci5lbmFibGVkID0gZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFwcGx5RmlsdGVyc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfSwgNzUwKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RFbmFibGVkcygpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RFbmFibGVkcyQudmFsdWU7XG4gIH1cblxuICBzZXQgc2VsZWN0RW5hYmxlZHModmFsdWUpIHtcbiAgICB0aGlzLnNlbGVjdEVuYWJsZWRzJC5uZXh0KHZhbHVlKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5hcHBseUZpbHRlcnNUaW1lb3V0KTtcbiAgICB0aGlzLmN1cnJlbnRTZWxlY3RHcm91cC5jb21wdXRlZFNlbGVjdG9ycy5mb3JFYWNoKChjb21wU2VsZWN0KSA9PiB7XG4gICAgICBjb21wU2VsZWN0LnNlbGVjdG9ycz8uZm9yRWFjaCgoc2VsZWN0b3IpID0+IHtcbiAgICAgICAgdmFsdWUuaW5jbHVkZXMoc2VsZWN0b3IpXG4gICAgICAgICAgPyAoc2VsZWN0b3IuZW5hYmxlZCA9IHRydWUpXG4gICAgICAgICAgOiAoc2VsZWN0b3IuZW5hYmxlZCA9IGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcHBseUZpbHRlcnNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH0sIDc1MCk7XG4gIH1cblxuICBnZXQgYXV0b2NvbXBsZXRlRW5hYmxlZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b2NvbXBsZXRlRW5hYmxlZHMkLnZhbHVlO1xuICB9XG5cbiAgLy8gVXBkYXRlcyB0aGUgY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwIGFuZCBhcHBsaWVzIGZpbHRlcnNcbiAgc2V0IGF1dG9jb21wbGV0ZUVuYWJsZWRzKGZpbHRlckxpc3QpIHtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUVuYWJsZWRzJC5uZXh0KGZpbHRlckxpc3QpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmFwcGx5RmlsdGVyc1RpbWVvdXQpO1xuICAgIHRoaXMuY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwLmNvbXB1dGVkU2VsZWN0b3JzLmZvckVhY2goKGNvbXBTZWxlY3QpID0+IHtcbiAgICAgIGNvbXBTZWxlY3Quc2VsZWN0b3JzPy5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICBzZWxlY3Rvci5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlckxpc3QpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyID09PSBzZWxlY3Rvci50aXRsZSkge1xuICAgICAgICAgICAgc2VsZWN0b3IuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICB9LCA3NTApO1xuICB9XG5cbiAgLy8gSW5kaWNhdGVzIHRoZSBjaGVja2VkIHN0YXR1cyBvZiBhdXRvY29tcGxldGUgY2hlY2tib3hlc1xuICBjaGVja2VkU3RhdHVzKGF1dG9jb21wbGV0ZUZpbHRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b2NvbXBsZXRlRW5hYmxlZHMuaW5jbHVkZXMoYXV0b2NvbXBsZXRlRmlsdGVyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb2djRmlsdGVyU2VydmljZTogT0dDRmlsdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkb21TZXJ2aWNlOiBET01TZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLm9nY0ZpbHRlcldyaXRlciA9IG5ldyBPZ2NGaWx0ZXJXcml0ZXIoKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm0oKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBwdXNoQnV0dG9uczogWycnXSxcbiAgICAgIHJhZGlvQnV0dG9uczogWycnXSxcbiAgICAgIHB1c2hCdXR0b25zR3JvdXA6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGNoZWNrYm94ZXNHcm91cDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcmFkaW9CdXR0b25zR3JvdXA6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHNlbGVjdEdyb3VwOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzZWxlY3Q6IFsnJ10sXG4gICAgICBzZWxlY3RNdWx0aTogWycnXSxcbiAgICAgIGF1dG9jb21wbGV0ZUdyb3VwOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBhdXRvY29tcGxldGU6IFsnJ11cbiAgICB9KTtcbiAgfVxuXG4gIGdldFB1c2hCdXR0b25zR3JvdXBzKCk6IFNlbGVjdG9yR3JvdXBbXSB7XG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZT8ub3B0aW9ucz8ub2djRmlsdGVycz8ucHVzaEJ1dHRvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLnB1c2hCdXR0b25zLmdyb3VwcztcbiAgICB9XG4gIH1cblxuICBnZXRDaGVja2JveGVzR3JvdXBzKCk6IFNlbGVjdG9yR3JvdXBbXSB7XG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZT8ub3B0aW9ucz8ub2djRmlsdGVycz8uY2hlY2tib3hlcykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuY2hlY2tib3hlcy5ncm91cHM7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmFkaW9CdXR0b25zR3JvdXBzKCk6IFNlbGVjdG9yR3JvdXBbXSB7XG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZT8ub3B0aW9ucz8ub2djRmlsdGVycz8ucmFkaW9CdXR0b25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5yYWRpb0J1dHRvbnMuZ3JvdXBzO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdEdyb3VwcygpOiBTZWxlY3Rvckdyb3VwW10ge1xuICAgIGlmICh0aGlzLmRhdGFzb3VyY2U/Lm9wdGlvbnM/Lm9nY0ZpbHRlcnM/LnNlbGVjdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuc2VsZWN0Lmdyb3VwcztcbiAgICB9XG4gIH1cblxuICBnZXRBdXRvY29tcGxldGVHcm91cHMoKTogU2VsZWN0b3JHcm91cFtdIHtcbiAgICBpZiAodGhpcy5kYXRhc291cmNlPy5vcHRpb25zPy5vZ2NGaWx0ZXJzPy5hdXRvY29tcGxldGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLmF1dG9jb21wbGV0ZS5ncm91cHM7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLnB1c2hCdXR0b25zKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFB1c2hCdXR0b25zR3JvdXAgPVxuICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMucHVzaEJ1dHRvbnMuZ3JvdXBzLmZpbmQoXG4gICAgICAgICAgICAoZ3JvdXApID0+IGdyb3VwLmVuYWJsZWRcbiAgICAgICAgICApIHx8IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMucHVzaEJ1dHRvbnMuZ3JvdXBzWzBdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuY2hlY2tib3hlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRDaGVja2JveGVzR3JvdXAgPVxuICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuY2hlY2tib3hlcy5ncm91cHMuZmluZChcbiAgICAgICAgICAgIChncm91cCkgPT4gZ3JvdXAuZW5hYmxlZFxuICAgICAgICAgICkgfHwgdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5jaGVja2JveGVzLmdyb3Vwc1swXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLnJhZGlvQnV0dG9ucykge1xuICAgICAgICB0aGlzLmN1cnJlbnRSYWRpb0J1dHRvbnNHcm91cCA9XG4gICAgICAgICAgdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5yYWRpb0J1dHRvbnMuZ3JvdXBzLmZpbmQoXG4gICAgICAgICAgICAoZ3JvdXApID0+IGdyb3VwLmVuYWJsZWRcbiAgICAgICAgICApIHx8IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMucmFkaW9CdXR0b25zLmdyb3Vwc1swXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLnNlbGVjdCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RHcm91cCA9XG4gICAgICAgICAgdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5zZWxlY3QuZ3JvdXBzLmZpbmQoXG4gICAgICAgICAgICAoZ3JvdXApID0+IGdyb3VwLmVuYWJsZWRcbiAgICAgICAgICApIHx8IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuc2VsZWN0Lmdyb3Vwc1swXTtcbiAgICAgICAgdGhpcy5pbml0U2VsZWN0RW5hYmxlZCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmdldFNlbGVjdERvbVZhbHVlcygpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwID1cbiAgICAgICAgICB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5vZ2NGaWx0ZXJzLmF1dG9jb21wbGV0ZS5ncm91cHMuZmluZChcbiAgICAgICAgICAgIChncm91cCkgPT4gZ3JvdXAuZW5hYmxlZFxuICAgICAgICAgICkgfHwgdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5hdXRvY29tcGxldGUuZ3JvdXBzWzBdO1xuICAgICAgICB0aGlzLmluaXRBdXRvY29tcGxldGVFbmFibGVkcygpO1xuICAgICAgICBhd2FpdCB0aGlzLmdldEF1dG9jb21wbGV0ZURvbVZhbHVlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1cbiAgICAgIC5nZXQoJ3B1c2hCdXR0b25zR3JvdXAnKVxuICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg3NTApKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25QdXNoQnV0dG9uc0NoYW5nZUdyb3VwKCk7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmZvcm1cbiAgICAgIC5nZXQoJ2NoZWNrYm94ZXNHcm91cCcpXG4gICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vbkNoZWNrYm94ZXNDaGFuZ2VHcm91cCgpO1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5mb3JtXG4gICAgICAuZ2V0KCdyYWRpb0J1dHRvbnNHcm91cCcpXG4gICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5vblJhZGlvQnV0dG9uc0NoYW5nZUdyb3VwKCk7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmZvcm1cbiAgICAgIC5nZXQoJ3NlbGVjdEdyb3VwJylcbiAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNzUwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm9uU2VsZWN0Q2hhbmdlR3JvdXAoKTtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZm9ybVxuICAgICAgLmdldCgnYXV0b2NvbXBsZXRlR3JvdXAnKVxuICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg3NTApKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25BdXRvY29tcGxldGVDaGFuZ2VHcm91cCgpO1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfSk7XG4gICAgdGhpcy5mb3JtXG4gICAgICAuZ2V0KCdwdXNoQnV0dG9ucycpXG4gICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZm9ybVxuICAgICAgLmdldCgncmFkaW9CdXR0b25zJylcbiAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNzUwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfSk7XG5cbiAgICAvLyBEZWJvdW5jZSB0aW1lIGZvciBhdXRvY29tcGxldGUgZmlsdGVyIG9wdGlvbnMgLSB2YWx1ZSBjaG9zZW4gYXJiaXRyYXJpbHlcbiAgICB0aGlzLmlucHV0Q2hhbmdlQXV0b2NvbXBsZXRlLnBpcGUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRBdXRvY29tcGxldGVEb21WYWx1ZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNlbGVjdEVuYWJsZWQoKSB7XG4gICAgY29uc3QgZW5hYmxlZHMgPSBbXTtcbiAgICBsZXQgZW5hYmxlZDtcbiAgICB0aGlzLmN1cnJlbnRTZWxlY3RHcm91cC5jb21wdXRlZFNlbGVjdG9ycy5mb3JFYWNoKChjb21wU2VsZWN0KSA9PiB7XG4gICAgICBpZiAoY29tcFNlbGVjdC5tdWx0aXBsZSkge1xuICAgICAgICBjb21wU2VsZWN0LnNlbGVjdG9ycz8uZm9yRWFjaCgoc2VsZWN0b3IpID0+IHtcbiAgICAgICAgICBpZiAoc2VsZWN0b3IuZW5hYmxlZCkge1xuICAgICAgICAgICAgZW5hYmxlZHMucHVzaChzZWxlY3Rvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZWxlY3RFbmFibGVkcyA9IGVuYWJsZWRzO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3NlbGVjdE11bHRpJ10uc2V0VmFsdWUoZW5hYmxlZHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcFNlbGVjdC5zZWxlY3RvcnM/LmZvckVhY2goKHNlbGVjdG9yKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbGVjdG9yLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxlY3RvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3NlbGVjdCddLnJlc2V0KGVuYWJsZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdEVuYWJsZWQkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzWydzZWxlY3QnXS52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1snc2VsZWN0J10uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0RW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRBdXRvY29tcGxldGVFbmFibGVkcygpIHtcbiAgICBjb25zdCBlbmFibGVkID0gW107XG4gICAgdGhpcy5jdXJyZW50QXV0b2NvbXBsZXRlR3JvdXAuY29tcHV0ZWRTZWxlY3RvcnMuZm9yRWFjaCgoY29tcFNlbGVjdCkgPT4ge1xuICAgICAgY29tcFNlbGVjdC5zZWxlY3RvcnM/LmZvckVhY2goKHNlbGVjdG9yKSA9PiB7XG4gICAgICAgIGlmIChzZWxlY3Rvci5lbmFibGVkKSB7XG4gICAgICAgICAgY29uc3QgZG9tID0ge1xuICAgICAgICAgICAgaWQ6IHNlbGVjdG9yLmZpbHRlcnMuZXhwcmVzc2lvbixcbiAgICAgICAgICAgIHZhbHVlOiBzZWxlY3Rvci50aXRsZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZW5hYmxlZC5wdXNoKHNlbGVjdG9yLnRpdGxlKTtcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ2F1dG9jb21wbGV0ZSddLnNldFZhbHVlKGRvbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVFbmFibGVkcyA9IGVuYWJsZWQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRUb29sVGlwKHNlbGVjdG9yKTogc3RyaW5nIHtcbiAgICBsZXQgdG9vbFRpcDtcbiAgICBpZiAoc2VsZWN0b3IudG9vbHRpcCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0b3IudG9vbHRpcCkpIHtcbiAgICAgICAgdG9vbFRpcCA9IHNlbGVjdG9yLnRvb2x0aXAuam9pbignXFxuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29sVGlwID0gc2VsZWN0b3IudG9vbHRpcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvb2xUaXAgfHwgJyc7XG4gIH1cblxuICBhc3luYyBnZXRTZWxlY3REb21WYWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVycy5zZWxlY3QuYnVuZGxlcykge1xuICAgICAgaWYgKGJ1bmRsZS5kb21TZWxlY3RvcnMpIHtcbiAgICAgICAgbGV0IGRvbVZhbHVlcztcbiAgICAgICAgZm9yIChjb25zdCBkb21TZWxlY3RvciBvZiBidW5kbGUuZG9tU2VsZWN0b3JzKSB7XG4gICAgICAgICAgbGV0IGZpbHRlckRPTTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGRvbU9wdGlvbnMgb2YgdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZzxET01PcHRpb25zW10+KFxuICAgICAgICAgICAgJ2RvbSdcbiAgICAgICAgICApKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRvbVNlbGVjdG9yLmlkID09PSBkb21PcHRpb25zLmlkIHx8XG4gICAgICAgICAgICAgIGRvbVNlbGVjdG9yLm5hbWUgPT09IGRvbU9wdGlvbnMubmFtZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpbHRlckRPTSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZG9tT3B0aW9ucy5pZCxcbiAgICAgICAgICAgICAgICB1cmw6IGRvbU9wdGlvbnMudXJsLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRvbU9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGRvbU9wdGlvbnMudmFsdWVzXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbHRlckRPTS51cmxcbiAgICAgICAgICAgID8gKGRvbVZhbHVlcyA9IChhd2FpdCB0aGlzLmRvbVNlcnZpY2UuZ2V0RG9tVmFsdWVzRnJvbVVSTChcbiAgICAgICAgICAgICAgICBmaWx0ZXJET01cbiAgICAgICAgICAgICAgKSkgYXMgRE9NVmFsdWVbXSlcbiAgICAgICAgICAgIDogKGRvbVZhbHVlcyA9IGZpbHRlckRPTS52YWx1ZXMpO1xuXG4gICAgICAgICAgaWYgKGRvbVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgbmV3QnVuZGxlID0gYnVuZGxlO1xuICAgICAgICAgICAgbmV3QnVuZGxlLnNlbGVjdG9ycyA9IFtdO1xuICAgICAgICAgICAgbGV0IHNlbGVjdG9yO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkb21WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIGxldCBlbmFibGVkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RW5hYmxlZHM/LmZpbmQoKHNlbCkgPT4gc2VsLnRpdGxlID09PSB2YWx1ZS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgID8gKGVuYWJsZWQgPSB0cnVlKVxuICAgICAgICAgICAgICAgICAgOiAoZW5hYmxlZCA9IGZhbHNlKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBkb21TZWxlY3Rvci5vcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBkb21TZWxlY3Rvci5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IHZhbHVlLmlkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RW5hYmxlZD8udGl0bGUgPT09IHZhbHVlLnZhbHVlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogZG9tU2VsZWN0b3Iub3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogZG9tU2VsZWN0b3IucHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiB2YWx1ZS5pZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3QnVuZGxlLnNlbGVjdG9ycy5wdXNoKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0R3JvdXBzKClcbiAgICAgICAgICAgICAgLmZpbmQoKGdyb3VwKSA9PiBncm91cC5pZHMuaW5jbHVkZXMobmV3QnVuZGxlLmlkKSlcbiAgICAgICAgICAgICAgLmNvbXB1dGVkU2VsZWN0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGNvbXApID0+IGNvbXAudGl0bGUgPT09IG5ld0J1bmRsZS50aXRsZVxuICAgICAgICAgICAgICApLnNlbGVjdG9ycyA9IG5ld0J1bmRsZS5zZWxlY3RvcnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdFNlbGVjdEVuYWJsZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcmlnZ2VyIGZpbHRlciByZWZyZXNoICh3aXRoIGRlYm91bmNlKVxuICBvbklucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMuaW5wdXRDaGFuZ2VBdXRvY29tcGxldGUubmV4dCgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXV0b2NvbXBsZXRlRG9tVmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgYnVuZGxlIG9mIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlXG4gICAgICAuYnVuZGxlcykge1xuICAgICAgaWYgKGJ1bmRsZS5kb21TZWxlY3RvcnMpIHtcbiAgICAgICAgbGV0IGRvbVZhbHVlczogRE9NVmFsdWVbXTtcbiAgICAgICAgZm9yIChjb25zdCBkb21TZWxlY3RvciBvZiBidW5kbGUuZG9tU2VsZWN0b3JzKSB7XG4gICAgICAgICAgbGV0IGZpbHRlckRPTTogRE9NT3B0aW9ucztcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0RvbSBvZiB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnPERPTU9wdGlvbnNbXT4oXG4gICAgICAgICAgICAnZG9tJ1xuICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZG9tU2VsZWN0b3IuaWQgPT09IGNvbmZpZ0RvbS5pZCB8fFxuICAgICAgICAgICAgICBkb21TZWxlY3Rvci5uYW1lID09PSBjb25maWdEb20ubmFtZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpbHRlckRPTSA9IHtcbiAgICAgICAgICAgICAgICBpZDogY29uZmlnRG9tLmlkLFxuICAgICAgICAgICAgICAgIHVybDogY29uZmlnRG9tLnVybCxcbiAgICAgICAgICAgICAgICBuYW1lOiBjb25maWdEb20ubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGNvbmZpZ0RvbS52YWx1ZXNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmlsdGVyRE9NLnVybFxuICAgICAgICAgICAgPyAoZG9tVmFsdWVzID0gKGF3YWl0IHRoaXMuZG9tU2VydmljZS5nZXREb21WYWx1ZXNGcm9tVVJMKFxuICAgICAgICAgICAgICAgIGZpbHRlckRPTVxuICAgICAgICAgICAgICApKSBhcyBET01WYWx1ZVtdKVxuICAgICAgICAgICAgOiAoZG9tVmFsdWVzID0gZmlsdGVyRE9NLnZhbHVlcyk7XG5cbiAgICAgICAgICBpZiAoZG9tVmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCdW5kbGU6IE9nY1NlbGVjdG9yQnVuZGxlID0gYnVuZGxlO1xuICAgICAgICAgICAgbmV3QnVuZGxlLnNlbGVjdG9ycyA9IFtdO1xuICAgICAgICAgICAgbGV0IHNlbGVjdG9yOiBPZ2NBdXRvY29tcGxldGU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvbVZhbHVlIG9mIGRvbVZhbHVlcykge1xuICAgICAgICAgICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogZG9tVmFsdWUuaWQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuYXV0b2NvbXBsZXRlRW5hYmxlZHM/LmluY2x1ZGVzKGRvbVZhbHVlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBkb21TZWxlY3Rvci5vcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogZG9tU2VsZWN0b3IucHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZG9tVmFsdWUudmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIG5ld0J1bmRsZS5zZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdldEF1dG9jb21wbGV0ZUdyb3VwcygpXG4gICAgICAgICAgICAgIC5maW5kKChncm91cDogU2VsZWN0b3JHcm91cCkgPT4gZ3JvdXAuaWRzLmluY2x1ZGVzKG5ld0J1bmRsZS5pZCkpXG4gICAgICAgICAgICAgIC5jb21wdXRlZFNlbGVjdG9ycy5maW5kKFxuICAgICAgICAgICAgICAgIChjb21wdXRlZFNlbGVjdG9yKSA9PiBjb21wdXRlZFNlbGVjdG9yLnRpdGxlID09PSBuZXdCdW5kbGUudGl0bGVcbiAgICAgICAgICAgICAgKS5zZWxlY3RvcnMgPSBuZXdCdW5kbGUuc2VsZWN0b3JzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPZ2NBdXRvY29tcGxldGVbYnVuZGxlLmlkXSA9IG5ldyBPYnNlcnZhYmxlPGFueVtdPigpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9nY0F1dG9jb21wbGV0ZVtidW5kbGUuaWRdID0gb2YoZG9tVmFsdWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRCdXR0b25Db2xvcihwdXNoQnV0dG9uOiBPZ2NQdXNoQnV0dG9uKSB7XG4gICAgbGV0IHN0eWxlcztcbiAgICBpZiAocHVzaEJ1dHRvbi5jb2xvciAmJiBwdXNoQnV0dG9uLmVuYWJsZWQpIHtcbiAgICAgIHN0eWxlcyA9IHtcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBgcmdiYSgke3B1c2hCdXR0b24uY29sb3J9KWBcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cblxuICBidW5kbGVJc1ZlcnRpY2FsKGJ1bmRsZTogT2djU2VsZWN0b3JCdW5kbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYnVuZGxlLnZlcnRpY2FsID8gYnVuZGxlLnZlcnRpY2FsIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG9uUHVzaEJ1dHRvbnNDaGFuZ2VHcm91cCgpIHtcbiAgICB0aGlzLmdldFB1c2hCdXR0b25zR3JvdXBzKCkubWFwKChncm91cCkgPT4gKGdyb3VwLmVuYWJsZWQgPSBmYWxzZSkpO1xuICAgIHRoaXMuZ2V0UHVzaEJ1dHRvbnNHcm91cHMoKS5maW5kKFxuICAgICAgKGdyb3VwKSA9PiBncm91cCA9PT0gdGhpcy5jdXJyZW50UHVzaEJ1dHRvbnNHcm91cFxuICAgICkuZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hlY2tib3hlc0NoYW5nZUdyb3VwKCkge1xuICAgIHRoaXMuZ2V0Q2hlY2tib3hlc0dyb3VwcygpLm1hcCgoZ3JvdXApID0+IChncm91cC5lbmFibGVkID0gZmFsc2UpKTtcbiAgICB0aGlzLmdldENoZWNrYm94ZXNHcm91cHMoKS5maW5kKFxuICAgICAgKGdyb3VwKSA9PiBncm91cCA9PT0gdGhpcy5jdXJyZW50Q2hlY2tib3hlc0dyb3VwXG4gICAgKS5lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgb25SYWRpb0J1dHRvbnNDaGFuZ2VHcm91cCgpIHtcbiAgICB0aGlzLmdldFJhZGlvQnV0dG9uc0dyb3VwcygpLm1hcCgoZ3JvdXApID0+IChncm91cC5lbmFibGVkID0gZmFsc2UpKTtcbiAgICB0aGlzLmdldFJhZGlvQnV0dG9uc0dyb3VwcygpLmZpbmQoXG4gICAgICAoZ3JvdXApID0+IGdyb3VwID09PSB0aGlzLmN1cnJlbnRSYWRpb0J1dHRvbnNHcm91cFxuICAgICkuZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIG9uU2VsZWN0Q2hhbmdlR3JvdXAoKSB7XG4gICAgdGhpcy5nZXRTZWxlY3RHcm91cHMoKS5tYXAoKGdyb3VwKSA9PiAoZ3JvdXAuZW5hYmxlZCA9IGZhbHNlKSk7XG4gICAgdGhpcy5nZXRTZWxlY3RHcm91cHMoKS5maW5kKFxuICAgICAgKGdyb3VwKSA9PiBncm91cCA9PT0gdGhpcy5jdXJyZW50U2VsZWN0R3JvdXBcbiAgICApLmVuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkF1dG9jb21wbGV0ZUNoYW5nZUdyb3VwKCkge1xuICAgIHRoaXMuZ2V0QXV0b2NvbXBsZXRlR3JvdXBzKCkubWFwKChncm91cCkgPT4gKGdyb3VwLmVuYWJsZWQgPSBmYWxzZSkpO1xuICAgIHRoaXMuZ2V0QXV0b2NvbXBsZXRlR3JvdXBzKCkuZmluZChcbiAgICAgIChncm91cCkgPT4gZ3JvdXAgPT09IHRoaXMuY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwXG4gICAgKS5lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGN1cnJlbnRPZ2NTZWxlY3Rpb24/LCBzZWxlY3RvclR5cGU/KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuYXBwbHlGaWx0ZXJzVGltZW91dCk7XG4gICAgaWYgKHNlbGVjdG9yVHlwZSA9PT0gJ3JhZGlvQnV0dG9uJykge1xuICAgICAgdGhpcy5lbXB0eVJhZGlvQnV0dG9ucygpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50T2djU2VsZWN0aW9uKSB7XG4gICAgICBjdXJyZW50T2djU2VsZWN0aW9uLmVuYWJsZWQgPSAhY3VycmVudE9nY1NlbGVjdGlvbi5lbmFibGVkO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5RmlsdGVyc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfSwgNzUwKTtcbiAgfVxuXG4gIGVtcHR5UmFkaW9CdXR0b25zKCkge1xuICAgIHRoaXMuY3VycmVudFJhZGlvQnV0dG9uc0dyb3VwLmNvbXB1dGVkU2VsZWN0b3JzLmZvckVhY2goKGNvbXBTZWxlY3QpID0+IHtcbiAgICAgIGNvbXBTZWxlY3Quc2VsZWN0b3JzLm1hcCgoc2VsZWN0b3IpID0+IChzZWxlY3Rvci5lbmFibGVkID0gZmFsc2UpKTtcblxuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9LCA3NTApO1xuICAgIH0pO1xuICB9XG5cbiAgZW1wdHlTZWxlY3QoKSB7XG4gICAgdGhpcy5zZWxlY3RFbmFibGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZW1wdHlBdXRvY29tcGxldGUoKSB7XG4gICAgdGhpcy5hdXRvY29tcGxldGVFbmFibGVkcyA9IFtdO1xuICAgIHRoaXMuZm9ybS5jb250cm9sc1snYXV0b2NvbXBsZXRlJ10uc2V0VmFsdWUoJycpO1xuICAgIHRoaXMuZm9ybS5jb250cm9sc1snYXV0b2NvbXBsZXRlJ10ubWFya0FzVW50b3VjaGVkKCk7XG4gIH1cblxuICB0b2dnbGVBbGxTZWxlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGVuYWJsZWRzID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRTZWxlY3RHcm91cC5jb21wdXRlZFNlbGVjdG9ycy5mb3JFYWNoKChjb21wU2VsZWN0KSA9PiB7XG4gICAgICAgIGNvbXBTZWxlY3Quc2VsZWN0b3JzPy5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICAgIGVuYWJsZWRzLnB1c2goc2VsZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWwub3B0aW9ucy5mb3JFYWNoKChpdGVtOiBNYXRPcHRpb24pID0+IGl0ZW0uc2VsZWN0KCkpO1xuICAgICAgdGhpcy5zZWxlY3RFbmFibGVkcyA9IGVuYWJsZWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbC5vcHRpb25zLmZvckVhY2goKGl0ZW06IE1hdE9wdGlvbikgPT4gaXRlbS5kZXNlbGVjdCgpKTtcbiAgICAgIHRoaXMuc2VsZWN0RW5hYmxlZHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RPcHRpb25DbGljayh2YWx1ZSwgYnVuZGxlLCBldmVudD8pIHtcbiAgICBpZiAoYnVuZGxlLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBlbmFibGVkcyA9IHRoaXMuc2VsZWN0RW5hYmxlZHM7XG4gICAgICBsZXQgbmV3U3RhdHVzID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsLm9wdGlvbnMuZm9yRWFjaCgoaXRlbTogTWF0T3B0aW9uKSA9PiB7XG4gICAgICAgIGlmICghaXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgIG5ld1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsU2VsZWN0ZWQgPSBuZXdTdGF0dXM7XG4gICAgICBpZiAoZXZlbnQuaXNVc2VySW5wdXQpIHtcbiAgICAgICAgaWYgKGVuYWJsZWRzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW5hYmxlZCBvZiBlbmFibGVkcykge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQudGl0bGUgPT09IHZhbHVlLnRpdGxlKSB7XG4gICAgICAgICAgICAgIGlmIChlbmFibGVkLmVuYWJsZWQgJiYgdmFsdWUuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWRzLnNwbGljZShlbmFibGVkcy5pbmRleE9mKGVuYWJsZWQpLCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEVuYWJsZWRzID0gZW5hYmxlZHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5hYmxlZHMuaW5kZXhPZihlbmFibGVkKSA9PT0gZW5hYmxlZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBlbmFibGVkcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RFbmFibGVkcyA9IGVuYWJsZWRzO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5hYmxlZHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RFbmFibGVkcyA9IGVuYWJsZWRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0RW5hYmxlZCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUF1dG9jb21wbGV0ZU9wdGlvbihldmVudDogRXZlbnQsIHRvZ2dsZWRGaWx0ZXI6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uKHRvZ2dsZWRGaWx0ZXIpO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0aW9uKHRvZ2dsZWRGaWx0ZXI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUVuYWJsZWRzLmluY2x1ZGVzKHRvZ2dsZWRGaWx0ZXIpKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUVuYWJsZWRzID0gdGhpcy5hdXRvY29tcGxldGVFbmFibGVkcy5maWx0ZXIoXG4gICAgICAgIChlbmFibGVkRmlsdGVyKSA9PiBlbmFibGVkRmlsdGVyICE9PSB0b2dnbGVkRmlsdGVyXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUVuYWJsZWRzID0gWy4uLnRoaXMuYXV0b2NvbXBsZXRlRW5hYmxlZHMsIHRvZ2dsZWRGaWx0ZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbHVlIGRpc3BsYXllZCBpbiB0aGUgYXV0b2NvbXBsZXRlIGlucHV0IGJveFxuICBkaXNwbGF5Rm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBBcHBsaWVzIGZpbHRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgZ3JvdXAgb2YgYWxsIGZpbHRlciBzZWxlY3Rpb24gdHlwZXNcbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoKSB7XG4gICAgbGV0IGZpbHRlclF1ZXJ5U3RyaW5nID0gJyc7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGN1cnJlbnRHcm91cHMgPSBbXG4gICAgICB0aGlzLmN1cnJlbnRQdXNoQnV0dG9uc0dyb3VwLFxuICAgICAgdGhpcy5jdXJyZW50Q2hlY2tib3hlc0dyb3VwLFxuICAgICAgdGhpcy5jdXJyZW50UmFkaW9CdXR0b25zR3JvdXAsXG4gICAgICB0aGlzLmN1cnJlbnRTZWxlY3RHcm91cCxcbiAgICAgIHRoaXMuY3VycmVudEF1dG9jb21wbGV0ZUdyb3VwXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRHcm91cCBvZiBjdXJyZW50R3JvdXBzKSB7XG4gICAgICBpZiAoY3VycmVudEdyb3VwLmNvbXB1dGVkU2VsZWN0b3JzKSB7XG4gICAgICAgIGN1cnJlbnRHcm91cC5jb21wdXRlZFNlbGVjdG9ycy5tYXAoKHNlbGVjdG9yQnVuZGxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVuZGxlQ29uZGl0aW9uID0gW107XG4gICAgICAgICAgc2VsZWN0b3JCdW5kbGUuc2VsZWN0b3JzXG4gICAgICAgICAgICA/LmZpbHRlcigob2djU2VsZWN0b3IpID0+IG9nY1NlbGVjdG9yLmVuYWJsZWQgPT09IHRydWUpXG4gICAgICAgICAgICAuZm9yRWFjaCgoZW5hYmxlZFNlbGVjdG9yKSA9PlxuICAgICAgICAgICAgICBidW5kbGVDb25kaXRpb24ucHVzaChlbmFibGVkU2VsZWN0b3IuZmlsdGVycylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGJ1bmRsZUNvbmRpdGlvbi5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGJ1bmRsZUNvbmRpdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9ucy5wdXNoKGJ1bmRsZUNvbmRpdGlvblswXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGxvZ2ljYWw6IHNlbGVjdG9yQnVuZGxlLmxvZ2ljYWwsXG4gICAgICAgICAgICAgICAgZmlsdGVyczogYnVuZGxlQ29uZGl0aW9uXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVGVtcG9yYWxPcGVyYXRvcigpICYmIHRoaXMuX2N1cnJlbnRGaWx0ZXIuYWN0aXZlKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuaW50ZXJmYWNlT2djRmlsdGVyc1swXVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID49IDEpIHtcbiAgICAgIGZpbHRlclF1ZXJ5U3RyaW5nID0gdGhpcy5vZ2NGaWx0ZXJXcml0ZXIuYnVpbGRGaWx0ZXIoXG4gICAgICAgIGNvbmRpdGlvbnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBjb25kaXRpb25zWzBdXG4gICAgICAgICAgOiAoeyBsb2dpY2FsOiAnQW5kJywgZmlsdGVyczogY29uZGl0aW9ucyB9IGFzIElnb09nY0ZpbHRlck9iamVjdClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy50eXBlID09PSAnd21zJykge1xuICAgICAgdGhpcy5vZ2NGaWx0ZXJTZXJ2aWNlLmZpbHRlckJ5T2djKFxuICAgICAgICB0aGlzLmRhdGFzb3VyY2UgYXMgV01TRGF0YVNvdXJjZSxcbiAgICAgICAgZmlsdGVyUXVlcnlTdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy50eXBlID09PSAnd2ZzJykge1xuICAgICAgLy8gVE9ETzogQ2hlY2sgaG93IHRvIHByZXZlbnQgd2ZzIHRvIHJlZnJlc2ggd2hlbiBmaWx0ZXIgaWNvbiBpcyBwdXNoZWQuLi5cbiAgICAgIHRoaXMuZGF0YXNvdXJjZS5vbC5yZWZyZXNoKCk7XG4gICAgfVxuICAgIHRoaXMuZGF0YXNvdXJjZS5zZXRPZ2NGaWx0ZXJzKHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMsIHRydWUpO1xuICB9XG5cbiAgaXNNb3JlUmVzdWx0cyhidW5kbGUsIHR5cGUpIHtcbiAgICBjb25zdCBzZWxlY3RvcnNMZW5ndGggPSBidW5kbGUuc2VsZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICB0eXBlID09PSAncmFkaW8nID8gdGhpcy5yYWRpb0J1dHRvbnNJbmRleCA6IHRoaXMuY2hlY2tib3hlc0luZGV4O1xuICAgIHJldHVybiBzZWxlY3RvcnNMZW5ndGggPiBpbmRleDtcbiAgfVxuXG4gIGRpc3BsYXlNb3JlUmVzdWx0cyh0eXBlKSB7XG4gICAgdHlwZSA9PT0gJ3JhZGlvJ1xuICAgICAgPyAodGhpcy5yYWRpb0J1dHRvbnNJbmRleCArPSA1KVxuICAgICAgOiAodGhpcy5jaGVja2JveGVzSW5kZXggKz0gNSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaXNMZXNzUmVzdWx0cyhidW5kbGUsIHR5cGUpIHtcbiAgICBjb25zdCBzZWxlY3RvcnNMZW5ndGggPSBidW5kbGUuc2VsZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICB0eXBlID09PSAncmFkaW8nID8gdGhpcy5yYWRpb0J1dHRvbnNJbmRleCA6IHRoaXMuY2hlY2tib3hlc0luZGV4O1xuICAgIHJldHVybiB0aGlzLmJhc2VJbmRleCAhPT0gaW5kZXggJiYgc2VsZWN0b3JzTGVuZ3RoID4gdGhpcy5iYXNlSW5kZXg7XG4gIH1cblxuICBkaXNwbGF5TGVzc1Jlc3VsdHModHlwZSkge1xuICAgIHR5cGUgPT09ICdyYWRpbydcbiAgICAgID8gKHRoaXMucmFkaW9CdXR0b25zSW5kZXggPSB0aGlzLmJhc2VJbmRleClcbiAgICAgIDogKHRoaXMuY2hlY2tib3hlc0luZGV4ID0gdGhpcy5iYXNlSW5kZXgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlzVGVtcG9yYWxPcGVyYXRvcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXJyZW50RmlsdGVyPy5vcGVyYXRvcj8udG9Mb3dlckNhc2UoKSA9PT1cbiAgICAgIHRoaXMub2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICB9XG5cbiAgY2hhbmdlUHJvcGVydHkodmFsdWU6IGFueSwgcG9zPzogbnVtYmVyLCByZWZyZXNoRmlsdGVyID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRldGVjdGVkUHJvcGVydHkgPSB0aGlzLmRldGVjdFByb3BlcnR5KHBvcyk7XG4gICAgaWYgKGRldGVjdGVkUHJvcGVydHkpIHtcbiAgICAgIHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm9nY0ZpbHRlcnMuaW50ZXJmYWNlT2djRmlsdGVycy5maW5kKFxuICAgICAgICAoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyaWQgPT09IHRoaXMuY3VycmVudEZpbHRlci5maWx0ZXJpZFxuICAgICAgKVtkZXRlY3RlZFByb3BlcnR5XSA9IHZhbHVlO1xuXG4gICAgICBpZiAocmVmcmVzaEZpbHRlcikge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRldGVjdFByb3BlcnR5KHBvcz86IG51bWJlcik6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG86XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvOlxuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzR3JlYXRlclRoYW46XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbk9yRXF1YWxUbzpcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0xlc3NUaGFuOlxuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGVzc1RoYW5PckVxdWFsVG86XG4gICAgICAgIHJldHVybiAnZXhwcmVzc2lvbic7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMaWtlOlxuICAgICAgICByZXR1cm4gJ3BhdHRlcm4nO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzQmV0d2VlbjpcbiAgICAgICAgcmV0dXJuIHBvcyAmJiBwb3MgPT09IDFcbiAgICAgICAgICA/ICdsb3dlckJvdW5kYXJ5J1xuICAgICAgICAgIDogcG9zICYmIHBvcyA9PT0gMlxuICAgICAgICAgICAgPyAndXBwZXJCb3VuZGFyeSdcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5EdXJpbmc6XG4gICAgICAgIHJldHVybiBwb3MgJiYgcG9zID09PSAxXG4gICAgICAgICAgPyAnYmVnaW4nXG4gICAgICAgICAgOiBwb3MgJiYgcG9zID09PSAyXG4gICAgICAgICAgICA/ICdlbmQnXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWxlY3RvciBvZiBvZ2NGaWx0ZXJzU2VsZWN0b3JzXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwdXNoQnV0dG9uR3JvdXBzXCJcbiAgICAgICpuZ0lmPVwic2VsZWN0b3Iuc2VsZWN0b3JUeXBlID09PSAncHVzaEJ1dHRvbidcIlxuICAgID5cbiAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImdyb3Vwc1NlbGVjdG9yXCIgKm5nSWY9XCJnZXRQdXNoQnV0dG9uc0dyb3VwcygpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwdXNoQnV0dG9uc0dyb3VwXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmxheWVyLmxlZ2VuZC5zZWxlY3RTdHlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgICAgWyh2YWx1ZSldPVwiY3VycmVudFB1c2hCdXR0b25zR3JvdXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzZWxlY3Rvckdyb3VwIG9mIGdldFB1c2hCdXR0b25zR3JvdXBzKClcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0b3JHcm91cFwiXG4gICAgICAgICAgICAgID57eyBzZWxlY3Rvckdyb3VwLnRpdGxlIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0Zvcj1cImxldCBidW5kbGUgb2YgY3VycmVudFB1c2hCdXR0b25zR3JvdXAuY29tcHV0ZWRTZWxlY3RvcnNcIlxuICAgICAgPlxuICAgICAgICA8aDM+e3sgYnVuZGxlLnRpdGxlIH19PC9oMz5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHVzaEJ1dHRvbnNcIlxuICAgICAgICAgIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJsZWdhY3lcIlxuICAgICAgICAgIHZlcnRpY2FsPVwie3sgYnVuZGxlSXNWZXJ0aWNhbChidW5kbGUpIH19XCJcbiAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb2djUHVzaEJ1dHRvbiBvZiBidW5kbGUuc2VsZWN0b3JzXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldFRvb2xUaXAob2djUHVzaEJ1dHRvbilcIlxuICAgICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwibWF0ZXJpYWwtdG9vbHRpcFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRCdXR0b25Db2xvcihvZ2NQdXNoQnV0dG9uKVwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJvZ2NQdXNoQnV0dG9uLmVuYWJsZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZShvZ2NQdXNoQnV0dG9uLCBzZWxlY3Rvci5zZWxlY3RvclR5cGUpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvZ2NQdXNoQnV0dG9uXCJcbiAgICAgICAgICAgID57eyBvZ2NQdXNoQnV0dG9uLnRpdGxlIH19XG4gICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNoZWNrYm94R3JvdXBzXCIgKm5nSWY9XCJzZWxlY3Rvci5zZWxlY3RvclR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImdyb3Vwc1NlbGVjdG9yXCIgKm5nSWY9XCJnZXRDaGVja2JveGVzR3JvdXBzKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNoZWNrYm94ZXNHcm91cFwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5sZWdlbmQuc2VsZWN0U3R5bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRDaGVja2JveGVzR3JvdXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzZWxlY3Rvckdyb3VwIG9mIGdldENoZWNrYm94ZXNHcm91cHMoKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3Rvckdyb3VwXCJcbiAgICAgICAgICAgICAgPnt7IHNlbGVjdG9yR3JvdXAudGl0bGUgfX1cbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nRm9yPVwibGV0IGJ1bmRsZSBvZiBjdXJyZW50Q2hlY2tib3hlc0dyb3VwLmNvbXB1dGVkU2VsZWN0b3JzXCJcbiAgICAgID5cbiAgICAgICAgPGgzPnt7IGJ1bmRsZS50aXRsZSB9fTwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveGVzIG1hdC10eXBvZ3JhcGh5XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9nY0NoZWNrYm94IG9mIGJ1bmRsZS5zZWxlY3RvcnNcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZ2V0VG9vbFRpcChvZ2NDaGVja2JveClcIlxuICAgICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwibWF0ZXJpYWwtdG9vbHRpcFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJvZ2NDaGVja2JveC5lbmFibGVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2Uob2djQ2hlY2tib3gsIHNlbGVjdG9yLnNlbGVjdG9yVHlwZSlcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9nY0NoZWNrYm94XCJcbiAgICAgICAgICAgID57eyBvZ2NDaGVja2JveC50aXRsZSB9fVxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHBcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgaXNMZXNzUmVzdWx0cyhidW5kbGUsICdjaGVja2JveCcpIHx8XG4gICAgICAgICAgICBpc01vcmVSZXN1bHRzKGJ1bmRsZSwgJ2NoZWNrYm94JylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPHVcbiAgICAgICAgICAgICpuZ0lmPVwiaXNMZXNzUmVzdWx0cyhidW5kbGUsICdjaGVja2JveCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGVzc1Jlc3VsdHMgbWF0LXR5cG9ncmFwaHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlMZXNzUmVzdWx0cygnY2hlY2tib3gnKVwiXG4gICAgICAgICAgICA+e3sgJ2lnby5nZW8uZmlsdGVyLmRpc3BsYXlMZXNzUmVzdWx0cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3U+XG4gICAgICAgICAgPHVcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNb3JlUmVzdWx0cyhidW5kbGUsICdjaGVja2JveCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9yZVJlc3VsdHMgbWF0LXR5cG9ncmFwaHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRpc3BsYXlNb3JlUmVzdWx0cygnY2hlY2tib3gnKVwiXG4gICAgICAgICAgICA+e3sgJ2lnby5nZW8uZmlsdGVyLmRpc3BsYXlNb3JlUmVzdWx0cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3U+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyYWRpb0J1dHRvbkdyb3Vwc1wiXG4gICAgICAqbmdJZj1cInNlbGVjdG9yLnNlbGVjdG9yVHlwZSA9PT0gJ3JhZGlvQnV0dG9uJ1wiXG4gICAgPlxuICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBzU2VsZWN0b3JcIiAqbmdJZj1cImdldFJhZGlvQnV0dG9uc0dyb3VwcygpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYWRpb0J1dHRvbnNHcm91cFwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5sZWdlbmQuc2VsZWN0U3R5bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRSYWRpb0J1dHRvbnNHcm91cFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlbGVjdG9yR3JvdXAgb2YgZ2V0UmFkaW9CdXR0b25zR3JvdXBzKClcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0b3JHcm91cFwiXG4gICAgICAgICAgICAgID57eyBzZWxlY3Rvckdyb3VwLnRpdGxlIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0Zvcj1cImxldCBidW5kbGUgb2YgY3VycmVudFJhZGlvQnV0dG9uc0dyb3VwLmNvbXB1dGVkU2VsZWN0b3JzXCJcbiAgICAgID5cbiAgICAgICAgPGgzPnt7IGJ1bmRsZS50aXRsZSB9fTwvaDM+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgZm9ybUNvbnRyb2xOYW1lPVwicmFkaW9CdXR0b25zXCIgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImJ1bmRsZS51bmZpbHRlcmVkXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZXNldEZpbHRlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cIm1hdGVyaWFsLXRvb2x0aXBcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJlbXB0eVJhZGlvQnV0dG9ucygpXCJcbiAgICAgICAgICAgID57eyAnaWdvLmdlby5maWx0ZXIucmVzZXRGaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9nY1JhZGlvQnV0dG9uIG9mIGJ1bmRsZS5zZWxlY3RvcnNcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZ2V0VG9vbFRpcChvZ2NSYWRpb0J1dHRvbilcIlxuICAgICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwibWF0ZXJpYWwtdG9vbHRpcFwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJvZ2NSYWRpb0J1dHRvbi5lbmFibGVkXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2Uob2djUmFkaW9CdXR0b24sIHNlbGVjdG9yLnNlbGVjdG9yVHlwZSlcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9nY1JhZGlvQnV0dG9uXCJcbiAgICAgICAgICAgID57eyBvZ2NSYWRpb0J1dHRvbi50aXRsZSB9fVxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICA8cFxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgaXNMZXNzUmVzdWx0cyhidW5kbGUsICdyYWRpbycpIHx8IGlzTW9yZVJlc3VsdHMoYnVuZGxlLCAncmFkaW8nKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dVxuICAgICAgICAgICAgICAqbmdJZj1cImlzTGVzc1Jlc3VsdHMoYnVuZGxlLCAncmFkaW8nKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibGVzc1Jlc3VsdHMgbWF0LXR5cG9ncmFwaHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheUxlc3NSZXN1bHRzKCdyYWRpbycpXCJcbiAgICAgICAgICAgICAgPnt7ICdpZ28uZ2VvLmZpbHRlci5kaXNwbGF5TGVzc1Jlc3VsdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3U+XG4gICAgICAgICAgICA8dVxuICAgICAgICAgICAgICAqbmdJZj1cImlzTW9yZVJlc3VsdHMoYnVuZGxlLCAncmFkaW8nKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibW9yZVJlc3VsdHMgbWF0LXR5cG9ncmFwaHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGlzcGxheU1vcmVSZXN1bHRzKCdyYWRpbycpXCJcbiAgICAgICAgICAgICAgPnt7ICdpZ28uZ2VvLmZpbHRlci5kaXNwbGF5TW9yZVJlc3VsdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3U+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdEdyb3Vwc1wiICpuZ0lmPVwic2VsZWN0b3Iuc2VsZWN0b3JUeXBlID09PSAnc2VsZWN0J1wiPlxuICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBzU2VsZWN0b3JcIiAqbmdJZj1cImdldFNlbGVjdEdyb3VwcygpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RHcm91cFwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5sZWdlbmQuc2VsZWN0U3R5bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRTZWxlY3RHcm91cFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlbGVjdG9yR3JvdXAgb2YgZ2V0U2VsZWN0R3JvdXBzKClcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0b3JHcm91cFwiXG4gICAgICAgICAgICAgID57eyBzZWxlY3Rvckdyb3VwLnRpdGxlIH19XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidW5kbGUgb2YgY3VycmVudFNlbGVjdEdyb3VwLmNvbXB1dGVkU2VsZWN0b3JzXCI+XG4gICAgICAgIDxoMz57eyBidW5kbGUudGl0bGUgfX08L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBzU2VsZWN0b3JcIj5cbiAgICAgICAgICA8bWF0LWJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJidW5kbGUudW5maWx0ZXJlZCAmJiAhYnVuZGxlLm11bHRpcGxlXCJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZXNldEZpbHRlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cIm1hdGVyaWFsLXRvb2x0aXBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImVtcHR5U2VsZWN0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfYWx0X29mZjwvbWF0LWljb24+XG4gICAgICAgICAgPC9tYXQtYnV0dG9uPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiYnVuZGxlLndpZHRoID8gYnVuZGxlLndpZHRoIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnVuZGxlLm11bHRpcGxlOyBlbHNlIG5vdE11bHRpXCI+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgI3NlbGVjdGlvblxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJidW5kbGUubXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJidW5kbGUudGl0bGVcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdE11bHRpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveGVzIG1hdC10eXBvZ3JhcGh5XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYnVuZGxlLm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQWxsU2VsZWN0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICA+VG91c1xuICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvZ2NTZWxlY3Qgb2YgYnVuZGxlLnNlbGVjdG9yc1wiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJnZXRUb29sVGlwKG9nY1NlbGVjdClcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJtYXRlcmlhbC10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgIChvblNlbGVjdGlvbkNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3B0aW9uQ2xpY2soJGV2ZW50LnNvdXJjZS52YWx1ZSwgYnVuZGxlLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9nY1NlbGVjdFwiXG4gICAgICAgICAgICAgICAgICA+e3sgb2djU2VsZWN0LnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90TXVsdGk+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtwbGFjZWhvbGRlcl09XCJidW5kbGUudGl0bGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9nY1NlbGVjdCBvZiBidW5kbGUuc2VsZWN0b3JzXCJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldFRvb2xUaXAob2djU2VsZWN0KVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcERlbGF5PVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cIm1hdGVyaWFsLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9nY1NlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAob25TZWxlY3Rpb25DaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdE9wdGlvbkNsaWNrKCRldmVudC5zb3VyY2UudmFsdWUsIGJ1bmRsZSlcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+e3sgb2djU2VsZWN0LnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZUdyb3Vwc1wiXG4gICAgICAqbmdJZj1cInNlbGVjdG9yLnNlbGVjdG9yVHlwZSA9PT0gJ2F1dG9jb21wbGV0ZSdcIlxuICAgID5cbiAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImdyb3Vwc1NlbGVjdG9yXCIgKm5nSWY9XCJnZXRBdXRvY29tcGxldGVHcm91cHMoKS5sZW5ndGggPiAxXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXV0b2NvbXBsZXRlR3JvdXBcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIubGVnZW5kLnNlbGVjdFN0eWxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJjdXJyZW50QXV0b2NvbXBsZXRlR3JvdXBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRvY29tcGxldGVHcm91cCBvZiBnZXRBdXRvY29tcGxldGVHcm91cHMoKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJhdXRvY29tcGxldGVHcm91cFwiXG4gICAgICAgICAgICAgID57eyBhdXRvY29tcGxldGVHcm91cC50aXRsZSB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdGb3I9XCJsZXQgYnVuZGxlIG9mIGN1cnJlbnRBdXRvY29tcGxldGVHcm91cC5jb21wdXRlZFNlbGVjdG9yc1wiXG4gICAgICA+XG4gICAgICAgIDxoMz57eyBidW5kbGUudGl0bGUgfX08L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBzU2VsZWN0b3JcIj5cbiAgICAgICAgICA8bWF0LWJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJidW5kbGUudW5maWx0ZXJlZFwiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5maWx0ZXIucmVzZXRGaWx0ZXJzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwQ2xhc3M9XCJtYXRlcmlhbC10b29sdGlwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJlbXB0eUF1dG9jb21wbGV0ZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2FsdF9vZmY8L21hdC1pY29uPlxuICAgICAgICAgIDwvbWF0LWJ1dHRvbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyZWRPZ2NBdXRvY29tcGxldGVbYnVuZGxlLmlkXVwiXG4gICAgICAgICAgICBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImJ1bmRsZS53aWR0aCA/IGJ1bmRsZS53aWR0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBidW5kbGUudGl0bGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1zZXRcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZE9nY0F1dG9jb21wbGV0ZVtidW5kbGUuaWRdICYmIChidW5kbGUuc2hvd0NoaXBzID8/IHRydWUpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtY2hpcFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRvY29tcGxldGVFbmFibGVkIG9mIGF1dG9jb21wbGV0ZUVuYWJsZWRzXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJ0b2dnbGVTZWxlY3Rpb24oYXV0b2NvbXBsZXRlRW5hYmxlZClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgYXV0b2NvbXBsZXRlRW5hYmxlZCB9fVxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdENoaXBSZW1vdmVcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZW1vdmVGaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgbGV0IG9nY0F1dG9jb21wbGV0ZSBvZiBmaWx0ZXJlZE9nY0F1dG9jb21wbGV0ZVtidW5kbGUuaWRdXG4gICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGlkPVwibWF0LW9wdGlvblwiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZ2V0VG9vbFRpcChvZ2NBdXRvY29tcGxldGUpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQXV0b2NvbXBsZXRlT3B0aW9uKCRldmVudCwgb2djQXV0b2NvbXBsZXRlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIGlkPVwibWF0LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tlZFN0YXR1cyhvZ2NBdXRvY29tcGxldGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUF1dG9jb21wbGV0ZU9wdGlvbigkZXZlbnQsIG9nY0F1dG9jb21wbGV0ZS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAge3sgb2djQXV0b2NvbXBsZXRlLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT5cblxuPGRpdiAqbmdJZj1cImlzVGVtcG9yYWxPcGVyYXRvcigpXCI+XG4gIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8aDMgKm5nSWY9XCIhY3VycmVudEZpbHRlci50aXRsZVwiPlxuICAgIHt7ICdpZ28uZ2VvLmZpbHRlci5yZXBvcnRpbmdEYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2gzPlxuICA8aDMgKm5nSWY9XCJjdXJyZW50RmlsdGVyLnRpdGxlXCI+e3sgY3VycmVudEZpbHRlci50aXRsZSB9fTwvaDM+XG4gIDxpZ28tb2djLWZpbHRlci10aW1lXG4gICAgW2RhdGFzb3VyY2VdPVwiZGF0YXNvdXJjZVwiXG4gICAgW2N1cnJlbnRGaWx0ZXJdPVwiY3VycmVudEZpbHRlclwiXG4gICAgKGNoYW5nZVByb3BlcnR5KT1cImNoYW5nZVByb3BlcnR5KCRldmVudC52YWx1ZSwgJGV2ZW50LnBvcylcIlxuICA+XG4gIDwvaWdvLW9nYy1maWx0ZXItdGltZT5cbjwvZGl2PlxuIl19
|