@carto/kepler.gl 0.0.77 → 0.0.78-0
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/README.md +652 -42
- package/dist/actions/action-wrapper.js +49 -21
- package/dist/actions/actions.js +30 -16
- package/dist/actions/identity-actions.js +28 -14
- package/dist/actions/index.js +24 -7
- package/dist/actions/map-state-actions.js +27 -12
- package/dist/actions/map-style-actions.js +69 -31
- package/dist/actions/provider-actions.js +81 -44
- package/dist/actions/ui-state-actions.js +166 -71
- package/dist/actions/vis-state-actions.js +78 -106
- package/dist/cloud-providers/index.js +8 -8
- package/dist/cloud-providers/provider.js +109 -63
- package/dist/components/bottom-widget.js +58 -53
- package/dist/components/common/action-panel.js +41 -44
- package/dist/components/common/animation-control/animation-control.js +44 -44
- package/dist/components/common/animation-control/animation-controller.js +109 -55
- package/dist/components/common/animation-control/animation-speed-slider.js +38 -29
- package/dist/components/common/animation-control/floating-time-display.js +73 -58
- package/dist/components/common/animation-control/playback-controls.js +81 -67
- package/dist/components/common/animation-control/speed-control.js +24 -26
- package/dist/components/common/checkbox.js +54 -49
- package/dist/components/common/color-legend.js +71 -51
- package/dist/components/common/data-table/button.js +23 -30
- package/dist/components/common/data-table/canvas.js +10 -21
- package/dist/components/common/data-table/cell-size.js +58 -54
- package/dist/components/common/data-table/grid.js +51 -35
- package/dist/components/common/data-table/index.js +150 -109
- package/dist/components/common/data-table/option-dropdown.js +33 -29
- package/dist/components/common/dataset-label.js +15 -23
- package/dist/components/common/error-boundary.js +30 -25
- package/dist/components/common/field-selector.js +67 -67
- package/dist/components/common/field-token.js +17 -22
- package/dist/components/common/file-uploader/file-drop.js +66 -46
- package/dist/components/common/file-uploader/file-upload-progress.js +32 -33
- package/dist/components/common/file-uploader/file-upload.js +91 -52
- package/dist/components/common/file-uploader/upload-button.js +56 -82
- package/dist/components/common/histogram-plot.js +37 -35
- package/dist/components/common/icons/add.js +26 -32
- package/dist/components/common/icons/anchor_window.js +8 -8
- package/dist/components/common/icons/arrow-down-alt.js +26 -32
- package/dist/components/common/icons/arrow-down-solid.js +58 -0
- package/dist/components/common/icons/arrow-down.js +26 -32
- package/dist/components/common/icons/arrow-left.js +26 -32
- package/dist/components/common/icons/arrow-right.js +26 -32
- package/dist/components/common/icons/arrow-up-alt.js +26 -32
- package/dist/components/common/icons/arrow-up-solid.js +26 -32
- package/dist/components/common/icons/arrow-up.js +26 -32
- package/dist/components/common/icons/base.js +42 -52
- package/dist/components/common/icons/bug.js +26 -32
- package/dist/components/common/icons/cancel.js +26 -32
- package/dist/components/common/icons/checkmark.js +27 -32
- package/dist/components/common/icons/chevron-right.js +27 -27
- package/dist/components/common/icons/clipboard.js +26 -32
- package/dist/components/common/icons/clock.js +26 -32
- package/dist/components/common/icons/close.js +26 -32
- package/dist/components/common/icons/code-alt.js +27 -32
- package/dist/components/common/icons/copy.js +27 -32
- package/dist/components/common/icons/crosshairs.js +27 -32
- package/dist/components/common/icons/cube-3d.js +26 -32
- package/dist/components/common/icons/cursor-click.js +26 -32
- package/dist/components/common/icons/data-table.js +26 -32
- package/dist/components/common/icons/db.js +26 -32
- package/dist/components/common/icons/delete.js +26 -31
- package/dist/components/common/icons/docs.js +26 -32
- package/dist/components/common/icons/drag-n-drop.js +26 -32
- package/dist/components/common/icons/draw-polygon.js +26 -35
- package/dist/components/common/icons/email.js +26 -32
- package/dist/components/common/icons/expand.js +26 -32
- package/dist/components/common/icons/eye-seen.js +26 -32
- package/dist/components/common/icons/eye-unseen.js +26 -32
- package/dist/components/common/icons/file-type.js +16 -23
- package/dist/components/common/icons/file.js +26 -32
- package/dist/components/common/icons/files.js +25 -29
- package/dist/components/common/icons/filter-funnel.js +26 -32
- package/dist/components/common/icons/free-window.js +8 -8
- package/dist/components/common/icons/gear.js +26 -32
- package/dist/components/common/icons/hash.js +26 -32
- package/dist/components/common/icons/histogram.js +24 -28
- package/dist/components/common/icons/index.js +154 -63
- package/dist/components/common/icons/info.js +27 -32
- package/dist/components/common/icons/layers.js +26 -32
- package/dist/components/common/icons/left-arrow.js +27 -32
- package/dist/components/common/icons/legend.js +26 -32
- package/dist/components/common/icons/line-chart.js +26 -31
- package/dist/components/common/icons/login.js +26 -31
- package/dist/components/common/icons/logout.js +26 -31
- package/dist/components/common/icons/map-icon.js +27 -33
- package/dist/components/common/icons/map.js +27 -33
- package/dist/components/common/icons/messages.js +26 -32
- package/dist/components/common/icons/minus.js +26 -32
- package/dist/components/common/icons/order-by-dataset.js +56 -0
- package/dist/components/common/icons/order-by-list.js +48 -0
- package/dist/components/common/icons/pause.js +26 -32
- package/dist/components/common/icons/picture.js +25 -29
- package/dist/components/common/icons/pin.js +35 -33
- package/dist/components/common/icons/play.js +26 -32
- package/dist/components/common/icons/polygon.js +26 -35
- package/dist/components/common/icons/rectangle.js +26 -35
- package/dist/components/common/icons/reduce.js +26 -32
- package/dist/components/common/icons/reset.js +26 -32
- package/dist/components/common/icons/rocket.js +26 -32
- package/dist/components/common/icons/save.js +26 -32
- package/dist/components/common/icons/save2.js +26 -32
- package/dist/components/common/icons/search.js +26 -32
- package/dist/components/common/icons/settings.js +26 -32
- package/dist/components/common/icons/share.js +26 -32
- package/dist/components/common/icons/split.js +26 -32
- package/dist/components/common/icons/square-select.js +26 -32
- package/dist/components/common/icons/swap-horizontal.js +28 -27
- package/dist/components/common/icons/table.js +26 -31
- package/dist/components/common/icons/trash.js +26 -32
- package/dist/components/common/icons/upload.js +26 -33
- package/dist/components/common/icons/vert-dots.js +26 -32
- package/dist/components/common/icons/vert-three-dots.js +26 -32
- package/dist/components/common/icons/warning.js +27 -32
- package/dist/components/common/image-preview.js +27 -35
- package/dist/components/common/info-helper.js +23 -32
- package/dist/components/common/item-selector/accessor.js +5 -3
- package/dist/components/common/item-selector/chickleted-input.js +42 -62
- package/dist/components/common/item-selector/dropdown-list.js +95 -72
- package/dist/components/common/item-selector/item-selector-submenu.js +38 -29
- package/dist/components/common/item-selector/item-selector.js +102 -89
- package/dist/components/common/item-selector/typeahead.js +118 -86
- package/dist/components/common/line-chart.js +44 -46
- package/dist/components/common/loading-spinner.js +23 -33
- package/dist/components/common/logo.js +24 -36
- package/dist/components/common/map-layer-selector.js +14 -22
- package/dist/components/common/modal.js +62 -50
- package/dist/components/common/portaled.js +109 -64
- package/dist/components/common/progress-bar.js +17 -28
- package/dist/components/common/range-brush.js +132 -84
- package/dist/components/common/range-plot.js +51 -60
- package/dist/components/common/range-slider.js +88 -76
- package/dist/components/common/slider/mouse-event.js +88 -52
- package/dist/components/common/slider/slider-bar-handle.js +40 -39
- package/dist/components/common/slider/slider-handle.js +49 -45
- package/dist/components/common/slider/slider.js +107 -104
- package/dist/components/common/styled-components.js +183 -69
- package/dist/components/common/switch.js +14 -37
- package/dist/components/common/time-range-slider-time-title.js +19 -24
- package/dist/components/common/time-range-slider.js +39 -61
- package/dist/components/common/time-slider-marker.js +41 -36
- package/dist/components/common/tippy-tooltip.js +115 -0
- package/dist/components/common/toolbar-item.js +23 -25
- package/dist/components/common/toolbar.js +10 -21
- package/dist/components/common/vertical-toolbar.js +10 -21
- package/dist/components/container.js +94 -66
- package/dist/components/context.js +10 -6
- package/dist/components/editor/constants.js +8 -6
- package/dist/components/editor/editor.js +77 -62
- package/dist/components/editor/feature-action-panel.js +50 -47
- package/dist/components/editor/feature-styles.js +42 -37
- package/dist/components/editor/handle-style.js +39 -37
- package/dist/components/filters/components.js +10 -21
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +27 -19
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/new-filter-panel.js +23 -19
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +28 -21
- package/dist/components/filters/filter-panels/range-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +18 -18
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +24 -19
- package/dist/components/filters/filter-panels/types.js +6 -0
- package/dist/components/filters/index.js +17 -11
- package/dist/components/filters/multi-select-filter.js +9 -3
- package/dist/components/filters/polygon-filter.js +19 -10
- package/dist/components/filters/range-filter.js +9 -4
- package/dist/components/filters/single-select-filter.js +9 -3
- package/dist/components/filters/time-range-filter.js +18 -7
- package/dist/components/filters/time-widget.js +51 -42
- package/dist/components/filters/types.js +6 -0
- package/dist/components/geocoder/geocoder.js +134 -100
- package/dist/components/geocoder-panel.js +79 -57
- package/dist/components/index.js +591 -356
- package/dist/components/injector.js +58 -42
- package/dist/components/kepler-gl.js +171 -82
- package/dist/components/map/coordinate-info.js +13 -4
- package/dist/components/map/layer-hover-info.js +46 -39
- package/dist/components/map/layer-selector-panel.js +30 -17
- package/dist/components/map/locale-panel.js +43 -23
- package/dist/components/map/map-control-panel.js +43 -30
- package/dist/components/map/map-control-toolbar.js +11 -21
- package/dist/components/map/map-control-tooltip.js +13 -6
- package/dist/components/map/map-control.js +28 -27
- package/dist/components/map/map-draw-panel.js +48 -23
- package/dist/components/map/map-legend-panel.js +138 -77
- package/dist/components/map/map-legend.js +82 -55
- package/dist/components/map/map-popover.js +58 -42
- package/dist/components/map/split-map-button.js +40 -25
- package/dist/components/map/toggle-3d-button.js +37 -22
- package/dist/components/map-container.js +164 -144
- package/dist/components/maps-layout.js +29 -25
- package/dist/components/modal-container.js +116 -89
- package/dist/components/modals/add-map-style-modal.js +66 -46
- package/dist/components/modals/cloud-tile.js +36 -36
- package/dist/components/modals/data-table-modal.js +96 -60
- package/dist/components/modals/delete-data-modal.js +20 -24
- package/dist/components/modals/error-display.js +10 -3
- package/dist/components/modals/export-data-modal.js +59 -57
- package/dist/components/modals/export-image-modal.js +28 -31
- package/dist/components/modals/export-map-modal/components.js +27 -27
- package/dist/components/modals/export-map-modal/export-html-map.js +27 -28
- package/dist/components/modals/export-map-modal/export-json-map.js +43 -30
- package/dist/components/modals/export-map-modal/export-map-modal.js +41 -34
- package/dist/components/modals/image-modal-container.js +19 -14
- package/dist/components/modals/load-data-modal.js +35 -31
- package/dist/components/modals/load-storage-map.js +79 -44
- package/dist/components/modals/loading-dialog.js +18 -24
- package/dist/components/modals/modal-dialog.js +7 -3
- package/dist/components/modals/modal-tabs.js +29 -29
- package/dist/components/modals/overwrite-map-modal.js +28 -29
- package/dist/components/modals/provider-modal-container.js +32 -35
- package/dist/components/modals/save-map-modal.js +51 -47
- package/dist/components/modals/share-map-modal.js +63 -55
- package/dist/components/modals/status-panel.js +25 -24
- package/dist/components/modals/storage-map-viewer.js +43 -38
- package/dist/components/notification-panel/notification-item.js +46 -41
- package/dist/components/notification-panel.js +32 -35
- package/dist/components/performance.js +36 -11
- package/dist/components/plot-container.js +76 -60
- package/dist/components/side-panel/cloud-storage-dropdown.js +10 -4
- package/dist/components/side-panel/common/dataset-info.js +13 -20
- package/dist/components/side-panel/common/dataset-tag.js +49 -31
- package/dist/components/side-panel/common/dataset-title.js +91 -44
- package/dist/components/side-panel/common/source-data-catalog.js +26 -28
- package/dist/components/side-panel/common/source-data-selector.js +51 -37
- package/dist/components/side-panel/common/types.js +6 -0
- package/dist/components/side-panel/custom-panel.js +9 -5
- package/dist/components/side-panel/filter-manager.js +32 -30
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +29 -32
- package/dist/components/side-panel/filter-panel/filter-panel.js +58 -53
- package/dist/components/side-panel/interaction-manager.js +12 -5
- package/dist/components/side-panel/interaction-panel/brush-config.js +19 -23
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +58 -41
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +83 -47
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +46 -30
- package/dist/components/side-panel/layer-manager.js +132 -211
- package/dist/components/side-panel/layer-panel/add-layer-button.js +156 -0
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +11 -4
- package/dist/components/side-panel/layer-panel/color-palette.js +29 -41
- package/dist/components/side-panel/layer-panel/color-range-selector.js +164 -162
- package/dist/components/side-panel/layer-panel/color-selector.js +71 -60
- package/dist/components/side-panel/layer-panel/column-selector.js +27 -28
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +7 -3
- package/dist/components/side-panel/layer-panel/custom-palette.js +72 -48
- package/dist/components/side-panel/layer-panel/custom-picker.js +41 -40
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +87 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +69 -0
- package/dist/components/side-panel/layer-panel/dataset-section.js +91 -0
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +16 -8
- package/dist/components/side-panel/layer-panel/hex-column-config.js +34 -12
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +10 -2
- package/dist/components/side-panel/layer-panel/layer-column-config.js +26 -42
- package/dist/components/side-panel/layer-panel/layer-config-group.js +86 -52
- package/dist/components/side-panel/layer-panel/layer-configurator.js +249 -158
- package/dist/components/side-panel/layer-panel/layer-list.js +168 -0
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +70 -74
- package/dist/components/side-panel/layer-panel/layer-panel.js +58 -55
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +22 -28
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +18 -22
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -35
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +40 -35
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +123 -0
- package/dist/components/side-panel/layer-panel/single-color-palette.js +45 -77
- package/dist/components/side-panel/layer-panel/text-label-panel.js +45 -41
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +51 -60
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +163 -52
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +27 -38
- package/dist/components/side-panel/map-manager.js +45 -38
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +31 -28
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +24 -26
- package/dist/components/side-panel/panel-dropdown.js +34 -34
- package/dist/components/side-panel/panel-header-action.js +43 -51
- package/dist/components/side-panel/panel-header.js +105 -78
- package/dist/components/side-panel/panel-tab.js +20 -24
- package/dist/components/side-panel/panel-title.js +17 -22
- package/dist/components/side-panel/panel-toggle.js +21 -33
- package/dist/components/side-panel/side-bar.js +53 -44
- package/dist/components/side-panel.js +79 -68
- package/dist/components/types.js +6 -0
- package/dist/connect/keplergl-connect.js +14 -5
- package/dist/connect/with-local-selector.js +38 -33
- package/dist/constants/action-types.js +14 -5
- package/dist/constants/color-palette.js +23 -12
- package/dist/constants/color-ranges.js +31 -32
- package/dist/constants/custom-color-ranges.js +14 -9
- package/dist/constants/default-settings.js +265 -162
- package/dist/constants/index.js +103 -95
- package/dist/constants/keyevent.js +7 -3
- package/dist/constants/tooltip.js +10 -7
- package/dist/constants/user-feedbacks.js +6 -5
- package/dist/constants/user-guides.js +20 -12
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +33 -30
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +43 -10
- package/dist/deckgl-layers/3d-building-layer/types.js +6 -0
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +75 -54
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +34 -31
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +38 -38
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +38 -38
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +26 -12
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +152 -90
- package/dist/deckgl-layers/layer-utils/shader-utils.js +5 -1
- package/dist/deckgl-layers/line-layer/line-layer.js +40 -31
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +32 -27
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +42 -36
- package/dist/index.js +23 -4
- package/dist/layers/aggregation-layer.js +126 -76
- package/dist/layers/arc-layer/arc-layer-icon.js +27 -27
- package/dist/layers/arc-layer/arc-layer.js +85 -56
- package/dist/layers/base-layer.js +459 -288
- package/dist/layers/cluster-layer/cluster-layer-icon.js +27 -27
- package/dist/layers/cluster-layer/cluster-layer.js +45 -34
- package/dist/layers/default-layer-icon.js +27 -27
- package/dist/layers/geojson-layer/geojson-layer-icon.js +27 -27
- package/dist/layers/geojson-layer/geojson-layer.js +105 -60
- package/dist/layers/geojson-layer/geojson-utils.js +68 -39
- package/dist/layers/grid-layer/grid-layer-icon.js +27 -27
- package/dist/layers/grid-layer/grid-layer.js +42 -31
- package/dist/layers/grid-layer/grid-utils.js +15 -12
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +27 -27
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +92 -49
- package/dist/layers/h3-hexagon-layer/h3-utils.js +22 -11
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +27 -27
- package/dist/layers/heatmap-layer/heatmap-layer.js +81 -59
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +27 -27
- package/dist/layers/hexagon-layer/hexagon-layer.js +43 -31
- package/dist/layers/hexagon-layer/hexagon-utils.js +15 -3
- package/dist/layers/icon-layer/icon-info-modal.js +28 -24
- package/dist/layers/icon-layer/icon-layer-icon.js +27 -27
- package/dist/layers/icon-layer/icon-layer.js +115 -63
- package/dist/layers/index.js +39 -38
- package/dist/layers/layer-factory.js +83 -69
- package/dist/layers/layer-text-label.js +15 -9
- package/dist/layers/layer-update.js +21 -12
- package/dist/layers/line-layer/line-layer-icon.js +27 -27
- package/dist/layers/line-layer/line-layer.js +84 -63
- package/dist/layers/mapbox-utils.js +54 -48
- package/dist/layers/mapboxgl-layer.js +68 -45
- package/dist/layers/point-layer/point-layer-icon.js +27 -27
- package/dist/layers/point-layer/point-layer.js +100 -60
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +86 -45
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +27 -27
- package/dist/layers/s2-geometry-layer/s2-utils.js +18 -5
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +15 -21
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +27 -27
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +85 -54
- package/dist/layers/trip-layer/trip-info-modal.js +16 -21
- package/dist/layers/trip-layer/trip-layer-icon.js +27 -27
- package/dist/layers/trip-layer/trip-layer.js +115 -58
- package/dist/layers/trip-layer/trip-utils.js +51 -28
- package/dist/layers/types.js +6 -3
- package/dist/localization/formatted-message.js +12 -8
- package/dist/localization/index.js +14 -8
- package/dist/localization/locales.js +12 -7
- package/dist/localization/messages.js +29 -0
- package/dist/localization/translations/ca.js +455 -0
- package/dist/localization/translations/cn.js +458 -0
- package/dist/localization/translations/en.js +483 -0
- package/dist/localization/translations/es.js +455 -0
- package/dist/localization/translations/fi.js +427 -0
- package/dist/localization/translations/ja.js +456 -0
- package/dist/localization/translations/pt.js +427 -0
- package/dist/localization/translations/ru.js +464 -0
- package/dist/middleware/index.js +5 -2
- package/dist/processors/data-processor.js +217 -149
- package/dist/processors/file-handler.js +284 -210
- package/dist/processors/index.js +25 -97
- package/dist/processors/types.js +6 -0
- package/dist/reducers/combined-updaters.js +48 -40
- package/dist/reducers/composer-helpers.js +34 -32
- package/dist/reducers/composers.js +12 -25
- package/dist/reducers/core.js +46 -19
- package/dist/reducers/index.js +52 -24
- package/dist/reducers/map-state-updaters.js +64 -61
- package/dist/reducers/map-state.js +26 -31
- package/dist/reducers/map-style-updaters.js +149 -116
- package/dist/reducers/map-style.js +26 -31
- package/dist/reducers/provider-state-updaters.js +151 -121
- package/dist/reducers/provider-state.js +25 -32
- package/dist/reducers/root.js +52 -45
- package/dist/reducers/types.js +6 -0
- package/dist/reducers/ui-state-updaters.js +231 -138
- package/dist/reducers/ui-state.js +27 -32
- package/dist/reducers/vis-state-merger.js +212 -143
- package/dist/reducers/vis-state-selectors.js +12 -5
- package/dist/reducers/vis-state-updaters.js +706 -490
- package/dist/reducers/vis-state.js +25 -32
- package/dist/schemas/dataset-schema.js +59 -39
- package/dist/schemas/index.js +45 -38
- package/dist/schemas/map-state-schema.js +24 -28
- package/dist/schemas/map-style-schema.js +48 -34
- package/dist/schemas/schema-manager.js +71 -46
- package/dist/schemas/schema-utils.js +15 -11
- package/dist/schemas/schema.js +37 -35
- package/dist/schemas/versions.js +9 -5
- package/dist/schemas/vis-state-schema.js +312 -112
- package/dist/styles/base.js +646 -367
- package/dist/styles/index.js +5 -1
- package/dist/styles/media-breakpoints.js +36 -27
- package/dist/tasks/tasks.js +50 -22
- package/dist/templates/export-map-html.js +6 -3
- package/dist/utils/aggregate-utils.js +27 -23
- package/dist/utils/color-utils.js +62 -44
- package/dist/utils/custom-scales.js +7 -1
- package/dist/utils/data-scale-utils.js +18 -14
- package/dist/utils/data-utils.js +148 -110
- package/dist/utils/dataset-utils.js +91 -75
- package/dist/utils/dom-to-image.js +97 -19
- package/dist/utils/dom-utils.js +116 -34
- package/dist/utils/export-utils.js +122 -81
- package/dist/utils/filter-utils.js +335 -242
- package/dist/utils/gl-utils.js +12 -22
- package/dist/utils/gpu-filter-utils.js +70 -61
- package/dist/utils/index.js +220 -64
- package/dist/utils/interaction-utils.js +52 -34
- package/dist/utils/layer-utils.js +65 -60
- package/dist/utils/locale-utils.js +21 -23
- package/dist/utils/map-info-utils.js +3 -2
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +85 -86
- package/dist/utils/map-style-utils/mapbox-utils.js +5 -3
- package/dist/utils/mapbox-utils.js +5 -2
- package/dist/utils/notifications-utils.js +42 -43
- package/dist/utils/observe-dimensions.js +44 -39
- package/dist/utils/projection-utils.js +20 -9
- package/dist/utils/searcher-utils.js +4 -1
- package/dist/utils/split-map-utils.js +34 -38
- package/dist/utils/table-utils/data-container-interface.js +6 -0
- package/dist/utils/table-utils/data-container-utils.js +36 -29
- package/dist/utils/table-utils/data-row.js +79 -7
- package/dist/utils/table-utils/index.js +2 -1
- package/dist/utils/table-utils/indexed-data-container.js +113 -81
- package/dist/utils/table-utils/kepler-table.js +200 -99
- package/dist/utils/table-utils/row-data-container.js +109 -74
- package/dist/utils/utils.js +94 -50
- package/package.json +60 -11
- package/src/actions/action-wrapper.ts +183 -0
- package/src/actions/actions.ts +260 -0
- package/src/actions/identity-actions.ts +116 -0
- package/src/actions/map-state-actions.ts +116 -0
- package/src/actions/map-style-actions.ts +243 -0
- package/src/actions/provider-actions.ts +218 -0
- package/src/actions/ui-state-actions.ts +490 -0
- package/src/actions/vis-state-actions.ts +1279 -0
- package/src/cloud-providers/index.ts +22 -0
- package/src/cloud-providers/provider.ts +277 -0
- package/src/components/bottom-widget.tsx +275 -0
- package/src/components/common/action-panel.tsx +207 -0
- package/src/components/common/animation-control/animation-control.tsx +157 -0
- package/src/components/common/animation-control/animation-controller.ts +249 -0
- package/src/components/common/animation-control/animation-speed-slider.tsx +86 -0
- package/src/components/common/animation-control/floating-time-display.tsx +209 -0
- package/src/components/common/animation-control/playback-controls.tsx +316 -0
- package/src/components/common/animation-control/speed-control.tsx +71 -0
- package/src/components/common/checkbox.tsx +137 -0
- package/src/components/common/color-legend.tsx +203 -0
- package/src/components/common/data-table/button.tsx +54 -0
- package/src/components/common/data-table/cell-size.ts +185 -0
- package/src/components/common/data-table/grid.tsx +57 -0
- package/src/components/common/data-table/index.tsx +693 -0
- package/src/components/common/data-table/option-dropdown.tsx +122 -0
- package/src/components/common/dataset-label.tsx +48 -0
- package/src/components/common/error-boundary.tsx +43 -0
- package/src/components/common/field-selector.tsx +237 -0
- package/src/components/common/field-token.tsx +60 -0
- package/src/components/common/file-uploader/file-drop.tsx +208 -0
- package/src/components/common/file-uploader/file-upload-progress.tsx +123 -0
- package/src/components/common/file-uploader/file-upload.tsx +319 -0
- package/src/components/common/file-uploader/upload-button.tsx +88 -0
- package/src/components/common/histogram-plot.tsx +125 -0
- package/src/components/common/icons/add.tsx +37 -0
- package/src/components/common/icons/anchor_window.tsx +49 -0
- package/src/components/common/icons/arrow-down-alt.tsx +37 -0
- package/src/components/common/icons/arrow-down-solid.tsx +37 -0
- package/src/components/common/icons/arrow-down.tsx +40 -0
- package/src/components/common/icons/arrow-left.tsx +42 -0
- package/src/components/common/icons/arrow-right.tsx +40 -0
- package/src/components/common/icons/arrow-up-alt.tsx +40 -0
- package/src/components/common/icons/arrow-up-solid.tsx +37 -0
- package/src/components/common/icons/arrow-up.tsx +40 -0
- package/src/components/common/icons/base.tsx +95 -0
- package/src/components/common/icons/bug.tsx +40 -0
- package/src/components/common/icons/cancel.tsx +37 -0
- package/src/components/common/icons/checkmark.tsx +39 -0
- package/src/components/common/icons/chevron-right.js +1 -1
- package/src/components/common/icons/clipboard.tsx +40 -0
- package/src/components/common/icons/clock.tsx +38 -0
- package/src/components/common/icons/close.tsx +43 -0
- package/src/components/common/icons/code-alt.tsx +37 -0
- package/src/components/common/icons/copy.tsx +38 -0
- package/src/components/common/icons/crosshairs.tsx +37 -0
- package/src/components/common/icons/cube-3d.tsx +39 -0
- package/src/components/common/icons/cursor-click.tsx +43 -0
- package/src/components/common/icons/data-table.tsx +40 -0
- package/src/components/common/icons/db.tsx +40 -0
- package/src/components/common/icons/delete.tsx +39 -0
- package/src/components/common/icons/docs.tsx +40 -0
- package/src/components/common/icons/drag-n-drop.tsx +38 -0
- package/src/components/common/icons/draw-polygon.tsx +51 -0
- package/src/components/common/icons/email.tsx +39 -0
- package/src/components/common/icons/expand.tsx +39 -0
- package/src/components/common/icons/eye-seen.tsx +38 -0
- package/src/components/common/icons/eye-unseen.tsx +38 -0
- package/src/components/common/icons/file-type.tsx +71 -0
- package/src/components/common/icons/file.tsx +37 -0
- package/src/components/common/icons/files.tsx +37 -0
- package/src/components/common/icons/filter-funnel.tsx +37 -0
- package/src/components/common/icons/free-window.tsx +48 -0
- package/src/components/common/icons/gear.tsx +40 -0
- package/src/components/common/icons/hash.tsx +37 -0
- package/src/components/common/icons/histogram.tsx +42 -0
- package/src/components/common/icons/index.tsx +98 -0
- package/src/components/common/icons/info.tsx +48 -0
- package/src/components/common/icons/layers.tsx +37 -0
- package/src/components/common/icons/left-arrow.tsx +37 -0
- package/src/components/common/icons/legend.tsx +37 -0
- package/src/components/common/icons/line-chart.tsx +40 -0
- package/src/components/common/icons/login.tsx +41 -0
- package/src/components/common/icons/logout.tsx +38 -0
- package/src/components/common/icons/map-icon.tsx +62 -0
- package/src/components/common/icons/map.tsx +62 -0
- package/src/components/common/icons/messages.tsx +37 -0
- package/src/components/common/icons/minus.tsx +39 -0
- package/src/components/common/icons/order-by-dataset.tsx +49 -0
- package/src/components/common/icons/order-by-list.tsx +39 -0
- package/src/components/common/icons/pause.tsx +37 -0
- package/src/components/common/icons/picture.tsx +37 -0
- package/src/components/common/icons/pin.tsx +42 -0
- package/src/components/common/icons/play.tsx +37 -0
- package/src/components/common/icons/polygon.tsx +65 -0
- package/src/components/common/icons/rectangle.tsx +66 -0
- package/src/components/common/icons/reduce.tsx +42 -0
- package/src/components/common/icons/reset.tsx +37 -0
- package/src/components/common/icons/rocket.tsx +37 -0
- package/src/components/common/icons/save.tsx +38 -0
- package/src/components/common/icons/save2.tsx +42 -0
- package/src/components/common/icons/search.tsx +38 -0
- package/src/components/common/icons/settings.tsx +39 -0
- package/src/components/common/icons/share.tsx +37 -0
- package/src/components/common/icons/split.tsx +57 -0
- package/src/components/common/icons/square-select.tsx +38 -0
- package/src/components/common/icons/swap-horizontal.js +1 -1
- package/src/components/common/icons/table.tsx +41 -0
- package/src/components/common/icons/trash.tsx +45 -0
- package/src/components/common/icons/upload.tsx +37 -0
- package/src/components/common/icons/vert-dots.tsx +44 -0
- package/src/components/common/icons/vert-three-dots.tsx +39 -0
- package/src/components/common/icons/warning.tsx +40 -0
- package/src/components/common/image-preview.tsx +118 -0
- package/src/components/common/info-helper.tsx +90 -0
- package/src/components/common/item-selector/accessor.ts +45 -0
- package/src/components/common/item-selector/chickleted-input.tsx +153 -0
- package/src/components/common/item-selector/dropdown-list.tsx +269 -0
- package/src/components/common/item-selector/item-selector-submenu.js +1 -1
- package/src/components/common/item-selector/item-selector.d.ts +24 -27
- package/src/components/common/item-selector/item-selector.tsx +372 -0
- package/src/components/common/item-selector/typeahead.tsx +533 -0
- package/src/components/common/line-chart.tsx +170 -0
- package/src/components/common/loading-spinner.tsx +75 -0
- package/src/components/common/logo.tsx +88 -0
- package/src/components/common/map-layer-selector.tsx +64 -0
- package/src/components/common/modal.tsx +238 -0
- package/src/components/common/portaled.tsx +312 -0
- package/src/components/common/progress-bar.tsx +74 -0
- package/src/components/common/range-brush.tsx +276 -0
- package/src/components/common/range-plot.tsx +145 -0
- package/src/components/common/range-slider.tsx +320 -0
- package/src/components/common/slider/mouse-event.ts +122 -0
- package/src/components/common/slider/slider-bar-handle.tsx +106 -0
- package/src/components/common/slider/slider-handle.tsx +210 -0
- package/src/components/common/slider/slider.tsx +234 -0
- package/src/components/common/styled-components.tsx +708 -0
- package/src/components/common/switch.tsx +47 -0
- package/src/components/common/time-range-slider-time-title.tsx +87 -0
- package/src/components/common/time-range-slider.tsx +171 -0
- package/src/components/common/time-slider-marker.tsx +187 -0
- package/src/components/common/tippy-tooltip.tsx +130 -0
- package/src/components/common/toolbar-item.tsx +99 -0
- package/src/components/common/toolbar.tsx +49 -0
- package/src/components/common/vertical-toolbar.tsx +35 -0
- package/src/components/container.d.ts +8 -0
- package/src/components/container.tsx +188 -0
- package/src/components/context.ts +32 -0
- package/src/components/editor/editor.tsx +231 -0
- package/src/components/editor/feature-action-panel.tsx +155 -0
- package/src/components/editor/feature-styles.ts +75 -0
- package/src/components/editor/handle-style.ts +89 -0
- package/src/components/filters/filter-panels/filter-panel-with-field-select.tsx +118 -0
- package/src/components/filters/filter-panels/multi-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/new-filter-panel.tsx +100 -0
- package/src/components/filters/filter-panels/polygon-filter-panel.tsx +84 -0
- package/src/components/filters/filter-panels/range-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/single-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/time-range-filter-panel.tsx +92 -0
- package/src/components/filters/filter-panels/types.ts +39 -0
- package/src/components/filters/multi-select-filter.tsx +37 -0
- package/src/components/filters/polygon-filter.tsx +74 -0
- package/src/components/filters/range-filter.tsx +44 -0
- package/src/components/filters/single-select-filter.tsx +50 -0
- package/src/components/filters/time-range-filter.tsx +76 -0
- package/src/components/filters/time-widget.tsx +240 -0
- package/src/components/filters/types.ts +78 -0
- package/src/components/geocoder/geocoder.tsx +307 -0
- package/src/components/geocoder-panel.tsx +199 -0
- package/src/components/index.ts +262 -0
- package/src/components/injector.d.ts +33 -0
- package/src/components/injector.tsx +171 -0
- package/src/components/kepler-gl.d.ts +1 -2
- package/src/components/kepler-gl.tsx +579 -0
- package/src/components/map/coordinate-info.tsx +58 -0
- package/src/components/map/layer-hover-info.tsx +192 -0
- package/src/components/map/layer-selector-panel.tsx +121 -0
- package/src/components/map/locale-panel.tsx +110 -0
- package/src/components/map/map-control-panel.tsx +141 -0
- package/src/components/map/map-control-tooltip.tsx +45 -0
- package/src/components/map/map-control.tsx +138 -0
- package/src/components/map/map-draw-panel.tsx +145 -0
- package/src/components/map/map-legend-panel.tsx +167 -0
- package/src/components/map/map-legend.tsx +283 -0
- package/src/components/map/map-popover.tsx +266 -0
- package/src/components/map/split-map-button.tsx +98 -0
- package/src/components/map/toggle-3d-button.tsx +90 -0
- package/src/components/map-container.tsx +541 -0
- package/src/components/maps-layout.tsx +44 -0
- package/src/components/modal-container.tsx +556 -0
- package/src/components/modals/add-map-style-modal.tsx +303 -0
- package/src/components/modals/cloud-tile.tsx +181 -0
- package/src/components/modals/data-table-modal.tsx +241 -0
- package/src/components/modals/delete-data-modal.tsx +55 -0
- package/src/components/modals/error-display.tsx +43 -0
- package/src/components/modals/export-data-modal.tsx +201 -0
- package/src/components/modals/export-image-modal.tsx +155 -0
- package/src/components/modals/export-map-modal/export-html-map.tsx +164 -0
- package/src/components/modals/export-map-modal/export-json-map.tsx +112 -0
- package/src/components/modals/export-map-modal/export-map-modal.tsx +109 -0
- package/src/components/modals/image-modal-container.tsx +85 -0
- package/src/components/modals/load-data-modal.tsx +120 -0
- package/src/components/modals/load-storage-map.tsx +414 -0
- package/src/components/modals/loading-dialog.tsx +77 -0
- package/src/components/modals/modal-tabs.tsx +137 -0
- package/src/components/modals/overwrite-map-modal.tsx +113 -0
- package/src/components/modals/provider-modal-container.tsx +61 -0
- package/src/components/modals/save-map-modal.tsx +277 -0
- package/src/components/modals/share-map-modal.tsx +217 -0
- package/src/components/modals/status-panel.tsx +106 -0
- package/src/components/modals/storage-map-viewer.tsx +190 -0
- package/src/components/notification-panel/notification-item.tsx +143 -0
- package/src/components/notification-panel.tsx +75 -0
- package/src/components/plot-container.tsx +237 -0
- package/src/components/side-panel/common/dataset-info.tsx +46 -0
- package/src/components/side-panel/common/dataset-tag.tsx +86 -0
- package/src/components/side-panel/common/dataset-title.tsx +186 -0
- package/src/components/side-panel/common/source-data-catalog.tsx +67 -0
- package/src/components/side-panel/common/source-data-selector.tsx +90 -0
- package/src/components/side-panel/common/types.ts +76 -0
- package/src/components/side-panel/filter-manager.tsx +120 -0
- package/src/components/side-panel/filter-panel/filter-panel-header.tsx +96 -0
- package/src/components/side-panel/filter-panel/filter-panel.tsx +125 -0
- package/src/components/side-panel/interaction-manager.tsx +59 -0
- package/src/components/side-panel/interaction-panel/brush-config.tsx +58 -0
- package/src/components/side-panel/interaction-panel/interaction-panel.tsx +124 -0
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.tsx +243 -0
- package/src/components/side-panel/interaction-panel/tooltip-config.tsx +238 -0
- package/src/components/side-panel/layer-manager.tsx +242 -0
- package/src/components/side-panel/layer-panel/add-layer-button.tsx +208 -0
- package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +1 -1
- package/src/components/side-panel/layer-panel/color-palette.tsx +98 -0
- package/src/components/side-panel/layer-panel/color-range-selector.tsx +377 -0
- package/src/components/side-panel/layer-panel/color-selector.tsx +200 -0
- package/src/components/side-panel/layer-panel/column-selector.tsx +102 -0
- package/src/components/side-panel/layer-panel/custom-markers-config-group.js +1 -1
- package/src/components/side-panel/layer-panel/custom-palette.tsx +297 -0
- package/src/components/side-panel/layer-panel/custom-picker.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-group.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-section.tsx +100 -0
- package/src/components/side-panel/layer-panel/dataset-section.tsx +125 -0
- package/src/components/side-panel/layer-panel/dimension-scale-selector.tsx +64 -0
- package/src/components/side-panel/layer-panel/layer-column-config.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-config-group.tsx +256 -0
- package/src/components/side-panel/layer-panel/layer-list.tsx +191 -0
- package/src/components/side-panel/layer-panel/layer-panel-header.tsx +272 -0
- package/src/components/side-panel/layer-panel/layer-panel.tsx +196 -0
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.tsx +118 -0
- package/src/components/side-panel/layer-panel/layer-type-list-item.tsx +92 -0
- package/src/components/side-panel/layer-panel/layer-type-selector.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +1 -1
- package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +132 -0
- package/src/components/side-panel/layer-panel/single-color-palette.tsx +94 -0
- package/src/components/side-panel/layer-panel/text-label-panel.tsx +187 -0
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.tsx +179 -0
- package/src/components/side-panel/layer-panel/vis-config-slider.tsx +237 -0
- package/src/components/side-panel/layer-panel/vis-config-switch.tsx +86 -0
- package/src/components/side-panel/map-manager.tsx +123 -0
- package/src/components/side-panel/map-style-panel/map-layer-selector.tsx +145 -0
- package/src/components/side-panel/map-style-panel/map-style-selector.tsx +122 -0
- package/src/components/side-panel/panel-dropdown.tsx +53 -0
- package/src/components/side-panel/panel-header-action.tsx +114 -0
- package/src/components/side-panel/panel-header.tsx +386 -0
- package/src/components/side-panel/panel-tab.tsx +79 -0
- package/src/components/side-panel/panel-title.tsx +35 -0
- package/src/components/side-panel/panel-toggle.tsx +72 -0
- package/src/components/side-panel/side-bar.tsx +140 -0
- package/src/components/side-panel.tsx +261 -0
- package/src/components/types.ts +41 -0
- package/src/connect/keplergl-connect.ts +48 -0
- package/src/connect/with-local-selector.tsx +70 -0
- package/src/constants/action-types.ts +188 -0
- package/src/constants/color-ranges.ts +87 -0
- package/src/constants/default-settings.ts +1049 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.ts +57 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.ts +211 -0
- package/src/deckgl-layers/3d-building-layer/types.ts +29 -0
- package/src/deckgl-layers/column-layer/enhanced-column-layer.ts +63 -0
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +68 -0
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.ts +68 -0
- package/src/deckgl-layers/layer-utils/cluster-utils.ts +78 -0
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +672 -0
- package/src/deckgl-layers/layer-utils/shader-utils.ts +41 -0
- package/src/deckgl-layers/line-layer/line-layer.ts +126 -0
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.ts +63 -0
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.ts +96 -0
- package/src/index.d.ts +1 -0
- package/src/layers/aggregation-layer.ts +402 -0
- package/src/layers/arc-layer/arc-layer-icon.tsx +67 -0
- package/src/layers/arc-layer/arc-layer.ts +294 -0
- package/src/layers/base-layer.ts +1743 -0
- package/src/layers/cluster-layer/cluster-layer.ts +162 -0
- package/src/layers/geojson-layer/geojson-layer-icon.tsx +68 -0
- package/src/layers/geojson-layer/geojson-layer.ts +461 -0
- package/src/layers/geojson-layer/geojson-utils.ts +200 -0
- package/src/layers/grid-layer/grid-layer-icon.tsx +53 -0
- package/src/layers/grid-layer/grid-layer.ts +153 -0
- package/src/layers/grid-layer/grid-utils.ts +84 -0
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.ts +339 -0
- package/src/layers/h3-hexagon-layer/h3-utils.ts +67 -0
- package/src/layers/heatmap-layer/heatmap-layer.ts +255 -0
- package/src/layers/hexagon-layer/hexagon-layer.ts +156 -0
- package/src/layers/hexagon-layer/hexagon-utils.ts +64 -0
- package/src/layers/icon-layer/icon-info-modal.tsx +155 -0
- package/src/layers/icon-layer/icon-layer.ts +392 -0
- package/src/layers/index.ts +77 -0
- package/src/layers/layer-factory.ts +695 -0
- package/src/layers/layer-text-label.ts +62 -0
- package/src/layers/layer-update.ts +70 -0
- package/src/layers/line-layer/line-layer.ts +222 -0
- package/src/layers/mapbox-utils.ts +204 -0
- package/src/layers/mapboxgl-layer.ts +176 -0
- package/src/layers/point-layer/point-layer.ts +504 -0
- package/src/layers/s2-geometry-layer/s2-geometry-layer.ts +369 -0
- package/src/layers/s2-geometry-layer/s2-utils.ts +42 -0
- package/src/layers/scenegraph-layer/scenegraph-layer.ts +237 -0
- package/src/layers/trip-layer/trip-layer.ts +356 -0
- package/src/layers/trip-layer/trip-utils.ts +177 -0
- package/src/localization/formatted-message.tsx +42 -0
- package/src/localization/index.ts +29 -0
- package/src/localization/locales.ts +53 -0
- package/src/localization/messages.ts +40 -0
- package/src/localization/translations/ca.ts +476 -0
- package/src/localization/translations/cn.ts +477 -0
- package/src/localization/translations/en.ts +504 -0
- package/src/localization/translations/es.ts +477 -0
- package/src/localization/translations/fi.ts +448 -0
- package/src/localization/translations/ja.ts +477 -0
- package/src/localization/translations/pt.ts +449 -0
- package/src/localization/translations/ru.ts +488 -0
- package/src/middleware/index.ts +35 -0
- package/src/processors/data-processor.ts +723 -0
- package/src/processors/file-handler.ts +248 -0
- package/src/processors/index.ts +22 -0
- package/src/processors/types.ts +22 -0
- package/src/reducers/combined-updaters.ts +216 -0
- package/src/reducers/composer-helpers.ts +75 -0
- package/src/reducers/core.ts +111 -0
- package/src/reducers/index.ts +116 -0
- package/src/reducers/map-state-updaters.ts +271 -0
- package/src/reducers/map-state.ts +47 -0
- package/src/reducers/map-style-updaters.ts +640 -0
- package/src/reducers/map-style.ts +53 -0
- package/src/reducers/provider-state-updaters.ts +454 -0
- package/src/reducers/provider-state.ts +53 -0
- package/src/reducers/root.ts +231 -0
- package/src/reducers/types.ts +18 -0
- package/src/reducers/ui-state-updaters.ts +926 -0
- package/src/reducers/ui-state.ts +75 -0
- package/src/reducers/vis-state-merger.ts +627 -0
- package/src/reducers/vis-state-selectors.ts +37 -0
- package/src/reducers/vis-state-updaters.ts +2568 -0
- package/src/reducers/vis-state.ts +157 -0
- package/src/schemas/dataset-schema.ts +141 -0
- package/src/schemas/index.ts +52 -0
- package/src/schemas/schema-manager.ts +446 -0
- package/src/schemas/schema.ts +124 -0
- package/src/schemas/vis-state-schema.ts +761 -0
- package/src/styles/base.ts +1642 -0
- package/src/styles/media-breakpoints.ts +56 -0
- package/src/typedefs/deckgl.d.ts +25 -0
- package/src/utils/aggregate-utils.ts +71 -0
- package/src/utils/color-utils.ts +134 -0
- package/src/utils/data-scale-utils.ts +73 -0
- package/src/utils/data-utils.ts +459 -0
- package/src/utils/dataset-utils.ts +261 -0
- package/src/utils/dom-to-image.ts +533 -0
- package/src/utils/dom-utils.ts +354 -0
- package/src/utils/export-utils.ts +265 -0
- package/src/utils/filter-utils.ts +1185 -0
- package/src/utils/gpu-filter-utils.ts +249 -0
- package/src/utils/index.ts +69 -0
- package/src/utils/interaction-utils.ts +212 -0
- package/src/utils/layer-utils.ts +249 -0
- package/src/utils/map-style-utils/mapbox-gl-style-editor.ts +227 -0
- package/src/utils/notifications-utils.ts +89 -0
- package/src/utils/observe-dimensions.ts +127 -0
- package/src/utils/split-map-utils.ts +104 -0
- package/src/utils/table-utils/data-container-utils.ts +90 -0
- package/src/utils/table-utils/data-row.ts +110 -0
- package/src/utils/table-utils/indexed-data-container.ts +184 -0
- package/src/utils/table-utils/kepler-table.ts +639 -0
- package/src/utils/table-utils/row-data-container.ts +178 -0
- package/src/utils/utils.ts +228 -0
- package/dist/components/common/icons/arrow-down-solid .js +0 -64
- package/dist/localization/en.js +0 -494
- package/src/actions/action-wrapper.js +0 -183
- package/src/actions/actions.d.ts +0 -104
- package/src/actions/actions.js +0 -178
- package/src/actions/identity-actions.d.ts +0 -53
- package/src/actions/identity-actions.js +0 -83
- package/src/actions/index.d.ts +0 -23
- package/src/actions/map-state-actions.d.ts +0 -46
- package/src/actions/map-state-actions.js +0 -90
- package/src/actions/map-style-actions.d.ts +0 -116
- package/src/actions/map-style-actions.js +0 -135
- package/src/actions/provider-actions.d.ts +0 -203
- package/src/actions/provider-actions.js +0 -94
- package/src/actions/ui-state-actions.d.ts +0 -200
- package/src/actions/ui-state-actions.js +0 -272
- package/src/actions/vis-state-actions.d.ts +0 -502
- package/src/actions/vis-state-actions.js +0 -919
- package/src/cloud-providers/index.d.ts +0 -53
- package/src/cloud-providers/index.js +0 -21
- package/src/cloud-providers/provider.js +0 -233
- package/src/components/bottom-widget.d.ts +0 -33
- package/src/components/bottom-widget.js +0 -235
- package/src/components/common/action-panel.d.ts +0 -24
- package/src/components/common/action-panel.js +0 -177
- package/src/components/common/animation-control/animation-control.js +0 -155
- package/src/components/common/animation-control/animation-controller.js +0 -224
- package/src/components/common/animation-control/animation-speed-slider.js +0 -79
- package/src/components/common/animation-control/floating-time-display.js +0 -192
- package/src/components/common/animation-control/playback-controls.js +0 -278
- package/src/components/common/animation-control/speed-control.js +0 -71
- package/src/components/common/checkbox.js +0 -128
- package/src/components/common/color-legend.js +0 -198
- package/src/components/common/data-table/button.js +0 -47
- package/src/components/common/data-table/cell-size.js +0 -180
- package/src/components/common/data-table/grid.js +0 -55
- package/src/components/common/data-table/index.js +0 -620
- package/src/components/common/data-table/option-dropdown.js +0 -110
- package/src/components/common/dataset-label.js +0 -40
- package/src/components/common/error-boundary.js +0 -43
- package/src/components/common/field-selector.js +0 -233
- package/src/components/common/field-token.js +0 -56
- package/src/components/common/file-uploader/file-drop.d.ts +0 -19
- package/src/components/common/file-uploader/file-drop.js +0 -196
- package/src/components/common/file-uploader/file-upload-progress.d.ts +0 -11
- package/src/components/common/file-uploader/file-upload-progress.js +0 -110
- package/src/components/common/file-uploader/file-upload.d.ts +0 -22
- package/src/components/common/file-uploader/file-upload.js +0 -301
- package/src/components/common/file-uploader/upload-button.d.ts.wip +0 -11
- package/src/components/common/file-uploader/upload-button.js +0 -83
- package/src/components/common/histogram-plot.js +0 -102
- package/src/components/common/icons/add.js +0 -43
- package/src/components/common/icons/anchor_window.js +0 -53
- package/src/components/common/icons/arrow-down-alt.js +0 -43
- package/src/components/common/icons/arrow-down-solid .js +0 -43
- package/src/components/common/icons/arrow-down.js +0 -46
- package/src/components/common/icons/arrow-left.js +0 -48
- package/src/components/common/icons/arrow-right.js +0 -46
- package/src/components/common/icons/arrow-up-alt.js +0 -46
- package/src/components/common/icons/arrow-up-solid.js +0 -43
- package/src/components/common/icons/arrow-up.js +0 -46
- package/src/components/common/icons/base.js +0 -90
- package/src/components/common/icons/bug.js +0 -46
- package/src/components/common/icons/cancel.js +0 -43
- package/src/components/common/icons/checkmark.js +0 -45
- package/src/components/common/icons/clipboard.js +0 -46
- package/src/components/common/icons/clock.js +0 -44
- package/src/components/common/icons/close.js +0 -49
- package/src/components/common/icons/code-alt.js +0 -43
- package/src/components/common/icons/copy.js +0 -44
- package/src/components/common/icons/crosshairs.js +0 -43
- package/src/components/common/icons/cube-3d.js +0 -45
- package/src/components/common/icons/cursor-click.js +0 -49
- package/src/components/common/icons/data-table.js +0 -45
- package/src/components/common/icons/db.js +0 -45
- package/src/components/common/icons/delete.js +0 -44
- package/src/components/common/icons/docs.js +0 -46
- package/src/components/common/icons/drag-n-drop.js +0 -44
- package/src/components/common/icons/draw-polygon.js +0 -60
- package/src/components/common/icons/email.js +0 -45
- package/src/components/common/icons/expand.js +0 -45
- package/src/components/common/icons/eye-seen.js +0 -44
- package/src/components/common/icons/eye-unseen.js +0 -44
- package/src/components/common/icons/file-type.js +0 -57
- package/src/components/common/icons/file.js +0 -43
- package/src/components/common/icons/files.js +0 -42
- package/src/components/common/icons/filter-funnel.js +0 -43
- package/src/components/common/icons/free-window.js +0 -53
- package/src/components/common/icons/gear.js +0 -45
- package/src/components/common/icons/hash.js +0 -43
- package/src/components/common/icons/histogram.js +0 -47
- package/src/components/common/icons/index.js +0 -96
- package/src/components/common/icons/info.js +0 -54
- package/src/components/common/icons/layers.js +0 -43
- package/src/components/common/icons/left-arrow.js +0 -43
- package/src/components/common/icons/legend.js +0 -43
- package/src/components/common/icons/line-chart.js +0 -45
- package/src/components/common/icons/login.js +0 -46
- package/src/components/common/icons/logout.js +0 -43
- package/src/components/common/icons/map-icon.js +0 -69
- package/src/components/common/icons/map.js +0 -69
- package/src/components/common/icons/messages.js +0 -43
- package/src/components/common/icons/minus.js +0 -45
- package/src/components/common/icons/pause.js +0 -43
- package/src/components/common/icons/picture.js +0 -43
- package/src/components/common/icons/pin.js +0 -43
- package/src/components/common/icons/play.js +0 -43
- package/src/components/common/icons/polygon.js +0 -74
- package/src/components/common/icons/rectangle.js +0 -75
- package/src/components/common/icons/reduce.js +0 -48
- package/src/components/common/icons/reset.js +0 -43
- package/src/components/common/icons/rocket.js +0 -43
- package/src/components/common/icons/save.js +0 -44
- package/src/components/common/icons/save2.js +0 -47
- package/src/components/common/icons/search.js +0 -44
- package/src/components/common/icons/settings.js +0 -45
- package/src/components/common/icons/share.js +0 -43
- package/src/components/common/icons/split.js +0 -63
- package/src/components/common/icons/square-select.js +0 -44
- package/src/components/common/icons/table.js +0 -46
- package/src/components/common/icons/trash.js +0 -51
- package/src/components/common/icons/upload.js +0 -44
- package/src/components/common/icons/vert-dots.js +0 -50
- package/src/components/common/icons/vert-three-dots.js +0 -45
- package/src/components/common/icons/warning.js +0 -46
- package/src/components/common/image-preview.js +0 -111
- package/src/components/common/info-helper.js +0 -84
- package/src/components/common/item-selector/accessor.js +0 -45
- package/src/components/common/item-selector/chickleted-input.js +0 -143
- package/src/components/common/item-selector/dropdown-list.js +0 -258
- package/src/components/common/item-selector/item-selector.js +0 -360
- package/src/components/common/item-selector/typeahead.js +0 -507
- package/src/components/common/line-chart.js +0 -134
- package/src/components/common/loading-spinner.js +0 -64
- package/src/components/common/logo.js +0 -92
- package/src/components/common/map-layer-selector.d.ts +0 -10
- package/src/components/common/map-layer-selector.js +0 -54
- package/src/components/common/modal.js +0 -233
- package/src/components/common/portaled.js +0 -264
- package/src/components/common/progress-bar.d.ts +0 -13
- package/src/components/common/progress-bar.js +0 -49
- package/src/components/common/range-brush.js +0 -256
- package/src/components/common/range-plot.js +0 -139
- package/src/components/common/range-slider.js +0 -299
- package/src/components/common/slider/mouse-event.js +0 -97
- package/src/components/common/slider/slider-bar-handle.js +0 -97
- package/src/components/common/slider/slider-handle.js +0 -181
- package/src/components/common/slider/slider.js +0 -213
- package/src/components/common/styled-components.js +0 -657
- package/src/components/common/switch.js +0 -50
- package/src/components/common/time-range-slider-time-title.js +0 -76
- package/src/components/common/time-range-slider.js +0 -163
- package/src/components/common/time-slider-marker.js +0 -168
- package/src/components/common/toolbar-item.d.ts +0 -14
- package/src/components/common/toolbar-item.js +0 -83
- package/src/components/common/toolbar.js +0 -45
- package/src/components/common/vertical-toolbar.js +0 -35
- package/src/components/container.js +0 -173
- package/src/components/context.d.ts +0 -10
- package/src/components/context.js +0 -32
- package/src/components/editor/editor.js +0 -218
- package/src/components/editor/feature-action-panel.js +0 -143
- package/src/components/editor/feature-styles.js +0 -75
- package/src/components/editor/handle-style.js +0 -89
- package/src/components/filters/filter-panels/filter-panel-types.d.ts +0 -28
- package/src/components/filters/filter-panels/filter-panel-with-field-select.js +0 -124
- package/src/components/filters/filter-panels/multi-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/new-filter-panel.js +0 -99
- package/src/components/filters/filter-panels/polygon-filter-panel.js +0 -96
- package/src/components/filters/filter-panels/range-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/single-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/time-range-filter-panel.js +0 -95
- package/src/components/filters/multi-select-filter.js +0 -36
- package/src/components/filters/polygon-filter.d.ts +0 -13
- package/src/components/filters/polygon-filter.js +0 -73
- package/src/components/filters/range-filter.js +0 -43
- package/src/components/filters/single-select-filter.js +0 -49
- package/src/components/filters/time-range-filter.js +0 -68
- package/src/components/filters/time-widget.js +0 -228
- package/src/components/geocoder/geocoder.d.ts +0 -33
- package/src/components/geocoder/geocoder.js +0 -272
- package/src/components/geocoder-panel.js +0 -191
- package/src/components/index.js +0 -247
- package/src/components/injector.js +0 -161
- package/src/components/kepler-gl.js +0 -518
- package/src/components/map/coordinate-info.js +0 -53
- package/src/components/map/layer-hover-info.d.ts +0 -12
- package/src/components/map/layer-hover-info.js +0 -185
- package/src/components/map/layer-selector-panel.d.ts +0 -16
- package/src/components/map/layer-selector-panel.js +0 -106
- package/src/components/map/locale-panel.d.ts +0 -12
- package/src/components/map/locale-panel.js +0 -91
- package/src/components/map/map-control-panel.d.ts +0 -11
- package/src/components/map/map-control-panel.js +0 -98
- package/src/components/map/map-control-tooltip.d.ts +0 -8
- package/src/components/map/map-control-tooltip.js +0 -40
- package/src/components/map/map-control.d.ts +0 -37
- package/src/components/map/map-control.js +0 -100
- package/src/components/map/map-draw-panel.d.ts +0 -16
- package/src/components/map/map-draw-panel.js +0 -125
- package/src/components/map/map-legend-panel.d.ts +0 -20
- package/src/components/map/map-legend-panel.js +0 -100
- package/src/components/map/map-legend.d.ts +0 -58
- package/src/components/map/map-legend.js +0 -228
- package/src/components/map/map-popover.d.ts +0 -28
- package/src/components/map/map-popover.js +0 -250
- package/src/components/map/split-map-button.d.ts +0 -19
- package/src/components/map/split-map-button.js +0 -82
- package/src/components/map/toggle-3d-button.d.ts +0 -16
- package/src/components/map/toggle-3d-button.js +0 -75
- package/src/components/map-container.d.ts +0 -18
- package/src/components/map-container.js +0 -499
- package/src/components/maps-layout.d.ts +0 -5
- package/src/components/maps-layout.js +0 -40
- package/src/components/modal-container.d.ts +0 -37
- package/src/components/modal-container.js +0 -543
- package/src/components/modals/add-map-style-modal.js +0 -298
- package/src/components/modals/cloud-tile.js +0 -147
- package/src/components/modals/data-table-modal.js +0 -217
- package/src/components/modals/delete-data-modal.js +0 -48
- package/src/components/modals/error-display.js +0 -39
- package/src/components/modals/export-data-modal.js +0 -193
- package/src/components/modals/export-image-modal.d.ts +0 -21
- package/src/components/modals/export-image-modal.js +0 -144
- package/src/components/modals/export-map-modal/export-html-map.d.ts +0 -21
- package/src/components/modals/export-map-modal/export-html-map.js +0 -145
- package/src/components/modals/export-map-modal/export-json-map.js +0 -100
- package/src/components/modals/export-map-modal/export-map-modal.js +0 -114
- package/src/components/modals/image-modal-container.d.ts +0 -13
- package/src/components/modals/image-modal-container.js +0 -76
- package/src/components/modals/load-data-modal.d.ts +0 -30
- package/src/components/modals/load-data-modal.js +0 -94
- package/src/components/modals/load-storage-map.js +0 -381
- package/src/components/modals/loading-dialog.js +0 -69
- package/src/components/modals/modal-tabs.js +0 -126
- package/src/components/modals/overwrite-map-modal.d.ts +0 -18
- package/src/components/modals/overwrite-map-modal.js +0 -97
- package/src/components/modals/provider-modal-container.d.ts +0 -12
- package/src/components/modals/provider-modal-container.js +0 -60
- package/src/components/modals/save-map-modal.d.ts +0 -32
- package/src/components/modals/save-map-modal.js +0 -244
- package/src/components/modals/share-map-modal.js +0 -208
- package/src/components/modals/status-panel.js +0 -95
- package/src/components/modals/storage-map-viewer.js +0 -177
- package/src/components/notification-panel/notification-item.js +0 -132
- package/src/components/notification-panel.js +0 -72
- package/src/components/plot-container.js +0 -228
- package/src/components/side-panel/common/dataset-info.js +0 -45
- package/src/components/side-panel/common/dataset-tag.js +0 -55
- package/src/components/side-panel/common/dataset-title.js +0 -146
- package/src/components/side-panel/common/source-data-catalog.js +0 -61
- package/src/components/side-panel/common/source-data-selector.js +0 -79
- package/src/components/side-panel/filter-manager.js +0 -105
- package/src/components/side-panel/filter-panel/filter-panel-header.js +0 -83
- package/src/components/side-panel/filter-panel/filter-panel.js +0 -126
- package/src/components/side-panel/interaction-manager.js +0 -46
- package/src/components/side-panel/interaction-panel/brush-config.js +0 -51
- package/src/components/side-panel/interaction-panel/interaction-panel.js +0 -115
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +0 -199
- package/src/components/side-panel/interaction-panel/tooltip-config.js +0 -190
- package/src/components/side-panel/layer-manager.js +0 -290
- package/src/components/side-panel/layer-panel/color-palette.js +0 -90
- package/src/components/side-panel/layer-panel/color-range-selector.js +0 -353
- package/src/components/side-panel/layer-panel/color-selector.js +0 -196
- package/src/components/side-panel/layer-panel/column-selector.js +0 -70
- package/src/components/side-panel/layer-panel/custom-palette.js +0 -296
- package/src/components/side-panel/layer-panel/custom-picker.js +0 -88
- package/src/components/side-panel/layer-panel/dimension-scale-selector.js +0 -48
- package/src/components/side-panel/layer-panel/layer-column-config.js +0 -113
- package/src/components/side-panel/layer-panel/layer-config-group.js +0 -237
- package/src/components/side-panel/layer-panel/layer-panel-header.js +0 -236
- package/src/components/side-panel/layer-panel/layer-panel.js +0 -171
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +0 -105
- package/src/components/side-panel/layer-panel/layer-type-list-item.js +0 -83
- package/src/components/side-panel/layer-panel/layer-type-selector.js +0 -89
- package/src/components/side-panel/layer-panel/single-color-palette.js +0 -98
- package/src/components/side-panel/layer-panel/text-label-panel.js +0 -179
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +0 -163
- package/src/components/side-panel/layer-panel/vis-config-slider.js +0 -82
- package/src/components/side-panel/layer-panel/vis-config-switch.js +0 -87
- package/src/components/side-panel/map-manager.js +0 -114
- package/src/components/side-panel/map-style-panel/map-layer-selector.js +0 -128
- package/src/components/side-panel/map-style-panel/map-style-selector.js +0 -111
- package/src/components/side-panel/panel-dropdown.js +0 -53
- package/src/components/side-panel/panel-header-action.js +0 -106
- package/src/components/side-panel/panel-header.js +0 -321
- package/src/components/side-panel/panel-tab.js +0 -62
- package/src/components/side-panel/panel-title.js +0 -32
- package/src/components/side-panel/panel-toggle.js +0 -70
- package/src/components/side-panel/side-bar.js +0 -136
- package/src/components/side-panel.d.ts +0 -33
- package/src/components/side-panel.js +0 -253
- package/src/connect/keplergl-connect.js +0 -47
- package/src/connect/with-local-selector.d.ts +0 -11
- package/src/connect/with-local-selector.js +0 -67
- package/src/constants/action-types.d.ts +0 -135
- package/src/constants/action-types.js +0 -184
- package/src/constants/color-ranges.js +0 -72
- package/src/constants/default-settings.js +0 -994
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +0 -56
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +0 -192
- package/src/deckgl-layers/column-layer/enhanced-column-layer.js +0 -63
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +0 -70
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +0 -70
- package/src/deckgl-layers/layer-utils/cluster-utils.js +0 -76
- package/src/deckgl-layers/layer-utils/cpu-aggregator.js +0 -583
- package/src/deckgl-layers/layer-utils/shader-utils.js +0 -41
- package/src/deckgl-layers/line-layer/line-layer.js +0 -122
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +0 -57
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +0 -85
- package/src/layers/aggregation-layer.js +0 -356
- package/src/layers/arc-layer/arc-layer-icon.js +0 -67
- package/src/layers/arc-layer/arc-layer.js +0 -221
- package/src/layers/base-layer.js +0 -1545
- package/src/layers/cluster-layer/cluster-layer.js +0 -125
- package/src/layers/geojson-layer/geojson-layer-icon.js +0 -68
- package/src/layers/geojson-layer/geojson-layer.js +0 -344
- package/src/layers/geojson-layer/geojson-utils.js +0 -179
- package/src/layers/grid-layer/grid-layer-icon.js +0 -53
- package/src/layers/grid-layer/grid-layer.js +0 -95
- package/src/layers/grid-layer/grid-utils.js +0 -71
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +0 -264
- package/src/layers/h3-hexagon-layer/h3-utils.js +0 -65
- package/src/layers/heatmap-layer/heatmap-layer.js +0 -226
- package/src/layers/hexagon-layer/hexagon-layer.js +0 -95
- package/src/layers/hexagon-layer/hexagon-utils.js +0 -63
- package/src/layers/icon-layer/icon-info-modal.js +0 -155
- package/src/layers/icon-layer/icon-layer.js +0 -324
- package/src/layers/index.d.ts +0 -128
- package/src/layers/index.js +0 -72
- package/src/layers/layer-factory.d.ts +0 -149
- package/src/layers/layer-factory.js +0 -480
- package/src/layers/layer-text-label.js +0 -62
- package/src/layers/layer-update.js +0 -71
- package/src/layers/line-layer/line-layer.js +0 -161
- package/src/layers/mapbox-utils.js +0 -195
- package/src/layers/mapboxgl-layer.js +0 -154
- package/src/layers/point-layer/point-layer.js +0 -414
- package/src/layers/s2-geometry-layer/s2-geometry-layer.js +0 -265
- package/src/layers/s2-geometry-layer/s2-utils.js +0 -36
- package/src/layers/scenegraph-layer/scenegraph-layer.js +0 -182
- package/src/layers/trip-layer/trip-layer.js +0 -295
- package/src/layers/trip-layer/trip-utils.js +0 -169
- package/src/localization/en.js +0 -504
- package/src/localization/formatted-message.js +0 -33
- package/src/localization/index.js +0 -32
- package/src/localization/locales.js +0 -46
- package/src/middleware/index.js +0 -34
- package/src/processors/data-processor.d.ts +0 -57
- package/src/processors/data-processor.js +0 -684
- package/src/processors/file-handler.d.ts +0 -46
- package/src/processors/file-handler.js +0 -220
- package/src/processors/index.js +0 -44
- package/src/reducers/combined-updaters.d.ts +0 -26
- package/src/reducers/combined-updaters.js +0 -198
- package/src/reducers/composer-helpers.d.ts +0 -32
- package/src/reducers/composer-helpers.js +0 -70
- package/src/reducers/core.d.ts +0 -25
- package/src/reducers/core.js +0 -97
- package/src/reducers/index.d.ts +0 -118
- package/src/reducers/index.js +0 -53
- package/src/reducers/map-state-updaters.d.ts +0 -64
- package/src/reducers/map-state-updaters.js +0 -224
- package/src/reducers/map-state.js +0 -47
- package/src/reducers/map-style-updaters.d.ts +0 -76
- package/src/reducers/map-style-updaters.js +0 -541
- package/src/reducers/map-style.js +0 -53
- package/src/reducers/provider-state-updaters.d.ts +0 -88
- package/src/reducers/provider-state-updaters.js +0 -428
- package/src/reducers/provider-state.js +0 -53
- package/src/reducers/root.js +0 -230
- package/src/reducers/types.d.ts +0 -10
- package/src/reducers/ui-state-updaters.d.ts +0 -198
- package/src/reducers/ui-state-updaters.js +0 -766
- package/src/reducers/ui-state.js +0 -73
- package/src/reducers/vis-state-merger.d.ts +0 -78
- package/src/reducers/vis-state-merger.js +0 -557
- package/src/reducers/vis-state-selectors.js +0 -35
- package/src/reducers/vis-state-updaters.d.ts +0 -534
- package/src/reducers/vis-state-updaters.js +0 -2137
- package/src/reducers/vis-state.js +0 -155
- package/src/schemas/dataset-schema.js +0 -141
- package/src/schemas/index.d.ts +0 -24
- package/src/schemas/index.js +0 -42
- package/src/schemas/schema-manager.d.ts +0 -229
- package/src/schemas/schema-manager.js +0 -228
- package/src/schemas/schema.d.ts +0 -47
- package/src/schemas/schema.js +0 -90
- package/src/schemas/versions.d.ts +0 -23
- package/src/schemas/vis-state-schema.js +0 -754
- package/src/styles/base.js +0 -1620
- package/src/styles/media-breakpoints.js +0 -47
- package/src/typedefs/README.md +0 -3
- package/src/typedefs/deck.gl__core.d.ts +0 -64
- package/src/typedefs/deck.gl__mesh-layers.d.ts +0 -33
- package/src/utils/aggregate-utils.js +0 -71
- package/src/utils/color-utils.js +0 -115
- package/src/utils/data-scale-utils.d.ts +0 -26
- package/src/utils/data-scale-utils.js +0 -61
- package/src/utils/data-utils.d.ts +0 -46
- package/src/utils/data-utils.js +0 -447
- package/src/utils/dataset-utils.d.ts +0 -10
- package/src/utils/dataset-utils.js +0 -255
- package/src/utils/dom-to-image.js +0 -533
- package/src/utils/dom-utils.js +0 -354
- package/src/utils/export-utils.js +0 -247
- package/src/utils/filter-utils.d.ts +0 -192
- package/src/utils/filter-utils.js +0 -1114
- package/src/utils/gpu-filter-utils.d.ts +0 -28
- package/src/utils/gpu-filter-utils.js +0 -253
- package/src/utils/index.d.ts +0 -5
- package/src/utils/index.js +0 -55
- package/src/utils/interaction-utils.d.ts +0 -36
- package/src/utils/interaction-utils.js +0 -185
- package/src/utils/layer-utils.d.ts +0 -78
- package/src/utils/layer-utils.js +0 -206
- package/src/utils/map-style-utils/mapbox-gl-style-editor.js +0 -201
- package/src/utils/notifications-utils.js +0 -83
- package/src/utils/observe-dimensions.d.ts +0 -18
- package/src/utils/observe-dimensions.js +0 -115
- package/src/utils/split-map-utils.js +0 -104
- package/src/utils/table-utils/data-container-utils.d.ts +0 -43
- package/src/utils/table-utils/data-container-utils.js +0 -61
- package/src/utils/table-utils/data-row.d.ts +0 -65
- package/src/utils/table-utils/data-row.js +0 -54
- package/src/utils/table-utils/index.d.ts +0 -1
- package/src/utils/table-utils/indexed-data-container.d.ts +0 -26
- package/src/utils/table-utils/indexed-data-container.js +0 -152
- package/src/utils/table-utils/kepler-table.d.ts +0 -114
- package/src/utils/table-utils/kepler-table.js +0 -508
- package/src/utils/table-utils/row-data-container.d.ts +0 -30
- package/src/utils/table-utils/row-data-container.js +0 -151
- package/src/utils/utils.js +0 -202
- /package/src/actions/{index.js → index.ts} +0 -0
- /package/src/components/common/data-table/{canvas.js → canvas.tsx} +0 -0
- /package/src/components/editor/{constants.js → constants.ts} +0 -0
- /package/src/components/filters/{components.js → components.ts} +0 -0
- /package/src/components/filters/{index.js → index.ts} +0 -0
- /package/src/components/map/{map-control-toolbar.js → map-control-toolbar.tsx} +0 -0
- /package/src/components/modals/export-map-modal/{components.js → components.tsx} +0 -0
- /package/src/components/modals/{modal-dialog.js → modal-dialog.tsx} +0 -0
- /package/src/components/side-panel/{cloud-storage-dropdown.js → cloud-storage-dropdown.tsx} +0 -0
- /package/src/components/side-panel/{custom-panel.js → custom-panel.tsx} +0 -0
- /package/src/components/side-panel/layer-panel/{layer-configurator.js → layer-configurator.tsx} +0 -0
- /package/src/constants/{color-palette.js → color-palette.ts} +0 -0
- /package/src/constants/{custom-color-ranges.js → custom-color-ranges.ts} +0 -0
- /package/src/constants/{index.js → index.ts} +0 -0
- /package/src/constants/{keyevent.js → keyevent.ts} +0 -0
- /package/src/constants/{tooltip.js → tooltip.ts} +0 -0
- /package/src/constants/{user-feedbacks.js → user-feedbacks.ts} +0 -0
- /package/src/constants/{user-guides.js → user-guides.ts} +0 -0
- /package/src/layers/cluster-layer/{cluster-layer-icon.js → cluster-layer-icon.tsx} +0 -0
- /package/src/layers/{default-layer-icon.js → default-layer-icon.tsx} +0 -0
- /package/src/layers/h3-hexagon-layer/{h3-hexagon-layer-icon.js → h3-hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/heatmap-layer/{heatmap-layer-icon.js → heatmap-layer-icon.tsx} +0 -0
- /package/src/layers/hexagon-layer/{hexagon-layer-icon.js → hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/icon-layer/{icon-layer-icon.js → icon-layer-icon.tsx} +0 -0
- /package/src/layers/line-layer/{line-layer-icon.js → line-layer-icon.tsx} +0 -0
- /package/src/layers/point-layer/{point-layer-icon.js → point-layer-icon.tsx} +0 -0
- /package/src/layers/s2-geometry-layer/{s2-layer-icon.js → s2-layer-icon.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-info-modal.js → scenegraph-info-modal.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-layer-icon.js → scenegraph-layer-icon.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-info-modal.js → trip-info-modal.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-layer-icon.js → trip-layer-icon.tsx} +0 -0
- /package/src/layers/{types.js → types.ts} +0 -0
- /package/src/reducers/{composers.js → composers.ts} +0 -0
- /package/src/schemas/{map-state-schema.js → map-state-schema.ts} +0 -0
- /package/src/schemas/{map-style-schema.js → map-style-schema.ts} +0 -0
- /package/src/schemas/{schema-utils.js → schema-utils.ts} +0 -0
- /package/src/schemas/{versions.js → versions.ts} +0 -0
- /package/src/styles/{index.js → index.ts} +0 -0
- /package/src/tasks/{tasks.js → tasks.ts} +0 -0
- /package/src/templates/{export-map-html.js → export-map-html.ts} +0 -0
- /package/src/utils/{gl-utils.js → gl-utils.ts} +0 -0
- /package/src/utils/{locale-utils.js → locale-utils.ts} +0 -0
- /package/src/utils/{map-info-utils.js → map-info-utils.ts} +0 -0
- /package/src/utils/map-style-utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{projection-utils.js → projection-utils.ts} +0 -0
- /package/src/utils/{searcher-utils.js → searcher-utils.ts} +0 -0
- /package/src/utils/table-utils/{data-container-interface.d.ts → data-container-interface.ts} +0 -0
- /package/src/utils/table-utils/{index.js → index.ts} +0 -0
|
@@ -1,67 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
4
5
|
Object.defineProperty(exports, "__esModule", {
|
|
5
6
|
value: true
|
|
6
7
|
});
|
|
7
|
-
exports
|
|
8
|
+
exports["default"] = exports.colorMaker = exports.layerColors = exports.OVERLAY_TYPE = exports.LAYER_ID_LENGTH = void 0;
|
|
9
|
+
|
|
8
10
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
+
|
|
9
12
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
-
|
|
13
|
+
|
|
14
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
15
|
+
|
|
11
16
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
+
|
|
12
18
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
+
|
|
20
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
21
|
+
|
|
13
22
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
23
|
+
|
|
14
24
|
var _window = require("global/window");
|
|
25
|
+
|
|
15
26
|
var _keymirror = _interopRequireDefault(require("keymirror"));
|
|
27
|
+
|
|
16
28
|
var _extensions = require("@deck.gl/extensions");
|
|
29
|
+
|
|
17
30
|
var _core = require("@deck.gl/core");
|
|
31
|
+
|
|
18
32
|
var _carto = require("@deck.gl/carto");
|
|
33
|
+
|
|
19
34
|
var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon"));
|
|
35
|
+
|
|
20
36
|
var _layerUpdate = require("./layer-update");
|
|
37
|
+
|
|
21
38
|
var _d3Color = require("d3-color");
|
|
39
|
+
|
|
22
40
|
var _defaultSettings = require("../constants/default-settings");
|
|
41
|
+
|
|
23
42
|
var _colorRanges = require("../constants/color-ranges");
|
|
43
|
+
|
|
24
44
|
var _customColorRanges = require("../constants/custom-color-ranges");
|
|
45
|
+
|
|
25
46
|
var _layerFactory = require("./layer-factory");
|
|
47
|
+
|
|
26
48
|
var _utils = require("../utils/utils");
|
|
49
|
+
|
|
27
50
|
var _dataUtils = require("../utils/data-utils");
|
|
51
|
+
|
|
28
52
|
var _dataContainerUtils = require("../utils/table-utils/data-container-utils");
|
|
53
|
+
|
|
29
54
|
var _colorUtils = require("../utils/color-utils");
|
|
55
|
+
|
|
30
56
|
var _layerUtils = require("../utils/layer-utils");
|
|
57
|
+
|
|
31
58
|
var _d3Scale = require("d3-scale");
|
|
32
|
-
|
|
59
|
+
|
|
60
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
61
|
+
|
|
33
62
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
34
|
-
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
var
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
43
|
-
// copies of the Software, and to permit persons to whom the Software is
|
|
44
|
-
// furnished to do so, subject to the following conditions:
|
|
45
|
-
//
|
|
46
|
-
// The above copyright notice and this permission notice shall be included in
|
|
47
|
-
// all copies or substantial portions of the Software.
|
|
48
|
-
//
|
|
49
|
-
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
50
|
-
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
51
|
-
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
52
|
-
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
53
|
-
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
54
|
-
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
55
|
-
// THE SOFTWARE.
|
|
56
|
-
/** @typedef {import('./index').Layer} LayerClass} */
|
|
63
|
+
|
|
64
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
65
|
+
|
|
66
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
67
|
+
|
|
68
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
69
|
+
|
|
70
|
+
var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor);
|
|
57
71
|
|
|
58
72
|
/**
|
|
59
73
|
* Approx. number of points to sample in a large data set
|
|
60
|
-
* @type {number}
|
|
61
74
|
*/
|
|
62
|
-
var LAYER_ID_LENGTH =
|
|
75
|
+
var LAYER_ID_LENGTH = 6; // Note, this is is SVG of solid circle encoded as data-uri
|
|
63
76
|
|
|
64
|
-
|
|
77
|
+
exports.LAYER_ID_LENGTH = LAYER_ID_LENGTH;
|
|
65
78
|
var FALLBACK_ICON = 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';
|
|
66
79
|
var MAX_SAMPLE_SIZE = 5000;
|
|
67
80
|
var defaultDomain = [0, 1];
|
|
@@ -69,72 +82,90 @@ var dataFilterExtension = new _extensions.DataFilterExtension({
|
|
|
69
82
|
filterSize: _defaultSettings.MAX_GPU_FILTERS
|
|
70
83
|
});
|
|
71
84
|
var collisionFilterExtension = new _extensions.CollisionFilterExtension();
|
|
85
|
+
|
|
72
86
|
var defaultDataAccessor = function defaultDataAccessor(dc) {
|
|
73
87
|
return function (d) {
|
|
74
88
|
return d;
|
|
75
89
|
};
|
|
76
90
|
};
|
|
91
|
+
|
|
77
92
|
var defaultGetFieldValue = function defaultGetFieldValue(field, d) {
|
|
78
93
|
return field.valueAccessor(d);
|
|
79
94
|
};
|
|
95
|
+
|
|
80
96
|
var scaleIdentity = function scaleIdentity(v) {
|
|
81
97
|
return v;
|
|
82
98
|
};
|
|
83
|
-
|
|
99
|
+
|
|
100
|
+
var OVERLAY_TYPE = (0, _keymirror["default"])({
|
|
84
101
|
deckgl: null,
|
|
85
102
|
mapboxgl: null
|
|
86
103
|
});
|
|
87
|
-
|
|
104
|
+
exports.OVERLAY_TYPE = OVERLAY_TYPE;
|
|
105
|
+
var layerColors = Object.values(_customColorRanges.DataVizColors).map(_colorUtils.hexToRgb);
|
|
106
|
+
exports.layerColors = layerColors;
|
|
107
|
+
|
|
88
108
|
function generateColor() {
|
|
89
109
|
var index;
|
|
90
110
|
return _regenerator["default"].wrap(function generateColor$(_context) {
|
|
91
|
-
while (1)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
case 1:
|
|
95
|
-
if (!(index < layerColors.length + 1)) {
|
|
96
|
-
_context.next = 7;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
if (index === layerColors.length) {
|
|
111
|
+
while (1) {
|
|
112
|
+
switch (_context.prev = _context.next) {
|
|
113
|
+
case 0:
|
|
100
114
|
index = 0;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
115
|
+
|
|
116
|
+
case 1:
|
|
117
|
+
if (!(index < layerColors.length + 1)) {
|
|
118
|
+
_context.next = 7;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (index === layerColors.length) {
|
|
123
|
+
index = 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
_context.next = 5;
|
|
127
|
+
return layerColors[index++];
|
|
128
|
+
|
|
129
|
+
case 5:
|
|
130
|
+
_context.next = 1;
|
|
131
|
+
break;
|
|
132
|
+
|
|
133
|
+
case 7:
|
|
134
|
+
case "end":
|
|
135
|
+
return _context.stop();
|
|
136
|
+
}
|
|
110
137
|
}
|
|
111
138
|
}, _marked);
|
|
112
139
|
}
|
|
113
|
-
var colorMaker = exports.colorMaker = generateColor();
|
|
114
140
|
|
|
115
|
-
|
|
141
|
+
var colorMaker = generateColor();
|
|
142
|
+
exports.colorMaker = colorMaker;
|
|
143
|
+
|
|
116
144
|
var Layer = /*#__PURE__*/function () {
|
|
145
|
+
// TODO: define meta
|
|
146
|
+
// TODO: define _oldDataUpdateTriggers
|
|
117
147
|
function Layer() {
|
|
118
148
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
119
149
|
(0, _classCallCheck2["default"])(this, Layer);
|
|
120
|
-
this
|
|
121
|
-
|
|
122
|
-
this
|
|
150
|
+
(0, _defineProperty2["default"])(this, "id", void 0);
|
|
151
|
+
(0, _defineProperty2["default"])(this, "meta", void 0);
|
|
152
|
+
(0, _defineProperty2["default"])(this, "visConfigSettings", void 0);
|
|
153
|
+
(0, _defineProperty2["default"])(this, "config", void 0);
|
|
154
|
+
(0, _defineProperty2["default"])(this, "_oldDataUpdateTriggers", void 0);
|
|
155
|
+
this.id = props.id || (0, _utils.generateHashId)(LAYER_ID_LENGTH); // meta
|
|
123
156
|
|
|
124
|
-
// legendSettings
|
|
125
|
-
this.legendSettings = {};
|
|
157
|
+
this.meta = {}; // legendSettings
|
|
126
158
|
|
|
127
|
-
// visConfigSettings
|
|
128
|
-
this.visConfigSettings = {};
|
|
159
|
+
this.legendSettings = {}; // visConfigSettings
|
|
129
160
|
|
|
130
|
-
// interactivitySettings
|
|
131
|
-
this._interactivitySettings = {};
|
|
161
|
+
this.visConfigSettings = {}; // interactivitySettings
|
|
132
162
|
|
|
133
|
-
|
|
163
|
+
this._interactivitySettings = {};
|
|
134
164
|
this.config = this.getDefaultLayerConfig(_objectSpread({
|
|
135
165
|
columns: this.getLayerColumns()
|
|
136
166
|
}, props));
|
|
137
167
|
}
|
|
168
|
+
|
|
138
169
|
(0, _createClass2["default"])(Layer, [{
|
|
139
170
|
key: "layerIcon",
|
|
140
171
|
get: function get() {
|
|
@@ -205,20 +236,25 @@ var Layer = /*#__PURE__*/function () {
|
|
|
205
236
|
}
|
|
206
237
|
};
|
|
207
238
|
}
|
|
208
|
-
|
|
239
|
+
}, {
|
|
240
|
+
key: "columnValidators",
|
|
241
|
+
get: function get() {
|
|
242
|
+
return {};
|
|
243
|
+
}
|
|
209
244
|
/*
|
|
210
245
|
* Column pairs maps layer column to a specific field pairs,
|
|
211
246
|
* By default, it is set to null
|
|
212
247
|
*/
|
|
248
|
+
|
|
213
249
|
}, {
|
|
214
250
|
key: "columnPairs",
|
|
215
251
|
get: function get() {
|
|
216
252
|
return null;
|
|
217
253
|
}
|
|
218
|
-
|
|
219
254
|
/*
|
|
220
255
|
* Default point column pairs, can be used for point based layers: point, icon etc.
|
|
221
256
|
*/
|
|
257
|
+
|
|
222
258
|
}, {
|
|
223
259
|
key: "defaultPointColumnPairs",
|
|
224
260
|
get: function get() {
|
|
@@ -233,10 +269,10 @@ var Layer = /*#__PURE__*/function () {
|
|
|
233
269
|
}
|
|
234
270
|
};
|
|
235
271
|
}
|
|
236
|
-
|
|
237
272
|
/*
|
|
238
273
|
* Default link column pairs, can be used for link based layers: arc, line etc
|
|
239
274
|
*/
|
|
275
|
+
|
|
240
276
|
}, {
|
|
241
277
|
key: "defaultLinkColumnPairs",
|
|
242
278
|
get: function get() {
|
|
@@ -259,7 +295,6 @@ var Layer = /*#__PURE__*/function () {
|
|
|
259
295
|
}
|
|
260
296
|
};
|
|
261
297
|
}
|
|
262
|
-
|
|
263
298
|
/**
|
|
264
299
|
* Return a React component for to render layer instructions in a modal
|
|
265
300
|
* @returns {object} - an object
|
|
@@ -272,6 +307,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
272
307
|
* };
|
|
273
308
|
* }
|
|
274
309
|
*/
|
|
310
|
+
|
|
275
311
|
}, {
|
|
276
312
|
key: "layerInfoModal",
|
|
277
313
|
get: function get() {
|
|
@@ -289,24 +325,27 @@ var Layer = /*#__PURE__*/function () {
|
|
|
289
325
|
key: "hasTooltip",
|
|
290
326
|
get: function get() {
|
|
291
327
|
var _this$interactivitySe, _this$interactivitySe2, _this$interactivitySe3, _this$interactivitySe4;
|
|
328
|
+
|
|
292
329
|
return Boolean(((_this$interactivitySe = this.interactivitySettings) === null || _this$interactivitySe === void 0 ? void 0 : (_this$interactivitySe2 = _this$interactivitySe.hover) === null || _this$interactivitySe2 === void 0 ? void 0 : _this$interactivitySe2.fields.length) || ((_this$interactivitySe3 = this.interactivitySettings) === null || _this$interactivitySe3 === void 0 ? void 0 : (_this$interactivitySe4 = _this$interactivitySe3.click) === null || _this$interactivitySe4 === void 0 ? void 0 : _this$interactivitySe4.fields.length));
|
|
293
330
|
}
|
|
294
331
|
}, {
|
|
295
332
|
key: "hasInteractivity",
|
|
296
333
|
get: function get() {
|
|
297
334
|
var _this$interactivitySe5;
|
|
335
|
+
|
|
298
336
|
return Boolean(this.hasTooltip && ((_this$interactivitySe5 = this.interactivitySettings) === null || _this$interactivitySe5 === void 0 ? void 0 : _this$interactivitySe5.enabled));
|
|
299
337
|
}
|
|
300
|
-
|
|
301
338
|
/*
|
|
302
339
|
* Given a dataset, automatically find props to create layer based on it
|
|
303
340
|
* and return the props and previous found layers.
|
|
304
341
|
* By default, no layers will be found
|
|
305
342
|
*/
|
|
343
|
+
|
|
306
344
|
}, {
|
|
307
345
|
key: "getDefaultLayerConfig",
|
|
308
346
|
value: function getDefaultLayerConfig() {
|
|
309
347
|
var _props$visibilityByZo, _props$visibilityByZo2;
|
|
348
|
+
|
|
310
349
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
311
350
|
return {
|
|
312
351
|
dataId: props.dataId || null,
|
|
@@ -316,7 +355,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
316
355
|
},
|
|
317
356
|
label: props.label || _layerFactory.DEFAULT_LAYER_LABEL,
|
|
318
357
|
color: props.color || colorMaker.next().value,
|
|
319
|
-
columns: props.columns ||
|
|
358
|
+
columns: props.columns || {},
|
|
320
359
|
isVisible: props.isVisible || false,
|
|
321
360
|
isConfigActive: props.isConfigActive || false,
|
|
322
361
|
highlightColor: props.highlightColor || _layerFactory.DEFAULT_HIGHLIGHT_COLOR,
|
|
@@ -342,28 +381,36 @@ var Layer = /*#__PURE__*/function () {
|
|
|
342
381
|
}
|
|
343
382
|
};
|
|
344
383
|
}
|
|
345
|
-
|
|
346
384
|
/**
|
|
347
385
|
* Get the description of a visualChannel config
|
|
348
386
|
* @param key
|
|
349
|
-
* @returns
|
|
387
|
+
* @returns
|
|
350
388
|
*/
|
|
389
|
+
|
|
351
390
|
}, {
|
|
352
391
|
key: "getVisualChannelDescription",
|
|
353
392
|
value: function getVisualChannelDescription(key) {
|
|
354
393
|
// e.g. label: Color, measure: Vehicle Type
|
|
394
|
+
var channel = this.visualChannels[key];
|
|
395
|
+
if (!channel) return {
|
|
396
|
+
label: '',
|
|
397
|
+
measure: ''
|
|
398
|
+
};
|
|
399
|
+
var rangeSettings = this.visConfigSettings[channel.range];
|
|
400
|
+
var fieldSettings = this.config[channel.field];
|
|
401
|
+
var label = rangeSettings === null || rangeSettings === void 0 ? void 0 : rangeSettings.label;
|
|
355
402
|
return {
|
|
356
|
-
label: this.
|
|
357
|
-
measure:
|
|
403
|
+
label: typeof label === 'function' ? label(this.config) : label,
|
|
404
|
+
measure: fieldSettings ? fieldSettings.displayName || fieldSettings.name : channel.defaultMeasure
|
|
358
405
|
};
|
|
359
406
|
}
|
|
360
|
-
|
|
361
407
|
/**
|
|
362
408
|
* Assign a field to layer column, return column config
|
|
363
409
|
* @param key - Column Key
|
|
364
410
|
* @param field - Selected field
|
|
365
411
|
* @returns {{}} - Column config
|
|
366
412
|
*/
|
|
413
|
+
|
|
367
414
|
}, {
|
|
368
415
|
key: "assignColumn",
|
|
369
416
|
value: function assignColumn(key, field) {
|
|
@@ -377,29 +424,32 @@ var Layer = /*#__PURE__*/function () {
|
|
|
377
424
|
};
|
|
378
425
|
return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, this.config.columns[key]), update)));
|
|
379
426
|
}
|
|
380
|
-
|
|
381
427
|
/**
|
|
382
428
|
* Assign a field pair to column config, return column config
|
|
383
429
|
* @param key - Column Key
|
|
384
430
|
* @param pair - field Pair
|
|
385
431
|
* @returns {object} - Column config
|
|
386
432
|
*/
|
|
433
|
+
|
|
387
434
|
}, {
|
|
388
435
|
key: "assignColumnPairs",
|
|
389
436
|
value: function assignColumnPairs(key, pair) {
|
|
390
|
-
var _this$columnPairs, _this$columnPairs2, _this$columnPairs3;
|
|
437
|
+
var _this$columnPairs, _this$columnPairs2, _this$columnPairs3, _objectSpread3;
|
|
438
|
+
|
|
391
439
|
if (!this.columnPairs || !((_this$columnPairs = this.columnPairs) !== null && _this$columnPairs !== void 0 && _this$columnPairs[key])) {
|
|
392
440
|
// should not end in this state
|
|
393
441
|
return this.config.columns;
|
|
394
442
|
}
|
|
443
|
+
|
|
395
444
|
var _this$columnPairs$key = (_this$columnPairs2 = this.columnPairs) === null || _this$columnPairs2 === void 0 ? void 0 : _this$columnPairs2[key],
|
|
396
|
-
|
|
397
|
-
|
|
445
|
+
partnerKey = _this$columnPairs$key.pair,
|
|
446
|
+
fieldPairKey = _this$columnPairs$key.fieldPairKey;
|
|
447
|
+
|
|
398
448
|
var _this$columnPairs$par = (_this$columnPairs3 = this.columnPairs) === null || _this$columnPairs3 === void 0 ? void 0 : _this$columnPairs3[partnerKey],
|
|
399
|
-
|
|
400
|
-
return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, key, pair[fieldPairKey]), partnerKey, pair[partnerFieldPairKey]));
|
|
401
|
-
}
|
|
449
|
+
partnerFieldPairKey = _this$columnPairs$par.fieldPairKey;
|
|
402
450
|
|
|
451
|
+
return _objectSpread(_objectSpread({}, this.config.columns), {}, (_objectSpread3 = {}, (0, _defineProperty2["default"])(_objectSpread3, key, pair[fieldPairKey]), (0, _defineProperty2["default"])(_objectSpread3, partnerKey, pair[partnerFieldPairKey]), _objectSpread3));
|
|
452
|
+
}
|
|
403
453
|
/**
|
|
404
454
|
* Calculate a radius zoom multiplier to render points, so they are visible in all zoom level
|
|
405
455
|
* @param {object} mapState
|
|
@@ -407,15 +457,15 @@ var Layer = /*#__PURE__*/function () {
|
|
|
407
457
|
* @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
|
|
408
458
|
* @returns {number}
|
|
409
459
|
*/
|
|
460
|
+
|
|
410
461
|
}, {
|
|
411
462
|
key: "getZoomFactor",
|
|
412
463
|
value: function getZoomFactor(_ref) {
|
|
413
464
|
var zoom = _ref.zoom,
|
|
414
|
-
|
|
415
|
-
|
|
465
|
+
_ref$zoomOffset = _ref.zoomOffset,
|
|
466
|
+
zoomOffset = _ref$zoomOffset === void 0 ? 0 : _ref$zoomOffset;
|
|
416
467
|
return Math.pow(2, Math.max(14 - zoom + zoomOffset, 0));
|
|
417
468
|
}
|
|
418
|
-
|
|
419
469
|
/**
|
|
420
470
|
* Calculate a elevation zoom multiplier to render points, so they are visible in all zoom level
|
|
421
471
|
* @param {object} mapState
|
|
@@ -423,17 +473,18 @@ var Layer = /*#__PURE__*/function () {
|
|
|
423
473
|
* @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
|
|
424
474
|
* @returns {number}
|
|
425
475
|
*/
|
|
476
|
+
|
|
426
477
|
}, {
|
|
427
478
|
key: "getElevationZoomFactor",
|
|
428
479
|
value: function getElevationZoomFactor(_ref2) {
|
|
429
480
|
var zoom = _ref2.zoom,
|
|
430
|
-
|
|
431
|
-
|
|
481
|
+
_ref2$zoomOffset = _ref2.zoomOffset,
|
|
482
|
+
zoomOffset = _ref2$zoomOffset === void 0 ? 0 : _ref2$zoomOffset;
|
|
432
483
|
return this.config.visConfig.enableElevationZoomFactor ? Math.pow(2, Math.max(8 - zoom + zoomOffset, 0)) : 1;
|
|
433
484
|
}
|
|
434
485
|
}, {
|
|
435
486
|
key: "formatLayerData",
|
|
436
|
-
value: function formatLayerData(datasets,
|
|
487
|
+
value: function formatLayerData(datasets, oldLayerData) {
|
|
437
488
|
return {};
|
|
438
489
|
}
|
|
439
490
|
}, {
|
|
@@ -443,55 +494,53 @@ var Layer = /*#__PURE__*/function () {
|
|
|
443
494
|
}
|
|
444
495
|
}, {
|
|
445
496
|
key: "getHoverData",
|
|
446
|
-
value: function getHoverData(object, dataContainer) {
|
|
497
|
+
value: function getHoverData(object, dataContainer, fields) {
|
|
447
498
|
if (!object) {
|
|
448
499
|
return null;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// By default, each entry of layerData should have an index of a row in the original data container.
|
|
500
|
+
} // By default, each entry of layerData should have an index of a row in the original data container.
|
|
452
501
|
// Each layer can implement its own getHoverData method
|
|
502
|
+
|
|
503
|
+
|
|
453
504
|
return dataContainer.row(object.index);
|
|
454
505
|
}
|
|
455
|
-
|
|
456
506
|
/**
|
|
457
507
|
* When change layer type, try to copy over layer configs as much as possible
|
|
458
508
|
* @param configToCopy - config to copy over
|
|
459
509
|
* @param visConfigSettings - visConfig settings of config to copy
|
|
460
510
|
*/
|
|
511
|
+
|
|
461
512
|
}, {
|
|
462
513
|
key: "assignConfigToLayer",
|
|
463
514
|
value: function assignConfigToLayer(configToCopy, visConfigSettings) {
|
|
464
515
|
var _this = this;
|
|
516
|
+
|
|
465
517
|
// don't deep merge visualChannel field
|
|
466
518
|
// don't deep merge color range, reversed: is not a key by default
|
|
467
519
|
var shallowCopy = ['colorRange', 'strokeColorRange'].concat(Object.values(this.visualChannels).map(function (v) {
|
|
468
520
|
return v.field;
|
|
469
|
-
}));
|
|
521
|
+
})); // don't copy over domain and animation
|
|
470
522
|
|
|
471
|
-
// don't copy over domain and animation
|
|
472
523
|
var notToCopy = ['animation'].concat(Object.values(this.visualChannels).map(function (v) {
|
|
473
524
|
return v.domain;
|
|
474
|
-
}));
|
|
475
|
-
|
|
525
|
+
})); // if range is for the same property group copy it, otherwise, not to copy
|
|
526
|
+
|
|
476
527
|
Object.values(this.visualChannels).forEach(function (v) {
|
|
477
528
|
if (configToCopy.visConfig[v.range] && _this.visConfigSettings[v.range] && visConfigSettings[v.range].group !== _this.visConfigSettings[v.range].group) {
|
|
478
529
|
notToCopy.push(v.range);
|
|
479
530
|
}
|
|
480
|
-
});
|
|
531
|
+
}); // don't copy over visualChannel range
|
|
481
532
|
|
|
482
|
-
// don't copy over visualChannel range
|
|
483
533
|
var currentConfig = this.config;
|
|
484
534
|
var copied = this.copyLayerConfig(currentConfig, configToCopy, {
|
|
485
535
|
shallowCopy: shallowCopy,
|
|
486
536
|
notToCopy: notToCopy
|
|
487
537
|
});
|
|
488
|
-
this.updateLayerConfig(copied);
|
|
489
|
-
|
|
538
|
+
this.updateLayerConfig(copied); // validate visualChannel field type and scale types
|
|
539
|
+
|
|
490
540
|
Object.keys(this.visualChannels).forEach(function (channel) {
|
|
491
541
|
_this.validateVisualChannel(channel);
|
|
492
542
|
});
|
|
493
543
|
}
|
|
494
|
-
|
|
495
544
|
/*
|
|
496
545
|
* Recursively copy config over to an empty layer
|
|
497
546
|
* when received saved config, or copy config over from a different layer type
|
|
@@ -502,15 +551,18 @@ var Layer = /*#__PURE__*/function () {
|
|
|
502
551
|
* @param {string[]} notToCopy - array of properties not to copy
|
|
503
552
|
* @returns {object} - copied config
|
|
504
553
|
*/
|
|
554
|
+
|
|
505
555
|
}, {
|
|
506
556
|
key: "copyLayerConfig",
|
|
507
557
|
value: function copyLayerConfig(currentConfig, configToCopy) {
|
|
508
558
|
var _this2 = this;
|
|
559
|
+
|
|
509
560
|
var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
561
|
+
_ref3$shallowCopy = _ref3.shallowCopy,
|
|
562
|
+
shallowCopy = _ref3$shallowCopy === void 0 ? [] : _ref3$shallowCopy,
|
|
563
|
+
_ref3$notToCopy = _ref3.notToCopy,
|
|
564
|
+
notToCopy = _ref3$notToCopy === void 0 ? [] : _ref3$notToCopy;
|
|
565
|
+
|
|
514
566
|
var copied = {};
|
|
515
567
|
Object.keys(currentConfig).forEach(function (key) {
|
|
516
568
|
if ((0, _utils.isPlainObject)(currentConfig[key]) && (0, _utils.isPlainObject)(configToCopy[key]) && !shallowCopy.includes(key) && !notToCopy.includes(key)) {
|
|
@@ -533,25 +585,28 @@ var Layer = /*#__PURE__*/function () {
|
|
|
533
585
|
key: "registerVisConfig",
|
|
534
586
|
value: function registerVisConfig(layerVisConfigs) {
|
|
535
587
|
var _this3 = this;
|
|
588
|
+
|
|
536
589
|
Object.keys(layerVisConfigs).forEach(function (item) {
|
|
537
|
-
|
|
590
|
+
var configItem = layerVisConfigs[item];
|
|
591
|
+
|
|
592
|
+
if (typeof configItem === 'string' && _layerFactory.LAYER_VIS_CONFIGS[configItem]) {
|
|
538
593
|
// if assigned one of default LAYER_CONFIGS
|
|
539
|
-
_this3.config.visConfig[item] = _layerFactory.LAYER_VIS_CONFIGS[
|
|
540
|
-
_this3.visConfigSettings[item] = _layerFactory.LAYER_VIS_CONFIGS[
|
|
541
|
-
} else if (['type', 'defaultValue'].every(function (p) {
|
|
542
|
-
return
|
|
594
|
+
_this3.config.visConfig[item] = _layerFactory.LAYER_VIS_CONFIGS[configItem].defaultValue;
|
|
595
|
+
_this3.visConfigSettings[item] = _layerFactory.LAYER_VIS_CONFIGS[configItem];
|
|
596
|
+
} else if ((0, _typeof2["default"])(configItem) === 'object' && ['type', 'defaultValue'].every(function (p) {
|
|
597
|
+
return configItem.hasOwnProperty(p);
|
|
543
598
|
})) {
|
|
544
599
|
// if provided customized visConfig, and has type && defaultValue
|
|
545
600
|
// TODO: further check if customized visConfig is valid
|
|
546
|
-
_this3.config.visConfig[item] =
|
|
547
|
-
_this3.visConfigSettings[item] =
|
|
601
|
+
_this3.config.visConfig[item] = configItem.defaultValue;
|
|
602
|
+
_this3.visConfigSettings[item] = configItem;
|
|
548
603
|
}
|
|
549
604
|
});
|
|
550
605
|
}
|
|
551
606
|
}, {
|
|
552
607
|
key: "getLayerColumns",
|
|
553
608
|
value: function getLayerColumns() {
|
|
554
|
-
var columnValidators = this.columnValidators
|
|
609
|
+
var columnValidators = this.columnValidators;
|
|
555
610
|
var required = this.requiredLayerColumns.reduce(function (accu, key) {
|
|
556
611
|
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnValidators[key] ? {
|
|
557
612
|
value: null,
|
|
@@ -587,28 +642,35 @@ var Layer = /*#__PURE__*/function () {
|
|
|
587
642
|
key: "updateLayerColorUI",
|
|
588
643
|
value: function updateLayerColorUI(prop, newConfig) {
|
|
589
644
|
var _this$config = this.config,
|
|
590
|
-
|
|
591
|
-
|
|
645
|
+
previous = _this$config.colorUI,
|
|
646
|
+
visConfig = _this$config.visConfig;
|
|
647
|
+
|
|
592
648
|
if (!(0, _utils.isPlainObject)(newConfig) || typeof prop !== 'string') {
|
|
593
649
|
return this;
|
|
594
650
|
}
|
|
651
|
+
|
|
595
652
|
var colorUIProp = Object.entries(newConfig).reduce(function (accu, _ref4) {
|
|
596
653
|
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
|
597
|
-
|
|
598
|
-
|
|
654
|
+
key = _ref5[0],
|
|
655
|
+
value = _ref5[1];
|
|
656
|
+
|
|
599
657
|
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(accu[key]) && (0, _utils.isPlainObject)(value) ? _objectSpread(_objectSpread({}, accu[key]), value) : value));
|
|
600
658
|
}, previous[prop] || _layerFactory.DEFAULT_COLOR_UI);
|
|
659
|
+
|
|
601
660
|
var colorUI = _objectSpread(_objectSpread({}, previous), {}, (0, _defineProperty2["default"])({}, prop, colorUIProp));
|
|
661
|
+
|
|
602
662
|
this.updateLayerConfig({
|
|
603
663
|
colorUI: colorUI
|
|
604
|
-
});
|
|
605
|
-
|
|
664
|
+
}); // if colorUI[prop] is colorRange. If type is hexColor then it's also a range
|
|
665
|
+
|
|
606
666
|
var isColorRange = visConfig[prop] && (visConfig[prop].colors || visConfig[prop].type === _colorRanges.hexColor);
|
|
667
|
+
|
|
607
668
|
if (isColorRange) {
|
|
608
669
|
this.updateColorUIByColorRange(newConfig, prop);
|
|
609
670
|
this.updateColorRangeByColorUI(newConfig, previous, prop);
|
|
610
671
|
this.updateCustomPalette(newConfig, previous, prop);
|
|
611
672
|
}
|
|
673
|
+
|
|
612
674
|
return this;
|
|
613
675
|
}
|
|
614
676
|
}, {
|
|
@@ -617,15 +679,18 @@ var Layer = /*#__PURE__*/function () {
|
|
|
617
679
|
if (!newConfig.colorRangeConfig || !newConfig.colorRangeConfig.custom) {
|
|
618
680
|
return;
|
|
619
681
|
}
|
|
682
|
+
|
|
620
683
|
var _this$config2 = this.config,
|
|
621
|
-
|
|
622
|
-
|
|
684
|
+
colorUI = _this$config2.colorUI,
|
|
685
|
+
visConfig = _this$config2.visConfig;
|
|
623
686
|
if (!visConfig[prop]) return;
|
|
624
687
|
var colors = visConfig[prop].colors;
|
|
688
|
+
|
|
625
689
|
var customPalette = _objectSpread(_objectSpread({}, colorUI[prop].customPalette), {}, {
|
|
626
690
|
name: 'Custom Palette',
|
|
627
691
|
colors: (0, _toConsumableArray2["default"])(colors)
|
|
628
692
|
});
|
|
693
|
+
|
|
629
694
|
this.updateLayerConfig({
|
|
630
695
|
colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
|
|
631
696
|
customPalette: customPalette
|
|
@@ -638,14 +703,16 @@ var Layer = /*#__PURE__*/function () {
|
|
|
638
703
|
* @param {*} newConfig
|
|
639
704
|
* @param {*} prop
|
|
640
705
|
*/
|
|
706
|
+
|
|
641
707
|
}, {
|
|
642
708
|
key: "updateColorUIByColorRange",
|
|
643
709
|
value: function updateColorUIByColorRange(newConfig, prop) {
|
|
644
710
|
var _visConfig$prop$color;
|
|
711
|
+
|
|
645
712
|
if (typeof newConfig.showDropdown !== 'number') return;
|
|
646
713
|
var _this$config3 = this.config,
|
|
647
|
-
|
|
648
|
-
|
|
714
|
+
colorUI = _this$config3.colorUI,
|
|
715
|
+
visConfig = _this$config3.visConfig;
|
|
649
716
|
this.updateLayerConfig({
|
|
650
717
|
colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
|
|
651
718
|
colorRangeConfig: _objectSpread(_objectSpread({}, colorUI[prop].colorRangeConfig), {}, {
|
|
@@ -657,9 +724,8 @@ var Layer = /*#__PURE__*/function () {
|
|
|
657
724
|
})
|
|
658
725
|
})))
|
|
659
726
|
});
|
|
660
|
-
}
|
|
727
|
+
} // eslint-disable-next-line complexity
|
|
661
728
|
|
|
662
|
-
// eslint-disable-next-line complexity
|
|
663
729
|
}, {
|
|
664
730
|
key: "updateColorRangeByColorUI",
|
|
665
731
|
value: function updateColorRangeByColorUI(newConfig, previous, prop) {
|
|
@@ -669,34 +735,41 @@ var Layer = /*#__PURE__*/function () {
|
|
|
669
735
|
});
|
|
670
736
|
if (!shouldUpdate) return;
|
|
671
737
|
var _this$config4 = this.config,
|
|
672
|
-
|
|
673
|
-
|
|
738
|
+
colorUI = _this$config4.colorUI,
|
|
739
|
+
visConfig = _this$config4.visConfig;
|
|
674
740
|
var _colorUI$prop$colorRa = colorUI[prop].colorRangeConfig,
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
var colorRange = visConfig[prop];
|
|
678
|
-
|
|
741
|
+
steps = _colorUI$prop$colorRa.steps,
|
|
742
|
+
reversed = _colorUI$prop$colorRa.reversed;
|
|
743
|
+
var colorRange = visConfig[prop]; // find based on step or reversed
|
|
744
|
+
|
|
679
745
|
var update;
|
|
746
|
+
|
|
680
747
|
if (newConfig.colorRangeConfig.hasOwnProperty('steps')) {
|
|
681
748
|
var group = (0, _colorUtils.getColorGroupByName)(colorRange);
|
|
749
|
+
|
|
682
750
|
if (group) {
|
|
683
751
|
var sameGroup = _colorRanges.COLOR_RANGES.filter(function (cr) {
|
|
684
752
|
return (0, _colorUtils.getColorGroupByName)(cr) === group;
|
|
685
753
|
});
|
|
754
|
+
|
|
686
755
|
update = sameGroup.find(function (cr) {
|
|
687
756
|
return cr.colors.length === steps;
|
|
688
757
|
});
|
|
758
|
+
|
|
689
759
|
if (update && colorRange.reversed) {
|
|
690
760
|
update = (0, _colorUtils.reverseColorRange)(true, update);
|
|
691
761
|
}
|
|
762
|
+
|
|
692
763
|
if (update && colorRange.colorMap) {
|
|
693
764
|
update = this.updateColorMap(prop, colorRange.colorMap, update);
|
|
694
765
|
}
|
|
695
766
|
}
|
|
696
767
|
}
|
|
768
|
+
|
|
697
769
|
if (newConfig.colorRangeConfig.hasOwnProperty('reversed')) {
|
|
698
770
|
update = (0, _colorUtils.reverseColorRange)(reversed, update || colorRange);
|
|
699
771
|
}
|
|
772
|
+
|
|
700
773
|
if (update) {
|
|
701
774
|
this.updateLayerVisConfig((0, _defineProperty2["default"])({}, prop, update));
|
|
702
775
|
}
|
|
@@ -705,18 +778,21 @@ var Layer = /*#__PURE__*/function () {
|
|
|
705
778
|
key: "updateColorMap",
|
|
706
779
|
value: function updateColorMap(prop, colorMap, colorRange) {
|
|
707
780
|
var _this$config$field;
|
|
781
|
+
|
|
708
782
|
// @ts-ignore
|
|
709
783
|
var _Object$values$find = Object.values(this.visualChannels).find(function (value) {
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
784
|
+
return value.range === prop;
|
|
785
|
+
}),
|
|
786
|
+
field = _Object$values$find.field,
|
|
787
|
+
domain = _Object$values$find.domain;
|
|
788
|
+
|
|
714
789
|
var type = (_this$config$field = this.config[field]) === null || _this$config$field === void 0 ? void 0 : _this$config$field.type;
|
|
790
|
+
|
|
715
791
|
if (type === 'string' || type === 'boolean' || type === 'date') {
|
|
716
792
|
return this.updateCategoryColorMap(colorMap, this.config[domain], colorRange);
|
|
717
|
-
}
|
|
793
|
+
} // If no type or type is not string, boolean or date
|
|
794
|
+
|
|
718
795
|
|
|
719
|
-
// If no type or type is not string, boolean or date
|
|
720
796
|
return this.updateNumericColorMap(colorMap, this.config[domain], colorRange);
|
|
721
797
|
}
|
|
722
798
|
}, {
|
|
@@ -724,27 +800,33 @@ var Layer = /*#__PURE__*/function () {
|
|
|
724
800
|
value: function updateCategoryColorMap(colorMap, domain, colorRange) {
|
|
725
801
|
var colors = colorRange.colors;
|
|
726
802
|
var assignedCategories = [];
|
|
803
|
+
|
|
727
804
|
if (colorRange.type === _colorRanges.hexColor) {
|
|
728
805
|
return _objectSpread(_objectSpread({}, colorRange), {}, {
|
|
729
806
|
colorMap: []
|
|
730
807
|
});
|
|
731
808
|
}
|
|
809
|
+
|
|
732
810
|
var newColorMap = colorMap.slice(0, colors.length).map(function (cMap, index) {
|
|
733
811
|
assignedCategories.push(cMap[0]);
|
|
734
812
|
return [cMap[0], colors[index]];
|
|
735
813
|
});
|
|
736
814
|
var unassignedColors = colors.slice(newColorMap.length, colors.length);
|
|
815
|
+
|
|
737
816
|
var _iterator = _createForOfIteratorHelper(unassignedColors),
|
|
738
|
-
|
|
817
|
+
_step;
|
|
818
|
+
|
|
739
819
|
try {
|
|
740
820
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
741
821
|
var color = _step.value;
|
|
742
822
|
var category = domain.find(function (d) {
|
|
743
823
|
return !assignedCategories.includes(d);
|
|
744
824
|
});
|
|
825
|
+
|
|
745
826
|
if (!category) {
|
|
746
827
|
break;
|
|
747
828
|
}
|
|
829
|
+
|
|
748
830
|
assignedCategories.push(category);
|
|
749
831
|
newColorMap.push([category, color]);
|
|
750
832
|
}
|
|
@@ -753,6 +835,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
753
835
|
} finally {
|
|
754
836
|
_iterator.f();
|
|
755
837
|
}
|
|
838
|
+
|
|
756
839
|
return _objectSpread(_objectSpread({}, colorRange), {}, {
|
|
757
840
|
colorMap: newColorMap
|
|
758
841
|
});
|
|
@@ -767,6 +850,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
767
850
|
return [value, colors[index]];
|
|
768
851
|
});
|
|
769
852
|
var unassignedColors = colors.slice(newColorMap.length, colors.length);
|
|
853
|
+
|
|
770
854
|
if (unassignedColors.length > 0) {
|
|
771
855
|
var colorMapValues = colorMap.map(function (c) {
|
|
772
856
|
return c[0];
|
|
@@ -777,13 +861,16 @@ var Layer = /*#__PURE__*/function () {
|
|
|
777
861
|
var prevValue = newColorMap[newColorMap.length - 2][0];
|
|
778
862
|
var step = (maxValue - prevValue) / (unassignedColors.length + 1);
|
|
779
863
|
newColorMap[newColorMap.length - 1][0] = prevValue + step;
|
|
864
|
+
|
|
780
865
|
var _iterator2 = _createForOfIteratorHelper(unassignedColors.entries()),
|
|
781
|
-
|
|
866
|
+
_step2;
|
|
867
|
+
|
|
782
868
|
try {
|
|
783
869
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
784
870
|
var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
|
|
785
|
-
|
|
786
|
-
|
|
871
|
+
i = _step2$value[0],
|
|
872
|
+
color = _step2$value[1];
|
|
873
|
+
|
|
787
874
|
var value = i === unassignedColors.length - 1 ? null : prevValue + step * (i + 2);
|
|
788
875
|
newColorMap.push([value, color]);
|
|
789
876
|
}
|
|
@@ -793,15 +880,16 @@ var Layer = /*#__PURE__*/function () {
|
|
|
793
880
|
_iterator2.f();
|
|
794
881
|
}
|
|
795
882
|
}
|
|
883
|
+
|
|
796
884
|
return _objectSpread(_objectSpread({}, update), {}, {
|
|
797
885
|
colorMap: newColorMap
|
|
798
886
|
});
|
|
799
887
|
}
|
|
800
|
-
|
|
801
888
|
/**
|
|
802
889
|
* Check whether layer has all columns
|
|
803
|
-
* @returns
|
|
890
|
+
* @returns yes or no
|
|
804
891
|
*/
|
|
892
|
+
|
|
805
893
|
}, {
|
|
806
894
|
key: "hasAllColumns",
|
|
807
895
|
value: function hasAllColumns() {
|
|
@@ -810,30 +898,31 @@ var Layer = /*#__PURE__*/function () {
|
|
|
810
898
|
return Boolean(v.optional || v.value && v.fieldIdx > -1);
|
|
811
899
|
});
|
|
812
900
|
}
|
|
813
|
-
|
|
814
901
|
/**
|
|
815
902
|
* Check whether layer has data
|
|
816
903
|
*
|
|
817
904
|
* @param {Array | Object} layerData
|
|
818
905
|
* @returns {boolean} yes or no
|
|
819
906
|
*/
|
|
907
|
+
|
|
820
908
|
}, {
|
|
821
909
|
key: "hasLayerData",
|
|
822
910
|
value: function hasLayerData(layerData) {
|
|
823
911
|
if (!layerData) {
|
|
824
912
|
return false;
|
|
825
913
|
}
|
|
914
|
+
|
|
826
915
|
return Boolean(layerData.data && layerData.data.length);
|
|
827
916
|
}
|
|
828
917
|
}, {
|
|
829
918
|
key: "isValidToSave",
|
|
830
919
|
value: function isValidToSave() {
|
|
831
|
-
return this.type && this.hasAllColumns();
|
|
920
|
+
return Boolean(this.type && this.hasAllColumns());
|
|
832
921
|
}
|
|
833
922
|
}, {
|
|
834
923
|
key: "shouldRenderLayer",
|
|
835
924
|
value: function shouldRenderLayer(data) {
|
|
836
|
-
return this.type && this.hasAllColumns() && this.hasLayerData(data) && typeof this.renderLayer === 'function';
|
|
925
|
+
return Boolean(this.type) && this.hasAllColumns() && this.hasLayerData(data) && typeof this.renderLayer === 'function';
|
|
837
926
|
}
|
|
838
927
|
}, {
|
|
839
928
|
key: "getColorScale",
|
|
@@ -841,61 +930,69 @@ var Layer = /*#__PURE__*/function () {
|
|
|
841
930
|
if (colorRange.type === _colorRanges.hexColor) {
|
|
842
931
|
return function (_, color) {
|
|
843
932
|
var _rgb = (0, _d3Color.rgb)(color),
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
933
|
+
r = _rgb.r,
|
|
934
|
+
g = _rgb.g,
|
|
935
|
+
b = _rgb.b;
|
|
936
|
+
|
|
847
937
|
return [r, g, b].some(isNaN) ? _defaultSettings.UNKNOWN_COLOR : [r, g, b];
|
|
848
938
|
};
|
|
849
939
|
} else if (Array.isArray(colorRange.colorMap)) {
|
|
850
940
|
var cMap = new Map();
|
|
851
941
|
colorRange.colorMap.forEach(function (_ref6) {
|
|
852
942
|
var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
|
|
853
|
-
|
|
854
|
-
|
|
943
|
+
k = _ref7[0],
|
|
944
|
+
v = _ref7[1];
|
|
945
|
+
|
|
855
946
|
cMap.set(k, typeof v === 'string' ? (0, _colorUtils.hexToRgb)(v) : v);
|
|
856
947
|
});
|
|
857
948
|
|
|
858
|
-
|
|
859
|
-
|
|
949
|
+
var scale = _defaultSettings.SCALE_FUNC[colorScale]().domain(cMap.keys()).range(cMap.values()).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
950
|
+
|
|
860
951
|
return scale;
|
|
861
952
|
}
|
|
953
|
+
|
|
862
954
|
return this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb));
|
|
863
955
|
}
|
|
864
956
|
}, {
|
|
865
957
|
key: "getCustomMarkersScale",
|
|
866
958
|
value: function getCustomMarkersScale(range, fallbackIcon) {
|
|
867
959
|
var unknownValue = fallbackIcon || FALLBACK_ICON;
|
|
960
|
+
|
|
868
961
|
if (!range) {
|
|
869
962
|
return function () {
|
|
870
963
|
return unknownValue;
|
|
871
964
|
};
|
|
872
965
|
}
|
|
966
|
+
|
|
873
967
|
var mapping = new Map();
|
|
968
|
+
|
|
874
969
|
if (range.othersMarker) {
|
|
875
970
|
unknownValue = range.othersMarker;
|
|
876
971
|
}
|
|
972
|
+
|
|
877
973
|
var _iterator3 = _createForOfIteratorHelper(range.markerMap),
|
|
878
|
-
|
|
974
|
+
_step3;
|
|
975
|
+
|
|
879
976
|
try {
|
|
880
977
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
881
978
|
var _step3$value = _step3.value,
|
|
882
|
-
|
|
883
|
-
|
|
979
|
+
value = _step3$value.value,
|
|
980
|
+
markerUrl = _step3$value.markerUrl;
|
|
981
|
+
|
|
884
982
|
if (markerUrl) {
|
|
885
983
|
mapping.set(value, markerUrl);
|
|
886
984
|
}
|
|
887
|
-
}
|
|
985
|
+
} // @ts-ignore d3 scale
|
|
888
986
|
|
|
889
|
-
// @ts-ignore d3 scale
|
|
890
987
|
} catch (err) {
|
|
891
988
|
_iterator3.e(err);
|
|
892
989
|
} finally {
|
|
893
990
|
_iterator3.f();
|
|
894
991
|
}
|
|
992
|
+
|
|
895
993
|
var scale = (0, _d3Scale.scaleOrdinal)().domain(Array.from(mapping.keys())).range(Array.from(mapping.values())).unknown(unknownValue);
|
|
896
994
|
return scale;
|
|
897
995
|
}
|
|
898
|
-
|
|
899
996
|
/**
|
|
900
997
|
* Mapping from visual channels to deck.gl accesors
|
|
901
998
|
* @param {Object} param Parameters
|
|
@@ -903,38 +1000,40 @@ var Layer = /*#__PURE__*/function () {
|
|
|
903
1000
|
* @param {import('utils/table-utils/data-container-interface').DataContainerInterface} param.dataContainer DataContainer to use use with dataAccessor
|
|
904
1001
|
* @return {Object} attributeAccessors - deck.gl layer attribute accessors
|
|
905
1002
|
*/
|
|
1003
|
+
|
|
906
1004
|
}, {
|
|
907
1005
|
key: "getAttributeAccessors",
|
|
908
1006
|
value: function getAttributeAccessors(_ref8) {
|
|
909
1007
|
var _this4 = this;
|
|
1008
|
+
|
|
910
1009
|
var _ref8$dataAccessor = _ref8.dataAccessor,
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
var attributeAccessors = {};
|
|
1010
|
+
dataAccessor = _ref8$dataAccessor === void 0 ? defaultDataAccessor : _ref8$dataAccessor,
|
|
1011
|
+
dataContainer = _ref8.dataContainer;
|
|
1012
|
+
var attributeAccessors = {}; // eslint-disable-next-line complexity
|
|
914
1013
|
|
|
915
|
-
// eslint-disable-next-line complexity
|
|
916
1014
|
Object.keys(this.visualChannels).forEach(function (channel) {
|
|
917
1015
|
var _this4$visualChannels = _this4.visualChannels[channel],
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
1016
|
+
field = _this4$visualChannels.field,
|
|
1017
|
+
fixed = _this4$visualChannels.fixed,
|
|
1018
|
+
scale = _this4$visualChannels.scale,
|
|
1019
|
+
domain = _this4$visualChannels.domain,
|
|
1020
|
+
range = _this4$visualChannels.range,
|
|
1021
|
+
accessor = _this4$visualChannels.accessor,
|
|
1022
|
+
defaultValue = _this4$visualChannels.defaultValue,
|
|
1023
|
+
getAttributeValue = _this4$visualChannels.getAttributeValue,
|
|
1024
|
+
nullValue = _this4$visualChannels.nullValue,
|
|
1025
|
+
channelScaleType = _this4$visualChannels.channelScaleType,
|
|
1026
|
+
aggregation = _this4$visualChannels.aggregation;
|
|
929
1027
|
var shouldGetScale = Boolean((scale || channelScaleType === _defaultSettings.CHANNEL_SCALES.identity) && _this4.config[field]);
|
|
1028
|
+
|
|
930
1029
|
if (shouldGetScale) {
|
|
931
|
-
var
|
|
932
|
-
var isFixed = fixed && _this4.config.visConfig[fixed];
|
|
933
|
-
// It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
|
|
1030
|
+
var isFixed = fixed && _this4.config.visConfig[fixed]; // It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
|
|
934
1031
|
// otherwise, the oldLayerData parameter in formatLayerData method will be wrong (you can check the formatLayerData TileLayer method in Builder as example)
|
|
1032
|
+
|
|
935
1033
|
var fieldConfig = _this4.config[field];
|
|
936
1034
|
var aggregationValue = _this4.config.visConfig[aggregation];
|
|
937
|
-
var scaleFunction = channelScaleType === _defaultSettings.CHANNEL_SCALES.identity ? scaleIdentity : channelScaleType === _defaultSettings.CHANNEL_SCALES.color ? _this4.getColorScale
|
|
1035
|
+
var scaleFunction = channelScaleType === _defaultSettings.CHANNEL_SCALES.identity ? scaleIdentity : channelScaleType === _defaultSettings.CHANNEL_SCALES.color ? _this4.getColorScale(_this4.config[scale], _this4.config[domain], _this4.config.visConfig[range]) : channelScaleType === _defaultSettings.CHANNEL_SCALES.customMarker ? _this4.getCustomMarkersScale(_this4.config.visConfig[range], _this4.config.visConfig.customMarkersUrl) : _this4.getVisChannelScale(_this4.config[scale], _this4.config[domain], _this4.config.visConfig[range], isFixed);
|
|
1036
|
+
|
|
938
1037
|
attributeAccessors[accessor] = function (d) {
|
|
939
1038
|
return _this4.getEncodedChannelValue({
|
|
940
1039
|
channel: channel,
|
|
@@ -951,6 +1050,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
951
1050
|
} else {
|
|
952
1051
|
attributeAccessors[accessor] = typeof defaultValue === 'function' ? defaultValue(_this4.config) : defaultValue;
|
|
953
1052
|
}
|
|
1053
|
+
|
|
954
1054
|
if (!(accessor in attributeAccessors)) {
|
|
955
1055
|
_window.console.warn("Failed to provide accessor function for ".concat(accessor || channel));
|
|
956
1056
|
}
|
|
@@ -961,28 +1061,29 @@ var Layer = /*#__PURE__*/function () {
|
|
|
961
1061
|
key: "getVisChannelScale",
|
|
962
1062
|
value: function getVisChannelScale(scale, domain, range, fixed) {
|
|
963
1063
|
if (scale === _defaultSettings.SCALE_TYPES.ordinal) {
|
|
964
|
-
// @ts-ignore d3-scale type
|
|
965
1064
|
return _defaultSettings.SCALE_FUNC[scale]().domain(domain.slice(0, range.length)).range(range).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
// for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
|
|
1065
|
+
} // for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
|
|
969
1066
|
// to use it, so skip specyfying this domains
|
|
1067
|
+
|
|
1068
|
+
|
|
970
1069
|
var domainIsInfinite = domain && domain[0] === 0 && domain[1] === Infinity;
|
|
971
|
-
var scaleFactory = _defaultSettings.SCALE_FUNC[fixed ? 'linear' : scale];
|
|
972
|
-
|
|
1070
|
+
var scaleFactory = _defaultSettings.SCALE_FUNC[fixed ? 'linear' : scale]; // @ts-ignore d3-scale type
|
|
1071
|
+
|
|
973
1072
|
var result = scaleFactory();
|
|
1073
|
+
|
|
974
1074
|
if (domain && !domainIsInfinite) {
|
|
975
1075
|
result = result.domain(domain);
|
|
976
1076
|
}
|
|
1077
|
+
|
|
977
1078
|
return result.range(fixed ? domain : range);
|
|
978
1079
|
}
|
|
979
|
-
|
|
980
1080
|
/**
|
|
981
1081
|
* Get longitude and latitude bounds of the data.
|
|
982
1082
|
* @param {import('utils/table-utils/data-container-interface').DataContainerInterface} dataContainer DataContainer to calculate bounds for.
|
|
983
1083
|
* @param {(d: {index: number}, dc: import('utils/table-utils/data-container-interface').DataContainerInterface) => number[]} getPosition Access kepler.gl layer data from deck.gl layer
|
|
984
1084
|
* @return {number[]|null} bounds of the data.
|
|
985
1085
|
*/
|
|
1086
|
+
|
|
986
1087
|
}, {
|
|
987
1088
|
key: "getPointsBounds",
|
|
988
1089
|
value: function getPointsBounds(dataContainer, getPosition) {
|
|
@@ -992,9 +1093,11 @@ var Layer = /*#__PURE__*/function () {
|
|
|
992
1093
|
var points = sampleData.mapIndex(getPosition);
|
|
993
1094
|
var latBounds = (0, _dataUtils.getLatLngBounds)(points, 1, [-90, 90]);
|
|
994
1095
|
var lngBounds = (0, _dataUtils.getLatLngBounds)(points, 0, [-180, 180]);
|
|
1096
|
+
|
|
995
1097
|
if (!latBounds || !lngBounds) {
|
|
996
1098
|
return null;
|
|
997
1099
|
}
|
|
1100
|
+
|
|
998
1101
|
return [lngBounds[0], latBounds[0], lngBounds[1], latBounds[1]];
|
|
999
1102
|
}
|
|
1000
1103
|
}, {
|
|
@@ -1008,20 +1111,22 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1008
1111
|
key: "getEncodedChannelValue",
|
|
1009
1112
|
value: function getEncodedChannelValue(_ref9) {
|
|
1010
1113
|
var channel = _ref9.channel,
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1114
|
+
scale = _ref9.scale,
|
|
1115
|
+
data = _ref9.data,
|
|
1116
|
+
field = _ref9.field,
|
|
1117
|
+
dataContainer = _ref9.dataContainer,
|
|
1118
|
+
_aggregation = _ref9._aggregation,
|
|
1119
|
+
_ref9$nullValue = _ref9.nullValue,
|
|
1120
|
+
nullValue = _ref9$nullValue === void 0 ? _defaultSettings.NO_VALUE_COLOR : _ref9$nullValue,
|
|
1121
|
+
_ref9$getValue = _ref9.getValue,
|
|
1122
|
+
getValue = _ref9$getValue === void 0 ? defaultGetFieldValue : _ref9$getValue;
|
|
1123
|
+
// @ts-expect-error TODO: VisualChannelField better typing
|
|
1021
1124
|
var type = field.type;
|
|
1022
1125
|
var value = getValue(field, data);
|
|
1023
1126
|
var channelConfig = this.config.visConfig[this.visualChannels[channel].range];
|
|
1024
1127
|
var channelField = this.config[this.visualChannels[channel].field];
|
|
1128
|
+
var colorColumnValue;
|
|
1129
|
+
|
|
1025
1130
|
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor) {
|
|
1026
1131
|
var columnField = {
|
|
1027
1132
|
id: channelField.colorColumn,
|
|
@@ -1035,7 +1140,9 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1035
1140
|
} else if (!(0, _dataUtils.notNullorUndefined)(value)) {
|
|
1036
1141
|
return nullValue;
|
|
1037
1142
|
}
|
|
1143
|
+
|
|
1038
1144
|
var attributeValue;
|
|
1145
|
+
|
|
1039
1146
|
if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) {
|
|
1040
1147
|
// shouldn't need to convert here
|
|
1041
1148
|
// scale Function should take care of it
|
|
@@ -1043,9 +1150,11 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1043
1150
|
} else {
|
|
1044
1151
|
attributeValue = scale(value, colorColumnValue);
|
|
1045
1152
|
}
|
|
1153
|
+
|
|
1046
1154
|
if (!(0, _dataUtils.notNullorUndefined)(attributeValue)) {
|
|
1047
1155
|
attributeValue = nullValue;
|
|
1048
1156
|
}
|
|
1157
|
+
|
|
1049
1158
|
return attributeValue;
|
|
1050
1159
|
}
|
|
1051
1160
|
}, {
|
|
@@ -1057,13 +1166,14 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1057
1166
|
key: "updateLayerLegend",
|
|
1058
1167
|
value: function updateLayerLegend(settings) {
|
|
1059
1168
|
this.legendSettings = settings;
|
|
1060
|
-
}
|
|
1169
|
+
} // @ts-expect-error
|
|
1170
|
+
|
|
1061
1171
|
}, {
|
|
1062
1172
|
key: "getDataUpdateTriggers",
|
|
1063
1173
|
value: function getDataUpdateTriggers(_ref10) {
|
|
1064
1174
|
var filteredIndex = _ref10.filteredIndex,
|
|
1065
|
-
|
|
1066
|
-
|
|
1175
|
+
id = _ref10.id,
|
|
1176
|
+
allData = _ref10.allData;
|
|
1067
1177
|
var columns = this.config.columns;
|
|
1068
1178
|
return _objectSpread({
|
|
1069
1179
|
getData: {
|
|
@@ -1087,6 +1197,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1087
1197
|
if (!this.config.dataId) {
|
|
1088
1198
|
return {};
|
|
1089
1199
|
}
|
|
1200
|
+
|
|
1090
1201
|
var dataset = this.getDataset(datasets);
|
|
1091
1202
|
var dataContainer = dataset.dataContainer;
|
|
1092
1203
|
this.updateVisualChannelFields(dataset);
|
|
@@ -1094,86 +1205,101 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1094
1205
|
var getPosition = this.getPositionAccessor(dataContainer);
|
|
1095
1206
|
var dataUpdateTriggers = this.getDataUpdateTriggers(dataset);
|
|
1096
1207
|
var triggerChanged = this.getChangedTriggers(dataUpdateTriggers);
|
|
1097
|
-
|
|
1208
|
+
|
|
1209
|
+
if (triggerChanged && triggerChanged.getMeta) {
|
|
1098
1210
|
this.updateLayerMeta(dataContainer, getPosition);
|
|
1099
1211
|
}
|
|
1212
|
+
|
|
1100
1213
|
var data = [];
|
|
1101
|
-
|
|
1214
|
+
|
|
1215
|
+
if (!(triggerChanged && triggerChanged.getData) && oldLayerData && oldLayerData.data) {
|
|
1102
1216
|
// same data
|
|
1103
1217
|
data = oldLayerData.data;
|
|
1104
1218
|
} else {
|
|
1105
1219
|
data = this.calculateDataAttribute(dataset, getPosition);
|
|
1106
1220
|
}
|
|
1221
|
+
|
|
1107
1222
|
return {
|
|
1108
1223
|
data: data,
|
|
1109
1224
|
triggerChanged: triggerChanged
|
|
1110
1225
|
};
|
|
1111
1226
|
}
|
|
1112
|
-
|
|
1113
1227
|
/**
|
|
1114
1228
|
* Update styled fields to match ones from new dataset.
|
|
1115
1229
|
*
|
|
1116
1230
|
* @param {Object} dataset
|
|
1117
1231
|
*/
|
|
1232
|
+
|
|
1118
1233
|
}, {
|
|
1119
1234
|
key: "updateVisualChannelFields",
|
|
1120
1235
|
value: function updateVisualChannelFields(dataset) {
|
|
1121
1236
|
var _this5 = this;
|
|
1237
|
+
|
|
1122
1238
|
var _loop = function _loop() {
|
|
1123
|
-
|
|
1124
|
-
|
|
1239
|
+
var _this5$config$visConf;
|
|
1240
|
+
|
|
1241
|
+
var _Object$values$_i = _Object$values[_i],
|
|
1125
1242
|
field = _Object$values$_i.field,
|
|
1126
1243
|
range = _Object$values$_i.range;
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1244
|
+
var oldField = _this5.config[field];
|
|
1245
|
+
var isUsingHexColorCode = (_this5$config$visConf = _this5.config.visConfig[range]) === null || _this5$config$visConf === void 0 ? void 0 : _this5$config$visConf.hexColor;
|
|
1246
|
+
|
|
1247
|
+
if (!oldField) {
|
|
1248
|
+
return {
|
|
1249
|
+
v: void 0
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
var newDataSetField = dataset.fields.find(function (fd) {
|
|
1254
|
+
return fd.name === oldField.name;
|
|
1255
|
+
}) || null;
|
|
1256
|
+
|
|
1257
|
+
if (isUsingHexColorCode) {
|
|
1258
|
+
newDataSetField = _objectSpread(_objectSpread({}, newDataSetField), {}, {
|
|
1259
|
+
colorColumn: newDataSetField.colorColumn || oldField.colorColumn,
|
|
1260
|
+
colorColumnIdx: newDataSetField.colorColumnIdx || oldField.colorColumnIdx
|
|
1261
|
+
});
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
_this5.updateLayerConfig((0, _defineProperty2["default"])({}, field, newDataSetField));
|
|
1265
|
+
};
|
|
1266
|
+
|
|
1146
1267
|
for (var _i = 0, _Object$values = Object.values(this.visualChannels); _i < _Object$values.length; _i++) {
|
|
1147
|
-
_ret = _loop();
|
|
1148
|
-
|
|
1268
|
+
var _ret = _loop();
|
|
1269
|
+
|
|
1270
|
+
if ((0, _typeof2["default"])(_ret) === "object") return _ret.v;
|
|
1149
1271
|
}
|
|
1150
1272
|
}
|
|
1151
|
-
|
|
1152
1273
|
/**
|
|
1153
1274
|
* helper function to update one layer domain when state.data changed
|
|
1154
1275
|
* if state.data change is due ot update filter, newFiler will be passed
|
|
1155
1276
|
* called by updateAllLayerDomainData
|
|
1156
|
-
* @param
|
|
1157
|
-
* @param
|
|
1158
|
-
* @returns
|
|
1277
|
+
* @param datasets
|
|
1278
|
+
* @param newFilter
|
|
1279
|
+
* @returns layer
|
|
1159
1280
|
*/
|
|
1281
|
+
|
|
1160
1282
|
}, {
|
|
1161
1283
|
key: "updateLayerDomain",
|
|
1162
1284
|
value: function updateLayerDomain(datasets, newFilter) {
|
|
1163
1285
|
var _this6 = this;
|
|
1286
|
+
|
|
1164
1287
|
var table = this.getDataset(datasets);
|
|
1288
|
+
|
|
1165
1289
|
if (!table) {
|
|
1166
1290
|
return this;
|
|
1167
1291
|
}
|
|
1292
|
+
|
|
1168
1293
|
Object.values(this.visualChannels).forEach(function (channel) {
|
|
1169
1294
|
var scale = channel.scale;
|
|
1170
|
-
var scaleType = _this6.config[scale];
|
|
1171
|
-
|
|
1172
|
-
// ordinal domain is based on dataContainer, if only filter changed
|
|
1295
|
+
var scaleType = _this6.config[scale]; // ordinal domain is based on dataContainer, if only filter changed
|
|
1173
1296
|
// no need to update ordinal domain
|
|
1297
|
+
|
|
1174
1298
|
if (!newFilter || scaleType !== _defaultSettings.SCALE_TYPES.ordinal) {
|
|
1175
1299
|
var domain = channel.domain;
|
|
1300
|
+
|
|
1176
1301
|
var updatedDomain = _this6.calculateLayerDomain(table, channel);
|
|
1302
|
+
|
|
1177
1303
|
_this6.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain));
|
|
1178
1304
|
}
|
|
1179
1305
|
});
|
|
@@ -1184,31 +1310,33 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1184
1310
|
value: function getDataset(datasets) {
|
|
1185
1311
|
return this.config.dataId ? datasets[this.config.dataId] : null;
|
|
1186
1312
|
}
|
|
1187
|
-
|
|
1188
1313
|
/**
|
|
1189
1314
|
* Validate visual channel field and scales based on supported field & scale type
|
|
1190
1315
|
* @param channel
|
|
1191
1316
|
*/
|
|
1317
|
+
|
|
1192
1318
|
}, {
|
|
1193
1319
|
key: "validateVisualChannel",
|
|
1194
1320
|
value: function validateVisualChannel(channel) {
|
|
1195
1321
|
this.validateFieldType(channel);
|
|
1196
1322
|
this.validateScale(channel);
|
|
1197
1323
|
}
|
|
1198
|
-
|
|
1199
1324
|
/**
|
|
1200
1325
|
* Validate field type based on channelScaleType
|
|
1201
1326
|
*/
|
|
1327
|
+
|
|
1202
1328
|
}, {
|
|
1203
1329
|
key: "validateFieldType",
|
|
1204
1330
|
value: function validateFieldType(channel) {
|
|
1205
1331
|
var visualChannel = this.visualChannels[channel];
|
|
1206
1332
|
var field = visualChannel.field,
|
|
1207
|
-
|
|
1208
|
-
|
|
1333
|
+
channelScaleType = visualChannel.channelScaleType,
|
|
1334
|
+
supportedFieldTypes = visualChannel.supportedFieldTypes;
|
|
1335
|
+
|
|
1209
1336
|
if (this.config[field]) {
|
|
1210
1337
|
// if field is selected, check if field type is supported
|
|
1211
1338
|
var channelSupportedFieldTypes = supportedFieldTypes || _defaultSettings.CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType];
|
|
1339
|
+
|
|
1212
1340
|
if (!channelSupportedFieldTypes.includes(this.config[field].type)) {
|
|
1213
1341
|
// field type is not supported, set it back to null
|
|
1214
1342
|
// set scale back to default
|
|
@@ -1216,48 +1344,50 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1216
1344
|
}
|
|
1217
1345
|
}
|
|
1218
1346
|
}
|
|
1219
|
-
|
|
1220
1347
|
/**
|
|
1221
1348
|
* Validate scale type based on aggregation
|
|
1222
1349
|
*/
|
|
1350
|
+
|
|
1223
1351
|
}, {
|
|
1224
1352
|
key: "validateScale",
|
|
1225
1353
|
value: function validateScale(channel) {
|
|
1226
1354
|
var visualChannel = this.visualChannels[channel];
|
|
1227
1355
|
var scale = visualChannel.scale,
|
|
1228
|
-
|
|
1356
|
+
range = visualChannel.range;
|
|
1357
|
+
|
|
1229
1358
|
if (!scale || this.isColoredByColorColumn(range) && this.config[scale] === _defaultSettings.SCALE_TYPES.identity) {
|
|
1230
1359
|
// visualChannel doesn't have scale
|
|
1231
1360
|
return;
|
|
1232
1361
|
}
|
|
1233
|
-
|
|
1234
|
-
// check if current selected scale is
|
|
1362
|
+
|
|
1363
|
+
var scaleOptions = this.getScaleOptions(channel); // check if current selected scale is
|
|
1235
1364
|
// supported, if not, change to default
|
|
1365
|
+
|
|
1236
1366
|
if (!scaleOptions.includes(this.config[scale])) {
|
|
1237
1367
|
this.updateLayerConfig((0, _defineProperty2["default"])({}, scale, scaleOptions[0]));
|
|
1238
1368
|
}
|
|
1239
1369
|
}
|
|
1240
|
-
|
|
1241
1370
|
/**
|
|
1242
1371
|
* Get scale options based on current field
|
|
1243
1372
|
* @param {string} channel
|
|
1244
1373
|
* @returns {string[]}
|
|
1245
1374
|
*/
|
|
1375
|
+
|
|
1246
1376
|
}, {
|
|
1247
1377
|
key: "getScaleOptions",
|
|
1248
1378
|
value: function getScaleOptions(channel) {
|
|
1249
1379
|
var visualChannel = this.visualChannels[channel];
|
|
1250
1380
|
var field = visualChannel.field,
|
|
1251
|
-
|
|
1252
|
-
|
|
1381
|
+
scale = visualChannel.scale,
|
|
1382
|
+
channelScaleType = visualChannel.channelScaleType;
|
|
1253
1383
|
return this.config[field] ? _defaultSettings.FIELD_OPTS[this.config[field].type].scale[channelScaleType] : [this.getDefaultLayerConfig()[scale]];
|
|
1254
1384
|
}
|
|
1255
1385
|
}, {
|
|
1256
1386
|
key: "updateLayerVisualChannel",
|
|
1257
1387
|
value: function updateLayerVisualChannel(dataset, channel) {
|
|
1258
1388
|
var visualChannel = this.visualChannels[channel];
|
|
1259
|
-
this.validateVisualChannel(channel);
|
|
1260
|
-
|
|
1389
|
+
this.validateVisualChannel(channel); // calculate layer channel domain
|
|
1390
|
+
|
|
1261
1391
|
var updatedDomain = this.calculateLayerDomain(dataset, visualChannel);
|
|
1262
1392
|
this.updateLayerConfig((0, _defineProperty2["default"])({}, visualChannel.domain, updatedDomain));
|
|
1263
1393
|
}
|
|
@@ -1265,17 +1395,23 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1265
1395
|
key: "getVisualChannelUpdateTriggers",
|
|
1266
1396
|
value: function getVisualChannelUpdateTriggers() {
|
|
1267
1397
|
var _this7 = this;
|
|
1398
|
+
|
|
1268
1399
|
var updateTriggers = {};
|
|
1269
1400
|
Object.values(this.visualChannels).forEach(function (visualChannel) {
|
|
1270
1401
|
// field range scale domain
|
|
1271
1402
|
var accessor = visualChannel.accessor,
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1403
|
+
field = visualChannel.field,
|
|
1404
|
+
scale = visualChannel.scale,
|
|
1405
|
+
domain = visualChannel.domain,
|
|
1406
|
+
range = visualChannel.range,
|
|
1407
|
+
defaultValue = visualChannel.defaultValue,
|
|
1408
|
+
fixed = visualChannel.fixed;
|
|
1409
|
+
|
|
1410
|
+
if (accessor) {
|
|
1411
|
+
var _objectSpread11;
|
|
1412
|
+
|
|
1413
|
+
updateTriggers[accessor] = _objectSpread((_objectSpread11 = {}, (0, _defineProperty2["default"])(_objectSpread11, field, _this7.config[field]), (0, _defineProperty2["default"])(_objectSpread11, scale, _this7.config[scale]), (0, _defineProperty2["default"])(_objectSpread11, domain, _this7.config[domain]), (0, _defineProperty2["default"])(_objectSpread11, range, _this7.config.visConfig[range]), (0, _defineProperty2["default"])(_objectSpread11, "defaultValue", typeof defaultValue === 'function' ? defaultValue(_this7.config) : defaultValue), _objectSpread11), fixed ? (0, _defineProperty2["default"])({}, fixed, _this7.config.visConfig[fixed]) : {});
|
|
1414
|
+
}
|
|
1279
1415
|
});
|
|
1280
1416
|
return updateTriggers;
|
|
1281
1417
|
}
|
|
@@ -1284,30 +1420,37 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1284
1420
|
value: function calculateLayerDomain(dataset, visualChannel) {
|
|
1285
1421
|
var scale = visualChannel.scale;
|
|
1286
1422
|
var field = this.config[visualChannel.field];
|
|
1423
|
+
|
|
1287
1424
|
if (!field || !scale) {
|
|
1288
1425
|
// if colorField or sizeField were set back to null
|
|
1289
1426
|
return defaultDomain;
|
|
1290
1427
|
}
|
|
1428
|
+
|
|
1291
1429
|
var scaleType = this.config[scale];
|
|
1292
1430
|
var dataSetField = dataset.fields.find(function (f) {
|
|
1293
1431
|
return f.name === field.name;
|
|
1294
1432
|
});
|
|
1433
|
+
|
|
1295
1434
|
if (!scaleType || !dataSetField) {
|
|
1296
1435
|
// if new dataset doesn't contain previously set field
|
|
1297
1436
|
return defaultDomain;
|
|
1298
1437
|
}
|
|
1438
|
+
|
|
1299
1439
|
return dataset.getColumnLayerDomain(dataSetField, scaleType) || defaultDomain;
|
|
1300
1440
|
}
|
|
1301
1441
|
}, {
|
|
1302
1442
|
key: "updateHexColorDomain",
|
|
1303
1443
|
value: function updateHexColorDomain(dataset) {
|
|
1304
1444
|
var _this8 = this;
|
|
1445
|
+
|
|
1305
1446
|
if (!dataset) {
|
|
1306
1447
|
return this;
|
|
1307
1448
|
}
|
|
1449
|
+
|
|
1308
1450
|
Object.values(this.visualChannels).forEach(function (channel) {
|
|
1309
1451
|
var channelConfig = _this8.config.visConfig[channel.range];
|
|
1310
1452
|
var field = _this8.config[channel.field];
|
|
1453
|
+
|
|
1311
1454
|
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
|
|
1312
1455
|
var dataSetField = dataset.fields.find(function (f) {
|
|
1313
1456
|
return f.name === field.colorColumn;
|
|
@@ -1315,6 +1458,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1315
1458
|
var colors = dataset.getColumnLayerDomain(dataSetField, _defaultSettings.SCALE_TYPES.ordinal).map(function (c) {
|
|
1316
1459
|
return (0, _colorUtils.checkColorOrFallback)(c);
|
|
1317
1460
|
});
|
|
1461
|
+
|
|
1318
1462
|
_this8.updateLayerVisConfig((0, _defineProperty2["default"])({}, channel.range, _objectSpread(_objectSpread({}, channelConfig), {}, {
|
|
1319
1463
|
colors: colors
|
|
1320
1464
|
})));
|
|
@@ -1326,16 +1470,20 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1326
1470
|
key: "calculateHexColumnLegend",
|
|
1327
1471
|
value: function calculateHexColumnLegend(datasets) {
|
|
1328
1472
|
var _this9 = this;
|
|
1473
|
+
|
|
1329
1474
|
var dataset = this.getDataset(datasets);
|
|
1475
|
+
|
|
1330
1476
|
if (!datasets) {
|
|
1331
1477
|
return;
|
|
1332
1478
|
}
|
|
1479
|
+
|
|
1333
1480
|
var legendSettings = Object.keys(this.visualChannels).reduce(function (legends, channel) {
|
|
1334
1481
|
var _this9$visualChannels = _this9.visualChannels[channel],
|
|
1335
|
-
|
|
1336
|
-
|
|
1482
|
+
range = _this9$visualChannels.range,
|
|
1483
|
+
channelField = _this9$visualChannels.field;
|
|
1337
1484
|
var channelConfig = _this9.config.visConfig[range];
|
|
1338
1485
|
var field = _this9.config[channelField];
|
|
1486
|
+
|
|
1339
1487
|
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
|
|
1340
1488
|
var dataSetField = dataset.fields.find(function (f) {
|
|
1341
1489
|
return f.name === field.colorColumn;
|
|
@@ -1343,6 +1491,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1343
1491
|
var legend = dataset.calculateLegend(field, dataSetField);
|
|
1344
1492
|
legends[channel] = legend;
|
|
1345
1493
|
}
|
|
1494
|
+
|
|
1346
1495
|
return legends;
|
|
1347
1496
|
}, {});
|
|
1348
1497
|
this.updateLayerLegend(legendSettings);
|
|
@@ -1356,21 +1505,23 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1356
1505
|
key: "isLayerHovered",
|
|
1357
1506
|
value: function isLayerHovered(objectInfo) {
|
|
1358
1507
|
var _objectInfo$layer, _objectInfo$layer$pro;
|
|
1508
|
+
|
|
1359
1509
|
return (objectInfo === null || objectInfo === void 0 ? void 0 : objectInfo.picked) && (objectInfo === null || objectInfo === void 0 ? void 0 : (_objectInfo$layer = objectInfo.layer) === null || _objectInfo$layer === void 0 ? void 0 : (_objectInfo$layer$pro = _objectInfo$layer.props) === null || _objectInfo$layer$pro === void 0 ? void 0 : _objectInfo$layer$pro.id) === this.id;
|
|
1360
1510
|
}
|
|
1361
1511
|
}, {
|
|
1362
1512
|
key: "getRadiusScaleByZoom",
|
|
1363
|
-
value: function getRadiusScaleByZoom(mapState) {
|
|
1513
|
+
value: function getRadiusScaleByZoom(mapState, fixedRadius) {
|
|
1364
1514
|
var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
|
|
1365
1515
|
return vc.property === 'radius';
|
|
1366
1516
|
});
|
|
1517
|
+
|
|
1367
1518
|
if (!radiusChannel) {
|
|
1368
1519
|
return 1;
|
|
1369
1520
|
}
|
|
1521
|
+
|
|
1370
1522
|
var field = radiusChannel.field;
|
|
1371
|
-
var radius = this.config.visConfig.radius;
|
|
1523
|
+
var radius = this.config.visConfig.radius; // @ts-ignore
|
|
1372
1524
|
|
|
1373
|
-
// @ts-ignore
|
|
1374
1525
|
return (this.config[field] ? 1 : radius) * this.getZoomFactor(mapState);
|
|
1375
1526
|
}
|
|
1376
1527
|
}, {
|
|
@@ -1379,20 +1530,22 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1379
1530
|
var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
|
|
1380
1531
|
return vc.property === 'radius';
|
|
1381
1532
|
});
|
|
1533
|
+
|
|
1382
1534
|
if (!radiusChannel || this.config[radiusChannel.field]) {
|
|
1383
1535
|
return 1;
|
|
1384
1536
|
}
|
|
1537
|
+
|
|
1385
1538
|
return this.config.visConfig.radius;
|
|
1386
1539
|
}
|
|
1387
1540
|
}, {
|
|
1388
1541
|
key: "getMaxMarkerSize",
|
|
1389
1542
|
value: function getMaxMarkerSize() {
|
|
1390
1543
|
var _this$config5 = this.config,
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1544
|
+
radiusField = _this$config5.radiusField,
|
|
1545
|
+
sizeField = _this$config5.sizeField,
|
|
1546
|
+
visConfig = _this$config5.visConfig;
|
|
1394
1547
|
var radiusRange = visConfig.radiusRange,
|
|
1395
|
-
|
|
1548
|
+
radius = visConfig.radius;
|
|
1396
1549
|
var field = radiusField || sizeField;
|
|
1397
1550
|
return Math.ceil(field && radiusRange ? radiusRange[1] : radius);
|
|
1398
1551
|
}
|
|
@@ -1400,6 +1553,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1400
1553
|
key: "shouldCalculateLayerData",
|
|
1401
1554
|
value: function shouldCalculateLayerData(props) {
|
|
1402
1555
|
var _this10 = this;
|
|
1556
|
+
|
|
1403
1557
|
return props.some(function (p) {
|
|
1404
1558
|
return !_this10.noneLayerDataAffectingProps.includes(p);
|
|
1405
1559
|
});
|
|
@@ -1420,10 +1574,10 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1420
1574
|
key: "getDefaultDeckLayerProps",
|
|
1421
1575
|
value: function getDefaultDeckLayerProps(_ref12) {
|
|
1422
1576
|
var idx = _ref12.idx,
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1577
|
+
gpuFilter = _ref12.gpuFilter,
|
|
1578
|
+
mapState = _ref12.mapState,
|
|
1579
|
+
visible = _ref12.visible,
|
|
1580
|
+
maskPolygon = _ref12.maskPolygon;
|
|
1427
1581
|
var maskExtensionProps = (0, _layerUtils.getMaskExtensionProps)(maskPolygon);
|
|
1428
1582
|
return _objectSpread(_objectSpread({}, maskExtensionProps), {}, {
|
|
1429
1583
|
id: this.id,
|
|
@@ -1460,32 +1614,37 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1460
1614
|
key: "renderTextLabelLayer",
|
|
1461
1615
|
value: function renderTextLabelLayer(_ref13, renderOpts) {
|
|
1462
1616
|
var getPosition = _ref13.getPosition,
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1617
|
+
getRadius = _ref13.getRadius,
|
|
1618
|
+
radiusScale = _ref13.radiusScale,
|
|
1619
|
+
updateTriggers = _ref13.updateTriggers,
|
|
1620
|
+
sharedProps = _ref13.sharedProps;
|
|
1467
1621
|
var data = renderOpts.data;
|
|
1468
1622
|
var _this$config6 = this.config,
|
|
1469
|
-
|
|
1470
|
-
|
|
1623
|
+
textLabel = _this$config6.textLabel,
|
|
1624
|
+
visibilityByZoom = _this$config6.visibilityByZoom;
|
|
1471
1625
|
var extensions = [].concat((0, _toConsumableArray2["default"])(sharedProps.extensions), [collisionFilterExtension]);
|
|
1626
|
+
|
|
1472
1627
|
if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
|
|
1473
1628
|
return [];
|
|
1474
1629
|
}
|
|
1630
|
+
|
|
1475
1631
|
var _textLabel = (0, _slicedToArray2["default"])(textLabel, 2),
|
|
1476
|
-
|
|
1477
|
-
|
|
1632
|
+
mainLabel = _textLabel[0],
|
|
1633
|
+
secondaryLabel = _textLabel[1];
|
|
1634
|
+
|
|
1478
1635
|
var alignment = mainLabel.alignment,
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1636
|
+
anchor = mainLabel.anchor,
|
|
1637
|
+
getColor = mainLabel.color,
|
|
1638
|
+
mainField = mainLabel.field,
|
|
1639
|
+
outlineColor = mainLabel.outlineColor,
|
|
1640
|
+
sizeScale = mainLabel.size;
|
|
1641
|
+
|
|
1484
1642
|
var _ref14 = secondaryLabel || {},
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1643
|
+
getSecondaryColor = _ref14.color,
|
|
1644
|
+
secondaryField = _ref14.field,
|
|
1645
|
+
secondaryOutlineColor = _ref14.outlineColor,
|
|
1646
|
+
secondarySizeScale = _ref14.size;
|
|
1647
|
+
|
|
1489
1648
|
return [new _carto._PointLabelLayer(_objectSpread(_objectSpread(_objectSpread({}, sharedProps), {}, {
|
|
1490
1649
|
// Recreate layer when labels change otherwise rendering breaks
|
|
1491
1650
|
// TODO could be more efficient with updateTriggers?
|
|
@@ -1533,13 +1692,13 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1533
1692
|
})
|
|
1534
1693
|
}))];
|
|
1535
1694
|
}
|
|
1536
|
-
|
|
1537
1695
|
/**
|
|
1538
1696
|
* Create deck.gl `IconLayer` "autoPack" mode accessor for custom markers.
|
|
1539
1697
|
*
|
|
1540
1698
|
* @param {*} iconUrlAccessor deck.gl accessor (or value) that resolves to URL of icon for given row
|
|
1541
1699
|
* @returns deck.gl accessor that returns UnpackedIcon ready to consume by IconLayer
|
|
1542
1700
|
*/
|
|
1701
|
+
|
|
1543
1702
|
}, {
|
|
1544
1703
|
key: "getCustomMarkerIconAccessor",
|
|
1545
1704
|
value: function getCustomMarkerIconAccessor(iconUrlAccessor) {
|
|
@@ -1567,8 +1726,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1567
1726
|
}
|
|
1568
1727
|
}, {
|
|
1569
1728
|
key: "updateLayerMeta",
|
|
1570
|
-
value: function updateLayerMeta(dataContainer, getPosition) {
|
|
1571
|
-
// implemented in subclasses
|
|
1729
|
+
value: function updateLayerMeta(dataContainer, getPosition) {// implemented in subclasses
|
|
1572
1730
|
}
|
|
1573
1731
|
}, {
|
|
1574
1732
|
key: "getPositionAccessor",
|
|
@@ -1582,11 +1740,14 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1582
1740
|
key: "getHexColumn",
|
|
1583
1741
|
value: function getHexColumn(range) {
|
|
1584
1742
|
var _Object$values2, _Object$values2$find;
|
|
1743
|
+
|
|
1585
1744
|
var field = (_Object$values2 = Object.values(this.visualChannels)) === null || _Object$values2 === void 0 ? void 0 : (_Object$values2$find = _Object$values2.find(function (value) {
|
|
1586
1745
|
return value.range === range;
|
|
1587
1746
|
})) === null || _Object$values2$find === void 0 ? void 0 : _Object$values2$find.field;
|
|
1747
|
+
|
|
1588
1748
|
if (field) {
|
|
1589
1749
|
var _this$config$field2;
|
|
1750
|
+
|
|
1590
1751
|
return (_this$config$field2 = this.config[field]) === null || _this$config$field2 === void 0 ? void 0 : _this$config$field2.colorColumn;
|
|
1591
1752
|
}
|
|
1592
1753
|
}
|
|
@@ -1594,6 +1755,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1594
1755
|
key: "isColoredByColorColumn",
|
|
1595
1756
|
value: function isColoredByColorColumn(range) {
|
|
1596
1757
|
var _this$config$visConfi;
|
|
1758
|
+
|
|
1597
1759
|
return (_this$config$visConfi = this.config.visConfig[range]) === null || _this$config$visConfi === void 0 ? void 0 : _this$config$visConfi.hexColor;
|
|
1598
1760
|
}
|
|
1599
1761
|
}], [{
|
|
@@ -1604,7 +1766,6 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1604
1766
|
foundLayers: foundLayers
|
|
1605
1767
|
};
|
|
1606
1768
|
}
|
|
1607
|
-
|
|
1608
1769
|
/**
|
|
1609
1770
|
* Given a array of preset required column names
|
|
1610
1771
|
* found field that has the same name to set as layer column
|
|
@@ -1613,6 +1774,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1613
1774
|
* @param {object[]} allFields
|
|
1614
1775
|
* @returns {object[] | null} all possible required layer column pairs
|
|
1615
1776
|
*/
|
|
1777
|
+
|
|
1616
1778
|
}, {
|
|
1617
1779
|
key: "findDefaultColumnField",
|
|
1618
1780
|
value: function findDefaultColumnField(defaultFields, allFields) {
|
|
@@ -1629,10 +1791,12 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1629
1791
|
}) : null;
|
|
1630
1792
|
return prev;
|
|
1631
1793
|
}, {});
|
|
1794
|
+
|
|
1632
1795
|
if (!Object.values(requiredColumns).every(Boolean)) {
|
|
1633
1796
|
// if any field missing, return null
|
|
1634
1797
|
return null;
|
|
1635
1798
|
}
|
|
1799
|
+
|
|
1636
1800
|
return this.getAllPossibleColumnParis(requiredColumns);
|
|
1637
1801
|
}
|
|
1638
1802
|
}, {
|
|
@@ -1647,10 +1811,11 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1647
1811
|
});
|
|
1648
1812
|
var countPerKey = allKeys.map(function (k) {
|
|
1649
1813
|
return requiredColumns[k].length;
|
|
1650
|
-
});
|
|
1651
|
-
var pairs = [];
|
|
1814
|
+
}); // TODO: Better typings
|
|
1652
1815
|
|
|
1816
|
+
var pairs = [];
|
|
1653
1817
|
/* eslint-disable no-loop-func */
|
|
1818
|
+
|
|
1654
1819
|
while (incrementPointers(pointers, countPerKey, pointers.length - 1)) {
|
|
1655
1820
|
var newPair = pointers.reduce(function (prev, cuur, i) {
|
|
1656
1821
|
prev[allKeys[i]] = requiredColumns[allKeys[i]][cuur];
|
|
@@ -1659,20 +1824,24 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1659
1824
|
pairs.push(newPair);
|
|
1660
1825
|
}
|
|
1661
1826
|
/* eslint-enable no-loop-func */
|
|
1662
|
-
|
|
1663
1827
|
// recursively increment pointers
|
|
1828
|
+
|
|
1829
|
+
|
|
1664
1830
|
function incrementPointers(pts, counts, index) {
|
|
1665
1831
|
if (index === 0 && pts[0] === counts[0] - 1) {
|
|
1666
1832
|
// nothing to increment
|
|
1667
1833
|
return false;
|
|
1668
1834
|
}
|
|
1835
|
+
|
|
1669
1836
|
if (pts[index] + 1 < counts[index]) {
|
|
1670
1837
|
pts[index] = pts[index] + 1;
|
|
1671
1838
|
return true;
|
|
1672
1839
|
}
|
|
1840
|
+
|
|
1673
1841
|
pts[index] = 0;
|
|
1674
1842
|
return incrementPointers(pts, counts, index - 1);
|
|
1675
1843
|
}
|
|
1844
|
+
|
|
1676
1845
|
return pairs;
|
|
1677
1846
|
}
|
|
1678
1847
|
}, {
|
|
@@ -1683,5 +1852,7 @@ var Layer = /*#__PURE__*/function () {
|
|
|
1683
1852
|
}]);
|
|
1684
1853
|
return Layer;
|
|
1685
1854
|
}();
|
|
1686
|
-
|
|
1687
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9rZXltaXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2V4dGVuc2lvbnMiLCJfY29yZSIsIl9jYXJ0byIsIl9kZWZhdWx0TGF5ZXJJY29uIiwiX2xheWVyVXBkYXRlIiwiX2QzQ29sb3IiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2NvbG9yUmFuZ2VzIiwiX2N1c3RvbUNvbG9yUmFuZ2VzIiwiX2xheWVyRmFjdG9yeSIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfZGF0YUNvbnRhaW5lclV0aWxzIiwiX2NvbG9yVXRpbHMiLCJfbGF5ZXJVdGlscyIsIl9kM1NjYWxlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJvIiwiYWxsb3dBcnJheUxpa2UiLCJpdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiaSIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImUiLCJfZSIsImYiLCJUeXBlRXJyb3IiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwiZXJyIiwiY2FsbCIsInN0ZXAiLCJuZXh0IiwiX2UyIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwib3duS2V5cyIsInIiLCJ0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX21hcmtlZCIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiZXhwb3J0cyIsIkZBTExCQUNLX0lDT04iLCJNQVhfU0FNUExFX1NJWkUiLCJkZWZhdWx0RG9tYWluIiwiZGF0YUZpbHRlckV4dGVuc2lvbiIsIkRhdGFGaWx0ZXJFeHRlbnNpb24iLCJmaWx0ZXJTaXplIiwiTUFYX0dQVV9GSUxURVJTIiwiY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiZGVmYXVsdERhdGFBY2Nlc3NvciIsImRjIiwiZCIsImRlZmF1bHRHZXRGaWVsZFZhbHVlIiwiZmllbGQiLCJ2YWx1ZUFjY2Vzc29yIiwic2NhbGVJZGVudGl0eSIsInYiLCJPVkVSTEFZX1RZUEUiLCJrZXltaXJyb3IiLCJkZWNrZ2wiLCJtYXBib3hnbCIsImxheWVyQ29sb3JzIiwidmFsdWVzIiwiRGF0YVZpekNvbG9ycyIsIm1hcCIsImhleFRvUmdiIiwiaW5kZXgiLCJ3cmFwIiwiZ2VuZXJhdGVDb2xvciQiLCJfY29udGV4dCIsInByZXYiLCJzdG9wIiwiY29sb3JNYWtlciIsIkxheWVyIiwicHJvcHMiLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2syIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsIm1ldGEiLCJsZWdlbmRTZXR0aW5ncyIsInZpc0NvbmZpZ1NldHRpbmdzIiwiX2ludGVyYWN0aXZpdHlTZXR0aW5ncyIsImNvbmZpZyIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImNvbHVtbnMiLCJnZXRMYXllckNvbHVtbnMiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0IiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwic2V0IiwiaW50ZXJhY3Rpdml0eVNldHRpbmdzIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlMiIsIl90aGlzJGludGVyYWN0aXZpdHlTZTMiLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U0IiwiQm9vbGVhbiIsImhvdmVyIiwiZmllbGRzIiwiY2xpY2siLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U1IiwiaGFzVG9vbHRpcCIsImVuYWJsZWQiLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8iLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8yIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwiaXNWaXNpYmxlIiwiaXNDb25maWdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsIkRFRkFVTFRfSElHSExJR0hUX0NPTE9SIiwiaGlkZGVuIiwiY29sb3JGaWVsZCIsImNvbG9yRG9tYWluIiwiY29sb3JTY2FsZSIsIlNDQUxFX1RZUEVTIiwicXVhbnRpbGUiLCJzaXplRG9tYWluIiwic2l6ZVNjYWxlIiwibGluZWFyIiwic2l6ZUZpZWxkIiwicmFkaXVzRmllbGQiLCJ2aXNDb25maWciLCJ0ZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJjb2xvclVJIiwiREVGQVVMVF9DT0xPUl9VSSIsImNvbG9yUmFuZ2UiLCJhbmltYXRpb24iLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJ2aXN1YWxDaGFubmVscyIsIm1lYXN1cmUiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRNZWFzdXJlIiwiYXNzaWduQ29sdW1uIiwidXBkYXRlIiwiZmllbGRJZHgiLCJhc3NpZ25Db2x1bW5QYWlycyIsIl90aGlzJGNvbHVtblBhaXJzIiwiX3RoaXMkY29sdW1uUGFpcnMyIiwiX3RoaXMkY29sdW1uUGFpcnMzIiwiY29sdW1uUGFpcnMiLCJfdGhpcyRjb2x1bW5QYWlycyRrZXkiLCJwYXJ0bmVyS2V5IiwiX3RoaXMkY29sdW1uUGFpcnMkcGFyIiwicGFydG5lckZpZWxkUGFpcktleSIsImdldFpvb21GYWN0b3IiLCJfcmVmIiwiem9vbSIsIl9yZWYkem9vbU9mZnNldCIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsIl9yZWYyIiwiX3JlZjIkem9vbU9mZnNldCIsImVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3IiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsImZpbHRlcmVkSW5kZXgiLCJyZW5kZXJMYXllciIsImdldEhvdmVyRGF0YSIsIm9iamVjdCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJhc3NpZ25Db25maWdUb0xheWVyIiwiY29uZmlnVG9Db3B5IiwiX3RoaXMiLCJzaGFsbG93Q29weSIsImNvbmNhdCIsIm5vdFRvQ29weSIsImdyb3VwIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY2hhbm5lbCIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsIl90aGlzMiIsIl9yZWYzIiwiX3JlZjMkc2hhbGxvd0NvcHkiLCJfcmVmMyRub3RUb0NvcHkiLCJpc1BsYWluT2JqZWN0IiwiaW5jbHVkZXMiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJyZWdpc3RlclZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlncyIsIl90aGlzMyIsIml0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsIm5ld1Zpc0NvbmZpZyIsInVwZGF0ZUxheWVyQ29sb3JVSSIsInByb3AiLCJfdGhpcyRjb25maWciLCJwcmV2aW91cyIsImNvbG9yVUlQcm9wIiwiZW50cmllcyIsIl9yZWY0IiwiX3JlZjUiLCJfc2xpY2VkVG9BcnJheTIiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJoZXhDb2xvciIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJfdGhpcyRjb25maWcyIiwiY3VzdG9tUGFsZXR0ZSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJfdmlzQ29uZmlnJHByb3AkY29sb3IiLCJzaG93RHJvcGRvd24iLCJfdGhpcyRjb25maWczIiwic3RlcHMiLCJyZXZlcnNlZCIsImhleENvbHVtbiIsImdldEhleENvbHVtbiIsImlzSGV4Q29sdW1uIiwiaXNDb2xvcmVkQnlDb2xvckNvbHVtbiIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJfdGhpcyRjb25maWc0IiwiX2NvbG9yVUkkcHJvcCRjb2xvclJhIiwiZ2V0Q29sb3JHcm91cEJ5TmFtZSIsInNhbWVHcm91cCIsIkNPTE9SX1JBTkdFUyIsImNyIiwiZmluZCIsInJldmVyc2VDb2xvclJhbmdlIiwiY29sb3JNYXAiLCJ1cGRhdGVDb2xvck1hcCIsIl90aGlzJGNvbmZpZyRmaWVsZCIsIl9PYmplY3QkdmFsdWVzJGZpbmQiLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJjTWFwIiwidW5hc3NpZ25lZENvbG9ycyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJoYXNBbGxDb2x1bW5zIiwiaGFzTGF5ZXJEYXRhIiwibGF5ZXJEYXRhIiwiZGF0YSIsImlzVmFsaWRUb1NhdmUiLCJzaG91bGRSZW5kZXJMYXllciIsImdldENvbG9yU2NhbGUiLCJfIiwiX3JnYiIsInJnYiIsImciLCJiIiwiaXNOYU4iLCJVTktOT1dOX0NPTE9SIiwiTWFwIiwiX3JlZjYiLCJfcmVmNyIsImsiLCJTQ0FMRV9GVU5DIiwidW5rbm93biIsImdldFZpc0NoYW5uZWxTY2FsZSIsImdldEN1c3RvbU1hcmtlcnNTY2FsZSIsImZhbGxiYWNrSWNvbiIsInVua25vd25WYWx1ZSIsIm1hcHBpbmciLCJvdGhlcnNNYXJrZXIiLCJfaXRlcmF0b3IzIiwibWFya2VyTWFwIiwiX3N0ZXAzIiwiX3N0ZXAzJHZhbHVlIiwibWFya2VyVXJsIiwic2NhbGVPcmRpbmFsIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiX3JlZjgiLCJfdGhpczQiLCJfcmVmOCRkYXRhQWNjZXNzb3IiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJfdGhpczQkdmlzdWFsQ2hhbm5lbHMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiaWRlbnRpdHkiLCJhcmdzIiwiaXNGaXhlZCIsImZpZWxkQ29uZmlnIiwiYWdncmVnYXRpb25WYWx1ZSIsInNjYWxlRnVuY3Rpb24iLCJjdXN0b21NYXJrZXIiLCJjdXN0b21NYXJrZXJzVXJsIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsIl9hZ2dyZWdhdGlvbiIsIkNvbnNvbGUiLCJ3YXJuIiwib3JkaW5hbCIsImRvbWFpbklzSW5maW5pdGUiLCJJbmZpbml0eSIsInNjYWxlRmFjdG9yeSIsInJlc3VsdCIsImdldFBvaW50c0JvdW5kcyIsImdldFBvc2l0aW9uIiwic2FtcGxlRGF0YSIsIm51bVJvd3MiLCJnZXRTYW1wbGVEYXRhIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJnZXRMYXRMbmdCb3VuZHMiLCJsbmdCb3VuZHMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsImRpZmZVcGRhdGVUcmlnZ2VycyIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfcmVmOSIsIl9yZWY5JG51bGxWYWx1ZSIsIl9yZWY5JGdldFZhbHVlIiwiZ2V0VmFsdWUiLCJjb2xvckNvbHVtblZhbHVlIiwiY2hhbm5lbENvbmZpZyIsImNoYW5uZWxGaWVsZCIsImNvbHVtbkZpZWxkIiwiY29sb3JDb2x1bW4iLCJjb2xvckNvbHVtbklkeCIsInZhbHVlQXQiLCJhdHRyaWJ1dGVWYWx1ZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJ1cGRhdGVNZXRhIiwidXBkYXRlTGF5ZXJMZWdlbmQiLCJzZXR0aW5ncyIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsIl9yZWYxMCIsImFsbERhdGEiLCJnZXREYXRhIiwiZGF0YXNldElkIiwiZ2V0TWV0YSIsInRsIiwidXBkYXRlRGF0YSIsIm9sZExheWVyRGF0YSIsImRhdGFzZXQiLCJnZXREYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsInVwZGF0ZUhleENvbG9yRG9tYWluIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJfdGhpczUiLCJfbG9vcCIsIl90aGlzNSRjb25maWckdmlzQ29uZiIsIl9PYmplY3QkdmFsdWVzJF9pIiwiX09iamVjdCR2YWx1ZXMiLCJfaSIsIm9sZEZpZWxkIiwiaXNVc2luZ0hleENvbG9yQ29kZSIsIm5ld0RhdGFTZXRGaWVsZCIsImZkIiwiX3JldCIsInVwZGF0ZUxheWVyRG9tYWluIiwibmV3RmlsdGVyIiwiX3RoaXM2IiwidGFibGUiLCJzY2FsZVR5cGUiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlU2NhbGUiLCJ2aXN1YWxDaGFubmVsIiwic3VwcG9ydGVkRmllbGRUeXBlcyIsImNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzIiwiQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwiRklFTERfT1BUUyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsIl90aGlzNyIsInVwZGF0ZVRyaWdnZXJzIiwiZGF0YVNldEZpZWxkIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJfdGhpczgiLCJjaGVja0NvbG9yT3JGYWxsYmFjayIsImNhbGN1bGF0ZUhleENvbHVtbkxlZ2VuZCIsIl90aGlzOSIsImxlZ2VuZHMiLCJfdGhpczkkdmlzdWFsQ2hhbm5lbHMiLCJsZWdlbmQiLCJjYWxjdWxhdGVMZWdlbmQiLCJoYXNIb3ZlcmVkT2JqZWN0Iiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkIiwiX29iamVjdEluZm8kbGF5ZXIiLCJfb2JqZWN0SW5mbyRsYXllciRwcm8iLCJwaWNrZWQiLCJsYXllciIsImdldFJhZGl1c1NjYWxlQnlab29tIiwibWFwU3RhdGUiLCJyYWRpdXNDaGFubmVsIiwidmMiLCJyYWRpdXMiLCJnZXRSYWRpdXNTY2FsZSIsImdldE1heE1hcmtlclNpemUiLCJfdGhpcyRjb25maWc1IiwicmFkaXVzUmFuZ2UiLCJjZWlsIiwic2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhIiwiX3RoaXMxMCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoaW5nVGFyZ2V0IiwiYnJ1c2giLCJhdXRvSGlnaGxpZ2h0IiwiYnJ1c2hpbmdSYWRpdXMiLCJicnVzaGluZ0VuYWJsZWQiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJfcmVmMTIiLCJpZHgiLCJncHVGaWx0ZXIiLCJ2aXNpYmxlIiwibWFza1BvbHlnb24iLCJtYXNrRXh0ZW5zaW9uUHJvcHMiLCJnZXRNYXNrRXh0ZW5zaW9uUHJvcHMiLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJMTkdMQVQiLCJwaWNrYWJsZSIsImhhc0ludGVyYWN0aXZpdHkiLCJ3cmFwTG9uZ2l0dWRlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJlbmFibGUzZCIsIm9wYWNpdHkiLCJleHRlbnNpb25zIiwiZmlsdGVyUmFuZ2UiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwicmVuZGVyVGV4dExhYmVsTGF5ZXIiLCJfcmVmMTMiLCJyZW5kZXJPcHRzIiwiZ2V0UmFkaXVzIiwicmFkaXVzU2NhbGUiLCJzaGFyZWRQcm9wcyIsIl90aGlzJGNvbmZpZzYiLCJ0ZXh0TGFiZWxzIiwiZ2V0VGV4dCIsIl90ZXh0TGFiZWwiLCJtYWluTGFiZWwiLCJzZWNvbmRhcnlMYWJlbCIsImFsaWdubWVudCIsImFuY2hvciIsImdldENvbG9yIiwibWFpbkZpZWxkIiwib3V0bGluZUNvbG9yIiwiX3JlZjE0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlGaWVsZCIsInNlY29uZGFyeU91dGxpbmVDb2xvciIsInNlY29uZGFyeVNpemVTY2FsZSIsIlBvaW50TGFiZWxMYXllciIsImNoYXJhY3RlclNldCIsImNvbGxpc2lvbkVuYWJsZWQiLCJjb2xsaXNpb25Hcm91cCIsImdldFNlY29uZGFyeVRleHQiLCJnZXRUZXh0QW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJmb250RmFtaWx5IiwiZm9udFNldHRpbmdzIiwic2RmIiwiZm9udFdlaWdodCIsIm91dGxpbmVXaWR0aCIsImdldEZpbHRlclZhbHVlIiwiZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yIiwiaWNvblVybEFjY2Vzc29yIiwibWFzayIsIm1heEljb25TaXplIiwid2FudGVkVXJsIiwiaWNvbk9rIiwidXJsIiwid2lkdGgiLCJoZWlnaHQiLCJrZXBsZXJUYWJsZSIsIl9PYmplY3QkdmFsdWVzMiIsIl9PYmplY3QkdmFsdWVzMiRmaW5kIiwiX3RoaXMkY29uZmlnJGZpZWxkMiIsIl90aGlzJGNvbmZpZyR2aXNDb25maSIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRDb2x1bW5GaWVsZCIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJyZXF1aXJlZEZpZWxkcyIsImdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMiLCJhbGxLZXlzIiwicG9pbnRlcnMiLCJjb3VudFBlcktleSIsInBhaXJzIiwiaW5jcmVtZW50UG9pbnRlcnMiLCJuZXdQYWlyIiwiY3V1ciIsInB0cyIsImNvdW50cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9iYXNlLWxheWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7Q29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uLCBEYXRhRmlsdGVyRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU0sIExheWVyIGFzIERlY2tMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge19Qb2ludExhYmVsTGF5ZXIgYXMgUG9pbnRMYWJlbExheWVyfSBmcm9tICdAZGVjay5nbC9jYXJ0byc7XG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgWk9PTV9MRVZFTF9MSU1JVFNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVMsIGhleENvbG9yfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7RGF0YVZpekNvbG9yc30gZnJvbSAnY29uc3RhbnRzL2N1c3RvbS1jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgREVGQVVMVF9DT0xPUl9VSSxcbiAgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gIERFRkFVTFRfTEFZRVJfTEFCRUxcbn0gZnJvbSAnLi9sYXllci1mYWN0b3J5JztcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZCwgaXNQbGFpbk9iamVjdH0gZnJvbSAndXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQge2dldExhdExuZ0JvdW5kcywgbm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7Z2V0U2FtcGxlRGF0YX0gZnJvbSAndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItdXRpbHMnO1xuXG5pbXBvcnQge2hleFRvUmdiLCBnZXRDb2xvckdyb3VwQnlOYW1lLCByZXZlcnNlQ29sb3JSYW5nZSwgY2hlY2tDb2xvck9yRmFsbGJhY2t9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge3NjYWxlT3JkaW5hbH0gZnJvbSAnZDMtc2NhbGUnO1xuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLkxheWVyfSBMYXllckNsYXNzfSAqL1xuXG4vKipcbiAqIEFwcHJveC4gbnVtYmVyIG9mIHBvaW50cyB0byBzYW1wbGUgaW4gYSBsYXJnZSBkYXRhIHNldFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IExBWUVSX0lEX0xFTkdUSCA9IDY7XG5cbi8vIE5vdGUsIHRoaXMgaXMgaXMgU1ZHIG9mIHNvbGlkIGNpcmNsZSBlbmNvZGVkIGFzIGRhdGEtdXJpXG5jb25zdCBGQUxMQkFDS19JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxQSE4yWnlCMmFXVjNRbTk0UFNJd0lEQWdNVEF3SURFd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNE5DaUFnUEdOcGNtTnNaU0JqZUQwaU5UQWlJR041UFNJMU1DSWdjajBpTlRBaUx6NE5Dand2YzNablBnPT0nO1xuXG5jb25zdCBNQVhfU0FNUExFX1NJWkUgPSA1MDAwO1xuY29uc3QgZGVmYXVsdERvbWFpbiA9IFswLCAxXTtcbmNvbnN0IGRhdGFGaWx0ZXJFeHRlbnNpb24gPSBuZXcgRGF0YUZpbHRlckV4dGVuc2lvbih7ZmlsdGVyU2l6ZTogTUFYX0dQVV9GSUxURVJTfSk7XG5jb25zdCBjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24gPSBuZXcgQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uKCk7XG5cbmNvbnN0IGRlZmF1bHREYXRhQWNjZXNzb3IgPSBkYyA9PiBkID0+IGQ7XG5jb25zdCBkZWZhdWx0R2V0RmllbGRWYWx1ZSA9IChmaWVsZCwgZCkgPT4gZmllbGQudmFsdWVBY2Nlc3NvcihkKTtcbmNvbnN0IHNjYWxlSWRlbnRpdHkgPSB2ID0+IHY7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gbGVnZW5kU2V0dGluZ3NcbiAgICB0aGlzLmxlZ2VuZFNldHRpbmdzID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIGludGVyYWN0aXZpdHlTZXR0aW5nc1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoe1xuICAgICAgY29sdW1uczogdGhpcy5nZXRMYXllckNvbHVtbnMoKSxcbiAgICAgIC4uLnByb3BzXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBEZWZhdWx0TGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IG92ZXJsYXlUeXBlKCkge1xuICAgIHJldHVybiBPVkVSTEFZX1RZUEUuZGVja2dsO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0IGlzQWdncmVnYXRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbJ2xhYmVsJywgJ29wYWNpdHknLCAndGhpY2tuZXNzJywgJ2lzVmlzaWJsZScsICdoaWRkZW4nXTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb2xvcicsXG4gICAgICAgIGZpZWxkOiAnY29sb3JGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY29sb3JTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvbG9yRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgICAgICAga2V5OiAnY29sb3InLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgbnVsbFZhbHVlOiBOT19WQUxVRV9DT0xPUixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBwcm9wZXJ0eTogJ3NpemUnLFxuICAgICAgICBmaWVsZDogJ3NpemVGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnc2l6ZVNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc2l6ZURvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc2l6ZVJhbmdlJyxcbiAgICAgICAga2V5OiAnc2l6ZScsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLnNpemUsXG4gICAgICAgIG51bGxWYWx1ZTogMCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIENvbHVtbiBwYWlycyBtYXBzIGxheWVyIGNvbHVtbiB0byBhIHNwZWNpZmljIGZpZWxkIHBhaXJzLFxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbnVsbFxuICAgKi9cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLypcbiAgICogRGVmYXVsdCBwb2ludCBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBwb2ludCBiYXNlZCBsYXllcnM6IHBvaW50LCBpY29uIGV0Yy5cbiAgICovXG4gIGdldCBkZWZhdWx0UG9pbnRDb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiB7cGFpcjogJ2xuZycsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nOiB7cGFpcjogJ2xhdCcsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgbGluayBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBsaW5rIGJhc2VkIGxheWVyczogYXJjLCBsaW5lIGV0Y1xuICAgKi9cbiAgZ2V0IGRlZmF1bHRMaW5rQ29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDA6IHtwYWlyOiAnbG5nMCcsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nMDoge3BhaXI6ICdsYXQwJywgZmllbGRQYWlyS2V5OiAnbG5nJ30sXG4gICAgICBsYXQxOiB7cGFpcjogJ2xuZzEnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzE6IHtwYWlyOiAnbGF0MScsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBSZWFjdCBjb21wb25lbnQgZm9yIHRvIHJlbmRlciBsYXllciBpbnN0cnVjdGlvbnMgaW4gYSBtb2RhbFxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGFuIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAgcmV0dXJuIHtcbiAgICogICAgaWQ6ICdpY29uSW5mbycsXG4gICAqICAgIHRlbXBsYXRlOiBJY29uSW5mb01vZGFsLFxuICAgKiAgICBtb2RhbFByb3BzOiB7XG4gICAqICAgICAgdGl0bGU6ICdIb3cgdG8gZHJhdyBpY29ucydcbiAgICogICB9O1xuICAgKiB9XG4gICAqL1xuICBnZXQgbGF5ZXJJbmZvTW9kYWwoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBzZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKGludGVyYWN0aXZpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IGludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBoYXNUb29sdGlwKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmhvdmVyPy5maWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5jbGljaz8uZmllbGRzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzSW50ZXJhY3Rpdml0eSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhhc1Rvb2x0aXAgJiYgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmVuYWJsZWQpO1xuICB9XG5cbiAgLypcbiAgICogR2l2ZW4gYSBkYXRhc2V0LCBhdXRvbWF0aWNhbGx5IGZpbmQgcHJvcHMgdG8gY3JlYXRlIGxheWVyIGJhc2VkIG9uIGl0XG4gICAqIGFuZCByZXR1cm4gdGhlIHByb3BzIGFuZCBwcmV2aW91cyBmb3VuZCBsYXllcnMuXG4gICAqIEJ5IGRlZmF1bHQsIG5vIGxheWVycyB3aWxsIGJlIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIGZvdW5kTGF5ZXJzKSB7XG4gICAgcmV0dXJuIHtwcm9wczogW10sIGZvdW5kTGF5ZXJzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGFycmF5IG9mIHByZXNldCByZXF1aXJlZCBjb2x1bW4gbmFtZXNcbiAgICogZm91bmQgZmllbGQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0byBzZXQgYXMgbGF5ZXIgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmllbGRzXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IGFsbEZpZWxkc1xuICAgKiBAcmV0dXJucyB7b2JqZWN0W10gfCBudWxsfSBhbGwgcG9zc2libGUgcmVxdWlyZWQgbGF5ZXIgY29sdW1uIHBhaXJzXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRDb2x1bW5GaWVsZChkZWZhdWx0RmllbGRzLCBhbGxGaWVsZHMpIHtcbiAgICAvLyBmaW5kIGFsbCBtYXRjaGVkIGZpZWxkcyBmb3IgZWFjaCByZXF1aXJlZCBjb2xcbiAgICBjb25zdCByZXF1aXJlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RmllbGRzKS5yZWR1Y2UoKHByZXYsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBhbGxGaWVsZHMuZmlsdGVyKFxuICAgICAgICBmID0+IGYubmFtZSA9PT0gZGVmYXVsdEZpZWxkc1trZXldIHx8IGRlZmF1bHRGaWVsZHNba2V5XS5pbmNsdWRlcyhmLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBwcmV2W2tleV0gPSByZXF1aXJlZEZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyByZXF1aXJlZEZpZWxkcy5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgdmFsdWU6IGYubmFtZSxcbiAgICAgICAgICAgIGZpZWxkSWR4OiBmLmZpZWxkSWR4XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhyZXF1aXJlZENvbHVtbnMpLmV2ZXJ5KEJvb2xlYW4pKSB7XG4gICAgICAvLyBpZiBhbnkgZmllbGQgbWlzc2luZywgcmV0dXJuIG51bGxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMocmVxdWlyZWRDb2x1bW5zKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucykge1xuICAgIC8vIGZvciBtdWx0aXBsZSBtYXRjaGVkIGZpZWxkIGZvciBvbmUgcmVxdWlyZWQgY29sdW1uLCByZXR1cm4gbXVsdGlwbGVcbiAgICAvLyBjb21iaW5hdGlvbnMsIGUuIGcuIGlmIGNvbHVtbiBhIGhhcyAyIG1hdGNoZWQsIGNvbHVtbiBiIGhhcyAzIG1hdGNoZWRcbiAgICAvLyA2IHBvc3NpYmxlIGNvbHVtbiBwYWlycyB3aWxsIGJlIHJldHVybmVkXG4gICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gICAgY29uc3QgcG9pbnRlcnMgPSBhbGxLZXlzLm1hcCgoaywgaSkgPT4gKChpID09PSBhbGxLZXlzLmxlbmd0aCAtIDEgPyAtMSA6IDApKSk7XG4gICAgY29uc3QgY291bnRQZXJLZXkgPSBhbGxLZXlzLm1hcChrID0+IHJlcXVpcmVkQ29sdW1uc1trXS5sZW5ndGgpO1xuICAgIGNvbnN0IHBhaXJzID0gW107XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB3aGlsZSAoaW5jcmVtZW50UG9pbnRlcnMocG9pbnRlcnMsIGNvdW50UGVyS2V5LCBwb2ludGVycy5sZW5ndGggLSAxKSkge1xuICAgICAgY29uc3QgbmV3UGFpciA9IHBvaW50ZXJzLnJlZHVjZSgocHJldiwgY3V1ciwgaSkgPT4ge1xuICAgICAgICBwcmV2W2FsbEtleXNbaV1dID0gcmVxdWlyZWRDb2x1bW5zW2FsbEtleXNbaV1dW2N1dXJdO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcGFpcnMucHVzaChuZXdQYWlyKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuICAgIC8vIHJlY3Vyc2l2ZWx5IGluY3JlbWVudCBwb2ludGVyc1xuICAgIGZ1bmN0aW9uIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmIHB0c1swXSA9PT0gY291bnRzWzBdIC0gMSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGluY3JlbWVudFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdHNbaW5kZXhdICsgMSA8IGNvdW50c1tpbmRleF0pIHtcbiAgICAgICAgcHRzW2luZGV4XSA9IHB0c1tpbmRleF0gKyAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcHRzW2luZGV4XSA9IDA7XG4gICAgICByZXR1cm4gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhaXJzO1xuICB9XG5cbiAgc3RhdGljIGhleFRvUmdiKGMpIHtcbiAgICByZXR1cm4gaGV4VG9SZ2IoYyk7XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhSWQ6IHByb3BzLmRhdGFJZCB8fCBudWxsLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbToge1xuICAgICAgICBtaW46IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1pbiB8fCBaT09NX0xFVkVMX0xJTUlUUy5taW4sXG4gICAgICAgIG1heDogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWF4IHx8IFpPT01fTEVWRUxfTElNSVRTLm1heFxuICAgICAgfSxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCBERUZBVUxUX0xBWUVSX0xBQkVMLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yIHx8IGNvbG9yTWFrZXIubmV4dCgpLnZhbHVlLFxuICAgICAgY29sdW1uczogcHJvcHMuY29sdW1ucyB8fCBudWxsLFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG5cbiAgICAgIHZpc0NvbmZpZzoge30sXG5cbiAgICAgIHRleHRMYWJlbDogW0RFRkFVTFRfVEVYVF9MQUJFTF0sXG5cbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgY29sb3I6IERFRkFVTFRfQ09MT1JfVUksXG4gICAgICAgIGNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH0sXG4gICAgICBhbmltYXRpb246IHtlbmFibGVkOiBmYWxzZX1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgYSB2aXN1YWxDaGFubmVsIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHt7bGFiZWw6IHN0cmluZywgbWVhc3VyZTogKHN0cmluZ3xzdHJpbmcpfX1cbiAgICovXG4gIGdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbihrZXkpIHtcbiAgICAvLyBlLmcuIGxhYmVsOiBDb2xvciwgbWVhc3VyZTogVmVoaWNsZSBUeXBlXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5yYW5nZV0ubGFiZWwsXG4gICAgICBtZWFzdXJlOiB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdXG4gICAgICAgID8gKHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0uZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLm5hbWUpXG4gICAgICAgIDogdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmRlZmF1bHRNZWFzdXJlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLmZpZWxkSWR4XG4gICAgICAgIH1cbiAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XToge1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zW2tleV0sXG4gICAgICAgIC4uLnVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgcGFpciB0byBjb2x1bW4gY29uZmlnLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gcGFpciAtIGZpZWxkIFBhaXJcbiAgICogQHJldHVybnMge29iamVjdH0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW5QYWlycyhrZXksIHBhaXIpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uUGFpcnMgfHwgIXRoaXMuY29sdW1uUGFpcnM/LltrZXldKSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVuZCBpbiB0aGlzIHN0YXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgICB9XG5cbiAgICBjb25zdCB7cGFpcjogcGFydG5lcktleSwgZmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltrZXldO1xuICAgIGNvbnN0IHtmaWVsZFBhaXJLZXk6IHBhcnRuZXJGaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW3BhcnRuZXJLZXldO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XTogcGFpcltmaWVsZFBhaXJLZXldLFxuICAgICAgW3BhcnRuZXJLZXldOiBwYWlyW3BhcnRuZXJGaWVsZFBhaXJLZXldXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSByYWRpdXMgem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Wm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgubWF4KDE0IC0gem9vbSArIHpvb21PZmZzZXQsIDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSBlbGV2YXRpb24gem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0RWxldmF0aW9uWm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGVFbGV2YXRpb25ab29tRmFjdG9yXG4gICAgICA/IE1hdGgucG93KDIsIE1hdGgubWF4KDggLSB6b29tICsgem9vbU9mZnNldCwgMCkpXG4gICAgICA6IDE7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIGZpbHRlcmVkSW5kZXgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZW5kZXJMYXllcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZW50cnkgb2YgbGF5ZXJEYXRhIHNob3VsZCBoYXZlIGFuIGluZGV4IG9mIGEgcm93IGluIHRoZSBvcmlnaW5hbCBkYXRhIGNvbnRhaW5lci5cbiAgICAvLyBFYWNoIGxheWVyIGNhbiBpbXBsZW1lbnQgaXRzIG93biBnZXRIb3ZlckRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIGRhdGFDb250YWluZXIucm93KG9iamVjdC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjaGFuZ2UgbGF5ZXIgdHlwZSwgdHJ5IHRvIGNvcHkgb3ZlciBsYXllciBjb25maWdzIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgICogQHBhcmFtIGNvbmZpZ1RvQ29weSAtIGNvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHZpc0NvbmZpZ1NldHRpbmdzIC0gdmlzQ29uZmlnIHNldHRpbmdzIG9mIGNvbmZpZyB0byBjb3B5XG4gICAqL1xuICBhc3NpZ25Db25maWdUb0xheWVyKGNvbmZpZ1RvQ29weSwgdmlzQ29uZmlnU2V0dGluZ3MpIHtcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIHZpc3VhbENoYW5uZWwgZmllbGRcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIGNvbG9yIHJhbmdlLCByZXZlcnNlZDogaXMgbm90IGEga2V5IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBzaGFsbG93Q29weSA9IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ10uY29uY2F0KFxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmZpZWxkKVxuICAgICk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgZG9tYWluIGFuZCBhbmltYXRpb25cbiAgICBjb25zdCBub3RUb0NvcHkgPSBbJ2FuaW1hdGlvbiddLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZG9tYWluKSk7XG4gICAgLy8gaWYgcmFuZ2UgaXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGdyb3VwIGNvcHkgaXQsIG90aGVyd2lzZSwgbm90IHRvIGNvcHlcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godiA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZ1RvQ29weS52aXNDb25maWdbdi5yYW5nZV0gJiZcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXSAmJlxuICAgICAgICB2aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cCAhPT0gdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cFxuICAgICAgKSB7XG4gICAgICAgIG5vdFRvQ29weS5wdXNoKHYucmFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIHZpc3VhbENoYW5uZWwgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY29waWVkID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7XG4gICAgICBzaGFsbG93Q29weSxcbiAgICAgIG5vdFRvQ29weVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtzaGFsbG93Q29weSA9IFtdLCBub3RUb0NvcHkgPSBbXX0gPSB7fSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pICYmXG4gICAgICAgICFzaGFsbG93Q29weS5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFzc2lnbiBvYmplY3QgdmFsdWVcbiAgICAgICAgY29waWVkW2tleV0gPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnW2tleV0sIGNvbmZpZ1RvQ29weVtrZXldLCB7XG4gICAgICAgICAgc2hhbGxvd0NvcHksXG4gICAgICAgICAgbm90VG9Db3B5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub3ROdWxsb3JVbmRlZmluZWQoY29uZmlnVG9Db3B5W2tleV0pICYmICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVmlzQ29uZmlnKGxheWVyVmlzQ29uZmlncykge1xuICAgIE9iamVjdC5rZXlzKGxheWVyVmlzQ29uZmlncykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXTtcbiAgICAgIH0gZWxzZSBpZiAoWyd0eXBlJywgJ2RlZmF1bHRWYWx1ZSddLmV2ZXJ5KHAgPT4gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmhhc093blByb3BlcnR5KHApKSkge1xuICAgICAgICAvLyBpZiBwcm92aWRlZCBjdXN0b21pemVkIHZpc0NvbmZpZywgYW5kIGhhcyB0eXBlICYmIGRlZmF1bHRWYWx1ZVxuICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGNoZWNrIGlmIGN1c3RvbWl6ZWQgdmlzQ29uZmlnIGlzIHZhbGlkXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gey4uLnRoaXMuY29uZmlnLCAuLi5uZXdDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcudmlzQ29uZmlnID0gey4uLnRoaXMuY29uZmlnLnZpc0NvbmZpZywgLi4ubmV3VmlzQ29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpIHtcbiAgICBjb25zdCB7Y29sb3JVSTogcHJldmlvdXMsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChuZXdDb25maWcpIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JVSVByb3AgPSBPYmplY3QuZW50cmllcyhuZXdDb25maWcpLnJlZHVjZSgoYWNjdSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogaXNQbGFpbk9iamVjdChhY2N1W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsdWUpID8gey4uLmFjY3Vba2V5XSwgLi4udmFsdWV9IDogdmFsdWVcbiAgICAgIH07XG4gICAgfSwgcHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSk7XG5cbiAgICBjb25zdCBjb2xvclVJID0ge1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICBbcHJvcF06IGNvbG9yVUlQcm9wXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2NvbG9yVUl9KTtcbiAgICAvLyBpZiBjb2xvclVJW3Byb3BdIGlzIGNvbG9yUmFuZ2UuIElmIHR5cGUgaXMgaGV4Q29sb3IgdGhlbiBpdCdzIGFsc28gYSByYW5nZVxuICAgIGNvbnN0IGlzQ29sb3JSYW5nZSA9XG4gICAgICB2aXNDb25maWdbcHJvcF0gJiYgKHZpc0NvbmZpZ1twcm9wXS5jb2xvcnMgfHwgdmlzQ29uZmlnW3Byb3BdLnR5cGUgPT09IGhleENvbG9yKTtcblxuICAgIGlmIChpc0NvbG9yUmFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgaWYgKCFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyB8fCAhbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuY3VzdG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghdmlzQ29uZmlnW3Byb3BdKSByZXR1cm47XG4gICAgY29uc3Qge2NvbG9yc30gPSB2aXNDb25maWdbcHJvcF07XG4gICAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY3VzdG9tUGFsZXR0ZSxcbiAgICAgIG5hbWU6ICdDdXN0b20gUGFsZXR0ZScsXG4gICAgICBjb2xvcnM6IFsuLi5jb2xvcnNdXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogaWYgb3BlbiBkcm9wZG93biBhbmQgcHJvcCBpcyBjb2xvciByYW5nZVxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBjb2xvclJhbmdlQ29uZmlnJ3Mgc3RlcCwgcmV2ZXJzZWQgYW5kIHR5cGVcbiAgICogQHBhcmFtIHsqfSBuZXdDb25maWdcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICB1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCkge1xuICAgIGlmICh0eXBlb2YgbmV3Q29uZmlnLnNob3dEcm9wZG93biAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgLi4uY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnLFxuICAgICAgICAgICAgdHlwZTogdmlzQ29uZmlnW3Byb3BdLnR5cGUsXG4gICAgICAgICAgICBzdGVwczogdmlzQ29uZmlnW3Byb3BdLmNvbG9ycz8ubGVuZ3RoLFxuICAgICAgICAgICAgcmV2ZXJzZWQ6IEJvb2xlYW4odmlzQ29uZmlnW3Byb3BdLnJldmVyc2VkKSxcbiAgICAgICAgICAgIGhleENvbHVtbjogdGhpcy5nZXRIZXhDb2x1bW4ocHJvcCksXG4gICAgICAgICAgICBpc0hleENvbHVtbjogdGhpcy5pc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHByb3ApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBjb2xvclJhbmdlIGlmIGNoYW5nZXMgaW4gVUkgaXMgbWFkZSB0byAncmV2ZXJzZWQnLCAnc3RlcHMnIG9yIHN0ZXBzXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnICYmXG4gICAgICBbJ3JldmVyc2VkJywgJ3N0ZXBzJ10uc29tZShcbiAgICAgICAga2V5ID0+XG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnW2tleV0gIT09XG4gICAgICAgICAgICAocHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSkuY29sb3JSYW5nZUNvbmZpZ1trZXldXG4gICAgICApO1xuICAgIGlmICghc2hvdWxkVXBkYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWR9ID0gY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnO1xuICAgIGNvbnN0IGNvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF07XG4gICAgLy8gZmluZCBiYXNlZCBvbiBzdGVwIG9yIHJldmVyc2VkXG4gICAgbGV0IHVwZGF0ZTtcbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3N0ZXBzJykpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ2V0Q29sb3JHcm91cEJ5TmFtZShjb2xvclJhbmdlKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNhbWVHcm91cCA9IENPTE9SX1JBTkdFUy5maWx0ZXIoY3IgPT4gZ2V0Q29sb3JHcm91cEJ5TmFtZShjcikgPT09IGdyb3VwKTtcblxuICAgICAgICB1cGRhdGUgPSBzYW1lR3JvdXAuZmluZChjciA9PiBjci5jb2xvcnMubGVuZ3RoID09PSBzdGVwcyk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLnJldmVyc2VkKSB7XG4gICAgICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UodHJ1ZSwgdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5jb2xvck1hcCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHRoaXMudXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JSYW5nZS5jb2xvck1hcCwgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmV2ZXJzZWQnKSkge1xuICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UocmV2ZXJzZWQsIHVwZGF0ZSB8fCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtbcHJvcF06IHVwZGF0ZX0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yTWFwLCBjb2xvclJhbmdlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHtmaWVsZCwgZG9tYWlufSA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcHJvcCk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnW2ZpZWxkXT8udHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0eXBlIG9yIHR5cGUgaXMgbm90IHN0cmluZywgYm9vbGVhbiBvciBkYXRlXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgfVxuXG4gIHVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IGNvbG9yUmFuZ2UuY29sb3JzO1xuICAgIGNvbnN0IGFzc2lnbmVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIGlmIChjb2xvclJhbmdlLnR5cGUgPT09IGhleENvbG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2xvclJhbmdlLFxuICAgICAgICBjb2xvck1hcDogW11cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCkubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY01hcFswXSk7XG4gICAgICByZXR1cm4gW2NNYXBbMF0sIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGZvciAoY29uc3QgY29sb3Igb2YgdW5hc3NpZ25lZENvbG9ycykge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBkb21haW4uZmluZChkID0+ICFhc3NpZ25lZENhdGVnb3JpZXMuaW5jbHVkZXMoZCkpO1xuICAgICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTtcbiAgICAgIG5ld0NvbG9yTWFwLnB1c2goW2NhdGVnb3J5LCBjb2xvcl0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgdXBkYXRlKSB7XG4gICAgY29uc3QgY29sb3JzID0gdXBkYXRlLmNvbG9ycztcbiAgICBsZXQgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIG5ld0NvbG9yTWFwID0gbmV3Q29sb3JNYXAubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gbmV3Q29sb3JNYXAubGVuZ3RoIC0gMSA/IG51bGwgOiBjTWFwWzBdO1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgaWYgKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sb3JNYXBWYWx1ZXMgPSBjb2xvck1hcC5tYXAoYyA9PiBjWzBdKS5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5jb2xvck1hcFZhbHVlcywgZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSk7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAyXVswXTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBwcmV2VmFsdWUpIC8gKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoICsgMSk7XG4gICAgICBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAxXVswXSA9IHByZXZWYWx1ZSArIHN0ZXA7XG5cbiAgICAgIGZvciAoY29uc3QgW2ksIGNvbG9yXSBvZiB1bmFzc2lnbmVkQ29sb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGkgPT09IHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoIC0gMSA/IG51bGwgOiBwcmV2VmFsdWUgKyAoc3RlcCAqIChpICsgMikpO1xuICAgICAgICBuZXdDb2xvck1hcC5wdXNoKFt2YWx1ZSwgY29sb3JdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsQ29sdW1ucygpIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gKFxuICAgICAgKGNvbHVtbnMgJiZcbiAgICAgIE9iamVjdC52YWx1ZXMoY29sdW1ucykuZXZlcnkodiA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHYub3B0aW9uYWwgfHwgKHYudmFsdWUgJiYgdi5maWVsZElkeCA+IC0xKSk7XG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheSB8IE9iamVjdH0gbGF5ZXJEYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0xheWVyRGF0YShsYXllckRhdGEpIHtcbiAgICBpZiAoIWxheWVyRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihsYXllckRhdGEuZGF0YSAmJiBsYXllckRhdGEuZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgaXNWYWxpZFRvU2F2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlICYmIHRoaXMuaGFzQWxsQ29sdW1ucygpO1xuICB9XG5cbiAgc2hvdWxkUmVuZGVyTGF5ZXIoZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy50eXBlICYmXG4gICAgICB0aGlzLmhhc0FsbENvbHVtbnMoKSAmJlxuICAgICAgdGhpcy5oYXNMYXllckRhdGEoZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLnJlbmRlckxheWVyID09PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH1cblxuICBnZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlKSB7XG4gICAgaWYgKGNvbG9yUmFuZ2UudHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIHJldHVybiAoXywgY29sb3IpID0+IHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGJ9ID0gcmdiKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIFtyLCBnLCBiXS5zb21lKGlzTmFOKSA/IFVOS05PV05fQ09MT1IgOiBbciwgZywgYl07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb2xvclJhbmdlLmNvbG9yTWFwKSkge1xuICAgICAgY29uc3QgY01hcCA9IG5ldyBNYXAoKTtcbiAgICAgIGNvbG9yUmFuZ2UuY29sb3JNYXAuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGNNYXAuc2V0KGssIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGhleFRvUmdiKHYpIDogdik7XG4gICAgICB9KTtcblxuICAgICAgLy8gQHRzLWlnbm9yZSBkMyBzY2FsZVxuICAgICAgY29uc3Qgc2NhbGUgPSBTQ0FMRV9GVU5DW2NvbG9yU2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihBcnJheS5mcm9tKGNNYXAua2V5cygpKSlcbiAgICAgICAgLnJhbmdlKEFycmF5LmZyb20oY01hcC52YWx1ZXMoKSkpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKSk7XG4gIH1cblxuICBnZXRDdXN0b21NYXJrZXJzU2NhbGUocmFuZ2UsIGZhbGxiYWNrSWNvbikge1xuICAgIGxldCB1bmtub3duVmFsdWUgPSBmYWxsYmFja0ljb24gfHwgRkFMTEJBQ0tfSUNPTjtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm4gKCkgPT4gdW5rbm93blZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAocmFuZ2Uub3RoZXJzTWFya2VyKSB7XG4gICAgICB1bmtub3duVmFsdWUgPSByYW5nZS5vdGhlcnNNYXJrZXI7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge3ZhbHVlLCBtYXJrZXJVcmx9IG9mIHJhbmdlLm1hcmtlck1hcCkge1xuICAgICAgaWYgKG1hcmtlclVybCkge1xuICAgICAgICBtYXBwaW5nLnNldCh2YWx1ZSwgbWFya2VyVXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZU9yZGluYWwoKVxuICAgICAgLmRvbWFpbihBcnJheS5mcm9tKG1hcHBpbmcua2V5cygpKSlcbiAgICAgIC5yYW5nZShBcnJheS5mcm9tKG1hcHBpbmcudmFsdWVzKCkpKVxuICAgICAgLnVua25vd24odW5rbm93blZhbHVlKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHZpc3VhbCBjaGFubmVscyB0byBkZWNrLmdsIGFjY2Vzb3JzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbSBQYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtLmRhdGFBY2Nlc3NvciBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBwYXJhbS5kYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gdXNlIHVzZSB3aXRoIGRhdGFBY2Nlc3NvclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGF0dHJpYnV0ZUFjY2Vzc29ycyAtIGRlY2suZ2wgbGF5ZXIgYXR0cmlidXRlIGFjY2Vzc29yc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQWNjZXNzb3IgPSBkZWZhdWx0RGF0YUFjY2Vzc29yLCBkYXRhQ29udGFpbmVyfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29ycyA9IHt9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgZml4ZWQsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICAgICAgbnVsbFZhbHVlLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG5cbiAgICAgIGNvbnN0IHNob3VsZEdldFNjYWxlID0gQm9vbGVhbihcbiAgICAgICAgKHNjYWxlIHx8IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5KSAmJiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRHZXRTY2FsZSkge1xuICAgICAgICBjb25zdCBhcmdzID0gW3RoaXMuY29uZmlnW3NjYWxlXSwgdGhpcy5jb25maWdbZG9tYWluXSwgdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXV07XG4gICAgICAgIGNvbnN0IGlzRml4ZWQgPSBmaXhlZCAmJiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdO1xuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBkZWNsYXJlIGFzIGNvbnN0IGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0IHdlIGFyZSBnb2luZyB0byBiZSB1c2UgaW4gdGhlIGdldEVuY29kZWRDaGFubmVsVmFsdWUgY2FsbFxuICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBvbGRMYXllckRhdGEgcGFyYW1ldGVyIGluIGZvcm1hdExheWVyRGF0YSBtZXRob2Qgd2lsbCBiZSB3cm9uZyAoeW91IGNhbiBjaGVjayB0aGUgZm9ybWF0TGF5ZXJEYXRhIFRpbGVMYXllciBtZXRob2QgaW4gQnVpbGRlciBhcyBleGFtcGxlKVxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25WYWx1ZSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1thZ2dyZWdhdGlvbl07XG5cbiAgICAgICAgY29uc3Qgc2NhbGVGdW5jdGlvbiA9XG4gICAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuaWRlbnRpdHlcbiAgICAgICAgICAgID8gc2NhbGVJZGVudGl0eVxuICAgICAgICAgICAgOiBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvclxuICAgICAgICAgICAgPyB0aGlzLmdldENvbG9yU2NhbGUoLi4uYXJncylcbiAgICAgICAgICAgIDogY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZSguLi5hcmdzLCBpc0ZpeGVkKTtcblxuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZCA9PlxuICAgICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgICAgIHNjYWxlOiBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YTogZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGQ6IGZpZWxkQ29uZmlnLFxuICAgICAgICAgICAgX2FnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnZXRBdHRyaWJ1dGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZ2V0QXR0cmlidXRlVmFsdWUodGhpcy5jb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9XG4gICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFjY2Vzc29yIGluIGF0dHJpYnV0ZUFjY2Vzc29ycykpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShzY2FsZSwgZG9tYWluLCByYW5nZSwgZml4ZWQpIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgICAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihkb21haW4uc2xpY2UoMCwgcmFuZ2UubGVuZ3RoKSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgYGNvdW50YCBhZ2dyZWdhdGlvbiwgd2UgZG9tYWluIGlzIGFjdHVhbGx5IGBbMCwgSW5maW5pdHldYCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICAvLyB0byB1c2UgaXQsIHNvIHNraXAgc3BlY3lmeWluZyB0aGlzIGRvbWFpbnNcbiAgICBjb25zdCBkb21haW5Jc0luZmluaXRlID0gZG9tYWluICYmIChkb21haW5bMF0gPT09IDAgJiYgZG9tYWluWzFdID09PSBJbmZpbml0eSk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3J5ID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdO1xuICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgIGxldCByZXN1bHQgPSBzY2FsZUZhY3RvcnkoKTtcbiAgICBpZiAoZG9tYWluICYmICFkb21haW5Jc0luZmluaXRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZG9tYWluKGRvbWFpbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZX0gZGF0YUNvbnRhaW5lciBEYXRhQ29udGFpbmVyIHRvIGNhbGN1bGF0ZSBib3VuZHMgZm9yLlxuICAgKiBAcGFyYW0geyhkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2UpID0+IG51bWJlcltdfSBnZXRQb3NpdGlvbiBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEByZXR1cm4ge251bWJlcltdfG51bGx9IGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgZGF0YXNldFxuICAgIC8vIGdldCBhIHNhbXBsZSBvZiBkYXRhIHRvIGNhbGN1bGF0ZSBib3VuZHNcbiAgICBjb25zdCBzYW1wbGVEYXRhID1cbiAgICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gTUFYX1NBTVBMRV9TSVpFXG4gICAgICAgID8gZ2V0U2FtcGxlRGF0YShkYXRhQ29udGFpbmVyLCBNQVhfU0FNUExFX1NJWkUpXG4gICAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHBvaW50cyA9IHNhbXBsZURhdGEubWFwSW5kZXgoZ2V0UG9zaXRpb24pO1xuXG4gICAgY29uc3QgbGF0Qm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMSwgWy05MCwgOTBdKTtcbiAgICBjb25zdCBsbmdCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAwLCBbLTE4MCwgMTgwXSk7XG5cbiAgICBpZiAoIWxhdEJvdW5kcyB8fCAhbG5nQm91bmRzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW2xuZ0JvdW5kc1swXSwgbGF0Qm91bmRzWzBdLCBsbmdCb3VuZHNbMV0sIGxhdEJvdW5kc1sxXV07XG4gIH1cblxuICBnZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKSB7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSBkaWZmVXBkYXRlVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzLCB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMpO1xuICAgIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IGRhdGFVcGRhdGVUcmlnZ2VycztcblxuICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlZDtcbiAgfVxuXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUoe1xuICAgIGNoYW5uZWwsXG4gICAgc2NhbGUsXG4gICAgZGF0YSxcbiAgICBmaWVsZCxcbiAgICBkYXRhQ29udGFpbmVyLFxuICAgIC8vIEluIGJ1aWxkZXIgd2Ugb3ZlcndyaXRlIHRoZSBnZXRWYWx1ZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoZSBfYWdncmVnYXRpb24gcGFyYW1ldGVyIGluIHNwYXRpYWwgaW5kZXggbGF5ZXJzIGFzIHRoZSBRdWFka2V5TGF5ZXIuXG4gICAgX2FnZ3JlZ2F0aW9uLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgfSkge1xuICAgIGxldCBjb2xvckNvbHVtblZhbHVlO1xuICAgIGNvbnN0IHt0eXBlfSA9IGZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoZmllbGQsIGRhdGEpO1xuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5yYW5nZV07XG4gICAgY29uc3QgY2hhbm5lbEZpZWxkID0gdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5maWVsZF07XG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZz8udHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkID0ge1xuICAgICAgICBpZDogY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICBuYW1lOiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgIGZpZWxkSWR4OiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW5JZHgsXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IGQgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhQ29udGFpbmVyLnZhbHVlQXQoZC5pbmRleCwgY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uSWR4KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29sb3JDb2x1bW5WYWx1ZSA9IGdldFZhbHVlKGNvbHVtbkZpZWxkLCBkYXRhKTtcbiAgICB9IGVsc2UgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTtcbiAgICBpZiAodHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY29udmVydCBoZXJlXG4gICAgICAvLyBzY2FsZSBGdW5jdGlvbiBzaG91bGQgdGFrZSBjYXJlIG9mIGl0XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKG5ldyBEYXRlKHZhbHVlKSwgY29sb3JDb2x1bW5WYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUodmFsdWUsIGNvbG9yQ29sdW1uVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlO1xuICB9XG5cbiAgdXBkYXRlTWV0YShtZXRhKSB7XG4gICAgdGhpcy5tZXRhID0gey4uLnRoaXMubWV0YSwgLi4ubWV0YX07XG4gIH1cblxuICB1cGRhdGVMYXllckxlZ2VuZChzZXR0aW5ncykge1xuICAgIHRoaXMubGVnZW5kU2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIGdldERhdGFVcGRhdGVUcmlnZ2Vycyh7ZmlsdGVyZWRJbmRleCwgaWQsIGFsbERhdGF9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGF0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnMsIGZpbHRlcmVkSW5kZXh9LFxuICAgICAgZ2V0TWV0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnN9LFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnRleHRMYWJlbCB8fCBbXSkucmVkdWNlKFxuICAgICAgICAoYWNjdSwgdGwsIGkpID0+ICh7XG4gICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICBbYGdldExhYmVsQ2hhcmFjdGVyU2V0LSR7aX1gXTogdGwuZmllbGQgPyB0bC5maWVsZC5uYW1lIDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldChkYXRhc2V0cyk7XG4gICAgY29uc3Qge2RhdGFDb250YWluZXJ9ID0gZGF0YXNldDtcblxuICAgIHRoaXMudXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhkYXRhc2V0KTtcbiAgICB0aGlzLnVwZGF0ZUhleENvbG9yRG9tYWluKGRhdGFzZXQpO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3QgZGF0YVVwZGF0ZVRyaWdnZXJzID0gdGhpcy5nZXREYXRhVXBkYXRlVHJpZ2dlcnMoZGF0YXNldCk7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSB0aGlzLmdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpO1xuXG4gICAgaWYgKHRyaWdnZXJDaGFuZ2VkLmdldE1ldGEpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YSA9IFtdO1xuXG4gICAgaWYgKCF0cmlnZ2VyQ2hhbmdlZC5nZXREYXRhICYmIG9sZExheWVyRGF0YSAmJiBvbGRMYXllckRhdGEuZGF0YSkge1xuICAgICAgLy8gc2FtZSBkYXRhXG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0aGlzLmNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoZGF0YXNldCwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7ZGF0YSwgdHJpZ2dlckNoYW5nZWR9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdHlsZWQgZmllbGRzIHRvIG1hdGNoIG9uZXMgZnJvbSBuZXcgZGF0YXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAgICovXG4gIHVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMoZGF0YXNldCkge1xuICAgIGZvciAoY29uc3Qge2ZpZWxkLCByYW5nZX0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKSkge1xuICAgICAgY29uc3Qgb2xkRmllbGQgPSB0aGlzLmNvbmZpZ1tmaWVsZF07XG4gICAgICBjb25zdCBpc1VzaW5nSGV4Q29sb3JDb2RlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXT8uaGV4Q29sb3I7XG4gICAgICBpZiAoIW9sZEZpZWxkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdEYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IG9sZEZpZWxkLm5hbWUpIHx8IG51bGw7XG4gICAgICBpZiAoaXNVc2luZ0hleENvbG9yQ29kZSkge1xuICAgICAgICBuZXdEYXRhU2V0RmllbGQgPSB7XG4gICAgICAgICAgLi4ubmV3RGF0YVNldEZpZWxkLFxuICAgICAgICAgIGNvbG9yQ29sdW1uOiBuZXdEYXRhU2V0RmllbGQuY29sb3JDb2x1bW4gfHwgb2xkRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgICAgY29sb3JDb2x1bW5JZHg6IG5ld0RhdGFTZXRGaWVsZC5jb2xvckNvbHVtbklkeCB8fCBvbGRGaWVsZC5jb2xvckNvbHVtbklkeFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbmV3RGF0YVNldEZpZWxkfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgb25lIGxheWVyIGRvbWFpbiB3aGVuIHN0YXRlLmRhdGEgY2hhbmdlZFxuICAgKiBpZiBzdGF0ZS5kYXRhIGNoYW5nZSBpcyBkdWUgb3QgdXBkYXRlIGZpbHRlciwgbmV3RmlsZXIgd2lsbCBiZSBwYXNzZWRcbiAgICogY2FsbGVkIGJ5IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG5ld0ZpbHRlclxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBsYXllclxuICAgKi9cbiAgdXBkYXRlTGF5ZXJEb21haW4oZGF0YXNldHMsIG5ld0ZpbHRlcikge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge3NjYWxlfSA9IGNoYW5uZWw7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG5cbiAgICAgIC8vIG9yZGluYWwgZG9tYWluIGlzIGJhc2VkIG9uIGRhdGFDb250YWluZXIsIGlmIG9ubHkgZmlsdGVyIGNoYW5nZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluXG4gICAgICBpZiAoIW5ld0ZpbHRlciB8fCBzY2FsZVR5cGUgIT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgICAgY29uc3Qge2RvbWFpbn0gPSBjaGFubmVsO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbih0YWJsZSwgY2hhbm5lbCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tkb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldERhdGFzZXQoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdmlzdWFsIGNoYW5uZWwgZmllbGQgYW5kIHNjYWxlcyBiYXNlZCBvbiBzdXBwb3J0ZWQgZmllbGQgJiBzY2FsZSB0eXBlXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICB2YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRoaXMudmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCk7XG4gICAgdGhpcy52YWxpZGF0ZVNjYWxlKGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpZWxkIHR5cGUgYmFzZWQgb24gY2hhbm5lbFNjYWxlVHlwZVxuICAgKi9cbiAgdmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgY2hhbm5lbFNjYWxlVHlwZSwgc3VwcG9ydGVkRmllbGRUeXBlc30gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgLy8gaWYgZmllbGQgaXMgc2VsZWN0ZWQsIGNoZWNrIGlmIGZpZWxkIHR5cGUgaXMgc3VwcG9ydGVkXG4gICAgICBjb25zdCBjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyA9XG4gICAgICAgIHN1cHBvcnRlZEZpZWxkVHlwZXMgfHwgQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTW2NoYW5uZWxTY2FsZVR5cGVdO1xuXG4gICAgICBpZiAoIWNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzLmluY2x1ZGVzKHRoaXMuY29uZmlnW2ZpZWxkXS50eXBlKSkge1xuICAgICAgICAvLyBmaWVsZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHNldCBpdCBiYWNrIHRvIG51bGxcbiAgICAgICAgLy8gc2V0IHNjYWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBudWxsfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNjYWxlIHR5cGUgYmFzZWQgb24gYWdncmVnYXRpb25cbiAgICovXG4gIHZhbGlkYXRlU2NhbGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtzY2FsZSwgcmFuZ2V9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBpZiAoXG4gICAgICAhc2NhbGUgfHxcbiAgICAgICh0aGlzLmlzQ29sb3JlZEJ5Q29sb3JDb2x1bW4ocmFuZ2UpICYmIHRoaXMuY29uZmlnW3NjYWxlXSA9PT0gU0NBTEVfVFlQRVMuaWRlbnRpdHkpXG4gICAgKSB7XG4gICAgICAvLyB2aXN1YWxDaGFubmVsIGRvZXNuJ3QgaGF2ZSBzY2FsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSB0aGlzLmdldFNjYWxlT3B0aW9ucyhjaGFubmVsKTtcbiAgICAvLyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIHNjYWxlIGlzXG4gICAgLy8gc3VwcG9ydGVkLCBpZiBub3QsIGNoYW5nZSB0byBkZWZhdWx0XG4gICAgaWYgKCFzY2FsZU9wdGlvbnMuaW5jbHVkZXModGhpcy5jb25maWdbc2NhbGVdKSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3NjYWxlXTogc2NhbGVPcHRpb25zWzBdfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzY2FsZSBvcHRpb25zIGJhc2VkIG9uIGN1cnJlbnQgZmllbGRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIHNjYWxlLCBjaGFubmVsU2NhbGVUeXBlfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWdbZmllbGRdXG4gICAgICA/IEZJRUxEX09QVFNbdGhpcy5jb25maWdbZmllbGRdLnR5cGVdLnNjYWxlW2NoYW5uZWxTY2FsZVR5cGVdXG4gICAgICA6IFt0aGlzLmdldERlZmF1bHRMYXllckNvbmZpZygpW3NjYWxlXV07XG4gIH1cblxuICB1cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIC8vIGNhbGN1bGF0ZSBsYXllciBjaGFubmVsIGRvbWFpblxuICAgIGNvbnN0IHVwZGF0ZWREb21haW4gPSB0aGlzLmNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1t2aXN1YWxDaGFubmVsLmRvbWFpbl06IHVwZGF0ZWREb21haW59KTtcbiAgfVxuXG4gIGdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycygpIHtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2aXN1YWxDaGFubmVsID0+IHtcbiAgICAgIC8vIGZpZWxkIHJhbmdlIHNjYWxlIGRvbWFpblxuICAgICAgY29uc3Qge2FjY2Vzc29yLCBmaWVsZCwgc2NhbGUsIGRvbWFpbiwgcmFuZ2UsIGRlZmF1bHRWYWx1ZSwgZml4ZWR9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdID0ge1xuICAgICAgICBbZmllbGRdOiB0aGlzLmNvbmZpZ1tmaWVsZF0sXG4gICAgICAgIFtzY2FsZV06IHRoaXMuY29uZmlnW3NjYWxlXSxcbiAgICAgICAgW2RvbWFpbl06IHRoaXMuY29uZmlnW2RvbWFpbl0sXG4gICAgICAgIFtyYW5nZV06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIC4uLihmaXhlZCA/IHtbZml4ZWRdOiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdfSA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdXBkYXRlVHJpZ2dlcnM7XG4gIH1cblxuICBjYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKSB7XG4gICAgY29uc3Qge3NjYWxlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1t2aXN1YWxDaGFubmVsLmZpZWxkXTtcbiAgICBpZiAoIWZpZWxkIHx8ICFzY2FsZSkge1xuICAgICAgLy8gaWYgY29sb3JGaWVsZCBvciBzaXplRmllbGQgd2VyZSBzZXQgYmFjayB0byBudWxsXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG4gICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgaWYgKCFzY2FsZVR5cGUgfHwgIWRhdGFTZXRGaWVsZCkge1xuICAgICAgLy8gaWYgbmV3IGRhdGFzZXQgZG9lc24ndCBjb250YWluIHByZXZpb3VzbHkgc2V0IGZpZWxkXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXNldC5nZXRDb2x1bW5MYXllckRvbWFpbihkYXRhU2V0RmllbGQsIHNjYWxlVHlwZSkgfHwgZGVmYXVsdERvbWFpbjtcbiAgfVxuXG4gIHVwZGF0ZUhleENvbG9yRG9tYWluKGRhdGFzZXQpIHtcbiAgICBpZiAoIWRhdGFzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2NoYW5uZWwucmFuZ2VdO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1tjaGFubmVsLmZpZWxkXTtcblxuICAgICAgaWYgKGNoYW5uZWxDb25maWc/LnR5cGUgPT09IGhleENvbG9yICYmIGZpZWxkPy5jb2xvckNvbHVtbikge1xuICAgICAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5jb2xvckNvbHVtbik7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IGRhdGFzZXRcbiAgICAgICAgICAuZ2V0Q29sdW1uTGF5ZXJEb21haW4oZGF0YVNldEZpZWxkLCBTQ0FMRV9UWVBFUy5vcmRpbmFsKVxuICAgICAgICAgIC5tYXAoYyA9PiBjaGVja0NvbG9yT3JGYWxsYmFjayhjKSk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJWaXNDb25maWcoe1xuICAgICAgICAgIFtjaGFubmVsLnJhbmdlXTogey4uLmNoYW5uZWxDb25maWcsIGNvbG9yc31cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGN1bGF0ZUhleENvbHVtbkxlZ2VuZChkYXRhc2V0cykge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGlmICghZGF0YXNldHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZWdlbmRTZXR0aW5ncyA9IE9iamVjdC5rZXlzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLnJlZHVjZSgobGVnZW5kcywgY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3Qge3JhbmdlLCBmaWVsZDogY2hhbm5lbEZpZWxkfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbY2hhbm5lbEZpZWxkXTtcblxuICAgICAgaWYgKGNoYW5uZWxDb25maWc/LnR5cGUgPT09IGhleENvbG9yICYmIGZpZWxkPy5jb2xvckNvbHVtbikge1xuICAgICAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5jb2xvckNvbHVtbik7XG4gICAgICAgIGNvbnN0IGxlZ2VuZCA9IGRhdGFzZXQuY2FsY3VsYXRlTGVnZW5kKGZpZWxkLCBkYXRhU2V0RmllbGQpO1xuICAgICAgICBsZWdlbmRzW2NoYW5uZWxdID0gbGVnZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxlZ2VuZHM7XG4gICAgfSwge30pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJMZWdlbmQobGVnZW5kU2V0dGluZ3MpO1xuICB9XG5cbiAgaGFzSG92ZXJlZE9iamVjdChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykgJiYgb2JqZWN0SW5mby5vYmplY3QgPyBvYmplY3RJbmZvLm9iamVjdCA6IG51bGw7XG4gIH1cblxuICBpc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIG9iamVjdEluZm8/LnBpY2tlZCAmJiBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgZ2V0UmFkaXVzU2NhbGVCeVpvb20obWFwU3RhdGUpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzQ2hhbm5lbC5maWVsZDtcbiAgICBjb25zdCB7cmFkaXVzfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnW2ZpZWxkXSA/IDEgOiByYWRpdXMpICogdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlKCkge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCB8fCB0aGlzLmNvbmZpZ1tyYWRpdXNDaGFubmVsLmZpZWxkXSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5yYWRpdXM7XG4gIH1cblxuICBnZXRNYXhNYXJrZXJTaXplKCkge1xuICAgIGNvbnN0IHtyYWRpdXNGaWVsZCwgc2l6ZUZpZWxkLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge3JhZGl1c1JhbmdlLCByYWRpdXN9ID0gdmlzQ29uZmlnO1xuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzRmllbGQgfHwgc2l6ZUZpZWxkO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGZpZWxkICYmIHJhZGl1c1JhbmdlID8gcmFkaXVzUmFuZ2VbMV0gOiByYWRpdXMpKTtcbiAgfVxuXG4gIHNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5zb21lKHAgPT4gIXRoaXMubm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzLmluY2x1ZGVzKHApKTtcbiAgfVxuXG4gIGdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcsIGJydXNoaW5nVGFyZ2V0KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGJydXNoaW5nUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaGluZ1RhcmdldDogYnJ1c2hpbmdUYXJnZXQgfHwgJ3NvdXJjZScsXG4gICAgICBicnVzaGluZ0VuYWJsZWQ6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKHtpZHgsIGdwdUZpbHRlciwgbWFwU3RhdGUsIHZpc2libGUsIG1hc2tQb2x5Z29ufSkge1xuICAgIGNvbnN0IG1hc2tFeHRlbnNpb25Qcm9wcyA9IGdldE1hc2tFeHRlbnNpb25Qcm9wcyhtYXNrUG9seWdvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1hc2tFeHRlbnNpb25Qcm9wcyxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaWR4LFxuICAgICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uTE5HTEFULFxuICAgICAgcGlja2FibGU6IHRoaXMuaGFzSW50ZXJhY3Rpdml0eSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBCb29sZWFuKG1hcFN0YXRlLmRyYWdSb3RhdGUgfHwgdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZTNkKX0sXG4gICAgICBoaWRkZW46IHRoaXMuY29uZmlnLmhpZGRlbixcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHRoaXMuY29uZmlnLnZpc2liaWxpdHlCeVpvb20sXG4gICAgICAvLyB2aXNjb25maWdcbiAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgLy8gZGF0YSBmaWx0ZXJpbmdcbiAgICAgIGV4dGVuc2lvbnM6IFtkYXRhRmlsdGVyRXh0ZW5zaW9uLCAuLi5tYXNrRXh0ZW5zaW9uUHJvcHMuZXh0ZW5zaW9uc10sXG4gICAgICBmaWx0ZXJSYW5nZTogZ3B1RmlsdGVyID8gZ3B1RmlsdGVyLmZpbHRlclJhbmdlIDogdW5kZWZpbmVkLFxuICAgICAgLy8gbGF5ZXIgc2hvdWxkIGJlIHZpc2libGUgYW5kIGlmIHNwbGl0TWFwLCBzaG93biBpbiB0byBvbmUgb2YgcGFuZWxcbiAgICAgIHZpc2libGU6IHRoaXMuY29uZmlnLmlzVmlzaWJsZSAmJiB2aXNpYmxlXG4gICAgfTtcbiAgfVxuXG4gIGdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHt0aGlzLmlkfS1ob3ZlcmVkYCxcbiAgICAgIHBpY2thYmxlOiBmYWxzZSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVRcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyVGV4dExhYmVsTGF5ZXIoXG4gICAge2dldFBvc2l0aW9uLCBnZXRSYWRpdXMsIHJhZGl1c1NjYWxlLCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LFxuICAgIHJlbmRlck9wdHNcbiAgKSB7XG4gICAgY29uc3Qge2RhdGF9ID0gcmVuZGVyT3B0cztcbiAgICBjb25zdCB7dGV4dExhYmVsLCB2aXNpYmlsaXR5Qnlab29tfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbLi4uc2hhcmVkUHJvcHMuZXh0ZW5zaW9ucywgY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uXTtcblxuICAgIGlmICghZGF0YSB8fCAhZGF0YS50ZXh0TGFiZWxzIHx8ICFkYXRhLnRleHRMYWJlbHNbMF0gfHwgIWRhdGEudGV4dExhYmVsc1swXS5nZXRUZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgW21haW5MYWJlbCwgc2Vjb25kYXJ5TGFiZWxdID0gdGV4dExhYmVsO1xuICAgIGNvbnN0IHtcbiAgICAgIGFsaWdubWVudCxcbiAgICAgIGFuY2hvcixcbiAgICAgIGNvbG9yOiBnZXRDb2xvcixcbiAgICAgIGZpZWxkOiBtYWluRmllbGQsXG4gICAgICBvdXRsaW5lQ29sb3IsXG4gICAgICBzaXplOiBzaXplU2NhbGVcbiAgICB9ID0gbWFpbkxhYmVsO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbG9yOiBnZXRTZWNvbmRhcnlDb2xvcixcbiAgICAgIGZpZWxkOiBzZWNvbmRhcnlGaWVsZCxcbiAgICAgIG91dGxpbmVDb2xvcjogc2Vjb25kYXJ5T3V0bGluZUNvbG9yLFxuICAgICAgc2l6ZTogc2Vjb25kYXJ5U2l6ZVNjYWxlXG4gICAgfSA9IHNlY29uZGFyeUxhYmVsIHx8IHt9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQb2ludExhYmVsTGF5ZXIoe1xuICAgICAgICAuLi5zaGFyZWRQcm9wcyxcblxuICAgICAgICAvLyBSZWNyZWF0ZSBsYXllciB3aGVuIGxhYmVscyBjaGFuZ2Ugb3RoZXJ3aXNlIHJlbmRlcmluZyBicmVha3NcbiAgICAgICAgLy8gVE9ETyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCB3aXRoIHVwZGF0ZVRyaWdnZXJzP1xuICAgICAgICBpZDogYCR7dGhpcy5pZH0tJHttYWluRmllbGQ/Lm5hbWV9LSR7c2Vjb25kYXJ5RmllbGQ/Lm5hbWV9LWxhYmVsYCxcbiAgICAgICAgZGF0YTogZGF0YS5kYXRhLFxuICAgICAgICB2aXNpYmlsaXR5Qnlab29tLFxuICAgICAgICBleHRlbnNpb25zLFxuXG4gICAgICAgIGNoYXJhY3RlclNldDogJ2F1dG8nLFxuICAgICAgICBjb2xsaXNpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBjb2xsaXNpb25Hcm91cDogYCR7dGhpcy5pZH0tbGFiZWxzYCxcblxuICAgICAgICBnZXRUZXh0OiBkYXRhLnRleHRMYWJlbHNbMF0uZ2V0VGV4dCxcbiAgICAgICAgZ2V0Q29sb3IsXG4gICAgICAgIHNpemVTY2FsZSxcbiAgICAgICAgb3V0bGluZUNvbG9yLFxuXG4gICAgICAgIC4uLihzZWNvbmRhcnlGaWVsZCAmJiB7XG4gICAgICAgICAgZ2V0U2Vjb25kYXJ5VGV4dDogZGF0YS50ZXh0TGFiZWxzWzFdLmdldFRleHQsXG4gICAgICAgICAgZ2V0U2Vjb25kYXJ5Q29sb3IsXG4gICAgICAgICAgc2Vjb25kYXJ5U2l6ZVNjYWxlLFxuICAgICAgICAgIHNlY29uZGFyeU91dGxpbmVDb2xvclxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBQb3NpdGlvblxuICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgZ2V0UmFkaXVzLFxuICAgICAgICByYWRpdXNTY2FsZSxcbiAgICAgICAgZ2V0VGV4dEFuY2hvcjogYW5jaG9yLFxuICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LFxuXG4gICAgICAgIC8vIFN0eWxlXG4gICAgICAgIGZvbnRGYW1pbHk6ICdJbnRlciwgc2FucycsXG4gICAgICAgIGZvbnRTZXR0aW5nczoge3NkZjogdHJ1ZX0sXG4gICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgb3V0bGluZVdpZHRoOiA0LFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLy8gdGV4dCB3aWxsIGFsd2F5cyBzaG93IG9uIHRvcCBvZiBhbGwgbGF5ZXJzXG4gICAgICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIGdldFRleHQ6IG1haW5GaWVsZD8ubmFtZSxcbiAgICAgICAgICBnZXRDb2xvcjogbWFpbkZpZWxkPy5jb2xvcixcbiAgICAgICAgICBnZXRUZXh0QW5jaG9yOiBtYWluTGFiZWwuYW5jaG9yLFxuICAgICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiBtYWluTGFiZWwuYWxpZ25tZW50LFxuICAgICAgICAgIGdldFNlY29uZGFyeVRleHQ6IHNlY29uZGFyeUZpZWxkPy5uYW1lXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZGVjay5nbCBgSWNvbkxheWVyYCBcImF1dG9QYWNrXCIgbW9kZSBhY2Nlc3NvciBmb3IgY3VzdG9tIG1hcmtlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gaWNvblVybEFjY2Vzc29yIGRlY2suZ2wgYWNjZXNzb3IgKG9yIHZhbHVlKSB0aGF0IHJlc29sdmVzIHRvIFVSTCBvZiBpY29uIGZvciBnaXZlbiByb3dcbiAgICogQHJldHVybnMgZGVjay5nbCBhY2Nlc3NvciB0aGF0IHJldHVybnMgVW5wYWNrZWRJY29uIHJlYWR5IHRvIGNvbnN1bWUgYnkgSWNvbkxheWVyXG4gICAqL1xuICBnZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IoaWNvblVybEFjY2Vzc29yLCBtYXNrID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1heEljb25TaXplID0gdGhpcy5nZXRNYXhNYXJrZXJTaXplKCk7XG5cbiAgICByZXR1cm4gZCA9PiB7XG4gICAgICBjb25zdCB3YW50ZWRVcmwgPVxuICAgICAgICAodHlwZW9mIGljb25VcmxBY2Nlc3NvciA9PT0gJ2Z1bmN0aW9uJykgPyBpY29uVXJsQWNjZXNzb3IoZCkgOiBpY29uVXJsQWNjZXNzb3I7XG4gICAgICBjb25zdCBpY29uT2sgPSBCb29sZWFuKHdhbnRlZFVybCk7XG4gICAgICBtYXNrID0gaWNvbk9rID8gbWFzayA6IHRydWU7XG4gICAgICBjb25zdCB1cmwgPSBpY29uT2sgPyB3YW50ZWRVcmwgOiBGQUxMQkFDS19JQ09OO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke3VybH1AQCR7bWF4SWNvblNpemV9QCR7bWFzayA/ICdtJyA6ICdjJ31gLFxuICAgICAgICB1cmwsXG4gICAgICAgIHdpZHRoOiBtYXhJY29uU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBtYXhJY29uU2l6ZSxcbiAgICAgICAgbWFza1xuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZShrZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICB9XG5cbiAgZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiAoKSA9PiBudWxsO1xuICB9XG5cbiAgZ2V0SGV4Q29sdW1uKHJhbmdlKSB7XG4gICAgY29uc3QgZmllbGQgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpPy5maW5kKHZhbHVlID0+IHZhbHVlLnJhbmdlID09PSByYW5nZSk/LmZpZWxkO1xuICAgIGlmIChmaWVsZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW47XG4gICAgfVxuICB9XG5cbiAgaXNDb2xvcmVkQnlDb2xvckNvbHVtbihyYW5nZSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdPy5oZXhDb2xvcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztB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
|
|
1855
|
+
|
|
1856
|
+
var _default = Layer;
|
|
1857
|
+
exports["default"] = _default;
|
|
1858
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvYmFzZS1sYXllci50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiRkFMTEJBQ0tfSUNPTiIsIk1BWF9TQU1QTEVfU0laRSIsImRlZmF1bHREb21haW4iLCJkYXRhRmlsdGVyRXh0ZW5zaW9uIiwiRGF0YUZpbHRlckV4dGVuc2lvbiIsImZpbHRlclNpemUiLCJNQVhfR1BVX0ZJTFRFUlMiLCJjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24iLCJDb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24iLCJkZWZhdWx0RGF0YUFjY2Vzc29yIiwiZGMiLCJkIiwiZGVmYXVsdEdldEZpZWxkVmFsdWUiLCJmaWVsZCIsInZhbHVlQWNjZXNzb3IiLCJzY2FsZUlkZW50aXR5IiwidiIsIk9WRVJMQVlfVFlQRSIsImRlY2tnbCIsIm1hcGJveGdsIiwibGF5ZXJDb2xvcnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJEYXRhVml6Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImNvbG9yTWFrZXIiLCJMYXllciIsInByb3BzIiwiaWQiLCJtZXRhIiwibGVnZW5kU2V0dGluZ3MiLCJ2aXNDb25maWdTZXR0aW5ncyIsIl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MiLCJjb25maWciLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJjb2x1bW5zIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiaW50ZXJhY3Rpdml0eVNldHRpbmdzIiwiQm9vbGVhbiIsImhvdmVyIiwiZmllbGRzIiwiY2xpY2siLCJoYXNUb29sdGlwIiwiZW5hYmxlZCIsImRhdGFJZCIsInZpc2liaWxpdHlCeVpvb20iLCJtaW4iLCJaT09NX0xFVkVMX0xJTUlUUyIsIm1heCIsImxhYmVsIiwiREVGQVVMVF9MQVlFUl9MQUJFTCIsIm5leHQiLCJ2YWx1ZSIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiaGlnaGxpZ2h0Q29sb3IiLCJERUZBVUxUX0hJR0hMSUdIVF9DT0xPUiIsImhpZGRlbiIsImNvbG9yRmllbGQiLCJjb2xvckRvbWFpbiIsImNvbG9yU2NhbGUiLCJTQ0FMRV9UWVBFUyIsInF1YW50aWxlIiwic2l6ZURvbWFpbiIsInNpemVTY2FsZSIsImxpbmVhciIsInNpemVGaWVsZCIsInJhZGl1c0ZpZWxkIiwidmlzQ29uZmlnIiwidGV4dExhYmVsIiwiREVGQVVMVF9URVhUX0xBQkVMIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjb2xvclJhbmdlIiwiYW5pbWF0aW9uIiwiY2hhbm5lbCIsInZpc3VhbENoYW5uZWxzIiwibWVhc3VyZSIsInJhbmdlU2V0dGluZ3MiLCJmaWVsZFNldHRpbmdzIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwiZGVmYXVsdE1lYXN1cmUiLCJ1cGRhdGUiLCJmaWVsZElkeCIsImNvbHVtblBhaXJzIiwicGFydG5lcktleSIsInBhcnRuZXJGaWVsZFBhaXJLZXkiLCJ6b29tIiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yIiwiZGF0YXNldHMiLCJvbGRMYXllckRhdGEiLCJvYmplY3QiLCJkYXRhQ29udGFpbmVyIiwicm93IiwiY29uZmlnVG9Db3B5Iiwic2hhbGxvd0NvcHkiLCJjb25jYXQiLCJub3RUb0NvcHkiLCJmb3JFYWNoIiwiZ3JvdXAiLCJwdXNoIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwia2V5cyIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsImluY2x1ZGVzIiwibGF5ZXJWaXNDb25maWdzIiwiaXRlbSIsImNvbmZpZ0l0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJuZXdWaXNDb25maWciLCJwcm9wIiwicHJldmlvdXMiLCJjb2xvclVJUHJvcCIsImVudHJpZXMiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJoZXhDb2xvciIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJjdXN0b21QYWxldHRlIiwic2hvd0Ryb3Bkb3duIiwic3RlcHMiLCJyZXZlcnNlZCIsImhleENvbHVtbiIsImdldEhleENvbHVtbiIsImlzSGV4Q29sdW1uIiwiaXNDb2xvcmVkQnlDb2xvckNvbHVtbiIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJzYW1lR3JvdXAiLCJDT0xPUl9SQU5HRVMiLCJmaWx0ZXIiLCJjciIsImZpbmQiLCJjb2xvck1hcCIsInVwZGF0ZUNvbG9yTWFwIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJzbGljZSIsImNNYXAiLCJ1bmFzc2lnbmVkQ29sb3JzIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsInN0ZXAiLCJpIiwibGF5ZXJEYXRhIiwiZGF0YSIsImhhc0FsbENvbHVtbnMiLCJoYXNMYXllckRhdGEiLCJyZW5kZXJMYXllciIsIl8iLCJyIiwiZyIsImIiLCJpc05hTiIsIlVOS05PV05fQ09MT1IiLCJBcnJheSIsImlzQXJyYXkiLCJNYXAiLCJrIiwic2V0IiwiU0NBTEVfRlVOQyIsInVua25vd24iLCJnZXRWaXNDaGFubmVsU2NhbGUiLCJmYWxsYmFja0ljb24iLCJ1bmtub3duVmFsdWUiLCJtYXBwaW5nIiwib3RoZXJzTWFya2VyIiwibWFya2VyTWFwIiwibWFya2VyVXJsIiwiZnJvbSIsImRhdGFBY2Nlc3NvciIsImF0dHJpYnV0ZUFjY2Vzc29ycyIsImZpeGVkIiwiYWNjZXNzb3IiLCJnZXRBdHRyaWJ1dGVWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwic2hvdWxkR2V0U2NhbGUiLCJpZGVudGl0eSIsImlzRml4ZWQiLCJmaWVsZENvbmZpZyIsImFnZ3JlZ2F0aW9uVmFsdWUiLCJzY2FsZUZ1bmN0aW9uIiwiZ2V0Q29sb3JTY2FsZSIsImN1c3RvbU1hcmtlciIsImdldEN1c3RvbU1hcmtlcnNTY2FsZSIsImN1c3RvbU1hcmtlcnNVcmwiLCJnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIiwiX2FnZ3JlZ2F0aW9uIiwiQ29uc29sZSIsIndhcm4iLCJvcmRpbmFsIiwiZG9tYWluSXNJbmZpbml0ZSIsIkluZmluaXR5Iiwic2NhbGVGYWN0b3J5IiwicmVzdWx0IiwiZ2V0UG9zaXRpb24iLCJzYW1wbGVEYXRhIiwibnVtUm93cyIsInBvaW50cyIsIm1hcEluZGV4IiwibGF0Qm91bmRzIiwibG5nQm91bmRzIiwiZGF0YVVwZGF0ZVRyaWdnZXJzIiwidHJpZ2dlckNoYW5nZWQiLCJfb2xkRGF0YVVwZGF0ZVRyaWdnZXJzIiwiZ2V0VmFsdWUiLCJjaGFubmVsQ29uZmlnIiwiY2hhbm5lbEZpZWxkIiwiY29sb3JDb2x1bW5WYWx1ZSIsImNvbHVtbkZpZWxkIiwiY29sb3JDb2x1bW4iLCJjb2xvckNvbHVtbklkeCIsInZhbHVlQXQiLCJhdHRyaWJ1dGVWYWx1ZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJzZXR0aW5ncyIsImZpbHRlcmVkSW5kZXgiLCJhbGxEYXRhIiwiZ2V0RGF0YSIsImRhdGFzZXRJZCIsImdldE1ldGEiLCJ0bCIsImRhdGFzZXQiLCJnZXREYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsInVwZGF0ZUhleENvbG9yRG9tYWluIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsImdldENoYW5nZWRUcmlnZ2VycyIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJvbGRGaWVsZCIsImlzVXNpbmdIZXhDb2xvckNvZGUiLCJuZXdEYXRhU2V0RmllbGQiLCJmZCIsIm5ld0ZpbHRlciIsInRhYmxlIiwic2NhbGVUeXBlIiwidXBkYXRlZERvbWFpbiIsImNhbGN1bGF0ZUxheWVyRG9tYWluIiwidmFsaWRhdGVGaWVsZFR5cGUiLCJ2YWxpZGF0ZVNjYWxlIiwidmlzdWFsQ2hhbm5lbCIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyIsIkNIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyIsInNjYWxlT3B0aW9ucyIsImdldFNjYWxlT3B0aW9ucyIsIkZJRUxEX09QVFMiLCJ1cGRhdGVUcmlnZ2VycyIsImRhdGFTZXRGaWVsZCIsImYiLCJnZXRDb2x1bW5MYXllckRvbWFpbiIsImxlZ2VuZHMiLCJsZWdlbmQiLCJjYWxjdWxhdGVMZWdlbmQiLCJ1cGRhdGVMYXllckxlZ2VuZCIsIm9iamVjdEluZm8iLCJpc0xheWVySG92ZXJlZCIsInBpY2tlZCIsImxheWVyIiwibWFwU3RhdGUiLCJmaXhlZFJhZGl1cyIsInJhZGl1c0NoYW5uZWwiLCJ2YyIsInJhZGl1cyIsImdldFpvb21GYWN0b3IiLCJyYWRpdXNSYW5nZSIsImNlaWwiLCJub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoaW5nVGFyZ2V0IiwiYnJ1c2giLCJhdXRvSGlnaGxpZ2h0IiwiYnJ1c2hpbmdSYWRpdXMiLCJicnVzaGluZ0VuYWJsZWQiLCJpZHgiLCJncHVGaWx0ZXIiLCJ2aXNpYmxlIiwibWFza1BvbHlnb24iLCJtYXNrRXh0ZW5zaW9uUHJvcHMiLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJMTkdMQVQiLCJwaWNrYWJsZSIsImhhc0ludGVyYWN0aXZpdHkiLCJ3cmFwTG9uZ2l0dWRlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJlbmFibGUzZCIsIm9wYWNpdHkiLCJleHRlbnNpb25zIiwiZmlsdGVyUmFuZ2UiLCJ1bmRlZmluZWQiLCJyZW5kZXJPcHRzIiwiZ2V0UmFkaXVzIiwicmFkaXVzU2NhbGUiLCJzaGFyZWRQcm9wcyIsInRleHRMYWJlbHMiLCJnZXRUZXh0IiwibWFpbkxhYmVsIiwic2Vjb25kYXJ5TGFiZWwiLCJhbGlnbm1lbnQiLCJhbmNob3IiLCJnZXRDb2xvciIsIm1haW5GaWVsZCIsIm91dGxpbmVDb2xvciIsImdldFNlY29uZGFyeUNvbG9yIiwic2Vjb25kYXJ5RmllbGQiLCJzZWNvbmRhcnlPdXRsaW5lQ29sb3IiLCJzZWNvbmRhcnlTaXplU2NhbGUiLCJQb2ludExhYmVsTGF5ZXIiLCJjaGFyYWN0ZXJTZXQiLCJjb2xsaXNpb25FbmFibGVkIiwiY29sbGlzaW9uR3JvdXAiLCJnZXRTZWNvbmRhcnlUZXh0IiwiZ2V0VGV4dEFuY2hvciIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiZm9udEZhbWlseSIsImZvbnRTZXR0aW5ncyIsInNkZiIsImZvbnRXZWlnaHQiLCJvdXRsaW5lV2lkdGgiLCJnZXRGaWx0ZXJWYWx1ZSIsImljb25VcmxBY2Nlc3NvciIsIm1hc2siLCJtYXhJY29uU2l6ZSIsImdldE1heE1hcmtlclNpemUiLCJ3YW50ZWRVcmwiLCJpY29uT2siLCJ1cmwiLCJ3aWR0aCIsImhlaWdodCIsImtlcGxlclRhYmxlIiwiZm91bmRMYXllcnMiLCJkZWZhdWx0RmllbGRzIiwiYWxsRmllbGRzIiwicmVxdWlyZWRDb2x1bW5zIiwicHJldiIsInJlcXVpcmVkRmllbGRzIiwiZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyIsImFsbEtleXMiLCJwb2ludGVycyIsImNvdW50UGVyS2V5IiwicGFpcnMiLCJpbmNyZW1lbnRQb2ludGVycyIsIm5ld1BhaXIiLCJjdXVyIiwicHRzIiwiY291bnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFZQTs7QUFDQTs7QUFDQTs7QUFVQTs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7O3dEQWtKVUEsYTs7QUF4QlY7QUFDQTtBQUNBO0FBQ08sSUFBTUMsZUFBZSxHQUFHLENBQXhCLEMsQ0FFUDs7O0FBQ0EsSUFBTUMsYUFBYSxHQUNqQiwwTEFERjtBQUdBLElBQU1DLGVBQWUsR0FBRyxJQUF4QjtBQUNBLElBQU1DLGFBQStCLEdBQUcsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUF4QztBQUNBLElBQU1DLG1CQUFtQixHQUFHLElBQUlDLCtCQUFKLENBQXdCO0FBQUNDLEVBQUFBLFVBQVUsRUFBRUM7QUFBYixDQUF4QixDQUE1QjtBQUNBLElBQU1DLHdCQUF3QixHQUFHLElBQUlDLG9DQUFKLEVBQWpDOztBQUVBLElBQU1DLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsQ0FBQUMsRUFBRTtBQUFBLFNBQUksVUFBQUMsQ0FBQztBQUFBLFdBQUlBLENBQUo7QUFBQSxHQUFMO0FBQUEsQ0FBOUI7O0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUF1QixDQUFDQyxLQUFELEVBQVFGLENBQVI7QUFBQSxTQUFjRSxLQUFLLENBQUNDLGFBQU4sQ0FBb0JILENBQXBCLENBQWQ7QUFBQSxDQUE3Qjs7QUFDQSxJQUFNSSxhQUFhLEdBQUcsU0FB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Y2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7Q29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uLCBEYXRhRmlsdGVyRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU0sIExheWVyIGFzIERlY2tMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge19Qb2ludExhYmVsTGF5ZXIgYXMgUG9pbnRMYWJlbExheWVyfSBmcm9tICdAZGVjay5nbC9jYXJ0byc7XG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgWk9PTV9MRVZFTF9MSU1JVFNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDb2xvclJhbmdlLCBDT0xPUl9SQU5HRVMsIGhleENvbG9yfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7RGF0YVZpekNvbG9yc30gZnJvbSAnY29uc3RhbnRzL2N1c3RvbS1jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgREVGQVVMVF9DT0xPUl9VSSxcbiAgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gIERFRkFVTFRfTEFZRVJfTEFCRUwsXG4gIExheWVyVmlzQ29uZmlnLFxuICBMYXllclZpc0NvbmZpZ1NldHRpbmdzXG59IGZyb20gJy4vbGF5ZXItZmFjdG9yeSc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIGlzUGxhaW5PYmplY3R9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtnZXRMYXRMbmdCb3VuZHMsIG5vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge2dldFNhbXBsZURhdGF9IGZyb20gJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLXV0aWxzJztcblxuaW1wb3J0IHtoZXhUb1JnYiwgZ2V0Q29sb3JHcm91cEJ5TmFtZSwgcmV2ZXJzZUNvbG9yUmFuZ2UsIGNoZWNrQ29sb3JPckZhbGxiYWNrfSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge2dldE1hc2tFeHRlbnNpb25Qcm9wc30gZnJvbSAndXRpbHMvbGF5ZXItdXRpbHMnO1xuaW1wb3J0IHtzY2FsZU9yZGluYWx9IGZyb20gJ2QzLXNjYWxlJztcblxuaW1wb3J0IHtSR0JDb2xvciwgUkdCQUNvbG9yLCBNYXBTdGF0ZSwgRmlsdGVyLCBEYXRhc2V0cywgVmFsdWVPZiwgTmVzdGVkUGFydGlhbH0gZnJvbSAncmVkdWNlcnMnO1xuaW1wb3J0IHtMYXllclRleHRMYWJlbCwgQ29sb3JVSX0gZnJvbSAnLi9sYXllci1mYWN0b3J5JztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJztcbmltcG9ydCB7RmllbGQsIEdwdUZpbHRlcn0gZnJvbSAndXRpbHMvdGFibGUtdXRpbHMva2VwbGVyLXRhYmxlJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCB0eXBlIExheWVyQ29sdW1uID0ge3ZhbHVlOiBzdHJpbmcgfCBudWxsOyBmaWVsZElkeDogbnVtYmVyOyBvcHRpb25hbD86IGJvb2xlYW59O1xuXG5leHBvcnQgdHlwZSBMYXllckNvbHVtbnMgPSB7XG4gIFtrZXk6IHN0cmluZ106IExheWVyQ29sdW1uO1xufTtcbmV4cG9ydCB0eXBlIFZpc3VhbENoYW5uZWxEb21haW4gPSBudW1iZXJbXSB8IHN0cmluZ1tdO1xuZXhwb3J0IHR5cGUgVmlzdWFsQ2hhbm5lbEZpZWxkID0gRmllbGQgfCBudWxsO1xuZXhwb3J0IHR5cGUgVmlzdWFsQ2hhbm5lbFNjYWxlID0ga2V5b2YgdHlwZW9mIFNDQUxFX1RZUEVTO1xuXG5leHBvcnQgdHlwZSBMYXllckJhc2VDb25maWcgPSB7XG4gIGRhdGFJZDogc3RyaW5nIHwgbnVsbDtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3I6IFJHQkNvbG9yO1xuXG4gIGNvbHVtbnM6IExheWVyQ29sdW1ucztcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xuICBpc0NvbmZpZ0FjdGl2ZTogYm9vbGVhbjtcbiAgaGlnaGxpZ2h0Q29sb3I6IFJHQkNvbG9yIHwgUkdCQUNvbG9yO1xuICBoaWRkZW46IGJvb2xlYW47XG5cbiAgdmlzQ29uZmlnOiBMYXllclZpc0NvbmZpZztcbiAgdGV4dExhYmVsOiBMYXllclRleHRMYWJlbFtdO1xuXG4gIGNvbG9yVUk6IHtcbiAgICBjb2xvcjogQ29sb3JVSTtcbiAgICBjb2xvclJhbmdlOiBDb2xvclVJO1xuICB9O1xuICBhbmltYXRpb246IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGRvbWFpbj86IG51bGw7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBMYXllckNvbG9yQ29uZmlnID0ge1xuICBjb2xvckZpZWxkOiBWaXN1YWxDaGFubmVsRmllbGQ7XG4gIGNvbG9yRG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBjb2xvclNjYWxlOiBWaXN1YWxDaGFubmVsU2NhbGU7XG59O1xuZXhwb3J0IHR5cGUgTGF5ZXJTaXplQ29uZmlnID0ge1xuICAvLyBjb2xvciBieSBzaXplLCBkb21haW4gaXMgc2V0IGJ5IGZpbHRlcnMsIGZpZWxkLCBzY2FsZSB0eXBlXG4gIHNpemVEb21haW46IFZpc3VhbENoYW5uZWxEb21haW47XG4gIHNpemVTY2FsZTogVmlzdWFsQ2hhbm5lbFNjYWxlO1xuICBzaXplRmllbGQ6IFZpc3VhbENoYW5uZWxGaWVsZDtcbn07XG5leHBvcnQgdHlwZSBMYXllckhlaWdodENvbmZpZyA9IHtcbiAgaGVpZ2h0RmllbGQ6IFZpc3VhbENoYW5uZWxGaWVsZDtcbiAgaGVpZ2h0RG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBoZWlnaHRTY2FsZTogVmlzdWFsQ2hhbm5lbFNjYWxlO1xufTtcbmV4cG9ydCB0eXBlIExheWVyU3Ryb2tlQ29sb3JDb25maWcgPSB7XG4gIHN0cm9rZUNvbG9yRmllbGQ6IFZpc3VhbENoYW5uZWxGaWVsZDtcbiAgc3Ryb2tlQ29sb3JEb21haW46IFZpc3VhbENoYW5uZWxEb21haW47XG4gIHN0cm9rZUNvbG9yU2NhbGU6IFZpc3VhbENoYW5uZWxTY2FsZTtcbn07XG5leHBvcnQgdHlwZSBMYXllckNvdmVyYWdlQ29uZmlnID0ge1xuICBjb3ZlcmFnZUZpZWxkOiBWaXN1YWxDaGFubmVsRmllbGQ7XG4gIGNvdmVyYWdlRG9tYWluOiBWaXN1YWxDaGFubmVsRG9tYWluO1xuICBjb3ZlcmFnZVNjYWxlOiBWaXN1YWxDaGFubmVsU2NhbGU7XG59O1xuZXhwb3J0IHR5cGUgTGF5ZXJSYWRpdXNDb25maWcgPSB7XG4gIHJhZGl1c0ZpZWxkOiBWaXN1YWxDaGFubmVsRmllbGQ7XG4gIHJhZGl1c0RvbWFpbjogVmlzdWFsQ2hhbm5lbERvbWFpbjtcbiAgcmFkaXVzU2NhbGU6IFZpc3VhbENoYW5uZWxTY2FsZTtcbn07XG5leHBvcnQgdHlwZSBMYXllcldlaWdodENvbmZpZyA9IHtcbiAgd2VpZ2h0RmllbGQ6IFZpc3VhbENoYW5uZWxGaWVsZDtcbn07XG5cbmV4cG9ydCB0eXBlIFZpc3VhbENoYW5uZWxzID0ge1trZXk6IHN0cmluZ106IFZpc3VhbENoYW5uZWx9O1xuXG5leHBvcnQgdHlwZSBWaXN1YWxDaGFubmVsQWdncmVnYXRpb24gPSAnY29sb3JBZ2dyZWdhdGlvbicgfCAnc2l6ZUFnZ3JlZ2F0aW9uJztcblxuZXhwb3J0IHR5cGUgVmlzdWFsQ2hhbm5lbCA9IHtcbiAgcHJvcGVydHk6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgc2NhbGU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHJhbmdlOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBjaGFubmVsU2NhbGVUeXBlOiBzdHJpbmc7XG4gIG51bGxWYWx1ZT86IGFueTtcbiAgZGVmYXVsdE1lYXN1cmU/OiBhbnk7XG4gIGFjY2Vzc29yPzogc3RyaW5nO1xuICBjb25kaXRpb24/OiAoY29uZmlnOiBhbnkpID0+IGJvb2xlYW47XG4gIGdldEF0dHJpYnV0ZVZhbHVlPzogKGNvbmZpZzogYW55KSA9PiAoZDogYW55KSA9PiBhbnk7XG5cbiAgLy8gVE9ETzogZGVmaW5lIGRlZmF1bHRWYWx1ZVxuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG4gIC8vIFRPRE86IGRlZmluZSBmaXhlZFxuICBmaXhlZD86IGFueTtcblxuICBzdXBwb3J0ZWRGaWVsZFR5cGVzPzogQXJyYXk8a2V5b2YgdHlwZW9mIEFMTF9GSUVMRF9UWVBFUz47XG5cbiAgYWdncmVnYXRpb24/OiBWaXN1YWxDaGFubmVsQWdncmVnYXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG1lYXN1cmU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtblBhaXJzID0ge1trZXk6IHN0cmluZ106IHtwYWlyOiBzdHJpbmc7IGZpZWxkUGFpcktleTogc3RyaW5nfX07XG5cbnR5cGUgQ29sdW1uVmFsaWRhdG9yID0gKGNvbHVtbjogTGF5ZXJDb2x1bW4sIGNvbHVtbnM6IExheWVyQ29sdW1ucywgYWxsRmllbGRzOiBGaWVsZFtdKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUcmlnZ2VycyA9IHtcbiAgW2tleTogc3RyaW5nXTogVXBkYXRlVHJpZ2dlcjtcbn07XG5leHBvcnQgdHlwZSBVcGRhdGVUcmlnZ2VyID0ge1xuICBba2V5OiBzdHJpbmddOiB7fTtcbn07XG5leHBvcnQgdHlwZSBMYXllckJvdW5kcyA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuZXhwb3J0IHR5cGUgRmluZERlZmF1bHRMYXllclByb3BzUmV0dXJuVmFsdWUgPSB7cHJvcHM6IGFueVtdOyBmb3VuZExheWVycz86IGFueVtdfTtcbi8qKlxuICogQXBwcm94LiBudW1iZXIgb2YgcG9pbnRzIHRvIHNhbXBsZSBpbiBhIGxhcmdlIGRhdGEgc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBMQVlFUl9JRF9MRU5HVEggPSA2O1xuXG4vLyBOb3RlLCB0aGlzIGlzIGlzIFNWRyBvZiBzb2xpZCBjaXJjbGUgZW5jb2RlZCBhcyBkYXRhLXVyaVxuY29uc3QgRkFMTEJBQ0tfSUNPTiA9XG4gICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtODtiYXNlNjQsUEhOMlp5QjJhV1YzUW05NFBTSXdJREFnTVRBd0lERXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajROQ2lBZ1BHTnBjbU5zWlNCamVEMGlOVEFpSUdONVBTSTFNQ0lnY2owaU5UQWlMejROQ2p3dmMzWm5QZz09JztcblxuY29uc3QgTUFYX1NBTVBMRV9TSVpFID0gNTAwMDtcbmNvbnN0IGRlZmF1bHREb21haW46IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMV07XG5jb25zdCBkYXRhRmlsdGVyRXh0ZW5zaW9uID0gbmV3IERhdGFGaWx0ZXJFeHRlbnNpb24oe2ZpbHRlclNpemU6IE1BWF9HUFVfRklMVEVSU30pO1xuY29uc3QgY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uID0gbmV3IENvbGxpc2lvbkZpbHRlckV4dGVuc2lvbigpO1xuXG5jb25zdCBkZWZhdWx0RGF0YUFjY2Vzc29yID0gZGMgPT4gZCA9PiBkO1xuY29uc3QgZGVmYXVsdEdldEZpZWxkVmFsdWUgPSAoZmllbGQsIGQpID0+IGZpZWxkLnZhbHVlQWNjZXNzb3IoZCk7XG5jb25zdCBzY2FsZUlkZW50aXR5ID0gdiA9PiB2O1xuXG5leHBvcnQgY29uc3QgT1ZFUkxBWV9UWVBFID0ga2V5bWlycm9yKHtcbiAgZGVja2dsOiBudWxsLFxuICBtYXBib3hnbDogbnVsbFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXllckNvbG9ycyA9IE9iamVjdC52YWx1ZXMoRGF0YVZpekNvbG9ycykubWFwKGhleFRvUmdiKTtcbmZ1bmN0aW9uKiBnZW5lcmF0ZUNvbG9yKCk6IEdlbmVyYXRvcjxSR0JDb2xvcj4ge1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBsYXllckNvbG9ycy5sZW5ndGggKyAxKSB7XG4gICAgaWYgKGluZGV4ID09PSBsYXllckNvbG9ycy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG4gICAgeWllbGQgbGF5ZXJDb2xvcnNbaW5kZXgrK107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbG9yTWFrZXIgPSBnZW5lcmF0ZUNvbG9yKCk7XG5cbmNsYXNzIExheWVyIHtcbiAgaWQ6IHN0cmluZztcbiAgLy8gVE9ETzogZGVmaW5lIG1ldGFcbiAgbWV0YToge307XG4gIHZpc0NvbmZpZ1NldHRpbmdzOiB7XG4gICAgW2tleTogc3RyaW5nXTogVmFsdWVPZjxMYXllclZpc0NvbmZpZ1NldHRpbmdzPjtcbiAgfTtcbiAgY29uZmlnOiBMYXllckJhc2VDb25maWc7XG4gIC8vIFRPRE86IGRlZmluZSBfb2xkRGF0YVVwZGF0ZVRyaWdnZXJzXG4gIF9vbGREYXRhVXBkYXRlVHJpZ2dlcnM6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm9wczoge1xuICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgfSAmIFBhcnRpYWw8TGF5ZXJCYXNlQ29uZmlnPiA9IHt9XG4gICkge1xuICAgIHRoaXMuaWQgPSBwcm9wcy5pZCB8fCBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuICAgIC8vIG1ldGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIC8vIGxlZ2VuZFNldHRpbmdzXG4gICAgdGhpcy5sZWdlbmRTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gdmlzQ29uZmlnU2V0dGluZ3NcbiAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzID0ge307XG5cbiAgICAvLyBpbnRlcmFjdGl2aXR5U2V0dGluZ3NcbiAgICB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoe1xuICAgICAgY29sdW1uczogdGhpcy5nZXRMYXllckNvbHVtbnMoKSxcbiAgICAgIC4uLnByb3BzXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCk6IFJlYWN0LkVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRGVmYXVsdExheWVySWNvbjtcbiAgfVxuXG4gIGdldCBvdmVybGF5VHlwZSgpOiBrZXlvZiB0eXBlb2YgT1ZFUkxBWV9UWVBFIHtcbiAgICByZXR1cm4gT1ZFUkxBWV9UWVBFLmRlY2tnbDtcbiAgfVxuXG4gIGdldCB0eXBlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgb3B0aW9uYWxDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbJ2xhYmVsJywgJ29wYWNpdHknLCAndGhpY2tuZXNzJywgJ2lzVmlzaWJsZScsICdoaWRkZW4nXTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpOiBWaXN1YWxDaGFubmVscyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY29sb3InLFxuICAgICAgICBmaWVsZDogJ2NvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3IsXG4gICAgICAgIG51bGxWYWx1ZTogTk9fVkFMVUVfQ09MT1IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy5jb2xvclxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzaXplJyxcbiAgICAgICAgZmllbGQ6ICdzaXplRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3NpemVTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3NpemVEb21haW4nLFxuICAgICAgICByYW5nZTogJ3NpemVSYW5nZScsXG4gICAgICAgIGtleTogJ3NpemUnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5zaXplLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBnZXQgY29sdW1uVmFsaWRhdG9ycygpOiB7W2tleTogc3RyaW5nXTogQ29sdW1uVmFsaWRhdG9yfSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIC8qXG4gICAqIENvbHVtbiBwYWlycyBtYXBzIGxheWVyIGNvbHVtbiB0byBhIHNwZWNpZmljIGZpZWxkIHBhaXJzLFxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbnVsbFxuICAgKi9cbiAgZ2V0IGNvbHVtblBhaXJzKCk6IENvbHVtblBhaXJzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKlxuICAgKiBEZWZhdWx0IHBvaW50IGNvbHVtbiBwYWlycywgY2FuIGJlIHVzZWQgZm9yIHBvaW50IGJhc2VkIGxheWVyczogcG9pbnQsIGljb24gZXRjLlxuICAgKi9cbiAgZ2V0IGRlZmF1bHRQb2ludENvbHVtblBhaXJzKCk6IENvbHVtblBhaXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiB7cGFpcjogJ2xuZycsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nOiB7cGFpcjogJ2xhdCcsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgbGluayBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBsaW5rIGJhc2VkIGxheWVyczogYXJjLCBsaW5lIGV0Y1xuICAgKi9cbiAgZ2V0IGRlZmF1bHRMaW5rQ29sdW1uUGFpcnMoKTogQ29sdW1uUGFpcnMge1xuICAgIHJldHVybiB7XG4gICAgICBsYXQwOiB7cGFpcjogJ2xuZzAnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzA6IHtwYWlyOiAnbGF0MCcsIGZpZWxkUGFpcktleTogJ2xuZyd9LFxuICAgICAgbGF0MToge3BhaXI6ICdsbmcxJywgZmllbGRQYWlyS2V5OiAnbGF0J30sXG4gICAgICBsbmcxOiB7cGFpcjogJ2xhdDEnLCBmaWVsZFBhaXJLZXk6ICdsbmcnfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgUmVhY3QgY29tcG9uZW50IGZvciB0byByZW5kZXIgbGF5ZXIgaW5zdHJ1Y3Rpb25zIGluIGEgbW9kYWxcbiAgICogQHJldHVybnMge29iamVjdH0gLSBhbiBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogIHJldHVybiB7XG4gICAqICAgIGlkOiAnaWNvbkluZm8nLFxuICAgKiAgICB0ZW1wbGF0ZTogSWNvbkluZm9Nb2RhbCxcbiAgICogICAgbW9kYWxQcm9wczoge1xuICAgKiAgICAgIHRpdGxlOiAnSG93IHRvIGRyYXcgaWNvbnMnXG4gICAqICAgfTtcbiAgICogfVxuICAgKi9cbiAgZ2V0IGxheWVySW5mb01vZGFsKCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBzZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKGludGVyYWN0aXZpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IGludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBoYXNUb29sdGlwKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmhvdmVyPy5maWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5jbGljaz8uZmllbGRzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzSW50ZXJhY3Rpdml0eSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhhc1Rvb2x0aXAgJiYgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmVuYWJsZWQpO1xuICB9XG5cbiAgLypcbiAgICogR2l2ZW4gYSBkYXRhc2V0LCBhdXRvbWF0aWNhbGx5IGZpbmQgcHJvcHMgdG8gY3JlYXRlIGxheWVyIGJhc2VkIG9uIGl0XG4gICAqIGFuZCByZXR1cm4gdGhlIHByb3BzIGFuZCBwcmV2aW91cyBmb3VuZCBsYXllcnMuXG4gICAqIEJ5IGRlZmF1bHQsIG5vIGxheWVycyB3aWxsIGJlIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKFxuICAgIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICAgIGZvdW5kTGF5ZXJzPzogYW55W11cbiAgKTogRmluZERlZmF1bHRMYXllclByb3BzUmV0dXJuVmFsdWUge1xuICAgIHJldHVybiB7cHJvcHM6IFtdLCBmb3VuZExheWVyc307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBhcnJheSBvZiBwcmVzZXQgcmVxdWlyZWQgY29sdW1uIG5hbWVzXG4gICAqIGZvdW5kIGZpZWxkIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdG8gc2V0IGFzIGxheWVyIGNvbHVtblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdEZpZWxkc1xuICAgKiBAcGFyYW0ge29iamVjdFtdfSBhbGxGaWVsZHNcbiAgICogQHJldHVybnMge29iamVjdFtdIHwgbnVsbH0gYWxsIHBvc3NpYmxlIHJlcXVpcmVkIGxheWVyIGNvbHVtbiBwYWlyc1xuICAgKi9cbiAgc3RhdGljIGZpbmREZWZhdWx0Q29sdW1uRmllbGQoZGVmYXVsdEZpZWxkcywgYWxsRmllbGRzKSB7XG4gICAgLy8gZmluZCBhbGwgbWF0Y2hlZCBmaWVsZHMgZm9yIGVhY2ggcmVxdWlyZWQgY29sXG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZGVmYXVsdEZpZWxkcykucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gYWxsRmllbGRzLmZpbHRlcihcbiAgICAgICAgZiA9PiBmLm5hbWUgPT09IGRlZmF1bHRGaWVsZHNba2V5XSB8fCBkZWZhdWx0RmllbGRzW2tleV0uaW5jbHVkZXMoZi5uYW1lKVxuICAgICAgKTtcblxuICAgICAgcHJldltrZXldID0gcmVxdWlyZWRGaWVsZHMubGVuZ3RoXG4gICAgICAgID8gcmVxdWlyZWRGaWVsZHMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHZhbHVlOiBmLm5hbWUsXG4gICAgICAgICAgICBmaWVsZElkeDogZi5maWVsZElkeFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMocmVxdWlyZWRDb2x1bW5zKS5ldmVyeShCb29sZWFuKSkge1xuICAgICAgLy8gaWYgYW55IGZpZWxkIG1pc3NpbmcsIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsUG9zc2libGVDb2x1bW5QYXJpcyhyZXF1aXJlZENvbHVtbnMpIHtcbiAgICAvLyBmb3IgbXVsdGlwbGUgbWF0Y2hlZCBmaWVsZCBmb3Igb25lIHJlcXVpcmVkIGNvbHVtbiwgcmV0dXJuIG11bHRpcGxlXG4gICAgLy8gY29tYmluYXRpb25zLCBlLiBnLiBpZiBjb2x1bW4gYSBoYXMgMiBtYXRjaGVkLCBjb2x1bW4gYiBoYXMgMyBtYXRjaGVkXG4gICAgLy8gNiBwb3NzaWJsZSBjb2x1bW4gcGFpcnMgd2lsbCBiZSByZXR1cm5lZFxuICAgIGNvbnN0IGFsbEtleXMgPSBPYmplY3Qua2V5cyhyZXF1aXJlZENvbHVtbnMpO1xuICAgIGNvbnN0IHBvaW50ZXJzID0gYWxsS2V5cy5tYXAoKGssIGkpID0+IChpID09PSBhbGxLZXlzLmxlbmd0aCAtIDEgPyAtMSA6IDApKTtcbiAgICBjb25zdCBjb3VudFBlcktleSA9IGFsbEtleXMubWFwKGsgPT4gcmVxdWlyZWRDb2x1bW5zW2tdLmxlbmd0aCk7XG4gICAgLy8gVE9ETzogQmV0dGVyIHR5cGluZ3NcbiAgICBjb25zdCBwYWlyczogYW55W10gPSBbXTtcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuICAgIHdoaWxlIChpbmNyZW1lbnRQb2ludGVycyhwb2ludGVycywgY291bnRQZXJLZXksIHBvaW50ZXJzLmxlbmd0aCAtIDEpKSB7XG4gICAgICBjb25zdCBuZXdQYWlyID0gcG9pbnRlcnMucmVkdWNlKChwcmV2LCBjdXVyLCBpKSA9PiB7XG4gICAgICAgIHByZXZbYWxsS2V5c1tpXV0gPSByZXF1aXJlZENvbHVtbnNbYWxsS2V5c1tpXV1bY3V1cl07XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwge30pO1xuXG4gICAgICBwYWlycy5wdXNoKG5ld1BhaXIpO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG4gICAgLy8gcmVjdXJzaXZlbHkgaW5jcmVtZW50IHBvaW50ZXJzXG4gICAgZnVuY3Rpb24gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IDAgJiYgcHRzWzBdID09PSBjb3VudHNbMF0gLSAxKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gaW5jcmVtZW50XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHB0c1tpbmRleF0gKyAxIDwgY291bnRzW2luZGV4XSkge1xuICAgICAgICBwdHNbaW5kZXhdID0gcHRzW2luZGV4XSArIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwdHNbaW5kZXhdID0gMDtcbiAgICAgIHJldHVybiBpbmNyZW1lbnRQb2ludGVycyhwdHMsIGNvdW50cywgaW5kZXggLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFpcnM7XG4gIH1cblxuICBzdGF0aWMgaGV4VG9SZ2IoYykge1xuICAgIHJldHVybiBoZXhUb1JnYihjKTtcbiAgfVxuXG4gIGdldERlZmF1bHRMYXllckNvbmZpZyhcbiAgICBwcm9wczogUGFydGlhbDxMYXllckJhc2VDb25maWc+ID0ge31cbiAgKTogTGF5ZXJCYXNlQ29uZmlnICYgUGFydGlhbDxMYXllckNvbG9yQ29uZmlnICYgTGF5ZXJTaXplQ29uZmlnPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFJZDogcHJvcHMuZGF0YUlkIHx8IG51bGwsXG4gICAgICB2aXNpYmlsaXR5Qnlab29tOiB7XG4gICAgICAgIG1pbjogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWluIHx8IFpPT01fTEVWRUxfTElNSVRTLm1pbixcbiAgICAgICAgbWF4OiBwcm9wcy52aXNpYmlsaXR5Qnlab29tPy5tYXggfHwgWk9PTV9MRVZFTF9MSU1JVFMubWF4XG4gICAgICB9LFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsIHx8IERFRkFVTFRfTEFZRVJfTEFCRUwsXG4gICAgICBjb2xvcjogcHJvcHMuY29sb3IgfHwgY29sb3JNYWtlci5uZXh0KCkudmFsdWUsXG4gICAgICBjb2x1bW5zOiBwcm9wcy5jb2x1bW5zIHx8IHt9LFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG5cbiAgICAgIHZpc0NvbmZpZzoge30sXG5cbiAgICAgIHRleHRMYWJlbDogW0RFRkFVTFRfVEVYVF9MQUJFTF0sXG5cbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgY29sb3I6IERFRkFVTFRfQ09MT1JfVUksXG4gICAgICAgIGNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH0sXG4gICAgICBhbmltYXRpb246IHtlbmFibGVkOiBmYWxzZX1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgYSB2aXN1YWxDaGFubmVsIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oa2V5OiBzdHJpbmcpOiBWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24ge1xuICAgIC8vIGUuZy4gbGFiZWw6IENvbG9yLCBtZWFzdXJlOiBWZWhpY2xlIFR5cGVcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1trZXldO1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuIHtsYWJlbDogJycsIG1lYXN1cmU6ICcnfTtcbiAgICBjb25zdCByYW5nZVNldHRpbmdzID0gdGhpcy52aXNDb25maWdTZXR0aW5nc1tjaGFubmVsLnJhbmdlXTtcbiAgICBjb25zdCBmaWVsZFNldHRpbmdzID0gdGhpcy5jb25maWdbY2hhbm5lbC5maWVsZF07XG4gICAgY29uc3QgbGFiZWwgPSByYW5nZVNldHRpbmdzPy5sYWJlbDtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IHR5cGVvZiBsYWJlbCA9PT0gJ2Z1bmN0aW9uJyA/IGxhYmVsKHRoaXMuY29uZmlnKSA6IGxhYmVsLFxuICAgICAgbWVhc3VyZTogZmllbGRTZXR0aW5nc1xuICAgICAgICA/IGZpZWxkU2V0dGluZ3MuZGlzcGxheU5hbWUgfHwgZmllbGRTZXR0aW5ncy5uYW1lXG4gICAgICAgIDogY2hhbm5lbC5kZWZhdWx0TWVhc3VyZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgdG8gbGF5ZXIgY29sdW1uLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gZmllbGQgLSBTZWxlY3RlZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7e319IC0gQ29sdW1uIGNvbmZpZ1xuICAgKi9cbiAgYXNzaWduQ29sdW1uKGtleTogc3RyaW5nLCBmaWVsZDogRmllbGQpOiBMYXllckNvbHVtbnMge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLmZpZWxkSWR4XG4gICAgICAgIH1cbiAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XToge1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zW2tleV0sXG4gICAgICAgIC4uLnVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgcGFpciB0byBjb2x1bW4gY29uZmlnLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gcGFpciAtIGZpZWxkIFBhaXJcbiAgICogQHJldHVybnMge29iamVjdH0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW5QYWlycyhrZXksIHBhaXIpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uUGFpcnMgfHwgIXRoaXMuY29sdW1uUGFpcnM/LltrZXldKSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVuZCBpbiB0aGlzIHN0YXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgICB9XG5cbiAgICBjb25zdCB7cGFpcjogcGFydG5lcktleSwgZmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltrZXldO1xuICAgIGNvbnN0IHtmaWVsZFBhaXJLZXk6IHBhcnRuZXJGaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW3BhcnRuZXJLZXldO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XTogcGFpcltmaWVsZFBhaXJLZXldLFxuICAgICAgW3BhcnRuZXJLZXldOiBwYWlyW3BhcnRuZXJGaWVsZFBhaXJLZXldXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSByYWRpdXMgem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Wm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgubWF4KDE0IC0gem9vbSArIHpvb21PZmZzZXQsIDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSBlbGV2YXRpb24gem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0RWxldmF0aW9uWm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9OiB7em9vbTogbnVtYmVyOyB6b29tT2Zmc2V0PzogbnVtYmVyfSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcuZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvclxuICAgICAgPyBNYXRoLnBvdygyLCBNYXRoLm1heCg4IC0gem9vbSArIHpvb21PZmZzZXQsIDApKVxuICAgICAgOiAxO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKGRhdGFzZXRzOiBEYXRhc2V0cywgb2xkTGF5ZXJEYXRhPzogYW55KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoLi4uYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0SG92ZXJEYXRhKG9iamVjdCwgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSwgZmllbGRzOiBGaWVsZFtdKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZW50cnkgb2YgbGF5ZXJEYXRhIHNob3VsZCBoYXZlIGFuIGluZGV4IG9mIGEgcm93IGluIHRoZSBvcmlnaW5hbCBkYXRhIGNvbnRhaW5lci5cbiAgICAvLyBFYWNoIGxheWVyIGNhbiBpbXBsZW1lbnQgaXRzIG93biBnZXRIb3ZlckRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIGRhdGFDb250YWluZXIucm93KG9iamVjdC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjaGFuZ2UgbGF5ZXIgdHlwZSwgdHJ5IHRvIGNvcHkgb3ZlciBsYXllciBjb25maWdzIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgICogQHBhcmFtIGNvbmZpZ1RvQ29weSAtIGNvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHZpc0NvbmZpZ1NldHRpbmdzIC0gdmlzQ29uZmlnIHNldHRpbmdzIG9mIGNvbmZpZyB0byBjb3B5XG4gICAqL1xuICBhc3NpZ25Db25maWdUb0xheWVyKGNvbmZpZ1RvQ29weSwgdmlzQ29uZmlnU2V0dGluZ3MpIHtcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIHZpc3VhbENoYW5uZWwgZmllbGRcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIGNvbG9yIHJhbmdlLCByZXZlcnNlZDogaXMgbm90IGEga2V5IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBzaGFsbG93Q29weSA9IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ10uY29uY2F0KFxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmZpZWxkKVxuICAgICk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgZG9tYWluIGFuZCBhbmltYXRpb25cbiAgICBjb25zdCBub3RUb0NvcHkgPSBbJ2FuaW1hdGlvbiddLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZG9tYWluKSk7XG4gICAgLy8gaWYgcmFuZ2UgaXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGdyb3VwIGNvcHkgaXQsIG90aGVyd2lzZSwgbm90IHRvIGNvcHlcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godiA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZ1RvQ29weS52aXNDb25maWdbdi5yYW5nZV0gJiZcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXSAmJlxuICAgICAgICB2aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cCAhPT0gdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cFxuICAgICAgKSB7XG4gICAgICAgIG5vdFRvQ29weS5wdXNoKHYucmFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIHZpc3VhbENoYW5uZWwgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY29waWVkID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7XG4gICAgICBzaGFsbG93Q29weSxcbiAgICAgIG5vdFRvQ29weVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhcbiAgICBjdXJyZW50Q29uZmlnLFxuICAgIGNvbmZpZ1RvQ29weSxcbiAgICB7c2hhbGxvd0NvcHkgPSBbXSwgbm90VG9Db3B5ID0gW119OiB7c2hhbGxvd0NvcHk/OiBzdHJpbmdbXTsgbm90VG9Db3B5Pzogc3RyaW5nW119ID0ge31cbiAgKSB7XG4gICAgY29uc3QgY29waWVkID0ge307XG4gICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1BsYWluT2JqZWN0KGN1cnJlbnRDb25maWdba2V5XSkgJiZcbiAgICAgICAgaXNQbGFpbk9iamVjdChjb25maWdUb0NvcHlba2V5XSkgJiZcbiAgICAgICAgIXNoYWxsb3dDb3B5LmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgYXNzaWduIG9iamVjdCB2YWx1ZVxuICAgICAgICBjb3BpZWRba2V5XSA9IHRoaXMuY29weUxheWVyQ29uZmlnKGN1cnJlbnRDb25maWdba2V5XSwgY29uZmlnVG9Db3B5W2tleV0sIHtcbiAgICAgICAgICBzaGFsbG93Q29weSxcbiAgICAgICAgICBub3RUb0NvcHlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG5vdE51bGxvclVuZGVmaW5lZChjb25maWdUb0NvcHlba2V5XSkgJiYgIW5vdFRvQ29weS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIC8vIGNvcHlcbiAgICAgICAgY29waWVkW2tleV0gPSBjb25maWdUb0NvcHlba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGtlZXAgZXhpc3RpbmdcbiAgICAgICAgY29waWVkW2tleV0gPSBjdXJyZW50Q29uZmlnW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29waWVkO1xuICB9XG5cbiAgcmVnaXN0ZXJWaXNDb25maWcobGF5ZXJWaXNDb25maWdzOiB7XG4gICAgW2tleTogc3RyaW5nXToga2V5b2YgTGF5ZXJWaXNDb25maWdTZXR0aW5ncyB8IFZhbHVlT2Y8TGF5ZXJWaXNDb25maWdTZXR0aW5ncz47XG4gIH0pIHtcbiAgICBPYmplY3Qua2V5cyhsYXllclZpc0NvbmZpZ3MpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBjb25maWdJdGVtID0gbGF5ZXJWaXNDb25maWdzW2l0ZW1dO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWdJdGVtID09PSAnc3RyaW5nJyAmJiBMQVlFUl9WSVNfQ09ORklHU1tjb25maWdJdGVtXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2NvbmZpZ0l0ZW1dLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2NvbmZpZ0l0ZW1dO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIGNvbmZpZ0l0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgIFsndHlwZScsICdkZWZhdWx0VmFsdWUnXS5ldmVyeShwID0+IGNvbmZpZ0l0ZW0uaGFzT3duUHJvcGVydHkocCkpXG4gICAgICApIHtcbiAgICAgICAgLy8gaWYgcHJvdmlkZWQgY3VzdG9taXplZCB2aXNDb25maWcsIGFuZCBoYXMgdHlwZSAmJiBkZWZhdWx0VmFsdWVcbiAgICAgICAgLy8gVE9ETzogZnVydGhlciBjaGVjayBpZiBjdXN0b21pemVkIHZpc0NvbmZpZyBpcyB2YWxpZFxuICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbaXRlbV0gPSBjb25maWdJdGVtLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1tpdGVtXSA9IGNvbmZpZ0l0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycztcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnPExheWVyQ29uZmlnIGV4dGVuZHMgTGF5ZXJCYXNlQ29uZmlnID0gTGF5ZXJCYXNlQ29uZmlnPihcbiAgICBuZXdDb25maWc6IFBhcnRpYWw8TGF5ZXJDb25maWc+XG4gICk6IExheWVyIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsuLi50aGlzLmNvbmZpZywgLi4ubmV3Q29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyVmlzQ29uZmlnKG5ld1Zpc0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZyA9IHsuLi50aGlzLmNvbmZpZy52aXNDb25maWcsIC4uLm5ld1Zpc0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVMYXllckNvbG9yVUkocHJvcDogc3RyaW5nLCBuZXdDb25maWc6IE5lc3RlZFBhcnRpYWw8Q29sb3JVST4pOiBMYXllciB7XG4gICAgY29uc3Qge2NvbG9yVUk6IHByZXZpb3VzLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobmV3Q29uZmlnKSB8fCB0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yVUlQcm9wID0gT2JqZWN0LmVudHJpZXMobmV3Q29uZmlnKS5yZWR1Y2UoKGFjY3UsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGlzUGxhaW5PYmplY3QoYWNjdVtrZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHsuLi5hY2N1W2tleV0sIC4uLnZhbHVlfSA6IHZhbHVlXG4gICAgICB9O1xuICAgIH0sIHByZXZpb3VzW3Byb3BdIHx8IERFRkFVTFRfQ09MT1JfVUkpO1xuXG4gICAgY29uc3QgY29sb3JVSSA9IHtcbiAgICAgIC4uLnByZXZpb3VzLFxuICAgICAgW3Byb3BdOiBjb2xvclVJUHJvcFxuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtjb2xvclVJfSk7XG4gICAgLy8gaWYgY29sb3JVSVtwcm9wXSBpcyBjb2xvclJhbmdlLiBJZiB0eXBlIGlzIGhleENvbG9yIHRoZW4gaXQncyBhbHNvIGEgcmFuZ2VcbiAgICBjb25zdCBpc0NvbG9yUmFuZ2UgPVxuICAgICAgdmlzQ29uZmlnW3Byb3BdICYmICh2aXNDb25maWdbcHJvcF0uY29sb3JzIHx8IHZpc0NvbmZpZ1twcm9wXS50eXBlID09PSBoZXhDb2xvcik7XG5cbiAgICBpZiAoaXNDb2xvclJhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UobmV3Q29uZmlnLCBwcm9wKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKTtcbiAgICAgIHRoaXMudXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUN1c3RvbVBhbGV0dGUobmV3Q29uZmlnLCBwcmV2aW91cywgcHJvcCkge1xuICAgIGlmICghbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcgfHwgIW5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmN1c3RvbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIXZpc0NvbmZpZ1twcm9wXSkgcmV0dXJuO1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdmlzQ29uZmlnW3Byb3BdO1xuICAgIGNvbnN0IGN1c3RvbVBhbGV0dGUgPSB7XG4gICAgICAuLi5jb2xvclVJW3Byb3BdLmN1c3RvbVBhbGV0dGUsXG4gICAgICBuYW1lOiAnQ3VzdG9tIFBhbGV0dGUnLFxuICAgICAgY29sb3JzOiBbLi4uY29sb3JzXVxuICAgIH07XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY3VzdG9tUGFsZXR0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIGlmIG9wZW4gZHJvcGRvd24gYW5kIHByb3AgaXMgY29sb3IgcmFuZ2VcbiAgICogQXV0b21hdGljYWxseSBzZXQgY29sb3JSYW5nZUNvbmZpZydzIHN0ZXAsIHJldmVyc2VkIGFuZCB0eXBlXG4gICAqIEBwYXJhbSB7Kn0gbmV3Q29uZmlnXG4gICAqIEBwYXJhbSB7Kn0gcHJvcFxuICAgKi9cbiAgdXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApIHtcbiAgICBpZiAodHlwZW9mIG5ld0NvbmZpZy5zaG93RHJvcGRvd24gIT09ICdudW1iZXInKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgY29sb3JVSToge1xuICAgICAgICAuLi5jb2xvclVJLFxuICAgICAgICBbcHJvcF06IHtcbiAgICAgICAgICAuLi5jb2xvclVJW3Byb3BdLFxuICAgICAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY29sb3JSYW5nZUNvbmZpZyxcbiAgICAgICAgICAgIHR5cGU6IHZpc0NvbmZpZ1twcm9wXS50eXBlLFxuICAgICAgICAgICAgc3RlcHM6IHZpc0NvbmZpZ1twcm9wXS5jb2xvcnM/Lmxlbmd0aCxcbiAgICAgICAgICAgIHJldmVyc2VkOiBCb29sZWFuKHZpc0NvbmZpZ1twcm9wXS5yZXZlcnNlZCksXG4gICAgICAgICAgICBoZXhDb2x1bW46IHRoaXMuZ2V0SGV4Q29sdW1uKHByb3ApLFxuICAgICAgICAgICAgaXNIZXhDb2x1bW46IHRoaXMuaXNDb2xvcmVkQnlDb2xvckNvbHVtbihwcm9wKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgdXBkYXRlQ29sb3JSYW5nZUJ5Q29sb3JVSShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgLy8gb25seSB1cGRhdGUgY29sb3JSYW5nZSBpZiBjaGFuZ2VzIGluIFVJIGlzIG1hZGUgdG8gJ3JldmVyc2VkJywgJ3N0ZXBzJyBvciBzdGVwc1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9XG4gICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyAmJlxuICAgICAgWydyZXZlcnNlZCcsICdzdGVwcyddLnNvbWUoXG4gICAgICAgIGtleSA9PlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KGtleSkgJiZcbiAgICAgICAgICBuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZ1trZXldICE9PVxuICAgICAgICAgICAgKHByZXZpb3VzW3Byb3BdIHx8IERFRkFVTFRfQ09MT1JfVUkpLmNvbG9yUmFuZ2VDb25maWdba2V5XVxuICAgICAgKTtcbiAgICBpZiAoIXNob3VsZFVwZGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7c3RlcHMsIHJldmVyc2VkfSA9IGNvbG9yVUlbcHJvcF0uY29sb3JSYW5nZUNvbmZpZztcbiAgICBjb25zdCBjb2xvclJhbmdlID0gdmlzQ29uZmlnW3Byb3BdO1xuICAgIC8vIGZpbmQgYmFzZWQgb24gc3RlcCBvciByZXZlcnNlZFxuICAgIGxldCB1cGRhdGU7XG4gICAgaWYgKG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnLmhhc093blByb3BlcnR5KCdzdGVwcycpKSB7XG4gICAgICBjb25zdCBncm91cCA9IGdldENvbG9yR3JvdXBCeU5hbWUoY29sb3JSYW5nZSk7XG5cbiAgICAgIGlmIChncm91cCkge1xuICAgICAgICBjb25zdCBzYW1lR3JvdXAgPSBDT0xPUl9SQU5HRVMuZmlsdGVyKGNyID0+IGdldENvbG9yR3JvdXBCeU5hbWUoY3IpID09PSBncm91cCk7XG5cbiAgICAgICAgdXBkYXRlID0gc2FtZUdyb3VwLmZpbmQoY3IgPT4gY3IuY29sb3JzLmxlbmd0aCA9PT0gc3RlcHMpO1xuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5yZXZlcnNlZCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHRydWUsIHVwZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlICYmIGNvbG9yUmFuZ2UuY29sb3JNYXApIHtcbiAgICAgICAgICB1cGRhdGUgPSB0aGlzLnVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yUmFuZ2UuY29sb3JNYXAsIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3JldmVyc2VkJykpIHtcbiAgICAgIHVwZGF0ZSA9IHJldmVyc2VDb2xvclJhbmdlKHJldmVyc2VkLCB1cGRhdGUgfHwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc0NvbmZpZyh7W3Byb3BdOiB1cGRhdGV9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb2xvck1hcChwcm9wLCBjb2xvck1hcCwgY29sb3JSYW5nZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7ZmllbGQsIGRvbWFpbn0gPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmFsdWUgPT4gdmFsdWUucmFuZ2UgPT09IHByb3ApO1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmNvbmZpZ1tmaWVsZF0/LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2F0ZWdvcnlDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdHlwZSBvciB0eXBlIGlzIG5vdCBzdHJpbmcsIGJvb2xlYW4gb3IgZGF0ZVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZU51bWVyaWNDb2xvck1hcChjb2xvck1hcCwgdGhpcy5jb25maWdbZG9tYWluXSwgY29sb3JSYW5nZSk7XG4gIH1cblxuICB1cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIGNvbG9yUmFuZ2UpIHtcbiAgICBjb25zdCBjb2xvcnMgPSBjb2xvclJhbmdlLmNvbG9ycztcbiAgICBjb25zdCBhc3NpZ25lZENhdGVnb3JpZXMgPSBbXTtcbiAgICBpZiAoY29sb3JSYW5nZS50eXBlID09PSBoZXhDb2xvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgICAgY29sb3JNYXA6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb2xvck1hcCA9IGNvbG9yTWFwLnNsaWNlKDAsIGNvbG9ycy5sZW5ndGgpLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNNYXBbMF0pO1xuICAgICAgcmV0dXJuIFtjTWFwWzBdLCBjb2xvcnNbaW5kZXhdXTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmFzc2lnbmVkQ29sb3JzID0gY29sb3JzLnNsaWNlKG5ld0NvbG9yTWFwLmxlbmd0aCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIHVuYXNzaWduZWRDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5ID0gZG9tYWluLmZpbmQoZCA9PiAhYXNzaWduZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGQpKTtcbiAgICAgIGlmICghY2F0ZWdvcnkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBhc3NpZ25lZENhdGVnb3JpZXMucHVzaChjYXRlZ29yeSk7XG4gICAgICBuZXdDb2xvck1hcC5wdXNoKFtjYXRlZ29yeSwgY29sb3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbG9yUmFuZ2UsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCBkb21haW4sIHVwZGF0ZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHVwZGF0ZS5jb2xvcnM7XG4gICAgbGV0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCk7XG5cbiAgICBuZXdDb2xvck1hcCA9IG5ld0NvbG9yTWFwLm1hcCgoY01hcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IG5ld0NvbG9yTWFwLmxlbmd0aCAtIDEgPyBudWxsIDogY01hcFswXTtcbiAgICAgIHJldHVybiBbdmFsdWUsIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGlmICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNvbG9yTWFwVmFsdWVzID0gY29sb3JNYXAubWFwKGMgPT4gY1swXSkuZmlsdGVyKGMgPT4gdHlwZW9mIGMgPT09ICdudW1iZXInKTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gTWF0aC5tYXgoLi4uY29sb3JNYXBWYWx1ZXMsIGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0pO1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMl1bMF07XG4gICAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gcHJldlZhbHVlKSAvICh1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCArIDEpO1xuICAgICAgbmV3Q29sb3JNYXBbbmV3Q29sb3JNYXAubGVuZ3RoIC0gMV1bMF0gPSBwcmV2VmFsdWUgKyBzdGVwO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpLCBjb2xvcl0gb2YgdW5hc3NpZ25lZENvbG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpID09PSB1bmFzc2lnbmVkQ29sb3JzLmxlbmd0aCAtIDEgPyBudWxsIDogcHJldlZhbHVlICsgKHN0ZXAgKiAoaSArIDIpKTtcbiAgICAgICAgbmV3Q29sb3JNYXAucHVzaChbdmFsdWUsIGNvbG9yXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi51cGRhdGUsXG4gICAgICBjb2xvck1hcDogbmV3Q29sb3JNYXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gKFxuICAgICAgY29sdW1ucyAmJlxuICAgICAgT2JqZWN0LnZhbHVlcyhjb2x1bW5zKS5ldmVyeSh2ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odi5vcHRpb25hbCB8fCAodi52YWx1ZSAmJiB2LmZpZWxkSWR4ID4gLTEpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGxheWVyIGhhcyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBPYmplY3R9IGxheWVyRGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0geWVzIG9yIG5vXG4gICAqL1xuICBoYXNMYXllckRhdGEobGF5ZXJEYXRhKSB7XG4gICAgaWYgKCFsYXllckRhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4obGF5ZXJEYXRhLmRhdGEgJiYgbGF5ZXJEYXRhLmRhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIGlzVmFsaWRUb1NhdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy50eXBlICYmIHRoaXMuaGFzQWxsQ29sdW1ucygpKTtcbiAgfVxuXG4gIHNob3VsZFJlbmRlckxheWVyKGRhdGEpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgQm9vbGVhbih0aGlzLnR5cGUpICYmXG4gICAgICB0aGlzLmhhc0FsbENvbHVtbnMoKSAmJlxuICAgICAgdGhpcy5oYXNMYXllckRhdGEoZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLnJlbmRlckxheWVyID09PSAnZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbG9yU2NhbGUoY29sb3JTY2FsZTogc3RyaW5nLCBjb2xvckRvbWFpbjogVmlzdWFsQ2hhbm5lbERvbWFpbiwgY29sb3JSYW5nZTogQ29sb3JSYW5nZSkge1xuICAgIGlmIChjb2xvclJhbmdlLnR5cGUgPT09IGhleENvbG9yKSB7XG4gICAgICByZXR1cm4gKF8sIGNvbG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHtyLCBnLCBifSA9IHJnYihjb2xvcik7XG4gICAgICAgIHJldHVybiBbciwgZywgYl0uc29tZShpc05hTikgPyBVTktOT1dOX0NPTE9SIDogW3IsIGcsIGJdO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JSYW5nZS5jb2xvck1hcCkpIHtcbiAgICAgIGNvbnN0IGNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICBjb2xvclJhbmdlLmNvbG9yTWFwLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBjTWFwLnNldChrLCB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyBoZXhUb1JnYih2KSA6IHYpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gU0NBTEVfRlVOQ1tjb2xvclNjYWxlXSgpXG4gICAgICAgIC5kb21haW4oY01hcC5rZXlzKCkpXG4gICAgICAgIC5yYW5nZShjTWFwLnZhbHVlcygpKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpKTtcbiAgfVxuXG4gIGdldEN1c3RvbU1hcmtlcnNTY2FsZShyYW5nZSwgZmFsbGJhY2tJY29uKSB7XG4gICAgbGV0IHVua25vd25WYWx1ZSA9IGZhbGxiYWNrSWNvbiB8fCBGQUxMQkFDS19JQ09OO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybiAoKSA9PiB1bmtub3duVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXAoKTtcblxuICAgIGlmIChyYW5nZS5vdGhlcnNNYXJrZXIpIHtcbiAgICAgIHVua25vd25WYWx1ZSA9IHJhbmdlLm90aGVyc01hcmtlcjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7dmFsdWUsIG1hcmtlclVybH0gb2YgcmFuZ2UubWFya2VyTWFwKSB7XG4gICAgICBpZiAobWFya2VyVXJsKSB7XG4gICAgICAgIG1hcHBpbmcuc2V0KHZhbHVlLCBtYXJrZXJVcmwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmUgZDMgc2NhbGVcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlT3JkaW5hbCgpXG4gICAgICAuZG9tYWluKEFycmF5LmZyb20obWFwcGluZy5rZXlzKCkpKVxuICAgICAgLnJhbmdlKEFycmF5LmZyb20obWFwcGluZy52YWx1ZXMoKSkpXG4gICAgICAudW5rbm93bih1bmtub3duVmFsdWUpO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gdmlzdWFsIGNoYW5uZWxzIHRvIGRlY2suZ2wgYWNjZXNvcnNcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtIFBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW0uZGF0YUFjY2Vzc29yIEFjY2VzcyBrZXBsZXIuZ2wgbGF5ZXIgZGF0YSBmcm9tIGRlY2suZ2wgbGF5ZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IHBhcmFtLmRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byB1c2UgdXNlIHdpdGggZGF0YUFjY2Vzc29yXG4gICAqIEByZXR1cm4ge09iamVjdH0gYXR0cmlidXRlQWNjZXNzb3JzIC0gZGVjay5nbCBsYXllciBhdHRyaWJ1dGUgYWNjZXNzb3JzXG4gICAqL1xuICBnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe1xuICAgIGRhdGFBY2Nlc3NvciA9IGRlZmF1bHREYXRhQWNjZXNzb3IsXG4gICAgZGF0YUNvbnRhaW5lclxuICB9OiB7XG4gICAgZGF0YUFjY2Vzc29yPzogdHlwZW9mIGRlZmF1bHREYXRhQWNjZXNzb3I7XG4gICAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZTtcbiAgfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29yczoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZpeGVkLFxuICAgICAgICBzY2FsZSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgYWNjZXNzb3IsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgICAgIG51bGxWYWx1ZSxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuXG4gICAgICBjb25zdCBzaG91bGRHZXRTY2FsZSA9IEJvb2xlYW4oXG4gICAgICAgIChzY2FsZSB8fCBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eSkgJiYgdGhpcy5jb25maWdbZmllbGRdXG4gICAgICApO1xuXG4gICAgICBpZiAoc2hvdWxkR2V0U2NhbGUpIHtcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IGZpeGVkICYmIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF07XG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGRlY2xhcmUgYXMgY29uc3QgYWxsIHRoZSBwYXJhbWV0ZXJzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGJlIHVzZSBpbiB0aGUgZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSBjYWxsXG4gICAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG9sZExheWVyRGF0YSBwYXJhbWV0ZXIgaW4gZm9ybWF0TGF5ZXJEYXRhIG1ldGhvZCB3aWxsIGJlIHdyb25nICh5b3UgY2FuIGNoZWNrIHRoZSBmb3JtYXRMYXllckRhdGEgVGlsZUxheWVyIG1ldGhvZCBpbiBCdWlsZGVyIGFzIGV4YW1wbGUpXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblZhbHVlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2FnZ3JlZ2F0aW9uXTtcblxuICAgICAgICBjb25zdCBzY2FsZUZ1bmN0aW9uID1cbiAgICAgICAgICBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eVxuICAgICAgICAgICAgPyBzY2FsZUlkZW50aXR5XG4gICAgICAgICAgICA6IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmNvbG9yXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29sb3JTY2FsZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1tzY2FsZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdbZG9tYWluXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1tzY2FsZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdbZG9tYWluXSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdLFxuICAgICAgICAgICAgICAgIGlzRml4ZWRcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZCA9PlxuICAgICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgICAgIHNjYWxlOiBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YTogZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGQ6IGZpZWxkQ29uZmlnLFxuICAgICAgICAgICAgX2FnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnZXRBdHRyaWJ1dGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZ2V0QXR0cmlidXRlVmFsdWUodGhpcy5jb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9XG4gICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFjY2Vzc29yIGluIGF0dHJpYnV0ZUFjY2Vzc29ycykpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShcbiAgICBzY2FsZTogc3RyaW5nLFxuICAgIGRvbWFpbjogVmlzdWFsQ2hhbm5lbERvbWFpbixcbiAgICByYW5nZTogYW55LFxuICAgIGZpeGVkPzogYm9vbGVhblxuICApOiAoKSA9PiBhbnkgfCBudWxsIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlXSgpXG4gICAgICAgIC5kb21haW4oZG9tYWluLnNsaWNlKDAsIHJhbmdlLmxlbmd0aCkpXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24oVU5LTk9XTl9DT0xPUik7XG4gICAgfVxuXG4gICAgLy8gZm9yIGBjb3VudGAgYWdncmVnYXRpb24sIHdlIGRvbWFpbiBpcyBhY3R1YWxseSBgWzAsIEluZmluaXR5XWAgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlXG4gICAgLy8gdG8gdXNlIGl0LCBzbyBza2lwIHNwZWN5ZnlpbmcgdGhpcyBkb21haW5zXG4gICAgY29uc3QgZG9tYWluSXNJbmZpbml0ZSA9IGRvbWFpbiAmJiAoZG9tYWluWzBdID09PSAwICYmIGRvbWFpblsxXSA9PT0gSW5maW5pdHkpO1xuICAgIGNvbnN0IHNjYWxlRmFjdG9yeSA9IFNDQUxFX0ZVTkNbZml4ZWQgPyAnbGluZWFyJyA6IHNjYWxlXTtcbiAgICAvLyBAdHMtaWdub3JlIGQzLXNjYWxlIHR5cGVcbiAgICBsZXQgcmVzdWx0ID0gc2NhbGVGYWN0b3J5KCk7XG4gICAgaWYgKGRvbWFpbiAmJiAhZG9tYWluSXNJbmZpbml0ZSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmRvbWFpbihkb21haW4pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnJhbmdlKGZpeGVkID8gZG9tYWluIDogcmFuZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICogQHBhcmFtIHtpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2V9IGRhdGFDb250YWluZXIgRGF0YUNvbnRhaW5lciB0byBjYWxjdWxhdGUgYm91bmRzIGZvci5cbiAgICogQHBhcmFtIHsoZDoge2luZGV4OiBudW1iZXJ9LCBkYzogaW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiBudW1iZXJbXX0gZ2V0UG9zaXRpb24gQWNjZXNzIGtlcGxlci5nbCBsYXllciBkYXRhIGZyb20gZGVjay5nbCBsYXllclxuICAgKiBAcmV0dXJuIHtudW1iZXJbXXxudWxsfSBib3VuZHMgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQb2ludHNCb3VuZHMoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBubyBuZWVkIHRvIGxvb3AgdGhyb3VnaCB0aGUgZW50aXJlIGRhdGFzZXRcbiAgICAvLyBnZXQgYSBzYW1wbGUgb2YgZGF0YSB0byBjYWxjdWxhdGUgYm91bmRzXG4gICAgY29uc3Qgc2FtcGxlRGF0YSA9XG4gICAgICBkYXRhQ29udGFpbmVyLm51bVJvd3MoKSA+IE1BWF9TQU1QTEVfU0laRVxuICAgICAgICA/IGdldFNhbXBsZURhdGEoZGF0YUNvbnRhaW5lciwgTUFYX1NBTVBMRV9TSVpFKVxuICAgICAgICA6IGRhdGFDb250YWluZXI7XG5cbiAgICBjb25zdCBwb2ludHMgPSBzYW1wbGVEYXRhLm1hcEluZGV4KGdldFBvc2l0aW9uKTtcblxuICAgIGNvbnN0IGxhdEJvdW5kcyA9IGdldExhdExuZ0JvdW5kcyhwb2ludHMsIDEsIFstOTAsIDkwXSk7XG4gICAgY29uc3QgbG5nQm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMCwgWy0xODAsIDE4MF0pO1xuXG4gICAgaWYgKCFsYXRCb3VuZHMgfHwgIWxuZ0JvdW5kcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtsbmdCb3VuZHNbMF0sIGxhdEJvdW5kc1swXSwgbG5nQm91bmRzWzFdLCBsYXRCb3VuZHNbMV1dO1xuICB9XG5cbiAgZ2V0Q2hhbmdlZFRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2Vycykge1xuICAgIGNvbnN0IHRyaWdnZXJDaGFuZ2VkID0gZGlmZlVwZGF0ZVRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2VycywgdGhpcy5fb2xkRGF0YVVwZGF0ZVRyaWdnZXJzKTtcbiAgICB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMgPSBkYXRhVXBkYXRlVHJpZ2dlcnM7XG5cbiAgICByZXR1cm4gdHJpZ2dlckNoYW5nZWQ7XG4gIH1cblxuICBnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHtcbiAgICBjaGFubmVsLFxuICAgIHNjYWxlLFxuICAgIGRhdGEsXG4gICAgZmllbGQsXG4gICAgZGF0YUNvbnRhaW5lcixcbiAgICAvLyBJbiBidWlsZGVyIHdlIG92ZXJ3cml0ZSB0aGUgZ2V0VmFsdWUgZnVuY3Rpb24gYW5kIHdlIHVzZSB0aGUgX2FnZ3JlZ2F0aW9uIHBhcmFtZXRlciBpbiBzcGF0aWFsIGluZGV4IGxheWVycyBhcyB0aGUgUXVhZGtleUxheWVyLlxuICAgIF9hZ2dyZWdhdGlvbixcbiAgICBudWxsVmFsdWUgPSBOT19WQUxVRV9DT0xPUixcbiAgICBnZXRWYWx1ZSA9IGRlZmF1bHRHZXRGaWVsZFZhbHVlXG4gIH06IHtcbiAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgc2NhbGU6ICguLi52YWx1ZSkgPT4gYW55O1xuICAgIGRhdGE6IGFueVtdO1xuICAgIGZpZWxkOiBWaXN1YWxDaGFubmVsRmllbGQ7XG4gICAgZGF0YUNvbnRhaW5lcjogYW55O1xuICAgIF9hZ2dyZWdhdGlvbjogYW55O1xuICAgIG51bGxWYWx1ZT86IFJHQkFDb2xvcjtcbiAgICBnZXRWYWx1ZT86IHR5cGVvZiBkZWZhdWx0R2V0RmllbGRWYWx1ZTtcbiAgfSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogVmlzdWFsQ2hhbm5lbEZpZWxkIGJldHRlciB0eXBpbmdcbiAgICBjb25zdCB7dHlwZX0gPSBmaWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGZpZWxkLCBkYXRhKTtcbiAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gdGhpcy5jb25maWcudmlzQ29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF0ucmFuZ2VdO1xuICAgIGNvbnN0IGNoYW5uZWxGaWVsZCA9IHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF0uZmllbGRdO1xuICAgIGxldCBjb2xvckNvbHVtblZhbHVlOiBhbnk7XG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZz8udHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkID0ge1xuICAgICAgICBpZDogY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICBuYW1lOiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgIGZpZWxkSWR4OiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW5JZHgsXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IGQgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhQ29udGFpbmVyLnZhbHVlQXQoZC5pbmRleCwgY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uSWR4KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29sb3JDb2x1bW5WYWx1ZSA9IGdldFZhbHVlKGNvbHVtbkZpZWxkLCBkYXRhKTtcbiAgICB9IGVsc2UgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTtcbiAgICBpZiAodHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY29udmVydCBoZXJlXG4gICAgICAvLyBzY2FsZSBGdW5jdGlvbiBzaG91bGQgdGFrZSBjYXJlIG9mIGl0XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKG5ldyBEYXRlKHZhbHVlKSwgY29sb3JDb2x1bW5WYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUodmFsdWUsIGNvbG9yQ29sdW1uVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlO1xuICB9XG5cbiAgdXBkYXRlTWV0YShtZXRhKSB7XG4gICAgdGhpcy5tZXRhID0gey4uLnRoaXMubWV0YSwgLi4ubWV0YX07XG4gIH1cblxuICB1cGRhdGVMYXllckxlZ2VuZChzZXR0aW5ncykge1xuICAgIHRoaXMubGVnZW5kU2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKHtmaWx0ZXJlZEluZGV4LCBpZCwgYWxsRGF0YX06IEtlcGxlclRhYmxlKTogYW55IHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiB7XG4gICAgICBnZXREYXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1ucywgZmlsdGVyZWRJbmRleH0sXG4gICAgICBnZXRNZXRhOiB7ZGF0YXNldElkOiBpZCwgYWxsRGF0YSwgY29sdW1uc30sXG4gICAgICAuLi4odGhpcy5jb25maWcudGV4dExhYmVsIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAgIChhY2N1LCB0bCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgIFtgZ2V0TGFiZWxDaGFyYWN0ZXJTZXQtJHtpfWBdOiB0bC5maWVsZCA/IHRsLmZpZWxkLm5hbWUgOiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRhdGFJZCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuXG4gICAgdGhpcy51cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGRhdGFzZXQpO1xuICAgIHRoaXMudXBkYXRlSGV4Q29sb3JEb21haW4oZGF0YXNldCk7XG5cbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKTtcbiAgICBjb25zdCBkYXRhVXBkYXRlVHJpZ2dlcnMgPSB0aGlzLmdldERhdGFVcGRhdGVUcmlnZ2VycyhkYXRhc2V0KTtcbiAgICBjb25zdCB0cmlnZ2VyQ2hhbmdlZCA9IHRoaXMuZ2V0Q2hhbmdlZFRyaWdnZXJzKGRhdGFVcGRhdGVUcmlnZ2Vycyk7XG5cbiAgICBpZiAodHJpZ2dlckNoYW5nZWQgJiYgdHJpZ2dlckNoYW5nZWQuZ2V0TWV0YSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gW107XG5cbiAgICBpZiAoISh0cmlnZ2VyQ2hhbmdlZCAmJiB0cmlnZ2VyQ2hhbmdlZC5nZXREYXRhKSAmJiBvbGRMYXllckRhdGEgJiYgb2xkTGF5ZXJEYXRhLmRhdGEpIHtcbiAgICAgIC8vIHNhbWUgZGF0YVxuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdGhpcy5jYWxjdWxhdGVEYXRhQXR0cmlidXRlKGRhdGFzZXQsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGEsIHRyaWdnZXJDaGFuZ2VkfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3R5bGVkIGZpZWxkcyB0byBtYXRjaCBvbmVzIGZyb20gbmV3IGRhdGFzZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gICAqL1xuICB1cGRhdGVWaXN1YWxDaGFubmVsRmllbGRzKGRhdGFzZXQpIHtcbiAgICBmb3IgKGNvbnN0IHtmaWVsZCwgcmFuZ2V9IG9mIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IG9sZEZpZWxkID0gdGhpcy5jb25maWdbZmllbGRdO1xuICAgICAgY29uc3QgaXNVc2luZ0hleENvbG9yQ29kZSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0/LmhleENvbG9yO1xuICAgICAgaWYgKCFvbGRGaWVsZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgbmV3RGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBvbGRGaWVsZC5uYW1lKSB8fCBudWxsO1xuICAgICAgaWYgKGlzVXNpbmdIZXhDb2xvckNvZGUpIHtcbiAgICAgICAgbmV3RGF0YVNldEZpZWxkID0ge1xuICAgICAgICAgIC4uLm5ld0RhdGFTZXRGaWVsZCxcbiAgICAgICAgICBjb2xvckNvbHVtbjogbmV3RGF0YVNldEZpZWxkLmNvbG9yQ29sdW1uIHx8IG9sZEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICAgIGNvbG9yQ29sdW1uSWR4OiBuZXdEYXRhU2V0RmllbGQuY29sb3JDb2x1bW5JZHggfHwgb2xkRmllbGQuY29sb3JDb2x1bW5JZHhcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tmaWVsZF06IG5ld0RhdGFTZXRGaWVsZH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIG9uZSBsYXllciBkb21haW4gd2hlbiBzdGF0ZS5kYXRhIGNoYW5nZWRcbiAgICogaWYgc3RhdGUuZGF0YSBjaGFuZ2UgaXMgZHVlIG90IHVwZGF0ZSBmaWx0ZXIsIG5ld0ZpbGVyIHdpbGwgYmUgcGFzc2VkXG4gICAqIGNhbGxlZCBieSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGFcbiAgICogQHBhcmFtIGRhdGFzZXRzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJcbiAgICogQHJldHVybnMgbGF5ZXJcbiAgICovXG4gIHVwZGF0ZUxheWVyRG9tYWluKGRhdGFzZXRzOiBEYXRhc2V0cywgbmV3RmlsdGVyPzogRmlsdGVyKTogTGF5ZXIge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge3NjYWxlfSA9IGNoYW5uZWw7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG5cbiAgICAgIC8vIG9yZGluYWwgZG9tYWluIGlzIGJhc2VkIG9uIGRhdGFDb250YWluZXIsIGlmIG9ubHkgZmlsdGVyIGNoYW5nZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluXG4gICAgICBpZiAoIW5ld0ZpbHRlciB8fCBzY2FsZVR5cGUgIT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgICAgY29uc3Qge2RvbWFpbn0gPSBjaGFubmVsO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbih0YWJsZSwgY2hhbm5lbCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tkb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldERhdGFzZXQoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdmlzdWFsIGNoYW5uZWwgZmllbGQgYW5kIHNjYWxlcyBiYXNlZCBvbiBzdXBwb3J0ZWQgZmllbGQgJiBzY2FsZSB0eXBlXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICB2YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbDogc3RyaW5nKSB7XG4gICAgdGhpcy52YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsKTtcbiAgICB0aGlzLnZhbGlkYXRlU2NhbGUoY2hhbm5lbCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgdHlwZSBiYXNlZCBvbiBjaGFubmVsU2NhbGVUeXBlXG4gICAqL1xuICB2YWxpZGF0ZUZpZWxkVHlwZShjaGFubmVsOiBzdHJpbmcpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIGNoYW5uZWxTY2FsZVR5cGUsIHN1cHBvcnRlZEZpZWxkVHlwZXN9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgIGlmICh0aGlzLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgIC8vIGlmIGZpZWxkIGlzIHNlbGVjdGVkLCBjaGVjayBpZiBmaWVsZCB0eXBlIGlzIHN1cHBvcnRlZFxuICAgICAgY29uc3QgY2hhbm5lbFN1cHBvcnRlZEZpZWxkVHlwZXMgPVxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzIHx8IENIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEU1tjaGFubmVsU2NhbGVUeXBlXTtcblxuICAgICAgaWYgKCFjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcy5pbmNsdWRlcyh0aGlzLmNvbmZpZ1tmaWVsZF0udHlwZSkpIHtcbiAgICAgICAgLy8gZmllbGQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBzZXQgaXQgYmFjayB0byBudWxsXG4gICAgICAgIC8vIHNldCBzY2FsZSBiYWNrIHRvIGRlZmF1bHRcbiAgICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbnVsbH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzY2FsZSB0eXBlIGJhc2VkIG9uIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICB2YWxpZGF0ZVNjYWxlKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7c2NhbGUsIHJhbmdlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgaWYgKFxuICAgICAgIXNjYWxlIHx8XG4gICAgICAodGhpcy5pc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHJhbmdlKSAmJiB0aGlzLmNvbmZpZ1tzY2FsZV0gPT09IFNDQUxFX1RZUEVTLmlkZW50aXR5KVxuICAgICkge1xuICAgICAgLy8gdmlzdWFsQ2hhbm5lbCBkb2Vzbid0IGhhdmUgc2NhbGVcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVPcHRpb25zID0gdGhpcy5nZXRTY2FsZU9wdGlvbnMoY2hhbm5lbCk7XG4gICAgLy8gY2hlY2sgaWYgY3VycmVudCBzZWxlY3RlZCBzY2FsZSBpc1xuICAgIC8vIHN1cHBvcnRlZCwgaWYgbm90LCBjaGFuZ2UgdG8gZGVmYXVsdFxuICAgIGlmICghc2NhbGVPcHRpb25zLmluY2x1ZGVzKHRoaXMuY29uZmlnW3NjYWxlXSkpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tzY2FsZV06IHNjYWxlT3B0aW9uc1swXX0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2NhbGUgb3B0aW9ucyBiYXNlZCBvbiBjdXJyZW50IGZpZWxkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFNjYWxlT3B0aW9ucyhjaGFubmVsKSB7XG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgY29uc3Qge2ZpZWxkLCBzY2FsZSwgY2hhbm5lbFNjYWxlVHlwZX0gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXVxuICAgICAgPyBGSUVMRF9PUFRTW3RoaXMuY29uZmlnW2ZpZWxkXS50eXBlXS5zY2FsZVtjaGFubmVsU2NhbGVUeXBlXVxuICAgICAgOiBbdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoKVtzY2FsZV1dO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQ6IEtlcGxlclRhYmxlLCBjaGFubmVsOiBzdHJpbmcpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICB0aGlzLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChjaGFubmVsKTtcbiAgICAvLyBjYWxjdWxhdGUgbGF5ZXIgY2hhbm5lbCBkb21haW5cbiAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbdmlzdWFsQ2hhbm5lbC5kb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gIH1cblxuICBnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKTogVXBkYXRlVHJpZ2dlcnMge1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzOiBVcGRhdGVUcmlnZ2VycyA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2aXN1YWxDaGFubmVsID0+IHtcbiAgICAgIC8vIGZpZWxkIHJhbmdlIHNjYWxlIGRvbWFpblxuICAgICAgY29uc3Qge2FjY2Vzc29yLCBmaWVsZCwgc2NhbGUsIGRvbWFpbiwgcmFuZ2UsIGRlZmF1bHRWYWx1ZSwgZml4ZWR9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHtcbiAgICAgICAgICBbZmllbGRdOiB0aGlzLmNvbmZpZ1tmaWVsZF0sXG4gICAgICAgICAgW3NjYWxlXTogdGhpcy5jb25maWdbc2NhbGVdLFxuICAgICAgICAgIFtkb21haW5dOiB0aGlzLmNvbmZpZ1tkb21haW5dLFxuICAgICAgICAgIFtyYW5nZV06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOlxuICAgICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgLi4uKGZpeGVkID8ge1tmaXhlZF06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tmaXhlZF19IDoge30pXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgY2FsY3VsYXRlTGF5ZXJEb21haW4oZGF0YXNldCwgdmlzdWFsQ2hhbm5lbCkge1xuICAgIGNvbnN0IHtzY2FsZX0gPSB2aXN1YWxDaGFubmVsO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF07XG4gICAgaWYgKCFmaWVsZCB8fCAhc2NhbGUpIHtcbiAgICAgIC8vIGlmIGNvbG9yRmllbGQgb3Igc2l6ZUZpZWxkIHdlcmUgc2V0IGJhY2sgdG8gbnVsbFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGVUeXBlID0gdGhpcy5jb25maWdbc2NhbGVdO1xuICAgIGNvbnN0IGRhdGFTZXRGaWVsZCA9IGRhdGFzZXQuZmllbGRzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZpZWxkLm5hbWUpO1xuICAgIGlmICghc2NhbGVUeXBlIHx8ICFkYXRhU2V0RmllbGQpIHtcbiAgICAgIC8vIGlmIG5ldyBkYXRhc2V0IGRvZXNuJ3QgY29udGFpbiBwcmV2aW91c2x5IHNldCBmaWVsZFxuICAgICAgcmV0dXJuIGRlZmF1bHREb21haW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFzZXQuZ2V0Q29sdW1uTGF5ZXJEb21haW4oZGF0YVNldEZpZWxkLCBzY2FsZVR5cGUpIHx8IGRlZmF1bHREb21haW47XG4gIH1cblxuICB1cGRhdGVIZXhDb2xvckRvbWFpbihkYXRhc2V0KSB7XG4gICAgaWYgKCFkYXRhc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tjaGFubmVsLnJhbmdlXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbY2hhbm5lbC5maWVsZF07XG5cbiAgICAgIGlmIChjaGFubmVsQ29uZmlnPy50eXBlID09PSBoZXhDb2xvciAmJiBmaWVsZD8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQuY29sb3JDb2x1bW4pO1xuICAgICAgICBjb25zdCBjb2xvcnMgPSBkYXRhc2V0XG4gICAgICAgICAgLmdldENvbHVtbkxheWVyRG9tYWluKGRhdGFTZXRGaWVsZCwgU0NBTEVfVFlQRVMub3JkaW5hbClcbiAgICAgICAgICAubWFwKGMgPT4gY2hlY2tDb2xvck9yRmFsbGJhY2soYykpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtcbiAgICAgICAgICBbY2hhbm5lbC5yYW5nZV06IHsuLi5jaGFubmVsQ29uZmlnLCBjb2xvcnN9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjYWxjdWxhdGVIZXhDb2x1bW5MZWdlbmQoZGF0YXNldHMpIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIWRhdGFzZXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGVnZW5kU2V0dGluZ3MgPSBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5yZWR1Y2UoKGxlZ2VuZHMsIGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IHtyYW5nZSwgZmllbGQ6IGNoYW5uZWxGaWVsZH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV07XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnW2NoYW5uZWxGaWVsZF07XG5cbiAgICAgIGlmIChjaGFubmVsQ29uZmlnPy50eXBlID09PSBoZXhDb2xvciAmJiBmaWVsZD8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQuY29sb3JDb2x1bW4pO1xuICAgICAgICBjb25zdCBsZWdlbmQgPSBkYXRhc2V0LmNhbGN1bGF0ZUxlZ2VuZChmaWVsZCwgZGF0YVNldEZpZWxkKTtcbiAgICAgICAgbGVnZW5kc1tjaGFubmVsXSA9IGxlZ2VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWdlbmRzO1xuICAgIH0sIHt9KTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyTGVnZW5kKGxlZ2VuZFNldHRpbmdzKTtcbiAgfVxuXG4gIGhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SW5mbykge1xuICAgIHJldHVybiB0aGlzLmlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pICYmIG9iamVjdEluZm8ub2JqZWN0ID8gb2JqZWN0SW5mby5vYmplY3QgOiBudWxsO1xuICB9XG5cbiAgaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvYmplY3RJbmZvPy5waWNrZWQgJiYgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlOiBNYXBTdGF0ZSwgZml4ZWRSYWRpdXM/OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmFkaXVzQ2hhbm5lbCA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YyA9PiB2Yy5wcm9wZXJ0eSA9PT0gJ3JhZGl1cycpO1xuXG4gICAgaWYgKCFyYWRpdXNDaGFubmVsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0NoYW5uZWwuZmllbGQ7XG4gICAgY29uc3Qge3JhZGl1c30gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZ1tmaWVsZF0gPyAxIDogcmFkaXVzKSAqIHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gIH1cblxuICBnZXRSYWRpdXNTY2FsZSgpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwgfHwgdGhpcy5jb25maWdbcmFkaXVzQ2hhbm5lbC5maWVsZF0pIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWcucmFkaXVzO1xuICB9XG5cbiAgZ2V0TWF4TWFya2VyU2l6ZSgpIHtcbiAgICBjb25zdCB7cmFkaXVzRmllbGQsIHNpemVGaWVsZCwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtyYWRpdXNSYW5nZSwgcmFkaXVzfSA9IHZpc0NvbmZpZztcbiAgICBjb25zdCBmaWVsZCA9IHJhZGl1c0ZpZWxkIHx8IHNpemVGaWVsZDtcbiAgICByZXR1cm4gTWF0aC5jZWlsKChmaWVsZCAmJiByYWRpdXNSYW5nZSA/IHJhZGl1c1JhbmdlWzFdIDogcmFkaXVzKSk7XG4gIH1cblxuICBzaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHByb3BzLnNvbWUocCA9PiAhdGhpcy5ub25lTGF5ZXJEYXRhQWZmZWN0aW5nUHJvcHMuaW5jbHVkZXMocCkpO1xuICB9XG5cbiAgZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZywgYnJ1c2hpbmdUYXJnZXQ/KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGJydXNoaW5nUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaGluZ1RhcmdldDogYnJ1c2hpbmdUYXJnZXQgfHwgJ3NvdXJjZScsXG4gICAgICBicnVzaGluZ0VuYWJsZWQ6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKHtcbiAgICBpZHgsXG4gICAgZ3B1RmlsdGVyLFxuICAgIG1hcFN0YXRlLFxuICAgIHZpc2libGUsXG4gICAgbWFza1BvbHlnb25cbiAgfToge1xuICAgIGlkeDogbnVtYmVyO1xuICAgIGdwdUZpbHRlcjogR3B1RmlsdGVyO1xuICAgIG1hcFN0YXRlOiBNYXBTdGF0ZTtcbiAgICB2aXNpYmxlOiBib29sZWFuO1xuICAgIG1hc2tQb2x5Z29uOiBhbnk7XG4gIH0pIHtcbiAgICBjb25zdCBtYXNrRXh0ZW5zaW9uUHJvcHMgPSBnZXRNYXNrRXh0ZW5zaW9uUHJvcHMobWFza1BvbHlnb24pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tYXNrRXh0ZW5zaW9uUHJvcHMsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlkeCxcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVCxcbiAgICAgIHBpY2thYmxlOiB0aGlzLmhhc0ludGVyYWN0aXZpdHksXG4gICAgICB3cmFwTG9uZ2l0dWRlOiB0cnVlLFxuICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogQm9vbGVhbihtYXBTdGF0ZS5kcmFnUm90YXRlIHx8IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGUzZCl9LFxuICAgICAgaGlkZGVuOiB0aGlzLmNvbmZpZy5oaWRkZW4sXG4gICAgICB2aXNpYmlsaXR5Qnlab29tOiB0aGlzLmNvbmZpZy52aXNpYmlsaXR5Qnlab29tLFxuICAgICAgLy8gdmlzY29uZmlnXG4gICAgICBvcGFjaXR5OiB0aGlzLmNvbmZpZy52aXNDb25maWcub3BhY2l0eSxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgIC8vIGRhdGEgZmlsdGVyaW5nXG4gICAgICBleHRlbnNpb25zOiBbZGF0YUZpbHRlckV4dGVuc2lvbiwgLi4ubWFza0V4dGVuc2lvblByb3BzLmV4dGVuc2lvbnNdLFxuICAgICAgZmlsdGVyUmFuZ2U6IGdwdUZpbHRlciA/IGdwdUZpbHRlci5maWx0ZXJSYW5nZSA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIGxheWVyIHNob3VsZCBiZSB2aXNpYmxlIGFuZCBpZiBzcGxpdE1hcCwgc2hvd24gaW4gdG8gb25lIG9mIHBhbmVsXG4gICAgICB2aXNpYmxlOiB0aGlzLmNvbmZpZy5pc1Zpc2libGUgJiYgdmlzaWJsZVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYCR7dGhpcy5pZH0taG92ZXJlZGAsXG4gICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICB3cmFwTG9uZ2l0dWRlOiB0cnVlLFxuICAgICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uTE5HTEFUXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlclRleHRMYWJlbExheWVyKFxuICAgIHtnZXRQb3NpdGlvbiwgZ2V0UmFkaXVzLCByYWRpdXNTY2FsZSwgdXBkYXRlVHJpZ2dlcnMsIHNoYXJlZFByb3BzfSxcbiAgICByZW5kZXJPcHRzXG4gICkge1xuICAgIGNvbnN0IHtkYXRhfSA9IHJlbmRlck9wdHM7XG4gICAgY29uc3Qge3RleHRMYWJlbCwgdmlzaWJpbGl0eUJ5Wm9vbX0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBleHRlbnNpb25zID0gWy4uLnNoYXJlZFByb3BzLmV4dGVuc2lvbnMsIGNvbGxpc2lvbkZpbHRlckV4dGVuc2lvbl07XG5cbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudGV4dExhYmVscyB8fCAhZGF0YS50ZXh0TGFiZWxzWzBdIHx8ICFkYXRhLnRleHRMYWJlbHNbMF0uZ2V0VGV4dCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IFttYWluTGFiZWwsIHNlY29uZGFyeUxhYmVsXSA9IHRleHRMYWJlbDtcbiAgICBjb25zdCB7XG4gICAgICBhbGlnbm1lbnQsXG4gICAgICBhbmNob3IsXG4gICAgICBjb2xvcjogZ2V0Q29sb3IsXG4gICAgICBmaWVsZDogbWFpbkZpZWxkLFxuICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgc2l6ZTogc2l6ZVNjYWxlXG4gICAgfSA9IG1haW5MYWJlbDtcbiAgICBjb25zdCB7XG4gICAgICBjb2xvcjogZ2V0U2Vjb25kYXJ5Q29sb3IsXG4gICAgICBmaWVsZDogc2Vjb25kYXJ5RmllbGQsXG4gICAgICBvdXRsaW5lQ29sb3I6IHNlY29uZGFyeU91dGxpbmVDb2xvcixcbiAgICAgIHNpemU6IHNlY29uZGFyeVNpemVTY2FsZVxuICAgIH0gPSBzZWNvbmRhcnlMYWJlbCB8fCB7fTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgUG9pbnRMYWJlbExheWVyKHtcbiAgICAgICAgLi4uc2hhcmVkUHJvcHMsXG5cbiAgICAgICAgLy8gUmVjcmVhdGUgbGF5ZXIgd2hlbiBsYWJlbHMgY2hhbmdlIG90aGVyd2lzZSByZW5kZXJpbmcgYnJlYWtzXG4gICAgICAgIC8vIFRPRE8gY291bGQgYmUgbW9yZSBlZmZpY2llbnQgd2l0aCB1cGRhdGVUcmlnZ2Vycz9cbiAgICAgICAgaWQ6IGAke3RoaXMuaWR9LSR7bWFpbkZpZWxkPy5uYW1lfS0ke3NlY29uZGFyeUZpZWxkPy5uYW1lfS1sYWJlbGAsXG4gICAgICAgIGRhdGE6IGRhdGEuZGF0YSxcbiAgICAgICAgdmlzaWJpbGl0eUJ5Wm9vbSxcbiAgICAgICAgZXh0ZW5zaW9ucyxcblxuICAgICAgICBjaGFyYWN0ZXJTZXQ6ICdhdXRvJyxcbiAgICAgICAgY29sbGlzaW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY29sbGlzaW9uR3JvdXA6IGAke3RoaXMuaWR9LWxhYmVsc2AsXG5cbiAgICAgICAgZ2V0VGV4dDogZGF0YS50ZXh0TGFiZWxzWzBdLmdldFRleHQsXG4gICAgICAgIGdldENvbG9yLFxuICAgICAgICBzaXplU2NhbGUsXG4gICAgICAgIG91dGxpbmVDb2xvcixcblxuICAgICAgICAuLi4oc2Vjb25kYXJ5RmllbGQgJiYge1xuICAgICAgICAgIGdldFNlY29uZGFyeVRleHQ6IGRhdGEudGV4dExhYmVsc1sxXS5nZXRUZXh0LFxuICAgICAgICAgIGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgICAgIHNlY29uZGFyeVNpemVTY2FsZSxcbiAgICAgICAgICBzZWNvbmRhcnlPdXRsaW5lQ29sb3JcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gUG9zaXRpb25cbiAgICAgICAgZ2V0UG9zaXRpb24sXG4gICAgICAgIGdldFJhZGl1cyxcbiAgICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICAgIGdldFRleHRBbmNob3I6IGFuY2hvcixcbiAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6IGFsaWdubWVudCxcblxuICAgICAgICAvLyBTdHlsZVxuICAgICAgICBmb250RmFtaWx5OiAnSW50ZXIsIHNhbnMnLFxuICAgICAgICBmb250U2V0dGluZ3M6IHtzZGY6IHRydWV9LFxuICAgICAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgICAgIG91dGxpbmVXaWR0aDogNCxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIC8vIHRleHQgd2lsbCBhbHdheXMgc2hvdyBvbiB0b3Agb2YgYWxsIGxheWVyc1xuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICAuLi51cGRhdGVUcmlnZ2VycyxcbiAgICAgICAgICBnZXRUZXh0OiBtYWluRmllbGQ/Lm5hbWUsXG4gICAgICAgICAgZ2V0Q29sb3I6IG1haW5GaWVsZD8uY29sb3IsXG4gICAgICAgICAgZ2V0VGV4dEFuY2hvcjogbWFpbkxhYmVsLmFuY2hvcixcbiAgICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogbWFpbkxhYmVsLmFsaWdubWVudCxcbiAgICAgICAgICBnZXRTZWNvbmRhcnlUZXh0OiBzZWNvbmRhcnlGaWVsZD8ubmFtZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGRlY2suZ2wgYEljb25MYXllcmAgXCJhdXRvUGFja1wiIG1vZGUgYWNjZXNzb3IgZm9yIGN1c3RvbSBtYXJrZXJzLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGljb25VcmxBY2Nlc3NvciBkZWNrLmdsIGFjY2Vzc29yIChvciB2YWx1ZSkgdGhhdCByZXNvbHZlcyB0byBVUkwgb2YgaWNvbiBmb3IgZ2l2ZW4gcm93XG4gICAqIEByZXR1cm5zIGRlY2suZ2wgYWNjZXNzb3IgdGhhdCByZXR1cm5zIFVucGFja2VkSWNvbiByZWFkeSB0byBjb25zdW1lIGJ5IEljb25MYXllclxuICAgKi9cbiAgZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yKGljb25VcmxBY2Nlc3NvciwgbWFzayA9IHRydWUpIHtcbiAgICBjb25zdCBtYXhJY29uU2l6ZSA9IHRoaXMuZ2V0TWF4TWFya2VyU2l6ZSgpO1xuXG4gICAgcmV0dXJuIGQgPT4ge1xuICAgICAgY29uc3Qgd2FudGVkVXJsID1cbiAgICAgICAgKHR5cGVvZiBpY29uVXJsQWNjZXNzb3IgPT09ICdmdW5jdGlvbicpID8gaWNvblVybEFjY2Vzc29yKGQpIDogaWNvblVybEFjY2Vzc29yO1xuICAgICAgY29uc3QgaWNvbk9rID0gQm9vbGVhbih3YW50ZWRVcmwpO1xuICAgICAgbWFzayA9IGljb25PayA/IG1hc2sgOiB0cnVlO1xuICAgICAgY29uc3QgdXJsID0gaWNvbk9rID8gd2FudGVkVXJsIDogRkFMTEJBQ0tfSUNPTjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBgJHt1cmx9QEAke21heEljb25TaXplfUAke21hc2sgPyAnbScgOiAnYyd9YCxcbiAgICAgICAgdXJsLFxuICAgICAgICB3aWR0aDogbWF4SWNvblNpemUsXG4gICAgICAgIGhlaWdodDogbWF4SWNvblNpemUsXG4gICAgICAgIG1hc2tcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoa2VwbGVyVGFibGU6IEtlcGxlclRhYmxlLCBnZXRQb3NpdGlvbik6IGFueSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXNcbiAgfVxuXG4gIGdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcj86IERhdGFDb250YWluZXJJbnRlcmZhY2UpOiAoLi4uYXJnczogYW55W10pID0+IGFueSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiAoKSA9PiBudWxsO1xuICB9XG5cbiAgZ2V0SGV4Q29sdW1uKHJhbmdlKSB7XG4gICAgY29uc3QgZmllbGQgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpPy5maW5kKHZhbHVlID0+IHZhbHVlLnJhbmdlID09PSByYW5nZSk/LmZpZWxkO1xuICAgIGlmIChmaWVsZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW47XG4gICAgfVxuICB9XG5cbiAgaXNDb2xvcmVkQnlDb2xvckNvbHVtbihyYW5nZSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdPy5oZXhDb2xvcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllcjtcbiJdfQ==
|