@igo2/geo 18.0.0 → 18.0.1-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/igo2-geo.mjs +684 -709
- package/fesm2022/igo2-geo.mjs.map +1 -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 +1 -8
- package/lib/style/style-list/style-list.service.d.ts +1 -1
- package/package.json +15 -17
- package/src/lib/layer/layer-list/layer-list.theme.scss +2 -1
- package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
- package/src/style/style.scss +1 -1
- package/esm2022/igo2-geo.mjs +0 -5
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +0 -234
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +0 -272
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +0 -246
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +0 -19
- package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +0 -136
- package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +0 -60
- package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +0 -232
- package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +0 -24
- package/esm2022/lib/catalog/catalog-library/index.mjs +0 -4
- package/esm2022/lib/catalog/catalog.module.mjs +0 -26
- package/esm2022/lib/catalog/index.mjs +0 -6
- package/esm2022/lib/catalog/shared/catalog.abstract.mjs +0 -32
- package/esm2022/lib/catalog/shared/catalog.enum.mjs +0 -16
- package/esm2022/lib/catalog/shared/catalog.interface.mjs +0 -2
- package/esm2022/lib/catalog/shared/catalog.service.mjs +0 -706
- package/esm2022/lib/catalog/shared/catalogs.mjs +0 -75
- package/esm2022/lib/catalog/shared/index.mjs +0 -5
- package/esm2022/lib/datasource/index.mjs +0 -3
- package/esm2022/lib/datasource/shared/capabilities.interface.mjs +0 -17
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +0 -441
- package/esm2022/lib/datasource/shared/datasource.service.mjs +0 -258
- package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +0 -222
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +0 -118
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +0 -24
- package/esm2022/lib/datasource/shared/datasources/data.service.mjs +0 -3
- package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +0 -41
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +0 -52
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +0 -70
- package/esm2022/lib/datasource/shared/datasources/index.mjs +0 -36
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +0 -33
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +0 -14
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +0 -60
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +0 -17
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +0 -56
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +0 -137
- package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +0 -170
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +0 -227
- package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +0 -224
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +0 -18
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +0 -11
- package/esm2022/lib/datasource/shared/index.mjs +0 -6
- package/esm2022/lib/datasource/shared/options/index.mjs +0 -5
- package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +0 -2
- package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +0 -15
- package/esm2022/lib/datasource/shared/options/options-api.service.mjs +0 -85
- package/esm2022/lib/datasource/shared/options/options.service.mjs +0 -3
- package/esm2022/lib/datasource/utils/index.mjs +0 -2
- package/esm2022/lib/datasource/utils/tilegrid.mjs +0 -20
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +0 -246
- package/esm2022/lib/directions/directions-buttons/index.mjs +0 -2
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +0 -312
- package/esm2022/lib/directions/directions-inputs/index.mjs +0 -2
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +0 -192
- package/esm2022/lib/directions/directions-results/index.mjs +0 -2
- package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +0 -5
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +0 -3
- package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +0 -23
- package/esm2022/lib/directions/directions-sources/index.mjs +0 -5
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +0 -159
- package/esm2022/lib/directions/directions.component.mjs +0 -437
- package/esm2022/lib/directions/directions.module.mjs +0 -46
- package/esm2022/lib/directions/directions.provider.mjs +0 -16
- package/esm2022/lib/directions/index.mjs +0 -8
- package/esm2022/lib/directions/shared/directions-source.service.mjs +0 -18
- package/esm2022/lib/directions/shared/directions.enum.mjs +0 -72
- package/esm2022/lib/directions/shared/directions.interface.mjs +0 -2
- package/esm2022/lib/directions/shared/directions.service.mjs +0 -239
- package/esm2022/lib/directions/shared/directions.utils.mjs +0 -522
- package/esm2022/lib/directions/shared/index.mjs +0 -6
- package/esm2022/lib/directions/shared/store.mjs +0 -21
- package/esm2022/lib/download/download-button/download-button.component.mjs +0 -48
- package/esm2022/lib/download/download-button/index.mjs +0 -2
- package/esm2022/lib/download/download.module.mjs +0 -24
- package/esm2022/lib/download/index.mjs +0 -3
- package/esm2022/lib/download/shared/download.interface.mjs +0 -2
- package/esm2022/lib/download/shared/download.service.mjs +0 -67
- package/esm2022/lib/download/shared/index.mjs +0 -3
- package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +0 -42
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +0 -421
- package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +0 -28
- package/esm2022/lib/draw/draw/draw.component.mjs +0 -1136
- package/esm2022/lib/draw/draw/draw.module.mjs +0 -19
- package/esm2022/lib/draw/drawingTool.module.mjs +0 -18
- package/esm2022/lib/draw/index.mjs +0 -3
- package/esm2022/lib/draw/shared/draw-icon.service.mjs +0 -30
- package/esm2022/lib/draw/shared/draw.enum.mjs +0 -21
- package/esm2022/lib/draw/shared/draw.interface.mjs +0 -2
- package/esm2022/lib/draw/shared/draw.utils.mjs +0 -125
- package/esm2022/lib/draw/shared/index.mjs +0 -5
- package/esm2022/lib/environment/environment.interface.mjs +0 -2
- package/esm2022/lib/environment/index.mjs +0 -2
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +0 -306
- package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +0 -56
- package/esm2022/lib/feature/feature-details/feature-details.module.mjs +0 -26
- package/esm2022/lib/feature/feature-details/index.mjs +0 -4
- package/esm2022/lib/feature/feature-form/feature-form.component.mjs +0 -101
- package/esm2022/lib/feature/feature-form/feature-form.module.mjs +0 -19
- package/esm2022/lib/feature/feature.module.mjs +0 -26
- package/esm2022/lib/feature/index.mjs +0 -5
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +0 -28
- package/esm2022/lib/feature/shared/feature.enums.mjs +0 -9
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +0 -2
- package/esm2022/lib/feature/shared/feature.utils.mjs +0 -332
- package/esm2022/lib/feature/shared/index.mjs +0 -8
- package/esm2022/lib/feature/shared/store.mjs +0 -143
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +0 -216
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +0 -119
- package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +0 -99
- package/esm2022/lib/feature/shared/strategies/index.mjs +0 -8
- package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +0 -103
- package/esm2022/lib/feature/shared/strategies/loading.mjs +0 -136
- package/esm2022/lib/feature/shared/strategies/search.mjs +0 -158
- package/esm2022/lib/feature/shared/strategies/selection.mjs +0 -385
- package/esm2022/lib/feature/shared/strategies.utils.mjs +0 -37
- package/esm2022/lib/filter/filter.module.mjs +0 -131
- package/esm2022/lib/filter/index.mjs +0 -17
- package/esm2022/lib/filter/ogc-filter-button/index.mjs +0 -2
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +0 -141
- package/esm2022/lib/filter/ogc-filter-form/index.mjs +0 -2
- package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +0 -325
- package/esm2022/lib/filter/ogc-filter-selection/index.mjs +0 -2
- package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +0 -787
- package/esm2022/lib/filter/ogc-filter-time/index.mjs +0 -3
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +0 -201
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +0 -665
- package/esm2022/lib/filter/ogc-filterable-form/index.mjs +0 -2
- package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +0 -66
- package/esm2022/lib/filter/ogc-filterable-item/index.mjs +0 -2
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +0 -244
- package/esm2022/lib/filter/ogc-filterable-list/index.mjs +0 -3
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +0 -39
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +0 -32
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +0 -63
- package/esm2022/lib/filter/shared/index.mjs +0 -12
- package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +0 -72
- package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +0 -30
- package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +0 -2
- package/esm2022/lib/filter/shared/ogc-filter.mjs +0 -756
- package/esm2022/lib/filter/shared/ogc-filter.service.mjs +0 -47
- package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +0 -23
- package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +0 -2
- package/esm2022/lib/filter/shared/spatial-filter.service.mjs +0 -282
- package/esm2022/lib/filter/shared/time-filter.enum.mjs +0 -13
- package/esm2022/lib/filter/shared/time-filter.interface.mjs +0 -2
- package/esm2022/lib/filter/shared/time-filter.service.mjs +0 -107
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +0 -2
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +0 -875
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +0 -2
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +0 -191
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +0 -2
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +0 -120
- package/esm2022/lib/filter/time-filter-button/index.mjs +0 -2
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +0 -70
- package/esm2022/lib/filter/time-filter-form/index.mjs +0 -2
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +0 -537
- package/esm2022/lib/filter/time-filter-item/index.mjs +0 -2
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +0 -90
- package/esm2022/lib/filter/time-filter-list/index.mjs +0 -3
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +0 -39
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +0 -24
- package/esm2022/lib/geo.module.mjs +0 -63
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +0 -559
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +0 -170
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +0 -24
- package/esm2022/lib/geometry/geometry-form-field/index.mjs +0 -4
- package/esm2022/lib/geometry/geometry.module.mjs +0 -18
- package/esm2022/lib/geometry/index.mjs +0 -3
- package/esm2022/lib/geometry/shared/controls/draw.mjs +0 -340
- package/esm2022/lib/geometry/shared/controls/index.mjs +0 -4
- package/esm2022/lib/geometry/shared/controls/modify.mjs +0 -538
- package/esm2022/lib/geometry/shared/controls/slice.mjs +0 -190
- package/esm2022/lib/geometry/shared/geometry.errors.mjs +0 -24
- package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +0 -2
- package/esm2022/lib/geometry/shared/geometry.utils.mjs +0 -113
- package/esm2022/lib/geometry/shared/index.mjs +0 -5
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +0 -49
- package/esm2022/lib/import-export/export-button/index.mjs +0 -2
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +0 -876
- package/esm2022/lib/import-export/import-export/index.mjs +0 -2
- package/esm2022/lib/import-export/import-export.module.mjs +0 -31
- package/esm2022/lib/import-export/index.mjs +0 -5
- package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +0 -114
- package/esm2022/lib/import-export/shared/export.errors.mjs +0 -15
- package/esm2022/lib/import-export/shared/export.interface.mjs +0 -2
- package/esm2022/lib/import-export/shared/export.service.mjs +0 -378
- package/esm2022/lib/import-export/shared/export.type.mjs +0 -13
- package/esm2022/lib/import-export/shared/export.utils.mjs +0 -51
- package/esm2022/lib/import-export/shared/import.errors.mjs +0 -39
- package/esm2022/lib/import-export/shared/import.interface.mjs +0 -2
- package/esm2022/lib/import-export/shared/import.service.mjs +0 -221
- package/esm2022/lib/import-export/shared/import.utils.mjs +0 -203
- package/esm2022/lib/import-export/shared/index.mjs +0 -11
- package/esm2022/lib/layer/index.mjs +0 -16
- package/esm2022/lib/layer/layer-group/index.mjs +0 -2
- package/esm2022/lib/layer/layer-group/layer-group.component.mjs +0 -103
- package/esm2022/lib/layer/layer-item/index.mjs +0 -2
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +0 -196
- package/esm2022/lib/layer/layer-legend/index.mjs +0 -2
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +0 -287
- package/esm2022/lib/layer/layer-legend-item/index.mjs +0 -2
- package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +0 -85
- package/esm2022/lib/layer/layer-legend-list/index.mjs +0 -3
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +0 -54
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +0 -104
- package/esm2022/lib/layer/layer-list/index.mjs +0 -2
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +0 -232
- package/esm2022/lib/layer/layer-list-tool/index.mjs +0 -4
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +0 -92
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +0 -7
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +0 -61
- package/esm2022/lib/layer/layer-search/index.mjs +0 -2
- package/esm2022/lib/layer/layer-search/layer-search.component.mjs +0 -65
- package/esm2022/lib/layer/layer-unavailable/index.mjs +0 -3
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +0 -25
- package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +0 -35
- package/esm2022/lib/layer/layer-viewer/index.mjs +0 -3
- package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +0 -226
- package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +0 -2
- package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +0 -2
- package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +0 -207
- package/esm2022/lib/layer/layer-visibility-button/index.mjs +0 -2
- package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +0 -83
- package/esm2022/lib/layer/layer.module.mjs +0 -107
- package/esm2022/lib/layer/shared/clusterParam.mjs +0 -2
- package/esm2022/lib/layer/shared/index.mjs +0 -6
- package/esm2022/lib/layer/shared/layer-controller.mjs +0 -316
- package/esm2022/lib/layer/shared/layer-selection.mjs +0 -38
- package/esm2022/lib/layer/shared/layer.enums.mjs +0 -2
- package/esm2022/lib/layer/shared/layer.service.mjs +0 -315
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +0 -75
- package/esm2022/lib/layer/shared/layers/index.mjs +0 -18
- package/esm2022/lib/layer/shared/layers/layer-base.mjs +0 -199
- package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/layer-group.mjs +0 -120
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +0 -7
- package/esm2022/lib/layer/shared/layers/layer.mjs +0 -178
- package/esm2022/lib/layer/shared/layers/legend.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/linked/index.mjs +0 -4
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +0 -12
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +0 -242
- package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +0 -70
- package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +0 -55
- package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +0 -576
- package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +0 -2
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +0 -112
- package/esm2022/lib/layer/track-feature-button/index.mjs +0 -2
- package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +0 -54
- package/esm2022/lib/layer/utils/image-watcher.mjs +0 -62
- package/esm2022/lib/layer/utils/index.mjs +0 -6
- package/esm2022/lib/layer/utils/layer.utils.mjs +0 -57
- package/esm2022/lib/layer/utils/outputLegend.mjs +0 -32
- package/esm2022/lib/layer/utils/tile-watcher.mjs +0 -52
- package/esm2022/lib/layer/utils/vector-watcher.mjs +0 -50
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +0 -20
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +0 -87
- package/esm2022/lib/map/baselayers-switcher/index.mjs +0 -3
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +0 -122
- package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +0 -78
- package/esm2022/lib/map/geolocate-button/index.mjs +0 -2
- package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +0 -73
- package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +0 -2
- package/esm2022/lib/map/home-extent-button/index.mjs +0 -3
- package/esm2022/lib/map/index.mjs +0 -14
- package/esm2022/lib/map/info-section/index.mjs +0 -2
- package/esm2022/lib/map/info-section/info-section.component.mjs +0 -15
- package/esm2022/lib/map/map-browser/index.mjs +0 -2
- package/esm2022/lib/map/map-browser/map-browser.component.mjs +0 -67
- package/esm2022/lib/map/map-center/index.mjs +0 -2
- package/esm2022/lib/map/map-center/map-center.component.mjs +0 -56
- package/esm2022/lib/map/map.module.mjs +0 -89
- package/esm2022/lib/map/menu-button/index.mjs +0 -2
- package/esm2022/lib/map/menu-button/menu-button.component.mjs +0 -57
- package/esm2022/lib/map/offline-button/index.mjs +0 -2
- package/esm2022/lib/map/offline-button/offline-button.component.mjs +0 -53
- package/esm2022/lib/map/rotation-button/index.mjs +0 -2
- package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +0 -58
- package/esm2022/lib/map/shared/controllers/controller.mjs +0 -44
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +0 -8
- package/esm2022/lib/map/shared/controllers/geolocation.mjs +0 -431
- package/esm2022/lib/map/shared/controllers/index.mjs +0 -5
- package/esm2022/lib/map/shared/controllers/view.mjs +0 -361
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +0 -481
- package/esm2022/lib/map/shared/index.mjs +0 -15
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +0 -238
- package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +0 -122
- package/esm2022/lib/map/shared/map.abstract.mjs +0 -24
- package/esm2022/lib/map/shared/map.enums.mjs +0 -6
- package/esm2022/lib/map/shared/map.interface.mjs +0 -2
- package/esm2022/lib/map/shared/map.mjs +0 -201
- package/esm2022/lib/map/shared/map.service.mjs +0 -29
- package/esm2022/lib/map/shared/map.utils.mjs +0 -455
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +0 -114
- package/esm2022/lib/map/shared/projection.interfaces.mjs +0 -2
- package/esm2022/lib/map/shared/projection.service.mjs +0 -67
- package/esm2022/lib/map/shared/projection.utils.mjs +0 -122
- package/esm2022/lib/map/swipe-control/index.mjs +0 -2
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +0 -211
- package/esm2022/lib/map/utils/index.mjs +0 -2
- package/esm2022/lib/map/utils/layer-watcher.mjs +0 -112
- package/esm2022/lib/map/wake-lock-button/index.mjs +0 -2
- package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +0 -103
- package/esm2022/lib/map/zoom-button/index.mjs +0 -2
- package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +0 -35
- package/esm2022/lib/measure/index.mjs +0 -3
- package/esm2022/lib/measure/measure.module.mjs +0 -20
- package/esm2022/lib/measure/measurer/index.mjs +0 -6
- package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +0 -40
- package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +0 -38
- package/esm2022/lib/measure/measurer/measurer-item.component.mjs +0 -143
- package/esm2022/lib/measure/measurer/measurer.component.mjs +0 -948
- package/esm2022/lib/measure/measurer/measurer.module.mjs +0 -20
- package/esm2022/lib/measure/shared/index.mjs +0 -4
- package/esm2022/lib/measure/shared/measure.enum.mjs +0 -37
- package/esm2022/lib/measure/shared/measure.interfaces.mjs +0 -2
- package/esm2022/lib/measure/shared/measure.utils.mjs +0 -497
- package/esm2022/lib/metadata/index.mjs +0 -4
- package/esm2022/lib/metadata/metadata-button/index.mjs +0 -2
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +0 -96
- package/esm2022/lib/metadata/metadata.module.mjs +0 -29
- package/esm2022/lib/metadata/shared/index.mjs +0 -3
- package/esm2022/lib/metadata/shared/metadata.interface.mjs +0 -2
- package/esm2022/lib/metadata/shared/metadata.service.mjs +0 -18
- package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +0 -130
- package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +0 -6
- package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +0 -2
- package/esm2022/lib/offline/geoDB/geoDB.service.mjs +0 -172
- package/esm2022/lib/offline/geoDB/index.mjs +0 -5
- package/esm2022/lib/offline/index.mjs +0 -6
- package/esm2022/lib/offline/layerDB/index.mjs +0 -3
- package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +0 -2
- package/esm2022/lib/offline/layerDB/layerDB.service.mjs +0 -83
- package/esm2022/lib/offline/offline.interface.mjs +0 -2
- package/esm2022/lib/offline/offline.provider.mjs +0 -50
- package/esm2022/lib/offline/shared/geo-network.service.mjs +0 -79
- package/esm2022/lib/offline/shared/index.mjs +0 -2
- package/esm2022/lib/overlay/index.mjs +0 -2
- package/esm2022/lib/overlay/shared/index.mjs +0 -4
- package/esm2022/lib/overlay/shared/overlay.enum.mjs +0 -8
- package/esm2022/lib/overlay/shared/overlay.mjs +0 -139
- package/esm2022/lib/overlay/shared/overlay.utils.mjs +0 -17
- package/esm2022/lib/print/index.mjs +0 -4
- package/esm2022/lib/print/print/print.component.mjs +0 -116
- package/esm2022/lib/print/print-form/index.mjs +0 -2
- package/esm2022/lib/print/print-form/print-form.component.mjs +0 -320
- package/esm2022/lib/print/print.module.mjs +0 -20
- package/esm2022/lib/print/shared/geopdf.mjs +0 -68
- package/esm2022/lib/print/shared/index.mjs +0 -5
- package/esm2022/lib/print/shared/print.interface.mjs +0 -2
- package/esm2022/lib/print/shared/print.service.mjs +0 -1136
- package/esm2022/lib/print/shared/print.type.mjs +0 -30
- package/esm2022/lib/query/index.mjs +0 -2
- package/esm2022/lib/query/query.module.mjs +0 -27
- package/esm2022/lib/query/shared/index.mjs +0 -8
- package/esm2022/lib/query/shared/query-search-source.mjs +0 -35
- package/esm2022/lib/query/shared/query-search-source.providers.mjs +0 -22
- package/esm2022/lib/query/shared/query.directive.mjs +0 -290
- package/esm2022/lib/query/shared/query.enums.mjs +0 -32
- package/esm2022/lib/query/shared/query.interfaces.mjs +0 -2
- package/esm2022/lib/query/shared/query.service.mjs +0 -753
- package/esm2022/lib/query/shared/query.utils.mjs +0 -45
- package/esm2022/lib/search/index.mjs +0 -10
- package/esm2022/lib/search/search-bar/search-bar.component.mjs +0 -483
- package/esm2022/lib/search/search-bar/search-bar.module.mjs +0 -19
- package/esm2022/lib/search/search-results/index.mjs +0 -5
- package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +0 -101
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +0 -433
- package/esm2022/lib/search/search-results/search-results-item.component.mjs +0 -119
- package/esm2022/lib/search/search-results/search-results.component.mjs +0 -297
- package/esm2022/lib/search/search-results/search-results.directive.mjs +0 -7
- package/esm2022/lib/search/search-results/search-results.module.mjs +0 -20
- package/esm2022/lib/search/search-selector/search-selector.component.mjs +0 -118
- package/esm2022/lib/search/search-selector/search-selector.module.mjs +0 -19
- package/esm2022/lib/search/search-settings/search-settings.component.mjs +0 -264
- package/esm2022/lib/search/search-settings/search-settings.module.mjs +0 -19
- package/esm2022/lib/search/search.module.mjs +0 -77
- package/esm2022/lib/search/shared/index.mjs +0 -10
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +0 -328
- package/esm2022/lib/search/shared/search-source-service.providers.mjs +0 -20
- package/esm2022/lib/search/shared/search-source.service.mjs +0 -56
- package/esm2022/lib/search/shared/search.enums.mjs +0 -4
- package/esm2022/lib/search/shared/search.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/search.provider.mjs +0 -20
- package/esm2022/lib/search/shared/search.service.mjs +0 -149
- package/esm2022/lib/search/shared/search.utils.mjs +0 -92
- package/esm2022/lib/search/shared/sources/cadastre.mjs +0 -142
- package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +0 -32
- package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/coordinates.mjs +0 -168
- package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +0 -52
- package/esm2022/lib/search/shared/sources/icherche-icons.mjs +0 -32
- package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/icherche.mjs +0 -816
- package/esm2022/lib/search/shared/sources/icherche.providers.mjs +0 -87
- package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/ilayer.mjs +0 -339
- package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +0 -58
- package/esm2022/lib/search/shared/sources/index.mjs +0 -23
- package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/nominatim.mjs +0 -263
- package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +0 -31
- package/esm2022/lib/search/shared/sources/source.interfaces.mjs +0 -13
- package/esm2022/lib/search/shared/sources/source.mjs +0 -221
- package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/storedqueries.mjs +0 -454
- package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +0 -56
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +0 -2
- package/esm2022/lib/search/shared/sources/workspace.mjs +0 -192
- package/esm2022/lib/search/shared/sources/workspace.providers.mjs +0 -31
- package/esm2022/lib/style/index.mjs +0 -5
- package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +0 -360
- package/esm2022/lib/style/shared/datasource/index.mjs +0 -2
- package/esm2022/lib/style/shared/feature/feature-style.mjs +0 -162
- package/esm2022/lib/style/shared/feature/index.mjs +0 -2
- package/esm2022/lib/style/shared/font.enum.mjs +0 -17
- package/esm2022/lib/style/shared/index.mjs +0 -5
- package/esm2022/lib/style/shared/overlay/index.mjs +0 -3
- package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +0 -39
- package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +0 -88
- package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +0 -78
- package/esm2022/lib/style/shared/vector/conversion.utils.mjs +0 -27
- package/esm2022/lib/style/shared/vector/index.mjs +0 -4
- package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +0 -2
- package/esm2022/lib/style/style-list/index.mjs +0 -5
- package/esm2022/lib/style/style-list/style-list.interface.mjs +0 -2
- package/esm2022/lib/style/style-list/style-list.module.mjs +0 -23
- package/esm2022/lib/style/style-list/style-list.provider.mjs +0 -21
- package/esm2022/lib/style/style-list/style-list.service.mjs +0 -52
- package/esm2022/lib/style/style-modal/drawing/index.mjs +0 -2
- package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +0 -193
- package/esm2022/lib/style/style-modal/index.mjs +0 -5
- package/esm2022/lib/style/style-modal/layer/index.mjs +0 -2
- package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +0 -142
- package/esm2022/lib/style/style-modal/layer-button/index.mjs +0 -2
- package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +0 -44
- package/esm2022/lib/style/style-modal/shared/index.mjs +0 -2
- package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +0 -2
- package/esm2022/lib/style/style-service/draw-style.service.mjs +0 -255
- package/esm2022/lib/style/style-service/index.mjs +0 -3
- package/esm2022/lib/style/style-service/style.service.mjs +0 -393
- package/esm2022/lib/style/style.module.mjs +0 -46
- package/esm2022/lib/toast/index.mjs +0 -2
- package/esm2022/lib/toast/toast.component.mjs +0 -99
- package/esm2022/lib/toast/toast.module.mjs +0 -24
- package/esm2022/lib/utils/googleLinks.mjs +0 -13
- package/esm2022/lib/utils/id-generator.mjs +0 -112
- package/esm2022/lib/utils/index.mjs +0 -5
- package/esm2022/lib/utils/osmLinks.mjs +0 -9
- package/esm2022/lib/utils/propertyTypeDetector/index.mjs +0 -3
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +0 -2
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +0 -64
- package/esm2022/lib/wkt/index.mjs +0 -2
- package/esm2022/lib/wkt/shared/index.mjs +0 -2
- package/esm2022/lib/wkt/shared/wkt.service.mjs +0 -235
- package/esm2022/lib/wkt/wkt.module.mjs +0 -25
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +0 -36
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +0 -19
- package/esm2022/lib/workspace/confirmation-popup/index.mjs +0 -3
- package/esm2022/lib/workspace/index.mjs +0 -8
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +0 -301
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +0 -720
- package/esm2022/lib/workspace/shared/feature-workspace.mjs +0 -41
- package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +0 -113
- package/esm2022/lib/workspace/shared/index.mjs +0 -8
- package/esm2022/lib/workspace/shared/wfs-workspace.mjs +0 -41
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +0 -121
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +0 -248
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +0 -188
- package/esm2022/lib/workspace/widgets/index.mjs +0 -4
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +0 -48
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +0 -19
- package/esm2022/lib/workspace/widgets/widgets.mjs +0 -15
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +0 -172
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +0 -137
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +0 -19
- package/esm2022/lib/workspace/workspace.module.mjs +0 -32
- package/esm2022/public_api.mjs +0 -56
|
@@ -1,665 +0,0 @@
|
|
|
1
|
-
import { NgFor, NgIf } from '@angular/common';
|
|
2
|
-
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
3
|
-
import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
|
4
|
-
import { provideMomentDateAdapter } from '@angular/material-moment-adapter';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatOptionModule } from '@angular/material/core';
|
|
7
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
8
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
9
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
10
|
-
import { MatInputModule } from '@angular/material/input';
|
|
11
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
12
|
-
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
13
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
14
|
-
import { IgoLanguageModule } from '@igo2/core/language';
|
|
15
|
-
import { default as moment } from 'moment';
|
|
16
|
-
import { OgcFilterOperator } from '../../filter/shared/ogc-filter.enum';
|
|
17
|
-
import { OGCFilterTimeService } from '../shared/ogc-filter-time.service';
|
|
18
|
-
import { OgcFilterTimeSliderComponent } from './ogc-filter-time-slider.component';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "../shared/ogc-filter-time.service";
|
|
21
|
-
import * as i2 from "@angular/material/slide-toggle";
|
|
22
|
-
import * as i3 from "@angular/forms";
|
|
23
|
-
import * as i4 from "@angular/material/form-field";
|
|
24
|
-
import * as i5 from "@angular/material/input";
|
|
25
|
-
import * as i6 from "@angular/material/datepicker";
|
|
26
|
-
import * as i7 from "@angular/material/button";
|
|
27
|
-
import * as i8 from "@angular/material/tooltip";
|
|
28
|
-
import * as i9 from "@angular/material/icon";
|
|
29
|
-
import * as i10 from "@angular/material/select";
|
|
30
|
-
import * as i11 from "@angular/material/core";
|
|
31
|
-
import * as i12 from "@ngx-translate/core";
|
|
32
|
-
export class OgcFilterTimeComponent {
|
|
33
|
-
ogcFilterTimeService;
|
|
34
|
-
datasource;
|
|
35
|
-
currentFilter;
|
|
36
|
-
changeProperty = new EventEmitter();
|
|
37
|
-
beginHours;
|
|
38
|
-
endHours;
|
|
39
|
-
beginMinutes;
|
|
40
|
-
endMinutes;
|
|
41
|
-
beginHourFormControl = new UntypedFormControl();
|
|
42
|
-
beginMinuteFormControl = new UntypedFormControl();
|
|
43
|
-
endHourFormControl = new UntypedFormControl();
|
|
44
|
-
endMinuteFormControl = new UntypedFormControl();
|
|
45
|
-
_beginValue;
|
|
46
|
-
_endValue;
|
|
47
|
-
_defaultMin = '1900-01-01';
|
|
48
|
-
_defaultMax = '2052-01-06';
|
|
49
|
-
_defaultDisplayFormat = 'DD/MM/YYYY HH:mm A';
|
|
50
|
-
_defaultSliderModeEnabled = true;
|
|
51
|
-
ogcFilterOperator = OgcFilterOperator;
|
|
52
|
-
sliderMode = false;
|
|
53
|
-
defaultStepMillisecond = 60000;
|
|
54
|
-
options;
|
|
55
|
-
onlyYearBegin;
|
|
56
|
-
onlyYearEnd;
|
|
57
|
-
calendarTypeYear = false;
|
|
58
|
-
resetIcon = 'replay';
|
|
59
|
-
filterStateDisable;
|
|
60
|
-
endDatepickerTime;
|
|
61
|
-
beginDatepickerTime;
|
|
62
|
-
beginTime;
|
|
63
|
-
endTime;
|
|
64
|
-
filterOriginConfig;
|
|
65
|
-
get step() {
|
|
66
|
-
return this.datasource.options.stepDate
|
|
67
|
-
? this.datasource.options.stepDate
|
|
68
|
-
: this.currentFilter.step;
|
|
69
|
-
}
|
|
70
|
-
get stepMilliseconds() {
|
|
71
|
-
const step = moment.duration(this.step).asMilliseconds();
|
|
72
|
-
return step === 0 ? this.defaultStepMillisecond : step;
|
|
73
|
-
}
|
|
74
|
-
set beginValue(begin) {
|
|
75
|
-
this._beginValue = begin;
|
|
76
|
-
}
|
|
77
|
-
get beginValue() {
|
|
78
|
-
return this._beginValue;
|
|
79
|
-
}
|
|
80
|
-
set endValue(end) {
|
|
81
|
-
this._endValue = end;
|
|
82
|
-
}
|
|
83
|
-
get endValue() {
|
|
84
|
-
return this._endValue;
|
|
85
|
-
}
|
|
86
|
-
get sliderInterval() {
|
|
87
|
-
return this.currentFilter.sliderInterval === undefined
|
|
88
|
-
? 2000
|
|
89
|
-
: this.currentFilter.sliderInterval;
|
|
90
|
-
}
|
|
91
|
-
get maxDate() {
|
|
92
|
-
return this.datasource.options.maxDate
|
|
93
|
-
? this.datasource.options.maxDate
|
|
94
|
-
: this._defaultMax;
|
|
95
|
-
}
|
|
96
|
-
get displayFormat() {
|
|
97
|
-
return this.currentFilter.displayFormat
|
|
98
|
-
? this.currentFilter.displayFormat
|
|
99
|
-
: this._defaultDisplayFormat;
|
|
100
|
-
}
|
|
101
|
-
filterBeginFunction;
|
|
102
|
-
filterEndFunction;
|
|
103
|
-
constructor(ogcFilterTimeService) {
|
|
104
|
-
this.ogcFilterTimeService = ogcFilterTimeService;
|
|
105
|
-
}
|
|
106
|
-
ngOnInit() {
|
|
107
|
-
this.filterOriginConfig = this.datasource.options.ogcFilters
|
|
108
|
-
.filters;
|
|
109
|
-
if (this.currentFilter.sliderOptions) {
|
|
110
|
-
this.currentFilter.sliderOptions.enabled =
|
|
111
|
-
this.currentFilter.sliderOptions.enabled !== undefined
|
|
112
|
-
? this.currentFilter.sliderOptions.enabled
|
|
113
|
-
: this._defaultSliderModeEnabled;
|
|
114
|
-
}
|
|
115
|
-
this.beginValue = this.parseFilter(this.handleMin());
|
|
116
|
-
this.endValue = this.parseFilter(this.handleMax());
|
|
117
|
-
this.onlyYearBegin = this.beginValue.getUTCFullYear();
|
|
118
|
-
this.onlyYearEnd = this.endValue.getUTCFullYear();
|
|
119
|
-
this.calendarTypeYear = this.isCalendarYearMode();
|
|
120
|
-
this.setFilterStateDisable();
|
|
121
|
-
this.updateHoursMinutesArray();
|
|
122
|
-
// update value for now value
|
|
123
|
-
this.updateValues();
|
|
124
|
-
this.dateFilter(this.filterBeginFunction, 'begin');
|
|
125
|
-
this.dateFilter(this.filterEndFunction, 'end');
|
|
126
|
-
}
|
|
127
|
-
parseFilter(filter) {
|
|
128
|
-
if (!filter) {
|
|
129
|
-
return new Date();
|
|
130
|
-
}
|
|
131
|
-
else if (isNaN(new Date(filter).getTime())) {
|
|
132
|
-
if (filter.search('now') >= 0) {
|
|
133
|
-
const interval = filter.match(/years|months|weeks|days|hours|seconds/);
|
|
134
|
-
if (filter.match(/\+/)) {
|
|
135
|
-
const intervalInt = parseInt(filter.substring(filter.indexOf('+') + 1, interval.index), 10);
|
|
136
|
-
return moment().add(intervalInt, interval[0]).toDate();
|
|
137
|
-
}
|
|
138
|
-
if (filter.match(/\-/)) {
|
|
139
|
-
const intervalInt = parseInt(filter.substring(filter.indexOf('-') + 1, interval.index), 10);
|
|
140
|
-
return moment().subtract(intervalInt, interval[0]).toDate();
|
|
141
|
-
}
|
|
142
|
-
return new Date();
|
|
143
|
-
}
|
|
144
|
-
if (filter.search('today') >= 0) {
|
|
145
|
-
const _now = moment().endOf('day').toDate();
|
|
146
|
-
const interval = filter.match(/years|months|weeks|days|hours|seconds/);
|
|
147
|
-
if (filter.match(/\+/)) {
|
|
148
|
-
const intervalInt = parseInt(filter.substring(filter.indexOf('+') + 1, interval.index), 10);
|
|
149
|
-
return moment(_now).add(intervalInt, interval[0]).toDate();
|
|
150
|
-
}
|
|
151
|
-
if (filter.match(/\-/)) {
|
|
152
|
-
const intervalInt = parseInt(filter.substring(filter.indexOf('-') + 1, interval.index), 10);
|
|
153
|
-
return moment(_now).subtract(intervalInt, interval[0]).toDate();
|
|
154
|
-
}
|
|
155
|
-
return _now;
|
|
156
|
-
}
|
|
157
|
-
return new Date();
|
|
158
|
-
}
|
|
159
|
-
if (this.currentFilter.calendarModeYear) {
|
|
160
|
-
const date = this.getDateFromStringWithoutTime(filter);
|
|
161
|
-
return date;
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
return filter ? new Date(filter) : new Date();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
changeTemporalProperty(value, position, refreshFilter = true) {
|
|
168
|
-
if (typeof value === 'string') {
|
|
169
|
-
value = new Date(value);
|
|
170
|
-
}
|
|
171
|
-
let valueTmp = this.getDateTime(value, position);
|
|
172
|
-
if (this.isCalendarYearMode()) {
|
|
173
|
-
let dateStringFromYearNotime;
|
|
174
|
-
if (position === 1) {
|
|
175
|
-
this.beginValue = value;
|
|
176
|
-
this.onlyYearBegin = this.beginValue.getFullYear();
|
|
177
|
-
dateStringFromYearNotime = `${this.onlyYearBegin}-01-01`;
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
this.endValue = value;
|
|
181
|
-
this.onlyYearEnd = this.endValue.getFullYear();
|
|
182
|
-
dateStringFromYearNotime = `${this.onlyYearEnd}-12-31`;
|
|
183
|
-
}
|
|
184
|
-
// call service with string date without time
|
|
185
|
-
this.changeProperty.next({
|
|
186
|
-
value: dateStringFromYearNotime,
|
|
187
|
-
pos: position,
|
|
188
|
-
refreshFilter
|
|
189
|
-
});
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
if (position === 2 && this.calendarType() === 'date' && !this.sliderMode) {
|
|
193
|
-
/* Above month: see yearSelected or monthSelected */
|
|
194
|
-
valueTmp = moment(valueTmp).endOf('day').toDate();
|
|
195
|
-
}
|
|
196
|
-
if (position === 1) {
|
|
197
|
-
this.beginValue = valueTmp;
|
|
198
|
-
if (this.restrictedToStep()) {
|
|
199
|
-
this.changeTemporalProperty(this.ogcFilterTimeService.addStep(valueTmp, this.stepMilliseconds), 2, refreshFilter);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
this.endValue = valueTmp;
|
|
204
|
-
}
|
|
205
|
-
this.updateHoursMinutesArray();
|
|
206
|
-
this.changeProperty.next({
|
|
207
|
-
value: valueTmp.toISOString(),
|
|
208
|
-
pos: position,
|
|
209
|
-
refreshFilter
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
handleDate(value) {
|
|
213
|
-
if (!value || value === '') {
|
|
214
|
-
return undefined;
|
|
215
|
-
}
|
|
216
|
-
if (typeof value === 'string' && this.currentFilter.calendarModeYear) {
|
|
217
|
-
return this.getDateFromStringWithoutTime(value);
|
|
218
|
-
}
|
|
219
|
-
return new Date(value);
|
|
220
|
-
}
|
|
221
|
-
calendarType() {
|
|
222
|
-
if (this.currentFilter.calendarModeYear) {
|
|
223
|
-
return 'year';
|
|
224
|
-
}
|
|
225
|
-
if (this.stepMilliseconds < 86400000) {
|
|
226
|
-
return 'datetime';
|
|
227
|
-
}
|
|
228
|
-
return 'date';
|
|
229
|
-
}
|
|
230
|
-
isCalendarYearMode() {
|
|
231
|
-
if (this.calendarType() === 'year') {
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
yearOnlyInputChange(changeEvent, datePicker, property) {
|
|
239
|
-
const year = changeEvent.target.value;
|
|
240
|
-
const date = this.getDateFromStringWithoutTime(year);
|
|
241
|
-
this.yearSelected(date, datePicker, property);
|
|
242
|
-
}
|
|
243
|
-
yearSelected(year, datePicker, property, refreshFilter = true) {
|
|
244
|
-
if (this.ogcFilterTimeService.stepIsYearDuration(this.step)) {
|
|
245
|
-
if (datePicker) {
|
|
246
|
-
datePicker.close();
|
|
247
|
-
}
|
|
248
|
-
if (property === 'end') {
|
|
249
|
-
// change value 01 jan to 31 dec same year
|
|
250
|
-
year = moment(year).endOf('year').toDate();
|
|
251
|
-
}
|
|
252
|
-
else if (property === 'begin' &&
|
|
253
|
-
this.restrictedToStep() &&
|
|
254
|
-
!this.calendarTypeYear) {
|
|
255
|
-
this.yearSelected(year, undefined, 'end');
|
|
256
|
-
}
|
|
257
|
-
this.changeTemporalProperty(year, property === 'begin' ? 1 : 2, refreshFilter);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
monthSelected(month, datePicker, property, refreshFilter = true) {
|
|
261
|
-
if (this.ogcFilterTimeService.stepIsMonthDuration(this.step)) {
|
|
262
|
-
if (datePicker) {
|
|
263
|
-
datePicker.close();
|
|
264
|
-
}
|
|
265
|
-
if (property === 'end') {
|
|
266
|
-
month = moment(month).endOf('month').toDate();
|
|
267
|
-
}
|
|
268
|
-
else if (property === 'begin' && this.restrictedToStep()) {
|
|
269
|
-
this.monthSelected(month, undefined, 'end');
|
|
270
|
-
}
|
|
271
|
-
this.changeTemporalProperty(month, property === 'begin' ? 1 : 2, refreshFilter);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
calendarView() {
|
|
275
|
-
const test = this.stepMilliseconds;
|
|
276
|
-
const diff = Math.abs(this.parseFilter(this.currentFilter.end).getTime() -
|
|
277
|
-
this.parseFilter(this.currentFilter.begin).getTime());
|
|
278
|
-
if (this.ogcFilterTimeService.stepIsYearDuration(this.step)) {
|
|
279
|
-
return 'multi-year';
|
|
280
|
-
}
|
|
281
|
-
else if (this.ogcFilterTimeService.stepIsMonthDuration(this.step)) {
|
|
282
|
-
return 'year';
|
|
283
|
-
}
|
|
284
|
-
else if (test < 86400000 && diff < 86400000) {
|
|
285
|
-
return 'clock';
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
return 'month';
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
dateFilter(type, date) {
|
|
292
|
-
const dateValue = new Date(date);
|
|
293
|
-
const diff = dateValue.getTime() - new Date(this.handleMin()).getTime();
|
|
294
|
-
if (this.ogcFilterTimeService.stepIsYearDuration(this.step)) {
|
|
295
|
-
const monthDiff = moment(dateValue).diff(moment(this.handleMin()), 'years', true);
|
|
296
|
-
if (type === 'end') {
|
|
297
|
-
const dateValuePlus1 = moment(dateValue).add(1, 'd');
|
|
298
|
-
const monthDiffPlus1 = moment(dateValuePlus1).diff(moment(this.handleMin()), 'years', true);
|
|
299
|
-
this.filterEndFunction =
|
|
300
|
-
monthDiffPlus1 % moment.duration(this.step).asYears() === 0;
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
else if (type === 'begin') {
|
|
304
|
-
this.filterBeginFunction =
|
|
305
|
-
monthDiff % moment.duration(this.step).asYears() === 0;
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
else if (this.ogcFilterTimeService.stepIsMonthDuration(this.step)) {
|
|
310
|
-
const monthDiff = moment(dateValue).diff(moment(this.handleMin()), 'months', true);
|
|
311
|
-
if (type === 'end') {
|
|
312
|
-
const dateValuePlus1 = moment(dateValue).add(1, 'd');
|
|
313
|
-
const monthDiffPlus1 = moment(dateValuePlus1).diff(moment(this.handleMin()), 'months', true);
|
|
314
|
-
this.filterEndFunction =
|
|
315
|
-
monthDiffPlus1 % moment.duration(this.step).asMonths() === 0;
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
else if (type === 'begin') {
|
|
319
|
-
this.filterBeginFunction =
|
|
320
|
-
monthDiff % moment.duration(this.step).asMonths() === 0;
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
else if (this.ogcFilterTimeService.stepIsWeekDuration(this.step)) {
|
|
325
|
-
const weekDiff = moment(dateValue).diff(moment(this.handleMin()), 'weeks', true);
|
|
326
|
-
if (type === 'end') {
|
|
327
|
-
const dateValuePlus1 = moment(dateValue).add(1, 'd');
|
|
328
|
-
const weekDiffPlus1 = moment(dateValuePlus1).diff(moment(this.handleMin()), 'weeks', true);
|
|
329
|
-
this.filterEndFunction =
|
|
330
|
-
weekDiffPlus1 % moment.duration(this.step).asWeeks() === 0;
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
else if (type === 'begin') {
|
|
334
|
-
this.filterBeginFunction =
|
|
335
|
-
weekDiff % moment.duration(this.step).asWeeks() === 0;
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
else if (this.ogcFilterTimeService.stepIsDayDuration(this.step)) {
|
|
340
|
-
const dayDiff = moment(dateValue).diff(moment(this.handleMin()), 'days', true);
|
|
341
|
-
if (type === 'end') {
|
|
342
|
-
const dateValuePlus1 = moment(dateValue).add(1, 'd');
|
|
343
|
-
const dayDiffPlus1 = moment(dateValuePlus1).diff(moment(this.handleMin()), 'days', true);
|
|
344
|
-
const _mod = dayDiffPlus1 % moment.duration(this.step).asDays();
|
|
345
|
-
this.filterEndFunction =
|
|
346
|
-
(_mod < 0.0000001 && _mod > -0.0000001) || _mod === 0; // 1 millisecond = 1.1574074074074076e-8
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
else if (type === 'begin') {
|
|
350
|
-
const _mod = (dayDiff % moment.duration(this.step).asDays()) + 1;
|
|
351
|
-
this.filterBeginFunction =
|
|
352
|
-
(_mod < 0.0000001 && _mod > -0.0000001 && _mod !== 0) || _mod === 1; // 1 millisecond = 1.1574074074074076e-8
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
else if (this.ogcFilterTimeService.stepIsHourDuration(this.step)) {
|
|
357
|
-
if (type === 'end') {
|
|
358
|
-
const hourDiff = moment(dateValue).diff(moment(this.handleMin()), 'hours', true);
|
|
359
|
-
this.filterEndFunction =
|
|
360
|
-
hourDiff % moment.duration(this.step).asHours() === 0;
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
else if (type === 'begin') {
|
|
364
|
-
const hourDiff = moment(dateValue).diff(moment(this.handleMin()), 'hours', true);
|
|
365
|
-
this.filterBeginFunction =
|
|
366
|
-
hourDiff % moment.duration(this.step).asHours() === 0;
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
else if (this.ogcFilterTimeService.stepIsMinuteDuration(this.step)) {
|
|
371
|
-
if (type === 'end') {
|
|
372
|
-
this.filterEndFunction = true;
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
else if (type === 'begin') {
|
|
376
|
-
this.filterBeginFunction = true;
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
this.filterEndFunction = diff % this.stepMilliseconds === 0;
|
|
381
|
-
this.filterBeginFunction = diff % this.stepMilliseconds === 0;
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
getDateTime(date, pos) {
|
|
385
|
-
const valuetmp = new Date(date);
|
|
386
|
-
let valuetmp2;
|
|
387
|
-
if (!this.sliderMode) {
|
|
388
|
-
switch (pos) {
|
|
389
|
-
case 1: {
|
|
390
|
-
if (this.currentFilter.calendarModeYear) {
|
|
391
|
-
valuetmp2 = valuetmp.setHours(0, 0);
|
|
392
|
-
break;
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
valuetmp2 = valuetmp.setHours(this.beginHourFormControl.value, this.beginMinuteFormControl.value);
|
|
396
|
-
break;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
case 2: {
|
|
400
|
-
if (this.currentFilter.calendarModeYear) {
|
|
401
|
-
valuetmp2 = valuetmp.setHours(0, 0);
|
|
402
|
-
break;
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
valuetmp2 = valuetmp.setHours(this.endHourFormControl.value, this.endMinuteFormControl.value);
|
|
406
|
-
break;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
return new Date(valuetmp2 ? valuetmp2 : valuetmp);
|
|
412
|
-
}
|
|
413
|
-
handleMinuteIncrement() {
|
|
414
|
-
if (this.ogcFilterTimeService.stepIsMinuteDuration(this.step)) {
|
|
415
|
-
if (this.stepMilliseconds < 3600000) {
|
|
416
|
-
return this.stepMilliseconds / 1000 === 60
|
|
417
|
-
? 1
|
|
418
|
-
: this.stepMilliseconds / 1000;
|
|
419
|
-
}
|
|
420
|
-
else {
|
|
421
|
-
return (this.stepMilliseconds % 3600000) / 60;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
else if (this.ogcFilterTimeService.stepIsHourDuration(this.step)) {
|
|
425
|
-
return 60;
|
|
426
|
-
}
|
|
427
|
-
return 1;
|
|
428
|
-
}
|
|
429
|
-
handleHourIncrement() {
|
|
430
|
-
if (this.ogcFilterTimeService.stepIsHourDuration(this.step)) {
|
|
431
|
-
return this.stepMilliseconds / 1000 / 60 / 60;
|
|
432
|
-
}
|
|
433
|
-
return 1;
|
|
434
|
-
}
|
|
435
|
-
fullBeginHoursArray(checkEndValue) {
|
|
436
|
-
if (checkEndValue) {
|
|
437
|
-
this.beginHours = Array.from({
|
|
438
|
-
length: (this.endHourFormControl.value - 0) / this.handleHourIncrement() + 1
|
|
439
|
-
}, (_, i) => 0 + i * this.handleHourIncrement());
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
this.beginHours = Array.from({ length: (23 - 0) / this.handleHourIncrement() + 1 }, (_, i) => 0 + i * this.handleHourIncrement());
|
|
443
|
-
}
|
|
444
|
-
this.beginHourFormControl.setValue(this.beginValue.getHours());
|
|
445
|
-
}
|
|
446
|
-
fullEndHoursArray(checkEndValue) {
|
|
447
|
-
if (checkEndValue) {
|
|
448
|
-
this.endHours = Array.from({
|
|
449
|
-
length: (23 - this.beginHourFormControl.value) /
|
|
450
|
-
this.handleHourIncrement() +
|
|
451
|
-
1
|
|
452
|
-
}, (_, i) => this.beginHourFormControl.value + i * this.handleHourIncrement());
|
|
453
|
-
}
|
|
454
|
-
else {
|
|
455
|
-
this.endHours = Array.from({ length: (23 - 0) / this.handleHourIncrement() + 1 }, (_, i) => 0 + i * this.handleHourIncrement());
|
|
456
|
-
}
|
|
457
|
-
this.endHourFormControl.setValue(this.endValue.getHours());
|
|
458
|
-
}
|
|
459
|
-
fullBeginMinutesArray(checkEndValue) {
|
|
460
|
-
if (checkEndValue) {
|
|
461
|
-
this.beginMinutes = Array.from({
|
|
462
|
-
length: (this.endMinuteFormControl.value - 0) /
|
|
463
|
-
this.handleMinuteIncrement() +
|
|
464
|
-
1
|
|
465
|
-
}, (_, i) => 0 + i * this.handleMinuteIncrement());
|
|
466
|
-
}
|
|
467
|
-
else {
|
|
468
|
-
this.beginMinutes = Array.from({ length: (59 - 0) / this.handleMinuteIncrement() + 1 }, (_, i) => 0 + i * this.handleMinuteIncrement());
|
|
469
|
-
}
|
|
470
|
-
this.beginMinuteFormControl.setValue(this.beginValue.getMinutes());
|
|
471
|
-
}
|
|
472
|
-
fullEndMinutesArray(checkEndValue) {
|
|
473
|
-
if (checkEndValue) {
|
|
474
|
-
this.endMinutes = Array.from({
|
|
475
|
-
length: (59 - this.beginMinuteFormControl.value) /
|
|
476
|
-
this.handleMinuteIncrement() +
|
|
477
|
-
1
|
|
478
|
-
}, (_, i) => this.beginMinuteFormControl.value + i * this.handleMinuteIncrement());
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
this.endMinutes = Array.from({ length: (59 - 0) / this.handleMinuteIncrement() + 1 }, (_, i) => 0 + i * this.handleMinuteIncrement());
|
|
482
|
-
}
|
|
483
|
-
this.endMinuteFormControl.setValue(this.endValue.getMinutes());
|
|
484
|
-
}
|
|
485
|
-
updateHoursMinutesArray() {
|
|
486
|
-
const beginTmp = new Date(this.beginValue);
|
|
487
|
-
const endTmp = new Date(this.endValue);
|
|
488
|
-
if (beginTmp.setHours(0, 0) === endTmp.setHours(0, 0)) {
|
|
489
|
-
this.fullBeginHoursArray(true);
|
|
490
|
-
this.fullEndHoursArray(true);
|
|
491
|
-
if (this.beginValue.getHours() === this.endValue.getHours()) {
|
|
492
|
-
this.fullBeginMinutesArray(true);
|
|
493
|
-
this.fullEndMinutesArray(true);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
else {
|
|
497
|
-
this.fullBeginHoursArray();
|
|
498
|
-
this.fullEndHoursArray();
|
|
499
|
-
this.fullBeginMinutesArray();
|
|
500
|
-
this.fullEndMinutesArray();
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
updateValues() {
|
|
504
|
-
this.changeTemporalProperty(this.beginValue, 1, false);
|
|
505
|
-
this.changeTemporalProperty(this.endValue, 2, true);
|
|
506
|
-
}
|
|
507
|
-
restrictedToStep() {
|
|
508
|
-
return this.currentFilter.restrictToStep
|
|
509
|
-
? this.currentFilter.restrictToStep
|
|
510
|
-
: false;
|
|
511
|
-
}
|
|
512
|
-
handleMin() {
|
|
513
|
-
return this.currentFilter.begin
|
|
514
|
-
? this.currentFilter.begin
|
|
515
|
-
: this.datasource.options.minDate
|
|
516
|
-
? this.datasource.options.minDate
|
|
517
|
-
: this._defaultMin;
|
|
518
|
-
}
|
|
519
|
-
handleMax() {
|
|
520
|
-
return this.currentFilter.end
|
|
521
|
-
? this.currentFilter.end
|
|
522
|
-
: this.datasource.options.maxDate
|
|
523
|
-
? this.datasource.options.maxDate
|
|
524
|
-
: this._defaultMax;
|
|
525
|
-
}
|
|
526
|
-
changePropertyByPass(event) {
|
|
527
|
-
this.changeProperty.next(event);
|
|
528
|
-
}
|
|
529
|
-
modeChange(event) {
|
|
530
|
-
if (!event.checked) {
|
|
531
|
-
this.updateValues();
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
setFilterStateDisable() {
|
|
535
|
-
if (this.currentFilter) {
|
|
536
|
-
this.filterStateDisable = !this.currentFilter.active;
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
this.filterStateDisable = false;
|
|
540
|
-
}
|
|
541
|
-
if (this.calendarType() === 'datetime') {
|
|
542
|
-
if (this.filterStateDisable === true) {
|
|
543
|
-
this.beginHourFormControl.disable();
|
|
544
|
-
this.beginMinuteFormControl.disable();
|
|
545
|
-
this.endHourFormControl.disable();
|
|
546
|
-
this.endMinuteFormControl.disable();
|
|
547
|
-
}
|
|
548
|
-
else {
|
|
549
|
-
this.beginHourFormControl.enable();
|
|
550
|
-
this.beginMinuteFormControl.enable();
|
|
551
|
-
this.endHourFormControl.enable();
|
|
552
|
-
this.endMinuteFormControl.enable();
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
getDateFromStringWithoutTime(stringDate) {
|
|
557
|
-
// warning create date with no time make a date UTC with TZ and the date create maybe not the same year, month and day
|
|
558
|
-
// exemple:
|
|
559
|
-
// new Date('2022-01-01') -> Fri Dec 31 2021 19:00:00 GMT-0500 (heure normale de l’Est nord-américain)
|
|
560
|
-
// to create same date as string, add time 00 in the creation
|
|
561
|
-
// new Date('2022-01-01 00:00:00') -> Sat Jan 01 2022 00:00:00 GMT-0500 (heure normale de l’Est nord-américain)
|
|
562
|
-
let year;
|
|
563
|
-
let month = '01';
|
|
564
|
-
let day = '01';
|
|
565
|
-
if (stringDate.length === 10) {
|
|
566
|
-
const dateItems = stringDate.split('-');
|
|
567
|
-
if (dateItems.length !== 3) {
|
|
568
|
-
throw new Error('Error in config date begin-end for ogcFilter: Date without time format need to be YYYY-MM-DD or YYYY');
|
|
569
|
-
}
|
|
570
|
-
else {
|
|
571
|
-
year = dateItems[0];
|
|
572
|
-
month = dateItems[1];
|
|
573
|
-
day = dateItems[2];
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
else if (stringDate.length === 4) {
|
|
577
|
-
year = stringDate;
|
|
578
|
-
}
|
|
579
|
-
else {
|
|
580
|
-
return new Date(stringDate);
|
|
581
|
-
}
|
|
582
|
-
return new Date(`${year}-${month}-${day} 00:00:00`);
|
|
583
|
-
}
|
|
584
|
-
resetFilter() {
|
|
585
|
-
let minDefaultDate;
|
|
586
|
-
let maxDefaultDate;
|
|
587
|
-
let minDefaultISOString;
|
|
588
|
-
let maxDefaultISOString;
|
|
589
|
-
if (this.calendarTypeYear) {
|
|
590
|
-
if (this.filterOriginConfig.end === 'today') {
|
|
591
|
-
const todayDateStringNoTime = new Date().toLocaleDateString('en-CA'); // '2022-02-13'
|
|
592
|
-
maxDefaultISOString = `${todayDateStringNoTime.substring(0, 4)}-01-01`;
|
|
593
|
-
}
|
|
594
|
-
else {
|
|
595
|
-
maxDefaultISOString = `${this.filterOriginConfig.end.substring(0, 4)}-01-01`;
|
|
596
|
-
}
|
|
597
|
-
minDefaultISOString = `${this.filterOriginConfig.begin.substring(0, 4)}-01-01`;
|
|
598
|
-
minDefaultDate = this.getDateFromStringWithoutTime(minDefaultISOString);
|
|
599
|
-
maxDefaultDate = this.getDateFromStringWithoutTime(maxDefaultISOString);
|
|
600
|
-
}
|
|
601
|
-
else {
|
|
602
|
-
minDefaultDate = this.parseFilter(this.filterOriginConfig.begin);
|
|
603
|
-
maxDefaultDate = this.parseFilter(this.filterOriginConfig.end);
|
|
604
|
-
minDefaultISOString = minDefaultDate.toISOString();
|
|
605
|
-
maxDefaultISOString = maxDefaultDate.toISOString();
|
|
606
|
-
}
|
|
607
|
-
if (this.currentFilter.begin !== minDefaultISOString ||
|
|
608
|
-
this.currentFilter.end !== maxDefaultISOString) {
|
|
609
|
-
this.beginValue = minDefaultDate;
|
|
610
|
-
this.endValue = maxDefaultDate;
|
|
611
|
-
this.updateValues();
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
toggleFilterState() {
|
|
615
|
-
if (this.currentFilter.active === true) {
|
|
616
|
-
this.currentFilter.active = false;
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
this.currentFilter.active = true;
|
|
620
|
-
}
|
|
621
|
-
this.setFilterStateDisable();
|
|
622
|
-
this.updateValues();
|
|
623
|
-
}
|
|
624
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OgcFilterTimeComponent, deps: [{ token: i1.OGCFilterTimeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
625
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: OgcFilterTimeComponent, isStandalone: true, selector: "igo-ogc-filter-time", inputs: { datasource: "datasource", currentFilter: "currentFilter" }, outputs: { changeProperty: "changeProperty" }, providers: [OGCFilterTimeService, provideMomentDateAdapter()], viewQueries: [{ propertyName: "endDatepickerTime", first: true, predicate: ["endDatepickerTime"], descendants: true }, { propertyName: "beginDatepickerTime", first: true, predicate: ["beginDatepickerTime"], descendants: true }, { propertyName: "beginTime", first: true, predicate: ["beginTime"], descendants: true }, { propertyName: "endTime", first: true, predicate: ["endTime"], descendants: true }], ngImport: i0, template: "<div class=\"datetime-container\">\n <mat-slide-toggle\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\n [(ngModel)]=\"sliderMode\"\n (change)=\"modeChange($event)\"\n >\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\n </mat-slide-toggle>\n\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\n <igo-ogc-filter-time-slider\n [begin]=\"beginValue\"\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\n [currentFilter]=\"currentFilter\"\n [datasource]=\"datasource\"\n (changeProperty)=\"changePropertyByPass($event)\"\n >\n </igo-ogc-filter-time-slider>\n </div>\n\n <div *ngIf=\"!sliderMode\">\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \n with the datepicker -->\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearBegin }}\"\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n\n <input\n #beginYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"beginDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n />\n </mat-form-field>\n\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearEnd }}\"\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n\n <input\n #endYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"endDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n />\n </mat-form-field>\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon>{{ resetIcon }}</mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\n <div class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #begin\n matInput\n [matDatepicker]=\"beginDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\n [matDatepickerFilter]=\"filterBeginFunction\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option\n *ngFor=\"let minute of beginMinutes\"\n [value]=\"minute\"\n >{{ minute }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #end\n matInput\n [matDatepicker]=\"endDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\n [matDatepickerFilter]=\"filterEndFunction\"\n [value]=\"\n endValue ? endValue : handleDate(datasource.options.maxDate)\n \"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\n minute\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon>{{ resetIcon }}</mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: OgcFilterTimeSliderComponent, selector: "igo-ogc-filter-time-slider", inputs: ["currentFilter", "begin", "max", "datasource"], outputs: ["changeProperty"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: IgoLanguageModule }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
|
|
626
|
-
}
|
|
627
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OgcFilterTimeComponent, decorators: [{
|
|
628
|
-
type: Component,
|
|
629
|
-
args: [{ selector: 'igo-ogc-filter-time', standalone: true, imports: [
|
|
630
|
-
NgIf,
|
|
631
|
-
MatSlideToggleModule,
|
|
632
|
-
FormsModule,
|
|
633
|
-
OgcFilterTimeSliderComponent,
|
|
634
|
-
MatFormFieldModule,
|
|
635
|
-
MatInputModule,
|
|
636
|
-
MatDatepickerModule,
|
|
637
|
-
MatButtonModule,
|
|
638
|
-
MatTooltipModule,
|
|
639
|
-
MatIconModule,
|
|
640
|
-
MatSelectModule,
|
|
641
|
-
ReactiveFormsModule,
|
|
642
|
-
NgFor,
|
|
643
|
-
MatOptionModule,
|
|
644
|
-
IgoLanguageModule
|
|
645
|
-
], providers: [OGCFilterTimeService, provideMomentDateAdapter()], template: "<div class=\"datetime-container\">\n <mat-slide-toggle\n *ngIf=\"this.currentFilter.sliderOptions?.enabled\"\n [(ngModel)]=\"sliderMode\"\n (change)=\"modeChange($event)\"\n >\n {{ 'igo.geo.filter.sliderModeTitle' | translate }}\n </mat-slide-toggle>\n\n <div class=\"slider-container\" *ngIf=\"sliderMode\">\n <igo-ogc-filter-time-slider\n [begin]=\"beginValue\"\n [max]=\"this.restrictedToStep() ? this.maxDate : this.endValue\"\n [currentFilter]=\"currentFilter\"\n [datasource]=\"datasource\"\n (changeProperty)=\"changePropertyByPass($event)\"\n >\n </igo-ogc-filter-time-slider>\n </div>\n\n <div *ngIf=\"!sliderMode\">\n <div class=\"year-input-container\" *ngIf=\"calendarTypeYear\">\n <!-- to emulate a year-picker, 2 input: first input to show user just year and second input hiden and bind \n with the datepicker -->\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.startYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearBegin }}\"\n (change)=\"yearOnlyInputChange($event, beginDatepicker, 'begin')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n\n <input\n #beginYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"beginDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n />\n </mat-form-field>\n\n <mat-form-field class=\"year-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.endYear' | translate }}</mat-label>\n <input\n matInput\n class=\"year-input-only-year\"\n value=\"{{ onlyYearEnd }}\"\n (change)=\"yearOnlyInputChange($event, endDatepicker, 'end')\"\n [disabled]=\"filterStateDisable\"\n />\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <mat-datepicker\n panelClass=\"datepicker-year\"\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n\n <input\n #endYear\n class=\"year-input-hide\"\n matInput\n [matDatepicker]=\"endDatepicker\"\n enabled=\"false\"\n readonly=\"true\"\n [value]=\"endValue ? endValue : handleDate(datasource.options.maxDate)\"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n />\n </mat-form-field>\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon>{{ resetIcon }}</mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n\n <div class=\"datetime-input-container\" *ngIf=\"calendarType() !== 'year'\">\n <div class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"beginDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #begin\n matInput\n [matDatepicker]=\"beginDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.startDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(begin.value, 1)\"\n [matDatepickerFilter]=\"filterBeginFunction\"\n [value]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [min]=\"handleDate(datasource.options.minDate)\"\n [max]=\"\n endValue && !restrictedToStep()\n ? endValue\n : handleDate(datasource.options.maxDate)\n \"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #beginDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"beginValue\"\n (yearSelected)=\"yearSelected($event, beginDatepicker, 'begin')\"\n (monthSelected)=\"monthSelected($event, beginDatepicker, 'begin')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option *ngFor=\"let hour of beginHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"beginMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(begin.value, 1)\"\n >\n <mat-option\n *ngFor=\"let minute of beginMinutes\"\n [value]=\"minute\"\n >{{ minute }}</mat-option\n >\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div *ngIf=\"!restrictedToStep()\" class=\"datetime-input\">\n <mat-form-field class=\"date-input\" subscriptSizing=\"dynamic\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"endDatepicker\"\n [disabled]=\"filterStateDisable\"\n ></mat-datepicker-toggle>\n <input\n #end\n matInput\n [matDatepicker]=\"endDatepicker\"\n [placeholder]=\"'igo.geo.timeFilter.endDate' | translate\"\n [attr.disabled]=\"!currentFilter.active\"\n (dateChange)=\"changeTemporalProperty(end.value, 2)\"\n [matDatepickerFilter]=\"filterEndFunction\"\n [value]=\"\n endValue ? endValue : handleDate(datasource.options.maxDate)\n \"\n [min]=\"\n beginValue ? beginValue : handleDate(datasource.options.minDate)\n \"\n [max]=\"handleDate(datasource.options.maxDate)\"\n [disabled]=\"filterStateDisable\"\n />\n <span class=\"filler\"></span>\n <mat-datepicker\n #endDatepicker\n [startView]=\"calendarView()\"\n [startAt]=\"endValue\"\n (yearSelected)=\"yearSelected($event, endDatepicker, 'end')\"\n (monthSelected)=\"monthSelected($event, endDatepicker, 'end')\"\n >\n </mat-datepicker>\n </mat-form-field>\n\n <div *ngIf=\"calendarType() === 'datetime'\" class=\"time-input\">\n <mat-form-field class=\"hour-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.hour' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endHourFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let hour of endHours\" [value]=\"hour\">{{\n hour\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field class=\"minute-input\" subscriptSizing=\"dynamic\">\n <mat-label>{{ 'igo.geo.timeFilter.minute' | translate }}</mat-label>\n <mat-select\n [formControl]=\"endMinuteFormControl\"\n [attr.disabled]=\"!currentFilter.active\"\n (selectionChange)=\"changeTemporalProperty(end.value, 2)\"\n >\n <mat-option *ngFor=\"let minute of endMinutes\" [value]=\"minute\">{{\n minute\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"actions-container\">\n <button\n class=\"reset-button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"resetFilter()\"\n [matTooltip]=\"'igo.geo.filter.resetFilters' | translate\"\n [disabled]=\"filterStateDisable\"\n >\n <mat-icon>{{ resetIcon }}</mat-icon>\n </button>\n <mat-slide-toggle\n class=\"toggle-filter-state\"\n (change)=\"toggleFilterState()\"\n tooltip-position=\"below\"\n matTooltipShowDelay=\"500\"\n [matTooltip]=\"'igo.geo.filter.toggleFilterState' | translate\"\n [checked]=\"!filterStateDisable\"\n >\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{text-align:center!important;margin:auto 5px!important}:host .slider-container{text-align:center}:host .datetime-input-container{display:flex;align-items:center;flex-wrap:wrap}:host .datetime-input-container>:not(:last-child){margin-right:8px}:host .datetime-input{display:block}:host .date-input{width:154px}:host .actions-container{display:flex;align-items:center}:host .time-input{margin-top:16px}:host .time-input>:not(:last-child){margin-right:8px}@media only screen and (orientation:portrait) and (max-width: 599px),only screen and (orientation:landscape) and (max-width: 959px){:host .time-input{margin-top:4px}}:host .hour-input,:host .minute-input{width:100px}:host .year-input-container{display:flex;width:100%}:host .year-input-container mat-form-field:not(:last-child){margin-right:4px}:host .year-input-hide{width:120px;margin-right:25px;display:none}:host .year-input-only-year{width:120px;margin-right:25px;text-align:left!important}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-arrow{display:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-period-button{pointer-events:none}:host ::ng-deep .datepicker-year ::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover{background-color:#0000001f;border-radius:999px}\n"] }]
|
|
646
|
-
}], ctorParameters: () => [{ type: i1.OGCFilterTimeService }], propDecorators: { datasource: [{
|
|
647
|
-
type: Input
|
|
648
|
-
}], currentFilter: [{
|
|
649
|
-
type: Input
|
|
650
|
-
}], changeProperty: [{
|
|
651
|
-
type: Output
|
|
652
|
-
}], endDatepickerTime: [{
|
|
653
|
-
type: ViewChild,
|
|
654
|
-
args: ['endDatepickerTime']
|
|
655
|
-
}], beginDatepickerTime: [{
|
|
656
|
-
type: ViewChild,
|
|
657
|
-
args: ['beginDatepickerTime']
|
|
658
|
-
}], beginTime: [{
|
|
659
|
-
type: ViewChild,
|
|
660
|
-
args: ['beginTime']
|
|
661
|
-
}], endTime: [{
|
|
662
|
-
type: ViewChild,
|
|
663
|
-
args: ['endTime']
|
|
664
|
-
}] } });
|
|
665
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9vZ2MtZmlsdGVyLXRpbWUvb2djLWZpbHRlci10aW1lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNuQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFD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LENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQzt3R0F0dEJVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLHVMQUZ0QixDQUFDLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLENBQUMsNmFDN0QvRCxxaFZBMFJBLHEwQ0Q3T0ksSUFBSSw0RkFDSixvQkFBb0IseVhBQ3BCLFdBQVcsK1ZBQ1gsNEJBQTRCLDRKQUM1QixrQkFBa0IsMmFBQ2xCLGNBQWMsMFdBQ2QsbUJBQW1CLGlnQkFDbkIsZUFBZSwySUFDZixnQkFBZ0IsNFRBQ2hCLGFBQWEsbUxBQ2IsZUFBZSxxckJBQ2YsbUJBQW1CLGtOQUNuQixLQUFLLGtIQUNMLGVBQWUsOEJBQ2YsaUJBQWlCOzs0RkFJUixzQkFBc0I7a0JBeEJsQyxTQUFTOytCQUNFLHFCQUFxQixjQUduQixJQUFJLFdBQ1A7d0JBQ1AsSUFBSTt3QkFDSixvQkFBb0I7d0JBQ3BCLFdBQVc7d0JBQ1gsNEJBQTRCO3dCQUM1QixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsS0FBSzt3QkFDTCxlQUFlO3dCQUNmLGlCQUFpQjtxQkFDbEIsYUFDVSxDQUFDLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLENBQUM7eUZBR3BELFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQWdDeUIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDSSxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCO2dCQUNSLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDQSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1Db250cm9sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHByb3ZpZGVNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBJZ29MYW5ndWFnZU1vZHVsZSB9IGZyb20gJ0BpZ28yL2NvcmUvbGFuZ3VhZ2UnO1xuXG5pbXBvcnQgeyBkZWZhdWx0IGFzIG1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IE9nY0ZpbHRlck9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vZmlsdGVyL3NoYXJlZC9vZ2MtZmlsdGVyLmVudW0nO1xuaW1wb3J0IHsgT0dDRmlsdGVyVGltZVNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvb2djLWZpbHRlci10aW1lLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgT2djRmlsdGVyRHVyaW5nT3B0aW9ucyxcbiAgT2djRmlsdGVyYWJsZURhdGFTb3VyY2UsXG4gIE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xufSBmcm9tICcuLi9zaGFyZWQvb2djLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT2djRmlsdGVyVGltZVNsaWRlckNvbXBvbmVudCB9IGZyb20gJy4vb2djLWZpbHRlci10aW1lLXNsaWRlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tb2djLWZpbHRlci10aW1lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29nYy1maWx0ZXItdGltZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29nYy1maWx0ZXItdGltZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBPZ2NGaWx0ZXJUaW1lU2xpZGVyQ29tcG9uZW50LFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdGb3IsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIElnb0xhbmd1YWdlTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW09HQ0ZpbHRlclRpbWVTZXJ2aWNlLCBwcm92aWRlTW9tZW50RGF0ZUFkYXB0ZXIoKV1cbn0pXG5leHBvcnQgY2xhc3MgT2djRmlsdGVyVGltZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGRhdGFzb3VyY2U6IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlO1xuICBASW5wdXQoKSBjdXJyZW50RmlsdGVyOiBhbnk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VQcm9wZXJ0eTogRXZlbnRFbWl0dGVyPHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIHBvczogbnVtYmVyO1xuICAgIHJlZnJlc2hGaWx0ZXI6IGJvb2xlYW47XG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgYmVnaW5Ib3VyczogbnVtYmVyW107XG4gIGVuZEhvdXJzOiBudW1iZXJbXTtcbiAgYmVnaW5NaW51dGVzOiBudW1iZXJbXTtcbiAgZW5kTWludXRlczogbnVtYmVyW107XG4gIGJlZ2luSG91ckZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuICBiZWdpbk1pbnV0ZUZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuICBlbmRIb3VyRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XG4gIGVuZE1pbnV0ZUZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuICBfYmVnaW5WYWx1ZTogRGF0ZTtcbiAgX2VuZFZhbHVlOiBEYXRlO1xuICByZWFkb25seSBfZGVmYXVsdE1pbjogc3RyaW5nID0gJzE5MDAtMDEtMDEnO1xuICByZWFkb25seSBfZGVmYXVsdE1heDogc3RyaW5nID0gJzIwNTItMDEtMDYnO1xuICByZWFkb25seSBfZGVmYXVsdERpc3BsYXlGb3JtYXQ6IHN0cmluZyA9ICdERC9NTS9ZWVlZIEhIOm1tIEEnO1xuICByZWFkb25seSBfZGVmYXVsdFNsaWRlck1vZGVFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgb2djRmlsdGVyT3BlcmF0b3IgPSBPZ2NGaWx0ZXJPcGVyYXRvcjtcbiAgcHVibGljIHNsaWRlck1vZGUgPSBmYWxzZTtcblxuICByZWFkb25seSBkZWZhdWx0U3RlcE1pbGxpc2Vjb25kID0gNjAwMDA7XG4gIHB1YmxpYyBvcHRpb25zOiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnM7XG5cbiAgcHVibGljIG9ubHlZZWFyQmVnaW46IG51bWJlcjtcbiAgcHVibGljIG9ubHlZZWFyRW5kOiBudW1iZXI7XG4gIHB1YmxpYyBjYWxlbmRhclR5cGVZZWFyID0gZmFsc2U7XG4gIHB1YmxpYyByZXNldEljb24gPSAncmVwbGF5JztcbiAgcHVibGljIGZpbHRlclN0YXRlRGlzYWJsZTogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCdlbmREYXRlcGlja2VyVGltZScpIGVuZERhdGVwaWNrZXJUaW1lOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdiZWdpbkRhdGVwaWNrZXJUaW1lJykgYmVnaW5EYXRlcGlja2VyVGltZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYmVnaW5UaW1lJykgYmVnaW5UaW1lOiBIVE1MSW5wdXRFbGVtZW50O1xuICBAVmlld0NoaWxkKCdlbmRUaW1lJykgZW5kVGltZTogSFRNTElucHV0RWxlbWVudDtcblxuICBwcml2YXRlIGZpbHRlck9yaWdpbkNvbmZpZzogT2djRmlsdGVyRHVyaW5nT3B0aW9ucztcblxuICBnZXQgc3RlcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5zdGVwRGF0ZVxuICAgICAgPyB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5zdGVwRGF0ZVxuICAgICAgOiB0aGlzLmN1cnJlbnRGaWx0ZXIuc3RlcDtcbiAgfVxuXG4gIGdldCBzdGVwTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc3RlcCA9IG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzTWlsbGlzZWNvbmRzKCk7XG4gICAgcmV0dXJuIHN0ZXAgPT09IDAgPyB0aGlzLmRlZmF1bHRTdGVwTWlsbGlzZWNvbmQgOiBzdGVwO1xuICB9XG5cbiAgc2V0IGJlZ2luVmFsdWUoYmVnaW46IERhdGUpIHtcbiAgICB0aGlzLl9iZWdpblZhbHVlID0gYmVnaW47XG4gIH1cblxuICBnZXQgYmVnaW5WYWx1ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fYmVnaW5WYWx1ZTtcbiAgfVxuXG4gIHNldCBlbmRWYWx1ZShlbmQ6IERhdGUpIHtcbiAgICB0aGlzLl9lbmRWYWx1ZSA9IGVuZDtcbiAgfVxuXG4gIGdldCBlbmRWYWx1ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kVmFsdWU7XG4gIH1cblxuICBnZXQgc2xpZGVySW50ZXJ2YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlckludGVydmFsID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwMFxuICAgICAgOiB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVySW50ZXJ2YWw7XG4gIH1cblxuICBnZXQgbWF4RGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlXG4gICAgICA/IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcbiAgICAgIDogdGhpcy5fZGVmYXVsdE1heDtcbiAgfVxuXG4gIGdldCBkaXNwbGF5Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEZpbHRlci5kaXNwbGF5Rm9ybWF0XG4gICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5kaXNwbGF5Rm9ybWF0XG4gICAgICA6IHRoaXMuX2RlZmF1bHREaXNwbGF5Rm9ybWF0O1xuICB9XG5cbiAgcHVibGljIGZpbHRlckJlZ2luRnVuY3Rpb247XG4gIHB1YmxpYyBmaWx0ZXJFbmRGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgb2djRmlsdGVyVGltZVNlcnZpY2U6IE9HQ0ZpbHRlclRpbWVTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZmlsdGVyT3JpZ2luQ29uZmlnID0gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMub2djRmlsdGVyc1xuICAgICAgLmZpbHRlcnMgYXMgT2djRmlsdGVyRHVyaW5nT3B0aW9ucztcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLnNsaWRlck9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlci5zbGlkZXJPcHRpb25zLmVuYWJsZWQgPVxuICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucy5lbmFibGVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5zbGlkZXJPcHRpb25zLmVuYWJsZWRcbiAgICAgICAgICA6IHRoaXMuX2RlZmF1bHRTbGlkZXJNb2RlRW5hYmxlZDtcbiAgICB9XG4gICAgdGhpcy5iZWdpblZhbHVlID0gdGhpcy5wYXJzZUZpbHRlcih0aGlzLmhhbmRsZU1pbigpKTtcbiAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5wYXJzZUZpbHRlcih0aGlzLmhhbmRsZU1heCgpKTtcblxuICAgIHRoaXMub25seVllYXJCZWdpbiA9IHRoaXMuYmVnaW5WYWx1ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIHRoaXMub25seVllYXJFbmQgPSB0aGlzLmVuZFZhbHVlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgdGhpcy5jYWxlbmRhclR5cGVZZWFyID0gdGhpcy5pc0NhbGVuZGFyWWVhck1vZGUoKTtcbiAgICB0aGlzLnNldEZpbHRlclN0YXRlRGlzYWJsZSgpO1xuICAgIHRoaXMudXBkYXRlSG91cnNNaW51dGVzQXJyYXkoKTtcbiAgICAvLyB1cGRhdGUgdmFsdWUgZm9yIG5vdyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlVmFsdWVzKCk7XG4gICAgdGhpcy5kYXRlRmlsdGVyKHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiwgJ2JlZ2luJyk7XG4gICAgdGhpcy5kYXRlRmlsdGVyKHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24sICdlbmQnKTtcbiAgfVxuXG4gIHBhcnNlRmlsdGVyKGZpbHRlcik6IERhdGUge1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFOKG5ldyBEYXRlKGZpbHRlcikuZ2V0VGltZSgpKSkge1xuICAgICAgaWYgKGZpbHRlci5zZWFyY2goJ25vdycpID49IDApIHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBmaWx0ZXIubWF0Y2goL3llYXJzfG1vbnRoc3x3ZWVrc3xkYXlzfGhvdXJzfHNlY29uZHMvKTtcbiAgICAgICAgaWYgKGZpbHRlci5tYXRjaCgvXFwrLykpIHtcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbEludCA9IHBhcnNlSW50KFxuICAgICAgICAgICAgZmlsdGVyLnN1YnN0cmluZyhmaWx0ZXIuaW5kZXhPZignKycpICsgMSwgaW50ZXJ2YWwuaW5kZXgpLFxuICAgICAgICAgICAgMTBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBtb21lbnQoKS5hZGQoaW50ZXJ2YWxJbnQsIGludGVydmFsWzBdKS50b0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyLm1hdGNoKC9cXC0vKSkge1xuICAgICAgICAgIGNvbnN0IGludGVydmFsSW50ID0gcGFyc2VJbnQoXG4gICAgICAgICAgICBmaWx0ZXIuc3Vic3RyaW5nKGZpbHRlci5pbmRleE9mKCctJykgKyAxLCBpbnRlcnZhbC5pbmRleCksXG4gICAgICAgICAgICAxMFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudCgpLnN1YnRyYWN0KGludGVydmFsSW50LCBpbnRlcnZhbFswXSkudG9EYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyLnNlYXJjaCgndG9kYXknKSA+PSAwKSB7XG4gICAgICAgIGNvbnN0IF9ub3cgPSBtb21lbnQoKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gZmlsdGVyLm1hdGNoKC95ZWFyc3xtb250aHN8d2Vla3N8ZGF5c3xob3Vyc3xzZWNvbmRzLyk7XG4gICAgICAgIGlmIChmaWx0ZXIubWF0Y2goL1xcKy8pKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbnQgPSBwYXJzZUludChcbiAgICAgICAgICAgIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLmluZGV4T2YoJysnKSArIDEsIGludGVydmFsLmluZGV4KSxcbiAgICAgICAgICAgIDEwXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KF9ub3cpLmFkZChpbnRlcnZhbEludCwgaW50ZXJ2YWxbMF0pLnRvRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIubWF0Y2goL1xcLS8pKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbnQgPSBwYXJzZUludChcbiAgICAgICAgICAgIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLmluZGV4T2YoJy0nKSArIDEsIGludGVydmFsLmluZGV4KSxcbiAgICAgICAgICAgIDEwXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KF9ub3cpLnN1YnRyYWN0KGludGVydmFsSW50LCBpbnRlcnZhbFswXSkudG9EYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9ub3c7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKGZpbHRlcik7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbHRlciA/IG5ldyBEYXRlKGZpbHRlcikgOiBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXG4gICAgdmFsdWU6IHN0cmluZyB8IERhdGUsXG4gICAgcG9zaXRpb24/LFxuICAgIHJlZnJlc2hGaWx0ZXIgPSB0cnVlXG4gICkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlVG1wID0gdGhpcy5nZXREYXRlVGltZSh2YWx1ZSwgcG9zaXRpb24pO1xuICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJZZWFyTW9kZSgpKSB7XG4gICAgICBsZXQgZGF0ZVN0cmluZ0Zyb21ZZWFyTm90aW1lO1xuICAgICAgaWYgKHBvc2l0aW9uID09PSAxKSB7XG4gICAgICAgIHRoaXMuYmVnaW5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9ubHlZZWFyQmVnaW4gPSB0aGlzLmJlZ2luVmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgZGF0ZVN0cmluZ0Zyb21ZZWFyTm90aW1lID0gYCR7dGhpcy5vbmx5WWVhckJlZ2lufS0wMS0wMWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25seVllYXJFbmQgPSB0aGlzLmVuZFZhbHVlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGRhdGVTdHJpbmdGcm9tWWVhck5vdGltZSA9IGAke3RoaXMub25seVllYXJFbmR9LTEyLTMxYDtcbiAgICAgIH1cbiAgICAgIC8vIGNhbGwgc2VydmljZSB3aXRoIHN0cmluZyBkYXRlIHdpdGhvdXQgdGltZVxuICAgICAgdGhpcy5jaGFuZ2VQcm9wZXJ0eS5uZXh0KHtcbiAgICAgICAgdmFsdWU6IGRhdGVTdHJpbmdGcm9tWWVhck5vdGltZSxcbiAgICAgICAgcG9zOiBwb3NpdGlvbixcbiAgICAgICAgcmVmcmVzaEZpbHRlclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwb3NpdGlvbiA9PT0gMiAmJiB0aGlzLmNhbGVuZGFyVHlwZSgpID09PSAnZGF0ZScgJiYgIXRoaXMuc2xpZGVyTW9kZSkge1xuICAgICAgLyogQWJvdmUgbW9udGg6IHNlZSB5ZWFyU2VsZWN0ZWQgb3IgbW9udGhTZWxlY3RlZCAqL1xuICAgICAgdmFsdWVUbXAgPSBtb21lbnQodmFsdWVUbXApLmVuZE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPT09IDEpIHtcbiAgICAgIHRoaXMuYmVnaW5WYWx1ZSA9IHZhbHVlVG1wO1xuICAgICAgaWYgKHRoaXMucmVzdHJpY3RlZFRvU3RlcCgpKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShcbiAgICAgICAgICB0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLmFkZFN0ZXAodmFsdWVUbXAsIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyksXG4gICAgICAgICAgMixcbiAgICAgICAgICByZWZyZXNoRmlsdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kVmFsdWUgPSB2YWx1ZVRtcDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVIb3Vyc01pbnV0ZXNBcnJheSgpO1xuICAgIHRoaXMuY2hhbmdlUHJvcGVydHkubmV4dCh7XG4gICAgICB2YWx1ZTogdmFsdWVUbXAudG9JU09TdHJpbmcoKSxcbiAgICAgIHBvczogcG9zaXRpb24sXG4gICAgICByZWZyZXNoRmlsdGVyXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVEYXRlKHZhbHVlKTogRGF0ZSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRlRnJvbVN0cmluZ1dpdGhvdXRUaW1lKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuXG4gIGNhbGVuZGFyVHlwZSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLmNhbGVuZGFyTW9kZVllYXIpIHtcbiAgICAgIHJldHVybiAneWVhcic7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0ZXBNaWxsaXNlY29uZHMgPCA4NjQwMDAwMCkge1xuICAgICAgcmV0dXJuICdkYXRldGltZSc7XG4gICAgfVxuICAgIHJldHVybiAnZGF0ZSc7XG4gIH1cblxuICBpc0NhbGVuZGFyWWVhck1vZGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJUeXBlKCkgPT09ICd5ZWFyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB5ZWFyT25seUlucHV0Q2hhbmdlKGNoYW5nZUV2ZW50LCBkYXRlUGlja2VyPzogYW55LCBwcm9wZXJ0eT86IHN0cmluZykge1xuICAgIGNvbnN0IHllYXIgPSBjaGFuZ2VFdmVudC50YXJnZXQudmFsdWU7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZSh5ZWFyKTtcbiAgICB0aGlzLnllYXJTZWxlY3RlZChkYXRlLCBkYXRlUGlja2VyLCBwcm9wZXJ0eSk7XG4gIH1cblxuICB5ZWFyU2VsZWN0ZWQoXG4gICAgeWVhcixcbiAgICBkYXRlUGlja2VyPzogYW55LFxuICAgIHByb3BlcnR5Pzogc3RyaW5nLFxuICAgIHJlZnJlc2hGaWx0ZXIgPSB0cnVlXG4gICkge1xuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc1llYXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XG4gICAgICBpZiAoZGF0ZVBpY2tlcikge1xuICAgICAgICBkYXRlUGlja2VyLmNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcGVydHkgPT09ICdlbmQnKSB7XG4gICAgICAgIC8vIGNoYW5nZSB2YWx1ZSAwMSBqYW4gdG8gMzEgZGVjIHNhbWUgeWVhclxuICAgICAgICB5ZWFyID0gbW9tZW50KHllYXIpLmVuZE9mKCd5ZWFyJykudG9EYXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2JlZ2luJyAmJlxuICAgICAgICB0aGlzLnJlc3RyaWN0ZWRUb1N0ZXAoKSAmJlxuICAgICAgICAhdGhpcy5jYWxlbmRhclR5cGVZZWFyXG4gICAgICApIHtcbiAgICAgICAgdGhpcy55ZWFyU2VsZWN0ZWQoeWVhciwgdW5kZWZpbmVkLCAnZW5kJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXG4gICAgICAgIHllYXIsXG4gICAgICAgIHByb3BlcnR5ID09PSAnYmVnaW4nID8gMSA6IDIsXG4gICAgICAgIHJlZnJlc2hGaWx0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbW9udGhTZWxlY3RlZChcbiAgICBtb250aCxcbiAgICBkYXRlUGlja2VyPzogYW55LFxuICAgIHByb3BlcnR5Pzogc3RyaW5nLFxuICAgIHJlZnJlc2hGaWx0ZXIgPSB0cnVlXG4gICkge1xuICAgIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xuICAgICAgaWYgKGRhdGVQaWNrZXIpIHtcbiAgICAgICAgZGF0ZVBpY2tlci5jbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSAnZW5kJykge1xuICAgICAgICBtb250aCA9IG1vbWVudChtb250aCkuZW5kT2YoJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09PSAnYmVnaW4nICYmIHRoaXMucmVzdHJpY3RlZFRvU3RlcCgpKSB7XG4gICAgICAgIHRoaXMubW9udGhTZWxlY3RlZChtb250aCwgdW5kZWZpbmVkLCAnZW5kJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5nZVRlbXBvcmFsUHJvcGVydHkoXG4gICAgICAgIG1vbnRoLFxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2JlZ2luJyA/IDEgOiAyLFxuICAgICAgICByZWZyZXNoRmlsdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGVuZGFyVmlldygpOiAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInIHtcbiAgICBjb25zdCB0ZXN0ID0gdGhpcy5zdGVwTWlsbGlzZWNvbmRzO1xuICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhcbiAgICAgIHRoaXMucGFyc2VGaWx0ZXIodGhpcy5jdXJyZW50RmlsdGVyLmVuZCkuZ2V0VGltZSgpIC1cbiAgICAgICAgdGhpcy5wYXJzZUZpbHRlcih0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW4pLmdldFRpbWUoKVxuICAgICk7XG4gICAgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzWWVhckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcbiAgICAgIHJldHVybiAnbXVsdGkteWVhcic7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01vbnRoRHVyYXRpb24odGhpcy5zdGVwKSkge1xuICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICB9IGVsc2UgaWYgKHRlc3QgPCA4NjQwMDAwMCAmJiBkaWZmIDwgODY0MDAwMDApIHtcbiAgICAgIHJldHVybiAnY2xvY2snIGFzIGFueTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdtb250aCc7XG4gICAgfVxuICB9XG5cbiAgZGF0ZUZpbHRlcih0eXBlOiBzdHJpbmcsIGRhdGU6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGVWYWx1ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIGNvbnN0IGRpZmYgPSBkYXRlVmFsdWUuZ2V0VGltZSgpIC0gbmV3IERhdGUodGhpcy5oYW5kbGVNaW4oKSkuZ2V0VGltZSgpO1xuXG4gICAgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzWWVhckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcbiAgICAgIGNvbnN0IG1vbnRoRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXG4gICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcbiAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlID09PSAnZW5kJykge1xuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xuICAgICAgICBjb25zdCBtb250aERpZmZQbHVzMSA9IG1vbWVudChkYXRlVmFsdWVQbHVzMSkuZGlmZihcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXG4gICAgICAgICAgJ3llYXJzJyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxuICAgICAgICAgIG1vbnRoRGlmZlBsdXMxICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNZZWFycygpID09PSAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiZWdpbicpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCZWdpbkZ1bmN0aW9uID1cbiAgICAgICAgICBtb250aERpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc1llYXJzKCkgPT09IDA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzTW9udGhEdXJhdGlvbih0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBtb250aERpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxuICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXG4gICAgICAgICdtb250aHMnLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdlbmQnKSB7XG4gICAgICAgIGNvbnN0IGRhdGVWYWx1ZVBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZSkuYWRkKDEsICdkJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoRGlmZlBsdXMxID0gbW9tZW50KGRhdGVWYWx1ZVBsdXMxKS5kaWZmKFxuICAgICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcbiAgICAgICAgICAnbW9udGhzJyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxuICAgICAgICAgIG1vbnRoRGlmZlBsdXMxICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNNb250aHMoKSA9PT0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmVnaW4nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XG4gICAgICAgICAgbW9udGhEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNNb250aHMoKSA9PT0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNXZWVrRHVyYXRpb24odGhpcy5zdGVwKSkge1xuICAgICAgY29uc3Qgd2Vla0RpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxuICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXG4gICAgICAgICd3ZWVrcycsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgY29uc3QgZGF0ZVZhbHVlUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlKS5hZGQoMSwgJ2QnKTtcbiAgICAgICAgY29uc3Qgd2Vla0RpZmZQbHVzMSA9IG1vbWVudChkYXRlVmFsdWVQbHVzMSkuZGlmZihcbiAgICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXG4gICAgICAgICAgJ3dlZWtzJyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVyRW5kRnVuY3Rpb24gPVxuICAgICAgICAgIHdlZWtEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc1dlZWtzKCkgPT09IDA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JlZ2luJykge1xuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPVxuICAgICAgICAgIHdlZWtEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNXZWVrcygpID09PSAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0RheUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcbiAgICAgIGNvbnN0IGRheURpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxuICAgICAgICBtb21lbnQodGhpcy5oYW5kbGVNaW4oKSksXG4gICAgICAgICdkYXlzJyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlID09PSAnZW5kJykge1xuICAgICAgICBjb25zdCBkYXRlVmFsdWVQbHVzMSA9IG1vbWVudChkYXRlVmFsdWUpLmFkZCgxLCAnZCcpO1xuICAgICAgICBjb25zdCBkYXlEaWZmUGx1czEgPSBtb21lbnQoZGF0ZVZhbHVlUGx1czEpLmRpZmYoXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxuICAgICAgICAgICdkYXlzJyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IF9tb2QgPSBkYXlEaWZmUGx1czEgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0RheXMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJFbmRGdW5jdGlvbiA9XG4gICAgICAgICAgKF9tb2QgPCAwLjAwMDAwMDEgJiYgX21vZCA+IC0wLjAwMDAwMDEpIHx8IF9tb2QgPT09IDA7IC8vIDEgbWlsbGlzZWNvbmQgPSAxLjE1NzQwNzQwNzQwNzQwNzZlLThcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmVnaW4nKSB7XG4gICAgICAgIGNvbnN0IF9tb2QgPSAoZGF5RGlmZiAlIG1vbWVudC5kdXJhdGlvbih0aGlzLnN0ZXApLmFzRGF5cygpKSArIDE7XG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9XG4gICAgICAgICAgKF9tb2QgPCAwLjAwMDAwMDEgJiYgX21vZCA+IC0wLjAwMDAwMDEgJiYgX21vZCAhPT0gMCkgfHwgX21vZCA9PT0gMTsgLy8gMSBtaWxsaXNlY29uZCA9IDEuMTU3NDA3NDA3NDA3NDA3NmUtOFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc0hvdXJEdXJhdGlvbih0aGlzLnN0ZXApKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgY29uc3QgaG91ckRpZmYgPSBtb21lbnQoZGF0ZVZhbHVlKS5kaWZmKFxuICAgICAgICAgIG1vbWVudCh0aGlzLmhhbmRsZU1pbigpKSxcbiAgICAgICAgICAnaG91cnMnLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5maWx0ZXJFbmRGdW5jdGlvbiA9XG4gICAgICAgICAgaG91ckRpZmYgJSBtb21lbnQuZHVyYXRpb24odGhpcy5zdGVwKS5hc0hvdXJzKCkgPT09IDA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JlZ2luJykge1xuICAgICAgICBjb25zdCBob3VyRGlmZiA9IG1vbWVudChkYXRlVmFsdWUpLmRpZmYoXG4gICAgICAgICAgbW9tZW50KHRoaXMuaGFuZGxlTWluKCkpLFxuICAgICAgICAgICdob3VycycsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPVxuICAgICAgICAgIGhvdXJEaWZmICUgbW9tZW50LmR1cmF0aW9uKHRoaXMuc3RlcCkuYXNIb3VycygpID09PSAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9nY0ZpbHRlclRpbWVTZXJ2aWNlLnN0ZXBJc01pbnV0ZUR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcbiAgICAgIGlmICh0eXBlID09PSAnZW5kJykge1xuICAgICAgICB0aGlzLmZpbHRlckVuZEZ1bmN0aW9uID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYmVnaW4nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQmVnaW5GdW5jdGlvbiA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlckVuZEZ1bmN0aW9uID0gZGlmZiAlIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA9PT0gMDtcbiAgICB0aGlzLmZpbHRlckJlZ2luRnVuY3Rpb24gPSBkaWZmICUgdGhpcy5zdGVwTWlsbGlzZWNvbmRzID09PSAwO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldERhdGVUaW1lKGRhdGUsIHBvcykge1xuICAgIGNvbnN0IHZhbHVldG1wID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgbGV0IHZhbHVldG1wMjtcbiAgICBpZiAoIXRoaXMuc2xpZGVyTW9kZSkge1xuICAgICAgc3dpdGNoIChwb3MpIHtcbiAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudEZpbHRlci5jYWxlbmRhck1vZGVZZWFyKSB7XG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycygwLCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXRtcDIgPSB2YWx1ZXRtcC5zZXRIb3VycyhcbiAgICAgICAgICAgICAgdGhpcy5iZWdpbkhvdXJGb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRGaWx0ZXIuY2FsZW5kYXJNb2RlWWVhcikge1xuICAgICAgICAgICAgdmFsdWV0bXAyID0gdmFsdWV0bXAuc2V0SG91cnMoMCwgMCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWV0bXAyID0gdmFsdWV0bXAuc2V0SG91cnMoXG4gICAgICAgICAgICAgIHRoaXMuZW5kSG91ckZvcm1Db250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLnZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZXRtcDIgPyB2YWx1ZXRtcDIgOiB2YWx1ZXRtcCk7XG4gIH1cblxuICBoYW5kbGVNaW51dGVJbmNyZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzTWludXRlRHVyYXRpb24odGhpcy5zdGVwKSkge1xuICAgICAgaWYgKHRoaXMuc3RlcE1pbGxpc2Vjb25kcyA8IDM2MDAwMDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcE1pbGxpc2Vjb25kcyAvIDEwMDAgPT09IDYwXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0ZXBNaWxsaXNlY29uZHMgJSAzNjAwMDAwKSAvIDYwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vZ2NGaWx0ZXJUaW1lU2VydmljZS5zdGVwSXNIb3VyRHVyYXRpb24odGhpcy5zdGVwKSkge1xuICAgICAgcmV0dXJuIDYwO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGhhbmRsZUhvdXJJbmNyZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMub2djRmlsdGVyVGltZVNlcnZpY2Uuc3RlcElzSG91ckR1cmF0aW9uKHRoaXMuc3RlcCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXBNaWxsaXNlY29uZHMgLyAxMDAwIC8gNjAgLyA2MDtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBmdWxsQmVnaW5Ib3Vyc0FycmF5KGNoZWNrRW5kVmFsdWU/KSB7XG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcbiAgICAgIHRoaXMuYmVnaW5Ib3VycyA9IEFycmF5LmZyb20oXG4gICAgICAgIHtcbiAgICAgICAgICBsZW5ndGg6XG4gICAgICAgICAgICAodGhpcy5lbmRIb3VyRm9ybUNvbnRyb2wudmFsdWUgLSAwKSAvIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpICsgMVxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iZWdpbkhvdXJzID0gQXJyYXkuZnJvbShcbiAgICAgICAgeyBsZW5ndGg6ICgyMyAtIDApIC8gdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KCkgKyAxIH0sXG4gICAgICAgIChfLCBpKSA9PiAwICsgaSAqIHRoaXMuaGFuZGxlSG91ckluY3JlbWVudCgpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuYmVnaW5WYWx1ZS5nZXRIb3VycygpKTtcbiAgfVxuXG4gIGZ1bGxFbmRIb3Vyc0FycmF5KGNoZWNrRW5kVmFsdWU/KSB7XG4gICAgaWYgKGNoZWNrRW5kVmFsdWUpIHtcbiAgICAgIHRoaXMuZW5kSG91cnMgPSBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgbGVuZ3RoOlxuICAgICAgICAgICAgKDIzIC0gdGhpcy5iZWdpbkhvdXJGb3JtQ29udHJvbC52YWx1ZSkgL1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKSArXG4gICAgICAgICAgICAxXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PlxuICAgICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wudmFsdWUgKyBpICogdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kSG91cnMgPSBBcnJheS5mcm9tKFxuICAgICAgICB7IGxlbmd0aDogKDIzIC0gMCkgLyB0aGlzLmhhbmRsZUhvdXJJbmNyZW1lbnQoKSArIDEgfSxcbiAgICAgICAgKF8sIGkpID0+IDAgKyBpICogdGhpcy5oYW5kbGVIb3VySW5jcmVtZW50KClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZW5kSG91ckZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZW5kVmFsdWUuZ2V0SG91cnMoKSk7XG4gIH1cblxuICBmdWxsQmVnaW5NaW51dGVzQXJyYXkoY2hlY2tFbmRWYWx1ZT8pIHtcbiAgICBpZiAoY2hlY2tFbmRWYWx1ZSkge1xuICAgICAgdGhpcy5iZWdpbk1pbnV0ZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgbGVuZ3RoOlxuICAgICAgICAgICAgKHRoaXMuZW5kTWludXRlRm9ybUNvbnRyb2wudmFsdWUgLSAwKSAvXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgK1xuICAgICAgICAgICAgMVxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gMCArIGkgKiB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJlZ2luTWludXRlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXG4gICAgICAgIChfLCBpKSA9PiAwICsgaSAqIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmJlZ2luVmFsdWUuZ2V0TWludXRlcygpKTtcbiAgfVxuXG4gIGZ1bGxFbmRNaW51dGVzQXJyYXkoY2hlY2tFbmRWYWx1ZT8pIHtcbiAgICBpZiAoY2hlY2tFbmRWYWx1ZSkge1xuICAgICAgdGhpcy5lbmRNaW51dGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgIGxlbmd0aDpcbiAgICAgICAgICAgICg1OSAtIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC52YWx1ZSkgL1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1pbnV0ZUluY3JlbWVudCgpICtcbiAgICAgICAgICAgIDFcbiAgICAgICAgfSxcbiAgICAgICAgKF8sIGkpID0+XG4gICAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLnZhbHVlICsgaSAqIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kTWludXRlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHsgbGVuZ3RoOiAoNTkgLSAwKSAvIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KCkgKyAxIH0sXG4gICAgICAgIChfLCBpKSA9PiAwICsgaSAqIHRoaXMuaGFuZGxlTWludXRlSW5jcmVtZW50KClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZW5kTWludXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZS5nZXRNaW51dGVzKCkpO1xuICB9XG5cbiAgdXBkYXRlSG91cnNNaW51dGVzQXJyYXkoKSB7XG4gICAgY29uc3QgYmVnaW5UbXAgPSBuZXcgRGF0ZSh0aGlzLmJlZ2luVmFsdWUpO1xuICAgIGNvbnN0IGVuZFRtcCA9IG5ldyBEYXRlKHRoaXMuZW5kVmFsdWUpO1xuICAgIGlmIChiZWdpblRtcC5zZXRIb3VycygwLCAwKSA9PT0gZW5kVG1wLnNldEhvdXJzKDAsIDApKSB7XG4gICAgICB0aGlzLmZ1bGxCZWdpbkhvdXJzQXJyYXkodHJ1ZSk7XG4gICAgICB0aGlzLmZ1bGxFbmRIb3Vyc0FycmF5KHRydWUpO1xuICAgICAgaWYgKHRoaXMuYmVnaW5WYWx1ZS5nZXRIb3VycygpID09PSB0aGlzLmVuZFZhbHVlLmdldEhvdXJzKCkpIHtcbiAgICAgICAgdGhpcy5mdWxsQmVnaW5NaW51dGVzQXJyYXkodHJ1ZSk7XG4gICAgICAgIHRoaXMuZnVsbEVuZE1pbnV0ZXNBcnJheSh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mdWxsQmVnaW5Ib3Vyc0FycmF5KCk7XG4gICAgICB0aGlzLmZ1bGxFbmRIb3Vyc0FycmF5KCk7XG4gICAgICB0aGlzLmZ1bGxCZWdpbk1pbnV0ZXNBcnJheSgpO1xuICAgICAgdGhpcy5mdWxsRW5kTWludXRlc0FycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZXMoKSB7XG4gICAgdGhpcy5jaGFuZ2VUZW1wb3JhbFByb3BlcnR5KHRoaXMuYmVnaW5WYWx1ZSwgMSwgZmFsc2UpO1xuICAgIHRoaXMuY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eSh0aGlzLmVuZFZhbHVlLCAyLCB0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0cmljdGVkVG9TdGVwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIucmVzdHJpY3RUb1N0ZXBcbiAgICAgID8gdGhpcy5jdXJyZW50RmlsdGVyLnJlc3RyaWN0VG9TdGVwXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZU1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmlsdGVyLmJlZ2luXG4gICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5iZWdpblxuICAgICAgOiB0aGlzLmRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlXG4gICAgICAgID8gdGhpcy5kYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZVxuICAgICAgICA6IHRoaXMuX2RlZmF1bHRNaW47XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTWF4KCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXIuZW5kXG4gICAgICA/IHRoaXMuY3VycmVudEZpbHRlci5lbmRcbiAgICAgIDogdGhpcy5kYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZVxuICAgICAgICA/IHRoaXMuZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGVcbiAgICAgICAgOiB0aGlzLl9kZWZhdWx0TWF4O1xuICB9XG5cbiAgY2hhbmdlUHJvcGVydHlCeVBhc3MoZXZlbnQpIHtcbiAgICB0aGlzLmNoYW5nZVByb3BlcnR5Lm5leHQoZXZlbnQpO1xuICB9XG5cbiAgbW9kZUNoYW5nZShldmVudCkge1xuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICBzZXRGaWx0ZXJTdGF0ZURpc2FibGUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEZpbHRlcikge1xuICAgICAgdGhpcy5maWx0ZXJTdGF0ZURpc2FibGUgPSAhdGhpcy5jdXJyZW50RmlsdGVyLmFjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJTdGF0ZURpc2FibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJUeXBlKCkgPT09ICdkYXRldGltZScpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclN0YXRlRGlzYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmJlZ2luSG91ckZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5iZWdpbk1pbnV0ZUZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5lbmRIb3VyRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLmVuZE1pbnV0ZUZvcm1Db250cm9sLmRpc2FibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmVnaW5Ib3VyRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuYmVnaW5NaW51dGVGb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5lbmRIb3VyRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuZW5kTWludXRlRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldERhdGVGcm9tU3RyaW5nV2l0aG91dFRpbWUoc3RyaW5nRGF0ZTogc3RyaW5nKTogRGF0ZSB7XG4gICAgLy8gd2FybmluZyBjcmVhdGUgZGF0ZSB3aXRoIG5vIHRpbWUgbWFrZSBhIGRhdGUgVVRDIHdpdGggVFogYW5kIHRoZSBkYXRlIGNyZWF0ZSBtYXliZSBub3QgdGhlIHNhbWUgeWVhciwgbW9udGggYW5kIGRheVxuICAgIC8vIGV4ZW1wbGU6XG4gICAgLy8gbmV3IERhdGUoJzIwMjItMDEtMDEnKSAtPiBGcmkgRGVjIDMxIDIwMjEgMTk6MDA6MDAgR01ULTA1MDAgKGhldXJlIG5vcm1hbGUgZGUgbOKAmUVzdCBub3JkLWFtw6lyaWNhaW4pXG4gICAgLy8gdG8gY3JlYXRlIHNhbWUgZGF0ZSBhcyBzdHJpbmcsIGFkZCB0aW1lIDAwIGluIHRoZSBjcmVhdGlvblxuICAgIC8vIG5ldyBEYXRlKCcyMDIyLTAxLTAxIDAwOjAwOjAwJykgLT4gU2F0IEphbiAwMSAyMDIyIDAwOjAwOjAwIEdNVC0wNTAwIChoZXVyZSBub3JtYWxlIGRlIGzigJlFc3Qgbm9yZC1hbcOpcmljYWluKVxuICAgIGxldCB5ZWFyO1xuICAgIGxldCBtb250aCA9ICcwMSc7XG4gICAgbGV0IGRheSA9ICcwMSc7XG4gICAgaWYgKHN0cmluZ0RhdGUubGVuZ3RoID09PSAxMCkge1xuICAgICAgY29uc3QgZGF0ZUl0ZW1zID0gc3RyaW5nRGF0ZS5zcGxpdCgnLScpO1xuICAgICAgaWYgKGRhdGVJdGVtcy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdFcnJvciBpbiBjb25maWcgZGF0ZSBiZWdpbi1lbmQgZm9yIG9nY0ZpbHRlcjogRGF0ZSB3aXRob3V0IHRpbWUgZm9ybWF0IG5lZWQgdG8gYmUgWVlZWS1NTS1ERCBvciBZWVlZJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeWVhciA9IGRhdGVJdGVtc1swXTtcbiAgICAgICAgbW9udGggPSBkYXRlSXRlbXNbMV07XG4gICAgICAgIGRheSA9IGRhdGVJdGVtc1syXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0cmluZ0RhdGUubGVuZ3RoID09PSA0KSB7XG4gICAgICB5ZWFyID0gc3RyaW5nRGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cmluZ0RhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoYCR7eWVhcn0tJHttb250aH0tJHtkYXl9IDAwOjAwOjAwYCk7XG4gIH1cblxuICByZXNldEZpbHRlcigpIHtcbiAgICBsZXQgbWluRGVmYXVsdERhdGU7XG4gICAgbGV0IG1heERlZmF1bHREYXRlO1xuICAgIGxldCBtaW5EZWZhdWx0SVNPU3RyaW5nO1xuICAgIGxldCBtYXhEZWZhdWx0SVNPU3RyaW5nO1xuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJUeXBlWWVhcikge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyT3JpZ2luQ29uZmlnLmVuZCA9PT0gJ3RvZGF5Jykge1xuICAgICAgICBjb25zdCB0b2RheURhdGVTdHJpbmdOb1RpbWUgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKTsgLy8gJzIwMjItMDItMTMnXG4gICAgICAgIG1heERlZmF1bHRJU09TdHJpbmcgPSBgJHt0b2RheURhdGVTdHJpbmdOb1RpbWUuc3Vic3RyaW5nKDAsIDQpfS0wMS0wMWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhEZWZhdWx0SVNPU3RyaW5nID0gYCR7dGhpcy5maWx0ZXJPcmlnaW5Db25maWcuZW5kLnN1YnN0cmluZygwLCA0KX0tMDEtMDFgO1xuICAgICAgfVxuICAgICAgbWluRGVmYXVsdElTT1N0cmluZyA9IGAke3RoaXMuZmlsdGVyT3JpZ2luQ29uZmlnLmJlZ2luLnN1YnN0cmluZygwLCA0KX0tMDEtMDFgO1xuICAgICAgbWluRGVmYXVsdERhdGUgPSB0aGlzLmdldERhdGVGcm9tU3RyaW5nV2l0aG91dFRpbWUobWluRGVmYXVsdElTT1N0cmluZyk7XG4gICAgICBtYXhEZWZhdWx0RGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmdXaXRob3V0VGltZShtYXhEZWZhdWx0SVNPU3RyaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWluRGVmYXVsdERhdGUgPSB0aGlzLnBhcnNlRmlsdGVyKHRoaXMuZmlsdGVyT3JpZ2luQ29uZmlnLmJlZ2luKTtcbiAgICAgIG1heERlZmF1bHREYXRlID0gdGhpcy5wYXJzZUZpbHRlcih0aGlzLmZpbHRlck9yaWdpbkNvbmZpZy5lbmQpO1xuICAgICAgbWluRGVmYXVsdElTT1N0cmluZyA9IG1pbkRlZmF1bHREYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgICBtYXhEZWZhdWx0SVNPU3RyaW5nID0gbWF4RGVmYXVsdERhdGUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuYmVnaW4gIT09IG1pbkRlZmF1bHRJU09TdHJpbmcgfHxcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlci5lbmQgIT09IG1heERlZmF1bHRJU09TdHJpbmdcbiAgICApIHtcbiAgICAgIHRoaXMuYmVnaW5WYWx1ZSA9IG1pbkRlZmF1bHREYXRlO1xuICAgICAgdGhpcy5lbmRWYWx1ZSA9IG1heERlZmF1bHREYXRlO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVGaWx0ZXJTdGF0ZSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50RmlsdGVyLmFjdGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jdXJyZW50RmlsdGVyLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRGaWx0ZXJTdGF0ZURpc2FibGUoKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlcygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtY29udGFpbmVyXCI+XG4gIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgKm5nSWY9XCJ0aGlzLmN1cnJlbnRGaWx0ZXIuc2xpZGVyT3B0aW9ucz8uZW5hYmxlZFwiXG4gICAgWyhuZ01vZGVsKV09XCJzbGlkZXJNb2RlXCJcbiAgICAoY2hhbmdlKT1cIm1vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICB7eyAnaWdvLmdlby5maWx0ZXIuc2xpZGVyTW9kZVRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L21hdC1zbGlkZS10b2dnbGU+XG5cbiAgPGRpdiBjbGFzcz1cInNsaWRlci1jb250YWluZXJcIiAqbmdJZj1cInNsaWRlck1vZGVcIj5cbiAgICA8aWdvLW9nYy1maWx0ZXItdGltZS1zbGlkZXJcbiAgICAgIFtiZWdpbl09XCJiZWdpblZhbHVlXCJcbiAgICAgIFttYXhdPVwidGhpcy5yZXN0cmljdGVkVG9TdGVwKCkgPyB0aGlzLm1heERhdGUgOiB0aGlzLmVuZFZhbHVlXCJcbiAgICAgIFtjdXJyZW50RmlsdGVyXT1cImN1cnJlbnRGaWx0ZXJcIlxuICAgICAgW2RhdGFzb3VyY2VdPVwiZGF0YXNvdXJjZVwiXG4gICAgICAoY2hhbmdlUHJvcGVydHkpPVwiY2hhbmdlUHJvcGVydHlCeVBhc3MoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvaWdvLW9nYy1maWx0ZXItdGltZS1zbGlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCIhc2xpZGVyTW9kZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ5ZWFyLWlucHV0LWNvbnRhaW5lclwiICpuZ0lmPVwiY2FsZW5kYXJUeXBlWWVhclwiPlxuICAgICAgPCEtLSB0byBlbXVsYXRlIGEgeWVhci1waWNrZXIsIDIgaW5wdXQ6IGZpcnN0IGlucHV0IHRvIHNob3cgdXNlciBqdXN0IHllYXIgYW5kIHNlY29uZCBpbnB1dCBoaWRlbiBhbmQgYmluZCBcbiAgICAgICAgd2l0aCB0aGUgZGF0ZXBpY2tlciAgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ5ZWFyLWlucHV0XCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuc3RhcnRZZWFyJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIGNsYXNzPVwieWVhci1pbnB1dC1vbmx5LXllYXJcIlxuICAgICAgICAgIHZhbHVlPVwie3sgb25seVllYXJCZWdpbiB9fVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ5ZWFyT25seUlucHV0Q2hhbmdlKCRldmVudCwgYmVnaW5EYXRlcGlja2VyLCAnYmVnaW4nKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICBbZm9yXT1cImJlZ2luRGF0ZXBpY2tlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cblxuICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICBwYW5lbENsYXNzPVwiZGF0ZXBpY2tlci15ZWFyXCJcbiAgICAgICAgICAjYmVnaW5EYXRlcGlja2VyXG4gICAgICAgICAgW3N0YXJ0Vmlld109XCJjYWxlbmRhclZpZXcoKVwiXG4gICAgICAgICAgW3N0YXJ0QXRdPVwiYmVnaW5WYWx1ZVwiXG4gICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJ5ZWFyU2VsZWN0ZWQoJGV2ZW50LCBiZWdpbkRhdGVwaWNrZXIsICdiZWdpbicpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxuXG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICNiZWdpblllYXJcbiAgICAgICAgICBjbGFzcz1cInllYXItaW5wdXQtaGlkZVwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJiZWdpbkRhdGVwaWNrZXJcIlxuICAgICAgICAgIGVuYWJsZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiXG4gICAgICAgICAgICBiZWdpblZhbHVlID8gYmVnaW5WYWx1ZSA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbbWluXT1cImhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXCJcbiAgICAgICAgICBbbWF4XT1cIlxuICAgICAgICAgICAgZW5kVmFsdWUgJiYgIXJlc3RyaWN0ZWRUb1N0ZXAoKVxuICAgICAgICAgICAgICA/IGVuZFZhbHVlXG4gICAgICAgICAgICAgIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwieWVhci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnaWdvLmdlby50aW1lRmlsdGVyLmVuZFllYXInIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgY2xhc3M9XCJ5ZWFyLWlucHV0LW9ubHkteWVhclwiXG4gICAgICAgICAgdmFsdWU9XCJ7eyBvbmx5WWVhckVuZCB9fVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ5ZWFyT25seUlucHV0Q2hhbmdlKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxuICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgIFtmb3JdPVwiZW5kRGF0ZXBpY2tlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyXG4gICAgICAgICAgcGFuZWxDbGFzcz1cImRhdGVwaWNrZXIteWVhclwiXG4gICAgICAgICAgI2VuZERhdGVwaWNrZXJcbiAgICAgICAgICBbc3RhcnRWaWV3XT1cImNhbGVuZGFyVmlldygpXCJcbiAgICAgICAgICBbc3RhcnRBdF09XCJlbmRWYWx1ZVwiXG4gICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJ5ZWFyU2VsZWN0ZWQoJGV2ZW50LCBlbmREYXRlcGlja2VyLCAnZW5kJylcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2VuZFllYXJcbiAgICAgICAgICBjbGFzcz1cInllYXItaW5wdXQtaGlkZVwiXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJlbmREYXRlcGlja2VyXCJcbiAgICAgICAgICBlbmFibGVkPVwiZmFsc2VcIlxuICAgICAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVuZFZhbHVlID8gZW5kVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5tYXhEYXRlKVwiXG4gICAgICAgICAgW21pbl09XCJcbiAgICAgICAgICAgIGJlZ2luVmFsdWUgPyBiZWdpblZhbHVlIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWluRGF0ZSlcbiAgICAgICAgICBcIlxuICAgICAgICAgIFttYXhdPVwiaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcIlxuICAgICAgICAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci5yZXNldEZpbHRlcnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyByZXNldEljb24gfX08L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1maWx0ZXItc3RhdGVcIlxuICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlRmlsdGVyU3RhdGUoKVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZmlsdGVyLnRvZ2dsZUZpbHRlclN0YXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCIhZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkYXRldGltZS1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cImNhbGVuZGFyVHlwZSgpICE9PSAneWVhcidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRldGltZS1pbnB1dFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkYXRlLWlucHV0XCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2Zvcl09XCJiZWdpbkRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgICAgPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI2JlZ2luXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiYmVnaW5EYXRlcGlja2VyXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInaWdvLmdlby50aW1lRmlsdGVyLnN0YXJ0RGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoYmVnaW4udmFsdWUsIDEpXCJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImZpbHRlckJlZ2luRnVuY3Rpb25cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIlxuICAgICAgICAgICAgICBiZWdpblZhbHVlID8gYmVnaW5WYWx1ZSA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1pbkRhdGUpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21pbl09XCJoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlKVwiXG4gICAgICAgICAgICBbbWF4XT1cIlxuICAgICAgICAgICAgICBlbmRWYWx1ZSAmJiAhcmVzdHJpY3RlZFRvU3RlcCgpXG4gICAgICAgICAgICAgICAgPyBlbmRWYWx1ZVxuICAgICAgICAgICAgICAgIDogaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsbGVyXCI+PC9zcGFuPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlclxuICAgICAgICAgICAgI2JlZ2luRGF0ZXBpY2tlclxuICAgICAgICAgICAgW3N0YXJ0Vmlld109XCJjYWxlbmRhclZpZXcoKVwiXG4gICAgICAgICAgICBbc3RhcnRBdF09XCJiZWdpblZhbHVlXCJcbiAgICAgICAgICAgICh5ZWFyU2VsZWN0ZWQpPVwieWVhclNlbGVjdGVkKCRldmVudCwgYmVnaW5EYXRlcGlja2VyLCAnYmVnaW4nKVwiXG4gICAgICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJtb250aFNlbGVjdGVkKCRldmVudCwgYmVnaW5EYXRlcGlja2VyLCAnYmVnaW4nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNhbGVuZGFyVHlwZSgpID09PSAnZGF0ZXRpbWUnXCIgY2xhc3M9XCJ0aW1lLWlucHV0XCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaG91ci1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2lnby5nZW8udGltZUZpbHRlci5ob3VyJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImJlZ2luSG91ckZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGJlZ2luLnZhbHVlLCAxKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGJlZ2luSG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7XG4gICAgICAgICAgICAgICAgaG91clxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1pbnV0ZS1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2lnby5nZW8udGltZUZpbHRlci5taW51dGUnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiYmVnaW5NaW51dGVGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cIiFjdXJyZW50RmlsdGVyLmFjdGl2ZVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShiZWdpbi52YWx1ZSwgMSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgYmVnaW5NaW51dGVzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwibWludXRlXCJcbiAgICAgICAgICAgICAgICA+e3sgbWludXRlIH19PC9tYXQtb3B0aW9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiIXJlc3RyaWN0ZWRUb1N0ZXAoKVwiIGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGF0ZS1pbnB1dFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIFtmb3JdPVwiZW5kRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyU3RhdGVEaXNhYmxlXCJcbiAgICAgICAgICA+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjZW5kXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZW5kRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2lnby5nZW8udGltZUZpbHRlci5lbmREYXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCIhY3VycmVudEZpbHRlci5hY3RpdmVcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiY2hhbmdlVGVtcG9yYWxQcm9wZXJ0eShlbmQudmFsdWUsIDIpXCJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImZpbHRlckVuZEZ1bmN0aW9uXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJcbiAgICAgICAgICAgICAgZW5kVmFsdWUgPyBlbmRWYWx1ZSA6IGhhbmRsZURhdGUoZGF0YXNvdXJjZS5vcHRpb25zLm1heERhdGUpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21pbl09XCJcbiAgICAgICAgICAgICAgYmVnaW5WYWx1ZSA/IGJlZ2luVmFsdWUgOiBoYW5kbGVEYXRlKGRhdGFzb3VyY2Uub3B0aW9ucy5taW5EYXRlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFttYXhdPVwiaGFuZGxlRGF0ZShkYXRhc291cmNlLm9wdGlvbnMubWF4RGF0ZSlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclN0YXRlRGlzYWJsZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGxlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICAgICNlbmREYXRlcGlja2VyXG4gICAgICAgICAgICBbc3RhcnRWaWV3XT1cImNhbGVuZGFyVmlldygpXCJcbiAgICAgICAgICAgIFtzdGFydEF0XT1cImVuZFZhbHVlXCJcbiAgICAgICAgICAgICh5ZWFyU2VsZWN0ZWQpPVwieWVhclNlbGVjdGVkKCRldmVudCwgZW5kRGF0ZXBpY2tlciwgJ2VuZCcpXCJcbiAgICAgICAgICAgIChtb250aFNlbGVjdGVkKT1cIm1vbnRoU2VsZWN0ZWQoJGV2ZW50LCBlbmREYXRlcGlja2VyLCAnZW5kJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L21hdC1kYXRlcGlja2VyPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYWxlbmRhclR5cGUoKSA9PT0gJ2RhdGV0aW1lJ1wiIGNsYXNzPVwidGltZS1pbnB1dFwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImhvdXItaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIuaG91cicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJlbmRIb3VyRm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCIhY3VycmVudEZpbHRlci5hY3RpdmVcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZVRlbXBvcmFsUHJvcGVydHkoZW5kLnZhbHVlLCAyKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGVuZEhvdXJzXCIgW3ZhbHVlXT1cImhvdXJcIj57e1xuICAgICAgICAgICAgICAgIGhvdXJcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtaW51dGUtaW5wdXRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLnRpbWVGaWx0ZXIubWludXRlJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImVuZE1pbnV0ZUZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiIWN1cnJlbnRGaWx0ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VUZW1wb3JhbFByb3BlcnR5KGVuZC52YWx1ZSwgMilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWludXRlIG9mIGVuZE1pbnV0ZXNcIiBbdmFsdWVdPVwibWludXRlXCI+e3tcbiAgICAgICAgICAgICAgICBtaW51dGVcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZmlsdGVyLnJlc2V0RmlsdGVycycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJTdGF0ZURpc2FibGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPnt7IHJlc2V0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWZpbHRlci1zdGF0ZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVGaWx0ZXJTdGF0ZSgpXCJcbiAgICAgICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmZpbHRlci50b2dnbGVGaWx0ZXJTdGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtjaGVja2VkXT1cIiFmaWx0ZXJTdGF0ZURpc2FibGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|