{"version":3,"sources":["images/virus-pixabay.png","images/Serberus.svg","images/corona-virus-pixabay-bw.png","../../src/slykitContext.js","../../src/views/workspace/workspaceContext.js","../../src/views/common/colorScalesContext.jsx","../../src/widgets/endpointDecorators.ts","../../src/widgets/endpoints.ts","../../src/styles/chartColors.ts","../../src/utilities/setUpColorScale.ts","../../src/styles/colors.ts","../../src/components/loadingIcon/loadingStyles.jsx","../../src/components/loadingIcon/index.tsx","../../src/views/login/index.js","../../src/styles/variables-default.ts","../../src/styles/variables.ts","../../src/views/login/loginScreen.js","../../src/images/Serberus.svg","../../src/widgets/testWidget/index.tsx","../../src/widgets/chartUtils.ts","../../src/widgets/testWidget/wrapper.tsx","../../src/components/dropdowns/utils.js","../../src/components/dropdowns/objectDropdown.js","../../src/components/dropdowns/common-dropdown-with-label.tsx","../../src/utilities/srsUtils.ts","../../src/components/dropdowns/propertyDropdown.js","../../src/hooks/useWorkspaceState.js","../../src/components/selectors/propertyListSelector.js","../../src/widgets/testWidget/config.jsx","../../src/widgets/testWidget/knobs.jsx","../../src/widgets/paraCord/index.js","../../src/widgets/paraCord/wrapper.jsx","../../src/components/multiselect/draggable/ItemTypes.js","../../src/components/multiselect/draggable/styles.jsx","../../src/components/multiselect/draggable/draggableItem.js","../../src/components/multiselect/draggable/index.js","../../src/components/icon/index.js","../../src/components/multiselect/styles.jsx","../../src/components/custom-multiselect/custom-multiselect.tsx","../../src/widgets/paraCord/actions.jsx","../../src/widgets/paraCord/config.jsx","../../src/widgets/paraCord/knobs.jsx","../../src/components/chartTooltip/useTooltip.tsx","../../src/components/chartTooltip/index.tsx","../../src/widgets/map/styles.jsx","../../src/widgets/map/map.jsx","../../src/utilities/utils.ts","../../src/widgets/map/helpers.jsx","../../src/widgets/map/legend.jsx","../../src/widgets/map/index.jsx","../../src/components/dropdowns/propertyCheckBox.js","../../src/components/selectors/booleanSelector.js","../../src/widgets/usMap/config.jsx","../../src/widgets/usMap/wrapper.jsx","../../src/widgets/usMap/knobs.jsx","../../src/widgets/worldMap/knobs.jsx","../../src/widgets/worldMap/config.jsx","../../src/widgets/worldMap/wrapper.jsx","../../src/interfaces/NameValue.ts","../../src/widgets/donutGraph/DonutGraph.tsx","../../src/components/legendV2/LegendItem.tsx","../../src/hooks/useDimensions.ts","../../src/components/legendV2/FittingBox.tsx","../../src/components/legendV2/Paginator.tsx","../../src/components/legendV2/LegendRightClickMenu.tsx","../../src/components/legendV2/index.tsx","../../src/views/common/WidgetControls/context.tsx","../../src/views/curatedViews/Filter.tsx","../../src/components/legendV2/LegendPopOver.tsx","../../src/components/legendV2/LegendTitle.tsx","../../src/views/common/WidgetControls/ControlsContainer.tsx","../../src/views/common/WidgetControls/reducer.tsx","../../src/views/common/WidgetControls/index.tsx","../../src/components/dropdowns/limitDropdown.js","../../src/components/selectors/limitSelector.jsx","../../src/components/dropdowns/dropdown.js","../../src/components/selectors/colorSelector.js","../../src/components/selectors/endpointPropertySelector.js","../../src/components/selectors/endpointParameterSelector.js","../../src/views/common/commonKnobsContainer.jsx","../../src/components/selectors/colorByValuesSelector.jsx","../../src/widgets/donutGraph/knobs.jsx","../../src/widgets/donutGraph/config.jsx","../../src/widgets/donutGraph/wrapper.jsx","../../src/widgets/circlePack/index.js","../../src/widgets/circlePack/knobs.js","../../src/widgets/circlePack/config.js","../../src/widgets/circlePack/wrapper.js","../../src/widgets/customCirclePack/customPackKnobs.js","../../src/widgets/customCirclePack/customPackConfig.js","../../src/widgets/customCirclePack/customPackWrapper.js","../../src/components/colorUtils.js","../../src/widgets/table/Table.tsx","../../src/components/selectors/multiPropertyCheckboxSelector.tsx","../../src/widgets/table/config.jsx","../../src/widgets/table/knobs.jsx","../../src/widgets/table/wrapper.tsx","../../src/widgets/typograph/forces.js","../../src/widgets/typograph/forceUtils.js","../../src/widgets/typograph/index.jsx","../../src/widgets/typograph/knobs.tsx","../../src/widgets/typograph/actions.jsx","../../src/widgets/typograph/config.jsx","../../src/widgets/typograph/wrapper.jsx","../../src/widgets/stackedBarChart/utils.ts","../../src/widgets/stackedBarChart/wrappedBand.ts","../../src/widgets/stackedBarChart/vChart.jsx","../../src/widgets/stackedBarChart/hChart.jsx","../../src/components/virtualTooltip/useVirtualTooltip.tsx","../../src/hooks/useOrientedChart.tsx","../../src/components/virtualTooltip/renderers.tsx","../../src/widgets/stackedBarChart/index.tsx","../../src/components/selectors/useWidgetParameter.js","../../src/components/selectors/widgetParameterSelector.js","../../src/components/selectors/widgetBooleanSelector.js","../../src/components/selectors/endpointSortListSelector.js","../../src/widgets/stackedBarChart/config.ts","../../src/widgets/stackedBarChart/wrapper.tsx","../../src/widgets/stackedBarChart/knobs.jsx","../../src/utilities/srs-timeline-library/timeline.tsx","../../src/utilities/srs-timeline-library/bar.tsx","../../src/hooks/useReactTooltipsOnD3.tsx","../../src/widgets/timeline/timelineTooltips.tsx","../../src/widgets/timeline/index.tsx","../../src/widgets/timeline/wrapper.jsx","../../src/widgets/timeline/knobs.jsx","../../src/widgets/timeline/config.jsx","../../src/widgets/polarArea/chart.js","../../src/hooks/useChart.ts","../../src/widgets/polarArea/index.tsx","../../src/widgets/polarArea/knobs.jsx","../../src/widgets/polarArea/config.ts","../../src/widgets/polarArea/wrapper.tsx","../../src/widgets/metrics/index.jsx","../../src/widgets/metrics/knobs.jsx","../../src/widgets/metrics/config.jsx","../../src/widgets/metrics/wrapper.jsx","../../src/widgets/donutGraph/multiWrapper.jsx","../../src/widgets/donutGraph/multiConfig.ts","../../src/widgets/donutGraph/multiKnobs.jsx","../../src/widgets/lineChart/chart.js","../../src/widgets/lineChart/lineChartTooltips.tsx","../../src/widgets/lineChart/index.jsx","../../src/widgets/lineChart/knobs.jsx","../../src/widgets/lineChart/config.jsx","../../src/widgets/lineChart/wrapper.tsx","../../src/widgets/earthMap/constants/mapConstants.tsx","../../src/widgets/earthMap/constants/circleColors.ts","../../src/widgets/earthMap/contexts/mapContext.tsx","../../src/widgets/earthMap/hooks/useMin.tsx","../../src/widgets/earthMap/hooks/useMax.tsx","../../src/widgets/earthMap/constants/emptyFeatureCollection.tsx","../../src/widgets/earthMap/constants/layerNames.ts","../../src/widgets/earthMap/hooks/clustered/useIsVisible.tsx","../../src/widgets/earthMap/constants/clusteredPointsLayerOrder.tsx","../../src/widgets/earthMap/helpers/getClusteredPointsParentLayer.tsx","../../src/widgets/earthMap/hooks/circles/useCircleOpacity.tsx","../../src/widgets/earthMap/constants/circleSizes.ts","../../src/widgets/earthMap/hooks/clustered/usePoints.tsx","../../src/widgets/earthMap/hooks/clustered/useClusterRadius.tsx","../../src/widgets/earthMap/hooks/clustered/useClusterColor.tsx","../../src/widgets/earthMap/hooks/clustered/useClusters.tsx","../../src/widgets/earthMap/hooks/separated/useIsVisible.tsx","../../src/widgets/earthMap/hooks/circles/useCircleColor.tsx","../../src/widgets/earthMap/hooks/circles/useCircleRadius.tsx","../../src/widgets/earthMap/constants/separatedPointsLayerOrder.tsx","../../src/widgets/earthMap/helpers/getSeparatedPointsParentLayer.tsx","../../src/widgets/earthMap/hooks/separated/useSeparatedPoints.tsx","../../src/widgets/earthMap/hooks/separated/hover/useHoverEvent.tsx","../../src/widgets/earthMap/hooks/separated/hover/useHoverOpacity.tsx","../../src/widgets/earthMap/hooks/separated/hover/useSeparatedHoverPoints.tsx","../../src/widgets/earthMap/components/Space/index.tsx","../../src/widgets/earthMap/components/Line/index.tsx","../../src/widgets/earthMap/components/EarthMapWidget/EarthMapModal/index.tsx","../../src/widgets/earthMap/hooks/clustered/hover/hoveredClusterPoints/useHoveredClusterPoints.tsx","../../src/widgets/earthMap/hooks/clustered/hover/hoveredClusters/useHoveredClusters.tsx","../../src/widgets/earthMap/hooks/clustered/hover/hoveredClusters/useHoverEvent.tsx","../../src/widgets/earthMap/components/EarthMapWidget/EarthMapLegend/index.tsx","../../src/widgets/earthMap/components/EarthMapWidget/ClusterModal/index.tsx","../../src/widgets/earthMap/components/EarthMapWidget/FitToBoundsButton/index.tsx","../../src/widgets/earthMap/components/EarthMapWidget/index.tsx","../../src/widgets/earthMap/hooks/useWidgetConfigurationHandler.tsx","../../src/widgets/earthMap/hooks/useSizeProperty.tsx","../../src/widgets/earthMap/hooks/useMap.tsx","../../src/widgets/earthMap/hooks/clustered/useSource.tsx","../../src/widgets/earthMap/hooks/separated/useSaperatedSource.tsx","../../src/widgets/earthMap/hooks/useData.tsx","../../src/components/selectors/endpointPropertyArraySelector.js","../../src/widgets/earthMap/config.jsx","../../src/widgets/earthMap/components/EarthMapWrapper/index.tsx","../../src/widgets/earthMap/components/EarthMapKnobs/index.jsx","../../src/widgets/matrix/index.tsx","../../src/widgets/matrix/utils.jsx","../../src/widgets/matrix/config.jsx","../../src/widgets/matrix/wrapper.tsx","../../src/widgets/matrix/knobs.jsx","../../src/utilities/formatters.tsx","../../src/widgets/treemap/treeNode.jsx","../../src/widgets/treemap/useColorHeirarchy.ts","../../src/styles/variables-slykit.ts","../../src/utilities/usageStats.ts","../../src/widgets/treemap/index.jsx","../../src/widgets/treemap/config.jsx","../../src/widgets/treemap/wrapper.jsx","../../src/widgets/treemap/knobs.jsx","../../src/widgets/nodeLink/chart.js","../../src/widgets/nodeLink/index.tsx","../../src/widgets/nodeLink/wrapper.tsx","../../src/widgets/nodeLink/edgeGraphKnobs.jsx","../../src/widgets/nodeLink/edgeGraphConfig.ts","../../src/widgets/nodeLink/clusterGraphConfig.ts","../../src/widgets/nodeLink/clusterGraphKnobs.jsx","../../src/widgets/nodeLink/nodeGraphConfig.ts","../../src/widgets/nodeLink/nodeGraphKnobs.jsx","../../src/widgets/choroplethMap/constants/mapModes.ts","../../src/widgets/choroplethMap/contexts/mapContext.tsx","../../src/widgets/choroplethMap/constants/colors.ts","../../src/widgets/choroplethMap/contexts/choroplethContext.tsx","../../src/widgets/choroplethMap/constants/mapConstants.tsx","../../src/widgets/choroplethMap/constants/choroplethConstants.ts","../../src/widgets/choroplethMap/constants/layerNames.ts","../../src/widgets/choroplethMap/constants/layerOrder.ts","../../src/widgets/choroplethMap/helpers/getChoroplethParentLayer.ts","../../src/widgets/choroplethMap/hooks/choropleth/usePolygonLayer.tsx","../../src/widgets/choroplethMap/hooks/choropleth/usePolygonHover.tsx","../../src/widgets/choroplethMap/hooks/choropleth/useIsVisible.tsx","../../src/widgets/choroplethMap/hooks/choropleth/useChoroplethFillColor.tsx","../../src/widgets/choroplethMap/hooks/choropleth/useOutlineLayer.tsx","../../src/widgets/choroplethMap/hooks/choropleth/useChoroplethHooks.tsx","../../src/widgets/choroplethMap/hooks/choropleth/useChoroplethSource.tsx","../../src/widgets/choroplethMap/components/Space/index.tsx","../../src/widgets/choroplethMap/components/Line/index.tsx","../../src/widgets/choroplethMap/components/ChoroplethMapWidget/Modal/index.tsx","../../src/widgets/choroplethMap/helpers/numberFormatters/commaSeperate.ts","../../src/widgets/choroplethMap/components/ChoroplethMapWidget/Legend/index.tsx","../../src/widgets/choroplethMap/components/ChoroplethMapWidget/index.tsx","../../src/widgets/choroplethMap/hooks/useSizeProperty.tsx","../../src/widgets/choroplethMap/hooks/useMap.tsx","../../src/widgets/choroplethMap/components/ChoroplethMapKnobs/index.jsx","../../src/widgets/choroplethMap/config.jsx","../../src/widgets/choroplethMap/components/ChoroplethMapWrapper/index.tsx","../../src/widgets/wordCloud/util.ts","../../src/widgets/wordCloud/chart.ts","../../src/widgets/wordCloud/index.tsx","../../src/widgets/wordCloud/knobs.jsx","../../src/widgets/index.ts","../../src/widgets/wordCloud/config.tsx","../../src/widgets/wordCloud/wrapper.tsx","../../src/widgets/meter/helpers/getAngleConversions.tsx","../../src/widgets/meter/components/MeterArc.tsx","../../src/widgets/meter/components/MeterNeedle.tsx","../../src/widgets/meter/Meter.tsx","../../src/widgets/meter/config.tsx","../../src/widgets/meter/wrapper.tsx","../../src/widgets/meter/knobs.tsx","../../src/hooks/useAsyncCallback.ts","../../src/hooks/useFacetsState.ts","../../src/types.ts","../../src/views/filterHub/utils.js","../../src/styles/styledComponentUtils.ts","../../src/views/explorer/cardContext.ts","../../src/views/common/widgetContainer.jsx","../../src/components/errorBoundary.tsx","../../src/views/dashboard/dashboardCard.jsx","../../src/components/selectors/datasetSelector.js","../../src/hooks/savedViews/types.ts","../../src/views/explorer/layoutOptions.js","../../src/components/dropdowns/chartDropdown.tsx","../../src/components/dialogs/index.js","../../src/hooks/savedViews/helpers.ts","../../src/hooks/savedViews/actions.ts","../../src/hooks/savedViews/hooks.ts","../../src/hooks/useApplicationState.ts","../../src/views/save/saveCurrentView.js","../../src/hooks/useFetchEndpointData.ts","../../src/views/explorer/explorerCard.jsx","../../src/views/explorer/settingsDialog.jsx","../../src/components/selectors/savedViewSelector.jsx","../../src/views/explorer/cardWrapper.jsx","../../src/views/explorer/explorerLayoutManager.jsx","../../src/utilities/srs-timeline-library/timelineUseContext.tsx","../../src/utilities/srs-timeline-library/keyframe/KeyframeCreator.jsx","../../src/views/timeline/timeline.tsx","../../src/utilities/srs-timeline-library/keyframe/index.tsx","../../src/utilities/readOnlyOverrides.ts","../../src/views/timeline/temporalSelector.tsx","../../src/views/timeline/timelineWrapper.tsx","../../src/views/export/index.js","../../src/components/selectors/layoutSelector.jsx","../../src/views/savedViews/styles.js","../../src/views/viewSettings/viewSettingsDropDown.jsx","../../src/views/viewSettings/index.js","../../src/views/filters/index.js","../../src/views/search/index.tsx","../../src/utilities/parseInferredType.ts","../../src/views/filterHub/facetSearch.jsx","../../src/components/facets/facetCheckbox.jsx","../../src/components/facets/small-cross.svg","../../src/components/setOfTotal.tsx","../../src/views/documentViewer/textMarkup.jsx","../../src/views/documentViewer/textHighlighter.tsx","../../src/views/documentViewer/documentContent.tsx","../../src/components/sortSelect.tsx","../../src/components/externalLink.tsx","../../src/views/documentViewer/documentHeader.tsx","../../src/components/scrollBox.tsx","../../src/views/documentViewer/documentViewer.tsx","../../src/components/facets/facetItem.jsx","../../src/views/filterHub/facet/facetDetail.jsx","../../src/components/facets/facetGroup.jsx","../../src/views/filterHub/facetVars.ts","../../src/components/facets/emptyFacetsMessage.jsx","../../src/views/filterHub/facet/facetPreview.jsx","../../src/components/facets/facetHeader.jsx","../../src/views/filterHub/facet/facetPanel.jsx","../../src/views/filterHub/hierarchicalFacet/expandedStateManager.tsx","../../src/views/filterHub/hierarchicalFacet/hierarchicalFacetDetail.jsx","../../src/views/filterHub/hierarchicalFacet/hierarchicalFacetPreview.jsx","../../src/views/filterHub/hierarchicalFacet/hierarchicalFacetPanel.jsx","../../src/hooks/useFilters.tsx","../../src/views/filterHub/mainPanel.jsx","../../src/views/filterHub/index.jsx","../../src/components/loadingIcon/fullPageLoader.tsx","../../src/views/workspace/index.js","../../src/hooks/useFetchRootResult.ts","../../src/views/screen/index.js","../../src/views/explorer/utils/recordsExplorer.js","../../src/views/explorer/utils/styles.js","../../src/views/explorer/utils/documentsExplorer.js","../../src/views/explorer/utils/singleRecordsExplorer.js","../../src/views/list/infiniteScrollingList.tsx","../../src/hooks/useFetchValues.ts","../../src/views/list/documentsList.tsx","../../src/views/savedViews/header.js","../../src/views/savedViews/metaDataSideBar.js","../../src/views/savedViews/miniExplorer.js","../../src/views/savedViews/dialogs/addDescriptionDialog.jsx","../../src/views/savedViews/renderWidget.js","../../src/views/savedViews/editDashboard.js","../../src/views/savedViews/renderDashboard.js","../../src/views/savedViews/savedExplorer.js","../../src/views/savedViews/sidePanels.js","../../src/views/savedViews/index.js","../../src/views/screen/screenCard.jsx","../../src/views/srsStatus/index.tsx","../../src/views/datasetManagement/uploadForm/ProgressBar.tsx","../../src/views/datasetManagement/uploadForm/Upload.tsx","../../src/views/datasetManagement/schemaEditor.tsx","../../src/views/datasetManagement/uploadForm/Schema.tsx","../../src/views/datasetManagement/uploadForm/Complete.tsx","../../src/views/datasetManagement/DataImport.tsx","../../src/views/datasetManagement/sidePanel.tsx","../../src/views/datasetManagement/index.tsx","../../src/views/curatedViews/CuratedViewContainer.tsx","../../src/views/curatedViews/InfoTooltip.tsx","../../src/views/curatedViews/UnderConstructionCard.tsx","../../src/views/curatedViews/SimpleList.tsx","../../src/views/curatedViews/defaultLanding.tsx","../../src/views/curatedViews/SearchPageList.tsx","../../src/hooks/useSlykit.ts","../../src/utilities/configFetcher.tsx","../../src/components/starRating/stars.jsx","../../src/components/legend/index.js","../../src/components/browserChecker.tsx","../../src/components/multiselect/popup.js","../../src/components/multiselect/index.js","widgets/innovation/forceUtils.js","widgets/innovation/index.jsx","widgets/innovation/knobs.jsx","widgets/innovation/config.jsx","widgets/innovation/wrapper.jsx","hooks/useLoadApplicationSpecificStateLocal.js","styles/styledComponentUtils.js","views/navigation/index.js","views/explorer/PlatipusList.js","views/explorer/PlatipusExplorer.js","app.js","../../src/hooks/useFocusedSessionPolling.ts","index.js"],"names":["module","exports","SlykitContext","createContext","WorkspaceContext","ColorScalesContext","this","throwEmptyResult","originalFunction","result","newResult","returnEmptyResultError","originalReturn","data","loading","error","EmptyResultError","timeline","propertyList","parameters","selectPropertyListFromDilByNames","dilName","facets","ignoreParentResult","resultWithoutParent","generateFacets","dil","paraCord","textClusters","maxClusters","graph","_b","metadata","otherParams","fullMetadata","generateGraph","nodeGraph","generateNodeGraph","clusterGraph","generateClusterGraph","geopoints","generateGeoJson","options","propertyHierarchy","_d","maxRoot","aggregationProperty","distinctProperty","filteredProperties","generatePropertyHierarchy","handlePropertySelection","matrix","_c","generateMatrix","hierarchicalFacets","path","property","values","columns","_e","_f","startEndProps","MaxValues","startIndex","endIndex","fullSortProperty","listValues","sortProperty","properties","duplicateProperties","index","element","resultId","post","systemDefinitionId","name","choropleth","metadataPropertyNames","enableCaching","stackedTimeline","stackProperty","DefaultChartColorScales","DefaultCategoricalColors","categoricalColorCache","categoricalColorIndex","useDefaultColors","appSpecificColors","useMemo","defaultColors","setUpColorScale","Categorical","Sequential","type","scale","config","Object","widgetId","scalesConfig","coll","scaleId","scaleConfig","Array","c2","v","all","scoped","handleCategorical","default","handleDefault","console","scaleLinear","handleSequential","scaleQuantile","keys","extent","handleQuantile","orderedKeys","parseFloat","handleRange","Error","handleDirect","filters","ColorScaleCommandHandler","scaleToUse","execute","widgetToUse","getAvailableScales","scales","hasOwnProperty","next","availScales","h","scalesToKeep","__extends","loadingStyles","loadingIconContainer","css","LoadingIcon","jsx","className","Spinner","intent","Intent","PRIMARY","size","PropTypes","func","Colors","BLACK","DARK_GRAY1","DARK_GRAY2","DARK_GRAY3","DARK_GRAY4","DARK_GRAY5","GRAY1","GRAY2","GRAY3","GRAY4","GRAY5","LIGHT_GRAY1","LIGHT_GRAY2","LIGHT_GRAY3","LIGHT_GRAY4","LIGHT_GRAY5","WHITE","BLUE1","BLUE2","BLUE3","BLUE4","BLUE5","GREEN1","GREEN2","GREEN3","GREEN4","GREEN5","ORANGE1","ORANGE2","ORANGE3","ORANGE4","ORANGE5","RED1","RED2","RED3","RED4","RED5","VERMILION1","VERMILION2","VERMILION3","VERMILION4","VERMILION5","ROSE1","ROSE2","ROSE3","ROSE4","ROSE5","VIOLET1","VIOLET2","VIOLET3","VIOLET4","VIOLET5","INDIGO1","INDIGO2","INDIGO3","INDIGO4","INDIGO5","COBALT1","COBALT2","COBALT3","COBALT4","COBALT5","TURQUOISE1","TURQUOISE2","TURQUOISE3","TURQUOISE4","TURQUOISE5","FOREST1","FOREST2","FOREST3","FOREST4","FOREST5","LIME1","LIME2","LIME3","LIME4","LIME5","GOLD1","GOLD2","GOLD3","GOLD4","GOLD5","SEPIA1","SEPIA2","SEPIA3","SEPIA4","SEPIA5","ColorAliases","PT_INTENT_PRIMARY","PT_INTENT_SUCCESS","PT_INTENT_WARNING","PT_INTENT_DANGER","PT_APP_BACKGROUND_COLOR","PT_DARK_APP_BACKGROUND_COLOR","PT_OUTLINE_COLOR","PT_TEXT_COLOR","PT_TEXT_COLOR_MUTED","PT_TEXT_COLOR_DISABLED","PT_HEADING_COLOR","PT_LINK_COLOR","PT_DARK_TEXT_COLOR","PT_DARK_TEXT_COLOR_MUTED","PT_DARK_TEXT_COLOR_DISABLED","PT_DARK_HEADING_COLOR","PT_DARK_LINK_COLOR","PT_TEXT_SELECTION_COLOR","PT_ICON_COLOR","PT_ICON_COLOR_HOVER","PT_ICON_COLOR_DISABLED","PT_ICON_COLOR_SELECTED","PT_DARK_ICON_COLOR","PT_DARK_ICON_COLOR_HOVER","PT_DARK_ICON_COLOR_DISABLED","PT_DARK_ICON_COLOR_SELECTED","PT_DIVIDER_BLACK","PT_DARK_DIVIDER_BLACK","PT_DARK_DIVIDER_WHITE","PT_CODE_TEXT_COLOR","PT_DARK_CODE_TEXT_COLOR","PT_CODE_BACKGROUND_COLOR","PT_DARK_CODE_BACKGROUND_COLOR","Variables","PT_GRID_SIZE","PT_FONT_FAMILY","PT_FONT_FAMILY_MONOSPACE","PT_FONT_SIZE","PT_FONT_SIZE_LARGE","PT_FONT_SIZE_SMALL","PT_LINE_HEIGHT","ICONS16_FAMILY","ICONS20_FAMILY","PT_ICON_SIZE_STANDARD","PT_ICON_SIZE_LARGE","PT_BORDER_RADIUS","PT_BUTTON_HEIGHT","PT_BUTTON_HEIGHT_SMALL","PT_BUTTON_HEIGHT_SMALLER","PT_BUTTON_HEIGHT_LARGE","PT_INPUT_HEIGHT","PT_INPUT_HEIGHT_LARGE","PT_INPUT_HEIGHT_SMALL","PT_NAVBAR_HEIGHT","PT_Z_INDEX_BASE","PT_Z_INDEX_CONTENT","PT_Z_INDEX_OVERLAY","PT_BORDER_SHADOW_OPACITY","PT_DROP_SHADOW_OPACITY","PT_DARK_BORDER_SHADOW_OPACITY","PT_DARK_DROP_SHADOW_OPACITY","PT_ELEVATION_SHADOW_0","PT_ELEVATION_SHADOW_1","PT_ELEVATION_SHADOW_2","PT_ELEVATION_SHADOW_3","PT_ELEVATION_SHADOW_4","PT_DARK_ELEVATION_SHADOW_0","PT_DARK_ELEVATION_SHADOW_1","PT_DARK_ELEVATION_SHADOW_2","PT_DARK_ELEVATION_SHADOW_3","PT_DARK_ELEVATION_SHADOW_4","PT_TRANSITION_EASE","PT_TRANSITION_EASE_BOUNCE","PT_TRANSITION_DURATION","PT_INPUT_BOX_SHADOW","PT_DIALOG_BOX_SHADOW","PT_POPOVER_BOX_SHADOW","PT_TOOLTIP_BOX_SHADOW","PT_DARK_INPUT_BOX_SHADOW","PT_DARK_DIALOG_BOX_SHADOW","PT_DARK_POPOVER_BOX_SHADOW","PT_DARK_TOOLTIP_BOX_SHADOW","LoginScreen","Title","authenticate","useState","userName","setUserName","password","setPassword","localError","setLocalError","localLoading","setLocalLoading","useEffect","onClick","container","src","projectLogo","alt","projectLogoStyle","defaultLogoStyle","login","titleStyle","Loading","LocalError","UserPass","onKeyDown","event","anonymous","userpass","failedStyle","message","Button","DANGER","fill","InputGroup","Classes","FILL","leftIcon","onChange","placeholder","value","autoFocus","disabled","TestWidget","dimensions","backgroundColor","width","height","style","background","details","x","Math","y","fontSize","color","d3","i","rotate","key","transform","textAnchor","dominantBaseline","formatValueScientificNotation","numeral","formatValue","isString","Number","isValid","d","isNaN","convertToStacks","keySet","entries","e","label","entry","child","rolled","sum","AGGREGATION_METHOD_VALUES","SORT_VALUES","ORIENTATION_VALUES","SORT_DIRECTIONS","SCALING_FUNCTIONS","f","log","sqrt","FONT_FAMILIES","NO_DATA_MESSAGE","context","document","canvas","fitLabelWidth","fontFace","checkWidth","self","select","text","textLength","filterItem","query","facet","_index","exactMatch","normalizedTitle","normalizedQuery","textItemRenderer","optionToString","handleClick","modifiers","MenuItem","active","item","textItemStyles","ObjectDropdown","optionsToString","activeItem","onSelectionChanged","customRender","rest","Select","items","itemPredicate","itemRenderer","noResults","onItemSelect","popoverProps","minimal","rightIcon","emptyText","CommonDropdownWithLabel","btnText","labelCss","dropDownCss","MINIMAL","selectBtnCss","bool","VARIABLES","filterProperties","selectedDefinitionName","flags","types","allowedProperties","outFlags","outTypes","allProperties","selectDilDefinitionByName","prop","flagged","flag","outFlagged","typed","useFilteredProperties","getPropertyListFromDil","DIL","nullableProperty","propertyId","toProperty","selectedDefinition","isNullable","toCheck","name_1","find","PropertyDropdown","changeHandler","useCallback","createDefaultCard","cardIndex","widgets","widget","createDefaultCardForType","card","endpointQuery","widgetConfiguration","widgetConfigurations","reducer","produce","action","WorkspaceActions","explorer","layoutStyle","cardCount","draft","newDefinition","newDefinition_1","c","rootResult","payload","cards","newCard","configuration","payload_1","actions","filterKey","filter","callback","currentFilters","queryString","Date","initialState","layout","views","transient","activeResult","refreshTime","queryStrings","selection","CREATE_NEW_EXPLORER","UPDATE_SELECTED_DEFINITION","UPDATE_RESULT","SET_CURRENT_EXPLORER","FORCE_REFRESH","UPDATE_EXPLORER_CARD","UPDATE_EXPLORER_CARD_WIDGET","UPDATE_EXPLORER_LAYOUT","MAXIMIZE_WIDGET","UPDATE_EXPLORER_CARD_ENDPOINT_OPTIONS","UPDATE_EXPLORER_CARD_ACTIONS","PATCH_EXPLORER_CARD_ENDPOINT_PARAMETERS","UPDATE_WIDGET_CONFIGURATION","UPDATE_FILTER","UPDATE_FILTER_CALLBACK","UPDATE_TRANSIENT_FILTER","UPDATE_QUERY_STRING","LOAD_SAVED_VIEW","LOAD_EMPTY_WIDGET","UPDATE_VIEW_PROPERTIES","UPDATE_WIDGETS","UPDATE_META_DATA","UPDATE_SELECTION","WorkspaceActionCreator","savedStates","parameterPatch","metaData","PropertyListSelector","itemIndex","useContext","dispatch","newEndpointQuery","JSON","icon","wrapper","title","convertedData","map","description","noDataMessage","endpoint","Knobs","React","Fragment","SrsPropertyFlag","createDefaultOptions","ParaCord","onSelect","svgRef","useRef","linkGroupRef","axisGroupRef","containerRef","selectionRef","nodes","links","nodesRef","xMargin","yMargin","propertyOrder","axisX","axisY","procProperties","p","count","node","j","selected","link","n","s","linkLine","l","tgt","t","nodeLinkTest","nodeInSelection","node2","node1","setLinkStrokeOpacity","filtered","createNodes","d3selection","nodeGroup","pick","tempNodes","test","handleNodeClick","hoverNode","Set","toTest","textGroup","truncString","upperLeft","g","enter","update","exit","ref","str","max","add","colorScaleType","object","stableDummyDispatch","rawData","propertyIndex","propertyKey","valueIndex","createLinks","srcValue","tgtValue","source","target","full","maxLinkCount","draggableStyles","itemContainer","itemStyles","itemButton","DraggableItem","handleReorder","toggleSelected","id","drop","useDrop","accept","ItemTypes","hover","monitor","dragIndex","hoverIndex","hoverBoundingRect","hoverMiddleY","hoverClientY","clientOffset","useDrag","collect","isDragging","opacity","drag","Container","props","renderDraggableItem","findIcon","iconName","getPath","Icon","_a","SvgIcon","iconSize","viewBox","includeTitle","getIconLabel","BPIcon","multiselectStyles","cardWrapper","selectCard","centerSection","middleButton","itemTitle","convertToArrayOfObjects","array","uuidv4","onSubmit","initialUnselected","initialSelected","itemsAsObjects","initialSelectedAsObjects","initialUnselectedAsObjects","setSelected","unselected","setUnselected","moveSelected","dragItem","$splice","draggingIndex","hoveringIndex","moveUnselected","containerCss","selectionColumnCss","DndProvider","backend","Backend","DraggableContainer","newValue","buttonColumnCss","selectedToReturn","unselectedToReturn","updateFilter","updateQueryString","SrsPropertyType","setConvertedData","SKELETON","Tabs","Tab","panel","CustomMultiSelect","newColumns","minimumItems","Actions","paracordFilter","isEmpty","$or","$and","newFilter_1","maxValues","useTooltip","popperProps","activeTooltip","setActiveTooltip","activeRef","setActiveRef","referenceElement","placement","arrowProps","zIndex","onMouseOver","onMouseOut","MetaDataViewer","content","H6","formattedItem","moment","tooltipStyle","ChartTooltip","dateFormatter","children","Card","elevation","Elevation","THREE","mapStyles","animation","legendStyles","labelContainer","tick","gradient","MapChart","shapes","dataMapper","projection","colorScale","center","legend","toolTip","setupTrigger","isTooltipEnabled","setIsTooltipEnabled","zoom","setZoom","animationClass","setAnimationClass","defaultColorScale","fillColorScale","onMouseDown","onMouseUp","onWheel","prev","ComposableMap","ZoomableGroup","minZoom","Geographies","geography","geographies","geo","current","Geography","rsmKey","onMouseEnter","stroke","strokeWidth","outline","pressed","Count","dc","fillColor","Annotation","subject","dx","dy","num","paddingRange","any","intersectsAny","list","intersectRect","r1","r2","formatDataAsMap","map_1","Legend","maxValue","xScale","ticks","removeFractionalTicks","positionStyles","readableColor","backgroundImage","USMap","showLegend","Map","usStates","WorldMap","worldMap","PropertyCheckBox","checked","propertyStyle","Checkbox","startColor","endColor","BooleanSelector","propertyName","returnValue","createDefaultConfiguration","sumValuesReducer","runningTotal","nameValue","DonutGraph","getColor","centerText","radius","colorByValue","hideLabels","hyperLink","diameter","showLabels","sliceLabelWidth","donutRef","colorByValueRef","getColorRef","dataCache","mapColor","useHistory","filteredData","totalRecords","createSliceArc","createArc","createLabelArc","createPercentLabelArc","createLineInsertionArc","pieData","createPie","prevPieData","getDataPercentageText","hoveredData","detailText","vizRef","initialDatum","startAngle","endAngle","padAngle","interpolator","group","labelPositionList","posA","posB","posC","midangle","getPieSliceMidangle","pos","parsedKey","window","bbox","rectangle","centerTextFontSize","centerGroup","detailsTextFontSize","innerRadiusPercent","centerLabel","refSelection","donutCss","nameValuePair","innerRadius","outerRadius","percentageText","isHovered","LegendItem","forwardRef","mouseOver","mouseOut","enabled","_onClick","legendItemStyle","colorBoxStyle","IconNames","DISABLE","useDimensions","includeMargin","setDimensions","resizeObserverRef","computedStyles","marginWidth","pxStrToNum","marginHeight","pxStr","FittingBox","firstChildRef","iCanFit","childHeight","myRef","myHeight","thisManyChildren","fittingBoxCss","Paginator","childrenProps","ChildRenderFunc","pageStart","pageEnd","setPageIndices","maxNumPerPage","setMaxNumPerPage","numPerEdgePage","numPerMiddlePage","setNumsPerPage","pageNum","setPageNum","numPages","setNumPages","onlyOnePage","firstPage","lastPage","middlePage","nextPage","prevPage","moreIcon","ICON_SIZE","IconCss","ICON_COLOR","nextPageButton","marginTop","buttonCss","prevPageButton","marginBottom","childrenToShow","childProps","undefined","numFitCallback","lowerHeightBy","LegendRightClickMenu","Menu","keyValues","sizeStyle","sm","smallStyle","lg","largeStyle","dataTyped","hasLabels","legendItemsProps","rightClickMenu","ContextMenu2","legendContainerStyle","childRenderFunc","legendStyle","interactiveStyle","legendWidthStyle","legendRemWidth","mediumStyle","defaultContextValue","state","WidgetControlsContext","Filter","selectedItem","filterStyle","Popover2","k","Option","TIME","CARET_DOWN","LegendPopOver","legendItemProps","popOverContent","popoverCss","interactionKind","LegendTitle","legendTitleCss","ControlsContainer","toggleLabels","filterOptions","enableLabelsToggle","controlsContainerCss","EYE_OPEN","widgetControlsReducer","disableAllKeys","enableAllKeys","toggleKey","status","setLabelsToggleBtnStatus","allKeys","newPayload","setLegend","setFilterProps","setLegendItemProps","getKeySetter","setTo","WidgetControls","curatedViewMode","initContext","useReducer","contextState","onLegendItemClick","Provider","widgetControlsCss","useWidgetControlsContext","getLabel","LIMIT_TYPES","ItemRenderer","_options","LimitDropdown","activeLimit","onLimitChanged","option","filterable","limitDropdownStyles","getLimitValue","limitTo","autoLimitVal","noLimitVal","limitToUse","canRenderAuto","canRenderNoLimit","LimitSelector","_g","setLimitTo","dropdownProps","autoLimit","limitProperty","limit","Dropdown","colorOptions","ColorSelector","selectProperty","EndpointPropertySelector","handleSelectionChange","newVal","existingName","EndpointParameterSelector","defaultValue","activeName","optionToValue","CommonKnobsContainer","knobsContainer","ColorByValuesSelector","colorChain","disableBoolean","setBooleanDisabled","getColorScale","converted","reference","_widgetConfig","containerDimensions","initialLimit","CirclePack","visibleTextNodes","setVisibleTextNodes","textRefs","reduce","root","getValue","pack","circlePacker","nodePath","accumulator","getName","topLevelKeys","getKeyFromNode","checkIntersections","debounce","_visibleNodes","top","right","bottom","left","arr","aLeftOfB","n1","n2","aRightOfB","aAboveB","aBelowB","doesIntersect","_n","_setTextRef","AnimatePresence","startEndState","cx","cy","r","motion","circle","initial","animate","makeSafeForSVG","rgba","onAnimationComplete","Size","anyTypeOfNumber","showTopLabelsOnly","MaxChildren","pathDepth","parentPath","pathDelimiter","_filteredProperties","showAllLabels","maxChildren","maxChildren_options","listOfStrings","parseInt","lowRegex","midRegex","highRegex","criticalRegex","severityScale","unclassRegex","secretRegex","topSecretRegex","adjustHexOpacity","hexColorRegEx","Table","onSort","loadAdditionalRecords","sortBy","sortIsDescending","tableProps","minTableWidth","columnMargin","minColumnWidth","isInitialRender","setIsInitialRender","didAddScrollListener","setDidAddScrollListener","tableRef","headerEls","containerEls","gridEls","headerRenderer","dataKey","isSorted","readOnly","FaSortUp","FaSortDown","FaSort","TableContainer","baseColor","VirtualTable","rowGetter","rowStyle","onScroll","clientHeight","scrollHeight","scrollTop","columnOverride","columnOverrides","Column","columnName","minWidth","flexGrow","MultiPropertyCheckboxSelector","selectedColumnNames","setSelectedColumns","_onChange","numberOfSelectedColumns","rootCss","length","isChecked","indeterminate","overflow","allData","isInWorkspace","_l","tableData","setTableData","dataIsNew","setDataIsNew","shouldAppendData","setShouldAppendData","newTableData_1","currentIds_1","dataObject","documentId","rowHeight","headerHeight","rowCount","columnNames","descending","args","rectCollision","constant","strength","iterations","iterate","tree","sizes","mass","masses","xi","xCenter","yi","yCenter","quad","xSize","ySize","xd","yd","m","x0","y0","x1","y1","i_1","force","arguments","_","dragHook","simulation","TypographWidget","centroidGroupRef","termGroupRef","centroids","forces","setForces","centroidScale","setTick","setSimulation","useForceSimulation","zoomMin","useZoom","centroid","term","updateTransientFilter","renderFilter","Breadcrumb","Tag","summaryTerms","parent","colorIndex","parentId","updateProperties","_updateServer","_updateOption","newSelectedColumns","Breadcrumbs","breadcrumbRenderer","svg","onClear","SizingBehavior","wrappedBand","singleBandAtEnd","normalBand","band","scaleBand","hasSingleDomain","getBandSize","start","end","getSizeBehavior","bandSize","MAX_SINGLE_BAR_WIDTH","BAR_BORDER","untypedNewBand","rangeStart","rangeEnd","makeReturnWrapped","ret","newBand","margin","measureAxisText","getBBox","getMarginBottom","maxText","limitLength","VerticalBarChart","updateTooltip","navigateTo","initialized","yScale","yAxis","yAxisForTinyValues","xAxis","chartHasTinyValuesOnly","getYAxis","init","colorPropertyMap","alternateDataFormatter","hasLabelTooltips","_margin","_maxText","getHeight","xAxisTextLabels","currentText","dataHasLinks","x_1","y_1","data_1","subtitle","href","getComputedTextLength","retVal","bar","segment","parentBar","showBarLabels","clear","getMarginLeft","widgetWidth","HorizontalBarChart","xAxisForTinyValues","getXAxis","getWidth","yAxisTextLabels","position","Position","TOP_RIGHT","location","useVirtualTooltip","renderer","TooltipElement","display","pointerEvents","Tooltip","boundary","isOpen","targetTagName","SubtitleCountRenderer","digitLength","subtitleStyle","StackedBarChartWidget","o","controlsDispatch","controlsState","setFilteredData","filteredLines_1","newFilteredData","toReturn","orientation","VerticalChart","HorizontalChart","Chart","setChart","currentDirection","setCurrentDirection","localSelection","history","autoOrientation","local","createChart","updateSelection","ch","chartMethods","useOrientedChart","direction","chartStyle","identity","useWidgetParameter","valueFunction","WidgetParameterSelector","WidgetBooleanSelector","currentValue","toggleProperty","EndpointSortListSelector","valueMap","sort","sortIndex","activeValue","JoinMethod","maxNodes","sortList","showXAxis","showYAxis","showTotals","showValuesInBarStacks","limitAxisLabels","_axisPadding","TimelineContext","TimelineChart","srsHistogramData","marginProp","yDomainOverride","stacked","stackOrderNone","xAxisLabel","yAxisLabel","axisPadding","dataWidth","dataHeight","formatSRSTimeline","legendOffset","scaleUtc","first","last","predicate","maxY","axisBottom","axisLeft","chartColorScale","scaleOrdinal","chartContext","stackOrder","timelineBins","rootData","flatMap","bin","counts","topTenNonZeroValues","b","a","cur","acc","_Bars","createBars","category","widthScale","scaleLog","stackGen","obj","rootStackedSeries","filteredRoot","filterStack","activeData","activeStackedSeries","filteredActive","stack","Bars","memo","prevProps","nextProps","useReactTooltipsOnD3","itemSelector","toolTipMaker","toolTipOptions","getMouseEvents","TimelineTooltips","units","setItemSelector","Start","End","Duration","formatDistance","offset","Timeline","cropEmptyExtents","isStacked","styles","labels","TimelineGraphWrapper","bins","totalCount","TimelineGraphKnobs","maxBinResolution","maxMajorBinCount","maxMinorBinCount","stackedConfig","PolarAreaChart","arc","fullArc","labelArc","tooltipArc","outerRadiusMax","innerRadiusMin","midAngle","coordinates","parentNode","parentKey","_arc","angle","determinePositionForAngle","transformed","svgDocument","handleTooltip","deltaY","textBox","useChart","localChart","setLocalChart","PolarArea","Metrics","showFull","mainStyle","fullCount","nonZeroCount","entryStyle","previous","setPrevious","roughDimensions","StyledContainer","flex","gridTemplateColumns","gridTemplateRows","gridColumnGap","gridRowGap","padding","NonIdealState","labelPadding","LineChart","lineRenderer","getLongestValue","adjustment","maxLength","lineValues","nextIncrement","lines","increment","order","ceil","digits","LineChartToolTips","digitFormatter","format","X","Y","LineChartWidget","legendKeys","chart","lineKeys","chartContainerStyle","singleGroup","uniq","CIRCLE_COLORS","MapContext","MapProvider","setMap","mapRef","setData","setRawData","isClustered","setIsClustered","selectedFeatureProperty","setSelectedFeatureProperty","min","setMin","rtn","forEach","feature","useMin","setMax","useMax","hoveredFeature","setHoveredFeature","hoveredCluster","setHoveredCluster","colorInfo","setColorInfo","clusterColorInfo","setClusterColorInfo","difference","step","value_1","minValue","useMapContext","EMPTY_FEATURE_COLLECTION","features","LAYER_NAMES","useIsVisible","layerName","visibility","CLUSTERED_POINTS_LAYER_ORDER","getClusteredPointsParentLayer","useCircleOpacity","sourceName","LAYER_NAME","useClusterRadius","sortedColorInfo","MIN_CIRCLE_RADIUS","useClusterColor","useCircleColor","useCircleRadius","SEPARATED_POINTS_LAYER_ORDER","getSeparatedPointsParentLayer","useHoverEvent","onMouseMove","layers","minDistance","minFeature","cursorPoint","turf","point","distance","useHoverOpacity","Space","space","isVertical","Wrapper","Line","EarthMapModal","geometry","Row","SubTitle","Value","useHoveredClusters","paint","tickFormatter","EarthMapLegend","blockColor","info","TickLabel","InnerWrapper","VerticalSpace","HorizontalSpace","Tick","ColorBlock","ClusterModal","pointCount","setPointCount","setValue","FitToBoundsButton","bounds","setBounds","bounds_1","EarthMapWidget","useWidgetConfigurationHandler","useSizeProperty","mapboxgl","lng","lat","logoPosition","attributionControl","useMap","cluster","clusterProperties","generateId","useSource","useHoveredClusterPoints","useClusters","usePoints","useSeparatedSource","useSeparatedHoverPoints","useSeparatedPoints","aVal","bVal","useData","EndpointPropertyArraySelector","optionsKey","mapStyle","markerColor","fitToPoints","tileServer","mapboxAPIKey","MatrixWidget","cellRenderer","rowIndex","Cell","columnIndex","wrapText","interactive","numRows","selectionModes","SelectionModes","ALL","numFrozenRows","numFrozenColumns","enableRowHeader","enableMultipleSelection","col_header","MATRIX_SORT_ROWS","MATRIX_SORT_COLS","summary_cell_value","fill_in_zeros","found_entry","aggregationTypeRow","aggregationTypeCol","newMatrix","column_headers","col","row_key","row","formatDate","date","formatNumber","number","Node","focusedDepth","focusedNodeKey","colorsByKey","setFocusedNode","depth","sx0","sx1","sy0","showStats","isNodeHidden","isPrimary","isSecondaryNode","textContainerRef","isOverflowing","setIsOverflowing","detectOverflow","animationWait","isOverflow","getOverflow","useOverflowDetector","labelRef","countRef","scaleFont","labelEl","countEl","fontIndex","fontSizeOptions","labelEl_1","countEl_1","applyStyles","fontSizes","sleep","useScalingFont","handleAnimationComplete","div","transitionEnd","transition","from","ease","duration","leafStyles","statsWrapper","textStyles","primaryNodeStyles","labelStyle","countStyle","lightenNode","transparentize","animatedTextSTyles","secondaryNodeStyles","time","setTimeout","el","rootColors","brightnessModifiers","rootColorOffset","useColorHierarchy","hierarchy","setColorsByKey","colors","cloneDeep","generateChildrenColors","rawModifier","modifier","darken","Sizes","AppColors","Bg1","Bg2","Bg3","interactiveBg","interactiveBgHover","interactiveBgActive","interactiveBgSelected","shadowGradient","isUsageEndpointAvailable","sendUsageAction","actionName","hasPageLoadHappened","sendPageLoad","TreemapWidget","treemapProperty","setFocusedNodeReact","treemapWrapperRef","treeMapDimensions","clientWidth","leaves","focusedNode","newNode","$sw","topNode","setTopNode","filteredLeaves","breadcrumbItems","treemapRootStyles","breadcrumbWrapperStyles","breadcrumbLabel","treemapOutsideWrapperStyles","treemapInsideWrapperStyles","PropertyFlag","NodeLinkChart","zoomEvent","constantSize","savedDimensions","radiusScale","ticked","transformX","transformY","nodeList","localColorScale","fx","fy","_1","labels_1","getNeighboringNodes","getConnectedLinks","mouseOverNode","mouseOutNode","nodeSet","NodeLink","supportSelection","graphCss","NodeLinkWrapper","nodeDom","linkDom","existingNodes","connections","mdSizeKey","meta","mdSizeValue","sizeValue","existing","String","minConnections","sizeByConnection","MAP_MODES","DEFAULT_MODE","mapMode","setMapMode","COLORS","NO_VALUE_COLOR","ChoroplethContext","ChoroplethProvider","choroplethData","setChoroplethData","hoveredPolygon","setHoveredPolygon","choroplethColorInfo","setChoroplethColorInfo","choroplethColors","setChoroplethColors","choroplethOpacityValues","setChoroplethOpacityValues","TagId","useChoroplethContext","SOURCE_LAYERS","CHOROPLETH_STYLES","DEFAULT","HOVERED","UNHOVERED","LAYER_ORDER","getChoroplethParentLayer","usePolygonLayer","sourceLayer","minzoom","maxzoom","isListening","usePolygonHover","useChoroplethFillColor","useOutlineLayer","useChoroplethHooks","tiles","useChoroplethSource","Modal","latitude","setLatitude","longitude","setLongitude","tagId","commaSeparate","legendData","setLegendData","ChoroplethMapWidget","sources","wrapperStyle","fontSizingCanvas","createCanvas","require","getTextSizing","rotation","font","area","metrics","textHeight","textWidth","rotatedRectangleWidth","rotatedRectangleHeight","diagonalLength","radialRotation","constructedTriangleAngle","cloud","WordCloud","_makeLayout","myWords","rotationScale","configOptions","w","scalingFunc","sizeScale","_findScale","maxSize","standardScale","totalArea","maxWidth","maxHeight","word","textSizing","dimensionRatio","neededWidthByArea","neededWidth","heightRatio","widthRatio","sizeAdjustRatio","standardRangeMax","expectedWords","words","renderedWords","numTries","sizeRatio","endFunc","wordCloud","_draw","WordCloudWidget","setCloud","relSize","toValues","numOrientations","minRotate","maxRotate","minFontSize","degreesToRadians","deg","MeterArc","inner","outer","fullFill","reverse","score","segments","angleGen","ary","angles","arcGen","MeterNeedle","meterPercent","needleHeight","needleRadius","startRadians","spreadPercent","thetaRad","perc","percentToDegrees","percentToRadians","needleTopX","needleTopY","defaultArcConfig","arcRadii","delimitingDegreeAngles","defaultNeedleConfig","Meter","arcConfig","setArcConfig","needleConfig","setNeedleConfig","newArcConfig","newNeedleConfig","svgWidth","svgHeight","midArc","prevConfig","needlePosition","arcWidth","meterContainer","rangeLabel","dataLabel","dataNumber","WIDGET_TYPES","WIDGETS","BipartiteGraphConfig","CirclePackConfig","ClusterGraphConfig","CustomPackConfig","DonutGraphConfig","EarthMapConfig","ChoroplethMapConfig","LineChartConfig","MatrixConfig","MeterConfig","MetricsConfig","MultiDonutConfig","NetworkGraphConfig","ParaCordConfig","PolarAreaConfig","StackedBarConfig","StackedTimelineConfig","TestWidgetConfig","TableConfig","TimelineConfig","TreeMapConfig","TypographConfig","UsMapConfig","WorldMapConfig","WordCloudConfig","allWidgets","configurations","useAsyncCallback","dependencies","actionTypes","request","_canceled","Promise","isEqual","results","response","updateFilterCallback","getNullSafeFacets","facetsRaw","activeFacets","activeHierarchicalFacets","textFilter","FACET_STATE","useFacetsState","getActiveHierarchicalFacets","updateTextFilter","newFilter","addFacet","newActiveFacets","newState","propertyState","facetToAdd","addHierarchicalFacet","newActiveHierarchicalFacets","removeFacet","facetsItems","newFacets","omit","removeHierarchicalFacet","getFacetState","getHierarchicalFacetState","resetAllFacets","getActiveFacets","getTextFilter","loadFacets","toggleFacet","toggleHierarchicalFacet","toggleExcludeFacet","facetToExclude","toggleExcludeHierarchicalFacet","updateFacets","facetsToAdd","facetsToUpdate","updateHierarchicalFacets","hasSelectedChild","hasExcludedChild","FilterComparatorType","OperatorType","getQueryString","onValues","offValues","timeProperty","timeExtents","centerContent","alignedMinimalButtonRight","alignedMinimalButtonLeft","alignedMinimalButton","DividerFull","FlexSplitter","HeaderMd","clampLineCount","lineCount","lineHeight","overflowEllipsis","interactiveListItem","hoverRevealChildrenVisibility","hoverRevealChildrenDisplay","CardContext","WidgetContainer","WidgetWrapper","workspaceContext","cardContext","pauseUpdates","isSettingsDialogOpen","wrapperRef","isNonIdealState","loadingContainer","spreadContainer","_this","hasError","ErrorBoundary","otherProps","retryButtonText","resetError","LAYOUT_OPTIONS","ONE","TWO","TWO_VERTICAL","FOUR","SIX","WidgetRenderer","ChartDropdown","availableWidgets","Dialog","body","footer","BlueprintDialog","RouteLeavingGuard","when","shouldBlockNavigation","navigate","isModalVisible","setModalVisible","lastLocation","setLastLocation","isNavigationConfirmed","setIsNavigationConfirmed","closeModal","handleBlockedNavigation","showModal","handleConfirmNavigationClick","Prompt","onClose","DIALOG_BODY","DIALOG_FOOTER","outlined","transformExplorerCardToDashboard","dataConfiguration","endpointKey","SavedViewTypes","isFavorite","SavedStatesActions","SavedStatesActionCreator","view","transformedWidget","viewType","SavedStatesContext","useSavedStateSelectors","isSavedStateAvailable","ogExplorers","ogWidgets","ogDashboards","dashboards","dashboard","explorers","ApplicationStateActions","isSaveViewsEnabled","UPDATE_DASHBOARD","UPDATE_WIDGET","UPDATE_APP_STATE","UPDATE_FEATURES","useIsSavedStateAvailable","SaveCurrentView","workspaceDispatch","isSavable","setName","isDialogOpen","setDialogState","fetchSavedExplorer","setFetchSavedExplorer","setId","closeSaveModal","savedExplorer","FIXED","randName","id_1","uuid","SaveExistingView","isSaveModalOpen","setSaveModalOpen","workspaceExplorer","SaveWidget","saveWidget","adjectives","nouns","firstIndex","secondIndex","useFetchEndpointData","setTriggerError","ExplorerCard","widgetConfig","cardCss","headerCss","ResizeSensor","onResize","ExplorerData","validData","setValidData","DIALOG_VIEWS","close","viewState","setViewState","closeFlag","setCloseFlag","originalEndpointRef","originalConfigRef","Settings","onSave","onCancel","CancelConfirm","colorScaleFunction","availableColorScales","dialogRoot","cancelButton","dialogBody","knobCard","widgetCard","stopResize","cancelDialogCss","H4","DIALOG_FOOTER_ACTIONS","SavedWidgetSelector","showAllSavedWidgets","savedWidgets","savedWidget","separated","noSavedViews","handleChangeWidget","WidgetItemRenderer","Divider","dilTitle","updateExplorerCardWidget","maximizeWidget","AppCard","_j","_k","isSettingsAvailable","showSettings","isSettingsOpen","setSettingsOpenStatus","handleReset","layoutOptions","toggleSettingsDialog","widgetUnavailable","cardStyle","hideHeader","controlsStyle","dividerStyle","onReset","SettingsDialog","ExplorerLayoutManager","wrapperBaseStyle","emptyWidget","TimelineUseContext","_super","newKeyframe","KeyframeCreator","brush","selectionExtents","brushToUse","aNewBrush","GRABBER","keyframe","graphOverlay","Keyframe","updateKeyframe","setX","keyframeWidth","setKeyframeWidth","isKeyframeStale","setIsKeyframeStale","keyframeRef","useLayoutEffect","scaledExtent","calculateKeyframeAttributes","keyframeWidth_1","keyframeExtents","isKeyframeValid","d3Keyframe","rightBar","rightBarResize","leftBar","leftBarResize","activeKeyframe","positionData","keyframeDrag","createKeyframeInteractions","minX","maxX","isTooSmall","isTooRight","isTooLeft","isTooBig","validateKeyframe","TimelineBinResolution","addTimeFilter","$gte","$lt","handleTimelineResize","dim","elements","isTimelineFiltered","buildHistogramTimeline","MaxBinResolution","getBinCountsFromSize","rootError","StartTime","startTime","EndTime","endTime","responseData","activeError","setError","formattedActiveData","selectedBinValue","xCord","yCord","cypressDataTag","split","binSizing","MaxMajorBinCount","MaxMinorBinCount","rootBar","activeBar","overrides","getReadOnlyOverride","TemporalSelector","temporalProperties","getPropertiesOfType","defaultPropertyName","defaultProperty","clearTimelineFilter","TimelineWrapper","binningResolution","setBinningResolution","CreateSettingsDropdownContent","keyName","NONE","headerStyle","temporalSelectorWrapperStyle","temporalSelectorLabelStyle","temporalSelectorMarginsStyle","buttonWrapperStyle","Popover","BOTTOM_LEFT","Export","fileName","setFileName","showDialog","setShowDialog","exportingStatus","setExportingStatus","exportResult","RESULT_END_POINTS","pluginId","exportName","export_result","isAvailable","milliseconds","resolve","get","handleCancel","large","onKeyPress","LayoutSelector","dialogStyle","ViewSettingsDropDown","showAllViews","changeView","setChangeView","isUnsavedChangesDialogOpen","setUnsavedChangesWarning","isUnableToSaveDialog","setIsUnableToSaveDialog","closeUnsavedChangesWarning","loadExplorer","handleViewChange","fullView","handleContinue","selectedViewId","clearSavedExplorer","savedExplorers","clearSelection","compareMatchesCurrentDil","compareDil","compareName","hasUnsavedChanges","WARNING_SIGN","UnsavedChangedDialog","UnableToSaveDialog","SelectView","selectedView","alignText","MenuDivider","selectViewTitle","menuItemGroup","CROSS","MANUALLY_ENTERED_DATA","ViewSettings","containerStyles","headerStyles","ControlGroup","actionButtonsStyles","updateResult","Filters","transientFilters","setResults","transientResult","setTransientResult","filterString","rawResults","rawRootResult","transientData","onRemove","Search","buttonText","_h","searchTerms","terms","fields","setText","allSearchable","useTextSearchableProperties","updateSearchFilter","newTerms","resetTextFilters","handleUsageStat","perField","$c","fieldArray","searchWrapperStyle","TagInput","inputValue","onInputChange","onAdd","rightElement","tagProps","submitButtonStyle","propertiesToSearch","Bp3ControlGroupFix","FacetSearch","findIn","showInput","setShowInput","debouncedUpdateFilter","handleClearText","handleSubmit","handleShowInput","onBlur","inputStyle","onFocus","small","FacetCheckbox","isSelected","inferred","isAncestorSelected","excluded","isExcluded","CustomCheckbox","CheckboxProxy","excludedStyle","excludedInteractiveStyle","excludedIconStyle","inferredStyle","indeterminateStyle","SetOfTotal","set","total","divider","setStyle","totalStyle","parseInferredType","thing","InferredType","isArray","aDeeperThing","isObject","fn","ISO_8601_FULL","isIsoDate","URL","isURL","flattenInferredTypeValueToString","inferredTypeValue","aDeeperInferredTypeValue","objToString","highlights","points","highlight","uniquePoints","currentStart","currentHighlights","intervals","highlightStartId","TextMarkup","componentType","highlightProps","TextComponent","textFragments","interval","highlightValues","textMarkup","defaultHighlightColor","generateGradient","doc","win","sel","range","preCaretRange","textRange","preCaretTextRange","string","HighlightWorkspaceTerms","noTextMessage","wrapperElement","search","HighlightTerms","Element","formattedTerms","token","RegExp","regexIterator","match","searchWithOffsets","DefaultDocumentContent","bodyProperties","renderProperties","propertyValues","propertyValue","typeInferredPropertyValue","hideEmptyValues","isSearched","isLongString","contentWrapperStyle","singleColumn","propertyValueCss","propertyValueStyle","twoColStyle","propertySlug","propertyLabelStyle","toString","contentWrapperGridStyle","externalLinkAttributes","rel","DefaultDocumentHeader","titleProperty","linkProperty","subTitle","linkHref","HeaderWrapper","LinkBar","AnchorButton","ScrollBox","innerProps","DocumentViewer","subTitleRenderer","HeaderComponent","ContentComponent","documentViewer","selectedDocumentId","DOCUMENT_END_POINTS","Drawer","ButtonContainer","SubTitleBody","FacetItem","facetName","facetTextFilter","onClickSelect","onClickExclude","onClickOpen","facetCheckboxProps","isAncestorExcluded","isBottom","FacetLabel","facetCountProps","hoverOpenDelay","FacetDetailSkeleton","nameText","Text","ellipsize","labelDisabled","labelEmpty","labelExcluded","ExcludedFacetsDisplay","excludedFacets","FacetDetail","facetKey","facetTotalValue","FacetGroup","openNewPanel","toggleCollapse","totalFacetCount","onResetClick","handleOpenNewPanelClick","cypressFacetOpenState","panelContainer","propertyHeader","activeFacetCount","Collapse","bottomRow","facetPreviewCount","FACET_SORT_ENUM","SORT_TYPES","SortSelect","sortOptions","selectedSortOption","setSelectedSortOption","setIsDescending","ButtonGroup","SMALL","buttonGroupStyle","popoverStyle","sortButtonStyle","isDescending","EmptyFacetsMessage","messageStyles","FacetPreview","setFilters","sortingTypeByProperty","parentResultId","ignoreParentId","filters_1","slice","facetActiveValue","FacetHeader","onBackClick","backButton","titleRow","FacetPanel","closePanel","indexRange","setIndexRange","localData","setLocalData","setSort","parametersWithParentId","formattedData","newLocalData","isRowLoaded","facetItemStyle","optionsRow","emptyMessageStyles","InfiniteLoader","loadMoreRows","stopIndex","minimumBatchSize","onRowsRendered","registerChild","AutoSizer","List","rowRenderer","ExpandContext","HierarchicalFacetDetail","childLimit","startsWithKey","isExpandedState","setIsOpen","isExpandedContext","Boolean","toggleOpenContext","toggleOpenState","useIsExpanded","toggleOpen","preventToggle","containsSelectedChild","containsExcludedChild","keepChildrenMounted","HierarchicalFacetPreview","totalRootFacetCount","HierarchicalFacetPanel","expandedGroups","setExpandedGroups","isAnyExpanded","contextValue","expandedFacets","copyExpanded","toggleAll","allFacetKeys_1","recursiveAddFacets_1","expanded","useExpandCollapse","FILTER_COMPONENTS","useFilters","renderComponents","componentKey","getComponentKey","component","MainPanel","openPanel","setProperties","collapsedProperties","setCollapsedProperties","isAllPropertiesCollapsed","fetchedProperties","sortFacetsFunc","COLLAPSE_ALL","rc","collapseState","FilterHub","facetsQueryString","hierarchicalFacetsQueryString","orValues","concat","apply","andValues","mergeQueryStrings","PanelStack","initialPanel","filterPropertyProps","showPanelHeader","FullPageLoader","loaderContainer","createNewExplorer","updateSelectedDefinition","updateWidgets","Workspace","isReady","widgetOrder","widgetInFilter","widgetOutFilter","selectDIL","rootResultFilter","setResult","useFetchRootResult","Screen","useWorkspaceState","tightCard","commonStyle","explorerStyles","viewer","DocumentsExplorer","listComponent","searchField","dataExplorer","InfiniteScrollingList","RowPlaceholder","DefaultRowPlaceholder","cache","fixedWidth","defaultHeight","minHeight","minRowHeight","listRef","listRefCallback","sortDescending","isLoading","setLoading","externalId","fetchValues","useFetchValues","forceUpdate","updateIndex","ListRow","CellMeasurer","querySize","deferredMeasurementCache","DocumentsList","sortPropertyName","isRowSelectable","sortPropertyLocal","setSortPropertyLocal","sortDescendingLocal","setSortDescendingLocal","filteredSortOptions","renderActions","actionsRowStyle","headerRowStyle","headingStyle","heading","sortSelectStyle","listRenderer","rowItemStyle","rowPlaceholderRenderer","TOP","NetworkConfigContext","ConfigFetcher","fetch","method","credentials","headers","initialValue","MultiSelectPopup","handleSelectAll","canEscapeKeyClose","canOutsideClickClose","enforceFocus","usePortal","MultiSelect","facetDropdownStyles","Popup","sortedSelections","handleClose","on","sourceEvent","stopPropagation","alphaTarget","restart","InnovationGraph","nodeGroupRef","domain","now","stop","zoomMax","call","scaleExtent","attr","selectAll","join","append","classed","raise","maxParents","remove","weight","push","useLoadApplicationSpecificStateLocal","INNOVATION","wantedWidgets","TYPOGRAPH","CUSTOM_CIRCLE_PACK","BIPARTITE_GRAPH","DONUT_GRAPH","TABLE","STACKED_BAR_GRAPH","PARACORD","NETWORK_GRAPH","POLAR_AREA","TREE_MAP","NODE_GRAPH","Navigation","NavBarStyled","DARK","publicURL","logo","useMediaQuery","align","Alignment","RIGHT","SIZE_LARGE","serberus","styled","Navbar","backgroundStyles","PlatipusList","Published","Journal","Abstract","textStyle","detailsStyle","published","journal","PlatipusExplorer","LoginContext","out","_404","Root","App","srsProps","useSRS","useSlykit","hostName","noAnonymous","passedInState","useApplicationState","intervalMinutes","timer","setInterval","SESSION_END_POINTS","clearInterval","handler","useFocusedSessionPolling","basename","exact","to","textAlign","isAuthenticated","logoStyle","FocusStyleManager","onlyShowFocusOnTabs","ReactDOM","render","getElementById"],"mappings":"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BDVqB,UCCP,IAUrBC,MAAO,gBDXqB,UCCP,IAWrBC,MAAO,gBDZqB,UCCP,IAYrBC,YAAa,sBDbe,UCCP,IAarBC,YAAa,sBDde,UCCP,IAcrBC,YAAa,sBDfe,UCCP,IAerBC,YAAa,sBDhBe,UCCP,IAgBrBC,YAAa,sBDjBe,UCCP,IAiBrBC,MAAO,gBDlBqB,UCCP,IAkBrBC,MAAO,gBDnBqB,UCCP,IAmBrBC,MAAO,gBDpBqB,UCCP,IAoBrBC,MAAO,gBDrBqB,UCCP,IAqBrBC,MAAO,gBDtBqB,UCCP,IAsBrBC,MAAO,gBDvBqB,UCCP,IAuBrBC,OAAQ,iBDxBoB,UCCP,IAwBrBC,OAAQ,iBDzBoB,UCCP,IAyBrBC,OAAQ,iBD1BoB,UCCP,IA0BrBC,OAAQ,iBD3BoB,UCCP,IA2BrBC,OAAQ,iBD5BoB,UCCP,IA4BrBC,QAAS,kBD7BmB,UCCP,IA6BrBC,QAAS,kBD9BmB,UCCP,IA8BrBC,QAAS,kBD/BmB,UCCP,IA+BrBC,QAAS,kBDhCmB,UCCP,IAgCrBC,QAAS,kBDjCmB,UCCP,IAiCrBC,KAAM,eDlCsB,UCCP,IAkCrBC,KAAM,eDnCsB,UCCP,IAmCrBC,KAAM,eDpCsB,UCCP,IAoCrBC,KAAM,eDrCsB,UCCP,IAqCrBC,KAAM,eDtCsB,UCCP,IAsCrBC,WAAY,qBDvCgB,UCCP,IAuCrBC,WAAY,qBDxCgB,UCCP,IAwCrBC,WAAY,qBDzCgB,UCCP,IAyCrBC,WAAY,qBD1CgB,UCCP,IA0CrBC,WAAY,qBD3CgB,UCCP,IA2CrBC,MAAO,gBD5CqB,UCCP,IA4CrBC,MAAO,gBD7CqB,UCCP,IA6CrBC,MAAO,gBD9CqB,UCCP,IA8CrBC,MAAO,gBD/CqB,UCCP,IA+CrBC,MAAO,gBDhDqB,UCCP,IAgDrBC,QAAS,kBDjDmB,UCCP,IAiDrBC,QAAS,kBDlDmB,UCCP,IAkDrBC,QAAS,kBDnDmB,UCCP,IAmDrBC,QAAS,kBDpDmB,UCCP,IAoDrBC,QAAS,kBDrDmB,UCCP,IAqDrBC,QAAS,kBDtDmB,UCCP,IAsDrBC,QAAS,kBDvDmB,UCCP,IAuDrBC,QAAS,kBDxDmB,UCCP,IAwDrBC,QAAS,kBDzDmB,UCCP,IAyDrBC,QAAS,kBD1DmB,UCCP,IA0DrBC,QAAS,kBD3DmB,UCCP,IA2DrBC,QAAS,kBD5DmB,UCCP,IA4DrBC,QAAS,kBD7DmB,UCCP,IA6DrBC,QAAS,kBD9DmB,UCCP,IA8DrBC,QAAS,kBD/DmB,UCCP,IA+DrBC,WAAY,qBDhEgB,UCCP,IAgErBC,WAAY,qBDjEgB,UCCP,IAiErBC,WAAY,qBDlEgB,UCCP,IAkErBC,WAAY,qBDnEgB,UCCP,IAmErBC,WAAY,qBDpEgB,UCCP,IAoErBC,QAAS,kBDrEmB,UCCP,IAqErBC,QAAS,kBDtEmB,UCCP,IAsErBC,QAAS,kBDvEmB,UCCP,IAuErBC,QAAS,kBDxEmB,UCCP,IAwErBC,QAAS,kBDzEmB,UCCP,IAyErBC,MAAO,gBD1EqB,UCCP,IA0ErBC,MAAO,gBD3EqB,UCCP,IA2ErBC,MAAO,gBD5EqB,UCCP,IA4ErBC,MAAO,gBD7EqB,UCCP,IA6ErBC,MAAO,gBD9EqB,UCCP,IA8ErBC,MAAO,gBD/EqB,UCCP,IA+ErBC,MAAO,gBDhFqB,UCCP,IAgFrBC,MAAO,gBDjFqB,UCCP,IAiFrBC,MAAO,gBDlFqB,UCCP,IAkFrBC,MAAO,gBDnFqB,UCCP,IAmFrBC,OAAQ,iBDpFoB,UCCP,IAoFrBC,OAAQ,iBDrFoB,UCCP,IAqFrBC,OAAQ,iBDtFoB,UCCP,IAsFrBC,OAAQ,iBDvFoB,UCCP,IAuFrBC,OAAQ,iBDDA,UCCA,KAGIC,GAAe,CAC3BC,kBAAmB,4BDFe,UCCP,IAE3BC,kBAAmB,4BDHe,UCCP,IAG3BC,kBAAmB,4BDJe,UCCP,IAI3BC,iBAAkB,2BDLgB,UCCP,IAK3BC,wBAAyB,kCDNS,UCCP,IAM3BC,6BAA8B,uCDPI,UCCP,IAO3BC,iBAAkB,2BDRgB,0BCCP,IAQ3BC,cAAe,wBDTmB,UCCP,IAS3BC,oBAAqB,8BDVa,UCCP,IAU3BC,uBAAwB,iCDXU,0BCCP,IAW3BC,iBAAkB,2BDZgB,UCCP,IAY3BC,cAAe,wBDbmB,UCCP,IAa3BC,mBAAoB,6BDdc,UCCP,IAc3BC,yBAA0B,mCDfQ,UCCP,IAe3BC,4BAA6B,sCDhBK,2BCCP,IAgB3BC,sBAAuB,gCDjBW,UCCP,IAiB3BC,mBAAoB,6BDlBc,UCCP,IAkB3BC,wBAAyB,kCDnBS,2BCCP,IAmB3BC,cAAe,wBDpBmB,UCCP,IAoB3BC,oBAAqB,8BDrBa,UCCP,IAqB3BC,uBAAwB,iCDtBU,0BCCP,IAsB3BC,uBAAwB,iCDvBU,UCCP,IAuB3BC,mBAAoB,6BDxBc,UCCP,IAwB3BC,yBAA0B,mCDzBQ,UCCP,IAyB3BC,4BAA6B,sCD1BK,2BCCP,IA0B3BC,4BAA6B,sCD3BK,UCCP,IA2B3BC,iBAAkB,2BD5BgB,yBCCP,IA4B3BC,sBAAuB,gCD7BW,wBCCP,IA6B3BC,sBAAuB,gCD9BW,4BCCP,IA8B3BC,mBAAoB,6BD/Bc,UCCP,IA+B3BC,wBAAyB,kCDhCS,UCCP,IAgC3BC,yBAA0B,mCDjCQ,2BCCP,IAiC3BC,8BAA+B,wCDDA,wBCCA,KAGnBC,GAAY,CACxBC,aAAc,uBDFiB,OCCP,IAExBC,eAAgB,yBDHe,iICCP,IAGxBC,yBAA0B,mCDJK,6BCCP,IAIxBC,aAAc,uBDLiB,OCCP,IAKxBC,mBAAoB,6BDNW,OCCP,IAMxBC,mBAAoB,6BDPW,OCCP,IAOxBC,eAAgB,yBDRe,UCCP,IAQxBC,eAAgB,yBDTe,UCCP,IASxBC,eAAgB,yBDVe,UCCP,IAUxBC,sBAAuB,gCDXQ,OCCP,IAWxBC,mBAAoB,6BDZW,OCCP,IAYxBC,iBAAkB,2BDba,MCCP,IAaxBC,iBAAkB,2BDda,OCCP,IAcxBC,uBAAwB,iCDfO,OCCP,IAexBC,yBAA0B,mCDhBK,OCCP,IAgBxBC,uBAAwB,iCDjBO,OCCP,IAiBxBC,gBAAiB,0BDlBc,OCCP,IAkBxBC,sBAAuB,gCDnBQ,OCCP,IAmBxBC,sBAAuB,gCDpBQ,OCCP,IAoBxBC,iBAAkB,2BDrBa,OCCP,IAqBxBC,gBAAiB,0BDtBc,ICCP,IAsBxBC,mBAAoB,6BDvBW,KCCP,IAuBxBC,mBAAoB,6BDxBW,KCCP,IAwBxBC,yBAA0B,mCDzBK,MCCP,IAyBxBC,uBAAwB,iCD1BO,MCCP,IA0BxBC,8BAA+B,wCD3BA,MCCP,IA2BxBC,4BAA6B,sCD5BE,MCCP,IA4BxBC,sBAAuB,gCD7BQ,yFCCP,IA6BxBC,sBAAuB,gCD9BQ,8FCCP,IA8BxBC,sBAAuB,gCD/BQ,oGCCP,IA+BxBC,sBAAuB,gCDhCQ,qGCCP,IAgCxBC,sBAAuB,gCDjCQ,0GCCP,IAiCxBC,2BAA4B,qCDlCG,wFCCP,IAkCxBC,2BAA4B,qCDnCG,8FCCP,IAmCxBC,2BAA4B,qCDpCG,oGCCP,IAoCxBC,2BAA4B,qCDrCG,qGCCP,IAqCxBC,2BAA4B,qCDtCG,0GCCP,IAsCxBC,mBAAoB,6BDvCW,kCCCP,IAuCxBC,0BAA2B,oCDxCI,uCCCP,IAwCxBC,uBAAwB,iCDzCO,QCCP,IAyCxBC,oBAAqB,8BD1CU,gFCCP,IA0CxBC,qBAAsB,+BD3CS,0GCCP,IA2CxBC,sBAAuB,gCD5CQ,qGCCP,IA4CxBC,sBAAuB,gCD7CQ,qGCCP,IA6CxBC,yBAA0B,mCD9CK,+ECCP,IA8CxBC,0BAA2B,oCD/CI,0GCCP,IA+CxBC,2BAA4B,qCDhDG,qGCCP,IAgDxBC,2BAA4B,qCDDA,qGCCA,KChKhBC,GAAc,SAAC,G,IACpBC,EAAK,QACZC,EAAY,eACZjT,EAAK,QACLgB,qBAAS,IAAG,KACZqB,uBAAW,IAAG,SACdR,4BAAgB,IAAG,SAEb,EAA0BqR,mBAA1B,IAACC,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GACA,EAA0BF,mBAA1B,IAACG,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GACA,EAA8BJ,mBAA9B,GAACK,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAAkCN,oBAAlC,GAACO,EAAY,EAAb,GAAeC,EAAe,EAA9B,GAENC,qBAAU,WACTD,MACAF,OACE,CAHHG,IAKA,IAMMC,EAAU,WACXT,GAAJ,IACCO,MACAT,EAAaE,EAAbF,GACAK,QAIF,OACC3L,mBAAKF,IAAKoM,IACTlM,mBACCmM,IAAKC,GCnDC,0vHDoDNC,IAAI,OACJvM,IAAKwM,GAAsCC,KAE5CvM,mBAAKF,IAAK0M,IACTxM,mBAAKF,IAAK2M,IACTzM,YAACqL,SAEDS,EACA9L,YAAC0M,GADW,MAETd,EACH5L,YAAC2M,IAAWf,WAAYA,EAAYF,SAAUA,EAAUG,cAAeA,EAAeL,SAAUA,IAEhGxL,YAAC4M,IACAC,UA/Ba,SAACC,GAClB,KAAIA,WACHb,KA8BGT,SAAUA,EACVE,SAAUA,EACVD,YAAaA,EACbE,YAAaA,EACbM,QAASA,EACTc,UAAWA,OAQXJ,GAAa,SAAC,G,IAAEf,EAAU,aAAEC,EAAa,gBAC9C,OACC7L,mBAAKF,IAAKkN,IACThN,mB,UAAa,eAAeF,IAAKmN,IAChCjN,uCACAA,uBAAM4L,EAAWsB,UAElBlN,YAACmN,KAAOlB,QAAS,WAAM,OAAAJ,EAAA,OAAqB1L,OAAQC,IAAOgN,OAAQC,MAAM,GAN3E,WAaKT,GAAW,SAAC,G,IAAEC,EAAS,YAAEpB,EAAW,cAAED,EAAQ,WAAEG,EAAW,cAAED,EAAQ,WAAEO,EAAO,UAMnF,OAN8F,cAE7FR,UACAE,UACAM,KAGAjM,mBAAKF,IAAKkN,IACThN,YAACsN,K,UACQ,WACRrN,UAAWsN,IAAQC,KACnBC,SAAS,OACTZ,UAAWA,EACXa,SAAU,YAAW,OAAAjC,EAAYqB,SAAZ,QACrB7Q,KAAK,WACL0R,YAAY,WACZC,MAAOpC,EACPqC,WAAS,IAEV7N,YAACsN,K,UACQ,WACRrN,UAAWsN,IAAQC,KACnBC,SAAS,OACTvQ,KAAK,WACLjB,KAAK,WACL0R,YAAY,WACZd,UAAWA,EACXa,SAAU,YAAW,OAAA/B,EAAYmB,SAAZ,QACrBc,MAAOlC,IAER1L,YAACmN,K,UACQ,YACRlB,QAASA,EACT6B,UAAWtC,IAAaE,EACxBvL,OAAQC,IAAOC,QACfgN,MAAM,GA7BT,WAqCKX,GAAU,WACf,OAAO1M,YAACE,IAAR,OAGKgM,GAAYpM,YAAG,mHAE8B,SAA9BmG,GAFrB,mBAKMwG,GAAa3M,YAAG,2KAMhBkN,GAAWlN,YAAG,6GAKdmN,GAAcnN,YAAG,uaAQgB,yFAA7BmG,GARV,kBAgBMsG,GAAmBzM,YAAG,yMAQtB0M,GAAQ1M,YAAG,igBEvKJiO,GAAwC,SAAC,G,IAAEC,EAAU,aAAE7V,EAAI,OAAS8V,EAAe,kBAC9F,OACE,yBAAKC,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQC,MAAO,CAAEC,WAAYJ,IAC3E9V,EAAA,KAAS,cACR,IAAMmW,EAAU,CACdC,EAAGC,cAAgBR,EADL,MAEdS,EAAGD,cAAgBR,EAFL,OAGdU,SAAUF,iBAHI,GAIdG,MAAOC,YAAoBC,EAAI1W,EAJjB,QAKd2W,OAAwB,IAAhBN,eAEV,OACE,0BAAMO,IAAKF,EACLN,EAAGD,EAAQC,EACXE,EAAGH,EAAQG,EACXpB,KAAMiB,EAAQK,MACdK,UAAW,UAAUV,EAAV,WAA4BA,EAA5B,MAAyCA,EAAzC,MACXF,MAAO,CACLM,SAAaJ,WADR,KAELW,WAFK,SAGLC,iBAAkB,YAT5B,QCZKC,GAAgC,SAACvB,GAE7C,OAD8BA,EAA9B,GAC+BwB,cAAH,UAAqCC,GAAjE,IAOYA,GAAc,SAACzB,GAC3B,OAAI0B,YAAJ,GAA4B1B,EACxB2B,iBAAJ,GAAoCH,cAAP,OACtBA,cAAP,UAoBYI,GAAU,SAACC,GACvB,OAAQC,MAAMD,EAAP,MAAiBC,MAAMD,EAA9B,KA2HD,SAAgBE,GAAgBxX,GAC/B,IAAMyX,EAAS,IAAf,IAEMC,EAAU1X,EAAA,aAAiB,YAChC,IAAM2X,EAAI,CACTC,MAAOC,EADE,IAETpC,MAAOoC,EAAMpC,OAgBd,OAdGoC,iBAAH,cAECF,WAAaE,EAAbF,UAGGE,EAAJ,SACCA,oBAAuB,YACtBF,EAAEG,EAAFH,KAAeG,EAAfH,MACAF,MAAWK,EAAXL,SAGDE,EAAEA,EAAFA,OAAaA,EAAbA,MACAF,MAAWE,EAAXF,QAED,KAGKlU,EAAavD,EAAA,aAAiB,YAAO,OAAAsX,EAAA,OACrClR,EAAOZ,cAAcxF,OAAdwF,IAA8BxF,OAA9BwF,GAA6CxF,OAA1D,GAGI+X,EAAS3R,EAAA,KAAS,YACrB,MAAO,CACNwQ,IADM,EAENnB,MAAOuC,YAAIN,GAAS,Y,eAAejC,Q,EAAP,Q,EAAD6B,EAAEV,UAAD,eAAOnB,qBAAS,SAI9C,MAAO,CACNzV,KADM,EAENuD,WAFM,EAGN6C,KAHM,EAINC,OAAQA,YAAOqR,GAAS,YAAO,OAAAJ,EAAA,SAC/BS,OAAM,GASD,IAAME,GAA4B,CACxC,CACCL,MADD,UAECnC,MAAO,WAER,CACCmC,MADD,MAECnC,MAAO,OAER,CACCmC,MADD,UAECnC,MAAO,YASIyC,GAAc,CAC1B,CACCN,MADD,UAECnC,MAAO,WAER,CACCmC,MADD,QAECnC,MAAO,SAER,CACCmC,MADD,eAECnC,MAAO,gBAER,CACCmC,MADD,iBAECnC,MAAO,SAER,CACCmC,MADD,UAECnC,MAAO,YAQI0C,GAAqB,CACjC,CACCP,MADD,aAECnC,MAAO,cAER,CACCmC,MADD,WAECnC,MAAO,YAER,CACCmC,MADD,OAECnC,MAAO,SAII2C,GAAkB,CAC9B,CACCR,MADD,YAECnC,MAAO,aAER,CACCmC,MADD,aAECnC,MAAO,eASI4C,GAAoB,CAChC,CACC5C,MADD,UAECmC,MAFD,OAGCU,EAAE,YAAc,OAAA5S,IAEjB,CACC+P,MADD,MAECmC,MAFD,YAGCU,EAAEjC,KAAKkC,KAER,CACC9C,MADD,OAECmC,MAFD,cAGCU,EAAEjC,KAAKmC,OAIIC,GAAgB,CAC5B,CACCb,MADD,QAECnC,MAAM,SAEP,CACCmC,MADD,QAECnC,MAAM,SAEP,CACCmC,MADD,YAECnC,MAAM,aAEP,CACCmC,MADD,sBAECnC,MAAM,uBAEP,CACCmC,MADD,cAECnC,MAAM,eAEP,CACCmC,MADD,cAECnC,MAAM,eAEP,CACCmC,MADD,YAECnC,MAAM,aAEP,CACCmC,MADD,iBAECnC,MAAM,kBAEP,CACCmC,MADD,kBAECnC,MAAM,mBAEP,CACCmC,MADD,SAECnC,MAAM,WAKKiD,GAAN,qFAKDC,GADSC,uBAAf,UACgBC,WAAhB,MAMA,SAAgBC,GAAcvC,EAAkBwC,EAAkBC,GACjE,OAAO,WACN,IAAIC,EAAOC,YAAX,MACIC,EAAOF,EAAX,OACAN,QAAepC,QAAfoC,EAGA,IAFA,IAAIS,EAAaT,kBAAjB,MAEOK,MAA0BG,SAAjC,GACCA,EAAOA,WAAPA,GACAC,EAAaT,eAAoBQ,EAApBR,OAAbS,MAEEH,WAAH,GACCA,OAAUE,EAAVF,QC1WI,I,GCdMI,GAAa,SAACC,EAAOC,EAAOC,EAAQC,GAChD,IAAMC,EAAkBH,EAAxB,cACMI,EAAkBL,EAAxB,cAEA,SACQI,IAAP,EAEOA,cAAP,GAIWE,GAAmB,SAAAC,GAAkB,qB,IAASC,EAAW,cAAEC,EAAS,YAAEtW,EAAK,QACvF,OAAKsW,EAAL,iBAIClS,YAACmS,KACApD,IAAKnT,EACLwW,OAAQF,EAAUE,OAClBtE,SAAUoE,EAAUpE,SACpB7B,QAASgG,EACTX,KAAMU,EAAeK,KARtB,OAyBWC,GAAiBxS,YAAG,iOCtBpByS,GAAiB,SAAC,GAC9B,IDS+BC,ECT/BC,EAAU,EAAVA,WACAC,EAAkB,EADlB,mBAEArZ,IAFA,QAEAA,OAAO,IAAG,KAFV,EAGA2Y,EAAc,EAHd,eAIAtX,IAJA,UAIAA,OAAS,IAAG,WAJZ,EAKAiY,EAAY,EALZ,aAMAzY,IANA,SAMAA,OAAQ,IAAG,GANX,EAOG0Y,EAAI,cARuB,sGASzB,OACL5S,YAAC6S,iBACAC,MAAO9Y,EACP+Y,eDF8BP,ECEER,EDFiB,kBAClD,IACMH,EADQW,EAAd,GACA,cACMV,EAAkBL,EAAxB,cAEA,SACQI,IAAP,EAEOA,cAAP,ICLAmB,aAAcjB,GAAiBC,GAC/BiB,UAAWjT,YAACmS,KAASrE,UAAU,EAAMwD,KAAK,cAC1C4B,aAAcR,EACdD,WAAYA,EACZU,aAAc,CAAEC,SAAS,IACrBR,GACJ9E,SAAUA,IAET6E,GACA3S,YAACmN,KACAkG,UAAU,aACVD,SAAO,EACPtT,IAAKwS,GACLhB,KAAMU,MAA8BsB,EACpCxF,SAAUA,E,UACD8E,EAAK,eClClB,SAAgBW,GAAwB,GAAE,QAAAxD,aAAK,IAAG,KAAR,EAAYyD,EAAO,EAAnB,QAAwBZ,EAAI,cAA9B,qBACvC,OACC5S,uBACCA,oBAAMF,IAAK2T,IAAW1D,GAGtB/P,YAACuS,gBACAzS,IAAK4T,GACLf,aACC3S,YAACmN,K,UACSyF,EAAK,WACdS,UAAU,aACVpT,UAAW,GAAGsN,IAAQoG,QACtB7T,IAAK8T,GACLtC,KAAMkC,KAbX,KDuCDjB,aAA2B,CAC1BE,WAAYlS,sBAAoB,CAACA,YAAD,OAAmBA,YAAnB,OAAqCA,YAD3C,SAE1BoS,aAAcpS,YAFY,IAG1B+S,UAAW/S,YAHe,OAI1BmS,mBAAoBnS,YAJM,KAK1ByR,eAAgBzR,iBALU,WAM1BvG,QAASuG,kBANiB,WAO1BuN,SAAUvN,YAAUsT,MCxBrB,I,SAAMJ,GAAW3T,YAAG,yKAEoB,mBACJ,eACG,iCAFvBgU,GAFI,eAGNA,GAHM,aAIV7N,GAJV,kBASMyN,GAAc5T,YAAG,+GAKjB8T,GAAe9T,YAAG,6RAC0B,2IAMT,qBACJ,iBACA,sCARhBmG,GADG,iBAOP6N,GAPO,eAQTA,GARS,aASb7N,GATX,eClBA,IAAa8N,GAAmB,SAACC,EAAD,gBAC7B,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,IAGF,IAAMC,EAA+BjX,cAAckX,eAAnD,cAEA,GAAIJ,SAAJ,EACC,OAAOG,EAAA,QAAqB,SAAAE,GAC3B,OAAOL,WAA2BK,EAAlC,SAKF,IAAMC,EACLR,eAEGK,EAAA,QAAqB,SAAAxZ,GACrB,OAAOmZ,EAAA,MAAW,SAAAS,GACjB,OAAO5Z,iBAAP,SAIC6Z,EACLP,eAEGK,EAAA,QAAe,SAAA3Z,GACf,OAAOsZ,EAAA,OAAe,SAAAM,GACrB,OAAQ5Z,iBAAR,SAIC8Z,EACLV,eAEGS,EAAA,QAAkB,SAAA7Z,GAClB,OAAOoZ,EAAA,MAAW,SAAAhX,GACjB,OAAOpC,SAAP,QAIL,OAAOuZ,eAEJO,EAAA,QAAa,SAAA9Z,GACb,OAAOuZ,EAAA,OAAe,SAAAnX,GACrB,QAASpC,SAAT,UAKQ+Z,GAAwB,SAACb,EAAD,WAOpC,YANE,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,SACA,IAAAC,MAAA,IAEKxX,mBAAQ,WACd,OAAOkX,GAAiBC,EAAwBC,EAAOC,EAAOC,EAAmBC,EAAjF,KACE,CAACJ,EAAwBC,EAF5B,KAKD,SAASa,GAAuBC,GAE/B,OADAA,EAAM,kBAAQA,EAAoBR,YAA5B,GAANQ,GACA,aC9FD,IAAMC,GAAmB,CACxB/Y,KADwB,OAExBgZ,YAAa,GAKRC,GAAa,SAACC,EAAoBC,EAAYC,G,QACnD,MACC,OAAOD,EAAaJ,GAJtB,oBAOC,IAAKK,EAAL,KAAmB,CAClB,IAAMC,EAAN,EACA,OAAgG,QAAhG,EAAOjY,QAAP,EAAOA,cAAc8X,EAAd9X,oCAAgDkY,MAAK,YAAc,OAAAza,EAAA,mBAAsB,QAAhG,KAGD,UAgBD,SAAgB0a,GAAiB,GAChC,IAAAL,EAAkB,EAAlBA,mBACAzC,EAAkB,EADlB,mBAEAD,EAAU,EAFV,WAGAwB,EAAK,EAHL,MAIAC,EAAK,EAJL,MAKAC,EAAiB,EALjB,kBAMA9a,IANA,WAMAA,OAAU,IAAG,GANb,EAOGuZ,EAAI,cARyB,2GAU1BZ,EAAiB,SAACzD,GAAM,cAAAA,QAAC,IAADA,OAAA,EAAAA,EAAA,OAAAA,GAAA,IAE1BjU,EAAqByZ,GAAiBoB,EAAD,SAAzC,GAEA,GACC7a,cAGD,IAAMmb,EAAgBC,uBACrB,aACC,IAAIrD,aACHK,QAEAA,OAGF,CARD,IAWA,OACC1S,YAACuT,gBACAvZ,QAASM,EACToY,mBAAoB+C,EACpBhD,WAAYyC,GAAWC,EAAoBC,EAAY3C,GACvDT,eAAgBA,EAChBsB,UA/DH,oBAgEGE,QAASxB,EAAekD,GAAWC,EAAoBC,EAA9CpD,KAhEZ,qBAyDC,IAaDwD,aAA6B,CAC5BL,mBAAoB5U,IADQ,IAE5BkS,WAAYlS,IAFgB,IAG5B0T,MAAO1T,IAHqB,IAI5BwP,MAAOxP,IAJqB,OAK5BmS,mBAAoBnS,IALQ,IAM5B2T,MAAO3T,IANqB,IAO5B6U,WAAY7U,IAAUsT,MChEvB,IAAM8B,GAAoB,SAACC,EAAWC,EAAS7B,GAC9C,IACI8B,EAASD,EADKD,EAAYC,EAA9B,QAEA,OAAOE,GAAyBD,EAAQD,EAAxC,IAUKE,GAA2B,SAACD,EAAQD,EAAS7B,GAClD,IAAIgC,EAAO,CACV9Y,KAAM4Y,EADI,IAEVG,cAFU,KAGVC,oBAAqB,MAGlBC,EAAuBL,EAAM,eAAjC,GACA,KAA0B,CACzB,IAAII,EAAsBC,EAAoB,QAC9C,IACCH,gBAAqBE,EAArBF,cACAA,sBAA2BE,EAA3BF,qBAIF,UAGKI,GAAUC,aAAQ,c,MAGvB,OAAQC,EAAR,MACC,KAAKC,GAAL,oBAWC,IATA,IAAIC,EAAW,CACdC,YAAa,CACZ1H,IADY,MAEZ2H,UAAW,GAKbF,UACS3H,EAAT,EAAgBA,EAAI2H,cAApB,UAAoD3H,IACnD2H,WAAoBb,GAAkB9G,EAAG8H,EAAK,UAAT,QAA6BA,WAAlEH,wBAEDG,oBACA,MAED,KAAKJ,GAAL,2BACS,MAAkBD,UAAlBM,cACRD,kCAAwCE,GAAiBA,EAAzDF,KACAA,yBAHiD,EAM7CA,GAASA,WAATA,QAAkCA,kBAAtC,QACCA,wBAA8BA,EAAA,2BAAgC,Y,MACvDb,EAAS,QAAH,EAAGa,EAAK,UAAL,cAA6B,YAAO,OAAAG,EAAA,MAAUd,EAAV,eAApC,QAA4DW,EAAK,UAALA,QAA3E,GAEA,OAAOZ,GAAyBD,EAAQa,EAAK,UAAd,QAAkCE,EAAjE,UAKFF,sBACAA,EAAK,UAALA,gBACAA,EAAK,UAALA,QAjBiD,GAoBjDA,EAAK,UAALA,gBACAA,EAAK,UAALA,kBAEA,MAED,KAAKJ,GAAL,cACO,MAAyBD,EAAzB,QAAEve,EAAM,EAAR,OAAUgf,EAAU,EAApB,WACNJ,EAAK,UAALA,eACAA,EAAK,UAALA,aACA,MAED,KAAKJ,GAAL,uBACO,IAAAS,EAAYV,UAAZU,QACNL,8BAF6C,EAK7C,IAAIM,EAAQN,kBAAZ,MACA,GAAIK,YAAoBC,EAAxB,OACCA,SAAaD,EAAbC,gBACM,GAAID,YAAoBC,EAAxB,OACN,IAASpI,EAAIoI,EAAb,OAA2BpI,EAAImI,EAA/B,UAAkDnI,IACjDoI,KAAWtB,GAAkB9G,EAAG8H,EAAK,UAAT,QAA6BA,WAAzDM,wBAGF,MAED,KAAKV,GAAL,gBAECI,8BAAoC,CAAED,UAAF,EAAgB3H,IAAK,OAIzD,KADIkI,EAAQN,kBAAZ,OACIM,QACHA,WAAgBA,EAAhBA,OAA8BA,EAAMX,EAApCW,UAED,MAED,KAAKV,GAAL,qBACO,MAAyBD,EAAzB,QAAEV,EAAS,EAAX,UAAasB,EAAO,EAApB,QACNP,6BACA,MAED,KAAKJ,GAAL,4BACO,MAA+BD,EAA/B,QAAaa,GAAXvB,EAAS,EAAX,UAA0B,EAA1B,eACNe,iDACA,MAED,KAAKJ,GAAL,4BACO,MAAyBD,EAAzB,QAAac,GAAXxB,EAAS,EAAX,UAAoB,EAApB,SACAE,EAASa,EAAK,UAAL,cAA6B,YAAO,OAAAG,EAAA,WACnDH,2BAAyCZ,GAAyB,EAEjEY,EAAK,UAF2D,QAGhEA,WAHDA,wBAKA,MAED,KAAKJ,GAAL,6BACO,MAAyBD,EAAzB,QAAae,GAAXzB,EAAS,EAAX,UAAoB,EAApB,SACNe,qCACA,MAED,KAAKJ,GAAL,wCACO,MAA4BD,EAA5B,QAAa7d,GAAXmd,EAAS,EAAX,UAAuB,EAAvB,YACNe,uFACIA,iDAA6Dle,YADjEke,GAIA,MAED,KAAKJ,GAAL,sCACO,MAAyBD,EAAzB,QAAEV,EAAS,EAAX,UAAaoB,EAAO,EAApB,QACNL,2CACA,MAED,KAAKJ,GAAL,qBACCI,WAAiBL,EAAjBK,QACA,MAED,KAAKJ,GAAL,cACO,MAAwBD,EAAxB,QAAEgB,EAAS,EAAX,UAAaC,EAAM,EAAnB,OACNZ,wBACA,MAKD,KAAKJ,GAAL,uBACO,MAA0BD,EAA1B,QAAakB,GAAXF,EAAS,EAAX,UAAqB,EAArB,UACAG,EAAiBd,mBAAvB,GACA,IACCA,sBAAoCa,EAApCb,IAED,MAED,KAAKJ,GAAL,wBACO,MAAwBD,EAAxB,QAAEgB,EAAS,EAAX,UAAaC,EAAM,EAAnB,OACNZ,EAAK,UAALA,aACA,MAED,KAAKJ,GAAL,oBACO,MAA6BD,EAA7B,QAAaoB,GAAXJ,EAAS,EAAX,UAAwB,EAAxB,aACNX,EAAK,UAALA,kBACA,MAED,KAAKJ,GAAL,cACCI,EAAK,UAALA,YAA8BgB,KAA9BhB,MACA,MAED,KAAKJ,GAAL,gBACO,MAAmBD,EAAnB,QAAEvH,EAAG,EAAL,IAAOiI,EAAO,EAAd,QACNL,EAAK,UAALA,aAA+BA,EAAK,UAApCA,WACAA,EAAK,UAALA,gBACAA,OACA,MAED,KAAKJ,GAAL,kBACCI,2BACA,MAED,KAAKJ,GAAL,uBACO,MAAmBD,EAAnB,QAAEvH,EAAG,EAAL,IAAOiI,EAAO,EAAd,QACNL,sBACA,MAED,KAAKJ,GAAL,eAEC,GADAI,EAAK,UAALA,QAA0BL,EAA1BK,QACIA,GAASA,WAATA,QAAkCA,kBAAtC,MAAmE,CAElE,GAA0BM,QAA1B,EAAIN,kBAAsBM,4BAAQ,GAAlC,oBAA0D,OAC1DN,wBAA8BA,EAAA,2BAAgC,YAC7D,IAAMb,EAASa,EAAK,UAAL,cAA6B,YAAO,OAAAG,EAAA,MAAUd,EAAV,QACnD,OACQD,GADR,GAKCY,EAAK,UAALA,QAD8B,GAHUA,EAAK,UAAd,QAAkCA,WAAjE,2BAUH,MAED,KAAKJ,GAAL,iBACCI,oBAA0BL,EAA1BK,QACA,MAED,KAAKJ,GAAL,iBACCI,EAAK,UAALA,UAA4BL,EAA5BK,YAQCiB,GAAe,CAClBpB,SAAU,CACTqB,OADS,KAET9Y,QAFS,GAGTiV,uBAHS,KAIT8D,MAAO,IAERC,UAAW,CACVhB,WADU,KAEViB,aAFU,KAGVC,YAAaN,KAHH,MAIV5Y,QAJU,GAKVmZ,aALU,GAMVrC,QANU,GAOVsC,UAAW,OAIA5B,GAAmB,CAC/B6B,oBAD+B,sBAE/BC,2BAF+B,6BAG/BC,cAH+B,gBAI/BC,qBAJ+B,uBAK/BC,cAL+B,gBAM/BC,qBAN+B,uBAO/BC,4BAP+B,8BAQ/BC,uBAR+B,yBAS/BC,gBAT+B,kBAU/BC,sCAV+B,wCAW/BC,6BAX+B,+BAY/BC,wCAZ+B,0CAa/BC,4BAb+B,8BAc/BC,cAd+B,gBAe/BC,uBAf+B,yBAgB/BC,wBAhB+B,0BAiB/BC,oBAjB+B,sBAkB/BC,gBAlB+B,kBAmB/BC,kBAnB+B,oBAoB/BC,uBApB+B,yBAqB/BC,eArB+B,iBAsB/BC,iBAtB+B,mBAuB/BC,iBAAkB,oBAGNC,GACG,cAA8B,MAAC,CAC7Czc,KAAMqZ,GADuC,4BAE7CS,QAAS,CACRpB,UADQ,EAERuB,cAAa,KALHwC,GAQO,WAAM,MAAC,CACzBzc,KAAMqZ,GAAiB6B,sBATZuB,GAWc,cAAgC,MAAC,CAC1Dzc,KAAMqZ,GADoD,2BAE1DS,QAAS,CACRJ,cADQ,EAERgD,YAAW,KAfDD,GAkBK,cAA+B,MAAC,CAChDzc,KAAMqZ,GAD0C,wCAEhDS,QAAS,CACRpB,UADQ,EAERnd,WAAYohB,KAtBFF,GAyBH,cAAwB,MAAC,CACjCzc,KAAMqZ,GAD2B,sCAEjCS,QAAS,CACRpB,UADQ,EAERoB,QAAO,KA7BG2C,GAgCE,cAAwB,MAAC,CACtCzc,KAAMqZ,GADgC,cAEtCS,QAAS,CACRjf,OADQ,EAERgf,WAAU,KApCA4C,GAuCQ,cAAwB,MAAC,CAC5Czc,KAAMqZ,GADsC,qBAE5CS,QAAS,CACRpB,UADQ,EAERsB,QAAO,KA3CGyC,GA8CU,cAA0B,MAAC,CAChDzc,KAAMqZ,GAD0C,uBAEhDS,QAAS,CACRA,QADQ,EAER4C,YAAW,KAlDDD,GAqDc,gBAAqC,MAAC,CAC/Dzc,KAAMqZ,GADyD,4BAE/DS,QAAS,CACRpB,UADQ,EAERoB,QAFQ,EAGR4C,YAAW,KA1DDD,GA6De,cAAwB,MAAC,CACnDzc,KAAMqZ,GAD6C,6BAEnDS,QAAS,CACRpB,UADQ,EAERyB,QAAO,KAjEGsC,GA2EI,YAAe,MAAC,CAC/Bzc,KAAMqZ,GADyB,gBAE/BS,QAASpB,IA7EE+D,GA+EE,cAAuB,MAAC,CACrCzc,KAAMqZ,GAD+B,cAErCS,QAAS,CACRM,UADQ,EAERC,OAAM,KAnFIoC,GAsFU,cAAyB,MAAC,CAC/Czc,KAAMqZ,GADyC,uBAE/CS,QAAS,CACRM,UADQ,EAERE,SAAQ,KA1FEmC,GA6FW,cAAuB,MAAC,CAC9Czc,KAAMqZ,GADwC,wBAE9CS,QAAS,CACRM,UADQ,EAERC,OAAM,KAjGIoC,GAoGO,cAA4B,MAAC,CAC/Czc,KAAMqZ,GADyC,oBAE/CS,QAAS,CACRM,UADQ,EAERI,YAAW,KAxGDiC,GA8GG,cAAkB,MAAC,CACjCzc,KAAMqZ,GAD2B,gBAEjCS,QAAS,CACRjI,IADQ,EAERiI,QAAO,KAlHG2C,GAyHU,cAAkB,MAAC,CACxCzc,KAAMqZ,GADkC,uBAExCS,QAAS,CACRjI,IADQ,EAERiI,QAAO,KA7HG2C,GAgIG,YAAa,MAAC,CAC5Bzc,KAAMqZ,GADsB,eAE5BS,QAASnB,IAlIE8D,GAoII,YAAc,MAAC,CAC9Bzc,KAAMqZ,GADwB,iBAE9BS,QAAS8C,IAtIEH,GAwIK,YAAe,MAAC,CAChCzc,KAAMqZ,GAD0B,iBAEhCS,QAASmB,I,IC5aE4B,GAAuB,SAAC,G,QAACnE,EAAS,EAATA,UAAWoE,EAAS,EAApB,UAAsB9F,EAAK,EAA3B,MAA6BnE,EAAK,EAAlC,MAAoCkE,EAAK,EAAzC,MAA2CgC,EAAa,EAAxD,cAA0D9B,EAAiB,EAA3E,kBAA6Eja,IAA7E,WAA6EA,OAAU,IAAG,GAA1F,EAAoG0Y,EAAI,cAAzG,oGAC7B,EAA0DqH,qBAA1D,IAAoBjG,EAAsB,iBAA1C,uBAA8CkG,EAAQ,EAAtD,SAQN,OACEla,YAACwV,gBACCL,mBAAoBZ,YAA0BP,GAC9CtB,mBAAoB,YAAO,OATC,SAACkD,EAAWoE,EAAWlf,GACrD,IAAMqf,EAAmBC,WAAWA,eAApC,IACAD,4BACAD,EAASP,KAATO,IAM6B1f,CAAwBob,EAAWoE,EAAWlK,eAAC,IAADA,WAA9C,OAC3B2C,WAAoCja,QAA1B,EAAiBwB,QAAjB,EAAEic,eAAa,IAAbA,WAAejc,8BAASxB,mCAAewhB,GACnD9F,MAAOA,EACPD,MAAOA,EACPlE,MAAOA,EACPoE,kBAAmBA,EACnBiB,WAAYA,GAThB,KCbWhY,GAAS,CACrB2R,IADqB,cAErBgB,MAFqB,cAGrBsK,KAHqB,iBAIrBC,QRSkE,SAAC,G,IACnEjhB,+BAAmB,IAAG,GAAE4U,gBAAF,aAAiCsM,MAAO,QAAxC,EACtBvM,EAAU,aACV7V,EAAI,OACJuC,yBAAa,MAACmW,KAER2J,EAAgB3d,mBAAQ,W,MAC7B,OAAagT,QAAb,EAAO1X,eAAI,IAAJA,WAAM0X,8BAAS4K,KAAI,SAAA7M,GAAS,OAAAA,aACjC,CAFH,IASA,MALM,oBAAqBvQ,YAA3B,KACC6Y,gCAIOsE,GAAiBnd,sBAAlB,EACN,sBACClF,KAAMqiB,EACNxM,WAAYA,EACZC,gBAAiBiI,EAAoBjI,gBACrCsM,MAAOrE,EAAoBqE,QAG5B,uBACCA,MAAM,gBACNF,KAAK,eACLK,YAAaC,KQlCfC,SALqB,GAMrBC,MCS8B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBACxD,OACEjW,YAAC8a,IAAMC,cACL/a,YAAC+Z,IACCnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,WACPjL,MAAO,kBACPkG,cAAeA,E,UACP,8BAEVjW,YAAC+Z,IACCnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,WACPjL,MAAO,kBACPkG,cAAeA,E,UACP,mCDzBfhC,MAAO,CAAC+G,IAPa,aAQrBC,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,OELHyiB,GAAW,SAAC,G,IAAElN,EAAU,aAAE7V,EAAI,OAAEgjB,EAAQ,WAAE9hB,oBAAQ,IAAG,OAC3D+hB,EAASC,iBAAf,MACMC,EAAeD,iBAArB,MACME,EAAeF,iBAArB,MACMG,EAAeH,iBAArB,MACMI,EAAeJ,iBAAO,CAAEK,MAAF,GAAaC,MAAO,KAC1CC,EAAWP,iBAAO,CAAEK,MAAO,KAEzBvN,EAAkBH,EAAlBG,OAAQD,EAAUF,EAAlB,MACF,EAAqB,CAAC,GAAtB,IAAC6N,EAAO,EAAR,GAAUC,EAAO,EAAjB,GAGLJ,EAGGvjB,EAHHujB,MACSC,EAENxjB,QAHH,MAEA4jB,EACG5jB,EAHH,cAMK6jB,EAAQnf,mBACb,WACC,cAAA+R,EAAA,YAES,CAAC,EAAGmN,SAFb,UAGQ,CAACF,EAAS3N,EAHlB,MAID,CAACA,EAAO2N,EANT,IAUMI,EAAQpf,mBACb,WACC,cAAA+R,EAAA,YAES,CAAC,EAFV,UAGQ,CAACkN,EAAS3N,EAHlB,MAID,CAAC2N,EANF,IAsBMI,EAAiBrf,mBAAQ,WAC9B,OAAOkf,EAAA,KAAkB,cAExB,OADAI,IAAMH,EAANG,GACA,OAEC,CAACJ,EALJ,IA8XA,OAvWA/P,qBAAU,WAIT3O,0BAA6B,cAC5B,IAAM+e,EAAQ/e,iBAAd,OACAA,0BAA8B,cAC7Bgf,IAASL,EAAME,KAAfG,OACAA,IAASJ,GAAOK,EAAD,IAAWF,EAA1BC,UAGFT,kBAKAH,+BACKc,EAAL,OAGCd,gBAA6BE,EAAA,QAAa,YACzC,OAAOa,EAAA,WAAe,YAAO,OAAAD,EAAA,KAAa,YAAO,OAAAE,EAAA,OAApB,SAAAC,SAH9BjB,mBAQD,IAAMkB,EAAW,OAAA/N,EAAA,aAER,YACP,IAAMzC,EAAMyP,gBAAuBgB,SAAvBhB,aAA6CgB,SAAzD,OACA,MAAO,CAACzQ,EAAD,EAAQA,EAAf,MAJe,QAMR,YACP,IAAM0Q,EAAMjB,gBAAuBgB,SAAvBhB,aAA6CgB,SAAzD,OACA,MAAO,CAACC,EAAD,EAAQA,EAAf,MAIIC,EAAIlO,YAAUwM,EAAVxM,+BAAV,KAGMmO,EAAe,SAACP,EAAMH,GAC3B,OAAOG,kBAAuBH,EAAvBG,eAA6CA,UAAeH,EAAnE,KASKW,EAAkB,SAACX,GACxB,OAAOZ,EAAA,oBAAgC,YAAO,OANtBwB,EAMsBR,GAN7BS,EAMsCb,GALhDa,gBAAwBD,EAAxBC,eAA+CA,QAAcD,EAApE,IADgB,IAACC,EAAOD,MAUnBE,EAAuB,SAACX,GAC7B,OAAIf,gBAAJ,OACkBA,EAAA,sBAAkC,YAAO,OAAAmB,EAAA,MAAUJ,EAAV,OACnDY,WAAP,GAED,IAIKC,EAAc,SAACC,GAEpB,IAAMC,EAAYD,EAAA,0CAGL,YAAO,cAAQ7N,EAAR,kBAA2BA,EAA3B,cAHF,kBAIE,YAAO,qBAAeA,EAAf,SAJT,4CAMJ,cAAa,OAxFL,SAAC4M,GACxB,IAAMI,EAAIe,YAAKnB,EAAM,CAAC,cAAe,gBAArC,QACIoB,EAAJ,GACM7hB,EAAQ2gB,EAAA,WAAmB,YAAU,OAAAmB,EAAA,cAAqBjB,EAArB,aAAsCiB,QAAajB,EAAnD,OACvC7gB,GAAJ,GACC2gB,cACAkB,MAEAlB,UACAkB,KAGD,GAActC,EAAS,OAAD,IAAC,CAATA,IA4EcwC,CAAA,MANT,gBAOA,cAEhB/O,iBAhKL,GAgKKA,6CAGAA,YAAU0M,EAAV1M,oCAES,YAAO,OAACgO,gBAAgBgB,EAAjB,QAFhBhP,2EASAA,YAAU0M,EAAV1M,wCAES,YAAO,OAACgO,gBAAgBgB,EAAjB,QAFhBhP,+CAOA,IAAIgO,EAAJ,GAGAhO,YAAU0M,EAAV1M,oCAES,YAAO,OAAAgO,EAAA,cAAgBgB,EAAhB,QAFhBhP,yCpBvLE,WoBuLFA,gCAOO,YACLgO,OAAOnN,EAAPmN,QACAA,OAAOnN,EAAPmN,WAIFA,EAAIjf,WAAW,IAAIkgB,IAAnBjB,IAGAhO,YAAU2M,EAAV3M,yCAES,YAAO,OAAAgO,EAAA,QAAS,YAAY,OAAAG,EAAae,EAAb,MAArB,UAFhBlP,iDA/CgB,eAsDD,WAEfA,uDAEiB,YAAO,OAACoO,aAAD,iBAGxBpO,YAAU0M,EAAV1M,qEpBrNE,WoBqNFA,uBAKyB,YAAO,OAAAuO,EAAA,MAGhCvO,YAAU2M,EAAV3M,kFAIF2O,kGAKiB,YAAO,OAACP,aAAD,iBALxBO,uBASAA,yFpB1OI,WoBkPJ,IAAMQ,EAAYR,2JAAlB,QAoEA,OA3DAQ,uBAEO,YAAO,OAAAC,GAAYvO,EAAD,MAnP5B,OAiPGsO,4FASAA,2BAAmC,SAAU7jB,GACtC,MAAoB0U,YAAUhX,KAAVgX,kCAApB,UAAEV,EAAK,EAAP,MAASC,EAAM,EAAf,OACA8P,EAAY,EAAE/P,EAAQ,EAAV,GAAkBC,EAAS,EAA7C,GACA,MAAO,KAAK8P,EAAL,OAAqBA,EAArB,sBACG/P,EADH,0BAEKC,EAFL,sBAGID,EAHJ,8DAMIA,EANJ,EAAP,QAUD6P,uBAEO,YAAO,OAAAC,GAAYvO,EAAD,MAzQ5B,OAuQGsO,6LAYAR,OACC,OAAA3O,EAAA,iBAEc,YACZ9B,mCAHF,WAKa,SAAUA,EAAO2C,GACpB,IAAAhB,EAAM3B,EAAN2B,EACRgB,MAEAb,mCAAkC,kBAAlCA,KAGAA,YAAU0M,EAAV1M,oCAES,YAAO,OAAAmO,EAAaH,EAAD,OAAZ,MAFhBhO,UAGY,YAAO,OAAA+N,EAAA,MAGnB/N,YAAU0M,EAAV1M,oCAES,YAAO,OAAAmO,EAAaH,EAAD,OAAZ,MAFhBhO,UAGY,YAAO,OAAA+N,EAAA,UAGtB,GAID/N,YAAU2M,EAAV3M,oCAEuB,YAAO,OAAAa,EAAA,SAF9Bb,MAIE,YAEC,IAAMsP,EAAIC,EAAA,iDAGU,YAAO,mBAAa1O,EAAb,WAmC3B,OAhCAyO,oDAEO,YAAO,OAAAF,GAAYvO,EAAD,MAAX,OAFdyO,0EAOAA,sFAIajC,EAJbiC,2BAMajC,EANbiC,IASAA,2BAEE,YACC,OAAO7gB,cAAcue,gBAAuBnM,EAA5C,WAED,YAAO,OAAAA,EAAA,OALTyO,MASE,YAAW,OAAAb,EAAA,MACX,YAAY,OAAAe,KACZ,YACCC,cAIH,KAED,YA0CC,OAxCAD,QACO,YAAW,OAAAD,EAAA,gCAAsC,YAAO,mBAAa1O,EAAb,cAD/D2O,4BAGanC,EAHbmC,cAIanC,EAJbmC,IAOAA,2BAGE,YACC,OAAO/gB,cAAcue,gBAAuBnM,EAA5C,WAED,YAAO,OAAAA,EAAA,OANT2O,MASE,YAAW,OAAAf,EAAA,MACX,YACC,OAAAe,EAAA,MAAY,YAAY,OAAAA,EAAA,gCAAuC,cAAW,qBAAe3O,EAAf,eAC3E,YACC4O,cAKHD,gCAGE,YACC,OAAO/gB,cAAcue,gBAAuBnM,EAA5C,WAED,YAAO,OAAAA,EAAA,OANT2O,MASE,YAAW,OAAAf,EAAA,MACX,YAAY,OAAAe,EAAA,MAAY,YAAY,OAAAA,EAAA,oBACpC,YACCC,cAGH,KAED,YACCA,cAKHzP,YAAU0M,EAAV1M,oCAEc,YAAO,OAAAa,EAAA,OAFrBb,MAIE,YAECuP,kDpBhaE,WoBgaFA,0BAKO,YACL,OAAAA,EAAA,qCAEyB,YAAO,OAAAhB,EAAA,MAFhC,UAGY,YAAO,OAAAR,EAAA,YAGtB,YAECyB,gBpB9aE,WoB8aFA,MAAyC,YACxC,OAAAA,EAAA,qCAEyB,YAAO,OAAAjB,EAAA,MAFhC,UAGY,YAAO,OAAAR,EAAA,YAGrB,YACC0B,gBAID,CAAC3C,EAAOC,EAAOO,EAAgBD,EArWlCjQ,IAwWChM,mB,UAAa,gBAAgBkO,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,GACrFpb,iBAAGse,IAAK9C,GACPxb,iBAAGse,IAAKhD,IACRtb,iBAAGse,IAAK/C,OAMZ,SAASyC,GAAYO,EAAKC,EAAKC,GAE9B,OADAA,EAAMA,GAANA,MACsB,kBAARF,GAAoBA,SAA3B,EAA8CA,iBAA9C,EAAP,EAGDrD,aAAqB,CACpBwD,eAAgBne,IADI,IAEpBpI,KAAMoI,IAFc,IAGpBvF,QAASuF,IAHW,IAIpByN,WAAYzN,IAAUoe,QC1cvB,IAAMC,GAAsB,aA0D5B,I,SAAMvB,GAAc,SAAAwB,GAEnB,IAAInD,EAAJ,GAgBA,OAfAmD,yBAA8B,cAC7BnD,QACAre,eAAewhB,aAAfxhB,aAAqD,cAEpDqe,KAAgB9N,KAAhB8N,eAA0C,CACzC3M,IAAKnB,KADoC,cAEzCwO,MAAOxO,EAFkC,GAGzCmC,MAAOnC,EAHkC,GAIzCkR,cAJyC,EAKzCC,YAAaF,gBAL4B,GAMzCG,WAAY1C,SAKf,GAIK2C,GAAc,SAAAJ,GAEnB,IAAIlD,EAAJ,GAiCA,OAhCAkD,iBAAsB,SAAArC,GACrB,IAAK,IAAI3N,EAAT,EAAgBA,EAAIgQ,uBAApB,EAAsDhQ,IAAK,CAE1D,IAAMqQ,EAAW1C,UAAjB,cACM2C,EAAW3C,OAAU3N,EAAV2N,GAHyC,cAMpDzN,EAASF,aAAiBA,EAAjBA,OAAf,EAEI8M,EAAJ,IACCA,YAAoBa,EAApBb,MACAA,UAAkBA,EAAA,eAAuBa,OAAK,KAAS,SAAAI,GAAK,OAAAA,EAAA,mBAG5DjB,KAAa,CACZyD,OAAQ,CAAEN,cAAF,EAAoBC,YAAaF,gBAAjC,GAA2DjR,MAAOsR,GAC1EG,OAAQ,CAAEP,cAAejQ,EAAjB,EAAwBkQ,YAAaF,gBAAsBhQ,EAA3D,GAAmEjB,MAAOuR,GAClF/C,MAAOI,EAHK,MAIZzN,IAJY,EAKZuQ,KAAM9C,OAAK,KAAS,SAAAI,GAAK,OAAAA,EAAA,sBAatB,CACNjB,MANDA,GADAA,EAAQte,cAARse,IACQ,KAAU,SAAAa,GAEjB,OADAA,OAAY7e,WAAW,IAAIkgB,IAAIrB,EAA/BA,OACA,KAKA+C,aAAc,OAAA3Q,EAAA,MAAc,SAAAgO,GAAK,OAAAA,EAAA,WC3HnC,GACY,WCEC4C,GAAkB,CAC9BC,cAAe3f,YAAG,uFAGlB4f,WAAY5f,YAAG,0KACoB,gGAAZW,GALO,OAW9Bkf,WAAY7f,YAAG,4KCoBV8f,GAAgB,SAAC,G,IAAEvN,EAAI,OAAEzW,EAAK,QAAEikB,EAAa,gBAAEC,EAAc,iBACzDxO,EAAae,EAAbf,KAAMyO,EAAO1N,EAAb,GACFiM,EAAMjD,iBAAZ,MACS2E,EAAQC,YAAQ,CACvBC,OAAQC,GACRC,MAAK,SAAC/N,EAAMgO,GACV,GAAK/B,EAAL,SAGA,IAAMgC,EAAYjO,EAAlB,MACMkO,EAAN,EAEA,GAAID,IAAJ,GAIA,IAAME,EAAoBlC,UAA1B,wBAEMmC,GAAgBD,SAA2BA,EAA5B,KAArB,EAIME,EAFeL,EAArB,kBAEqBM,EAAiBH,EAAtC,IAKIF,KAA0BI,EAA9B,GAIIJ,KAA0BI,EAA9B,IAIAb,EAAcS,EAAdT,GAKAxN,gBArCE,GAwCA,EAAyBuO,YAAQ,CACrCvO,KAAM,CAAEnV,KAAMijB,GAAoBJ,GAA5B,EAAgCnkB,MAAK,GAC3CilB,QAAS,SAAAR,GAAW,MAAC,CACnBS,WAAYT,mBAGVU,EANa,KAAb,WAMuB,EAA7B,GACAC,EAP2B,EAArB,IAODhB,EAALgB,IAEQ,IAAAtB,EAA2BF,GAA3BE,WAAYC,EAAeH,GAA3B,WAER,OACExf,mBAAKse,IAAKA,EAAKxe,IAAK4f,EAAYtR,MAAO,CAAE2S,QAAO,GAAI9U,QAAS,WAAM,OAAA6T,EAAA,KACjE9f,YAACmN,KAAOiG,SAAO,EAACtT,IAAK6f,GAFzB,KAUFC,aAA0B,CACxBvN,KAAM9R,IADkB,OAExB3E,MAAO2E,IAFiB,OAGxBsf,cAAetf,IAHS,KAIxBuf,eAAgBvf,IAAUC,MC9F5B,IAAMygB,GAAY,SAAAC,GACT,IAAApO,EAAyCoO,EAAzCpO,MAAO+M,EAAkCqB,EAAzC,cAAsBpB,EAAmBoB,EAAzC,eAaAzB,EAAkBD,GAAlBC,cAER,OACCzf,YAAC8a,IAAMC,cACN/a,mBAAKF,IAAK2f,GACR3M,EAAA,KAAU,cAAa,OAjBC,SAACT,EAAMzW,GAClC,OACCoE,YAAC4f,IACA7Q,IAAKsD,EAAK0N,GACVnkB,MAAOA,EACPyW,KAAMA,EACNwN,cAAeA,EACfC,eAAgBA,IAUQqB,CAAoB9O,EAApB,SAO5B4O,aAAsB,CACrBnO,MAAOvS,IADc,MAErBuf,eAAgBvf,IAFK,KAGrBsf,cAAetf,IAAUC,M,yoTC3B1B,SAAS4gB,GAASC,GAChB,OAAO,SAAqB,SAAAxS,GAAK,OAAAA,EAAA,uBAGnC,SAAgByS,GAAQD,GACtB,IAAMhH,EAAO+G,GAAb,GACA,OAAO/G,EAAOA,OAAKA,MAALA,KAAH,KAAX,GAgBF,SAAgBkH,GAAKC,G,IAAEnH,EAAI,OAAEhhB,oBAAQ,IAAG,OAAIqB,qBAAS,IAAG,OAAIR,wBAAY,OAAC,EACvE,OAbSknB,GAaT,GAEIphB,YAACyhB,IACCxhB,UAAcsN,aAAgBtN,E,YACnBoa,EACXnM,MAAOwT,EACPvT,OAAQuT,EACRC,QAAQ,iBAEPC,EAAe5hB,yBAnBxB,SAA6BqhB,GAC3B,IAAMhH,EAAO+G,GAAb,GACA,SACU/G,QAAaA,OAAd,IAA+BA,aAAtC,KAEA,GAc4BwH,CAAX,IAAyC,KACtD7hB,iBAAGC,UAAWoa,GACZra,oBAAMyP,EAAG6R,GAAQjH,OAKhBra,YAAC8hB,KAAOzH,KAAMA,EAAMqH,SAAUA,IAIzC,I,GAAMD,GAAU,qHAAU,yBAEuC,kBACE,eADvD,SAAAP,GAAS,OAACA,QAAcA,EAAdA,MAAD,kBACP,SAAAA,GAAS,OAACA,QAAcA,EAAdA,MAAD,kBAIvBK,aAAiB,CACfthB,UAAWM,IADI,OAEf8Z,KAAM9Z,IAFS,IAGfmhB,SAAUnhB,IAHK,OAIf6N,MAAO7N,IAJQ,OAKfqhB,aAAcrhB,IAAUsT,MC/DnB,I,kBAAMkO,GAAoB,CAC/BzH,QAASxa,YAAG,+EAGZkiB,YAAaliB,YAAG,yHAIhBmiB,WAAYniB,YAAG,qMAMfoiB,cAAepiB,YAAG,qRAOlBqiB,aAAcriB,YAAG,2FAGjBsiB,UAAWtiB,YAAG,4FCZVuiB,GAA0B,SAAAC,GAAS,OAAAA,EAAA,KAAU,SAAAhR,GAAQ,MAAC,CAACyO,GAAIwC,cAAUjR,KAAI,OAC/E,YAAwBkQ,G,IAAE1O,EAAK,QAAEzZ,2BAAe,IAAG,EAAAyZ,IAAOpY,wBAAY,MAAC,IAAG8nB,EAAQ,WAE3EC,EAAoB3P,EAAA,QAAa,SAAAT,GAAQ,OAACqQ,WAAD,MACzCC,EAAiBN,GAAvB,GACMO,EAA2BP,GAAjC,GACMQ,EAA6BR,GAAnC,GAEM,EAA0B9W,mBAA1B,GAACgR,EAAQ,EAAT,GAAWuG,EAAW,EAAtB,GAEA,EAA8BvX,mBAA9B,GAACwX,EAAU,EAAX,GAAaC,EAAa,EAA1B,GAEAC,EAAevN,uBACpB,cACC,IAAMwN,EAAW3G,EAAjB,GACAuG,EACC1E,IAAO7B,EAAU,CAChB4G,QAAS,CACR,CAACC,EADO,GAER,CAACC,EAAe,EAFR,SAOZ,CAZD,IAeMC,EAAiB5N,uBACtB,cACC,IAAMwN,EAAWH,EAAjB,GACAC,EACC5E,IAAO2E,EAAY,CAClBI,QAAS,CACR,CAACC,EADO,GAER,CAACC,EAAe,EAFR,SAOZ,CAZD,IA2DQjB,EAAcL,GAAdK,UACR,OACCpiB,mBAAKF,IAAKyjB,IACTvjB,mBAAKF,IAAK0jB,IACTxjB,kBAAIF,IAAKsiB,GACRpiB,sCAEDA,YAACyjB,KAAYC,QAASC,KACrB3jB,YAAC4jB,IAAmB9Q,MAAOiQ,EAAYlD,cAAeyD,EAAgBxD,eApDrD,SAAA+D,GACpBf,GAAY,SAAAvG,GAAY,mBAAIA,GAAJ,OACxByG,EAAcD,EAAA,QAAkB,SAAA1Q,GAAQ,OAAAA,IAAA,WAqDvCrS,mBAAKF,IAAKgkB,IACT9jB,YAACmN,KAAOiG,SAAS,EAAMnH,QAnBL,WACpB,IAAM8X,EAAmBxH,EAAA,KAAa,SAAAlK,GAAQ,OAAAA,EAAA,QACxC2R,EAAqBjB,EAAA,KAAe,SAAA1Q,GAAQ,OAAAA,EAAA,QAElDmQ,EADqB,CAAEjG,SAAF,EAA8BwG,WAAYiB,KAgBfzJ,MAAM,WACnDva,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,aAE1Bra,YAACmN,KAAOiG,SAAS,EAAMnH,QAhCN,WACnB6W,KACAE,MA8B+CzI,MAAM,SAClDva,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,WAE1Bra,YAACmN,KAAOiG,SAAS,EAAMnH,QAnDF,WACnB0W,IAAJ,IACCG,KACAE,QAgDkDzI,MAAM,cACtDva,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,0BAE1Bra,YAACmN,KAAOiG,SAAS,EAAMnH,QA5CA,WACrBsQ,UAAJ,IACAuG,EAAYH,UAAZG,IACAE,EAAcL,QAAdK,MAyCqDzI,MAAM,gBACxDva,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,0BAG3Bra,mBAAKF,IAAK0jB,IACTxjB,kBAAIF,IAAKsiB,GACRpiB,oCAEDA,YAACyjB,KAAYC,QAASC,KACrB3jB,YAAC4jB,IACA9Q,MAAOyJ,EACPsD,cAAeoD,EACfnD,eAxEkB,SAAA+D,GAClBtH,UAAJ,IACAyG,GAAc,SAAAzG,GAAY,mBAAIA,GAAJ,OAC1BuG,EAAYvG,EAAA,QAAgB,SAAAlK,GAAQ,OAAAA,IAAA,aA6EtC,I,SAAMkR,GAAezjB,YAAG,mPAGoB,SAA1BqI,GAHlB,kBAKMqb,GAAqB1jB,YAAG,2DAGxBgkB,GAAkBhkB,YAAG,+aAOM,eACG,oFADrBW,GAPY,YAQjBwF,GARV,eC3IQge,GAAoCtK,GAAtBuK,GAAsBvK,GCHtC1F,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAf,QAEa/mB,GAAS,CACpB2R,IADoB,WAEpBgB,MAFoB,WAGpBsK,KAHoB,uBAIpBC,QTKF,SAAgCkH,G,MAAExT,EAAU,aAAE7V,EAAI,OAAEyd,EAAS,YAAWxd,EAAO,UAEpE,GAA6C,QAA7C,EAAmC6hB,qBAAWviB,WAAD,QAAsB,IAAnEwiB,gBAAQ,IAAG,EAAA0E,GAAX,EACJ,EAAoCrT,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GA4BN,OAnBApY,qBAAU,WAET,GAAK7T,IAAU,OAAAA,QAAI,IAAJA,OAAA,EAAAA,EAAA,cAAoBA,eAAI,IAAJA,WAApB,SAAmCA,eAAI,IAAJA,WAAlD,iBAEA,GAEA,IAAMujB,EAAQ2B,GAAd,GAEA,KAAIhgB,uBAAJ,IACA,IAAMse,EAAQsD,GAAd,GACMlD,EAAgB5jB,EAAA,mBAAuB,cAC5C,MAAO,CAAE4X,MAAF,EAAYnU,MAAOiT,MAI3B,GAAeqL,EAASP,GAAA,EAA4D,CAAE4C,SAAU,MAChG6H,EAAiB,CAAE1I,MAAF,EAASC,MAAT,EAAgBI,cAAa,QAC5C,CAACnG,EAAWzd,EAAM+hB,EAjBrBlO,IAmBO,EACN,sBACC7T,KAAMqiB,EACNxf,QAAS,GACTgT,WAAYA,IAKb,yBAAK/N,UAAWsN,IAAQ8W,SAAUjW,MAAO,CAAEF,MAAOF,EAAT,MAA2BG,OAAQH,EAAWG,WS5CvFyM,SALoB,GAMpBC,MCQ2B,SAAC,G,MAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEC,EAAK,QAC/D,EAKF+F,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAQApH,EAAQ,GAAiBkB,EAAwBC,EAAzC,QAA2D,SAAAnZ,GAAY,OAAAA,EAAA,QAc/E4nB,EAAiC1oB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,2CACtC,OACCgG,YAACskB,SACDtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAACykB,IAAkB3R,MAAOA,EAAO4P,gBAAiBA,EACxCF,SAjBkB,SAAC,G,IAEzBkC,EAFkD,WAErC,QAAgB,SAAAvM,GAClC,OAAArF,EAAA,eAIKqH,EAAmBC,WAAWA,eAApC,IACAD,yBACAD,EAASP,KAATO,KAQ8CyK,aAAc,QDnC5DC,QDK6B,SAAC,G,MAAEvN,EAAO,UACjC,EAIF4C,qBAJE,IAEqB/f,2BAFrB,SAE+B2qB,OAAc,IAAG,KAFhD,EAGD3K,EAAQ,EAHP,SAoCN,OAfAlO,qBAAU,WACR,IAAI8Y,YAAJ,IAGA,IAAIpN,EAAcra,OAAA,QAAewnB,GAAf,SAAyC,Y,IAAE9V,EAAG,KAAEhU,EAAM,KAEtE,MAAO,CACLgqB,IAFgB1nB,OAAA,aAAwB,SAAAuQ,G,MAAS,aAAG4T,GAAO5T,EAAV,SAMrDsM,EAASgK,GAAkB,WAAY,CAAEc,KAAMtN,QAC9C,CAACmN,EAZJ7Y,IAgBEhM,YAAC8a,IAAMC,eACKwB,QAAT,SAAAlF,QAAO,IAAPA,OAAA,EAAAA,EAASkF,+BAAT,QACDvc,YAACmN,KAAOhN,OAAQC,IAAOC,QACf4L,QAlCK,WACf,GAAIoL,eAAO,IAAPA,oBAAJ,OAA8B,CAC5B,IAAM4N,EAAN,GACA5N,oBAAyB,SAAAgF,G,MACvB4I,EAAU5I,EAAV4I,wCACKA,EAAU5I,EAAD,sBACXA,EAAKtN,MAAM,EAFdkW,OAKF/K,EAAS+J,GAAa,WAAtB/J,SAEAA,EAAS+J,GAAa,WAAtB/J,SAwBG,UAAU7C,WAAV,iBAA0CA,wBAH5C,KAFL,OCzCApD,MARoB,GASpBC,MAToB,GAUpB+G,qBAAsB,YACpB,MAAO,CACLjhB,QAAS,CACPxB,aAAc,CACZ8B,KADY,KAEZA,KAHK,MAKP7B,WAAY,CACVysB,UAAW,OAKnB1V,QAAS,YACP,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,I,0/9OE3BYoR,GACfC,GAEM,MAAoCtK,aAApC,MAACuK,EAAa,EAAd,GAAgBC,EAAgB,EAAhC,GACA,EAA4BxK,kBAA5B,GAACyK,EAAS,EAAV,GAAYC,EAAY,EAAxB,GAeN,MAAO,CACN1K,2BACE,iBACA,mCAAQ2K,iBAAkBF,EAAWG,UAAU,SAA/C,IACE,Y,IAAGpH,EAAG,MAAElQ,EAAK,QAAEsX,EAAS,YAAEC,EAAU,aAAO,OAC3C,yBACCrH,IAAKA,EACLlQ,MAAK,aAGJwX,OAAQ,KACLxX,G,iBAEYsX,GARjB,EAWC,yBAAKpH,IAAKqH,EAAWrH,IAAKlQ,MAAOuX,EAAWvX,YAI/C2C,uBApBI,sBAbP,YACC,MAAO,CACN8U,YAAa,YACZL,EAAa1Y,EAAb0Y,QACAF,MAEDQ,WAAY,WACXN,QACAF,YCLG,IA4DP,SA5DaS,GAAgD,SAAC,GAC7D,IAAAxL,EAAK,EAALA,MACAyL,EAAO,EADP,QAEA3sB,IAFA,cAEAA,OAAa,IAAG,8BAFhB,EAGG6nB,EAAK,cAJqD,qCAM7D,OAAM3G,GAAN,EAECva,iCAASkhB,GACP3G,GACAva,YAACimB,SACAjmB,oB,UAAc,uBAAuBua,IAGtCyL,GACAhmB,kBAAIC,UAAW,CAACsN,IAAD,WAAqBA,IAArB,0BACblQ,OAAA,aAAyB,cACzB,IAAI6oB,EAAgBF,EAApB,GACA,aAAIE,EAA8B,MAE9BC,iBAAJ,KACCD,EAAgBC,wBAAhBD,IAIAlmB,kBAAI+O,IAAKnT,EAAOkE,IAAKsmB,GAAa/T,MACjCrS,oBAAMF,IAAKsmB,GAAarW,OAAQsC,OAChCrS,oB,UAAe,iBAAiBqS,EAAQvS,IAAKsmB,GAAaxY,OAH5D,UAlB2B,MA+B3BwY,GAAe,CACpB/T,KAAMvS,YAAG,2JAITiQ,MAAOjQ,YAAG,6IAIV8N,MAAO9N,YAAG,kCAKX,SAAgBumB,GAAa7E,GAAE,IAAAwE,EAAO,EAAPA,QAASzL,EAAK,EAAd,MAAgB+L,EAAa,EAA7B,cAA+BC,EAAQ,EAAvC,SAA4CrF,EAAK,cAAnDM,gDAC5B,OACCxhB,YAACwmB,iBAAKC,UAAWC,IAAUC,M,UAAe,iBAAoBzF,GAC7DlhB,YAAC+lB,kBAAmB,CAAEC,QAAF,EAAWzL,MAAX,EAAkB+L,cAAa,KAFrD,GClEM,I,2BAAMM,GAAY,CACvBtM,QAASxa,YAAG,mHAIZoM,UAAWpM,YAAG,2LAKd2a,IAAK3a,YAAG,qNAOR+mB,UAAW/mB,YAAG,kGAMHgnB,GAAe,CAC1BxM,QAASxa,YAAG,qHAEM,aAJpB,IAMEoM,UAAWpM,YAAG,2IAIdinB,eAAgBjnB,YAAG,uLAKnBknB,KAAMlnB,YAAG,4MAEiB,0GAAjB,GAITmnB,SAAUnnB,YAAG,iHAEO,eAvBtB,KCbMonB,GAAW,SAAC,G,IAAE/uB,EAAI,OAAE6V,EAAU,aAAEmZ,EAAM,SAAE3I,EAAG,MAAE4I,EAAU,aAAEC,EAAU,aAAEC,EAAU,aAAEC,EAAM,SAAEC,EAAM,SAC9F,EAA0BrC,KAAzBsC,EAAO,EAAR,GAAUC,EAAY,EAAtB,GACA,EAA0Cnc,oBAA1C,GAACoc,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GACA,EAAkBrc,mBAAlB,GAACsc,EAAI,EAAL,GAAOC,EAAO,EAAd,GACA,EAAsCvc,mBAASqb,GAA/C,WAACmB,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GAEAC,EAAoBrZ,qBAEjB,CAAC,EAFgBA,UAGlB,CAAC,UnCnBH,YmCsBAsZ,EAAiB1J,EAAO8I,GAAJ,EAAmD,WAAM,iBAiBnF,OAJAtb,qBAAU,WACTgc,EAAkBpB,GAAlBoB,aACE,CAFHhc,IAKChM,mBAAKF,IAAK8mB,GAAU1a,UAAWkC,MAAO,CAAED,OAAQH,EAAV,OAA6BE,MAAO,QAAUia,YAjB9D,WAAM,OAAAP,GAAA,IAkB3BQ,UAjBoB,WAAM,OAAAR,GAAA,IAiBAS,QAhBT,SAACvY,GACfA,SAAJ,EAECgY,GAAQ,SAAAQ,GAAQ,OAAAA,EAAA,OACNxY,SAAJ,GAENgY,GAAQ,SAAAQ,GAAQ,OAAAA,EAAA,IAAcA,EAAd,IAAAA,OAWhBtoB,mBAAKF,IAAK8mB,GAAUnM,KACnBza,YAACuoB,iBAAclB,WAAYA,EAAYnZ,MAAO,IAAKC,OAAQ,IAAKC,MAAO,CAAEF,MAAF,OAAiBC,OAAQ,SAC/FnO,YAACwoB,iBAAcjB,OAAQA,EAAQM,KAAMA,EAAMY,QAAS,KACnDzoB,YAAC0oB,eAAYC,UAAWxB,IACtB,Y,IAAGyB,EAAW,cAAO,OACrB5oB,YAAC8a,IAAMC,cACL6N,EAAA,KAAgB,SAAAC,GAChB,IAAMC,EAAU1B,EAAhB,GAEA,OACCpnB,YAAC+oB,yBACAha,IAAK8Z,EAAIG,OACTL,UAAWE,E,UACH,eACR/oB,IAAKioB,EACLkB,aAAc,WAAM,OAAAjB,EAAA,KACpB5Z,MAAO,CACNnQ,QAAS,CACRoP,KAAM6a,EADE,GAERgB,OAFQ,UAGRC,YAHQ,IAIRC,QAAS,QAEVhJ,MAAO,CACN/S,KADM,UAEN6b,OAFM,UAGNC,YAHM,IAINC,QAAS,QAEVC,QAAS,CACRhc,KADQ,UAER6b,OAFQ,UAGRC,YAHQ,IAIRC,QAAS,UAGP1B,EAAa1nB,YAACqmB,IAAa9L,MAAOsO,aAAe5sB,KAAM+pB,QAAS,CAAEsD,MAAOR,WAK/EF,EAAA,QAAmB,SAAAC,GAAO,+BAAAA,EAAA,mBAA1B,KAA8E,SAAAU,GAC9E,IAAMnN,EAAQgL,EAAd,GACMoC,EAAYtB,EAAlB,GAEA,OACCloB,iBAAG+O,IAAI,aACN/O,YAACypB,cAAWC,QAAS9a,eAAoB+a,GAAI,GAAIC,GAAI,IACpD5pB,gCACCkO,MAAO,GACPC,OAAQ,GACRd,KAAMmc,EACNN,OAAO,QACPC,YAAa,KACTzB,EAAa1nB,YAACqmB,IAAa9L,MAAOgP,aAActtB,KAAM+pB,QAAS,CAAEsD,MAAOlN,QAC7Epc,oBAAMuO,EAAG,GAAIE,EAAG,GAAIC,SAAU,IAVjC,kBAqBNiZ,GAAoBF,EACpBD,GACAxnB,mBAAKF,IAAKgnB,GAAaxM,SAvE1B,K,SCrCejL,GAAYwa,GAC3B,OAAOA,OAAeA,EAAfA,IAA2Bza,cAA3Bya,QAAyDza,cAAhE,MDmHD8X,aAAqB,CACpB/uB,KAAMoI,IADc,IAEpByN,WAAYzN,IAFQ,IAGpBupB,aAAcvpB,IAHM,MAIpB+mB,WAAY/mB,IAJQ,IAKpB8mB,WAAY9mB,IALQ,OAMpB4mB,OAAQ5mB,IANY,IAOpBie,IAAKje,IAPe,OAQpB6mB,WAAY7mB,IARQ,IASpBgnB,OAAQhnB,IATY,IAUpBinB,OAAQjnB,IAAUwpB,KC1DZ,I,SAAMC,GAAgB,SAACtM,EAAD,GAC5B,WAAIuM,UAEGA,EAAA,MAAU,YAChB,OAAOC,GAAcxM,EAArB,OASWwM,GAAgB,SAACC,EAAD,GAC5B,QAASC,IAAOD,IAAOA,EAAdC,OAA0BA,IAAOA,EAAPA,MAAkBD,EAA5CC,GAAoDA,IAAOD,IAAOA,EAAlEC,QAA+EA,IAAOA,EAAPA,OAAmBD,EAA3G,IC5EYE,GAAkB,SAAAlyB,GAC9B,IACC,IAAImyB,EAAJ,GAIA,OAHAnyB,mBAAqB,SAAAyV,GACpB0c,EAAI1c,EAAJ0c,KAAiB,CAAE1c,MAAOA,EAAMwO,UAEjC,EACC,SACD,W,SCPcmO,GAAO/I,G,IDPUhD,ECORxQ,EAAU,aAAEwc,EAAQ,WACpCtc,EAAUF,EAAVE,MAGFoZ,GDX0B9I,ECWhC,EDVA,OAAA5P,EAAA,YAES,CAAC,EAFV,UAGQ,CAAC,UrCNH,asCcA6b,EAAS7b,qBAEN,CAAC,EAFKA,UAGP,CAAC,EAHT,IAQMqY,EAAW,6BAHEK,EAAnB,GAGiB,MAFAA,EAAjB,GAEA,IAEMoD,EDJP,SAAsCA,GACrC,OAAIA,EAAMA,SAANA,IAAJ,EACQ,CAAC,EAAR,GACUA,EAAMA,SAANA,IAAJ,EACC,CAAC,EAAG,EAAX,GAED,ECFcC,CAAsBF,QAApC,IAEA,OACCzqB,mBACCF,IAAKgnB,GAAa5a,UAClBkC,MAAO,CAAEF,MAAOM,WAlBlB,OAoBExO,mBAAKF,IAAKgnB,GAAaC,gBACrB2D,EAAA,KAAU,cACV,IACME,EADN,IAAgB/b,EAEb/O,YAAG,yLAIHA,YAAG,qGAC0B,yBAApBoO,EAAQuc,EANpB,IAQA,OACCzqB,mBACC+O,IAAKF,EACL/O,IAAK,CACJgnB,GADI,KAEJhnB,YAAG,iIACsC,wBACxB,yBADP+qB,YAAcvD,EADrB,IAFC,KAQJjY,GAXH,QAgBFrP,mBAAKF,IAAKgnB,GAAaG,SAAU7Y,MAAO,CAAE0c,gBAAiB7D,MC1D9D,SASgB8D,GAAMvJ,G,IAAErpB,EAAI,OAAE6V,EAAU,aAAEgd,EAAU,aAC3C9c,EAAkBF,EAAlBE,MAAOC,EAAWH,EAAlB,OACFwQ,EAAM,OAAA5P,EAAA,GAAOvR,cAAP,IAA4B,YAAO,OAACoS,EAAD,SAE/C,OACCzP,mB,UAAa,cAAcF,IAAK8mB,GAAUtM,SACzCta,YAACirB,IACA5D,WAAW,eACXF,OAAQ+D,GACR/yB,KAAMA,EACNqmB,IAAKA,EACL4I,WAAY,YAAe,OAACjvB,EAAKwwB,aAALxwB,MAAkCA,EAAKwwB,aAALxwB,MAAlCA,MAAD,GAC3B6V,WAAY,CACXG,OADW,EAEXD,MAAOA,GAERqZ,OAAQ,SACRC,OAAQwD,GAAchrB,YAACuqB,IAAOvc,WAAY,CAAEE,MAAF,EAASC,OAAQ,IAAMqc,SAAUhM,OAY/E,SAAgB2M,GAAS3J,G,IAAErpB,EAAI,OAAE6V,EAAU,aAAEgd,EAAU,aAC9C9c,EAAkBF,EAAlBE,MAAOC,EAAWH,EAAlB,OAEFwQ,EAAM,OAAA5P,EAAA,GAAOvR,cAAP,IAA4B,YAAO,OAACoS,EAAD,SAE/C,OACCzP,mB,UAAa,iBAAiBF,IAAK8mB,GAAUtM,SAC5Cta,YAACirB,IACA5D,WAAW,gBACXF,OAAQiE,GACRjzB,KAAMA,EACNqmB,IAAKA,EACL4I,WAAY,YACX,OAAIjvB,EAAKwwB,aAAT,MACQxwB,EAAKwwB,aAALxwB,MAAP,MACUA,EAAKwwB,aAAT,UACCxwB,EAAKwwB,aAALxwB,UAAP,MAED,GAED6V,WAAY,CACXG,OADW,EAEXD,MAAOA,GAERqZ,OAAQ,CAAC,EAAG,GACZC,OAAQwD,GAAchrB,YAACuqB,IAAOvc,WAAY,CAAEE,MAAF,EAASC,OAAQ,IAAMqc,SAAUhM,O,SC3D/D6M,GAAiB,GAAE,IAAA/Z,EAAI,EAAJA,KAAM5D,EAAQ,EAAd,SAAgB4d,EAAO,EAAvB,QAA4B1Y,EAAI,cAAlC,+BAC1B2Y,EAAgBzrB,YAAG,uFAIzB,OACCE,YAACmN,KAAOlN,UAAW,GAAGsN,IAAQoG,QAAW7T,IAAKwS,IAC7CtS,YAACwrB,iBAASF,QAASA,EAAS5d,SAAUA,EAAU5N,IAAKyrB,GAAmB3Y,GAF1E,IFsDD2X,aAAmB,CAClBvc,WAAYzN,IADM,IAElBkrB,WAAYlrB,IAFM,OAGlBmrB,SAAUnrB,IAHQ,OAIlBmqB,MAAOnqB,IAAU+hB,OCnClByI,aAAkB,CACjB5yB,KAAMoI,IADW,IAEjByN,WAAYzN,IAFK,IAGjByqB,WAAYzqB,IAAUsT,MAkCvBsX,aAAqB,CACpBhzB,KAAMoI,IADc,IAEpByN,WAAYzN,IAFQ,IAGpByqB,WAAYzqB,IAAUsT,MCtDvBwX,aAA6B,CAC5B/Z,KAAM/Q,YADsB,OAE5B+qB,QAAS/qB,YAFmB,KAG5BmN,SAAUnN,YAAUC,MAGd,I,MAAM8R,GAAiBxS,YAAG,qSClBpB6rB,GAAkB,SAAC,GAC/B,IAAA/V,EAAS,EAATA,UACAM,EAAmB,EADnB,oBAEA0V,EAAY,EAFZ,aAGA7b,EAAK,EAHL,MAIG6C,EAAI,cALwB,4DAOvBsH,EAAaD,yBAAbC,SACFtM,KAAUsI,eAAmB,IAAnBA,WAAhB,IAQA,OACClW,YAACqrB,gBAAiB/Z,KAAMvB,EAAOrC,SAPT,WACtB,IAAMyJ,EAAgBiD,WAAWA,eAAjC,IACAjD,QACA+C,EAASP,KAATO,KAIyDoR,QAAS1d,GADnE,KCjBKqG,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACpB2R,IADoB,SAEpBgB,MAFoB,SAGpBsK,KAHoB,QAIpBC,QCKF,SAA6BkH,G,IAAEtL,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAE6b,EAAsB,yBAAE3a,yBAAa,MAACwX,KAErGsE,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMiG,EAAgB3d,mBAAQ,WAC7B,GAAK1E,GAAD,GAAiCA,EAAKgd,EAA1C,qBAEA,IAAM0W,EAAcxuB,OAAA,QAAelF,EAAKgd,EAApB,0BAAgE,SAAAnF,GACnF,gCACCjB,IAAKiB,EAAM,IACRA,EAAM,IAAD,CACRH,QAASG,EAAA,gBAAqB,SAAAF,GAC7B,kCACIA,IACHf,IAAKe,EAAEf,cAMX,OAAOsb,GAAgBwB,EAAvB,OACE,CAAC1zB,EAjBJ,IAoBA,OAAOqiB,EACN,sBAAOriB,KAAMqiB,EAAexM,WAAYA,EAAYgd,WAAY9U,eAAmB,IAAnBA,WAAqB8U,aAErF,uBACCzQ,MAAM,gBACNF,KAAK,eACLK,YAAaC,KDpCdC,SALoB,GAMpBC,MEQwB,SAAC,G,IAC1BjF,EAAS,YACTK,EAAa,gBACb5c,+BAAmB,IAAG,OAEtB,OACC2G,YAAC8a,IAAMC,cACN/a,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,WACPkG,cAAeA,E,UACP,6BAETjW,YAAC2rB,IACA/V,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,SACN6b,aAAa,a,UACL,sBF3BV3X,MAPoB,GAQpBgH,qBAAsB,YACpB,MAAO,CACLjhB,QAAS,CACPxB,aAAc,CACZ8B,KAFK,MAIP7B,WAAY,MAIlBqzB,2BAA4B,YAC1B,MAAO,CACLd,YAAY,IAGhBxb,QAAS,YACP,OAAOuE,GAAiBC,EAAjBD,YAAP,IGTG,I,SCjBDE,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACpB2R,IADoB,YAEpBgB,MAFoB,YAGpBsK,KAHoB,QAIpBC,QCKF,SAAgCkH,G,IAAEtL,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAE6b,EAAsB,yBAAE3a,yBAAa,MAACwX,KAExGsE,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMiG,EAAgB3d,mBAAQ,WAC7B,GAAK1E,GAAD,GAAiCA,EAAKgd,EAA1C,qBAEA,IAAM0W,EAAcxuB,OAAA,QAAelF,EAAKgd,EAApB,0BAAgE,YACnF,gCACCpG,IAAKiB,EAAM,IACRA,EAAM,IAAD,CACRH,QAASG,EAAA,gBAAqB,YAC7B,kCACIF,IACHf,IAAKe,EAAEf,cAMX,OAAOsb,GAAgBwB,EAAvB,OACE,CAAC1zB,EAjBJ,IAoBA,OAAOqiB,EACN,sBAAUriB,KAAMqiB,EAAexM,WAAYA,EAAYgd,WAAY9U,eAAmB,IAAnBA,WAAqB8U,aAExF,uBACCzQ,MAAM,gBACNF,KAAK,eACLK,YAAaC,KDpCdC,SALoB,GAMpBC,MDS2B,SAAC,G,IAC7BjF,EAAS,YACTK,EAAa,gBACb5c,+BAAmB,IAAG,OAEtB,OACC2G,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,WACPkG,cAAeA,E,UACP,gCAIXjW,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAAC2rB,IACA/V,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,SACN6b,aAAa,a,UACL,yBClCZ3X,MAPoB,GAQpBgH,qBAAsB,YACpB,MAAO,CACLjhB,QAAS,CACPxB,aAAc,CACZ8B,KAFK,MAIP7B,WAAY,MAIlBqzB,2BAA4B,YAC1B,MAAO,CACLd,YAAY,IAGhBxb,QAAS,YACP,OAAOuE,GAAiBC,EAAjBD,YAAP,IErBSgY,GAAmB,SAACC,EAAD,GAAgD,OAAAA,EAAeC,EAAf,OCK1EC,GAAwC,SAAC,G,IACzBle,EAAU,sBAC/B7V,EAAI,OACJg0B,EAAQ,WACR9yB,uBAAW,IAAG,SACdqB,qBAAkB0xB,OAAU,IAAG,YAC/BlyB,8BAAkB,IAAG,OACrBe,+BAAmB,IAAG,OAEhBoxB,EAAS7d,SAASR,EAATQ,OAA4BR,EAA5BQ,OAAf,EACQ,EAAgD0H,EAAhDoW,oBAAY,IAAG,GAAf,EAAsBC,EAA0BrW,EAAhD,WAAkCsW,EAActW,EAAhD,UAGFuW,EAAN,EAAiBJ,EACXK,EAAuB1e,QAAD,EAA5B,IACM2e,GAAoB3e,QAAD,GAAD,EAAxB,GAEMoN,EAASC,iBAAf,MACMuR,EAAWvR,iBAAjB,MAEwBA,iBAAxB,GACAwR,UACA,IAAMC,EAAczR,iBAApB,GACAyR,YAGA,IAAMC,EAAY1R,iBAAlB,IAEM2R,EAAWnwB,mBAAQ,WACxB,OAAO1E,EAAA,KAAS,YAAO,OAAAsX,EAAA,UACrB,CAFH,IAKgBwd,cAmUhB,OA7TAjhB,qBAAU,WAET,IAAMkhB,EAAe/0B,EAAA,QAAY,SAAAsX,GAAK,WAAAA,EAAA,SAEhC0d,EAAeD,YAArB,GAGME,EAAiBC,GAAUhB,EAAD,EAA8BA,GAAUE,EAAa,EAArF,KAEMe,EAAiBD,GAAvB,GAAiChB,GAE3BkB,EAAwBF,GAA9B,GAAwChB,GAElCmB,EAAyBH,GAA/B,IAAyChB,GAGnCoB,EAAUC,GAAhB,GACMC,EAAcD,GAAUX,EAA9B,SAkBAne,YAAUge,EAAVhe,yCAIE,YACC,OAAAuP,EAAA,wCAGe,YAA+B,OAAA2O,EAAA,QAAoBrd,OAApB,eAH9C,6DAMD,YACC,OAAA2O,EAAA,yBAEe,YAA+B,OAAA0O,EAAA,QAAoBrd,OAApB,kBAC/C,YAAU,OAAA4O,EAAA,YAfZzP,gBAqBkB,W,QAEVhT,EAAQgT,YAAUge,EAAVhe,2CAAd,MAEAA,YAAUge,EAAVhe,uFAIkB,WAAM,eACxBA,8EAGkB,WAAM,aAHxBA,aAIe,YACb,IAAMD,EAAQC,YAASke,UAAoBrd,OAA3C,aACA,SACQd,WAAP,WAEA,QAIHC,YAAUge,EAAVhe,2DAE4EzW,QAF5EyW,EAEO,QAFPA,EAEO6e,EAAA,QAAe,YAA+B,OAAAhe,EAAA,aAA9C,yBAAqEtX,2BAF5EyW,MAIAA,YAAUge,EAAVhe,4CAEO,YAA+B,OAAAgf,GAAsBT,EAAc1d,EAAGA,UAAvC,MAGtCb,YAAUge,EAAVhe,4DAEuB,YAA+B,OAACa,UAAD,KAFtDb,iBAGmB,YAA+B,OAAAa,EAAA,sBAHlDb,oDAK0B,YAA+B,OAACa,UAAD,KAEzD,IAAMoe,EAAsCJ,EAAA,QAAe,YAA+B,OAAAhe,EAAA,aAA1F,GACMqe,EAAgBD,qBACnB,OAAAA,QAAW,IAAXA,OAAA,EAAAA,EAAA,aAAD,GAAD,EADgD,aAA3BA,GAAtB,IAKAjf,YAAUge,EAAVhe,yEAjEFA,eAoEiB,WACf,IAAMmf,EAASnf,YAAUge,EAAzB,SACAmB,yGAMe,YAA+B,OAAAjB,EAAA,QAAoBrd,OAApB,eAE9Cse,qCAEO,YAA+B,OAAAH,GAAsBT,EAAtB,MAEtCY,mDAIAA,yGAMAA,oGA5FFnf,0CAfiB,SAACa,EAAD,G,MAEVue,EAAuC,CAC5CC,WAD4C,EAE5CC,SAF4C,EAG5CC,SAH4C,EAI5CvgB,MAJ4C,EAK5ChS,MAL4C,EAM5CzD,KAAM,CAAE8D,KAAF,GAAY2R,MAAO,IAEpBwgB,EAAexf,YAA0B,QAA1BA,EAAe+e,EAAY/xB,UAAD,QAA1BgT,EAArB,GACA,OAAO,YAAe,OAAAwe,EAAegB,EAAf,QA0GvBxf,YAAUge,EAAVhe,wFAGI8d,IAAJ,GAEC9d,YAAUge,EAAVhe,oDAGO,YAEL,IAAMyf,EAAQlQ,yCAAd,GAIMmQ,EAAN,GAoFA,OAlFAD,sGAKiB,YACf,IAAIE,EAAOf,WAAX,GACIgB,EAAOlB,WAAX,GACImB,EAAOnB,WAAX,GACIoB,EAAWC,GAAf,GAEA,OADAF,KAAUpC,OAAiBqC,EAAWlgB,KAAXkgB,MAA3BD,GACO,CAACF,EAAMC,EAAd,MAGFH,oDAGO,YAA+B,OAAA5e,EAAA,aAHtC4e,qBAIuB,YACrB,OAAOM,MAAyBngB,KAAzBmgB,WAAP,SALFN,gFASoB,YAClB,IAAIO,EAAMtB,WAAV,GAEA,OADAsB,KAASvC,GAAUsC,MAAyBngB,KAAzBmgB,MAAnBC,GACO,eAAP,OAZFP,yDAekB,WAAM,OAAA7B,EAAY,UAAZ,QAfxB6B,YAgBc,c,YACZ,IAAMl2B,QAAH,SAAAsX,QAAC,IAADA,OAAA,EAAAA,EAAGtX,2BAAH,OAAH,EACC,GAAGq0B,WAAH,+BAAqD,CAIpD,IAAMqC,GAAgB12B,QAAJ,EAACsX,eAAC,IAADA,WAAGtX,2BAAJ,YAAlB,YACM4W,EAAM8f,EAAYA,EAAH,MAAwB12B,QAAxB,EAAqBsX,eAAC,IAADA,WAAGtX,2BAA7C,KACA,GACC22B,YAAY,GAAGtC,gBAAfsC,kBAGDA,YAAY,GAAGtC,gBAA4Br0B,QAA5Bq0B,EAAyB/c,eAAC,IAADA,WAAGtX,2BAA3C22B,mBA5BJT,MA+BO,YACL,IAAIO,EAAMtB,WAAV,GACAsB,KAASvC,GAAUsC,MAAyBngB,KAAzBmgB,MAAnBC,GAEA,IAAIxd,EAAOxC,YAAX,MACMmgB,EAAO3d,SAAb,UAEM4d,EAAuB,CAAE7gB,OAAQ4gB,EAAV,OAAuB7gB,MAAO6gB,EAA9B,MAA2CxgB,EAAGqgB,EAA9C,GAAsDngB,EAAGmgB,EAAI,IAE1F3d,GAAc,KAAM,uCAClB,SAAAM,GAAc,OAAAA,EAAA,KADhBN,sBAIK+Y,GAAcgF,EAAW3xB,cAA9B,MACCixB,EAAkB7e,OAAlB6e,YAKHD,oDAGO,YAA+B,OAAAT,GAAsBT,EAAtB,MAHtCkB,mGAOgB,YACd,IAAM1f,EAAQme,UAAoBrd,OAAlC,YACA,OAAOd,EAAQkc,YAAH,GAAZ,WATFwD,sDAYoB,YAA+B,mBAAed,WAAf,UAZnDc,wCAgBAA,oBAAwB,YAAO,YAAkBC,EAAkB7e,OAApC,SAE/B,KAKH,IAAMwf,EAAqBzgB,WAAWA,YAAaA,SAAS6d,EAAT7d,GAAnD,MAIAI,YAAUge,EAAVhe,4CACA,IAAIsgB,EAActgB,YACTge,EADShe,iEAIoBqgB,EAAN,MAJdrgB,oBAAlB,UAMA,EAwBCsgB,+DAvBAA,sBAEO7f,GAFP6f,aAGY,MAHZA,oFAMAA,kCAGe,EAACD,EAHhBC,MAIAA,4EAIwBC,QAJxBD,SAKgBC,QAChBD,oFAIwBC,QAJxBD,SAKgBC,SAUjBvgB,YAAUge,EAAVhe,2IAKwB,WAAM,cAAAA,EAAA,eAG9Bme,cACE,CAAC50B,EAAMk0B,EAAQD,EAAYpe,EAAYohB,EAAoBpC,EAAUqC,EAAa3C,EApSrF1gB,IAsSAA,qBAAU,WAET4C,YAAUge,EAAVhe,wCAEe,YAA+B,OAAAke,EAAA,QAAoBrd,OAApB,iBAC5C,CALHzD,IAOAA,qBAAU,WACT,IAAMsjB,EAAe1gB,YAAUge,EAA/B,SACA0C,sEAGAA,4CAEmB/C,EAAa,IAFhC+C,KAIA,IAAMlC,EAAiBC,GAAUhB,EAAD,EAA8BA,GAAUE,EAAa,EAArF,KACA+C,+CAIE,CAdHtjB,IAiBChM,mBAAKF,IAAKyvB,IACTvvB,mB,UAAa,aAAakO,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,GAClFpb,iBAAGse,IAAKsO,EAAU5d,UAAW,aAAahB,QAAb,MAAqCA,SAArC,WAQ3BuhB,GAAWzvB,YAAG,29BA8Bd4tB,GAAY,OAAA9e,EAAA,YAEV,YAAmB,OAAA4gB,EAAA,SAFT,KAAlB,MAUMnC,GAAY,SAACoC,EAAD,GACjB,OAAO7gB,yCAGO8gB,GAHd,IAUKf,GAAsB,SAAClf,GAA8B,OAAAA,EAAA,YAAgBA,WAAaA,EAAd,YAAf,GAQrDme,GAAwB,SAACT,EAAD,KAC7B,IAAMwC,IAAuBlgB,cAAD,GAAD,EAAD,aAAqDmgB,EAAY,EAAjE,GAA1B,IAEA,SACWngB,kBAAV,EAEA,GChbWogB,GAAaC,sBAA2C,c,IACjExe,EAAI,OAAC3C,EAAK,QAACohB,EAAS,YAACC,EAAQ,WAAEC,EAAO,UAAEhkB,EAAO,UAE5CikB,EAAW,SAACpgB,GACdmgB,GAAH,GACCD,IAED/jB,MAEE,OACIgkB,EAAYjwB,mBAAQse,IAAOA,EACPvP,IAAOuC,EACPrR,UAAW,aACXH,IAAKqwB,GACLtK,YAAakK,EAAY,WAAI,OAAAA,EAAA,IAAgB,KAC7CjK,WAAYkK,EAAW,WAAM,OAAAA,KAAW,KACxC/jB,QAASikB,GACblwB,mBAAKF,IAAKswB,GAAczhB,GACnB1O,UAAW,aAChBD,oBAAMC,UAAW,SAT1B,IAWKD,mBAAQse,IAAOA,EACrBvP,IAAOuC,EACPrR,UAAW,aACGH,IAAKqwB,GACnBrK,WAAYkK,EAAW,WAAM,OAAAA,KAAW,KAC1B/jB,QAASikB,GACblwB,YAACuhB,KAAKlH,KAAMgW,IAAUC,QAChBrwB,UAAW,WACXyhB,SAAU,KAChB1hB,oBAAMC,UAAW,kBArBrC,OAmCEmwB,GAAgB,SAACzhB,GAAU,mBAAG,mFACP,SADI,IAG3BwhB,GAAkBrwB,YAAG,q+BC5DrB8X,GAAe,CAAE1J,MAAF,EAAYC,OAAQ,GASnCoiB,GAAgB,SAACjS,EAAD,QAA4B,IAAAkS,OAAA,GAC1C,MAA8BjlB,mBAA9B,IAACyC,EAAU,EAAX,GAAayiB,EAAa,EAA1B,GACAC,EAAoBrV,iBAA1B,MAqCA,OAnCArP,qBAAU,WA+BR,OA1BA0kB,UAA4B,IAAI,EAAJ,GAAmB,iBAAC,IAAA7gB,MAAA,IAC9CA,WAAgB,YACd,GAAIyO,EAAJ,QAAiB,CACf,IAAMpQ,EAAQoQ,kCAAd,MACMnQ,EAASmQ,kCAAf,OAEA,KAAmB,CACjB,IAAMqS,EAAiB7B,wBAAwBxQ,EAA/C,SACMsS,GAAeC,GAAWF,EAAXE,YACDA,GAAWF,EADX,cAApB,EAEMG,GAAgBD,GAAWF,EAAXE,WACDA,GAAWF,EADX,eAArB,EAEAF,EAAc,CACZviB,MAAMA,EADM,EAEZC,OAAOA,EAAO2iB,SAGhBL,EAAc,CAAEviB,MAAF,EAASC,OAAM,WAOjCmQ,EAAJ,SAAiBoS,kBAAkCpS,EAAlCoS,SAEV,WACDA,EAAJ,SAA+BA,0BAEhC,CAACpS,EAlCJtS,IAmCA,GAGI6kB,GAAa,SAACE,GAClB,IACE,OAAOxhB,OAAOwhB,eAAd,KACA,SACA,MAAMlyB,MAAM,8BAAZ,KC/CJ,SAAwBmyB,GAAWxP,GAAC,IAAA+E,EAAQ,EAARA,SACA0K,EAAa,EADb,cAEeC,EAAO,EAFtB,eAGA73B,IAHA,cAGAA,OAAa,IAAG,IAHhB,EAIG6nB,EAAK,cAJTM,+DAKjB2P,EAAeZ,MAAtBpiB,OAEDijB,EAAQ/V,mBACAgW,EAAYd,MAAnBpiB,OASP,OAPAnC,qBAAU,WACN,GAAGmlB,GAAH,EAA4B,CACxB,IAAMG,EAAmB9iB,YAAY6iB,EAAD,GAApC,GACAH,QAEN,CAACG,EAAD,IALFrlB,IAQIhM,+BAAKse,IAAK8S,EAAOtxB,IAAKyxB,IAAmBrQ,GAD7C,GAiBJ,I,GAAMqQ,GAAgBzxB,YAAG,uEChCzB,SAAwB0xB,GAAUhQ,GAAC,IAAAiQ,EAAa,EAAbA,cACiBC,EAAe,EADhC,gBAEGxQ,EAAK,cAFTM,qCAGxB,EAAwCjW,mBAAS,CAAC,EAAlD,IAAC7Q,IAAD,GAAEi3B,EAAS,EAAX,GAAaC,EAAO,EAApB,GAAsBC,EAAc,EAApC,GAEA,EAAmCtmB,mBAAnC,GAACumB,EAAa,EAAd,GAAeC,EAAgB,EAA/B,GAEA,EAAqDxmB,mBAAS,CAAC,EAA/D,IAACrQ,IAAD,GAAE82B,EAAc,EAAhB,GAAiBC,EAAgB,EAAjC,GAAmCC,EAAc,EAAjD,GACA,EAAuB3mB,mBAAvB,GAAC4mB,EAAO,EAAR,GAASC,EAAU,EAAnB,GACA,EAA0B7mB,mBAA1B,GAAC8mB,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GACArB,EAAgB5V,mBAEtBrP,qBAAU,WACNkmB,EAAe,CACX1jB,SAASsjB,EAATtjB,EADW,GAEXA,SAASsjB,EAATtjB,EAFJ0jB,OAIF,CALFlmB,IAQHA,qBAAU,WAECylB,UAAJ,EACII,EAAe,CAAC,EAAhBA,IAuBVA,EAhBM,IAAIM,EAQAA,IAAYE,EAAhB,EAQS,CAEdJ,IAFc,EAGdA,GAAkBE,EAAlBF,GAHDJ,GAPyB,CACXJ,SADW,EAEXA,EAFJI,QARe,CAAC,EAAhBA,MAoBT,CAACC,EAAD,IAAgCL,EAAhC,SA/BFzlB,IAkCGA,qBAAU,WACNsmB,EAAY9jB,SAERA,WAAWijB,SAAD,GAFFjjB,GAAZ8jB,MAKF,CAACL,EAAD,EAAgCR,EANlCzlB,SASA,IAAMumB,EAAcT,GAAiBL,EAArC,OACMe,GAAaD,GAAnB,IAAkCJ,EAC5BM,EAAWb,GAAUH,EAAVG,SAAjB,EACMc,GAAcD,IAAD,IAAnB,EAGME,EAAWjd,uBAAY,WACzB0c,EAAW5jB,SAAS2jB,EAAT3jB,EAAmB6jB,EAA9BD,MACF,CAACD,EAFH,IAGMS,EAAWld,uBAAY,WACzB0c,EAAW5jB,SAAS2jB,EAAT3jB,EAAX4jB,MACF,CAFF,IAIMS,EAAW7yB,YAACuhB,KAAMlH,KAAK,OACLqH,SAAUoR,GACVhzB,IAAKizB,GACLpkB,MAAOqkB,KAEzBC,EAAiBjzB,mBAAKiM,QAAS0mB,EACT5jB,IAAI,iBACJX,MAAO,CAAC8kB,UAAU,QAClBpzB,IAAKqzB,IAC5BN,EAJL,SAOMO,EAAiBpzB,mBAAKiM,QAAS2mB,EACT7jB,IAAI,iBACJX,MAAO,CAACilB,aAAa,QACrBvzB,IAAKqzB,IAC5BN,EAJL,aASMS,EADsB7B,UAA5B,GACuB,KAAwB,cAC3C,OAAOzxB,YAAC0xB,iBAAoB6B,GAEJjV,IAAKzP,aAAuB2kB,QAGxD,OACIxzB,YAACgxB,gBAAWC,cAAeA,EACfwC,eAAgB1B,EAChB2B,cAAe,IACXxS,GAGX,EAAEuR,GAAD,IAAD,oBAEO,EAAED,GAAD,IATjB,KAoBJ,I,MAAMM,GAAN,GACME,GAAN,UAEMD,GAAUjzB,YAAG,wKACe,iBACX,6EAFJ,GAAnB,IAOMqzB,GAAYrzB,YAAG,kIAAC,+GCjJtB,SAIwB6zB,GAChBnS,G,IAACtH,EAAQ,WAEb,OACIla,YAAC4zB,SACG5zB,YAACmS,KAAWlG,QAAS,WAAI,OAAAiO,EAAS,CAAChd,KAAK,mBAC5BoU,KAAK,eACjBtR,YAACmS,KAAWlG,QAAS,WAAI,OAAAiO,EAAS,CAAChd,KAAK,oBAC5BoU,KAAK,iBCUtB,I,YAAMiZ,GAASuF,sBAAuC,c,IAAE33B,EAAI,OAC7DmvB,EAAU,aACVuM,EAAS,YACT9D,EAAS,YACTC,EAAQ,WACR/jB,EAAO,UACP5S,cAAE,IAAG,KACLqB,cAAE,IAAG,KACLwf,EAAQ,WACP4Z,EAAYC,EAAKC,GAAaC,EAAKC,GAAzC,GACIC,EAAJ,EAGMC,EAAoBv3B,mBAAQ,WAMjC,SALuB,OAAAs3B,QAAS,IAATA,OAAA,EAAAA,EAAA,QAAkB,cACxC,uBAAW1X,EAAsBA,EAAP,EAC1B,iBAAWA,EAAsBN,EAAEM,EAAT,IAC1B,KAHD,OAMC,CAPF,IASM4X,EAAsCx3B,mBAAQ,WACnD,OAAOs3B,EAAA,KAAc,YACpB,IAAMplB,EAAmB,kBAANU,EAAP,EAERA,EAFJ,IAGA,MAAO,CACNV,IADM,EAENuC,KAFM,EAGN2e,SAAQ4D,GAAYA,EAAH,GACjBllB,MAAM2Y,EAJA,GAKNyI,UALM,EAMNC,SANM,EAON/jB,QAAQ,WAAI,mBAGb,CAACkoB,EAAD,QAfF,IAgBAnoB,qBAAU,WACTkO,EAAS,CAAChd,KAAD,qBAA2B8Z,QAAQqd,MAC3C,CAACA,EAFHroB,IAIA,IAAMsoB,EAAiBt0B,YAAC2zB,IAAqBzZ,SAAUA,IAEvD,OAECka,GAAap0B,YAACu0B,KAAcjW,IAAKA,EAC1Bxe,IAAK00B,GACLxO,QAASsO,GACft0B,YAACwxB,IAAUC,cAAe4C,EACvBI,gBAAiB5E,GACjB/vB,IAAK,CAAC40B,GAAa,EAElB1E,QAFI,YAgCLwE,GAAuB10B,YAAG,iKAM1B40B,GAAc50B,YAAG,+QAQjB60B,GAAmB70B,YAAG,6JAMtB80B,GAAmB,SAACC,GAAmB,mBAAG,2DACxB,WADqB,IAIvCb,GAAaY,GADZ,KAGDE,GAAcF,GADb,KAGDV,GAAaU,GADZ,KClIDG,GAAsB,CACxBC,WADwB,EAExB9a,cAAUsZ,GAEDyB,GACTx9B,wBADG,ICOMy9B,GAAS,SAAC,G,IAAEl7B,EAAO,UAAEm7B,EAAY,eAAEziB,EAAkB,qBACjE,OACC1S,mBAAKF,IAAKs1B,GAAan1B,UAAW,YACjCD,YAACq1B,MAAS3P,UAAW,SAAUM,QAC9BhmB,YAAC4zB,SAEC,OAAA55B,QAAO,IAAPA,OAAA,EAAAA,EAAA,KAAa,SAAAs7B,GAAK,mBAACC,IAAOnjB,OAAQ+iB,IAAiBG,EAAGvmB,IAAKumB,EAAEvmB,IAAK9C,QAASyG,EAAoBL,KAAMijB,SAIvGt1B,YAAC8a,IAAMC,cACN/a,YAACuhB,KAAKlH,KAAMgW,IAAUmF,OACtBx1B,YAACuhB,KAAKlH,KAAMgW,IAAUoF,iBAO3B,SAASF,GAAO,G,IAACtpB,EAAO,UAAEmG,EAAM,SAAEC,EAAI,OAIrC,OAAOrS,YAACmS,KAASC,OAAQA,EAAQd,KAAMe,EAAKtD,IAAK9C,QAHjC,WACfA,QAgBF,I,GAAMmpB,GAAct1B,YAAG,mrB,SC9CC41B,GAAclU,G,IAAC+E,EAAQ,WAACoP,EAAe,kBACrDC,EACF51B,mBAAKF,IAAK+1B,IACLF,EAAA,KAAoB,YAAa,mBAAC9F,kBAAD,QAE1C,OACI7vB,YAACq1B,MAASrP,QAAS4P,EACTE,gBAAgB,QAChB5jB,UAAW,CAAC,MAAQ,CAAC,SAAU,KAH7C,GASJ,I,GAAM2jB,GAAa/1B,YAAG,uTCVtB,SAAwBi2B,GAAYvU,G,IAACmU,EAAe,kBAChD,OACI31B,mBAAKC,UAAU,iCACVH,IAAKk2B,IACNh2B,YAAC01B,IAAcC,gBAAiBA,GAC5B31B,YAACuhB,KAAKlH,KAAK,MACPqH,SAAU,GACV/S,MAAOqkB,OAM3B,I,GAAMA,GAAN,UAEMgD,GAAiBl2B,YAAG,yJAEA,6DAF1B,I,SCjBgBm2B,GAAkBzU,G,IAAC+K,EAAU,aACV2J,EAAY,eACZC,EAAa,gBACbC,EAAkB,qBAC1CT,EAAe,kBAGzB,OACC31B,mBAAKC,UAAU,WAAWH,IAAKu2B,IAC7BD,EAAqBp2B,YAACuhB,KAAKlH,KAAMkS,EAAa8D,IAAH,QAAuBA,IAAUiG,SAAUrqB,QAASiqB,IAAkB,KACjHC,EAAgBn2B,YAACk1B,kBAAJ,IAAkC,KAC/CS,EAAkB31B,YAAC+1B,IAAYJ,gBAAiBA,IAJnD,MASD,I,GAAMU,GAAuBv2B,YAAG,ugBClBnBy2B,GAAwB,SAAC,EAAD,GAIjC,OAAQjgB,EAAR,MACI,qBACI,OAAOkgB,GAAP,GACJ,oBACI,OAAOC,GAAP,GACJ,gBACI,OA0EZ,SAAmBzB,EAAnB,GACI,IAAInB,EAAY,OAAH,IAAG,CAAH,GAAOmB,SAApB,WAEA,OADAnB,MAAsBA,EAAtBA,GACA,2BAAWmB,IAAOxN,OAAM,2BAAKwN,EAAMxN,SAAOqM,UAAUA,MA7ErC6C,CAAU1B,EAAM1e,EAAvB,SACJ,iBAEA,iBACI,OAkBZ,YACI,kCAAW0e,IAAMzI,YAAW,IAnBbG,CAAP,GACJ,mBACI,OAoBZ,YACC,kCAAWsI,IAAOzI,YAAayI,EAAMzI,aArBnB2J,CAAP,GACJ,+BACI,OAsBZ,SAAkClB,EAAlC,GACE,kCAAWA,IAAMoB,mBAAoBO,IAvBpBC,CAAyB5B,EAAO1e,EAAvC,SACJ,gBACI,OAwBZ,SAAmB0e,EAAnB,GACI,IAAInB,EAAJ,GACIgD,EAAJ,GAOA,GALA7f,gBAAqB,YACjB6f,KACAhD,WAGJ,KAAGgD,EAAc,OAAO7B,EACxB,IAAM8B,EAAU,2BACT9f,IACH6c,UAAUA,IAEd,kCAAWmB,IAAMxN,OAAOsP,IAtCTC,CAAU/B,EAAM1e,EAAvB,SACJ,qBACI,OAuCZ,SAAwB0e,EAAxB,GACI,kCAAWA,IAAMmB,cAAcnf,IAxChBggB,CAAehC,EAAM1e,EAA5B,SACJ,yBACI,OAkEZ,SAA4B0e,EAA5B,GACI,kCAAWA,IAAOxN,OAAM,2BAAKwN,EAAMxN,SAAOmO,gBAAgB3e,MAnE3CigB,CAAmBjC,EAAM1e,EAAhC,WA6CX,IAAM4gB,GAAe,SAACC,GAAkB,mBAGrC,IAAItD,EAAJ,GAMA,OAJAmB,uBAA0B,YACtBnB,UAGJ,2BAAWmB,IAAOxN,OAAM,2BAAKwN,EAAMxN,SAAOqM,UAAUA,QAGlD2C,GAAiBU,IAAvB,GACMT,GAAgBS,IAAtB,GCtEA,SAAgBE,GAAe5V,G,MAAC9mB,iBAAK,IAAG,OAAA84B,IACRjN,EAAQ,WACRrsB,yBAAa,IAAG,OAAAs5B,IAC/B6D,EAAe,kBACtBC,EAAyC,CAC3C/K,YAD2C,EAEjD6J,oBAFiD,EAG3CD,cAAeA,GAEb,EAA2BoB,qBAAW,GAAtC,GAACC,EAAY,EAAb,GAAetd,EAAQ,EAAvB,GAKNlO,qBAAU,WACTkO,EAAS,CAAChd,KAAD,iBAAyB8Z,QAASmf,MAC3C,CAFDnqB,IAIA,IAAMyrB,EAAoB/hB,uBAAY,YAClCwE,EAAS,CAAChd,KAAD,YAAkB8Z,QAAQjI,MACrC,CAFF,IAIA,OACI/O,YAACi1B,GAAsByC,UAAS9pB,MAAO,CACHonB,MADG,EAEH9a,SAASA,IAGzCla,mBAAKF,IAAK63B,GAAkBN,IAChCA,EACAr3B,YAAC+a,gBACA/a,mBAAKC,UAAU,YACbsa,GAEFva,mBAAKC,UAAU,kCACdD,YAACi2B,IACA1J,WAAYiL,EAAajL,WACzB2J,aAAc,WAAM,OAAAhc,EAAS,CAAEhd,KAAM,kBACrCi5B,cAAeqB,EAAarB,cAC5BC,mBAAoBoB,EAAapB,mBACAT,gBACkBnO,QADH,EACXgQ,eAAY,IAAZA,WAAchQ,6BAAQmO,oBAGhD,KAEN31B,mBAAKC,UAAU,aACVu3B,SACKx3B,YAACuqB,kBAAaiN,EAAahQ,QACjBrvB,KAAMq/B,SAAoBj5B,KAC1Bw1B,IAAE,EACF9nB,QAASwrB,EACTvd,SAAUA,KACpB,MAGVla,mBAAKC,UAAU,WAlC3B,KA0CJ,I,GAAM03B,GAAoB,SAAAN,GAAmB,mBAAG,wiBAI5C,gbAFuBA,EAAkB,oDAFA,4BAoChCO,GAA2B,WAC9B,MAAoB3d,qBAApB,IAACC,EAAQ,EAAT,SAAW8a,EAAK,EAAhB,MACN,gBAAI9a,EAA+B,CAACA,SAAS,cAAe8a,MAAK,GAC1D,CAAC9a,SAAD,EAAW8a,MAAK,IC5G3B,SAAS6C,GAASxlB,GACjB,YADiB,IAAAA,MAAA,IACVA,EAAP,MAGD,IAAaylB,GAAc,WAAdA,GAEN,OAGDC,GAAe,SAAC1lB,EAAM,G,IAAEJ,EAAW,cAAEC,EAAS,YAAEtW,EAAK,QAC1D,OAAKsW,EAAL,iBAIClS,YAACmS,KACApD,IAAKnT,EACLwW,OAAQF,EAAUE,OAClBtE,SAAUoE,EAAUpE,SAEpB7B,QAASgG,EACTX,KAAMumB,GAASxlB,KAThB,MAcI2lB,GAAW,CAShB,CACCjoB,MADD,YAECnC,MAAO,KAER,CACCmC,MADD,UAECnC,MAAO,KAER,CACCmC,MADD,SAECnC,MAAO,KAER,CACCmC,MADD,QAECnC,MAAO,KAER,CACCmC,MADD,QAECnC,MAAO,KAER,CACCmC,MADD,MAECnC,MAAO,KAER,CACCmC,MADD,KAECnC,MAAO,IAER,CACCmC,MADD,KAECnC,MAAO,IAER,CACCmC,MADD,KAECnC,MAAO,KAGIqqB,GAAgB,SAAC,GAC7B,IAAAC,EAAW,EAAXA,YACAC,EAAc,EADd,eAEAviB,EAAS,EAFT,UAGAK,EAAa,EAHb,cAIA5c,IAJA,QAIAA,OAAO,IAAG,EAAA2+B,GAJV,EAKGplB,EAAI,cANsB,wEAQvBH,EAAazY,EAAA,MAAa,YAAY,OAAAo+B,EAAA,aAG5C,YAFG3lB,OAA4BylB,IAAgBJ,IAC9C35B,cAAc,yDAAyDyU,EAAzD,MAAdzU,kCAEA6B,YAAC6S,iBACAC,MAAO9Y,EAEPq+B,YAAY,EACZrlB,aAAc+kB,GACd7kB,aAAc,YA5FjB,MA6FIilB,EAAeviB,EAAWK,QA7FZ,KAAlB,EA6FIkiB,KA7Fc9lB,EAAA,IACVA,EAAP,SA8FEI,WAAYA,EACZU,aAAc,CAAEC,SAAS,IACrBR,GAEJ5S,YAACmN,KACAkG,UAAU,aACVpT,UAAW,GAAGsN,IAAQoG,QACtB7T,IAAKw4B,GACLhnB,KAAMumB,GAASplB,OAcnB,SAAgB8lB,GAAcC,EAASC,EAAcC,GACpD,IAAIC,EAAJ,EAMA,OALIH,IAAYV,GACfa,IACUH,IAAYV,KACtBa,KAED,EAfDV,aAA0B,CACzBC,YAAa33B,YADY,IAEzBq4B,cAAer4B,YAFU,IAGzBs4B,iBAAkBt4B,YAHO,IAIzBwP,MAAOxP,YAJkB,OAKzB43B,eAAgB53B,YAAUwpB,KAa3B,I,GAAMuO,GAAsBx4B,YAAG,gbAOU,qBACJ,iBACA,sCAFpBgU,GAPc,eAQhBA,GARgB,aASpB7N,GATX,e,aC/Ha6yB,GAAgB,SAAC,GAC7B,IAAAljB,EAAS,EAATA,UACAvc,IADA,aACAA,OAAY,IAAG,EAAAy+B,GADf,EAEAp9B,IAFA,UAEAA,OAAS,IAAG,OAFZ,EAGAub,EAAa,EAHb,cAIA/b,IAJA,cAIAA,OAAa,IAAG,GAJhB,EAKAe,IALA,iBAKAA,OAAgB,IAAG,GALnB,EAMAC,IANA,cAMAA,OAAa,IAAG,cANhB,EAOA69B,IAPA,MAOAA,OAAK,IAAG,eAPR,EAQC7iB,EAAmB,EARpB,oBASGtD,EAAI,cAVsB,2IAYrBsH,EAAaD,yBAAbC,SACF,EAAwB3O,mBAAxB,GAACitB,EAAO,EAAR,GAAUQ,EAAU,EAApB,GAINhtB,qBAAU,W,WACUhS,QAAnB,EAAIic,eAAa,IAAbA,WAAejc,8BAAnB,aACCg/B,EAAmCvgC,QAAzB,EAAgBuB,QAAhB,EAACic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAnCugC,MAEC,CAJHhtB,IAMA,IAQMitB,EAAgB,CACrBf,YADqB,EAErBC,eAVsB,SAACviB,EAAWK,EAAerI,GACjDorB,KACA,IAAMh/B,EAAUogB,WAAWA,eAAenE,eAAa,IAAbA,WAA1C,UACAjc,gBAAoCu+B,GAAc3qB,EAAOsrB,EAAzDl/B,MACAkgB,EAASP,GAAA,EAA0C,CAAE3f,QAAO,OASvDA,EAAUkc,GAAuBA,EAAuBijB,EAA9D,YAEA,OACCn5B,uBACCA,oBAAMF,IAAK2T,IACT1D,GAGF/P,YAACi4B,kBACIgB,GACJG,MAAOb,GAAcC,EAASU,EAAW,MACzCN,cAAeA,EACfC,iBAAkBA,EAClBjjB,UAAWA,EACXK,cAAeA,EACflG,MAAOA,EACPjQ,IAAK4T,GACL1Z,QAASA,GAfZ,MAwBK0Z,GAAc5T,YAAG,+GAMjB2T,GAAW3T,YAAG,yKAEoB,mBACJ,eACG,iCAFvBgU,GAFI,eAGNA,GAHM,aAIV7N,GAJV,kBCnEaozB,GAAW,SAAC,GAAE,IAAA5mB,EAAU,EAAVA,WAAYC,EAAkB,EAA9B,mBAAgCrZ,IAAhC,QAAgCA,OAAO,IAAG,KAA1C,EAAqDqB,IAArD,YAAqDA,OAAW,MAAC,OAAjE,EAA4EkY,EAAI,cAAlF,qEAClBgB,EAAe9T,YAAG,4XAIH,wFAGoB,uBACJ,mBACA,4CATb,EAOPgU,GAPO,eAQTA,GARS,aASb7N,GATX,eAcA,OAAOjG,YAAC6S,iBACPC,MAAO9Y,EACP+Y,cAAevB,GACfwB,aAAcjB,IAAiB,SAAAM,GAAQ,OAAAA,KACvCY,UAAWjT,YAACmS,KAASrE,UAAU,EAAMwD,KAAK,gBAC1C4B,aAAcR,EACdD,WAAYA,EACZU,aAAc,CAAEC,SAAS,IACrBR,GAEJ5S,YAACmN,KACAkG,UAAU,aACVD,SAAO,EACPtT,IAAK8T,EACLtC,KAAMmB,MAKT4mB,aAAqB,CACpB5mB,WAAYlS,YADQ,OAEpBwP,MAAOxP,YAFa,IAGpBmS,mBAAoBnS,YAHA,IAIpBvG,QAASuG,YAAU+hB,OCtCpB,I,MAAMgX,GAAej8B,cAArB,IAEak8B,GAAgB,SAAC,GAAE,IAAA3jB,EAAS,EAATA,UAAWM,EAAmB,EAA9B,oBAAgCzD,EAAU,EAA1C,WAAsDG,EAAI,cAA5D,0DACrBsH,EAAaD,yBAAbC,SAQR,OACCla,uBACCA,oBAAMF,IAAK2T,I,eACXzT,YAACq5B,gBACA5mB,WAAYA,EACZC,mBAAoB,YAAW,OAXX,SAAC9E,GACvB,IAAMuJ,EAAgBiD,WAAWA,eAAjC,IACAjD,eACA+C,EAASP,KAATO,IAQiCsf,CAAA,IAC/Bx/B,SAAS,OAAAkc,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,uBAA6CojB,GACtDvpB,MAAM,cACNjQ,IAAK4T,IARR,MAiBKA,GAAc5T,YAAG,+GAMjB2T,GAAW3T,YAAG,yKAEoB,mBACJ,eACG,iCAFvBgU,GAFI,eAGNA,GAHM,aAIV7N,GAJV,kBCnBawzB,GAA2B,SAAC,GAAE,IAAA7jB,EAAS,EAATA,UAAWgW,EAAY,EAAvB,aAAyB7b,EAAK,EAA9B,MAAgCkE,EAAK,EAArC,MAAuCC,EAAK,EAA5C,MAA8C+B,EAAa,EAA3D,cAAgErD,EAAI,cAAtE,sEAClC,EAKFqH,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAOAwf,EAAwBhkB,uBAC7B,YACC,IAAMyB,EAAgBiD,WAAWA,eAAjC,IACA,OAAIuf,SACIxiB,qBAAP,GAEAA,wBAAiDwiB,EAAjDxiB,KAED+C,EAASP,KAATO,MAED,CAACtE,EAAWsE,EAAUjE,EAVvB,IAaMd,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIM9B,EAAa5V,mBAAQ,W,UACpB+8B,EAAuCnhC,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAA7C,GACA,SAGuC,QAAvC,EAAOC,YAAiCsb,EAAwB,CAAzB,0BAAvC,GAH0B,OAIxB,CAACiC,EAAe2V,EANnB,IAQA,OACC5rB,YAACwV,gBACAL,mBAAoBA,EACpBzC,mBAAoBgnB,EACpBjnB,WAAYA,EACZwB,MAAOA,EACPC,MAAOA,EACPnE,MAAOA,GAPT,KCnCY8pB,GAA4B,SAAC,G,QACzCjkB,EAAS,EAATA,UACAgW,EAAY,EADZ,aAEA7wB,EAAM,EAFN,OAGA++B,EAAY,EAHZ,aAIA7jB,EAAa,EAJb,cAKA/b,IALA,eAKAA,OAAc,IAAG,c,OAAUmY,eAAI,IAAJA,WAAMtC,OALjC,EAMA9U,IANA,cAMAA,OAAa,IAAG,c,OAAUoX,eAAI,IAAJA,WAAMzE,OANhC,EAOGgF,EAAI,cARkC,uGAUjCsH,EAAaD,yBAAbC,SAYF6f,EAAqCthC,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAA3C,GACMga,EAAasnB,EAAah/B,EAAA,MAAY,YAAU,OAAAi/B,EAAA,UAAtD,EAGA,OACCh6B,YAACuT,gBACAvZ,QAASe,EACT2X,mBAjB4B,SAACinB,GAC9B,IAAMxiB,EAAgBiD,WAAWA,eAAjC,IACIuf,sBAAmBK,MAAvB,SAA8DA,YACtD7iB,qBAAP,GAEAA,wBAAiD6iB,EAAjD7iB,GAED+C,EAASP,KAATO,KAWCzH,WAAYA,EACZT,eAAgBA,EAEhBwB,QAASxB,EAAeS,IAP1B,K,SC1CuBwnB,GAAqBzY,G,IAAC+E,EAAQ,WAErD,OACCvmB,mBAAKF,IAAKo6B,IADX,GAOD,I,GAAMA,GAAiBp6B,YAAG,iS,SCRFq6B,GAAsBjZ,GAC7C,IAAMkZ,EAAangB,qBAAnB,IAEO/D,EAAyCgL,EAAzChL,oBAAqBN,EAAoBsL,EAAzC,UAAgChkB,EAASgkB,EAAzC,KAEChH,EAAaD,yBAAbC,SACF,EAAuC3O,oBAAvC,GAAC8uB,EAAc,EAAf,GAAiBC,EAAkB,EAAnC,GAkBN,OAhBAtuB,qBAAU,WAET,OADUouB,YAAyBlkB,EAAnC,YACA,WACC,eACC,IAAMiB,EAAgBiD,WAAWA,eAAjC,IACAjD,EAAa,cAAbA,EACA+C,EAASP,KAATO,IACAogB,MACA,MACD,QACCA,SAEA,CAACpkB,EAAD,WAZHlK,IAgBO,oCAAqBkV,GAAOpT,SAAUusB,KCAvC,I,SCxBDpmB,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,cAErBgB,MAFqB,cAGrBsK,KAHqB,iBAIrBC,QCOD,SAAkCkH,G,IACjC+Y,EAAa,gBACbvsB,EAAU,aACV7V,EAAI,OACJkB,yBAAa,MAACwX,KACdmD,EAAsB,yBACtBiC,EAAa,gBACbC,EAAmB,sBAGbf,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAGM,EAAoBqjB,KAAnB1d,EAAQ,EAAT,SAAW8a,EAAK,EAAhB,MACAzI,EAAayI,eAAK,IAALA,WAAnB,WACMxa,EAAgB3d,mBAAQ,W,MAC7B,IAAK1E,eAAI,IAAJA,WAAD,cAAyD6B,QAAhB,EAACic,eAAa,IAAbA,WAAejc,8BAA7D,eAGA,IAAM8Y,EAAQ3a,WAAd,GAGA,OAAI2a,SACH,MAAO,GAER,IAAM0nB,EAAY1nB,EAAA,KAAU,Y,IAAG/D,EAAG,MAAEqN,EAAK,QACxC,MAAO,CACNngB,KADM,EAEN2R,MAH8C,QAI9C6sB,UAAWre,MAgBb,OAZI,OAAAlG,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,EAAGC,UAAzBD,IACAC,WAAkB,cACjB/qB,oBAGD8qB,SAAqBC,EAAA,KAAc,YAAO,OAAA/qB,EAAA,SAC1C+qB,WAAkB,YACjB/qB,aAAeA,EAAfA,SAIF,KACE,CAACtX,EAAD,cA/BH,IAkCA6T,qBAAU,W,SAEJ7T,eAAI,IAAJA,WAAD,cAAyD6B,QAAhB,EAACic,eAAa,IAAbA,WAAejc,8BAAzD,eAAJ,KAA4F6V,QAAN,SAAA1X,QAAI,IAAJA,OAAA,EAAAA,EAAM0X,8BAAN,QAItFqK,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,IAHjEkD,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,MAKjE,CARHhL,IAUA,IAAM0uB,EAAgB79B,mBAAQ,WAC7B,kCAAWqZ,IAAqBqW,WAAU,MACxC,CAACrW,EAFJ,IAKA,OAAO,OAAAsE,QAAa,IAAbA,OAAA,EAAAA,EAAA,aACN,sBACCriB,KAAMqiB,EACNmgB,oBAAqB3sB,EACrBkI,oBAAqBwkB,EACrBvO,SAAUoO,IAGX,uBACChgB,MAAM,gBACNF,KAAK,eACLK,YAAaC,KDjFfC,SALqB,GAMrBC,MDgB8B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEiC,EAAmB,sBACrF,OACClW,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAM,WACNkG,cAAeA,E,UACP,6BAETjW,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,aACPopB,cAAc,U,UACN,gCAGVn5B,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,6BAETpV,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,2CAYbpQ,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,gCAETtnB,YAACm6B,IACAj9B,KAAM,cACN0Y,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,eACd7b,MAAO,gC,UACC,mCClGfkE,MAPqB,GAQrBgH,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACX0B,QAAS,OAKb2xB,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GAAwBS,cAGtCwS,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IEpBW8mB,GAAa,SAAC,G,MAAiB7sB,EAAU,aAAE7V,EAAI,OAAEuC,6BAAiB,IAAG,KACzEyT,EAAkBH,EAAlBG,OAAQD,EAAUF,EAAlB,MAEF,EAA0BmX,KAAzBsC,EAAO,EAAR,GAAUC,EAAY,EAAtB,GAEA,EAA0Cnc,mBAAS,IAAnD,KAACuvB,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GAEAC,EAAW3f,iBAAjB,IAEA,cACC,OAAO5L,EAAP,SAGD,c,MAQC,OAPKA,iBAAL,WAEKA,iBAAJ,YACCA,QAAY8W,QAAZ9W,EAAUA,EAAE8W,+BAAU0U,QAAO,cAAoB,OAAA9qB,EAAP,UAA1CV,GAEIA,WAECA,EAAP,MAGD,cACC,OAAOA,EAAP,IAGK,MAAkB5S,mBAAQ,WAC/B,IAAMq+B,EAAO,YAAU/iC,EAAV,gBAEN,cAAU,OAAAgjC,EAAA,GAAcA,EAAd,MAMjB,OAHqBC,mBAAY,CAACltB,GAAD,EAAWC,GAAvBitB,YAArB,GACAC,IAEO,CAAE3f,MAAOwf,EAAT,cAA6BA,KAAI,KACtC,CAAC/iC,EAAM+V,EAVJ,IAAEwN,EAAK,EAAP,MAASwf,EAAI,EAAb,KAYN,cACC,IAAMI,EAAWjf,OAAjB,GACA,WAAIif,SACH,OAEOA,EAAA,QAAgB,cAEtB,OADAC,GAAe,IAAMC,EAAQnf,EAA7Bkf,QADD,IAOF,IAAME,EAAoBlV,QAAR,EAAG2U,EAAK3U,+BAAU0U,QACnC,c,MAAiB,kCACb18B,WACFm9B,EAAezrB,KAAS,EAFT,MADlB,IAQM0rB,EAAqBC,aAAS,WAUnC,IAAMC,EAAgB,IAAIhe,IACzBxgB,OAAA,QAAe29B,EAAf,cACM,Y,IAAEjsB,EAAG,KACH,EADO,KACP,wBAEN,MAAO,CAAEA,IAAF,EAAO+sB,IAFH,EAAL,IAEaC,MAFD,EAAZ,MAEoBC,OAFA,EAApB,OAE4BC,KAFF,EAA1B,SAFR,QAMS,gBACP,OAAIxf,EAAJ,SAEAyf,QAAUrtB,EAAVqtB,YAAyB,aAnB5B,cACC,IAAMC,EAAWC,QAAWC,EAA5B,KACMC,EAAYF,OAAUC,EAA5B,MACME,EAAUH,MAASC,EAAzB,OACMG,EAAUJ,SAAYC,EAA5B,IAEA,QAASF,SAAT,IAcOM,CAAchgB,EAAlB,KACCigB,iBAGF,MAdF,KAgBM,YAAa,OAAP,UAIb3B,OA/BD,KAkCM4B,EAAc,SAAC5tB,GAAQ,mBAC5B,EAAOisB,aAAP,SACYA,UAAP,KAGN,OACCh7B,YAAC8a,IAAMC,cACN/a,uBACCA,mB,UAAa,mBAAmBkO,MAAOA,EAAOC,OAAQA,GAErDnO,YAAC48B,UACClhB,EAAA,KAAU,YACV,IAAMmhB,EAAgB,CACrBC,GAAI5uB,EADiB,EAErB6uB,GAAI5uB,EAFiB,EAGrB6uB,EAAG,GAEJ,OACCh9B,YAACi9B,KAAOC,QACPnuB,IAAK2sB,EAAerf,GACpB8gB,QAASN,EACTO,QAAS,CACRN,GAAIzgB,EADI,EAER0gB,GAAI1gB,EAFI,EAGR2gB,EAAGK,GAAehhB,EAAD,IAElBgC,KAAMwe,EACN/8B,IAAKA,YAAG,wMACwB,sHAAvBw9B,Y1EtIX,U0EqIU,WAUZt9B,YAAC48B,UACClhB,EAAA,KAAU,YACV,IAGMjN,IAHiB4N,EAAvB,SAGyBA,IAASghB,GAAehhB,EAAxBA,GADzB,GACqEA,EAArE,EACM9N,EAAI8N,EAAV,EACMwgB,EAAgB,CACrBtuB,EADqB,EAErBE,EAFqB,EAGrBsS,QAAS,GAEJhS,EAAM2sB,EAAZ,GACA,MAA4B,qBAAjBD,IAAkCA,EAAD,IAA5C,EACC,KAGAz7B,YAACi9B,KAAO3rB,MACPisB,oBAAqB5B,EACrBrd,IAAKqe,EAAY5tB,GACjBA,IAAKA,EACLouB,QAASN,EACTO,QAAS,CACR7uB,EADQ,EAERE,EAFQ,EAGRsS,QAAS,GAEV1C,KAAMwe,EACN/8B,IAAKA,YAAG,icAKuD,2BAAhDg7B,mBALP,WAQPze,OApBH,SA0BDX,EAAA,KAAU,YACV,OAAIW,OAAJ,IAECrc,YAACi9B,KAAOC,oBACPnuB,IAAK2sB,EAAerf,GACpBygB,GAAIzgB,EAAK9N,EACTwuB,GAAI1gB,EAAK5N,EACTuuB,EAAGK,GAAehhB,EAAD,GACjBvc,IAAKA,YAAG,kOAIJ4nB,EAAa1nB,YAACqmB,IAAa9L,MAAOihB,EAAQnf,EAAD,MAAa2J,QAAS,CAAEwX,KAAMrC,EAAS9e,EAAD,YAX3D,SA3E/B,KAiGD,SAASghB,GAAeI,GACvB,OAAOA,GAAP,EAGD5C,aAAuB,CACtB1iC,KAAMoI,IADgB,IAEtByN,WAAYzN,IAFU,OAGtBm9B,kBAAmBn9B,IAAUsT,MC/LvB,IClBDI,GAAQ,CAAC+G,IAAf,cAEa5d,GAAS,CACrB2R,IADqB,cAErBgB,MAFqB,cAGrBsK,KAHqB,cAIrBC,QCCD,SAAkCkH,G,IAAE+Y,EAAa,gBAAErkB,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAEkB,yBAAa,MAACwX,KACjG,EAAoCtF,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GAkBN,OAhBApY,qBAAU,W,MAET,GAAK7T,GAASwF,cAAcxF,eAAI,IAAJA,WAA5B,UAGA,KAAS0X,QAAL,EAAA1X,EAAK0X,8BAAL,SACHuU,MAGD,IAAMoW,EAAY,CACjBjU,SAAUpuB,EAAK0X,SAGhBuU,QACE,CAdHpY,IAgBOwO,EACN,sBAAY+f,cAAeA,EAAgBpiC,KAAMqiB,EAAexM,WAAYA,EAAY0vB,oBAAoBxnB,eAAmB,IAAnBA,WAAD,iBAE3G,uBACCqE,MAAM,gBACNF,KAAK,eACLK,YAAaC,KDzBfC,SALqB,GAMrBC,MDU8B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEC,EAAK,QACvE,OACClU,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX9F,MAAOA,EACPD,MAAOA,EACPlE,MAAO,WACPkG,cAAeA,E,UACP,6BAETjW,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,aACPopB,cAAc,U,UACN,+BAETn5B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,IACd7qB,MAAO,cACPopB,cAAc,c,UACN,mCAIXn5B,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,0DC3CJiU,MAPqB,GAQrBgH,qBAAsB,SAAA3gB,GACrB,MAAO,CACNN,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACXklC,YADW,KAEXC,UAFW,EAGXC,WAHW,GAIXC,cAAe,QAKnBhS,2BAA4B,SAAAiS,GAC3B,MAAO,CACNC,eAAe,IAGjBxuB,QAAS,SAAAwE,GACR,OAAOD,GAAiBC,EAAjBD,YAAP,IEPK,I,MCrBDE,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,qBAErBgB,MAFqB,qBAGrBsK,KAHqB,cAIrBC,QCCD,SAAkCkH,G,IAAE+Y,EAAa,gBAAErkB,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAEkB,yBAAa,MAACwX,KACjG,EAAoCtF,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GAoBN,OAlBApY,qBAAU,W,MAET,GAAK7T,GAASwF,cAAcxF,eAAI,IAAJA,WAA5B,UAGA,KAAS0X,QAAL,EAAA1X,EAAK0X,8BAAL,SACHuU,MAGD,IAAMoW,EAAY,CACjBjU,SAAUpuB,EAAK0X,SAGhBuU,QACE,CAdHpY,IAgBAuuB,SAAqB/7B,YAAOrG,EAAA,aAAiB,SAAAsX,GAAK,OAAAA,EAAA,WAE3C+K,EACN,sBAAY+f,cAAeA,EAAepiC,KAAMqiB,EAAexM,WAAYA,EAAY0vB,oBAAoBxnB,eAAmB,IAAnBA,WAAD,iBAE1G,uBACCqE,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD3BfC,SALqB,GAMrBC,MDa8B,SAAC,G,IAACjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAC7E,OACClW,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,kBACPkG,cAAeA,E,UACP,8BAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,kBACPkG,cAAeA,EACfb,YAAU,E,UACF,iCAETpV,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,kBACPkG,cAAeA,EACfb,YAAU,E,UACF,iCAGVpV,YAACi6B,QACAj6B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACfC,oBAAqBA,EACrBnG,MAAO,aACPopB,cAAc,U,UACN,+BAETn5B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACfC,oBAAqBA,EACrBnG,MAAO,cACPopB,cAAc,c,UACN,iCAGVn5B,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,6BAETpV,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,2CAKZpQ,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC2rB,IACA/V,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,gBACd7b,MAAO,gC,UACC,mCCvGdkE,MAPqB,GAQrBgH,qBAAsB,SAAA3gB,GACrB,MAAO,CACNN,QAAS,CACRxB,aAAc,CAAC8B,KAAD,UADN,MAER7B,WAAY,CACX0B,QADW,GAEX8jC,YAAa,QAKjBnS,2BAA4B,SAAAiS,GAC3B,MAAO,CACNC,eADM,EAINE,qBhBmHkDC,EgBnHQ,CAAC,QAAD,kCAAD,MhBoHpDA,EAAA,KAAkB,SAAApuB,GAAS,MAAC,CAACA,MAAD,EAAQnC,MAAOwwB,SAASruB,eAAD,cAD3D,IAAqDouB,GgB9GpD3uB,QAAS,SAAAwE,GACR,OAAOD,GAAiBC,EAAjBD,YAAP,IEtBIsqB,GAAN,iBACMC,GAAN,qBACMC,GAAN,kBACMC,GAAN,wBAEMC,GAAN,IAyBMC,KAxBe,OACpBld,IAAYid,GAAc,KAC1Bjd,OAAYid,GAAc,IAC1Bjd,OAAaid,GAAc,KAC3Bjd,OAAiBid,GAAc,GAoBhC,2BACME,GAAN,eACMC,GAAN,qBAC2B,OAC1BvlC,IAAgB,UAChBA,OAAe,UACfA,OAAkB,UA0LnB,SAAgBwlC,GAAiBlwB,EAAOoS,GACvC,MAaA,qCACO+d,KAdP,GAKQ,QAJGV,SAASzvB,UAAD,GAAlB,IAIO,IAHGyvB,SAASzvB,UAAD,GAAlB,IAGO,IAFGyvB,SAASzvB,UAAD,GAAlB,IAEO,MAAP,KAEAxQ,aAAa,eAAbA,6BACA,GC1OF,I,GAAM4gC,GAA8B,SAAC,GACpC,QAAA5mC,YAAI,IAAG,KAAP,EACAuC,IADA,YACaM,OAAO,IAAG,KADvB,EAEAd,IAFA,SAEAA,OAAQ,IAAG,GAFX,EAGAgU,EAAK,EAHL,MAIA8wB,EAAM,EAJN,OAKAC,EAAqB,EALrB,sBAMAC,EAAM,EANN,OAOAC,EAAgB,EAPhB,iBAQAlkC,IARA,UAQAA,OAAS,IAAG,ElFvBN,UkFeN,EASAC,IATA,eASAA,OAAc,IAAG,KATjB,EAUA69B,IAVA,gBAUAA,OAAe,IAAG,KAVlB,EAWGqG,EAAU,cAZuB5d,uJAgB9B6d,EAAgB,aAAc,WACnC,OACCC,IAECC,EANH,KAMoCvkC,eAAO,IAAPA,WAHnC,UAKE,CAACA,EANJ,IAUM,EAAwC8f,cAAxC,GAAC0kB,EAAe,EAAhB,GAAkBC,EAAkB,EAApC,GACN3kB,eAAgB,WAAM,OAAA2kB,GAAA,KAAtB3kB,IASM,MAAkDA,cAAlD,GAAC4kB,EAAoB,EAArB,GAAuBC,EAAuB,EAA9C,GACAC,EAAW9kB,WAAjB,MACAA,eAAgB,WACf,GAAI8kB,GAAYA,EAAhB,QAAkC,CACjC,IAAIC,EAAYD,iCAAhB,sCACIE,EAAeF,iCAAnB,gDACA,GAAIC,aAAJ,GAA6BC,SAHI,OAQjC,GAFAA,iBAA8BD,iBAA9BC,MAEA,EAA2B,CAC1B,IAAIC,EAAUH,iCAAd,iCACA,MAAIG,SAAqB,OAEzBA,gCAAsC,YACrCF,uBAAiC/vB,SAAD,WAAhC+vB,QAGDF,WAKH,IAAMK,EAAiB,iBACtB,Y,IAAGC,EAAO,UAAElwB,EAAK,QACVmwB,EAAoBhB,IAA1B,EACA,OACCl/B,mBACC+O,IAAKkxB,EACL1lB,MAAwB,kBAAVxK,EAAqBA,EAAQ,KAC3C9P,UAAU,iBACVgM,QAAS,WACR+yB,GAAUA,EAAOiB,EAASC,IAA1BlB,KAGDh/B,oBAAMC,UAAU,gDAAgD8P,IAC9DowB,GACDngC,oBAAMC,UAAW,aAAeigC,EAAW,GAA1B,cACfA,EAAWf,EAAmBn/B,YAACogC,KAAJ,MAAkBpgC,YAACqgC,KAAtC,MAAsDrgC,YAACsgC,KAZpE,UAkBD,CAACpB,EAAQC,EAAkBH,EArB5B,IAyBA,OACCh/B,YAACugC,IAAejiB,IAAKshB,EAAUY,UAAWA,GACzCxgC,YAACygC,kBACAvyB,MAAOA,MAAgCmxB,EACvCqB,UAAW,Y,IAAG9kC,EAAK,QAAO,OAAAzD,EAAA,IAC1BwoC,SAAU,YACT,OADiB,QACV,MAAkB,CAAE1yB,gBAAiB4wB,GAAiB2B,EAAW,KAAxE,IAEDI,SAAU,Y,IAAGC,EAAY,eAAEC,EAAY,eAAEC,EAAS,aAG5CvB,GADoBsB,IAAzB,EACA,KACC7B,GAAyBA,MAGvBG,GAEHpkC,EAAA,KAAY,cACZ,IAAMgmC,EAAiBC,MAAvB,GAEA,OACCjhC,YAACkhC,kBACAnyB,IAAKF,EACLoxB,QAASkB,EACTpxB,MAAOoxB,EACPjzB,MAAOqxB,EACP6B,SAAU7B,EACV8B,SAAU,EACVrB,eAAgBA,GARlB,UAoBCO,GAAiB,+7BAAiC,gIAMe,uoBAgC9B,8HAhCnB,YAAiB,OAAA1B,GAAN,YAAM,OAgChB,YAAO,OAAA1iB,EAAA,a,SC1JdmlB,GAA8B9f,G,MAC7C5L,EAAS,YACTlb,wBAAY,IAAG,cACfqV,EAAK,QACLkG,EAAa,gBACb/b,iBAAK,IAAG,OACRe,iBAAK,IAAG,OACRC,wBAAY,MAAC,IAEP,EAKF+e,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAQA5f,EAAqB,GAAiB0Z,EAAwBC,EAAzC,QAA2D,SAAAnZ,GAAY,OAAAA,EAAA,QAG5F,EAA4CyQ,mBAAgDvR,QAAxC,EAAyBic,eAAa,IAAbA,WAAejc,8BAAU4xB,GAAcqP,QAAO,cAAU,OAACz9B,QAAD,IAArI,KAAC+jC,EAAmB,EAApB,GAAsBC,EAAkB,EAAxC,GA6BAC,EAAY,SAAAtlB,G,MACXvO,EAAQuO,SAAd,QACMpN,EAAMoN,sBAAZ,cACAolB,OAGA,IAAMpnB,EAAmBC,WAAWA,eAApC,IACAD,aAAyC9c,OAAA,mBAChC,YAAU,OAAN,QAD4B,KAEnC,YAAW,OAAR,QAEN8c,oBAAH,GACCA,qBACDA,oBAKAqnB,EAAoCxnC,QAAlB,EAACmgB,EAAiBngB,8BAAU4xB,GAAcqP,QAAO,cAAU,OAACz9B,QAAD,IAA7EgkC,KACAtnB,EAASP,KAATO,KAGKwnB,EAA0BrkC,OAAA,kBAA0C,SAAAoS,GAAK,OAAAA,KAA/E,OACA,OACCzP,mBAAKF,IAAK6hC,IACT3hC,YAACimB,SAAIlW,GACL/P,mBAAKC,UAAU,oBACdD,YAACwrB,KACAF,QAASoW,IAA4BpnC,EAAmBsnC,OACxD7xB,MAAM,aACNrC,SAzDe,SAAAoC,G,MACZ+xB,EAAY/xB,SAAlB,QAEMqK,EAAmBC,WAAWA,eAApC,IAICD,aAFD,EAECA,eAKyC9c,OAAA,mBAChC,YAAU,OAAN,QAD4B,KAEnC,YAAW,OAAR,QAFgC,QAAzC8c,GAMDA,oBAKAqnB,EAAoCxnC,QAAlB,EAACmgB,EAAiBngB,8BAAU4xB,GAAcqP,QAAO,cAAU,OAACz9B,QAAD,IAA7EgkC,KACAtnB,EAASP,KAATO,KAkCG4nB,cAAeJ,IAA4BpnC,EAA5BonC,QAAyDA,EAA0B,IAEnG1hC,mBAAKoO,MAAO,CAAC2zB,SAAU,SAEtBznC,EAAA,KAAuB,SAAAmV,GAAK,OAC3BzP,YAACwrB,KAASzc,IAAKU,EAAG6b,QAASiW,OAA0B,EAAOxxB,MAAON,EAAG/B,SAAU+zB,E,aAAuBhyB,UAU7G,I,SAAMkyB,GAAU7hC,YAAG,yVCjHN1C,ICwCM,wKAMD,wKD9CI,CACrB2R,IADqB,QAErBgB,MAFqB,QAGrBsK,KAHqB,KAIrBC,QECD,SAA6BkH,G,kBAAExT,EAAU,aAAQg0B,EAAO,OAAEpsB,EAAS,YAAExd,EAAO,UAIrE,EAAgC,QAAhC,EAAsB6hB,qBAAWviB,WAAD,QAAhC,GAAEwiB,EAAQ,EAAV,SAAY8a,EAAK,EAAjB,MACAiN,ItE2aUhoB,qBAAhB,IsExaM,EAAyB+nB,eAAO,IAAPA,IAAzB,GAAEE,IAAF,QAAEA,OAAO,IAAG,KAAZ,EAAgB/pC,EAAI,EAApB,KAGA,EAA4B2iB,aAA5B,IAACqnB,EAAS,EAAV,GAAYC,EAAY,EAAxB,GAGA,EAA4BtnB,cAA5B,GAACunB,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACNxnB,eAAgB,WACfwnB,QACE,CAFHxnB,IAKA,IAAMriB,GAAiEuB,QAApD,EAAqCic,QAArC,EAAiC,QAAjC,EAAyBgB,QAAzB,EAAiBY,QAAjB,EAAOrB,QAAP,SAAAwe,QAAK,IAALA,OAAA,EAAAA,EAAOxe,+BAAUqB,6BAAQZ,4BAAQ,yBAAIhB,oCAAejc,8BAApD,aAAnB,GAGM,EAA0C8gB,cAA1C,GAACynB,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GAoDN,OAjDA1nB,eAAgB,WACf,KAAa,CACZ,IAAI2nB,EADQ,GAGZ,KAGO,CACNA,EAAeN,EADT,QAENK,MACA,IAAME,EAAaP,EAAA,KAAc,YAAgB,OAAAQ,EAAA,cACjDxqC,WAAa,YACPuqC,WAAoBC,EAAzB,aACCF,oBAAoBG,WAAYD,EAAWC,YAAeD,EAA1DF,yBAPFA,EAAe,OAAAtqC,QAAI,IAAJA,OAAA,EAAAA,EAAA,KAAU,YAAgB,oBAAGyqC,WAAYD,EAAWC,YAAeD,EAAzC,mBAW1CP,KACAE,SAGC,CAACnqC,EAAMoqC,EAAkBH,EAAcC,EArB1CvnB,IAkDC,sBACC3iB,KAAMgqC,EACNh0B,OAAQH,EAAWG,OACnBD,MAAOF,EAAWE,MAClB20B,UAAW,GACXC,aAAc,GACdC,SAAUZ,EAAYA,EAAH,OAAsB,EACzCa,YAAahoC,EACbgkC,OAlCiB,SAACmC,EAAD,GAClBiB,MACAloB,GACCA,EACCP,GAAA,EAAkD,CACjDspB,WADiD,EAEjDxnC,aAAc0lC,MA6BhBlC,sBAvB4B,WAC7B,IACCuD,MACAtoB,GACCA,EACCP,GAAA,EAAkD,CACjDte,WAAY8mC,EADqC,OAEjD7mC,SAAU6mC,SAnEf,SAoFEhC,UAAW8B,EACX/C,OAAQzmC,eAAU,IAAVA,WAAYgD,aACpB0jC,iBAAkB1mC,eAAU,IAAVA,WAAYwqC,cFxFhCroB,SAAU,W,IAAO,sD,sHAEH,OADP5f,EAAUkoC,KAAVloC,QACO,GAAMD,gBAAN,I,OACb,SAAO,CAAE5C,KADI,EAAPA,OACS6C,QAAO,YAEvB6f,MCM+B,SAAC,G,IAChCjF,EAAS,YACTK,EAAa,gBACbhC,EAAK,QAEL,OACCjU,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACshC,IACAvxB,MAAO,wBACP6F,UAAWA,EACXgW,aAAc,UACd3V,cAAeA,EACfhC,MAAOA,SDnBZA,MAAO,CAAC+G,IAXa,UAYrB9G,MAAO,CAACiQ,IAAD,QAA0BA,IAA1B,OAAkDA,IAZpC,UAarBlJ,qBAAsB,Y,MACrB,MAAO,CACNjhB,QAAS,CACRgB,QAASV,EAAA,KAAuB,YAAO,OAAAiU,EAAA,QACvC9V,WAAY,CACX2C,UADW,IAEX6nC,YAFW,EAGXxnC,aAAgC,QAApB,EAAEnB,EAAmB,UAAD,eAAK2B,SAKzCuT,QAAS,WAER,Y,SG/Bc2zB,KACd,UACI7iC,EAAO8iC,GAAS,CAAC,EAArB,IACIC,EAAJ,EACIC,EAAJ,EAEA,aAGE,IAFA,cACIz0B,GAAJ,IACSA,EAAT,GAA2B00B,IAE3B,aAIE,IAHA,IAAIjnB,GAAJ,EACIknB,EAAO50B,8BAAX,KAES0N,EAAIZ,EAAb,QACEW,EAAOX,EAAPW,GACA/b,EAAOmjC,EAAPnjC,GACAojC,EAAOC,EAAPD,GACAE,EAAKC,EAALD,GACAE,EAAKC,EAALD,GAEAN,WAIJ,sBACE,IAAIrrC,EAAO6rC,EAAX,KACIC,GAAS3jC,KAAU0jC,OAAX,IAAZ,EACIE,GAAS5jC,KAAU0jC,OAAX,IAAZ,EACA,KAAU,CACR,GAAI7rC,SAAckkB,EAAlB,MAAgC,OAEhC,IAAI9N,EAAIq1B,EAAKC,EAAb,GACIp1B,EAAIq1B,EAAKC,EAAb,GACII,EAAK31B,YAAT,EACI41B,EAAK51B,YAAT,EAEA,GAAI21B,KAAUC,EAAd,EAAsB,CACpB,IAAIxnB,EAAIpO,UAAUD,IAAQE,EAA1B,GACI41B,EAAIV,EAAOxrC,EAAPwrC,QAAsBD,EAAOC,EAAOxrC,EAA5C,QAEIqW,YAAeA,SAAnB,IACE6N,OAAY9N,GAAK41B,IAAN,GAAX9nB,EACAlkB,MAAWoW,GAAK,EAAhBpW,KAEAkkB,OAAY5N,GAAK21B,IAAN,GAAX/nB,EACAlkB,MAAWsW,GAAK,EAAhBtW,KAKN,OAAOmsC,EAAKV,EAALU,GAAmBC,EAAKT,EAAxBQ,GACLE,EAAKZ,EADAU,GACcG,EAAKX,EAD1B,EAIF,cACE,GAAIE,EAAJ,KACEA,OAAYP,EAAMO,OAAlBA,WACK,CACLA,OAAY,CAAC,EAAbA,GAEA,IADA,IAAIU,GAAJ,IACS,EAAT,GACMV,MAAWA,KAAf,OACEA,UAAex1B,SAASw1B,OAATx1B,GAAuBw1B,UAAtCA,IACAA,UAAex1B,SAASw1B,OAATx1B,GAAuBw1B,UAAtCA,OAOV,cAAsB,OAAOv0B,IAAMA,EAANA,GAAag0B,EAAMh0B,EAANg0B,UAApB,EAEtB,cAAsB,OAAOh0B,IAAMA,EAANA,GAAag0B,EAAMh0B,EAANg0B,UAApB,EAqBtB,OAnBAkB,aAAmB,YACjBlB,GAAS/nB,EAAD,OAAR+nB,GACAE,EAASF,EAAA,KAAU,YAAc,OAAOh0B,KAAOA,EAAd,OAGnCk1B,OAAa,YACX,OAAQC,kBACHtkC,EAAoB,oBAANukC,EAAmBA,EAAIzB,GAArC9iC,GADGskC,GAAR,GAKFD,WAAiB,YACf,OAAQC,kBAAoBvB,KAApBuB,GAAR,GAGFD,aAAmB,YACjB,OAAQC,kBAAoBtB,KAApBsB,GAAR,GAGF,EAqDF,SAASxB,GAASyB,GAChB,OAAO,WAAa,UC3If,IA6CMC,GAAW,SAAAC,GACvB,cAAAn2B,EAAA,iBAEc,cACZ9B,gCACKA,EAAL,QAAmBi4B,4BACnBt1B,KAAOA,EAAPA,EACAA,KAAOA,EAAPA,EACAA,SAAWb,wBAAXa,UACAb,4CARF,WAUa,cACXa,KAAO3C,EAAP2C,EACAA,KAAO3C,EAAP2C,KAZF,UAcY,cACL3C,EAAL,QAAmBi4B,iBACnBt1B,UACAA,UACAb,kCAAgC,SAAAa,GAC/B,IAAIqH,EAAIrH,EAAR,OAEA,cADOA,EAAP,OACA,SCzDSu1B,GAAkB,SAAC,G,IAAE7sC,EAAI,OAAE6V,EAAU,aAAEmN,EAAQ,WAAE9hB,uBAAW,IAAG,KAAOqB,oBAAQ,IAAG,OACvFqmB,EAAU,GAAVA,EAA+B,GAE7BrF,EAAiBvjB,EAAjBujB,MAAOC,EAAUxjB,EAAjB,MACFijB,EAASC,iBAAf,MACM4pB,EAAmB5pB,iBAAzB,MACM6pB,EAAe7pB,iBAArB,MACMG,EAAeH,iBAArB,MAEMI,EAAeJ,iBAAO,CAAElD,UAAW,KAEnCgtB,EAAYtoC,mBAAQ,WACzB,OAAO6e,EAAA,QAAa,YAAU,mBAAAW,EAAA,UAC5B,CAFH,IAIM,EAAsB9Q,mBAAtB,IAAC65B,EAAM,EAAP,GAASC,EAAS,EAAlB,GAEA/d,EAAN,IAEMge,EAAgBzoC,mBAAQ,WAC7B,IAAM2B,EAAS,OAAAoQ,EAAA,MAAiB,YAAU,OAAAyN,EAAA,SAC1C,OAAOzN,8BAAsC,CAAC,EAA9C,OACE,CAHH,IAKM,EDlC2B,SAAC,G,IAAEzW,EAAI,OAAEitC,EAAM,SAAEp3B,EAAU,aACtD,EAAkBzC,mBAASoM,KAA3B,OAACqP,EAAI,EAAL,GAAOue,EAAO,EAAd,GACA,EAA8Bh6B,mBAA9B,MAACw5B,EAAU,EAAX,GAAaS,EAAa,EAA1B,GAgBN,OAdAx5B,qBAAU,WACT,IAAM+4B,EAAa,OAAAn2B,EAAA,iBAEN,WAAM,OAAA22B,EAAQ5tB,KAAR,UAFA,UAGP,WAAM,OAAA4tB,EAAQ5tB,KAAR,UAOlB,OALAytB,WAAe,SAAA30B,GACds0B,QAAiBt0B,EAAjBs0B,KAAyBt0B,EAAzBs0B,UAGDS,KACO,WAAM,OAAAT,EAAA,UACX,CAAC5sC,EAAMitC,EAZVp5B,IAcO,CAAE+4B,WAAF,EAAc/d,KAAI,GCgBIye,CAAmB,CAC/CL,OAD+C,EAE/CjtC,KAF+C,EAG/C6V,WAAU,IAHH+2B,EAAU,EAAZ,WAAc/d,EAAI,EAAlB,KAoNN,ODzNsB,SAAC,G,IAAE5L,EAAM,SAAEI,EAAY,eAAEniB,mBAAO,IAAG,OAAKqB,mBAAO,IAAG,MACxEsR,qBAAU,WACJoP,GAAL,GAGAxM,YAAUwM,EAAVxM,cACC,OAAAA,EAAA,iBAEc,CAAC82B,EAFf,eAGa,SAAA54B,GACX8B,YAAU4M,EAAV5M,0BAAkD9B,EAAlD8B,iBAGD,CAACwM,EAAQI,EAAckqB,EAZ1B15B,ICSA25B,CAAQ,CAAEvqB,OAAF,EAAUI,aAAY,IAE9BxP,qBAAU,WACT,IAAMo5B,EAAS,CACd,CACCnpC,KADD,SAEC0oC,MAAO/1B,YAAeZ,QAAfY,EAAqCZ,SAArCY,IAER,CAAE3S,KAAF,SAAkB0oC,MAAO/1B,6BACzB,CAAE3S,KAAF,IAAa0oC,MAAO/1B,YAAUZ,QAAVY,kBACpB,CAAE3S,KAAF,IAAa0oC,MAAO/1B,YAAUZ,SAAVY,mBACpB,CACC3S,KADD,YAEC0oC,MAAOxB,KAAA,MACA,SAAU1zB,GACf,OAAOA,OAAS,CAACA,aAAD,EAAmBA,cAA5BA,GAAiD,CAAC,EAAzD,MAFK,aAMR,CACCxT,KADD,QAEC0oC,MAAO,OAAA/1B,EAAA,UAEF,YAAO,OAAAa,EAAA,MAFL,2BAQT41B,OACE,CAAC1pB,EAAO3N,EA5BXhC,IA8BAA,qBAAU,WAsBTyP,mCAGA,IAKMuB,EAAkB,SAACX,GACxB,OAAOZ,EAAA,QAAAtD,UAAA,MAAoC,YAAO,OAN1B8E,EAM0BR,EAASJ,EALpDa,KAAaD,EAApB,GADgB,IAAQA,MAUnB2oB,EAAW,OAAAh3B,EAAA,GACRq2B,EADQ,wCAGC,YAAO,OAAAx1B,EAAA,MAHR,MAKf,YACC,IAAMyO,EAAIC,EAAA,+CAGI,cAAc,OA1CP,SAAC9B,GACxB,IAAMI,EAAIe,YAAKnB,EAAM,CAArB,OAEA,KAAiB,CAChB,IAAIoB,EAAJ,GACM7hB,EAAQ2gB,EAAA,WAAmB,YAAU,OAAAmB,EAAA,KAAYjB,EAAZ,MACvC7gB,GAAJ,GACC2gB,cACAkB,MAEAlB,UACAkB,KAGDtC,EAAS,OAAD,IAAC,CAATA,SAEAA,EAAS,CAATA,IA0B6BwC,CAAA,MAHlB,eAAV,WA8CA,OAvCAO,kDAEY,YAAO,OAAAonB,EAAc71B,EAAd,YAFnByO,iEAKiB,YAAO,OAAClB,aAAD,iBALxBkB,gBAMkB,YAAO,OAAClB,OAAD,KAGzBkB,gDAEY,YAAO,OAAAonB,EAAc71B,EAAd,UAFnByO,aAGe,YAAO,OAAAoJ,EAAW7X,aAAe01B,EAA1B,WAHtBjnB,oBAIuB6C,GAJvB7C,6BAQAA,kDAEY,YAAO,OAAAonB,EAAc71B,EAAd,YAFnByO,0CAIiB,YAAO,OAAAoJ,EAAW7X,aAAe01B,EAA1B,WAJxBjnB,6CAMyB6C,GAGzB7C,uBACO,YAAO,OAAAzO,EAAA,SADdyO,+GAMqB,SAAUzO,GAC7B,OACCjB,SAAS82B,EAAc71B,EAAvBjB,OAAmC,EAAI82B,EAAc71B,EAAnB,OAA+B7X,KAAhC,wBAAjC4W,IADD,QAPF0P,+BAaA,KAED,YAkBC,OAjBAE,oBAAyB,YAAO,mBAAa3O,EAAb,MAAoBA,EAApB,SAEhC2O,qCAEY,YAAO,OAAAknB,EAAc71B,EAAd,UAFnB2O,aAGe,YAAO,OAAAkJ,EAAW7X,aAAe01B,EAA1B,WAEtB/mB,uCAEY,YAAO,OAAAknB,EAAc71B,EAAd,YAFnB2O,eAGiB,YAAO,OAAAkJ,EAAW7X,aAAe01B,EAA1B,WAExB/mB,uCAEY,YAAO,OAAAknB,EAAc71B,EAAd,YAFnB2O,eAGiB,YAAO,OAACpB,aAAD,iBAExB,KAED,YAAU,OAAAqB,EAAA,YAGNwnB,EAAO,OAAAj3B,EAAA,GACJs2B,EADI,gCAIXxpB,EAAA,QAAa,YAAU,gBAAAW,EAAA,SACvB,YAAO,OAAA5M,EAAA,SAAaA,EAAb,SALI,MAQX,YACC,OAAA0O,EAAA,yBAEY,YAAO,OAAA1O,EAAA,KAFnB,UAGY,YAAO,OAAAA,EAAA,KAHnB,gDAKe,YAAO,OAAA6X,EAAW7X,aAAe01B,EAA1B,WALtB,MAMO,YAAO,OAAA11B,EAAA,YACf,YACC,OAAA2O,EAAA,UACY,SAAU3O,GACpB,OAAOA,IAAMb,0CAAb,KAFF,UAIY,YAAO,OAAAa,EAAA,QACpB,YAAU,OAAA4O,EAAA,YAIZwnB,QAAU,SAAUp2B,GACnBA,OAASb,yBAATa,aAIDm2B,OAAcd,GAAdc,IACAC,OAAUf,GAAVe,IAGAD,kBAAyB,SAAU94B,EAAO2C,GACzCm2B,6DAGuB,YAAO,OAAC91B,SAAD,OAC9B81B,sDAGuB,YAAO,OAAC91B,SAAD,KAC9B+1B,oCAAuC,YAAO,OAAC/1B,aAAeL,EAAfK,KAAD,MAE9ClB,kGAGDg3B,iBAAwB,WACvBA,4DAAoE7kB,GACpE6kB,wDACAC,sCAEAj3B,sEAGiB,YAAO,OAACoO,aAAD,iBAHxBpO,gBAIkB,YAAO,OAACoO,OAAD,UAGxB,CAACioB,EAAkBC,EAAc/sC,EAAM6uB,EAAM+d,EA7KhD/4B,IAgLC,yB,UAAa,iBAAiBkC,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,GACtF,uBAAGkD,IAAK9C,GACP,uBAAG8C,IAAK4mB,IACR,uBAAG5mB,IAAK2mB,OC/KZ,SAAS,GAAT,G,IAAiBj1B,EAAK,QAAEpC,EAAK,QAAEwQ,EAAM,SAGpC,OAAOpe,YAACwrB,KAASF,QAAS1d,EACtBmC,MAAOC,EACPtC,SAJc,WAAM,OAAA0Q,EAAA,MC/ElB,IAAA0nB,GAAyBnsB,GAwC1BosB,GAAe,SAAC,G,IAACh3B,EAAG,MAAEnB,EAAK,QAC/B,OACE5N,YAACgmC,SACChmC,YAACimC,KAAI9lC,OAAQC,IAAOC,SAAa0O,OAAQnB,EAARmB,MAFrC,OC1CImF,GAAQ,CAACiQ,IAAf,MAEa/mB,GAAS,CACrB2R,IADqB,YAErBgB,MAFqB,sBAGrBsK,KAHqB,UAIrBC,QCMD,SAAuCkH,G,QAACxT,EAAU,aAAE4H,EAAS,YAAEzd,EAAI,OAAEkf,EAAO,UAClE6C,GAAuB,QAAf,EAAKD,qBAAWviB,WAAD,QAAsB,IAA7CwiB,SACF,EAAoC3O,mBAAS,CAACmQ,MAAD,GAAYC,MAAO,KAA/DnB,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GAwCN,OAlCApY,qBAAU,W,MACF0P,EAAN,GACMC,EAAN,GAGA,KAAI,OAAAxjB,QAAI,IAAJA,OAAA,EAAAA,EAAA,SACFisB,EAAiB,CAAC1I,MAAD,GAAYC,MAAO,KAIjCxjB,IAAa,QAAL,EAACA,eAAI,IAAJA,WAAI,yBAAlB,UAIAA,WAAa,c,IAAE4nB,EAAE,KAAE3D,EAAK,QAAU8pB,EAAY,SACtCC,EAAS,CAACpmB,GAAD,EAAK3D,MAAL,EAAYlf,KAAZ,WAA8BkpC,WAAYv3B,GACzD6M,UAGAwqB,WAAqB,SAAAL,GACnB,IAAM51B,EAAQ,CAACF,MAAD,EAAc7S,KAAd,QAA6BmpC,SAA7B,EAA2CD,WAAYv3B,GACrE6M,UACAC,OAAW,CAACyD,OAAD,EAAiBC,OAAQpP,UAKxCiK,GAAYA,EAASP,GAAA,EAA4D,CAAC4C,SAAU,MAG5F6H,EAAiB,CAAC1I,MAAD,EAAQC,MAAK,OAE7B,CAhCH3P,KAmCkB0P,QAAf,SAAAlB,QAAa,IAAbA,OAAA,EAAAA,EAAekB,4BAAf,QAAD,EACI,sBAAiBvjB,KAAMqiB,EACNxM,WAAYA,EACZmN,SA1CN,SAACoB,GAChBrC,GAAYA,EAASP,GAAA,EAA4D,CAAC4C,SAAUA,MA0CvEA,SAAUlF,eAAO,IAAPA,WAASkF,WACpC,uBAAehC,MAAO,oBACPF,KAAM,eACNK,YAAa,qFDvDnCE,SALqB,GAMrBC,MFYmC,SAAC,G,MACEjF,EAAS,YACTK,EAAa,gBACb/B,EAAK,QAErC,EAKF+F,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAQAqnB,EAAqCvnC,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,2CACrC,EACLuR,mBACC,GAAiByI,EAAwB,GAAzC,WACS,cACN,OAACxW,EAAK1C,EAAL0C,MAAsB+jC,WAA6BzmC,EAAnD0C,MAAD,IAJC,KAAClD,EAAkB,EAAnB,GAAqBgsC,EAAgB,EAArC,GAQAC,EAAgB7wB,sBAAYkmB,aAAS,YAE1C,IAAMzhB,EAAmBC,WAAWA,eAApC,IACAD,uBACC9c,OAAA,mBACS,YAAU,OAAN,QADb,KAEM,YAAS,OAAN,QACV6c,EAASP,KAATO,MAPgC,KAAjC,IAUMssB,EAAgB,SAAC1rC,EAAD,G,WAAmB,IAAA8S,OAAgBtT,EAAhB,IACxC,IAAMmsC,EAAqB,OAAH,IAAG,CAAH,eAAOnsC,WAAqBQ,GAAW8S,EAA/D,IACIvQ,OAAA,kBAAyC,YAAW,WAAAuQ,KAApD,QAAJ,GACC04B,KACAC,MAEApoC,uEAIF,OACC6B,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACimB,8BAEA5oB,OAAA,gBAAuC,Y,IAAEi4B,EAAC,KAACz3B,EAAC,KAC3C,mBAAC03B,IAAOxmB,IAAKumB,EAAGtlB,MAAOslB,EAAG1nB,MAAO/P,EAAGugB,OAAQooB,YE5DlD5hB,QDI+B,SAAC,G,UAACvN,EAAO,UAChC6C,EAAYD,yBAAZC,SAUP,OACEla,YAAC8a,IAAMC,cACL/a,YAAC0mC,KACC5zB,MAAO,GACP6zB,mBAAoBZ,MAEZxpB,QAAT,SAAAlF,QAAO,IAAPA,OAAA,EAAAA,EAASkF,+BAAT,QACCvc,YAACmN,KAAOhN,OAAQC,IAAOC,QACf4L,QAhBG,YACXoL,eAAO,IAAPA,oBAAJ,QACE6C,EAAS4rB,GAAsB,UAAWzuB,EAA1C6C,WAEAA,EAAS4rB,GAAsB,UAA/B5rB,SAaK,WAAkBqC,QAAlB,EAAUlF,EAAQkF,+BAAlB,qBAAqDA,QAAR,EAAAlF,EAAQkF,+BAAR,cAHjD,KANL,OCdDrI,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,MAIf+W,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,I,SE1Bc8R,GAAY+gB,EAAK95B,EAAOuF,GACvCzD,8EAIkB,SAAUa,GAG1B,OADgBb,0BAAhB,MACmByD,EAAZyW,MAAP,MAIH,SAAgBhD,GAAW8gB,GAC1Bh4B,gFAGD,SAAgBi4B,GAAQD,GACvBh4B,uCCfD,IAIA,aAAKk4B,GACDA,uCACAA,iCACAA,6BAHJ,CAAKA,QAAL,KAkBO,IAAMC,GAAc,SAASA,EAAYC,EAArB,QAAqB,IAAAA,OAAA,GAE5C,IAAMC,EAAaC,GAAcC,eAI3BC,EAAkB,WACpB,WAAOH,mBAILI,EAAc,WACV,MAAeJ,EAAf,QAACK,EAAK,EAAN,GAAQC,EAAG,EAAX,GACN,OAAQ/4B,SAAS+4B,EAAjB,IAIEC,EAAkB,WACpB,IAAMC,EAAWJ,IACjB,OAAII,GAAUC,IACHZ,GAAP,eAEAW,GAAUE,IACHb,GAAP,YAEGA,GAAP,WAaEc,EAAiB,SAACr5B,GACpB,IAAI64B,IAgBC,OAAOH,EAAP,GAfK,MAAwBA,EAAxB,QAACY,EAAU,EAAX,GAAYC,EAAQ,EAApB,GACN,OAAON,KACH,KAAKV,GAAL,eAEI,OAAOE,EACHc,EAlExB,GADA,IAoEwBD,EAnExB,GAoEgB,KAAKf,GAAL,UAGI,OAAOe,EAAaR,IAApB,EACJ,KAAKP,GAAL,YACI,OAAOe,EAzE3B,KAmFUE,EAAoB,SAACvnC,GACvB,OAAO,W,IAAU,sDAEb,IAAMwnC,EAAMxnC,eAAZ,GAGA,OAAGwnC,IAAH,EACI,EAEJA,IAKR,IAAI,IAAJ,OACQf,iBAAJ,KACIW,KAAuBG,EAAkBd,EAAzCW,KAIR,IAAMK,EAAN,EA8BA,OAtBAA,YAAoB,WAChB,IAAIb,IAWC,OAAOH,EAAP,YAVD,IAAMQ,EAAWJ,IACjB,OAAOG,KACH,KAAKV,GAAL,eACI,OArHpB,IAsHgB,KAAKA,GAAL,YACI,OAAQW,EAAWE,IACvB,KAAKb,GAAL,UACI,OAAQW,EAAR,IAShBQ,OAAe,WACX,OAAOlB,EAAYC,EAAgBC,EAAnC,SAGJ,GCzHEiB,GAAS,CACdpM,IADc,GAEdC,MAFc,GAGdC,OAXD,IAEqB,EAUpBC,KAAM,GARC,IAWFkM,GAAkB,SAACvB,GACxB,IAAIpoB,EAAJ,EAOA,OANA5P,yDAGO,WACL4P,EAAMhQ,WAAc5W,KAAKwwC,UAAzB5pB,WAEKhQ,UAAP,IAGK65B,GAAkB,SAACC,EAASC,GACjC,OAAOA,EAAc/5B,SAAS05B,GAAT15B,OAAH,GAAlB,GAWYg6B,GAAmB,SAAC,G,IAAE5B,EAAG,MAAE6B,EAAa,gBAAEC,EAAU,aAC5DC,GAAJ,EAGMC,EAASh6B,cACTi6B,EAAQj6B,wBAAd,MAEMk6B,EAAqBl6B,wBAA3B,KAGM6b,EAASsc,mCAAf,IAGMgC,EAAQn6B,YAAd,GAEA,cACC,SAAmCk6B,EACnC,EA+eD,MAAO,CACN1qB,OAVD,Y,IAA0BjmB,EAAI,OAAE6V,EAAU,aAAEhU,EAAO,UAAEuyB,EAAU,aAC9D,KApeD,c,IAAgB7wB,EAAU,aAAE8C,EAAM,SAAM2P,EAAM,SAAED,EAAK,QAC9C86B,EAAyBxqC,KAA/B,EAGAoQ,mDAGAA,oDAGAA,gEAGoB,eAAeg6B,EAAf,GAHpBh6B,kCAQA,IAAM05B,EAAUH,GAAhB,GAGAS,SACS,CAAC,EAAGpqC,EADboqC,WAEQ,CAACz6B,EAASk6B,GAAgBC,GAA1B,GAA0CJ,GAFlDU,aAIAh6B,gEAGoB,aAAas5B,GAAb,KAHpBt5B,YAIOq6B,EAJPr6B,IAOA6b,kBAAgC,CAACyd,GAAD,KAAch6B,EAAQg6B,GAAtDzd,QACA7b,iHAKYo6B,EAAyB,MALrCp6B,iBAMag6B,EAAOpqC,KANpBoQ,4HAcAA,kDAEoB,eAAeg6B,EAAf,GAFpBh6B,KAKAA,kDAibCs6B,CAAK/wC,EAAL+wC,GACAP,MA/aF,kB,IACGxwC,EAAI,OAAEuD,EAAU,aAAE6C,EAAI,OAAEC,EAAM,SAAE2qC,EAAgB,mBAAEjvC,wBAAY,IAAG,KAAOkvC,EAAsB,yBAAEC,EAAgB,mBAChHl7B,EAAM,SAAED,EAAK,QACbse,EAAS,YAAElF,EAAU,aAAErsB,yBAAa,IAAG,KAAMC,sBAAU,IAAG,YAAS69B,2BAAe,IAAG,KAGjFiQ,EAAyBxqC,KAA/B,EACI8qC,EAAJ,GACA,IACCA,EAAU,OAAH,IAAG,CAAH,eACHA,IACHrN,KAAMqN,OAAe,MAGvB,IACCA,EAAU,CACTrN,KADS,EACAF,MADA,EACUD,IADV,EACkBE,OAAQ,IAGrC,IAAMuN,EAAWpB,GAAjB,GACAS,SACS,CAAC,EAAGpqC,EADboqC,WAEQ,CAACz6B,GAAUoe,EAAa,EAAI8b,GAAgBkB,GAA5C,IAA8DD,EAFtEV,aAKA,IAAMY,EAAY,SAAC/5B,GAAM,OAACD,MAAao5B,EAAOn5B,EAAPm5B,IAAeA,EAAOn5B,EAAnCD,IAAD,GAMzB,IAHAib,kBAAgC,CAAC6e,EAAD,KAAep7B,EAAQo7B,EAAvD7e,QAEA/uB,EAAaA,EAAbA,QACM+uB,cAAN,IACC/uB,eACA+uB,YAEDtyB,EAAOA,UAAauD,EAApBvD,QAEA4wC,aAAiBte,EAAjBse,UAEA,IAAMU,EAAkB,OAAA76B,EAAA,yCAEJ,eAAeg6B,EAAf,GAFI,qCAKjB,YAAiB,OAAAc,KALA,iBAMJ,eANI,gIA5J1B,IA4J0B,KAYjBz4B,GAAc,GAAI,uCAAuC,YAAgB,OAAAM,EAAc82B,GAAgB,IAAhBA,GAAd,OAE5EsB,GAAJ,IACCF,mDAGkB,cAChB,KAAqB,CACpB,IAAMG,EAAInf,EAAOhb,EAAPgb,OAAkBA,cAA5B,EACMof,EAAIjB,EAAOn5B,EAAPm5B,OAAV,EACM,EAA6Bn5B,EAA7B,aAEAq6B,EAAO,CAAEvvB,MAFF,EAAP,MAEgBwvB,SAFC,EAAjB,SAE0B3tB,MAFF,EAAxB,OAINxN,gFAEAA,0EAIY,WACV65B,GAAiBA,EAAc,KAAM,KAArCA,MACAA,GACCA,EAAc,EAEb,CACCl6B,EADD,EAECE,EAAGo7B,EAAI,IALVpB,aAnBLgB,eAgCiB,WACf,GACC76B,yFAKY,WACV65B,GAAiBA,EAAc,KAA/BA,YAxCLgB,YA4Cc,SAAU38B,EAAO,G,IAACk9B,EAAI,OAAEj6B,EAAK,QACzC,KAAU24B,EAAW,IAArB,QAEK,KACJ,GAAGlc,WAAH,+BAAqD,CAMpD,IAAMzd,EAAOgB,EAAD,kBAAZ,MACA,GAEC+e,YAAY,GAAGtC,gBAAfsC,kBAIDA,YAAY,GAAGtC,gBAAfsC,gBAML,IAAMwZ,EAAUH,GAAhB,GAGAS,SACS,CAAC,EAAGpqC,EADboqC,WAEQ,CAACz6B,GAAUoe,EAAa,EAAI8b,GAAgBC,EAA5C,IAAwEgB,EAFhFV,aAKAh6B,kDAEoB,aAAa06B,EAAb,KAFpB16B,YAGOq6B,EAHPr6B,mEASAA,uDAIag6B,EAAOpqC,KAJpBoQ,IAOAA,kDAEoB,eAAeg6B,EAAf,GAFpBh6B,KAKAA,2CAEAA,6FAIoB,aAAa06B,EAAb,KAJpB16B,aAMEA,yBAEYV,EAAQo7B,EAAT,MAAyBA,EAFpC16B,iBANFA,KAaAA,0EAKE,YACC,OAAOuP,EAAA,gDAGK,YAAO,OAAAsM,EAAOhb,EAAP,OAAkBgb,cAAlB,KAHZ,UAIK,YAAO,OAAAme,EAAOn5B,EAAP,YAJZ,wDAOA,YACL,OAAA25B,EAAyBA,EAAuB35B,EAA1B,OAAqCN,GAA8BM,EAAzF,UARK,gBAUW,WAEhB,OADc7X,KAAKqyC,wBAA0B,EAAIxf,EAAjD,YACe,EAAf,KAZK,eAAP,iCAgBD,YACC,OAAOrM,EAAA,UACK,YAAO,OAAAqM,EAAOhb,EAAP,OAAkBgb,cAAlB,KADZ,UAEK,YAAO,OAAAme,EAAOn5B,EAAP,YAFZ,MAGA,YACL,OAAA25B,EAAyBA,EAAuB35B,EAA1B,OAAqCN,GAA8BM,EAAzF,UAJK,gBAMW,WAChB,UAEc7X,KAAKqyC,wBAA0B,EAAIxf,EAAjD,YADQ,EAER,QAGH,YAAU,OAAApM,EAAA,YAOZ,IACMjB,EADUxO,sBAAhB,GACiB,KAAY,YAC5B,IAAMs7B,EAASC,EAAA,QAAW,YACzB,OAAQz6B,MAAM06B,EAAd,OAID,OAFAF,MAAaC,EAAbD,IACAA,QAAeC,EAAfD,MACA,KAIDt7B,+DAGiB,YAAO,OAAAa,EAAA,OAHxBb,MAKE,YAAW,OAAAuP,EAAA,oDACX,YAAY,OAAAC,KACZ,YAAU,OAAAC,EAAA,YAPZzP,yBAUO,YAAO,OAAAa,KAVdb,MAYE,YACC,IAAMsP,EAAIC,EAAA,gDAGU,YAAO,mBAAasM,EAAOhb,OAApB,gBAHjB,aAIK,WACb,IAAMV,EAAMH,YAAUhX,KAAVgX,oBAAZ,IACA,OAAO0Y,EAAW6hB,EAAlB,OANQ,qDASQ,SAAUtE,EAAGp1B,GAC7B,IAAMlB,EAAIkc,EAAOhb,OAAPgb,OAAuBA,cAAjC,EACMhc,EAAIm6B,EAAOn5B,OAAPm5B,OAAV,EACM75B,EAAMH,YAAUhX,KAAVgX,oBAAZ,IAEMzW,EAAO,CACZoiB,MAAO9K,OADK,MAEZs6B,SAFY,EAGZ3tB,MAAOgtB,EAAyBA,EAAuB35B,OAA1B,IAAyCA,WAGvEb,gFAEAA,0EAIY,WACV65B,GAAiBA,EAAc,KAAM,KAArCA,MAEAA,GACCA,EAAc,EAEb,CACCl6B,EADD,EAECE,EAAGA,EAAI,IALVg6B,YA7BM,eAwCO,WACf75B,yFAKY,WACV65B,GAAiBA,EAAc,KAA/BA,YA/CM,YAkDI,SAAU37B,EAAO,G,IAACzT,SAAO2wC,EAAI,OAAEj6B,EAAK,QAChD,KAAU24B,EAAW,IAArB,QAEK,KACJ,GAAGlc,WAAH,+BAAqD,CAMpD,IAAMzd,EAAOgB,EAAD,kBAAZ,MACA,GAEC+e,YAAY,GAAGtC,gBAAfsC,kBAIDA,YAAY,GAAGtC,gBAAfsC,gBAgEJ,OA5DA,EACC5Q,qCACqB,SAAUzO,GAC7B,OAAOA,iBAAmBA,OAA1B,QAFFyO,aAIe,WACb,IAAMmsB,EAAYzyC,KAAlB,WAEA,OADagX,oBAAb,WANFsP,kFAcY,YAAO,OAAA0qB,EAAOn5B,EAAP,OAdnByO,aAegBuM,EAfhBvM,4BAgBiB,YAAO,OAAAsrB,EAAA,MAExBtrB,oFAKY,YAAO,OAAA0qB,EAAOn5B,EAAP,OALnByO,aAMgBuM,EANhBvM,4BAOiB,YAAO,OAAAsrB,EAAA,MAkCzB,KAED,YA6CC,OA5CAprB,+CAGoB,YAAO,mBAAaqM,EAAOhb,OAApB,gBAH3B2O,aAIe,WACb,IAAMrP,EAAMH,YAAUhX,KAAVgX,oBAAZ,IACA,OAAO0Y,EAAW6hB,EAAlB,OAGF/qB,wEAKY,YAAO,OAAAwqB,EAAOn5B,EAAP,OALnB2O,aAMgBqM,EANhBrM,4BAOiB,YAAO,OAAAorB,EAAA,MAExBprB,2DAIY,WAAM,OAAAqM,EAAA,iBAJlBrM,UAKY,YAAO,OAAC5O,MAAao5B,EAAOn5B,EAAPm5B,IAAeY,KAA5Bh6B,EAAD,KALnB4O,aAMe,WACb,IAAM+rB,EAAMvyC,KAAZ,WACMyV,EAAOuB,oBAAb,QACA,OAAOvB,EAAOwd,YAAH,GAAX,WATFzM,MAWO,SAAU3O,GACf,IACM4e,EADMz2B,KAAZ,WACA,WACMmX,EAAMH,uBAAZ,IACA,OAAOw6B,EACJA,EAAuB35B,OADG,IAE1BN,GAA8BM,OAFjC,OAfF2O,gBAmBkB,SAAU3O,GAC1B,UAGC7X,KAAKwwC,UAAUj6B,OAAS,EAAIq7B,EAA5B,IAA4C5xC,KAAKqyC,wBAA0B,EAAIxf,EADhF,YADQ,EAGW6f,EAAgB,EAAnC,KAEF,KAED,YAAU,OAAAjsB,EAAA,YAsBZD,CAAOjmB,EAAM6V,EAAYhU,EAAzBokB,IAKAmsB,MAfD,WACC1D,OAeA9W,UAxBD,cACClK,GAAY+gB,EAAK95B,EAAjB+Y,IAwBAmK,SArBD,WACClK,SCnhBIoiB,GAAS,CACdpM,IADc,EAEdC,MAFc,GAGdC,OAHc,GAIdC,KAPD,KAUMkM,GAAkB,SAACvB,GACxB,IAAI14B,EAAJ,EACIC,EAAJ,EASA,OAPAS,yDAGO,WACLV,EAAQM,UAAUA,WAAgB5W,KAAKwwC,UAAvCl6B,QACAC,EAASvW,KAAKwwC,UAAdj6B,UAEK,CAACD,MAAD,EAAQC,OAAM,IAGhBq8B,GAAgB,SAACC,EAAanC,EAASC,GAC5C,OAAOA,EAAc/5B,KAAA,SAAwBi8B,EAA3B,GAAlB,GAWYC,GAAqB,SAAC,G,IAAE9D,EAAG,MAAE6B,EAAa,gBAAEC,EAAU,aAC9DC,GAAJ,EAGMle,EAAS7b,cACTm6B,EAAQn6B,YAAd,GAEM+7B,EAAqB/7B,wBAA3B,KAGMg6B,EAAS7B,qCAAf,IACM8B,EAAQj6B,YAAd,GAEA,cACC,SAAmC+7B,EACnC,EAscD,MAAO,CACNvsB,OATD,Y,IAA0BjmB,EAAI,OAAE6V,EAAU,aAAEhU,EAAO,UAAEuyB,EAAU,aAC9D,KA5bD,c,IAAgB7wB,EAAU,aAAE8C,EAAM,SAAM2P,EAAM,SAAED,EAAK,QAC9C86B,EAAyBxqC,KAA/B,EAGAoQ,mDAGAA,oDAGAA,kDAGAg6B,kBAAgC,CAACV,GAAD,IAAa/5B,EAAS+5B,GAAtDU,SACAh6B,gEAAoE,aAAas5B,GAAb,KAApEt5B,eAEA,IAAM05B,EAAUH,GAAhB,GAGA1d,SACS,CAAC,EAAGjsB,EADbisB,WAEQ,CAAC+f,GAAct8B,EAAOo6B,EAAR,OAAd,GAA4Cp6B,EAAQg6B,GAF5Dzd,eAIA7b,gEAGoB,gBAAeT,EAAS+5B,GAAxB,QAHpBt5B,UAIOg8B,EAJPh8B,IAOAA,iDAEoB,aAAa47B,GAAct8B,EAAOo6B,EAAR,OAA1B,GAFpB15B,OA+ZCs6B,CAAK/wC,EAAL+wC,GACAP,MA3ZF,kB,IACGxwC,EAAI,OAAEuD,EAAU,aAAE6C,EAAI,OAAEC,EAAM,SAAE2qC,EAAgB,mBAAEjvC,wBAAY,IAAG,KAAOkvC,EAAsB,yBAAEC,EAAgB,mBAChHl7B,EAAM,SAAED,EAAK,QAEdoZ,EAAU,aACVrsB,yBAAa,IAAG,KAChBC,2BAAe,IAAG,KAElBsxB,EAAS,YAIN8c,EAAJ,GACA,IACCA,EAAU,CACTrN,KADS,EACAF,MADA,EACUD,IADV,EACkBE,OAAQ,IAIrC,IAAM6O,EAAW,SAACp7B,GAAM,OAACD,MAAaib,EAAOhb,EAAPgb,IAAeA,EAAOhb,EAAnCD,IAAD,GAClBw5B,EAAyBxqC,KAA/B,EAGAoqC,kBAAgC,CAACU,EAAD,IAAcn7B,EAASm7B,EAAvDV,SAEIA,cAAJ,EAA4BC,EAAA,WAAiBD,EAAA,iBAAuB,cAAU,QAAE/5B,EAAF,QACzEg6B,aAAiBD,EAAjBC,UAEL,IAAMiC,EAAkB,OAAAl8B,EAAA,yCAEJ,aAAa06B,EAAb,KAFI,uCAKjB,YAAiB,OAAAI,KALA,kDAWjBz4B,GAAc,GAAI,uCAAuC,YAAgB,OAAAM,EAAA,GAAmBi5B,GAAct8B,EAAD,OAAhC,QAE5Ey7B,GAAJ,IACCmB,mDAGkB,cAChB,KAAqB,CACpB,IAAMlB,EAAInf,EAAOhb,EAAjB,OACMo6B,EAAIjB,EAAOn5B,EAAPm5B,OAAkBU,MAA5B,EACM,EAA6B75B,EAA7B,aAEAq6B,EAAO,CAAEvvB,MAFF,EAAP,MAEgBwvB,SAFC,EAAjB,SAE0B3tB,MAFF,EAAxB,OAINxN,gFAEAA,0EAIY,WACV65B,GAAiBA,EAAc,KAA/BA,MACAA,GAAiBA,EAAc,EAE9B,CACCl6B,EADD,EAECE,EAAGo7B,GAEJ,CAAEkB,SAAUC,IAASC,mBAzB3BH,eA+BiB,WACf,GACCl8B,yFAKY,WACV65B,GAAiBA,EAAc,KAA/BA,YAvCLqC,YA2Cc,SAAUh+B,EAAO,G,IAACk9B,EAAI,OAAEj6B,EAAK,QACzC,KAAU24B,EAAW,IAArB,QAEK,KACJ,GAAGlc,WAAH,+BAAqD,CAMpD,IAAMzd,EAAOgB,EAAD,kBAAZ,MACA,GAEC+e,YAAY,GAAGtC,gBAAfsC,kBAIDA,YAAY,GAAGtC,gBAAfsC,gBAML,IAAMwZ,EAAUH,GAAhB,GAGA1d,SACS,CAAC,EAAGjsB,EADbisB,WAEQ,CAAC8B,EAAa,EAAIie,GAAct8B,EAAOo6B,EAAR,MAA/B,GAAwEp6B,EAAQo7B,EAFxF7e,eAIA7b,kDAEoB,gBAAeT,EAASm7B,EAAxB,QAFpB16B,UAGOg8B,EAHPh8B,mEAQAA,kDAEoB,cAAa2d,EAAa,EAAIie,GAAct8B,EAAOo6B,EAAR,MAA3C,IAFpB15B,OAKAA,2CAEAA,6FAIoB,gBAAeT,EAASm7B,EAAxB,QAJpB16B,UAMEA,wBAEWT,EAASm7B,EAATn7B,OAA0Bm7B,EAFrC16B,gBANFA,KAaAA,0EAKE,YACC,OAAOuP,EAAA,gDAGK,YAAO,OAAAsM,EAAOhb,EAAP,YAHZ,UAIK,YAAO,OAAAm5B,EAAOn5B,EAAP,OAAkBm5B,cAAlB,KAJZ,8FAQA,YACL,OAAAQ,EAAyBA,EAAuB35B,EAA1B,OAAqCN,GAA8BM,EAAzF,UATK,gBAWW,WAEhB,OADc7X,KAAKwwC,UAAUj6B,OAASy6B,EAAtC,YACe,EAAf,KAbK,eAAP,iCAiBD,YACC,OAAOxqB,EAAA,UACK,YAAO,OAAAqM,EAAOhb,EAAP,YADZ,UAEK,YAAO,OAAAm5B,EAAOn5B,EAAP,OAAkBm5B,cAAlB,KAFZ,MAGA,YACL,OAAAQ,EAAyBA,EAAuB35B,EAA1B,OAAqCN,GAA8BM,EAAzF,UAJK,gBAMW,WAChB,UAEc7X,KAAKwwC,UAAUj6B,OAASy6B,EAAtC,YADQ,EAER,QAGH,YAAU,OAAAvqB,EAAA,YAOZ,IACMjB,EADUxO,sBAAhB,GACiB,KAAY,YAC5B,IAAMs7B,EAASC,EAAA,QAAW,YACzB,OAAQz6B,MAAM06B,EAAd,OAID,OAFAF,MAAaC,EAAbD,IACAA,QAAeC,EAAfD,MACA,KAIDt7B,+DAGiB,YAAO,OAAAa,EAAA,OAHxBb,MAKE,YAAW,OAAAuP,EAAA,oDACX,YAAY,OAAAC,KACZ,YAAU,OAAAC,EAAA,YAPZzP,yBAUO,YAAO,OAAAa,KAVdb,MAYE,YACC,IAAMsP,EAAIC,EAAA,gDAGU,YAAO,qBAAeyqB,EAAOn5B,OAAtB,cAHjB,aAIK,WACb,IAAMV,EAAMH,YAAUhX,KAAVgX,oBAAZ,IACA,OAAO0Y,EAAW6hB,EAAlB,OANQ,qDASQ,SAAUtE,EAAGp1B,GAC7B,IAAMV,EAAMH,YAAUhX,KAAVgX,oBAAZ,IACML,EAAIkc,EAAOhb,OAAjB,IACMhB,EAAIm6B,EAAOn5B,OAAPm5B,OAAuBU,MAAjC,EAEMnxC,EAAO,CACZoiB,MAAO9K,OADK,MAEZs6B,SAFY,EAGZ3tB,MAAOgtB,EAAyBA,EAAuB35B,OAA1B,IAAyCA,WAEvEb,gFAEAA,0EAIY,WACV65B,GAAiBA,EAAc,KAA/BA,MAEAA,GACCA,EAAc,EAEb,CACCl6B,EADD,EAECE,EAAGA,GAEJ,CAAEs8B,SAAUC,IAASC,kBAnCjB,eAuCO,WACfr8B,yFAKY,WACV65B,GAAiBA,EAAc,KAA/BA,YA9CM,YAiDI,SAAU37B,EAAO,G,IAACzT,SAAO2wC,EAAI,OAAEj6B,EAAK,QAChD,KAAU24B,EAAW,IAArB,QAEK,KACJ,GAAGlc,WAAH,+BAAqD,CAMpD,IAAMzd,EAAOgB,EAAD,kBAAZ,MACA,GAEC+e,YAAY,GAAGtC,gBAAfsC,kBAIDA,YAAY,GAAGtC,gBAAfsC,gBAiEJ,OA3DA,EACC5Q,qCACqB,SAAUzO,GAC7B,OAAOA,iBAAmBA,OAA1B,QAFFyO,aAIe,WACb,IAAMmsB,EAAYzyC,KAAlB,WAEA,OADagX,oBAAb,WANFsP,sEAaY,YAAO,OAAAuM,EAAOhb,EAAP,OAbnByO,0BAegB,YAAO,OAAA2sB,EAAA,MAfvB3sB,cAgBiB0qB,EAhBjB1qB,aAkBAA,wEAIY,YAAO,OAAAuM,EAAOhb,EAAP,OAJnByO,0BAMgB,YAAO,OAAA2sB,EAAA,MANvB3sB,cAOiB0qB,EAPjB1qB,aAwCD,KAED,YA8CC,OA7CAE,+CAGoB,YAAO,qBAAewqB,EAAOn5B,OAAtB,cAH3B2O,aAIe,WACb,IAAMrP,EAAMH,YAAUhX,KAAVgX,oBAAZ,IACA,OAAO0Y,EAAW6hB,EAAlB,OAGF/qB,wEAKY,YAAO,OAAAqM,EAAOhb,EAAP,OALnB2O,0BAOgB,YAAO,OAAAysB,EAAA,MAPvBzsB,cAQiBwqB,EARjBxqB,aAUAA,2DAIY,WAAM,OAAAwqB,EAAA,iBAJlBxqB,UAKY,YAAO,OAAC5O,MAAaib,EAAOhb,EAAPgb,IAAeogB,KAA5Br7B,EAAD,KALnB4O,aAMe,WACb,IAAM+rB,EAAMvyC,KAAZ,WACMyV,EAAOuB,oBAAb,QACA,OAAOvB,EAAOwd,YAAH,GAAX,WATFzM,MAWO,SAAU3O,GACf,IACM4e,EADMz2B,KAAZ,WACA,WACMmX,EAAMH,uBAAZ,IACA,OAAOw6B,EACJA,EAAuB35B,OADG,IAE1BN,GAA8BM,OAFjC,OAfF2O,gBAmBkB,SAAU3O,GAC1B,UAGC7X,KAAKwwC,UAAUj6B,OAASy6B,EAAxB,aAA8ChxC,KAAKqyC,wBAA0B,EAAIY,EADlF,GADQ,EAGWP,EAAgB,EAAnC,KAEF,KAED,YAAU,OAAAjsB,EAAA,YAqBZD,CAAOjmB,EAAM6V,EAAYhU,EAAzBokB,IAKAmsB,MAdD,WACC1D,OAcA9W,UAvBD,cACClK,GAAY+gB,EAAK95B,EAAjB+Y,IAuBAmK,SApBD,WACClK,SCzdF,SAAS,GAAT,KACC,cAAIxP,EACI,CACNne,KADM,KAEN+yC,SAFM,KAGNlxC,QAAS,MAIX,2BACIg7B,IACH78B,KAAMme,EAAOne,KACb+yC,SAAU50B,EAAO40B,SACjBlxC,QAASsc,EAAOtc,UAWlB,SAAgBmxC,GAAkBC,GAC3B,MAAoB7T,qBAAW,GAAS,CAAE2T,SAAF,KAAkB/yC,KAAlB,KAA8B6B,QAAS,OAA9Eg7B,EAAK,EAAN,GAAQ9a,EAAQ,EAAhB,GAEAuuB,EAAgB/yB,uBACrB,gBACCwE,EAAS,CAAE/hB,KAAF,EAAQ+yC,SAAR,EAAkBlxC,QAAO,MAEnC,CAJD,IA6BA,MAAO,CACNqxC,eAvBsBxuC,mBAAQ,WAC9B,OAAKm4B,EAAL,SAGCh1B,mBACCoO,MAAO,CACN28B,SADM,WAEN9O,KAAMjH,WAFA,EAGN8G,IAAK9G,WAHC,EAIN7mB,OAJM,EAKND,MALM,EAMNo9B,QANM,OAONC,cAAe,SAGhBvrC,YAACwrC,iBAAQC,SAAU,SAAUzlB,QAASolB,EAASpW,EAAD,MAAc0W,OAAQ1W,aAAmB,GAAOA,EAAMh7B,SAAS2xC,cAAe,QAC3H3rC,kBAbH,QAF4B,OAmB1B,CAACorC,EAAUpW,EAAX,KAAuBA,EAAvB,SAAuCA,EApB1C,UAwBCyT,cAAa,GC7EP,OAAoB9uB,GC0C5B,SAAgBiyB,GAAsBzzC,GACrC,MAAW,OAAO6H,kBAAP,MAEH,IhE7CyB6pB,EAAKgiB,EgE6C9BtxB,EAA2BpiB,EAA3BoiB,MAAO6B,EAAoBjkB,EAA3B,MAAc4xC,EAAa5xC,EAA3B,SAER,OACC6H,mB,UAAa,mBAAmBF,IAAKgsC,IACpC9rC,mBAAKC,UAAW,Q,UAAiB,0BAC/Bsa,GAEFva,mBAAKC,UAAW,aACfD,mBAAKC,UAAW,W,UAAoB,6BAClC8pC,GAEF/pC,mBAAKC,UAAW,Q,UAAiB,2BhExDE4rC,EgE+CtC,EhE9CA,oBADiChiB,EgEyDVzN,GhExDnB,YAA8CyN,EAC3Cza,IAAQya,cAARza,WAAP,iBgE8D2B,oqBAA5B,I,SAsBM08B,GAAgBhsC,YAAG,imBCxEZisC,GAAwB,SAAC,G,MAAE5f,EAAQ,WAAEh0B,EAAI,OAAE6V,EAAU,aAAEkI,EAAmB,sBAAED,EAAa,gBAAEsW,EAAU,aAC3GnR,EAASC,mBAETrhB,EAAU6C,mBAAQ,W,QACvB,MAEA,IAAMmvC,EAAI,OAAH,IAAG,CAAH,eAAQ91B,IAAqBoR,WAAY6E,IAOhD,QAJKjW,eAAmB,IAAnBA,WAAD,cAA4Dzd,QAA5D,EAAmDuB,QAAnD,EAAoCic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAhE,uBACCuzC,aAAe/1B,qBAAf+1B,qBAGD,KACE,CAAC7f,EAAUjW,EAXd,IAaM,EAAmD0hB,KAAzCqU,EAAgB,EAA1B,SAAkCC,EAAa,EAA/C,MAEA,EAAiC3gC,mBAAjC,GAAC2hB,EAAY,EAAb,GAAcif,EAAe,EAA7B,GACNngC,qBAAU,WACT,GAAGkgC,eAAa,IAAbA,WAAH,OAA0B,CACzB,IAAIE,EAAgB,OAAH,IAAG,CAAH,GAAOj0C,EAAxB,OACAkF,eAAe6uC,SAAf7uC,oBAAuD,Y,IAAE0R,EAAG,KAAU,OACtDq9B,YAIhB,IAAMC,EAAkB,OAAH,IAAG,CAAH,eACjBl0C,IACHA,KAAMA,OAAK,KAAS,SAAA6zC,GACnB,IAAMM,EAAW,OAAH,IAAG,CAAH,GAAd,GAQA,OAPAn0C,gBAAkB,SAAAm9B,IACb4W,mBAAD,IAAsCI,iBAAzC,KACCA,SAAkBA,EAAlBA,UACOA,EAAP,OAIF,KAEDp8B,OAAO/X,EAAA,eACN,YAAK,OAAA+zC,EAAA,iBAA+B5W,EAA/B,UAIH+W,aAAJ,IAAoCA,eACpCF,UAGIh0C,aAAJ,IAAyBA,eACzBg0C,OAEA,CAACD,eAAa,IAAbA,WAAD,OAjCFlgC,IAoCM,MF5CyB,SAAC,G,IAChCoP,EAAM,SACNjjB,EAAI,OACJo0C,EAAW,cACXv+B,EAAU,aACVhU,EAAO,UACPwyC,EAAa,gBACbC,EAAe,kBACfrB,EAAQ,WACP7e,EAAU,aAGLzb,EAAUmJ,qBAAhB,IACI9B,EAAYrH,eAAO,IAAPA,2BAAhB,UACIoJ,EAAWpJ,eAAO,IAAPA,WAAf,SAGM,EAAoBvF,qBAAnBmhC,EAAK,EAAN,GAAQC,EAAQ,EAAhB,GAGA,EAA0CphC,mBAA1C,cAACqhC,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GAGAC,EAAiBzxB,iBAAvB,IAGM0xB,EAAU9f,cAEVyb,EAAa,SAAClsB,GACnBuwB,WAIKC,EAAkBnwC,mBAAQ,WAE/B,OAAO1E,EAAA,mBAAuB,cAAU,OAAAqW,KAAA,MAAWkO,EAAX,UAAjC,mBAAP,aACE,CAACvkB,EAHJ,aAKM,EAAoCgzC,GAApC,GAAEE,EAAc,EAAhB,eAAkB5C,EAAa,EAA/B,cAmEN,OAjEAz8B,qBAAU,WACT,IAAMihC,EAAQV,aAAd,EAEMW,EAAc,WACnB,MAAO,aAAAD,EACJT,EAAc,CACd5F,IAAKxrB,EADS,QAEdqtB,cAFc,EAGdC,WAHc,EAIdyE,gBAAiBjzB,EAAW,YAAe,OAAAA,EAASizB,GAAT,KAAuC,eAElFV,EAAgB,CAChB7F,IAAKxrB,EADW,QAEhBqtB,cAFgB,EAGhBC,WAHgB,EAIhByE,gBAAiBjzB,EAAW,YAAe,OAAAA,EAASizB,GAAT,KAAuC,gBAItF,GAAIh1C,GAAJ,EAAwB,CACvB,IAAIi1C,EADmB,EAIvB,OAAIj1B,EACH20B,mBAEAA,kBAIGM,GAAMH,IAAV,IAECG,UAEAA,EAAKF,IACLP,KACAE,MAID,IACCO,EAAKF,IACLP,MAIDS,SAAU,CAAEj1C,KAAF,EAAQ6V,WAAR,EAAoBhU,QAApB,EAA6Bme,UAAW20B,EAAxC,QAAgEvgB,WAAU,OAEnF,CAAC,EAAD,wBAhDHvgB,IAiEO,CAAEq/B,eAAF,EAAkBgC,aAAcX,GE7DEY,CAAiB,CACzDlyB,OADyD,EAEzDjjB,KAFyD,EAGzD6V,WAHyD,EAIzDhU,QAJyD,EAKzDuyC,YAAkCgB,QAAvB,EAAEr3B,eAAmB,IAAnBA,WAAqBq3B,yBALuB,OAMzDhhB,WANyD,EAOzDigB,cAPyD,GAQzDC,gBARyD,GASzDrB,SAAUQ,KATHP,EAAc,EAAhB,eAAkBgC,EAAY,EAA9B,aA8BN,OAjBArhC,qBAAU,WAEN7T,gBAAqBA,aAArBA,QAAH,GACC8zC,EAAiB,CAChB/uC,KADgB,YAEhB8Z,QAAS,CACRzY,KAAMpG,EADE,KAERmvB,WAFQ,EAIRyI,UAAW,SAAAze,G,OAAQ,OAAA+7B,QAAY,IAAZA,OAAA,EAAAA,EAAA,eAA6B,CAACt+B,IAAIuC,KAErD0e,SAAU,SAAA1e,G,OAAQ,OAAA+7B,QAAY,IAAZA,OAAA,EAAAA,EAAA,cAA4B,CAACt+B,IAAIuC,UAIrD,CAACnZ,EAAD,WAfF6T,IAkBChM,mBAAKoO,MAAO,CAAE28B,SAAU,aACtBM,EACDrrC,mB,UAAa,gBAAgBkO,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,EAAQtb,IAAK0tC,OAKhGA,GAAa1tC,YAAG,uPC9GtB,IAAM2tC,GAAW,SAAAl/B,GAAK,OAAAA,GAETm/B,GAAqB,SAAC,G,IAAE9hB,EAAY,eAAEhW,EAAS,YAAEM,EAAmB,sBAAE7c,yBAAa,IAAG,EAAAo0C,KAC1FvzB,EAAaD,yBAAbC,SAER,OAAOxE,uBACN,YACC,IAAMmO,EAAW8pB,EAAjB,GAEMx2B,EAAgBiD,WAAWA,eAAjC,IACIyJ,sBAAqBA,GAAzB,SAAmDA,SAC3C1M,EAAP,GAEAA,OAED+C,EAASP,KAATO,MAED,CAACtE,EAAWsE,EAAU0R,EAZvB,KCHK+hB,GAAgB,SAAC//B,GAAU,OAAAA,SAcpBggC,GAA0B,SAAC,GACvC,IAAAh4B,EAAS,EAATA,UACAgW,EAAY,EADZ,aAEA7b,EAAK,EAFL,MAGAhV,EAAM,EAHN,OAIA++B,EAAY,EAJZ,aAKA5jB,EAAmB,EALnB,oBAMGtD,EAAI,cAPgC,oFASjC8mB,EAAwBgU,GAAmB,CAAE9hB,aAAF,EAAgBhW,UAAhB,EAA2BM,oBAA3B,EAAgDy3B,cAAa,KAExGl7B,EAAa5V,mBAAQ,WAC1B,IAAMk9B,EAAa7jB,eAAmB,IAAnBA,WAAnB,GACA,OAAS6jB,eAAF,IAAqBA,EAA0Bh/B,EAAA,MAAY,YAAU,OAAAsX,EAAA,aAA5E,IACE,CAACynB,EAAclO,EAAc7wB,EAHhC,IAKMiX,EAAiB,SAAAK,GAAQ,OAAAA,EAAA,OAE/B,OACCrS,YAACuT,gBACAvZ,QAASe,EACT2X,mBAAoBgnB,EACpBjnB,WAAYA,EACZT,eAAgBA,EAChBjC,MAAOA,EAEPyD,QAASxB,EAAeS,IAR1B,KChCKk7B,GAAgB,SAAC//B,GAAU,UAYpBigC,GAAwB,SAAC,G,IAAEj4B,EAAS,YAAEM,EAAmB,sBAAE0V,EAAY,eAAE7b,EAAK,QACpF+9B,EAAejxC,mBAAQ,WAC5B,SAASqZ,eAAmB,IAAnBA,WAAT,MACE,CAAC0V,EAFJ,IAIMmiB,EAAiBL,GAAmB,CAAE9hB,aAAF,EAAgBhW,UAAhB,EAA2BM,oBAA3B,EAAgDy3B,cAAa,KAEvG,OAAO3tC,YAACqrB,IAAiB/Z,KAAMvB,EAAOrC,SAAU,WAAM,OAAAqgC,EAAA,IAA8BziB,QAASwiB,KCLjFE,GAA2B,SAAC,G,UACxCp4B,EAAS,EAATA,UACAK,EAAa,EADb,cAEAhb,IAFA,aAEAA,OAAY,IAAG,aAFf,EAGAC,IAHA,MAGAA,OAAK,IAAG,YAHR,EAIA69B,IAJA,UAIAA,OAAS,IAAG,IAJZ,EAKGnmB,EAAI,cANiC,kEAQhCsH,EAAaD,yBAAbC,SAEF+zB,EAAWpxC,mBAAQ,WACxB,IAAM4d,EAAN,GAcA,OAbApK,WACS,SAAAzC,GAAS,kBAAAA,EAAA,SADlByC,SAEU,YAERE,YAAwB,YACvB,IAAMR,EAAWnC,YAAe2/B,EAAhC,MACA9yB,OAAS,CACRyzB,KAAMtgC,EADE,MAER2/B,UAAWA,EAFH,MAGRx9B,MAAOA,UAIX,IAfD,IAkBM2pB,EAAwBhkB,uBAC7B,Y,MACOyB,EAAgBiD,WAAWA,eAAjC,IACIuf,uBAAmB,OAAAA,QAAM,IAANA,OAAA,EAAAA,EAAA,QAAvB,UAAsD,OAAAA,QAAM,IAANA,OAAA,EAAAA,EAAA,OACrD,IAAIwU,SACIh3B,qBAAP,GAEA,UAAOA,qBAAP,8BAGIA,qBAAL,KACCA,4BAEDA,8BAED+C,EAASP,KAATO,MAED,CAACtE,EAAWsE,EAAUjE,EAAe2V,EAjBtC,IAoBMwiB,EAAmDxiB,QAAxC,EAA2BnzB,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAamzB,yBAAzD,GACMnZ,EAAa27B,eAAW,IAAXA,IAAeH,EAAlC,GACMj8B,EAAiB,SAACK,GAAS,OAAAA,EAAA,OAEjC,OACCrS,YAACuT,gBACAvZ,QAASi0C,EAETv7B,mBAAoBgnB,EACpBjnB,WAAYA,EACZT,eAAgBA,EAChBjC,MAAOA,EACPyD,QAASxB,EAAeS,IAR1B,KChEKwB,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,oBAErBgB,MAFqB,cAGrBsK,KAHqB,qBAIrBC,QCKD,SAAuCkH,G,MAAE+Y,EAAa,gBAAErkB,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAE8d,EAAa,gBAAEvb,yBAAa,MAACmW,KACrH,EAAoCtF,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GACA,EAAoBwT,KAAnB1d,EAAQ,EAAT,SAAW8a,EAAK,EAAhB,MACAzI,EAAayI,eAAK,IAALA,WAAnB,WAuDA,OAtDAhpB,qBAAU,W,QAET,MAOA,IAAK7T,EAAD,SAAJ,KAA0B0X,QAAL,EAAA1X,EAAK0X,8BAAL,QAGpB,OAFAqK,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,SAClEoN,EAAiB,CAAEjsB,KAAF,GAAYuD,WAAZ,GAA4B6C,KAA5B,GAAsC2R,OAAtC,GAAkD1R,OAAQ,CAAC,EAAG,KAGhF0b,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,IAIlE,IAAMwjB,EAAY7qB,GAAlB,GAWA6qB,uBAEI,OAAAtkB,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,GAAch8B,QAAX,SAAAi8B,QAAS,IAATA,OAAA,EAAAA,EAAWj8B,2BAAX,SAAzBg8B,IACAC,gBAAuB,cACtBA,6BAEStkB,eAAmB,IAAnBA,WAAJ,gBACNqkB,SAAqBC,eAAS,IAATA,WAArBD,MACAC,gBAAuB,YAEtBA,mBAA2B/qB,EAA3B+qB,OAAsCtkB,EAAA,sBAAyC,cAAY,OAAAiG,EAAA,KAA3Fqe,QAGDD,SAAqBC,eAAS,IAATA,WAArBD,MACAC,gBAAuB,YACtBA,4BAIFpW,UA9CClK,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,MA+CjE,CAAC7e,EAAMoiC,EAlDVvuB,KAsDsB7T,QAAf,SAAAqiB,QAAa,IAAbA,OAAA,EAAAA,EAAeriB,2BAAf,UACN,sBACCA,KAAMqiB,EACNxM,WAAYA,EACZkI,oBAAqBA,EACrBD,cAAeA,EACfkW,SAAUoO,EACVhO,WAAYA,IAGb,uBACChS,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD3Ef7E,OALqB,GAMrB8E,SANqB,GAOrBC,MEemC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBACnF,OACClW,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,SACPkG,cAAeA,E,UACP,2BAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACPjL,MAAO,WACPkG,cAAeA,E,UACP,2BACRb,YAAY,IAEbpV,YAACguC,IACAp4B,UAAWA,EACXK,cAAeA,EACf2V,aAAa,WACb7b,MAAM,cACNo+B,UAAW,E,UACH,gCAETnuC,YAACguC,IACAp4B,UAAWA,EACXK,cAAeA,EACf2V,aAAa,WACb7b,MAAM,gBACNo+B,UAAW,E,UACH,mCAGVnuC,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,uCAETpQ,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,8BAGVpV,YAACi6B,QACAj6B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,YACPopB,cAAc,U,UACN,8BAETn5B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,IACd7qB,MAAO,cACPopB,cAAc,W,UACN,oCAMbn5B,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,gCAETtnB,YAACm6B,IACAj9B,KAAM,oBACN0Y,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,eACd7b,MAAO,gC,UACC,6BAET/P,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAa,YACb7b,MAAM,cACNhV,OAAQuV,GACRwpB,aAAcxpB,GAAmB,G,UACzB,iCAGVtQ,YAACi6B,QACAj6B,YAAC6tC,IACAj4B,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,gBACd7b,MAAO,kBACPnC,OAAO,IAER5N,YAAC6tC,IACAj4B,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,kBACd7b,MAAO,oBACPnC,OAAO,UFvJdqG,MARqB,GASrBgH,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACX41C,WADW,YAEXl0C,QAFW,GAGXm0C,SAHW,IAIXh1C,SAAU,CAACgB,KAJA,MAKXi0C,SAAU,CACT,CAACL,KAAD,QAAgBX,UAAhB,aAAyCx9B,MAAO,oBAChD,CAACm+B,KAAD,QAAgBX,UAAhB,aAAyCx9B,MAAO,yBAMrD+b,2BAA4B,YAE3B,MAAO,CACN0iB,WADM,EAENC,WAFM,EAGNC,YAHM,EAINC,uBAJM,EAKNrnB,WAAY/qB,GALN,gBAMNgxC,UANM,OAONviB,YAPM,EAQNsf,eARM,EASNsE,iBAAiB,IAGnBp/B,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IGxBI86B,GAAe,CACpBpgC,EADoB,GAEpBF,EAAG,IA2CSugC,GAAkBr3C,wBAAxB,MAEP,SAAgBs3C,GAAcvtB,G,IAC7BwtB,EAAgB,mBAChBhhC,EAAU,aACVuY,EAAQ,WACRltB,WAAQ41C,OAAU,IAAG,OACZC,EAAe,UACxBx0C,4BAAgB,IAAG,KACnBy0C,EAAO,UACP7nB,EAAU,aACVptB,sBAAU,IAAG,EAAAk1C,MACb7iB,EAAU,aACV8iB,EAAU,aACVC,EAAU,aACV9nB,EAAM,SAEErZ,EAAkBH,EAAlBG,OAAQD,EAAUF,EAAlB,MACFuhC,EAAc1yC,mBAAQ,WAC3B,IAAM0yC,EAAc,OAAH,IAAG,CAAH,GAAjB,IAKA,OAJA,IACCA,MACAA,OAED,IACE,CAPH,IASM,EAAoC1yC,mBAAQ,WACjD,IAOMqrC,EAAS,OAAH,IAAG,CAAH,eAPU,CACrBpM,IADqB,GAErBG,KAFqB,EAGrBD,OAHqB,EAIrBD,MAAO,KAGR,GAMA,MAFwB,CAAEmM,OAAF,EAAUsH,UAHhBthC,EAAQqhC,EAARrhC,EAAwBg6B,EAA1C,MAG6CuH,WAF1BthC,EAASohC,EAATphC,EAAyB+5B,EAA5C,OAKE,CAAC/5B,EAAQD,EAfN,IAAEg6B,EAAM,EAAR,OAAUsH,EAAS,EAAnB,UAAqBC,EAAU,EAA/B,WAkBAr0B,EAASC,iBAAf,MAGMljB,EAAO0E,mBAAQ,WAAM,OAAA6yC,GAAkBV,EAAlB,KAA8C,CAACA,EAA1E,IAGM,EAAqBnyC,mBAAQ,W,QAC9B8yC,EAAenoB,EtDKd,IsDLL,EACMnoB,EAAS,CASdorB,OAAQmlB,+BAA4B,CAACL,EAAD,EAAgBC,EAAYD,EAAZC,EATtC,IAUd5G,OAAQxqC,qBACC8wC,eAAe,IAAfA,IADD9wC,UAEA,CAACqxC,EAFDrxC,KAMT,GAAIjG,UAAJ,EAAsB,CACrB,IAAI03C,OAAK,EAAEC,OAAI,EAGf,KAAsB,CACrB,IAAMC,EAAY,SAACtgC,GAAyB,mBAAIpS,cAAcoS,EAAlB,YAC5CogC,EAAQ13C,QAAH,EAAGA,yBAAwBA,EAAhC03C,GACAC,EAAOnyC,QAAH,EAAGA,+CAA8CxF,EAAKA,SAA1D23C,QAEAD,EAAQ13C,EAAR03C,GACAC,EAAO33C,EAAKA,SAAZ23C,GAID,IAAME,EAAOxxB,YAAIrmB,GAAM,YAAO,mBAAIkF,cAAcoS,EAAlB,YAE9BpQ,gBAAqB,CAACwwC,EAAD,MAAcC,EAAnCzwC,MACAA,gBAAqB6vC,eAAe,IAAfA,IAAmB,CAAC,EAAGc,QAA5C3wC,IAGD,WACE,CAACkwC,EAAap3C,EAAMs3C,EAAYD,EAAWN,EAvCxC,IAAEzkB,EAAM,EAAR,OAAUme,EAAM,EAAhB,OA0CN58B,qBAAU,WAET,IAAM+8B,EAAQkH,qBAAyBT,EAAvC,KACM3G,EAAQqH,qBAAuBT,EAAvBS,GAAd,MAEA7+B,YAAO+J,EAAP/J,qDACA,IACCA,YAAO+J,EAAP/J,0DAGoB,iBAAgBo+B,EAAavH,EAA7B,KAHpB72B,aAKA,GACCA,YAAO+J,EAAP/J,gEAGoB,cAAak+B,IAAgBC,EAA7B,SAA+CC,EAAavH,EAAbuH,IAA/C,IAHpBp+B,6BASFA,YAAO+J,EAAP/J,qDACA,IACCA,YAAO+J,EAAP/J,0DAGoB,aAAak+B,EAAb,OAA+BrH,EAA/B,IAHpB72B,aAKA,GACCA,YAAO+J,EAAP/J,gEAGoB,2BAA0Bo+B,IAAeF,EAAfE,EAA1B,GAHpBp+B,gEASA,CAACo+B,EAAYD,EAAWtH,EAAxB,QAvCHl8B,IAyCA,IAAMmkC,EAAkBtzC,mBACvB,WACC,OAAAsyC,EAAO,EAEJiB,qBAA6C,CAA7CA,gBAA8D,CAACnqC,GAFlE,sBAGD,CAACkpC,EALF,IAQM5wC,EAAO1B,mBACZ,WAAM,OAACsyC,EAAWH,EAAJ,KAAiE,CAAzE,WACN,CAACG,EAFF,IAKMkB,EAA6B,CAClCZ,WADkC,EAElCD,UAFkC,EAGlCtH,OAHkC,EAIlC/vC,KAJkC,EAKlCijB,OALkC,EAMlC7c,KANkC,EAOlCksB,OAPkC,EAQlCme,OARkC,EASlCthB,WATkC,EAUlCgpB,WAAU,GAGX,OACCtwC,mB,UAAa,gBAAgBse,IAAKlD,EAAQlN,MAAOA,EAAOC,OAAQA,EAAQC,MAAO,CAAC2zB,SAAU,YACzF/hC,YAAC8uC,GAAgBpX,UAAS9pB,MAAOyiC,GAFnC,IAiBM,IAAMX,GAAoB,SAAC,EAAD,G,eAEhC,IAAAP,OAAA,GAEA,IAAMoB,EAAeh4C,eAAQ,IAARA,WAArB,KAEMi4C,EAAgE,QAApD,EAAAD,QAAJ,EAAIA,wBAAwBE,SAAQ,YAAS,OAAAC,EAAA,kBAAW,QAAtE,GAOA,OAJA,KAAKH,QAAD,EAACA,wBAAwBh5B,QAAO,YAAS,aAAzC,SACHpZ,0FAGD,EACSqyC,EAAA,QACC,YAAU,aADX,KAEF,Y,IAAGG,EAAM,SAAE5gC,EAAK,QAAEw3B,EAAG,MAAED,EAAK,QAM1BsJ,EALoCr4C,EAAA,UAAuD,YAAO,SAEvGo4C,MAFuG,MAK5E,MACrB,cAAU,OAAAE,EAAA,GAAOC,EAAP,MADW,oBAGnB,cAIP,OAHIC,KAAJ,GACCC,UAED,IAPF,IAUA,MAAO,CACNj2C,OAAQsC,mBADF,GAEN0S,MAFM,EAGNw3B,IAAK,IAAI5vB,KAHH,GAIN2vB,MAAO,IAAI3vB,KAAK2vB,OAIXkJ,EAAA,QACC,YAAU,aADX,KAEF,Y,IAAGp0B,EAAK,QAAErM,EAAK,QAAEw3B,EAAG,MAAED,EAAK,QAAO,MAAC,CACvCvsC,OAAQ,CAAEuuB,MAAOlN,GACjBrM,MAFuC,EAGvCw3B,IAAK,IAAI5vB,KAH8B,GAIvC2vB,MAAO,IAAI3vB,KAAK2vB,QC/Rd2J,GAA0B,SAAC,G,IAAE53C,sBAAU,IAAG,OACzC,EAUF4gB,qBAVE,IACLiuB,EAAM,EADD,OAECsI,EAAQ,EAFT,KAGLf,EAAU,EAHL,WAILhlB,EAAM,EAJD,OAKLme,EAAM,EALD,OAMLxtB,EAAM,EAND,OAOL7c,EAAI,EAPC,KAQL+oB,EAAU,EARL,WASLgpB,EAAU,EATL,WAYAY,EAAax7B,uBAClB,gBAEC,IAAMy7B,EAAW9/B,YAAO+J,EAAP/J,gBACR,YADQA,8FAAjB,GAWM+/B,EAAaC,qBACV,CAAC,EAAD,IADUA,YAEX,CAAC,IAFUA,aAAnB,GA+BA,OA1BWF,EAAA,wBAEJ,YAA0C,OAAA1hC,KAFtC,uBAQC,YACV,OAAOm5B,EAAOn5B,EAAPm5B,MAAmBA,EAAOn5B,EAA1Bm5B,IAAP,KATS,eAWM,YACf,IAAIz6B,EAASy6B,EAAOn5B,EAAPm5B,IAAeA,EAAOn5B,EAAnC,IACA,OAAOtB,GAAUA,EAAVA,IAAP,KAbS,UAeC,YAAO,OAAAsc,EAAOhb,OAAP,UAfR,cAiBK,YACd,IAAMvB,EAAQuc,EAAOhb,OAAPgb,KAAqBA,EAAOhb,OAA1C,OACA,OAAOvB,EAAQkjC,EAAf,QAiBH,CAACh2B,EAAQqP,EAAQme,EAvDlB,IA0DMzc,EAAWzW,uBAAY,YAA0C,OAAA4R,EAAW7X,EAAX,OAAmB,CAA1F,IAuBA,OApBAzD,qBAAU,WAMT,IAAMslC,EAAW,6BAET,cAAc,OAAAC,EAAA,aAFL,MAAjB,GAKMC,EAAoBF,EAA1B,GACMG,EAAeC,GAArB,GACAR,EAAW,OAAQO,GAAc,OAAAE,QAAU,IAAVA,OAAA,EAAAA,EAAA,QAAqBlxC,IAArB,MAAjCywC,GAEA,IAAMU,EAAsBN,EAA5B,GACMO,EAAiBH,GAAvB,GACAR,EAAW,SAAUW,EAArBX,KACE,CAACS,EAAYT,EAAY/kB,EAAU5tB,EAAMiyC,EAlB5CxkC,IAqBChM,YAAC8a,IAAMC,cACN/a,iBAAGC,UAAU,cAAc+O,UAAW,gBAAmBk5B,EAAnB,UACtCloC,iBAAGC,UAAU,gBAAgB+O,UAAW,gBAAmBk5B,EAAnB,YAKrCwJ,GAAc,SAACI,GACpB,OAAAA,EAAA,KAAU,YACT,IAAM5H,EAASC,EAAA,QAAW,YACzB,OAAQz6B,MAAM06B,EAAd,OAID,OAFAF,MAAaC,EAAbD,IACAA,QAAeC,EAAfD,MACA,MAGW6H,GAAOC,eAAK,IAAO,cAC/B,OAAOC,eAAyBC,EAAhC,cCpGD,SAAwBC,GACIC,EACAC,EACAC,GAElB,MAA0BntB,GAA1B,GAACsC,EAAO,EAAR,GAAUC,EAAY,EAAtB,GACA6qB,EAAiB78B,uBACnB,YACI,OAAOgS,EAAa2qB,EAApB,MACF,CAAC3qB,EAHP,IAWA,OANA1b,qBAAU,WACN,GAAiBomC,IAAA,gBACI,cAAU,OAAAG,EAAA,qBADd,eAEG,cAAU,OAAAA,EAAA,qBAChC,CAACA,EAJHvmC,IAMA,EC/BG,I,MAAMwmC,GAA8C,SAAC,G,IAACC,EAAK,QAC3D,EAAkEx4B,qBAAlE,IAAEwQ,EAAM,EAAR,OAAUglB,EAAU,EAApB,WAAsBvH,EAAM,EAA5B,OAA8BU,EAAM,EAApC,OAAsCzwC,EAAI,EAA1C,KAA4CijB,EAAM,EAAlD,OAAoDo0B,EAAS,EAA7D,UAoCA,EAAiCjkC,qBAAhC6mC,EAAY,EAAb,GAAcM,EAAe,EAA7B,GAEN1mC,qBAAU,WACT0mC,GAAgB,WAAK,kBACpB,OAAO,YAAOt3B,EAAP,SAAA/J,OAAA,iIAOK,YAAO,OAAAoZ,EAAOhb,EAAP,UAPZ,UAQK,YAAO,OAAAm5B,EAAOz4B,YAAI9S,cAAcoS,EAAzB,gBARZ,eASU,YACf,IAAMtB,EAASshC,EAAa7G,EAAOz4B,YAAI9S,cAAcoS,EAArD,UACA,OAAOtB,GAAUA,EAAVA,IAAP,KAXK,cAcS,YACd,IAAMD,EAAQuc,EAAOhb,EAAPgb,KAAgBA,EAAOhb,EAArC,OACA,OAAOvB,EAAQmjC,qBAAkB,CAAC,EAAD,IAAlBA,YAAwC,CAAC,IAAzCA,gBAAf,MAhBK,eAAP,4BAoBA,CAACj2B,EAAQjjB,EAAMsyB,EAAQme,EAtBzB58B,IAwBA,IAAMyb,EAAU0qB,GAAqB,GAhDhB,SAAC,G,IAAC7K,EAAK,QAAEC,EAAG,MAAEx3B,EAAK,QAAEhV,EAAM,SAE/C,KAAU,CAET,IAAMqhB,GADNrhB,EAAS,OAAH,IAAG,CAAH,GAANA,IACA,aACOA,EAAP,MACAA,OAGD,OAAO,sBACNwf,MAAOxK,EACPuW,cAVD,aAWCN,QAAO,aACN2sB,MAAOrL,EACPsL,IAAKrL,EACLsL,SAAUC,aAAexL,EAAOC,IAC7BxsC,OA5BiB,CACtB2qB,UADsB,MAErBxT,UAAW,CACX,CACCjW,KADD,SAECjC,QAAS,CACR+4C,OAAQ,CAAC,EAAG,QA4DhB,OACC,kBAACj4B,IAAD,gBAEC,uBAAGiF,GAAG,oBAAoB/Q,UAAW,gBAAmBk5B,EAAnB,QAAkCh6B,MAAOshC,MCjEpEwD,GAAoC,SAAC,G,IACjDhlC,EAAU,aACV7V,EAAI,OACJg3C,EAAO,UACP5U,EAAa,gBACb+V,EAAU,aACV2C,EAAgB,mBAChBR,EAAK,QACLlmB,EAAU,aACT8iB,EAAU,aACXC,EAAU,aAEJ,EAAkD1X,KAAxCqU,EAAgB,EAA1B,SAAiCC,EAAa,EAA9C,MAENlgC,qBAAU,WACNmjC,GAAH,GACClD,EAAiB,CAChB/uC,KADgB,YAEhB8Z,QAAS,CACRzY,KAAMpG,EADE,KAERmvB,WAAWiT,OAIb,CAACpiC,EAAD,IAVF6T,IAaM,MAAkCT,mBAAlC,GAAC2hB,EAAY,EAAb,GAAeif,EAAe,EAA9B,GAYN,OAXAngC,qBAAU,WACT,QpHsYD,WoHtYIknC,EpHsYG,OoHtYgBhH,eAAa,IAAbA,WAAtB,QAA4C,CAE3C,IAAMG,EAAkB,OAAH,IAAG,CAAH,eACjBl0C,IACHoG,KAAKpG,EAAA,aAAiB,YAAK,OAAA+zC,EAAA,yBAE5BC,QAEA,CAACD,EATHlgC,IAYChM,mBAAKF,IAAKqzC,GAAO74B,SAChBta,YAAC+uC,IACAC,iBAAkB9hB,EAClBlf,WAAY,CAAEG,OAAQH,EAAV,OAA6BE,MAAOF,EAAWE,OAC3Dg6B,OAAQ,CAAElM,OAAF,GAAcC,KAAM,IAC5BkT,QAASA,EACT7nB,WAAYiT,EACZ+V,WAAYA,EACZ2C,iBAAkBA,EAClB1mB,WAAYA,EACZ8iB,WAAYA,EACZC,WAAYA,EACZ9nB,UAAQ,OAAA0kB,QAAa,IAAbA,OAAA,EAAAA,EAAA,SAERlsC,YAAC+xC,SACD/xC,YAACwyC,IAAiBC,MAAOA,OAqBvBU,GAAS,CACd74B,QAASxa,YAAG,qTACgE,uLAA7BmG,GAFjC,kBAOdmtC,OAAQtzC,YAAG,oOAG8B,4CAAhCmG,GAHE,sBCjFZ,SAAgBotC,GAAqB7xB,G,IACpCxT,EAAU,aACV7V,EAAI,OACJkB,yBAAa,IAAG,EAAAwX,KAChBnW,+BAAmB,IAAG,GAAEy0C,SAAF,EAAkB8D,kBAAlB,EAA2C5D,WAA3C,GAA2DC,WAAY,IAAvE,EACtB/U,EAAa,gBAEP4U,KAAYj5B,eAAmB,IAAnBA,WAAlB,SACM,EAAoB0hB,KAAnB1d,EAAQ,EAAT,SAAW8a,EAAK,EAAhB,MACAzI,EAAayI,eAAK,IAALA,WAAnB,WACMxa,EAAgB3d,mBAAQ,W,MAE7B,GAAK1E,GAASwF,cAAcxF,EAA5B,OAIA,QAASm7C,QAAL,EAAAn7C,EAAKm7C,2BAAL,QACH,MAAO,GAIR,IAAIC,EAAJ,EACA,IAAK,IAAL,KAAkBp7C,EAAlB,KACC,IAAK,IAAL,KAAsBA,kBACrBo7C,GAAcpE,EACXh/B,aAAI9S,cAAclF,qBADA,SAElBA,qBAFHo7C,MAKF,OAAIA,EAKJ,OAHA,GACChZ,SAAqBpiC,EAArBoiC,MAED,KACE,CAACpiC,EAAMg3C,EAzBV,IAuCA,OAXAnjC,qBAAU,W,MAEJ7T,GAASwF,cAAcxF,EAAxB,OAAJ,KAA+Cm7C,QAAL,EAAAn7C,EAAKm7C,2BAAL,QAI1Cp5B,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,IAHjEkD,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,MAKjE,CARHhL,IAWOwO,EACN,sBACCxM,WAAYA,EACZ7V,KAAMqiB,EACN20B,QAASA,EACT5U,cAAeA,EACf+V,WAAYp6B,eAAmB,IAAnBA,WAAqBo6B,WACjC2C,iBAAkB/8B,eAAmB,IAAnBA,WAAqB+8B,iBACvCR,MAAOv8B,eAAmB,IAAnBA,WAAqBu8B,MAC5BlmB,WAAYA,EACZ8iB,WAAYn5B,eAAmB,IAAnBA,WAAqBm5B,WACjCC,WAAYp5B,eAAmB,IAAnBA,WAAqBo5B,aAGlC,uBAAe/0B,MAAM,gBAAgBF,KAAK,eAAeK,YAAaC,ICzDjE,IAAM64B,GAAqB,SAAC,G,IAAE59B,EAAS,YAAEK,EAAa,gBAC3D,OACEjW,YAACskB,SACCtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC1BxkB,YAAC8a,IAAMC,cACL/a,YAAC+Z,IACCnE,UAAWA,EACXoE,UAAW,EACX9F,MAAO,CAACiQ,IAAD,UACPpU,MAAM,sBACNkG,cAAeA,E,UACP,yCC1Bd/B,GAAQ,CAACiQ,IAAf,UAEa/mB,GAAS,CACrB2R,IADqB,WAErBgB,MAFqB,WAGrBsK,KAHqB,sBAIrBC,QAJqB,GAKrBM,SALqB,GAMrBC,MANqB,GAOrB3G,MAPqB,GAQrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACXg7C,iBADW,MAEXC,iBAFW,EAGXC,iBAAkB,OAKtB7nB,2BAA4B,YAC3B,MAAO,CACNqjB,SAAS,IAGX3/B,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IAIW6/B,GAAgB,CAC5B7kC,IAD4B,mBAE5BgB,MAF4B,mBAG5BsK,KAH4B,sBAI5BC,QAJ4B,GAK5BM,SAL4B,GAM5BC,MAN4B,GAO5BI,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,EAAA,MAAwB,YAAc,OAAAQ,EAAA,OAAkBqpB,IAAlB,YAD7C,MAER1rB,WAAY,CACX6D,cAAe,CACdhC,EAAA,MACC,YACC,OAACQ,6BAAsCA,iBAAwBkgB,IAA/D,gBACClgB,iBAAwBkgB,IADzB,gBAJQ,MAQXy4B,iBARW,MASXC,iBATW,EAUXC,iBAAkB,OAKtB7nB,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GADN,YAEN4yC,SAAS,IAGX3/B,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IC3DW8/B,GAAiB,SAAC,G,IAAajN,EAAG,YAAE6B,EAAa,gBACzDE,GAAJ,EAGMle,EAAS7b,oBAEP,CAAC,EAAG,EAAIJ,KAFDI,WAAf,GAMMg6B,EAASh6B,cAGTklC,EAAM,OAAAllC,EAAA,kBAEE,YAAO,OAAAg6B,EAAOn5B,EAAP,OAFT,aAGE,YAAO,OAAAm5B,EAAOn5B,EAAP,OAHT,YAIC,YAAO,OAAAgb,EAAOhb,OAAP,UAJR,UAKD,YAAO,OAAAgb,EAAOhb,OAAP,OAAuBgb,EAAvB,eALN,SAAZ,KASMspB,EAAU,OAAAnlC,EAAA,iBAEH,YAAO,OAAA6b,EAAA,MAFJ,UAGL,YAAO,OAAAA,EAAA,GAAYA,EAAZ,eAHF,SAAhB,KAOMupB,EAAW,OAAAplC,EAAA,iBAEJ,YAAO,OAAA6b,EAAA,MAFH,UAGN,YAAO,OAAAA,EAAA,GAAYA,EAAZ,eAHD,SAAjB,KAOMwpB,EAAa,OAAArlC,EAAA,iBAEN,YAAO,OAAA6b,EAAA,MAFD,UAGR,YAAO,OAAAA,EAAA,GAAYA,EAAZ,eAHC,SAAnB,KAaA,kB,IAAkBtyB,EAAI,OAAEuD,EAAU,aAAE6C,EAAI,OAAEC,EAAM,SAAE2qC,EAAgB,mBAAMh7B,EAAM,SAAED,EAAK,QAAMoZ,EAAU,aAC9F4sB,EAAiB1lC,WAAWA,WAAXA,MAA0C,GAC3D2lC,EAAiB3lC,YAAaA,WAAW0lC,EAA/C,IAEAzpB,YACAme,SAAc,CAAC,EAAGpqC,EAAlBoqC,WAAoC,CAACuL,EAArCvL,IAEAkL,4BAEc,YAAO,OAAAlL,EAAOn5B,EAAP,OAFrBqkC,aAGc,YAAO,OAAAlL,EAAOn5B,EAAP,OAHrBqkC,YAIa,YAAO,OAAArpB,EAAOhb,OAAP,UAJpBqkC,UAKW,YAAO,OAAArpB,EAAOhb,OAAP,OAAuBgb,EAAvB,eAClBspB,4BAEc,WAAM,OAAAnL,EAAA,MAFpBmL,aAGc,WAAM,OAAAnL,EAAOpqC,EAAP,OAHpBu1C,YAIa,YAAO,OAAAtpB,EAAA,MAJpBspB,UAKW,YAAO,OAAAtpB,EAAA,GAAYA,EAAZ,eAClBupB,4BAEc,WAAM,OAAApL,EAAOpqC,EAAP,OAFpBw1C,aAGc,WAAM,OAAApL,EAAOpqC,EAAP,OAHpBw1C,YAIa,YAAO,OAAAvpB,EAAA,MAJpBupB,UAKW,YAAO,OAAAvpB,EAAA,GAAYA,EAAZ,eAClBwpB,4BAEc,YAAO,OAAArL,EAAOn5B,EAAP,OAFrBwkC,aAGc,YAAO,OAAArL,EAAOn5B,EAAP,OAHrBwkC,YAIa,YAAO,OAAAxpB,EAAOhb,OAAP,UAJpBwkC,UAKW,YAAO,OAAAxpB,EAAOhb,OAAP,OAAuBgb,EAAvB,eAGlB7b,2DAGmB,YAAO,OAAAa,KAH1Bb,MAKE,YACC,IAAMsP,EAAIC,8BAAV,GAoBA,OAlBAD,yEAEAA,sCACuB,YAAO,OAACuM,KAAYjc,KAAZic,WAAD,SAD9BvM,4BAE8B,YAC5B,IAAIk2B,EAAW3pB,EAAf,GACA,OAAO2pB,EAAW5lC,QAAX4lC,GAA0BA,GAAa,EAAI5lC,KAAL,GAAtC4lC,YAAP,iBAJFl2B,kBAMoB,YAClB,IAAIm2B,EAAcL,WAAlB,GAIA,OAFAK,MAAkBA,WAAlBA,GACAA,MAAkBA,WAAlBA,GACO,aAAeA,EAAtB,OAXFn2B,6CAcO,YAAO,OAAAzO,KAEd,KAED,YAkBC,OAjBA2O,8BAAmC,YAAO,OAAA21B,EAAA,MAC1C31B,yCAEuB,YAAO,OAACqM,KAAYjc,KAAZic,WAAD,SAF9BrM,4BAG8B,YAC5B,IAAIg2B,EAAW3pB,EAAf,GACA,OAAO2pB,EAAW5lC,QAAX4lC,GAA0BA,GAAa,EAAI5lC,KAAL,GAAtC4lC,YAAP,iBALFh2B,kBAOoB,YAClB,IAAIi2B,EAAcL,WAAlB,GAIA,OAFAK,MAAkBA,WAAlBA,GACAA,MAAkBA,WAAlBA,GACO,aAAeA,EAAtB,OAZFj2B,MAcO,YAAO,OAAA3O,KAEd,KAED,YAAU,OAAA4O,EAAA,YAGZ,IAAMiQ,EAAN,GACA1f,yEA9IF,IA8IEA,MAIO,SAAUa,GACf,IAAImf,EAAMolB,WAAV,GAGMjlB,EADKngB,YAAX,MACawC,OAAb,UAEM4d,EAAY,CAAE7gB,OAAQ4gB,EAAV,OAAuB7gB,MAAO6gB,EAA9B,MAA0CxgB,EAAGqgB,EAA7C,GAAqDngB,EAAGmgB,EAAI,IAE1E5E,GAAcgF,EAAlB,GACCpgB,oCAEA0f,aAKH1f,wCAEOA,sBAFPA,IAEoC,YAAO,OAAAa,KAF3Cb,MAIE,YAAW,OAAAuP,EAAA,sFACX,YAAY,OAAAC,KACZ,YAAU,OAAAC,EAAA,YANZzP,yBASO,YAAO,OAAAa,KATdb,MAWE,YACC,IAAMsP,EAAIC,+CAAV,kBAoDA,OAlDAD,4DAGe,WACb,IAAMmQ,EAAQz2B,KAAK08C,WAAnB,WACMC,EAAY3lC,uBAAlB,IACA,OAAO0Y,EAAW6hB,EAAlB,OANFjrB,kDASkB,SAAUpR,EAAO2C,GACjCb,oFAEAA,+DAIA65B,EAAc,KAAM,KAApBA,MAiHP,SAAuB37B,EAAO2C,EAAGg5B,EAAewL,EAAYxpB,EAAQmc,EAAK4N,GACxE,IAAMnmB,EAAQmmB,EAAd,WACMD,EAAY3lC,uBAAlB,IACMg3B,EAAWqO,WAAjB,GAGMlJ,E5GnPP,SAA0C0J,QAAA,IAAAA,MAAA,GACzC,IAAI1J,EAAqBC,IAAzB,IAMA,OAJIyJ,EAAQjmC,QAARimC,GAAuBA,EAAS,EAAIjmC,KAAL,GAAnC,IAAsDu8B,EAAWC,IAAXD,OAClD0J,EAAS,EAAIjmC,KAAL,GAARimC,GAA6BA,EAAS,EAAIjmC,KAAL,GAAzC,EAA4Du8B,EAAWC,IAAvE,OACSyJ,EAAS,EAAIjmC,KAAL,GAARimC,GAA6BA,EAAS,EAAIjmC,KAAL,GAAzC,IAA4Du8B,EAAWC,IAAXD,MAEjE,E4G4OiB2J,EADF,EAAIjqB,EAAOhb,OAAX,OAA2Bgb,EAA5B,aAAd,GAMMkqB,G5GzQ6B94C,E4GuQG+S,eAAD,O5GvQOgmC,E4GuQkBhmC,sBAA9D,W5GtQO,SAAUL,EAAGE,GACnB,IAAMskC,EAAS6B,EAAf,wBACMn6C,EAASoB,EAAf,eACA,MAAO,CACN0S,EAAG9T,MAAeA,IAAfA,EAA8BA,EAA9BA,EAAyCs4C,EADtC,KAENtkC,EAAGhU,MAAeA,IAAfA,EAA8BA,EAA9BA,EAAyCs4C,EAAOjX,O4GmQvB8J,EAAD,GAAcA,EAA3C,IAEMztC,EAAO,CACZoiB,MAAO9K,OADK,MAEZs6B,SAFY,EAGZ3tB,MAAO3M,W5G9QT,IAAoC5T,EAAS+4C,E4GiR5CnM,EAAc,EAEb,CACCl6B,EAAGomC,EADJ,EAEClmC,EAAGkmC,IAAgB,IAEpB,CAAE5J,SAAUA,IAxIP8J,CAAc/nC,EAAO2C,EAAGg5B,EAAewL,EAAYxpB,EAAQmc,EAAKhvC,KAAhEi9C,eAlBF32B,eAoBiB,WACftP,mFACA65B,EAAc,KAAM,KAApBA,SAIFvqB,kCA1ML,IA0MKA,yEAIe,WACb,IACMmQ,EADMz2B,KAAZ,WACA,WACM+W,EAAQ2Y,EAAW6hB,EAAiBv6B,uBAA1C,MACA,OAAOD,EAAQkc,YAAH,GAAZ,WARF3M,sDAWoB,YAAO,OAAC1O,GAAQskC,WAARtkC,IAA2B,aAAaskC,WAAb,GAA3BtkC,IAAD,QAX3B0O,MAYO,SAAUzO,GACf,IACM4e,EADMz2B,KAAZ,WACA,WACMmX,EAAMH,uBAAZ,IACA,OAAOa,OAAP,MAhBFyO,gBAkBkB,SAAUzO,GAC1B,IAAMqlC,EAASlM,EAAOn5B,EAAPm5B,IAAeA,EAAOn5B,EAArC,IACMslC,EAAUnmC,yBAAhB,UACA,OAAOkmC,EAASC,EAATD,OAA0BA,EAASC,EAAnCD,SAAP,KAGF,KAED,YAgCC,OA/BA12B,0CAGe,WACb,IAAMiQ,EAAQz2B,KAAK08C,WAAnB,WACMC,EAAY3lC,uBAAlB,IACA,OAAO0Y,EAAW6hB,EAAlB,OAGF/qB,8BAEe,WACb,IACMiQ,EADMz2B,KAAZ,WACA,WACM+W,EAAQ2Y,EAAW6hB,EAAiBv6B,uBAA1C,MACA,OAAOD,EAAQkc,YAAH,GAAZ,WANFzM,kBAQoB,YAAO,OAAC5O,GAAQskC,WAARtkC,IAA2B,aAAaskC,WAAb,GAA3BtkC,IAAD,QAR3B4O,MASO,SAAU3O,GACf,IACM4e,EADMz2B,KAAZ,WACA,WACMmX,EAAMH,uBAAZ,IACA,OAAOa,OAAP,MAbF2O,gBAekB,SAAU3O,GAC1B,IAAMqlC,EAASlM,EAAOn5B,EAAPm5B,IAAeA,EAAOn5B,EAArC,IACMslC,EAAUnmC,yBAAhB,UACA,OAAOkmC,EAASC,EAATD,OAA0BA,EAASC,EAAnCD,SAAP,KAlBF12B,uCAsBA,KAED,YAAU,OAAAC,EAAA,YAmCb,MAAO,CACND,OAjBD,Y,IAA0BjmB,EAAI,OAAE6V,EAAU,aAAEhU,EAAO,UAClD,IAtOA4U,4DAEAA,8CAsOC+5B,MAID/5B,4EAEAwP,EAAOjmB,EAAM6V,EAAboQ,IASAmsB,MAND,WACC37B,wCAMAmhB,UAlCD,cACCnhB,8EAIkB,WAEhB,OADgBA,0BAAhB,MACmByD,EAAZyW,MAAP,OA4BFkH,SAxBD,WACCphB,mFCrRM,OAAoB+K,GAwC5B,SAAgBq7B,GAASxzB,G,IACxBpG,EAAM,SACNI,EAAY,eACZrjB,EAAI,OACJ6V,EAAU,aACVhU,EAAO,UACP0yC,EAAK,QACLtB,EAAQ,WACR/xC,4BAAgB,IAAG,KAGbyX,EAAUmJ,qBAAhB,IACI9B,EAAYrH,eAAO,IAAPA,2BAAhB,UACIoJ,EAAWpJ,eAAO,IAAPA,WAAf,SAGM,EAA8BvF,qBAA7B0pC,EAAU,EAAX,GAAaC,EAAa,EAA1B,GAGAz5B,EAAeJ,iBAArB,IAGMyxB,EAAiBjwC,mBAAQ,WAU9B,OARA,IACC,OAAIsb,EACHsD,mBAEAA,mBAIKA,EAAP,UACE,CAACtD,EAXJ,IAcM,EAAoCgzB,GAApC,GAAEE,EAAc,EAAhB,eAAkB5C,EAAa,EAA/B,cAoCN,OAlCAz8B,qBAAU,WACT,GAAI7T,GAAJ,EAAwB,CACvB,IAAIi1C,EADmB,EAIvB,IACCA,EAAKV,EAAM,CACV9F,IAAKxrB,EADK,QAEVlP,UAAWsP,eAAY,IAAZA,WAFD,QAGVitB,cAHU,EAIV0E,gBAAiBjzB,EAAW,YAAe,OAAAA,EAASizB,GAAT,KAAuC,eAEnF+H,MAID9H,SAAU,CAAEj1C,KAAF,EAAQ6V,WAAR,EAAoBhU,QAApB,EAA6Bme,UAAW20B,OAEjD,CAAC,EAAD,sBAlBH9gC,IAkCO,CAAEq/B,eAAF,EAAkBgC,aAAc4H,GCrGjC,IAAME,GAAY,SAAC,G,IAAEhpB,EAAQ,WAAEne,EAAU,aAAE7V,EAAI,OAC/CijB,EAASC,mBACTG,EAAeH,mBAMbgwB,EAAmB2J,GAAS,CACnC55B,OADmC,EAEnCI,aAFmC,EAGnCrjB,KAHmC,EAInC6V,WAJmC,EAKnChU,QATe6C,mBAAQ,WACvB,MAAO,CAAEyqB,WAAY6E,KACnB,CAFH,IAUCugB,MANmC,GAOnCtB,SAAUQ,KAPHP,eAUR,OACCrrC,YAAC8a,IAAMC,cACLswB,EACDrrC,mBAAKse,IAAKlD,E,UAAgB,aAAalN,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQrO,IAAK0tC,IAC/FxtC,iBAAGse,IAAK9C,EAAcxM,UAAW,aAAahB,QAAb,MAAqCA,SAArC,WAMrCmnC,aAAsB,CACrB7tB,WAAY/mB,IADS,IAErBpI,KAAMoI,IAFe,IAGrByN,WAAYzN,IAAUoe,QAGvB,I,GAAM6uB,GAAa1tC,YAAG,uPCnBf,ICzBDmU,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAD,OAAyBA,IAAvC,SAEa/mB,GAAS,CACrB2R,IADqB,aAErBgB,MAFqB,aAGrBsK,KAHqB,aAIrBC,QCED,SAAiCkH,G,MAAE+Y,EAAa,gBAAEvsB,EAAU,aAAE7V,EAAI,OAAEuC,yBAAa,MAACmW,KAAiBqF,EAAmB,sBAC/G,EAAoC3K,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GAkCN,OAhCApY,qBAAU,W,QAET,GAAK7T,GAASwF,cAAcxF,eAAI,IAAJA,WAA5B,SAGA,QAAS0X,QAAL,EAAA1X,EAAK0X,8BAAL,QAAJ,CAOA,IAAM2qB,EAAY7qB,GAAlB,GAEA6qB,uBAEI,OAAAtkB,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,GAAch8B,QAAX,SAAAi8B,QAAS,IAATA,OAAA,EAAAA,EAAWj8B,2BAAX,SAAzBg8B,IACAC,gBAAuB,cACtBA,6BAGDD,SAAqBC,eAAS,IAATA,WAArBD,MACAC,gBAAuB,YACtBA,4BAIFpW,UAtBCA,EAAiB,CAAEjsB,KAAF,GAAYuD,WAAZ,GAA4B6C,KAA5B,GAAsC2R,OAAtC,GAAkD1R,OAAQ,CAAC,EAAG,OAuB9E,CAACrG,EAAMoiC,EA7BVvuB,KAgCsB7T,QAAf,SAAAqiB,QAAa,IAAbA,OAAA,EAAAA,EAAeriB,2BAAf,UACN,sBAAWA,KAAMqiB,EAAexM,WAAYA,EAAYme,SAAUoO,IAElE,uBACChgB,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD1CfC,SALqB,GAMrBC,MDgB6B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAAEjC,EAAK,QAAEC,EAAK,QAC3F,OACClU,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACDj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPC,MAAOA,EACPnE,MAAO,WACPkG,cAAeA,E,UACP,6BAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPC,MAAOA,EACPnE,MAAO,WACPkG,cAAeA,E,UACP,6BAERjW,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,8BAGVpV,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAAC,WACRnE,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,2CAKZpQ,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,iCAGVtnB,YAACi6B,QACAj6B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,gBACPopB,cAAc,U,UACN,kCAETn5B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,IACd7qB,MAAO,cACPopB,cAAc,c,UACN,sCCjGdllB,MAPqB,GAQrBC,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX41C,WADW,YAEXl0C,QAFW,GAGX8jC,YAAa,QAKjBnS,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GAAwBS,cAGtCwS,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IExBF,SAAgBqhC,GAAQ5zB,G,IAAErpB,EAAI,OAAEkB,wBACvB,QAD0C,IAAG,QAC7Cg8C,gBAAQ,IAAG,GAAX,EAGR,OACCr1C,mBAAKF,IAAKw1C,IACRn9C,EAAA,KAAS,YACT,IAAMo9C,EAAYvlC,KAAlB,SACMwlC,EAAexlC,EAAA,mBAAwB,YAAO,OAAAF,EAAA,WAApD,OACA,OAAIulC,GAAYE,IAAhB,EAEEv1C,mB,UAAa,eAAeF,IAAK21C,GAAY1mC,IAAKiB,EAAM,IACvDhQ,mBAAKC,UAAU,SACdD,wBAAOw1C,GACPx1C,oBAAMC,UAAU,QAAQ,IAAIs1C,IAE7Bv1C,mBAAKC,UAAU,SAAS+P,EAAM,GANhC,WAWAhQ,mB,UAAa,eAAeF,IAAK21C,GAAY1mC,IAAKiB,EAAM,IACvDhQ,mBAAKC,UAAU,SAASu1C,GACxBx1C,mBAAKC,UAAU,SAAS+P,EAAM,GAHhC,eAWJ,I,MAAMslC,GAAYx1C,YAAG,+PAQf21C,GAAa31C,YAAG,ytBCxBf,ICvBM1C,GAAS,CACrB2R,IADqB,UAErBgB,MAFqB,UAGrBsK,KAHqB,KAIrBC,QCKD,SAA+BkH,G,IAAEtL,EAAmB,sBAAElI,EAAU,aAAE7V,EAAI,OAAE6b,EAAsB,yBACvF,EAA0BzI,qBAAzBmqC,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GAGAxgC,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMiG,EAAgB3d,mBAAQ,WAC7B,IAAK1E,IAAD,IAAiCA,EAAKgd,EAA1C,oBAAkF,OAAOugC,EAEzF,IAAM7pB,EAAcxuB,eAAelF,EAAKgd,EAAxC,qBAGA,OADAwgC,KACA,IACE,CAACx9C,EAPJ,IASA,OAAO,sBAASA,KAAMqiB,EAAexM,WAAYA,EAAYkI,oBAAqBA,eAAmB,IAAnBA,IAAuB,MDrBzG0E,SALqB,GAMrBC,MDiB2B,SAAC,G,MAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEC,EAAK,QAAEgC,EAAmB,sBACnF,EAKF+D,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAQApH,EAAQ,GAAiBkB,EAAwBC,EAAzC,QAA2D,SAAAnZ,GAAY,OAAAA,EAAA,QAc/E4nB,EAAiC1oB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,2CAEvC,OACCgG,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACykB,IACA3R,MAAOA,EACP4P,gBAAiBA,EACjBF,SArB0B,SAAC,G,IAEzBkC,EAFkD,WAErC,QAAgB,SAAAvM,GAClC,OAAArF,EAAA,eAIKqH,EAAmBC,WAAWA,eAApC,IACAD,yBACAD,EAASP,KAATO,KAaIyK,aAAc,OAIjB3kB,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAAC6tC,IACA99B,MAAO,kBACP6F,UAAWA,EACXgW,aAAc,WACd1V,oBAAqBA,SC3D1BjC,MAAO,CAAC+G,IAPa,aAQrB9G,MAAO,CAACiQ,IARa,QASrBlJ,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACXysB,UADW,IAEX+d,YAAY,MAKhBnX,2BAA4B,WAC3B,MAAO,CACNupB,UAAU,IAGZ7lC,QAAS,YACR,OAAO,OAAAlV,QAAkB,IAAlBA,OAAA,EAAAA,EAAA,QAAP,IE8EF,IAAMs7C,GAAkB,SAAC5nC,EAAYoO,GACpC,UACC,OACC,SACD,OACC,MAAO,CAAEjO,OAAQH,SAAV,EAAiCE,MAAOF,EAAWE,OAC3D,OACC,MAAO,CAAEC,OAAQH,SAAV,EAAiCE,MAAOF,EAAWE,OAC3D,OACC,MAAO,CAAEC,OAAQH,SAAV,EAAiCE,MAAOF,QAAmB,GACnE,OACA,OACC,MAAO,CAAEG,OAAQH,SAAV,EAAiCE,MAAOF,QAAmB,GACnE,QACC,WAIG6nC,GAAkB,wCAAW,Y,IAAGz5B,EAAK,QAAO,MAAC,CAClD05B,KADkD,WAElDxK,QAFkD,OAGlDyK,oBAAqB,UAAUtS,MAAV,GAH6B,SAIlDuS,iBAAkB,UAAUvS,MAAV,GAJgC,SAKlDwS,cALkD,OAMlDC,WANkD,OAOlDnU,SAPkD,SAQlDoU,QAAS,UARc,IAWlB1S,GAAQ,SAACrnB,GACd,UACC,OACC,MAAO,CAAC,EAAR,GACD,OACC,MAAO,CAAC,EAAR,GACD,OACC,MAAO,CAAC,EAAR,GACD,OACC,MAAO,CAAC,EAAR,GACD,OACA,OACC,MAAO,CAAC,EAAR,GACD,QACC,MAAO,CAAC,EAAR,KCjJGnI,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,cAErBgB,MAFqB,cAGrBsK,KAHqB,iBAIrBC,QDUD,SAAkCkH,G,IACjC+Y,EAAa,gBACbvsB,EAAU,aACV7V,EAAI,OACJkB,yBAAa,MAACwX,KACdmD,EAAsB,yBACtBiC,EAAa,gBACbC,EAAmB,sBAGbf,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMiG,EAAgB3d,mBAAQ,W,MAC7B,IAAK1E,eAAI,IAAJA,WAAD,cAAyD6B,QAAhB,EAACic,eAAa,IAAbA,WAAejc,8BAA7D,eAEA,IAAM8Y,EAAQ3a,WAAd,GAGA,OAAI2a,SAAoB,MAAO,GAE/B,IAAM0nB,EAAY1nB,EAAA,KAAU,YAC3B,MAAO,CACN/D,IAAKiB,EADC,IAENH,QAASG,EAAA,cAAmB,Y,IAAGjB,EAAG,MAAEqN,EAAK,QACxC,MAAO,CACNngB,KADM,EAEN2R,MAH8C,QAI9C6sB,UAAWre,UAuBf,OAjBI,OAAAlG,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,EAAGpiC,kBAAzBoiC,IACAC,WAAkB,YACjBxqB,mBAAsB,YACrBP,aAAetX,kBAAqBsX,EAApCA,cAIF8qB,SAAqBpiC,OAArBoiC,IACAC,WAAkB,YACjBxqB,mBAAsB,YACrBP,aAAeA,EAAfA,YAMH,KACE,CAACtX,EAAD,QAAeA,EAAf,WAvCH,IA0CA,OAAKqiB,GAAiBA,UAAtB,EAEExa,YAACo2C,KACA77B,MAAM,gBACNF,KAAK,eACLK,YAAaC,IAKf3a,YAAC61C,IAAgBz5B,MAAO5B,EAAconB,QACpCpnB,EAAA,KAAkB,YAClB,OACCxa,YAACksB,IACAnd,IAAKiB,EAAMjB,IACX5W,KAAM6X,EAAMH,QACZwf,YAAarf,EAAMjB,IACnB4rB,oBAAqBib,GACpB,CAAEznC,OAAF,GAAUH,SAAyBE,MAA0B,GAAnBF,SAC1CwM,EAFmC,QAIpCtE,oBAAqBA,EACrBiW,SAAUoO,SCvFf3f,SALqB,GAMrBC,MCe8B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEiC,EAAmB,sBACrF,OACClW,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAM,cACNkG,cAAeA,E,UACP,gCAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAM,cACNkG,cAAeA,E,UACP,iCAGVjW,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,8BAGVpV,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,2CAKZpQ,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,aACPopB,cAAc,Y,UACN,gCAGVn5B,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,sCDxFdrT,MAPqB,GAQrBgH,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX0B,QADW,EAEXm0C,SAAU,OAKdxiB,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GAAwBS,cAGtCwS,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IE7BIsiC,GAAe,GAMfnO,GAAS,CACdpM,IADc,EAEdC,MAFc,GAGdC,OAHc,EAIdC,KAAM,GARC,IAgBKqa,GAAY,SAAC1P,GACzB,IAAI+B,GAAJ,EAGMC,EAASh6B,cACTi6B,EAAQj6B,wBAAd,MAGM6b,EAAS7b,sBAAf,KACMm6B,EAAQn6B,YAAd,GAEM2nC,EAAe,OAAA3nC,EAAA,WAEbA,YAFa,QAGjB,YAAO,OAAA6b,EAAOhb,EAAPlB,MAHU,GAIjB,YAAO,OAAAq6B,EAAOn5B,EAAPhB,MAEL+nC,EAAkB,SAAC3mC,GACxB,IAAI2O,EAAJ,EACA3O,WAAgB,YACXG,SAAJ,IAC+BwO,EAA1BxO,SAxCR,MAyCeA,EAANwO,WAGP,IAAIi4B,EAAaj4B,MAAY63B,GAC7BnO,UAAgBuO,EAAaC,KAAkBA,KAA/CxO,GAsND,MAAO,CACN9pB,OAbD,gBACC,KAvMD,gB,IAAgB5f,EAAM,SAAEm4C,EAAU,aAAMxoC,EAAM,SAAED,EAAK,QAAKhU,sBAAU,MAAC,UACpEs8C,KAGA5nC,mDAGAg6B,SAAc,CAAC,EAAGgO,GAAcp4C,EAAhCoqC,YAAmD,CAACz6B,EAAS+5B,GAAV,OAAyBA,GAA5EU,MACAne,kBAAgC,CAACyd,GAAD,KAAch6B,EAAQg6B,GAAtDzd,QAGA7b,gEAGoB,aAAas5B,GAAb,KAHpBt5B,gBAIY,EAAIs5B,GAJhBt5B,gBAQAA,6GAKY,EAAIT,EAAJ,EALZS,4EAYAA,gEAGoB,eAAeg6B,EAAf,GAHpBh6B,aAOAA,+JASAA,oDAyJCs6B,CAAK/wC,EAAM6V,EAAXk7B,GACAP,MAvJF,gB,IAAkBgO,EAAU,aAAEE,EAAK,QAAEr4C,EAAM,SAAE2qC,EAAgB,mBAAMh7B,EAAM,SAAED,EAAK,QAAEqe,EAAU,aAAMjF,EAAU,aAC3GkvB,KACA,IAAMlN,EAAU,OAAH,IAAG,CAAH,GAAb,IAGA,GACCA,SACAA,SAFc,GAKdA,OAAepB,GAAfoB,KAKDV,SAAc,CAAC,EAAGgO,GAAcp4C,EAAhCoqC,YAAmD,CAACz6B,EAASm7B,EAAV,OAA0BA,EAA7EV,MACAne,kBAAgC,CAAC6e,EAAD,KAAep7B,EAAQo7B,EAAvD7e,QAEAse,cAAiB,cAAU,OA+LDxqB,EA/LakM,WAAD,GA+LPjM,EA/L4B8qB,EAAhC,OAgM5B7qB,EAAMA,GAANA,MACsB,kBAARF,GAAoBA,SAAaC,EAAMC,EAA9C,OAA2DF,iBAA3D,EAAP,EAFD,IAA4BA,EAAKC,EAAKC,KA5LpC7P,kDAEoB,aAAa06B,EAAb,KAFpB16B,iDAQAA,kDAEoB,eAAeg6B,EAAf,GAFpBh6B,mKAYAA,8CAEY,EAAIT,EAAJ,EAFZS,IAKAA,2CACAA,6FAIoB,aAAa06B,EAAb,KAJpB16B,aAMEA,yBAEYV,EAAQo7B,EAAT,MAAyBA,EAFpC16B,iBANFA,KAaAA,2DAGOvR,eAHPuR,IAG8B,YAAO,OAAAa,EAAA,MAHrCb,mFAOkB,YAAO,OAAA0Y,EAAW6hB,EAAiB15B,EAA5B,QAPzBb,UAQY,YACV,OAAO2nC,EAAa9mC,EAApB,OAIFb,+DAGOvR,eAHPuR,IAG8B,YAAO,OAAAa,EAAA,MAHrCb,MAKE,YAAW,OAAAuP,EAAA,oCACX,YAAY,OAAAC,KACZ,YAAU,OAAAC,EAAA,YAPZzP,0BAUO,YACL,OAAOa,EAAA,QAAS,YACf,kCACI4C,IACHtC,MAAON,EAAE,WAdbb,MAmBE,YACC,OAAAuP,EAAA,wGAMe,YAAO,OAAAmJ,EAAW6hB,EAAiB15B,EAA5B,WANtB,WAOa,YAAO,OAAAgb,EAAOhb,EAAPlB,MAPpB,WAQa,YAAO,OAAAq6B,EAAOn5B,EAAPhB,SACrB,YACC,OAAA2P,EAAA,aACe,YAAO,OAAAkJ,EAAW6hB,EAAiB15B,EAA5B,WADtB,WAEa,YAAO,OAAAgb,EAAOhb,EAAPlB,MAFpB,8BAIa,YAAO,OAAAq6B,EAAOn5B,EAAPhB,SACrB,YAAU,OAAA4P,EAAA,YAGZzP,sEAEmB2d,EAAa,OAFhC3d,MA0CAwP,CAAOjmB,EAAM6V,EAAboQ,IASAmsB,MAND,WACC37B,wCAMAmhB,UA/CD,YACCnhB,oFAImB,YACjB,OAAOa,WAPV,OASCb,4GAKmB,YACjB,OAAOa,EAAC,QAADA,IAfV,QAiDCugB,SA9BD,WACCphB,sFAKAA,iHAoCF,SAAgBgoC,GAAc/nC,GAC7B,IAAMioC,EAoBP,SAAsBr6B,GACrB,IAAMs6B,EAAQvoC,WAAWA,YAAcA,KAAdA,KAAzB,MACA,OAAOA,YAAP,GAtBkBuoC,CAAlB,GAEA,OAAID,EACH,UACM,GAAIjoC,EAAJ,GACN,OAAOA,QAAcA,EAAdA,EAAsBA,EAA7B,EACM,GAAIioC,QAAJ,MAAwBA,EAC9B,OAAOE,YAAKnoC,GAAZ,GAGD,IAAMooC,EAASH,aAAf,OACA,OAAOE,YAAKnoC,IAAKooC,EAAjB,ICzRM,IAAMC,GAAoB,SAAC,G,IAAC97B,EAAM,SAE/B,EAAiC7P,qBAAhC6mC,EAAY,EAAb,GAAcM,EAAe,EAA7B,GAEN1mC,qBAAU,WACN0mC,GAAgB,WAAI,kBAChB,OAAOrhC,YAAO+J,EAAP/J,8DAAP,gBAKN,CAPFrF,IAqCA,OAAOmmC,GAAqB,GA5BP,SAAC1iC,GAElB,IAAM0nC,EAAiBC,YAAvB,MAKA,MAHA,kBAAU3nC,EAAP,IAAyBA,IAAM0nC,EAAe1nC,EAArBA,IAC5B,kBAAUA,EAAP,IAAyBA,IAAM0nC,EAAe1nC,EAArBA,IAErB,sBACH8K,MAAO9K,SAAW,QAClBuW,QAAS,CACLqxB,EAAE5nC,EADG,EAEL6nC,EAAE7nC,EAAEhB,OAIO,CACzBiX,UADyB,MAExBxT,UAAW,CACX,CACCjW,KADD,SAECjC,QAAS,CACR+4C,OAAQ,CAAC,EAAG,SC1BJwE,GAAkB,SAAC,G,IAAEprB,EAAQ,WAAEne,EAAU,aAAE7V,EAAI,OAAEm3C,EAAU,aAAE/iB,EAAU,aAAEirB,EAAU,aACzFp8B,EAASC,mBACT,EAAoB9P,qBAAnBksC,EAAK,EAAN,GAAQ9K,EAAQ,EAAhB,GAEA,EAAmD/U,KAAzCqU,EAAgB,EAA1B,SAAkCC,EAAa,EAA/C,MAGA,EAAiC3gC,mBAAjC,GAAC2hB,EAAY,EAAb,GAAcif,EAAe,EAA7B,GA4DN,OA3DAngC,qBAAU,WACT,GAAGkgC,eAAa,IAAbA,WAAH,OAA0B,CACzB,IAAIE,EAAgB,OAAH,IAAG,CAAH,GAAOj0C,EAAxB,OACAkF,eAAe6uC,SAAf7uC,oBAAuD,Y,IAAE0R,EAAG,KAAU,OACtDq9B,YAIhB,IAAMC,EAAkB,OAAH,IAAG,CAAH,eACjBl0C,IACHu/C,SAASv/C,EAAA,iBACR,YAAK,OAAA+zC,EAAA,uBAENh8B,OAAO/X,EAAA,eACN,YAAK,OAAA+zC,EAAA,iBAA+B5W,EAA/B,QAENuhB,MAAOzK,IAERD,QAEA,CAACD,eAAa,IAAbA,WAAD,OApBFlgC,IAsBAA,qBAAU,WAQT,GAAIkhB,MAAJ,EAA4C,CAC3C,IAAIkgB,EADuC,EAI3C,IACCA,EARMkJ,GAAUl7B,EAAjB,SASCuxB,MAGDS,WAAwB,CAAEl/B,MAAOF,EAAT,MAA4BG,OAAQH,EAApC,OAAuDue,WAAU,GACrF,CAAEjF,WAAF,EAAwBgoB,WAAWA,OAEtC,CAACmI,EAAOvqB,EAAclf,EAAYme,EAAUI,EApB/CvgB,IAuBAA,qBAAU,WACT,GACCigC,EAAiB,CAChB/uC,KADgB,YAEhB8Z,QAAS,CACRzY,KAAKi5C,GAA0Br/C,EAAA,YAAgB,SAAAm9B,GAAG,OAAAA,EAAA,OAClDhO,WAFQ,EAGRyI,UAAU0nB,EAHF,UAIRznB,SAASynB,EAAMznB,cAIjB,CAAC73B,EAAD,WAZF6T,IAeChM,mBAAKF,IAAK63C,IACT33C,mB,UACS,kBACRkO,MAAOF,EAAWE,MAClBC,OAAQH,EAAWG,OACnBrO,IAAK0tC,IAELxtC,iBAAGse,IAAKlD,KAETpb,YAACk3C,IAAkB97B,OAAQA,MAK9Bm8B,aAA4B,CAC3BjwB,WAAY/mB,IADe,IAE3BpI,KAAMoI,IAFqB,IAG3ByN,WAAYzN,IAAUoe,QAGvB,I,MAAMg5B,GAAsB73C,YAAG,+KAMzB0tC,GAAa1tC,YAAG,uPChFf,ICzBDmU,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAD,OAAyBA,IAAvC,SAEa/mB,GAAS,CACrB2R,IADqB,aAErBgB,MAFqB,qBAGrBsK,KAHqB,sBAIrBC,QCKD,SAAiCkH,G,MAAE+Y,EAAa,gBAAEvsB,EAAU,aAAE7V,EAAI,OAAE+d,EAAmB,sBAAExb,yBAAa,MAACmW,KAChG,EAAoCtF,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GACA,EAAoBwT,KAAnB1d,EAAQ,EAAT,SAAW8a,EAAK,EAAhB,MACAzI,EAAayI,eAAK,IAALA,WAAnB,WA4EA,OA3EAhpB,qBAAU,W,QAET,GAAK7T,GAASwF,cAAcxF,eAAI,IAAJA,WAA5B,UAMA,QAAS0X,QAAL,EAAA1X,EAAK0X,8BAAL,QAGH,OAFAqK,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,SAClEoN,EAAiB,CAAEjsB,KAAF,GAAYuD,WAAY,KAI1Cwe,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,IAGlE,IAAM4gC,GAAez/C,aAArB,SAEMqiC,EAAY,CACjBkd,SADiB,GAEjBf,WAFiB,GAGjBE,MAHiB,GAIjBr4C,OAAQ,CAAC,EAJQ,GAKjB0R,OALiB,KAMjBi5B,iBAAkB,IAGnB,GAGC3O,gBAAwB,CAAxBA,YACAA,gBAA6BriC,EAAA,aAAiB,YAG7C,OAFAqiC,kBAA0B1qB,EAA1B0qB,KACAA,YAAsBhsB,SAASgsB,SAAThsB,GAA8BsB,EAApD0qB,OACO,CAAEjsB,EAAGuB,EAAL,IAAYrB,EAAGqB,EAAElC,UAEzB4sB,gBAA6BA,EAAA,oBAAgC,cAAU,cAAA5rB,EAAA,GAAakiC,EAAb,EAAkBD,EAAlB,QAGvErW,WAAqBriC,EAAA,aAAiB,YAAO,OAAA2X,EAAA,OAC7C3X,mBAAqB,YACpBqiC,QAAgBxqB,EAAhBwqB,KAA6BxqB,EAAA,cAAmB,YAG/C,OAFAwqB,YAAsBhsB,SAASgsB,SAAThsB,GAA8BsB,EAApD0qB,OACAA,kBAA0B1qB,EAA1B0qB,KACO,CAAEjsB,EAAGuB,EAAL,IAAYrB,EAAGqB,EAAElC,UAErBzV,EAAJ,SACCqiC,QAAgBxqB,EAAhBwqB,KAA6BA,EAAA,MAAgBxqB,EAAhB,WAAgC,cAAU,cAAApB,EAAA,GAAakiC,EAAb,EAAkBD,EAAlB,WAK1ErW,aAAuBriC,SAAa0/C,YAAKrd,EAAlBriC,YAA0C0/C,YAAKrd,EAALqd,YAAjErd,OACAA,SAAmBA,EAAA,cAAuB,YACzC,MAAO,CAAEzrB,IAAKumB,MAGfkF,uBACI,OAAAtkB,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,GAAcmd,QAAX,SAAAld,QAAS,IAATA,OAAA,EAAAA,EAAWkd,+BAAX,SAAzBnd,IACAC,oBAA2B,cAC1BA,6BAGDD,SAAqBC,eAAS,IAATA,WAArBD,UACAC,oBAA2B,YAC1BA,4BAIFpW,UApEClK,GAAYA,EAAS,CAAEhd,KAAF,2BAAoC8Z,SAAS,MAqEjE,CAAC7e,EAAMoiC,EAxEVvuB,KA2EsB0rC,QAAf,SAAAl9B,QAAa,IAAbA,OAAA,EAAAA,EAAek9B,+BAAf,UACN,sBAAiBv/C,KAAMqiB,EAClBxM,WAAYA,EACZme,SAAUoO,EACVhO,WAAYA,EACZ+iB,WAAYp5B,EAAoBo5B,WAChCkI,WAAYthC,+BAAmDA,EAAnDA,gBAAoFsd,IAGrG,uBACCjZ,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD/FfC,SALqB,GAMrBC,MDgB6B,SAAC,G,IAACjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAAEjC,EAAK,QAAEC,EAAK,QAC1F,OACClU,YAACskB,SACAtkB,YAACukB,KAAIxE,GAAG,OAAOxF,MAAM,OAAOiK,MAC3BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPC,MAAOA,EACPnE,MAAO,gBACPkG,cAAeA,E,UACP,6BAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPC,MAAOA,EACPnE,MAAO,SACPkG,cAAeA,E,UACP,6BAETjW,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,mBACb3X,MAAO,CAAC+G,IAAD,aACP9G,MAAO,CAACiQ,IAAD,QACPpU,MAAM,oBACNqF,YAAY,E,UACJ,8BAGVpV,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,gCAETpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,G,UAChC,2CAKZpQ,YAACukB,KAAIxE,GAAG,QAAQxF,MAAM,QAAQiK,MAC7BxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,gCAETtnB,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,gBACPopB,cAAc,U,UACN,wCCvFdllB,MAPqB,GAQrBC,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX41C,WADW,YAEXl0C,QAFW,GAGX8jC,YAAa,QAKjBnS,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GAAwBS,cAGtCwS,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IErCK,ICAM+jC,GAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAnE,WCoCDC,GAAatgD,wBAAwC,CAAC,GAA5D,KAKaugD,GAAc,SAAC92B,GACrB,MAAgB3V,qBAAfkP,EAAG,EAAJ,GAAMw9B,EAAM,EAAZ,GACAC,EAAS78B,mBACT,EAAkB9P,qBAAjBpT,EAAI,EAAL,GAAOggD,EAAO,EAAd,GACA,EAAwB5sC,qBAAvBsT,EAAO,EAAR,GAAUu5B,EAAU,EAApB,GACA,EAAgC7sC,oBAAhC,GAAC8sC,EAAW,EAAZ,GAAcC,EAAc,EAA5B,GACA,EAAwD/sC,mBAAxD,iBAACgtC,EAAuB,EAAxB,GAA0BC,EAA0B,EAApD,GACA,E,SC9CwBh3B,G,IAAErpB,EAAI,OAAE2C,EAAQ,WACxC,EAAgByQ,wBAAhB,GAACktC,EAAG,EAAJ,GAAMC,EAAM,EAAZ,GAeN,OAbA1sC,qBAAU,W,MACT,GACC0sC,KAED,IAAIC,OAAJ,EACA,iBAAAxgD,QAAI,IAAJA,OAAA,EAAAA,EAAA,yBAAgBygD,SAAQ,YACvB,IAAMhrC,EAAQirC,aAAd,SACA,IAAIF,GACK/qC,EAAJ,KADkB+qC,EAAvB,MAGDD,OACE,CAACvgD,EAXJ6T,IAaO,CAAC,CAAEysC,IAAG,GAAI,CAAEC,OAAM,ID8BKI,CAAO,CAAE3gD,KAAF,EAAiB2C,SF9ChD,8BE8CG29C,EAAG,KAAN,IAAYC,EAAM,KAAlB,OACA,E,SE/CwBl3B,G,IAAErpB,EAAI,OAAE2C,EAAQ,WACxC,EAAgByQ,wBAAhB,GAACiT,EAAG,EAAJ,GAAMu6B,EAAM,EAAZ,GAgBN,OAdA/sC,qBAAU,W,MACT,GACC+sC,KAED,IAAIJ,OAAJ,EACA,iBAAAxgD,QAAI,IAAJA,OAAA,EAAAA,EAAA,yBAAgBygD,SAAQ,YACvB,IAAMhrC,EAAQirC,aAAd,SACA,IAAIF,GACK/qC,EAAJ,KADkB+qC,EAAvB,OAGGjpC,UAAcipC,GAAlB,KAA4BA,KAC5BI,OACE,CAAC5gD,EAZJ6T,IAcO,CAAC,CAAEwS,IAAG,GAAI,CAAEu6B,OAAM,IF8BKC,CAAO,CAAE7gD,KAAF,EAAiB2C,SF/ChD,8BE+CG0jB,EAAG,KAAN,IAAYu6B,EAAM,KAAlB,OACA,EAAsCxtC,wBAAtC,GAAC0tC,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GACA,EAAsC3tC,wBAAtC,GAAC4tC,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GACA,EAA4B7tC,mBAA5B,IAAC8tC,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACA,EAA0C/tC,mBAA1C,IAACguC,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GAENxtC,qBAAU,WACT,IAAIytC,EAAaj7B,EAAjB,GACIi7B,KAAkB/pC,MAAlB+pC,IAAgC/pC,MAApC,MAAgD+pC,KAGhD,IAFA,IAAMC,EAAOlrC,UAAUirC,EAAvB,GACId,EAAJ,GACS9pC,EAAT,EAAgBA,EAAhB,EAAuBA,IAAK,CAC3B,IAAM8qC,EAAQD,IAAd,EACMlvB,EAAWmvB,IAAjB,EACAhB,OAAS,CAAEnuB,SAAF,EAAsBovB,SAAtB,EAAuCjrC,MAAOmpC,GAAcjpC,KAEtE8pC,EAAMA,EAAA,MAAS,cACd,OAAI7H,WAAaD,EAAjB,WACSC,WAAaD,EAAjB,YACO,KAEbyI,OACE,CAACb,EAhBJzsC,IAkBAA,qBAAU,WASTwtC,EARwB,CACvB,CAAEI,SAAF,EAAiBpvB,SAAjB,EAAgC7b,MAAOmpC,GAAc,IACrD,CAAE8B,SAAUp7B,EAAZ,EAAqBgM,SAArB,EAA+BhM,EAAS7P,MAAOmpC,GAAc,IAC7D,CAAE8B,SAAUp7B,IAAZ,EAAyBgM,SAAzB,EAAmChM,EAAS7P,MAAOmpC,GAAc,IACjE,CAAE8B,SAAUp7B,IAAZ,EAAyBgM,SAAzB,EAAmChM,EAAS7P,MAAOmpC,GAAc,IACjE,CAAE8B,SAAUp7B,IAAZ,EAAyBgM,SAAzB,GAAmChM,EAAU7P,MAAOmpC,GAAc,IAClE,CAAE8B,SAAUp7B,KAAZ,EAA0BgM,SAA1B,IAA8C7b,MAAOmpC,GAAc,QAGlE,CAACW,EAVJzsC,IAYA,IAAM4B,EAAkC,CACvC,CACC6M,IADD,EAECy9B,OAFD,EAGCr5B,QAHD,EAICw5B,YAJD,EAKCE,wBALD,EAMCE,IAND,EAOCj6B,IAPD,EAQCy6B,eARD,EASCE,eATD,EAUCE,UAVD,EAWCE,iBAXD,EAYCphD,KAAI,GAEL,CACC8/C,OADD,EAECG,WAFD,EAGCE,eAHD,EAICE,2BAJD,EAKCE,OALD,EAMCK,OAND,EAOCG,kBAPD,EAQCE,kBARD,EASCE,aATD,EAUCE,oBAVD,EAWCrB,QAAO,IAIT,OAAO,kBAACJ,GAAD,sBAAqBnqC,MAAOA,GAAnC,KAGYisC,GAAgB,WAC5B,IAAM/oC,EAAUmJ,qBAAhB,IACA,MACC,MAAM,IAAIpb,MAAV,mDAED,UG3HM,IAAMi7C,GAA2B,CACvC58C,KADuC,oBAEvC68C,SAAU,ICFJ,IAAMC,GAAc,cAAdA,GAAc,iBAAdA,GAAc,gBAAdA,GAAc,mBAAdA,GAAc,yBAAdA,GAAc,2B,SCGHC,GAAaz4B,G,IAAE04B,EAAS,YACxC,EAAwBL,KAAxB,GAAEp/B,EAAG,EAAL,IAAO49B,EAAW,EAAlB,YAEPrsC,qBAAU,WACT,MACcyO,WAAd,GACA,CACA,IAAM0/B,EAAa9B,EAAc,UAAjC,OACA59B,yCACE,CAAC49B,EAAa59B,EANjBzO,ICHM,IAAMouC,GAA+B,CAE3CJ,GACAA,GAEAA,GAEAA,I,SCRuBK,GAA8B74B,G,IAAE04B,EAAS,YAC1Dt+C,EAAQw+C,WAAd,GACA,OAAOA,GAA6Bx+C,EAApC,G,SCAuB0+C,GAAiB94B,G,IAAE04B,EAAS,YAAEK,EAAU,aACxD,EAA2CV,KAA3C,GAAEp/B,EAAG,EAAL,IAAOw+B,EAAc,EAArB,eAAuBE,EAAc,EAArC,eAEPntC,qBAAU,WACT,IACeyO,YAAf,IAEcA,WAAd,KAEIw+B,GAAJ,GACCx+B,2CACAA,oDAEAA,sCVbI,GUcJA,qDAEC,CAACA,EAAKw+B,EAAgBE,EAAgBe,EAbzCluC,ICPM,ICWDwuC,GAAaR,G,SCLKS,GAAiBj5B,G,IAAE04B,EAAS,YAAEK,EAAU,aACxD,EAA6BV,KAA7B,GAAEp/B,EAAG,EAAL,IAAO8+B,EAAgB,EAAvB,iBAEDmB,EAAkB79C,mBAAQ,WAM/B,OALY,qBAA2B,cACtC,OAAIi0C,WAAaD,EAAjB,YACSC,WAAaD,EAAjB,WACO,OAGX,CAPH,IAUA7kC,qBAAU,WACT,IACeyO,YAAf,IAEcA,WAAd,IAEAA,qCAAiD,CAAC,OAEjD,CAAC,MbxBG,uCWHA,EE6BJigC,KAJgD,SAKhDC,GACAD,KANgD,SAOhDC,GACAD,KARgD,SAShDC,GACAD,KAVgD,SAWhDC,GACAD,KAZgD,SAahDC,QAEC,CAAClgC,EAAK8/B,EAAYL,EArBrBluC,I,SCduB4uC,GAAgBp5B,G,IAAE04B,EAAS,YAAEK,EAAU,aACvD,EAAoDV,KAApD,GAAEp/B,EAAG,EAAL,IAAOg+B,EAAG,EAAV,IAAYj6B,EAAG,EAAf,IAAiB65B,EAAW,EAA5B,YAA8BkB,EAAgB,EAA9C,iBAEDmB,EAAkB79C,mBAAQ,WAM/B,OALY,qBAA2B,cACtC,OAAIi0C,WAAaD,EAAjB,YACSC,WAAaD,EAAjB,WACO,OAGX,CAPH,IAUA7kC,qBAAU,W,gBACT,IACeyO,YAAf,IAEcA,WAAd,IAEAA,oCAAgD,CAAC,OAEhD,CAAC,MdvBG,uCcwBe9L,QAH4B,EAG/C+rC,KAAmB/rC,qBAH4B,OAI/C+rC,KAJ+C,SAK5B/rC,QAL4B,EAK/C+rC,KAAmB/rC,qBAL4B,OAM/C+rC,KAN+C,SAO5B/rC,QAP4B,EAO/C+rC,KAAmB/rC,qBAP4B,OAQ/C+rC,KAR+C,SAS5B/rC,QAT4B,EAS/C+rC,KAAmB/rC,qBAT4B,OAU/C+rC,KAV+C,SAW5B/rC,QAX4B,EAW/C+rC,KAAmB/rC,qBAX4B,OAY/C+rC,KAZ+C,SAa5B/rC,QAb4B,EAa/C+rC,KAAmB/rC,qBAbpB8L,YAeE,CAACA,EAAKg+B,EAAKj6B,EAAK+7B,EAAYL,EAAW7B,EArB1CrsC,ICPD,IAAMwuC,GAAaR,G,SCRKC,GAAaz4B,G,IAAE04B,EAAS,YACxC,EAAwBL,KAAxB,GAAEp/B,EAAG,EAAL,IAAO49B,EAAW,EAAlB,YAEPrsC,qBAAU,WACT,MACcyO,WAAd,GACA,CACA,IAAM0/B,EAAa9B,EAAc,OAAjC,UACA59B,yCACE,CAAC49B,EAAa59B,EANjBzO,I,SCAuB6uC,GAAer5B,G,IAAE04B,EAAS,YAAEK,EAAU,aACtD,EAA+CV,KAA/C,GAAEp/B,EAAG,EAAL,IAAO4+B,EAAS,EAAhB,UAAkBd,EAAuB,EAAzC,wBAEDmC,EAAkB79C,mBAAQ,WAM/B,OALY,qBAAoB,cAC/B,OAAIi0C,WAAaD,EAAjB,YACSC,WAAaD,EAAjB,WACO,OAGX,CAPH,IAUA7kC,qBAAU,W,gBACT,IACeyO,YAAf,IAEcA,WAAd,KAEA,EAIAA,oCAAgD,CAAC,OAEhD,CAAC,MjB7BG,6BiB8Be9L,QAH4B,EAG/C+rC,KAAmB/rC,qBAH4B,QAI/C+rC,KAJ+C,SAK5B/rC,QAL4B,EAK/C+rC,KAAmB/rC,qBAL4B,QAM/C+rC,KAN+C,SAO5B/rC,QAP4B,EAO/C+rC,KAAmB/rC,qBAP4B,QAQ/C+rC,KAR+C,SAS5B/rC,QAT4B,EAS/C+rC,KAAmB/rC,qBAT4B,QAU/C+rC,KAV+C,SAW5B/rC,QAX4B,EAW/C+rC,KAAmB/rC,qBAX4B,QAY/C+rC,KAZ+C,SAa5B/rC,QAb4B,EAa/C+rC,KAAmB/rC,qBAbpB8L,UAHCA,oChBzBI,egB2CH,CAACA,EAAKigC,EAAiBR,EAAWK,EAzBrCvuC,I,SCduB8uC,GAAgBt5B,G,IAAE04B,EAAS,YAAEK,EAAU,aACvD,EAA8CV,KAA9C,GAAEp/B,EAAG,EAAL,IAAOg+B,EAAG,EAAV,IAAYj6B,EAAG,EAAf,IAAiB+5B,EAAuB,EAAxC,wBAGPvsC,qBAAU,WACT,IACeyO,YAAf,IAEcA,WAAd,KAEI/K,UAAcA,MAAdA,IAA4B+oC,GAA5B/oC,QAAJ,IAA8C6oC,EAC7C99B,qCPhBI,GOmBLA,qCAAiD,CAAC,cAEjD,CAFgD,UAGhD,CAAC,MlBpBG,6BkBiB4C,EPnB5C,EOmB4C,EPjBlBkgC,SO0B7B,CAAClgC,EAAKg+B,EAAKj6B,EAAK07B,EAAWK,EAnB9BvuC,ICPM,IAAM+uC,GAA+B,CAE3Cf,GACAA,I,SCHuBgB,GAA8Bx5B,G,IAAE04B,EAAS,YAC1Dt+C,EAAQm/C,WAAd,GACA,OAAOA,GAA6Bn/C,EAApC,GCSD,IAAM4+C,GAAaR,G,SCRKiB,GAAcz5B,G,IAAE04B,EAAS,YAAEK,EAAU,aACtD,EAAgDV,KAA/Cn/C,IAAD,GAAG+f,EAAG,EAAN,IAAQ49B,EAAW,EAAnB,YAAyBa,EAAiB,KAA1C,kBAENltC,qBAAU,WACT,OACeyO,YAAf,IAEcA,WAAd,IACA,CACA,IAAMygC,EAAc,SAACprC,GACpB,IAAMiqC,EAAWt/B,EAAA,sBAA0B3K,EAA1B,MAAmC,CAAEqrC,OAAQ,CAACjB,KAC3DkB,OAAJ,EACIC,OAAJ,EACMC,EAAcC,iBAAW,CAACzrC,SAAD,IAAeA,SAA9C,MACAiqC,WAAiB,YAChB,IAAMyB,EAAQD,iBAAW1C,WAAzB,aACM4C,EAAWF,sBAAjB,SACIH,OAA6BK,EAAjC,KACCL,IACAC,QAGFnC,MAID,MtB/BK,esB6BDqB,GAAJ,GAAmD9/B,oBtB5B9C,yBsB6BD8/B,GAAJ,GAA0D9/B,oBACnD,WACNA,yBAEC,CAACA,EAAK49B,EAAa6B,EAAWhB,EA1BjCltC,I,SCLuB0vC,GAAgBl6B,G,IAAE04B,EAAS,YAAEK,EAAU,aACvD,EAA2BV,KAA3B,GAAEp/B,EAAG,EAAL,IAAOw+B,EAAc,EAArB,eAEPjtC,qBAAU,W,QACT,IACeyO,YAAf,IAEcA,WAAd,KAEAA,sCAAkD,CAAC,QAAS,CAAV,MAAkCsF,QAAlC,EAAkBk5B,eAAc,IAAdA,WAAgBl5B,mBAAlC,IAAlDtF,IACAA,6CAAyD,CAAC,QAAS,CAAV,MAAkCsF,QAAlC,EAAkBk5B,eAAc,IAAdA,WAAgBl5B,mBAAlC,IAAzDtF,QACE,CAACA,EAAKw+B,EAAgBiB,EARzBluC,ICQD,IAAMwuC,GAAaR,G,SCNK2B,GAAMn6B,G,IAAEo6B,EAAK,QAAEC,EAAU,aAChD,OAAO,sBAASD,MAAOA,EAAOC,WAAYA,IAG3C,I,GAAMC,GAAU,8GAAU,oBAC6C,sBACC,UADxD,YAAmB,OAAC56B,aAAmBA,EAAnBA,MAAD,KAClB,YAAmB,OAACA,eAAuBA,EAAxB,S,SCPZ66B,GAAKv6B,G,IAAEq6B,EAAU,aACxC,OAAO,sBAASA,WAAYA,IAG7B,I,GAAMC,GAAU,uHAAU,mBACC,gBACsC,eACD,SAFjDr7C,IADC,OAEL,YAAmB,OAACygB,oBAAD,SACpB,YAAmB,OAACA,mBAAD,U,SCPL86B,K,cAChB,EAA+CnC,KAA/C,GAAEZ,EAAc,EAAhB,eAAkBV,EAAuB,EAAzC,wBAEP,SAEC,0BACCz9B,0BADD,SAEC,sBAAO8gC,MAAO,MAAOC,YAAY,IACjC,sBAAMA,YAAY,IAClB,sBAAOD,MAAO,MAAOC,YAAY,IAChCtD,GACAz9B,0BACCA,4BADDA,KAECA,0BAAwBpf,QAAxBof,EAAQm+B,eAAc,IAAdA,WAAgBv9C,iCAR3B,KAWCof,0BACCA,0BADDA,aAECA,0BAAkCu5B,QAAlCv5B,EAAwBmhC,QAAxBnhC,EAAQm+B,eAAc,IAAdA,WAAgBgD,+BAAU5H,kCAbpC,KAeCv5B,0BACCA,0BADDA,cAECA,0BAAkCu5B,QAAlCv5B,EAAwBmhC,QAAxBnhC,EAAQm+B,eAAc,IAAdA,WAAgBgD,+BAAU5H,kCAlBrC,MAD4B,KAyB7B,I,eAAMyH,GAAU,+KAAU,2GAMC,SAAZr7C,IANf,OASMy7C,GAAM,qFAAU,2BAIhB7wC,GAAQ,sMAAU,4IAQlB8wC,GAAW,kMAAU,wIASrBC,GAAQ,4KAAU,kHCrDlB5B,GAAaR,GCFnB,IAAMQ,GAAaR,GAEnB,SAAwBqC,KAChB,MAAwCxC,KAAxC,GAAEp/B,EAAG,EAAL,IAAO49B,EAAW,EAAlB,YAAoBc,EAAc,EAAlC,eAEPntC,qBAAU,WACT,MACeyO,Y7BjBV,c6BiCL,OAdAA,WACC,CACCsF,GADD,GAEC7iB,KAFD,SAGCkiB,O7BvBG,a6BwBH7H,OAAQ,CAAC,MAJV,eAKC+kC,MAAO,CACN,iB7BtBE,E6BuBF,sBAAuB77C,IAFjB,MAGN,sBAAuB,IAGzB45C,GAA8B,CAAEH,UAAWM,MAErC,WACN//B,qBAEC,CArBHzO,IAuBAyuC,GAAiB,CAAEP,UAAF,GAAyBK,W7BtCpC,e6BuCNK,GAAgB,CAAEV,UAAF,GAAyBK,W7BvCnC,e,S8BK+B/4B,G,IAAE04B,EAAS,YAAEK,EAAU,aACtD,EAAgDV,KAA/Cn/C,IAAD,GAAG+f,EAAG,EAAN,IAAQ49B,EAAW,EAAnB,YAAyBe,EAAiB,KAA1C,kBAENptC,qBAAU,WACT,OACeyO,YAAf,IAEcA,WAAd,IACA,CACA,IAAMygC,EAAc,SAACprC,GACpB,IAAMiqC,EAAWt/B,EAAA,sBAA0B3K,EAA1B,MAAmC,CAAEqrC,OAAQ,CAACjB,KAC3DkB,OAAJ,EACIC,OAAJ,EACMC,EAAcC,iBAAW,CAACzrC,SAAD,IAAeA,SAA9C,MACAiqC,WAAiB,YAChB,IAAMyB,EAAQD,iBAAW1C,WAAzB,aACM4C,EAAWF,sBAAjB,SACIH,OAA6BK,EAAjC,KACCL,IACAC,QAGFjC,MAID,M9B/BK,e8B6BDmB,GAAJ,GAAmD9/B,oB9B5B9C,yB8B6BD8/B,GAAJ,GAA0D9/B,oBACnD,WACNA,yBAEC,CAACA,EAAK49B,EAAa6B,EAAWd,EA1BjCptC,IDgCAivC,CAAc,CAAEf,UAAF,GAAyBK,W7BxCjC,e6B2CNvuC,qBAAU,W,QACT,IACeyO,Y7B7CV,e6B+CSA,WAAd,MAEAA,uCAAmD,CAAC,QAAS,CAAV,MAAkCsF,QAAlC,EAAkBo5B,eAAc,IAAdA,WAAgBp5B,mBAAlC,IAAnDtF,IACAA,8CAA0D,CAAC,QAAS,CAAV,MAAkCsF,QAAlC,EAAkBo5B,eAAc,IAAdA,WAAgBp5B,mBAAlC,IAA1DtF,QACE,CAACA,EARJzO,IAWAA,qBAAU,WACT,MACcyO,WAAd,IACA,CACA,IAAM0/B,EAAa9B,EAAc,UAAjC,OACA59B,0CACE,CAAC49B,EANJrsC,IE/CD,IAAMuwC,GAAgB,SAAC3uC,GACtB,OAAI8B,MAAJ,SACS9B,IAAJ,IAA+B,MAC7BwB,cAAP,YAGD,SAAwBotC,K,MAChB,EAAyE3C,KAAzE,GAAER,EAAS,EAAX,UAAaE,EAAgB,EAA7B,iBAA+BlB,EAAW,EAA1C,YAA4CE,EAAuB,EAAnE,wBAEDmC,EAAkB79C,mBAAQ,WAC/B,IAAMi0C,EAAIuH,EAAckB,EAAxB,EACA,OAAO,qBAAY,cAClB,OAAIzI,WAAaD,EAAjB,WACSC,WAAaD,EAAjB,YACO,OAEX,CAACwI,EAAWE,EAPf,IASA,OAAKlB,GAAL,EAEC,0BACC,0BACC,sBAAeuD,MAAO,QACrBlB,EAAA,gBAAgC,cAAqC,OACrE,kBAAC5/B,IAAD,UAAgB/L,IAAKnT,GACpBkf,qBADD,MAEC,sBAAY2hC,WAAYC,EAAK/tC,YAG/BmM,qBATF,OAWC,sBAAiB8gC,MAAO,QACxB,0BACElB,EAAA,KAAoB,cAAqC,OACzD,kBAAC5/B,IAAD,UAAgB/L,IAAKnT,GACpBkf,0BAAYyhC,GAAcG,EAD3B,WAEC,sBAAed,MAAO,YAGxB9gC,0BAAYyhC,GAA6B,QAAhB,EAAC7B,eAAe,IAAfA,YAAkB,OAAAA,QAAe,IAAfA,OAAA,EAAAA,EAAA,QAAH,yBApB5C,aADqD,KA0BtD,I,qBAAMiC,GAAY,iJAAU,uFAOtBC,GAAe,0FAAU,gCAOzBC,GAAgB,wFAAkB,oBACM,UAA9B,YAAmB,OAAA37B,EAAA,SAE7B47B,GAAkB,yFAAkB,qBACK,UAA9B,YAAmB,OAAA57B,EAAA,SAG9B46B,GAAU,mLAAU,6FAKC,2BAAZr7C,IALf,OASMs8C,GAAO,uHAAU,mDAGI,SAAZt8C,IAHf,OASMu8C,GAAa,wHAAU,mBAC0B,2CAAxC,YAAwB,OAAA97B,EAAA,c,SCnFf+7B,K,YAChB,EAA+CpD,KAA/C,GAAEV,EAAc,EAAhB,eAAkBZ,EAAuB,EAAzC,wBACD,EAA8BhtC,mBAA9B,GAAC2xC,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAAoB5xC,mBAApB,GAACqC,EAAK,EAAN,GAAQwvC,EAAQ,EAAhB,GAYN,OAVApxC,qBAAU,W,MACHoQ,EAAwB1gB,QAAnB,EAAGy9C,eAAc,IAAdA,WAAgBz9C,iCAA9B,YACAyhD,OACE,CAHHnxC,IAKAA,qBAAU,W,MACH4B,EAAwBlS,QAAnB,EAAGy9C,eAAc,IAAdA,WAAgBz9C,qEAC9B0hD,OACE,CAHHpxC,IAKA,EAEC,0BACC8O,0BADD,WAEC,sBAAO8gC,MAAO,MAAOC,YAAY,IACjC,sBAAMA,YAAY,IAClB,sBAAOD,MAAO,MAAOC,YAAY,IACjC/gC,0BACCA,0BADDA,gBAECA,0BAPF,IASEy9B,GACAz9B,0BACCA,4BADDA,KAECA,0BAZH,IAeCA,0BACCA,0BADDA,aAECA,0BAAkCu5B,QAAlCv5B,EAAwBmhC,QAAxBnhC,EAAQq+B,eAAc,IAAdA,WAAgB8C,+BAAU5H,kCAjBpC,KAmBCv5B,0BACCA,0BADDA,cAECA,0BAAkCu5B,QAAlCv5B,EAAwBmhC,QAAxBnhC,EAAQq+B,eAAc,IAAdA,WAAgB8C,+BAAU5H,kCAtBrC,MAD4B,KA6B7B,I,eAAMyH,GAAU,gLAAU,2GAMC,SAAZr7C,IANf,OAQMy7C,GAAM,sFAAU,2BAGhB7wC,GAAQ,uMAAU,4IAQlB8wC,GAAW,mMAAU,wIASrBC,GAAQ,6KAAU,kH,SCzEAiB,KAChB,MAAoBxD,KAApB,GAAEh7B,EAAO,EAAT,QAAWpE,EAAG,EAAd,IACD,EAAsBlP,mBAAtB,IAAC+xC,EAAM,EAAP,GAASC,EAAS,EAAlB,GAENvxC,qBAAU,WACT,GAAK6S,GAAL,EACA,IACC,IAAMkQ,EAAOwsB,gBAAb,GAGMiC,EAAqB,CAFhB,CAACzuB,EAAD,GAAUA,EAArB,IACW,CAACA,EAAD,GAAUA,EAArB,KAEAwuB,KACA9iC,eACC,aAGA,CAACA,EAZJzO,IAcA,IAAMC,EAAUyJ,uBAAY,WACtB+E,GAAL,GACAA,iBACE,CAACA,EAHJ,IAKA,OACC,0BACC,uBAAQJ,KAAM,cAAepO,QAASA,KAKzC,I,SAAM6vC,GAAU,8IAAU,0EAIC,SAAZr7C,IAJf,OCdag9C,GAAiB,SAAC,G,IAC9BtlD,EAAI,OACJ+d,EAAmB,sBACnBD,EAAa,gBAEP,EAA4B4jC,KAAzB3B,EAAM,KAAT,OAAeC,EAAO,KAAtB,QA6BN,OA3BAnsC,qBAAU,WACTmsC,OACE,CAACA,EAFJnsC,I,SC3BqDwV,G,IAAEtL,EAAmB,sBAClEoiC,EAAmBuB,QAAnBvB,eAERtsC,qBAAU,WACT,IAAMqsC,EAAcniC,EAApB,YACAoiC,OACE,CAACpiC,EAHJlK,ID4BA0xC,CAA8B,CAAExnC,oBAAmB,I,SE/BZsL,G,IAAEvL,EAAa,gBAC9CuiC,EAA+BqB,QAA/BrB,2BAERxsC,qBAAU,W,UACHlR,EAA+CqB,QAAvC,EAA2B1D,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAY0D,4CAArD,GACAq8C,OACE,CAACviC,EAHJjK,IF6BA2xC,CAAgB,CAAE1nC,cAAa,IG5BhC,WACO,MAA2B4jC,KAAxB3B,EAAM,KAAT,OAAeD,EAAM,KAArB,OAENjsC,qBAAU,W,MACT,MACA4xC,iBARF,4FAUE,IAAM5jD,EAAU,CACfutB,OAAQ,CACPs2B,IADO,EAEPC,IAAK,GAEN5xC,UAAmB4c,QAAV,EAAEovB,eAAM,IAANA,WAAQpvB,uBALJ,UAMf1a,MANe,mCAOf2vC,aAPe,WAQfl2B,KARe,EASfm2B,oBAAoB,GAEf3Z,EAAI,IAAI,GAAJ,IAAV,GACAA,aAAa,WACZ4T,WAEC,CAACA,EAnBJjsC,IH0BAiyC,G,WI1BO,MAAoBpE,KAApB,GAAEp/B,EAAG,EAAL,IAAOoE,EAAO,EAAd,QAEP7S,qBAAU,W,MACT,KAYA,OAXkByO,YtCdb,esCeUA,etCfV,csCgBLA,YtChBK,asCgB0B,CAC9Bvd,KAD8B,UAE9B/E,KAF8B,GAG9B+lD,SAH8B,EAI9BC,mBAAiB,KAChB38B,sCAAuC,CAAC,IAAK,CAAC,MtCnB3C,8BsCc0B,GAO9B48B,YAAY,IAEN,eACL,CAdHpyC,IAgBAA,qBAAU,WACT,GAAKyO,GAAL,GACA,IAAM2E,EAAS3E,YtC9BV,csC+BL,IACA2E,eAAM,IAANA,oBACE,CAACP,EALJ7S,IJWAqyC,GAGAhC,KN3BD,WACU,IAAA5hC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,MACeyO,Y5BpBV,c4BsCL,OAhBAA,WACC,CACCsF,GADD,GAEC7iB,KAFD,SAGCkiB,O5B1BG,a4B2BHk9B,MAAO,CACN,iB5BxBE,E4ByBF,sBAAuB77C,IAFjB,MAGN,sBAHM,EAIN,e3B9BE,U2B+BF,gBjBhCE,GiBkCH8W,OAAQ,CAAC,IAAK,CAAC,MAAP,iBAET8iC,GAA8B,CAAEH,UAAWM,MAErC,WACN//B,qBAEC,CAvBHzO,IA2BAivC,GAAc,CAAEf,UAAF,GAAyBK,W5B7CjC,e4B8CNmB,GAAgB,CAAExB,UAAF,GAAyBK,W5B9CnC,e4BiDNN,GAAa,CAAEC,UAAWM,KMJ1B8D,GnBhCD,WACU,IAAA7jC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,MACeyO,YflBV,cekCL,OAdAA,WACC,CACCsF,GADD,GAEC7iB,KAFD,SAGCkiB,OfxBG,aeyBH7H,OAAQ,CAAC,MAJV,eAKC+kC,MAAO,CACN,iBfvBE,EewBF,sBAAuB77C,IAFjB,MAGN,sBAAuB,IAGzB45C,GAA8B,CAAEH,UAAWM,MAErC,WACN//B,qBAEC,CArBHzO,IAuBAyuC,GAAiB,CAAEP,UAAF,GAAyBK,WfvCpC,eewCNK,GAAgB,CAAEV,UAAF,GAAyBK,WfxCnC,eeyCND,GAAiB,CAAEJ,UAAF,GAAyBK,WfzCpC,ee0CNN,GAAa,CAAEC,UAAWM,KmBI1B+D,GtBjCD,WACU,IAAA9jC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,MACeyO,YZlBV,cYoCL,OAhBAA,WACC,CACCsF,GADD,GAEC7iB,KAFD,SAGCkiB,OZxBG,aYyBH7H,OAAQ,CAAC,IAAK,CAAC,MAJhB,gBAKC+kC,MAAO,CACN,iBZvBE,EYwBF,sBAAuB77C,IAFjB,MAGN,sBAHM,EAIN,eX7BE,UW8BF,gBD/BE,ICkCJ45C,GAA8B,CAAEH,UAAWM,MAErC,WACN//B,qBAEC,CAvBHzO,IA0BAiuC,GAAa,CAAEC,UAAWM,KAC1BF,GAAiB,CAAEJ,UAAF,GAAyBK,WZ3CpC,ekC+CNiE,G,WKzCO,MAAoB3E,KAApB,GAAEp/B,EAAG,EAAL,IAAOoE,EAAO,EAAd,QAEP7S,qBAAU,WACT,IACkByO,YvCTb,yBuCUUA,evCVV,wBuCWLA,YvCXK,uBuCWgC,CACpCvd,KADoC,UAEpC/E,KAFoC,GAGpC+lD,SAHoC,EAIpCE,YAAY,OAEX,CAVHpyC,IAYAA,qBAAU,WACT,GAAKyO,GAAL,GACA,IAAM2E,EAAS3E,YvCrBV,wBuCsBL,IACA2E,eAAM,IAANA,oBACE,CAACP,EALJ7S,IL8BAyyC,GVlCD,WACU,IAAAhkC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,MACeyO,YxBpBV,wBwBqCL,OAfAA,WACC,CACCsF,GADD,GAECq+B,YAFD,EAGClhD,KAHD,SAICkiB,OxB3BG,uBwB4BHk9B,MAAO,CACN,sBAAuB77C,IADjB,MAEN,sBAFM,EAGN,gBbhCE,EaiCF,evBhCE,YuBmCJu6C,GAA8B,CAAEd,UAAWM,MAErC,WACN//B,qBAEC,CAtBHzO,IAwBA6uC,GAAe,CAAEX,UAAF,GAAyBK,WxB1ClC,yBwB2CNO,GAAgB,CAAEZ,UAAF,GAAyBK,WxB3CnC,yBwB4CNU,GAAc,CAAEf,UAAF,GAAyBK,WxB5CjC,yBwB6CNmB,GAAgB,CAAExB,UAAF,GAAyBK,WxB7CnC,yBwB+CNN,GAAa,CAAEC,UAAWM,KUI1BkE,GbrCD,WACU,IAAAjkC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,MACeyO,YrBnBV,wBqBoCL,OAfAA,WACC,CACCsF,GADD,GAEC7iB,KAFD,SAGCkiB,OrBzBG,uBqB0BHk9B,MAAO,CACN,iBrBxBE,EqByBF,sBAAuB77C,IAFjB,MAGN,sBAHM,EAIN,gBV/BE,EUgCF,epB/BE,YoBkCJu6C,GAA8B,CAAEd,UAAWM,MAErC,WACN//B,qBAEC,CAtBHzO,IAwBA6uC,GAAe,CAAEX,UAAF,GAAyBK,WrB1ClC,eqB2CNO,GAAgB,CAAEZ,UAAF,GAAyBK,WrB3CnC,eqB4CND,GAAiB,CAAEJ,UAAF,GAAyBK,WrB5CpC,eqB8CNN,GAAa,CAAEC,UAAWM,KaO1BmE,G,WMhDM,MAAsD9E,KAArDxgD,IAAD,GAAGlB,EAAI,EAAP,KAASogD,EAAuB,EAAhC,wBAAsCH,EAAU,KAAhD,WAENpsC,qBAAU,W,MACT,iBAAA7T,QAAI,IAAJA,OAAA,EAAAA,EAAA,yBAAgBygD,SAAQ,Y,MACnBhrC,EAAJ,EACA,IACCA,EAAQ2B,OAAe7T,QAAT,EAACm9C,EAAQn9C,iCAAvBkS,IACI8B,MAAJ,KAAkB9B,MAEnBirC,4CAED1gD,eAAI,IAAJA,oBAAoB,cACnB,IAAMymD,EAAO9N,uCACP+N,EAAOhO,uCACb,OAAI+N,EAAJ,KACSA,EAAJ,IACO,KAGbxG,EAAW/6C,iBAAX+6C,MACE,CAACjgD,EAAMigD,EAlBVpsC,INgDA8yC,GAGC,0BACC,sBAAKxgC,IAAK45B,IACVp9B,qBAFD,MAGCA,qBAHD,MAICA,qBAJD,MAKCA,qBANF,QAWKmQ,GAAM,gGAAU,sCAKhB6wB,GAAU,2HAAU,iEOjDnB,IAAMiD,GAAgC,SAAC,G,IAC7CnpC,EAAS,YACTgW,EAAY,eACZ7b,EAAK,QACLkE,EAAK,QACLC,EAAK,QACL+B,EAAa,gBACb5c,sBAAU,IAAG,iBACbqB,sBAAU,IAAG,KAEP,EAKFuf,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAOAwf,EAAwBhkB,uBAC7B,YACC,IAAMyB,EAAgBiD,WAAWA,eAAjC,IACA,oBAAI4kC,EACH,IACC7nC,kBAAuCwiB,EAAvCxiB,MACC,MAAOrH,SAETqH,wBAAiD,CAACwiB,eAAM,IAANA,WAAlDxiB,MACKA,EAAL,OAAyBA,WACzBA,UAA4BwiB,eAAM,IAANA,WAA5BxiB,KAED+C,EAASP,KAATO,MAED,CAACtE,EAAWsE,EAAUjE,EAAelG,EAAOivC,EAd7C,IAiBM7pC,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIM9B,EAAa5V,mBAAQ,W,gBACtB+8B,EAAJ,GAOA,OALCA,EADD,iBAAIolB,EACoCxmD,QAA3B,EAAkBwB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASxB,mCAAvCohC,GAEoDhO,QAAxC,EAA2BnzB,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAamzB,yBAApDgO,IAMsC,QAAvC,EAAOlhC,YAAiCsb,EAAwB,CAAzB,0BAAvC,GAH0B,OAIxB,CAACiC,EAAe+oC,EAAYpzB,EAZ/B,IAcA,OACC5rB,YAACwV,IACAL,mBAAoBA,EACpBzC,mBAAoBgnB,EACpBjnB,WAAYA,EACZwB,MAAOA,EACPC,MAAOA,EACPnE,MAAOA,EACPqF,WAAYA,KC7ETlB,GAAQ,CAACiQ,IAAf,UAEa/mB,GAAS,CACrB2R,IADqB,YAErBgB,MAFqB,YAGrBsK,KAHqB,QAIrBvE,OAJqB,GAKrBwE,Q,SCV+BkH,G,IAAErpB,EAAI,OAAE+d,EAAmB,sBAAED,EAAa,gBACzE,OACC,0BACC,sBAAgB9d,KAAMA,EAAM+d,oBAAqBA,eAAmB,IAAnBA,IAAuB,GAAID,cAAeA,MDQ7F2E,SANqB,GAOrBC,MEX4B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAC5E,OACC,kBAAC4E,IAAD,cACC,sBACClF,UAAWA,EACX1B,MAAO,CAACiQ,IAAD,UACPpU,MAAO,oBACPkG,cAAeA,E,UACP,mCACR+oC,WAAY,eACZ5pC,YAAY,IAEb,sBACCQ,UAAWA,EACXoE,UAAW,EACX9F,MAAO,CAACiQ,IAAD,SACPpU,MAAO,mBACPkG,cAAeA,E,UACP,mCACR2V,aAAc,wBACdxW,YAAY,IAEb,sBACCQ,UAAWA,EACXM,oBAAqBA,EACrB0V,aAAc,cACd7b,MAAO,mBFdVmE,MARqB,GASrB+G,qBAAsB,YASrB,MARY,CACXjhB,QAAS,CACRvB,WAAY,CACX2C,UAAW,KAEZ5C,aAAc,OAAA8B,QAAkB,IAAlBA,OAAA,EAAAA,EAAA,KAAwB,YAAU,OAAAka,EAAA,WAKnDsX,2BAA4B,YAC3B,MAAO,CACNmzB,SADM,YAENC,YAFM,UAGNC,aAHM,EAIN73B,WAJM,OAKN83B,WALM,0BAMNC,aAAc,iGAGhB7vC,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IG5BWurC,GAAuC,SAAC,G,IAAEnnD,EAAI,OACjDonD,EAAgB,SAACC,EAAD,GAClB,OAAOx/C,YAACy/C,K,CAEJ1wC,IAAKywC,MAAiBE,EACtBC,UAAU,EACVC,aAAa,GAERznD,eAAI,IAAJA,qBANT,KAUJ,OACI6H,YAAC8a,IAAMC,cACH/a,YAAC++B,MACG8gB,QAASxiD,YAAYlF,eAAI,IAAJA,WAAZkF,QAA0BukC,OACnCke,eAAgBC,KAAeC,IAC/BC,cAAe,EACfC,iBAAkB,EAClBC,iBAAiB,EACjBC,yBAAyB,GAEvB,OAAAjoD,QAAI,IAAJA,OAAA,EAAAA,EAAA,oBAAyB,YACvB,mBAAC+oC,MAAOnyB,IAAKsxC,EACLpkD,KAAMokD,EACNd,aAAcA,UCrC7Be,GAAmB,CAC/B,CACCvwC,MADD,OAECnC,MAAO,QAER,CACCmC,MADD,eAECnC,MAAO,gBAER,CACCmC,MADD,wBAECnC,MAAO,kBAER,CACCmC,MADD,wBAECnC,MAAO,kBAER,CACCmC,MADD,wBAECnC,MAAO,kBAER,CACCmC,MADD,wBAECnC,MAAO,kBAER,CACCmC,MADD,UAECnC,MAAO,YAII2yC,GAAmB,CAC/B,CACCxwC,MADD,OAECnC,MAAO,QAER,CACCmC,MADD,eAECnC,MAAO,gBAER,CACCmC,MADD,UAECnC,MAAO,YCnCHqG,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,SAErBgB,MAFqB,SAGrBsK,KAHqB,UAIrBC,QCQ2D,SAAC,G,IAAcniB,EAAI,OAAE6b,EAAsB,yBAAEiC,EAAa,gBAAEC,EAAmB,sBAAE7c,yBAAa,MAACwX,KAEpJsE,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMiG,EAA6B3d,mBAAQ,W,MAC1C,GACE1E,GAAD,IAEgB6B,QAAhB,EAACic,eAAa,IAAbA,WAAejc,8BAFhB,eAGCqD,wBAHD,WAICA,wBAJD,SAKCA,wBANF,YAWA,IAAImjD,EAAqBnxC,GAAYlX,EAAI,QAAJA,OACjCsC,EAAStC,EAAb,OACMsoD,EAAkCtoD,EAAI,QAAJ,KAAoB,cAAmB,MAAO,CAAE,KAAQ6X,EAAK,KAAU,MAAzB,EAAqC,MAAS,MACpI3S,YAAYlF,EAAI,QAAhBkF,SAAoC,cACnClF,EAAI,OAAJA,GAAsBsoD,EAAA,KAAkB,SAAAzwC,GACvC,IAAI0wC,EAAcrjD,OAAA,OAAclF,EAAI,OAAlB,UAAwC,SAAAo5C,GAAO,OAAAA,EAAG,OAAavhC,EAAK,QACtF,OAAO0wC,GAAP,QAIF,IAAIC,EAAmB,OAAS1qC,uBAAhC,GACO2qC,EAAmB,OAAS3qC,uBAAhC,GAEC4qC,EAAJ,GAEIC,EAAiB,OAAH,IAAG,CAAH,CAAI,GAAIH,GAAuBtjD,OAAA,OAAclF,EAAI,SAAlB,KAAmC,SAAA4oD,GAAO,OAAAA,EAAG,SAQ9F,OANAF,oBAAgBD,EAAoBJ,GAAuBnjD,OAAA,OAAclF,EAAI,SAAlB,KAAmC,SAAA4oD,GAAO,UAAYA,EAAG,YAEpH1jD,wBAA4B,cAC3BwjD,oBAAgBG,EAAS3xC,GAAYlX,EAAI,KAAJA,WAAkCkF,OAAA,OAAc5C,EAAd,SAAmC,SAAAwmD,GAAO,UAAYA,EAAG,eAG1H,CAAC,eAAD,EAAmC,OAAUJ,MAClD,CAAC1oD,EAAMgd,EApCV,IAuCA,OAAQqF,GAAD,GAAkBnd,sBACxB,sBACClF,KAAMqiB,EACNtE,oBAAqBA,IAGtB,uBACCqE,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD7DfC,SALqB,GAMrBC,MEe0B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAC5D,OACCjU,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAO,MACPkG,cAAeA,E,UACP,6BAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAO,SACPkG,cAAeA,E,UACP,8BAGVjW,YAACi6B,QACAj6B,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,kBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,GACxCgF,YAAY,E,UACJ,uCAETpV,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,E,UACJ,iCAGVpV,YAACi6B,QACAj6B,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,WACb7b,MAAM,cACNhV,OAAQulD,GACRxmB,aAAcwmB,GAAiB,GAC/BnS,UAAW,E,UACH,iCAETnuC,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,cACb7b,MAAM,iBACNhV,OAAQwlD,GACRzmB,aAAcymB,GAAiB,GAC/BpS,UAAW,E,UACH,qCAMbnuC,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,iBACPopB,cAAc,U,UACN,mCAETn5B,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,oBACPopB,cAAc,a,UACN,yCF1GfllB,MAPqB,GAQrBgH,qBAAsB,SAAA3gB,GACrB,MAAO,CACNN,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX,QADW,GAER,WAFQ,GAGR,YAHQ,UAIR,SAAY,cAKnBqzB,2BAA4B,SAAAiS,GAC3B,UAIDvuB,QAAS,SAAAwE,GACR,OAAOD,GAAiBC,EAAjBD,YAAP,IG5BF,SAAgBmtC,GAAWC,GAC1B,OAAOh7B,kBAAP,cAOD,SAAgBi7B,GAAaC,GAC5B,OAAOjyC,cAAP,UCLD,SAAgBkyC,GAAK9/B,G,MAAEnF,EAAI,OAAEoO,EAAM,SAAEme,EAAM,SAAE2Y,EAAY,eAAEC,EAAc,iBAAEC,EAAW,cAAEC,EAAc,iBAEpG,EAOGrlC,EAPHlkB,KAAQ4W,EAAG,EAAX,IAAanB,EAAK,EAAlB,MACA02B,EAMGjoB,EAPH,GAEAkoB,EAKGloB,EAPH,GAGAmoB,EAIGnoB,EAPH,GAIAooB,EAGGpoB,EAPH,GAKAslC,EAEGtlC,EAPH,MAMAkK,EACGlK,EAPH,SAQKulC,EAAMn3B,EAAZ,GACMo3B,EAAMp3B,EAAZ,GACMq3B,EAAMlZ,EAAZ,GAEMz6B,EADMy6B,EAAZ,GACA,EACM16B,EAAQ2zC,EAAd,EACME,EAAYP,QAAlB,EACMQ,EAAeT,OAArB,EACMU,EAAYV,MAAlB,EACMW,EAAkBX,MAAxB,EAEM,EAiOP,sBACOY,EAAmB9mC,iBAAzB,MAGM,EAAoC9P,oBAApC,GAAC62C,EAAa,EAAd,GAAgBC,EAAgB,EAAhC,GAEAC,EAAiB5sC,uBAAY,W,0GAEjC,SAAM6sC,M,cAAN,SACMC,EAAaC,GAAbD,GACNH,K,aAJF,IAQA,MAAO,CAAED,cAAF,EAAiBD,iBAAjB,EAAmCG,eAAc,GA/OII,GAApDN,EAAa,EAAf,cAAiBD,EAAgB,EAAjC,iBAAmCG,EAAc,EAAjD,eACA,EAgLP,SAAwBH,GACvB,IAAMQ,EAAWtnC,iBAAjB,MACMunC,EAAWvnC,iBAAjB,MAGMwnC,EAAYntC,uBAAY,WAE7B,IAAMotC,EAAUH,EAAhB,QACMI,EAAUH,EAAhB,QAEIE,GAAJ,GACC,W,qHACKE,IACAR,K,wBACGA,GAAcQ,GAAaC,UAAyB,GAEpDC,EAAUP,EAAVO,QACAC,EAAUP,EAAVO,QAEF,GAAWA,GAEdC,GAAY,GADNC,EAAYJ,GAAZI,IACND,OACAA,GAAY,EAASC,EAArBD,OAEA,GAAME,GAtFZ,OAiFS,OALsD,G,UAWzD,OADA,SACA,GAAMf,M,OAAN,SAGAC,EAAaC,GAAbD,G,wBAEDQ,I,8BAnBF,KAuBC,CA7BH,IA+BA,MAAO,CAAEL,SAAF,EAAYC,SAAZ,EAAsBC,UAAS,GApNIU,CAApC,GAAEZ,EAAQ,EAAV,SAAYC,EAAQ,EAApB,SAAsBC,EAAS,EAA/B,UAEAW,EAA0B9tC,uBAAY,WAC3C,EACC4sC,IAEAO,MAEC,CAACP,EAAgBJ,EANpB,IAQA,OACCliD,YAACi9B,KAAOwmB,KACPtmB,QAAS,CACR5uB,EADQ,EAERE,EAFQ,EAGRN,OAHQ,EAIRD,MAJQ,EAKR6S,QAAS,GAEVqc,QAAS,CACR7uB,EADQ,EAERE,EAFQ,EAGRN,OAHQ,EAIRD,MAJQ,EAKR6S,QAAUihC,EALF,EAKiB,EACzB7H,WANQ,UAORuJ,cAAe,CACdvJ,WAAa6H,EADC,SACc,UAG5BzzC,EAJc,EAKdE,EAAGqzC,IAGLvkB,oBAAqBimB,EACrBG,WAAY,CACXxJ,WAAY,CAAEyJ,KAAM,WACpB3lD,QAAS,CAAE4lD,KAAF,aAAsBC,SA9DnC,KAgEGhkD,IAAKikD,GAAW9B,KAAD,EAAqC,QAArC,EAA0BR,EAAY1yC,UAAD,QAArC,YAEdgzC,GACA/hD,mBAAKF,IAAKkkD,I,SACF5C,GAAaxzC,GACpB5N,iCACQ2hD,MAAO3hD,yBAGfgiD,IACAE,EAEAliD,mBACCse,IAAK6jC,EACLriD,IAAK,CAAC,GAAD,GAGJA,YAAG,uGAC8B,uBAArBsiD,EAAgB,EAJxB,IAOLn2C,QAAS,WACRy1C,MAEDnnC,MAAUxL,OAAQqyC,GAARryC,O,UACF,0BAfM,GAqBf/O,mBACCse,IAAK6jC,EACLriD,IAAK,CAACmkD,GAAYC,IAClBj4C,QAAS,WACRy1C,MAEDtzC,MAAK,eAAQ6zC,GAAa,CAAE9zC,OAAF,EAAUD,MAAK,IACzCqM,MAAUxL,OAAQqyC,GAARryC,O,UACF,wBAER/O,oBAAMse,IAAKqkC,EAAU7iD,IAAKqkD,IACxBp1C,GACM,IACR/O,oBAAMse,IAAKskC,EAAU9iD,IAAKskD,I,IACvBhD,GAAaxzC,GA1ErB,QAkFD,I,8BAAMm2C,GAAa,SAACM,EAAa11C,GAAU,mBAAG,2PACuB,2DAWnE,iBAE2B,UAA6B,+FAbrC01C,EAAcC,YAAe,GAAlB,GADc,EAG3CD,GACFvkD,YAAG,0LAE6C,yDAIA,qBAJ1BwkD,YAAe,GAFlC,GAMmBA,YAAe,GAVQ,IAcnC7jD,GAdmC,YAcP4jD,EAAc,EAdV,IAuBrCE,GAAqBzkD,YAAG,gIACS,2BAAyC,uBAFhF,SAIMmkD,GAAankD,YAAG,2RAKkB,iBACjB,wFADPqI,GALM,eALtB,GAiBMq8C,GAAsB1kD,YAAG,uIACV,qGADrB,IAQMokD,GAAoBpkD,YAAG,2EAIvBmjD,GAAkB,CAAC,CAAElzC,MAAF,GAAaqM,MAAO,IAAM,CAAErM,MAAF,GAAaqM,MAAO,IAAM,CAAErM,MAAO,IAAM,CAAEA,MAAO,IAArG,IAEMo0C,GAAarkD,YAAG,0FACD,mBACiB,qCAFhB,GAERmjD,MAFd,OAKMmB,GAAatkD,YAAG,2GACD,mBACiB,sDAFhB,GAERmjD,MAFd,OAOMe,GAAelkD,YAAG,6WAalBwjD,GAAQ,SAACmB,GAAgB,YAAhB,IAAAA,MAAA,KAAgB,aAAY,YAAO,OAAAC,WAAW1nB,EAAX,OAC5CulB,GAAgB,WACrB,oBAAY,YACXzzB,oCA2CF,SAASs0B,GAAYuB,EAAIj2C,GACxB,IAAIykC,EAASzkC,EAAW,CAAEA,SAAaA,EAAQ,MAAS,CAAEqS,QAAF,EAAcrS,SAAU,GAChF,MAAIykC,YACHwR,gBAAmBxR,EAAnBwR,SAEDA,iBAAoBxR,EAApBwR,SAqBD,SAASlC,GAAYnkC,GACpB,QACGA,EAAF,UACCA,uBAA2BA,UAA3BA,cAAuDA,sBAA0BA,UAFnF,aCvQD,IAAMsmC,GAAa,CAAC,UAAD,gFAAnB,WAcMC,GAAsB,yDAA5B,KAwCA,IAAIC,IAAJ,EASA,SAAgBC,GACfC,GAEM,MAAgCz5C,mBAAhC,IAACk2C,EAAW,EAAZ,GAAcwD,EAAc,EAA5B,GAkBN,OAfAj5C,qBAAU,WACTi5C,GAAe,YACd,IAAMC,EAAsBC,YAA5B,GASA,OAPAH,WAAkB,Y,MACXr2C,EAAc,QAAT,EAAGu2C,EAAO7oC,OAAD,oBAhBhBuoC,GADPE,IAAmBA,GAAD,GAAwBF,GAA1CE,QAkBGI,EAAO7oC,OAAP6oC,OACI7oC,EAAJ,UA9CJ,SAAS+oC,EAAuB,EAAhC,K,MAKC,UAAA/oC,EAAA,yBAAeu8B,SAAQ,cACtB,IAAMyM,EAAcR,GAAoBvoC,EAAIuoC,GAA5C,QACMS,EAAW92C,SAAjB,GAGK02C,EAAOj1C,OAAZ,OACCi1C,EAAOj1C,OAAPi1C,KAAyBK,YAAOD,EAAhCJ,IAGGj1C,EAAJ,UAECm1C,EAAuBF,EAAQK,YAAM,GAACD,EAAhB,GAAtBF,MA+BEA,CAAuBF,EAAQv2C,EAA/By2C,MAGF,OAEC,CAbHp5C,IAeA,E,IC/FYw5C,GAAQ,UAARA,GAAQ,UAARA,GAAQ,SAARA,GAAQ,OAARA,GAAQ,SAARA,GAAQ,OAARA,GAUL,OAGKC,GAAS,2BAClBx/C,KACHy/C,IAAKjlD,GAAOiB,MACZikD,IAAKllD,GAAOgB,YACZmkD,IAAKnlD,GAAOe,YACZqkD,cAAe,gBACfC,mBAAoB,mBACpBC,oBAAqB,mBACrBC,sBAAuB,mBACvBC,eAAgB,oCChBbC,IAAJ,EAMA,SAAgBC,GAAgBC,EAAyBpvC,GAAzD,WACC,I,oGAGG,O,sBAAA,GAAMjb,YAAK,gCAAiC,CAC3Cua,OAD2C,EAE3CU,QAA4B,oBAAZA,EAAyBA,IAAYA,K,4DAS1D,IAAIqvC,IAAJ,EAKA,SAAgBC,KAAhB,WACC,KACCD,M,oGAIE,O,sBAAA,GAAMtqD,YAAK,gCAAiC,CAC3Cua,OAFKhB,gB,cACN,SAGA4wC,M,6BAGAA,M,+BClCJ,SAAS,GAAT,G,MAKC,OAAOz2C,YAAcA,kBAAdA,IAA0CjB,QAA1CiB,EAA0CjB,UAAUiB,EAAVjB,sBAAjD,EA0BD,SAAgB+3C,GAAc/kC,G,YAC7BxT,EAAU,aACV7V,EAAI,OACJquD,EAAe,kBACfhF,EAAc,iBACEiF,EAAmB,iBAE7BC,EAAoBrrC,iBAA1B,MAGM,EAA4Cxe,mBAAQ,WACzD,IAAMq+B,EAAO,OAAAtsB,EAAA,GAAa,CAAE2X,SAAUpuB,EAAK0X,UAA9B,IAAb,IAGM82C,EACL,MAAAD,EAAA,QACG,CACAv4C,OAAQu4C,UADR,aAEAx4C,MAAOw4C,UAA0BE,aAJrC,EAQMpjB,EAAO,OAAA50B,EAAA,UAEN,CAAC+3C,QA7CV,IA6C+CA,EAFhC,mCASN/3C,UATM,IAAb,GAYA,MAAO,CACNssB,KADM,EAENyrB,kBAFM,EAGNE,OAJcrjB,gBAAf,UAKCA,KAAI,KAEH,CAACrrC,EAAD,UAA6C2wB,QAA7C,EAA2B49B,EAAkB59B,8BA9B1C,eAAEoS,EAAI,EAAN,KAAQyrB,EAAiB,EAAzB,kBAA2BE,EAAM,EAAjC,OAAmCrjB,EAAI,EAAvC,KAiCAsjB,EAAcD,EAAA,MAAY,YAAO,OAAAt4C,EAAA,gBAG/B2L,EAAaD,yBAAbC,SACFwnC,EAAiBhsC,uBACtB,Y,MACC,GAAI3G,IAAQmsB,OAAZ,IAA2B,CAC1B,IAAM6rB,EAAUF,EAAA,MAAY,YAAO,OAAAt4C,EAAA,gBAC7B1T,EAFoB,EAnEhB,2BAGP,YAAO,OAAA4U,EAAA,YAHA,QAIJ,YAAO,aAJH,KAAb,KAuEG,IACCyK,EACCP,GA9EC,aA8ED,MACC6H,GAAmB,CAClBwlC,IAAKnsD,GAHRqf,KAOAisC,GAAgB,gBAAhBA,SAGDjsC,EAASP,GAvFN,WAuFHO,OAEDusC,OAED,CAACvsC,EAAU2sC,EAAQ3rB,OAAnB,MArBD,IAyBAlvB,qBAAU,WACT,OAAO,WAAM,OAAAkO,EAASP,GAhGjB,WAgGQ,UADd3N,IAMAA,qBAAU,WACJw1C,GAAL,GAECE,EAAele,OAAfke,OAEC,CAACoF,EAAatF,EAAgBE,EAAgB+E,EALjDz6C,IAUM,MAAwBT,mBAAxB,MAAC07C,EAAO,EAAR,GAAUC,EAAU,EAApB,GACNl7C,qBAAU,WACTk7C,OAEE,CAAC/uD,EAAM6V,EAAP,MAAyBA,EAH5BhC,SAMAA,qBAAU,W,OACS7T,QAAd,EAAC2uD,eAAW,IAAXA,WAAa3uD,2BAAlB,MACC+uD,UAEC,CAJHl7C,IAOA,IAAIs4B,EAAJ,EACIE,EAAKmiB,QA5HV,IA6HKpiB,EAAJ,EACIE,EAAKkiB,EAAT,OACA,IACCriB,EAAK2iB,EAAL3iB,GACAE,EAAKyiB,EAALziB,GACAD,EAAK0iB,EAAL1iB,GACAE,EAAKwiB,EAALxiB,IAED,IAAMha,EAAS7b,qBAAwB,CAAC01B,EAAzB11B,UAAwC,CAAC,EAAG+3C,EAA3D,QACM/d,EAASh6B,qBAAwB,CAAC21B,EAAzB31B,UAAwC,CAAC,EAAG+3C,EAA3D,SACMpF,EAAwBI,QAAZ,EAAGsF,eAAO,IAAPA,WAAStF,qBAA9B,EAGMF,EAAcsD,GAAuBx+B,QAAN,EAAC2U,EAAK3U,wBAA3C,IAGM4gC,EAAiBN,EAAA,QACtB,YAAO,OAAApqC,EAAA,WAA4BA,UAAY8kC,EAAxC,GAA4D9kC,UAAY8kC,EAAxE,KAIF6F,EACL,QADoB,EACpB,OAAAN,QAAW,IAAXA,OAAA,EAAAA,EAAA,2BAGM,YACJ,MAAO,CACNx1C,KAAM+K,kBAA2BA,OAD3B,IAENpQ,QAAS,WAAM,OAAAy1C,EAAerlC,OAAf,iBANlB,QADD,GAWA,OACCrc,mBAAKF,IAAKunD,IACTrnD,mBAAKF,IAAKwnD,IACTtnD,mBAAKF,IAAKynD,I,SACVvnD,YAAC0mC,KAAY5zB,MAAOs0C,KAGrBpnD,mBAAKF,IAAK0nD,GAA6BlpC,IAAKooC,GAC3C1mD,mB,UACS,eACRkO,MAAOy4C,EAAkBz4C,MACzBC,OAAQw4C,EAAkBx4C,OAC1BrO,IAAK2nD,IAEJN,EAAA,KAAmB,YAEV,IAAAp4C,EAELsN,OAFKtN,IACR4yC,EACGtlC,EAFK,MAGT,OACCrc,YAACshD,G,CAEAvyC,IAAQA,MAAO4yC,EACftlC,KAAMA,EACNoO,OAAQA,EACRme,OAAQA,EACR2Y,aAAcA,EACdC,eAAgBA,EAChBC,YAAaA,EACbC,eAAgBA,UAUxB,I,eAAM2F,GAAoBvnD,YAAG,qMAOvB0nD,GAA8B1nD,YAAG,yHAIjC2nD,GAA6B3nD,YAAG,iOAQhCwnD,GAA0BxnD,YAAG,6LAId,IAAY,SAApB0lD,GAAYA,IAGnB+B,GAAkBznD,YAAG,iKC7O3B,IAAMmU,GAAQ,CAACyzC,IAAf,cAEatqD,GAAS,CACrB2R,IADqB,WAErBgB,MAFqB,UAGrBsK,KAHqB,kBAIrBC,QCOD,SAA+BkH,G,QAAEtnB,+BAAmB,IAAG,OAAI8T,EAAU,aAAE7V,EAAI,OAAE8C,yBAAa,MAAC4V,KAAiBoF,EAAa,gBAAEL,EAAS,YAE3HsE,EAAaD,yBAAbC,SAEFssC,EAA0ChuD,QAA3B,EAAkBwB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASxB,mCCD1C,GDEEgpD,EAAmBtrC,EAAnBsrC,eAGFE,EAAiBhsC,uBAAY,YAClCwE,EAASP,GAAA,EAAgD,CAAE6nC,eAAc,OACvE,CAAC5rC,EAFJ,IAIA,OAAO,OAAAzd,QAAI,IAAJA,OAAA,EAAAA,EAAA,SACN,sBACCA,KAAMA,EACN6V,WAAYA,EACZw4C,gBAAiBA,EACjBhF,eAAgBA,EAChBE,eAAgBA,IAGjB,uBACCnnC,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD9BfC,SALqB,GAMrBC,MESiC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAC5D,OACCjW,YAAC8a,IAAMC,cACN/a,YAAC+Z,IACAnE,UAAWA,EACXoE,UANG,EAOH/F,MAAO,CAACyzC,IAAD,cACP33C,MAAO,WACPkG,cAAeA,E,UACP,gCFjBXhC,MAAO,CAACyzC,IAPa,cAQrBzsC,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACXmlC,UAAW,QAKf9R,2BAA4B,YAC3B,MAAO,CACNkS,eAAe,IAGjBxuB,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IGzBF,SAAgB4zC,GAAcnmC,G,IAAEolB,EAAG,MAAEuG,EAAe,kBAC/CxE,GAAJ,EACIif,EAAJ,KACIC,GAAJ,EAEIvgC,EAAJ,KACIwgC,EAAkB,CAAE35C,OAAF,EAAaD,MAAO,GAGpC65C,EAAcn5C,oBAAqB,CAAC,EAA1C,KAGMm2B,EAAan2B,8CAGDA,wBAHCA,eAINA,eAJMA,UAKNA,eAEPiZ,EAAOjZ,0BAAsB,CAAC,GAAvBA,iBAyDb,WACCA,4DA1DYA,WA6Db,YACCg5C,IACA7iB,sBA/DYn2B,UAkEb,WACCo5C,OAjED,aAECp5C,qEAGoB,YAAO,mBAAaq5C,EAAWx4C,EAAxB,QAAiCy4C,EAAWz4C,EAA5C,UAG3Bb,6DAGa,YAAO,OAAAq5C,EAAWx4C,SAAX,MAHpBb,WAIa,YAAO,OAAAs5C,EAAWz4C,SAAX,MAJpBb,WAKa,YAAO,OAAAq5C,EAAWx4C,SAAX,MALpBb,WAMa,YAAO,OAAAs5C,EAAWz4C,SAAX,MAGpB,IAAM04C,EAAN,GACAv5C,+DAGY,YAAO,OAAAq5C,EAAWx4C,EAAX,MAHnBb,UAIY,YAAO,OAAAs5C,EAAWz4C,EAAX,MAJnBb,WAKa,YAAO,OAACi5C,GAAe,GAAoBE,EAAYt4C,EAAb,WAAnC,KALpBb,4BAOO,SAAUa,GACf,IAAMsf,EAAOngB,yBAAb,WA2VJ,cACC,WAAIqb,UAEGA,EAAA,MAAU,YAChB,OASF,EATuBvM,KASvB,EATE,GAUQ0M,EAAOD,IAAOA,EAAdC,OAA0BA,IAAOA,EAAPA,MAAkBD,EAA5CC,GAAoDA,IAAOD,IAAOA,EAAlEC,QAA+EA,IAAOA,EAAPA,OAAmBD,EAA3G,GADD,YAvWSH,CAAc+E,EAAM1xB,cAAzB,MACC8qD,EAAS14C,EAAT04C,aAVHv5C,mBAaqB,YAAO,QAAEu5C,EAAS14C,EAAX,UAG7B,cACC,aAAIm4C,EAA0Br5C,EACvBq5C,mBAAP,GAGD,cACC,aAAIA,EAA0Bn5C,EACvBm5C,mBAAP,GA4BD,gBACC96C,gCACKA,EAAL,QAAmBi4B,4BACnBt1B,KAAOA,EAAPA,EACAA,KAAOA,EAAPA,EACAA,SAAWb,wBAAXa,UACAb,yCAGD,gBAlCA,MAKA,EA8BCa,MAnCD,EAmC0B3C,cAAzB2C,QAlCA,MAAIm4C,EAA0Br5C,EACvBq5C,oBAAP,IAkCAn4C,MA/BD,EA+B0B3C,cAAzB2C,QA9BA,MAAIm4C,EAA0Bn5C,EACvBm5C,oBAAP,IAgCD,cACM96C,EAAL,QAAmBi4B,iBAgCpB,oB,IAAkBrpB,EAAK,QAAEC,EAAK,QAAMxN,EAAM,SAAED,EAAK,QAAkBk6C,EAAe,aACjF9gC,IACAugC,KACA,IAAMrpD,EAAS,OAAAoQ,EAAA,MAAiB,YAAO,OAAAW,OAAOE,EAAP,UACnCjR,OAAcA,EAAlB,KAA6BqpD,MAC7BE,YAGI55C,IAAW25C,EAAX35C,QAAqCD,IAAU45C,EAAnD,OACCl5C,oBACCiZ,EADDjZ,UAECA,eAA0BV,EAA1BU,EAAqCT,EAArCS,SAAuDg5C,YAFxDh5C,IAKDA,2DAGc,YAAO,OAAAa,EAAA,SAHrBb,MAKE,YACC,OAAAuP,EAAA,2CAGc,cACZ,IAAM0F,EAAW,OAAH,IAAG,CAAH,eACVpU,IACH44C,GAAI,KACJC,GAAI,OAEDnwC,WAAJ,GACCg1B,QAEAA,QAZH,gBAekB,eAyFtB,cAECv+B,0CAES,SAAU6B,GACjB,OAAOhB,IAAP,KAHFb,MAKO,Y,oHAEM,O,sBAAA,GAAM8N,uEAAN,O,cAAA,EAAJ6rC,OACAC,KAGNC,mBAEO,YAAO,OAAA/rC,EAAA,8BAAgC,YAAO,OAAA4K,EAAW7X,EAAX,kBAFrDg5C,MAGO,YAAO,OAACD,EAAO/4C,EAAP+4C,OAAD,MAEd55C,sDAEqB,YAAO,gBAAOa,EAAPM,UAF5BnB,uBAGyB,YAAO,eAAOa,EAAPM,UAElB24C,EAAR/sC,GAGNA,+DAAwE2L,EAAW7X,EAAnFkM,aAEAqsC,IACAjjB,S,8DArHE4jB,CAAc77C,EAAd67C,MAhBF,eAkBiB,eA6HrB,cAEC/5C,wCAEO,YACL8N,2DAGe,YAAO,OAAA4K,EAAW7X,EAAX,kBAGxBb,6DACc85C,EAAd,GACA/sC,2FACAqsC,IACAjjB,YA3IK6jB,CAAa97C,EAAb87C,MAnBF,KAqBOh6C,kDArBP,UAuBO,YAUL,OATAuP,4FAIY,YAAO,OAAC0pC,EArL1B,EAqLuDE,EAAYt4C,EAA1C,cAJnB0O,aAKe,YAAO,OAAAmJ,EAAW7X,EAAX,eALtB0O,eAMiB,YAAO,OAAChG,sBAAD,WANxBgG,qBAOuB,YAAO,OAAChG,gBAAD,KAE9B,QAEH,YAUC,OATAiG,sCAEY,YACV,OAAOypC,EAhMb,EAgM0CE,EAAYt4C,EAAhD,cAHF2O,aAKe,YAAO,OAAAkJ,EAAW7X,EAAX,eALtB2O,eAMiB,YAAO,OAACjG,sBAAD,WANxBiG,qBAOuB,YAAO,OAACjG,gBAAD,KAE9B,KAED,YACC,OAAOkG,EAAP,YAIHzP,6DAGc,YAAO,OAAAa,EAAA,SAHrBb,MAKE,YACC,OAAAuP,EAAA,yCAGO,YAAO,OAAA1O,EAAA,SAHd,0EAOD,YAAY,OAAA2O,KACZ,YAAU,OAAAC,EAAA,YAIZzP,mGAKc,YAAO,OAAAa,EAAA,OALrBb,MAOE,YAAW,OAAAuP,EAAA,kBACX,YAAY,OAAAC,KACZ,YAAU,OAAAC,EAAA,YAIZ0mB,gBAEC,OAAAn2B,EAAA,UAAuB,YAAO,OAAAa,EAAA,OAG/Bs1B,kBAEC,OAAAn2B,EAAA,aAAyB,YAAO,OAACi5C,EAnPnC,EAmPgEE,EAAYt4C,EAA1C,eAGjCs1B,WACAA,qBAwED,IAAM0jB,EAAsB,SAACh5C,GAC5B,IAAMkM,EAAQ+sC,EAAd,GACMG,EAAU,IAAhB,IASA,OAPAA,SAEAltC,QAAW,YACVktC,MAAYrsC,EAAZqsC,QACAA,MAAYrsC,EAAZqsC,WAGM,OAAAj6C,EAAA,8CAIE,SAAUyN,GACjB,OAAOwsC,MAAP,OAUGH,EAAoB,SAACj5C,GAC1B,OAAO,OAAAb,EAAA,iDAIE,SAAUgO,GACjB,OAAOA,cAAkBA,WAAzB,MA2BH,MAAO,CACNwB,OAjBD,Y,IAA0BjmB,EAAI,OAAE6V,EAAU,aAAEhU,EAAO,UAAEme,EAAS,YAC7D,KA7PD,c,IAAsBhK,EAAM,SAAED,EAAK,QAClCU,uBACAA,+CACAA,+CACAA,gDAEAg5C,OACA7iB,eAEA+iB,EAAkB,CAAE35C,OAAF,EAAUD,MAAK,GACjCU,oBAAoBiZ,EAApBjZ,UAAoCA,eAA0BV,EAA1BU,EAAqCT,EAAzES,IAoPCs6B,CAAK/wC,EAAL+wC,GACAP,MAEDvqB,EAAOjmB,EAAM6V,EAAYhU,EAAzBokB,IAaAmsB,MAPD,WACC37B,uCACAm2B,WC/WK,I,GAAM+jB,GAAW,SAAC,G,IAAE38B,EAAQ,WAAEne,EAAU,aAAE7V,EAAI,OAAE+d,EAAmB,sBACnEkF,EAASC,mBACTG,EAAeH,mBAMbgwB,EAAmB2J,GAAS,CACnC55B,OADmC,EAEnCI,aAFmC,EAGnCrjB,KAHmC,EAInC6V,WAJmC,EAKnChU,QATe6C,mBAAQ,WACvB,MAAO,CAAEyqB,WAAY6E,KACnB,CAFH,IAUCugB,MANmC,GAOnCtB,SAPmC,GAQnC2d,kBAAkB,OAAA7yC,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,oBAAyC,IARpDm1B,eAWR,OACCrrC,YAAC8a,IAAMC,cACLswB,EACDrrC,mBAAKF,IAAKkpD,GAAU96C,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,E,UAAgB,kBAC5Fpb,iBAAGse,IAAK9C,OAMNwtC,GAAWlpD,YAAG,mXCrBpB,SAAgBmpD,GAAgBznC,G,MAAE+Y,EAAa,gBAAEvsB,EAAU,aAAE7V,EAAI,OAAE8d,EAAa,gBAAEC,EAAmB,sBAC9F,EAAoC3K,mBAAS,CAAEmQ,MAAF,GAAaC,MAAO,KAAhEnB,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GACA8kC,EAAU7tC,iBAAOzM,YAAvB,QACMu6C,EAAU9tC,iBAAOzM,YAAvB,QA6FA,OA3FA5C,qBAAU,WAOT,GALA,KAAI,OAAA7T,QAAI,IAAJA,OAAA,EAAAA,EAAA,SACHisB,EAAiB,CAAE1I,MAAF,GAAaC,MAAO,KAIjCxjB,IAASA,eAAI,IAAJA,WAAd,QAEA,IAAMixD,EAAN,GACAF,2CAGU,YAAa,OAACE,EAAc35C,EAAd25C,OAAD,KAEvB,IAAM1tC,EAAN,GACMC,EAAN,GAGAxjB,iBAAmB,Y,MAClB,EADqB4X,EAAK,QAAEs5C,EAAW,cAAE/vD,EAAQ,WAE3CgwD,EAA2BC,QAAlB,EAAGtzC,eAAa,IAAbA,WAAeszC,2BAAjC,iBACMC,EAAclwD,eAAQ,IAARA,WAApB,GAICmwD,GADGvzC,eAAmB,IAAnBA,WAAJ,kBACCuzC,IACWvzC,eAAmB,IAAnBA,WAAD,sBAAJ,GACMszC,GAEZC,EAID,IAAMC,EAAWN,EAAjB,GACA,GACCM,cACAhuC,QAEAA,KAAe,CAAE3L,MAAF,EAAS05C,UAAWA,OAKjC,OAAAvzC,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YAECg+B,SAAqB,CAAC,EAAGpiC,gBAAzBoiC,IACApiC,iBAAmB,cAClBujB,EAAMjM,EAANiM,yBAID6e,SAAqBpiC,EAAA,WAAe,YAAO,OAAAsX,EAAA,UAC3CtX,iBAAmB,YAClBujB,EAAMjM,EAANiM,kBAA4BjM,EAA5BiM,UAKFvjB,iBAAmB,Y,IAAG+kB,EAAK,QAAED,EAAK,QAC3BlO,EAASmO,MAAf,EACIxB,MAAgBA,EAApB,KACCC,KAAa,CAAEyD,OAAQ1D,EAAV,GAAwB2D,OAAQ3D,EAAhC,GAA8C3M,IAAKA,OAKlEm6C,gCAEO7rD,cAFP6rD,IAE6B,YAAa,OAAAz5C,EAAA,SAF1Cy5C,MAIE,YAAW,OAAA/qC,EAAA,oBAAyB,YAAa,OAAA1O,EAAA,YACjD,YAAY,OAAA2O,KACZ,YAAU,OAAAC,EAAA,YAGZ8qC,gCAEO9rD,cAFP8rD,IAE6B,YAAa,OAAA15C,EAAA,OAF1C05C,MAIE,YAAW,OAAAhrC,EAAA,oBAAyB,YAAa,OAAA1O,EAAA,UACjD,YAAY,OAAA2O,KACZ,YAAU,OAAAC,EAAA,YAGZ+F,EAAiB,CAChB1I,MAAOwtC,2BADS,OAEhBvtC,MAAOwtC,uCAEN,CAAChxD,EAAM+d,EAAqBD,EAzF/BjK,KA2FsB0P,QAAf,SAAAlB,QAAa,IAAbA,OAAA,EAAAA,EAAekB,4BAAf,UACN,sBACCvjB,KAAMqiB,EACNxM,WAAYA,EACZme,SAAUoO,EACVrkB,oBAAqBA,IAGtB,uBACCqE,MAAO,oBACPF,KAAM,eACNK,YAAa,oFC1GT,ICtBDzG,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAf,QAEa/mB,GAAS,CACrB2R,IADqB,kBAErBgB,MAFqB,mBAGrBsK,KAHqB,QAIrBC,QAJqB,GAKrBM,SALqB,GAMrBC,MDakC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAAEhC,EAAK,QACzF,OACClU,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,UACP9G,MAAOA,EACPnE,MAAO,mBACPkG,cAAeA,E,UACP,qCAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,UACP9G,MAAOA,EACPnE,MAAO,kBACPkG,cAAeA,E,UACP,qCAGVjW,YAACi6B,QACAj6B,YAAC6tC,IACAj4B,UAAWA,EACX7F,MAAO,iCACP6b,aAAc,mBACd1V,oBAAqBA,KAGvBlW,YAACi6B,QACAj6B,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,+BACPhV,OAAQ,CAAC,EAAG,EAAG,GAAI,IAAK,KACxB++B,aAAc,EACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,mBAEf5rB,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,gBACPhV,OAAQ,CAAC,GAAI,IAAK,IAAM,IAAM,IAAM,IAAM,IAAO,KACjD++B,aAAc,IACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,iBAMnB5rB,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,sCCnFfrT,MAPqB,GAQrBC,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX61C,SADW,IAEXsb,eAFW,EAGXtwD,SAAU,OAKdwyB,2BAA4B,WAC3B,MAAO,CACN+9B,kBADM,EAENviC,WAAY/qB,GAAwB,kBAGtCiT,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IC/BIE,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAf,QAEa/mB,GAAS,CACrB2R,IADqB,gBAErBgB,MAFqB,gBAGrBsK,KAHqB,QAIrBC,QAJqB,GAKrBM,SALqB,GAMrBC,MCagC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAAEhC,EAAK,QACvF,OACClU,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,aACP9G,MAAOA,EACPnE,MAAO,mBACPkG,cAAeA,E,UACP,sCAGVjW,YAACi6B,QACAj6B,YAAC6tC,IACAj4B,UAAWA,EACX7F,MAAO,iCACP6b,aAAc,mBACd1V,oBAAqBA,KAGvBlW,YAACi6B,QACAj6B,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,+BACPhV,OAAQ,CAAC,EAAG,EAAG,GAAI,IAAK,KACxB++B,aAAc,EACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,mBAEf5rB,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,gBACPhV,OAAQ,CAAC,GAAI,IAAK,IAAM,IAAM,IAAM,IAAM,IAAO,KACjD++B,aAAc,IACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,iBAMnB5rB,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,sCD1EfrT,MAPqB,GAQrBC,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACX61C,SADW,IAEXsb,eAFW,EAGXtwD,SAAU,OAKdwyB,2BAA4B,WAC3B,MAAO,CACN+9B,kBADM,EAENviC,WAAY/qB,GAAwB,kBAGtCiT,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IEhCIE,GAAQ,CAAC+G,IAAf,aACM9G,GAAQ,CAACiQ,IAAf,QAEa/mB,GAAS,CACrB2R,IADqB,gBAErBgB,MAFqB,mBAGrBsK,KAHqB,QAIrBC,QAJqB,GAKrBM,SALqB,GAMrBC,MCegC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEC,EAAmB,sBAAEhC,EAAK,QACvF,OACClU,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,UACP9G,MAAOA,EACPnE,MAAO,mBACPkG,cAAeA,E,UACP,qCAETjW,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAO,CAAC+G,IAAD,UACP9G,MAAOA,EACPnE,MAAO,kBACPkG,cAAeA,E,UACP,qCAGVjW,YAACi6B,QACAj6B,YAAC6tC,IACAj4B,UAAWA,EACX7F,MAAO,iCACP6b,aAAc,mBACd1V,oBAAqBA,IAEtBlW,YAAC++C,IACAnpC,UAAWA,EACXoE,UAAW,EACX9F,MAAO,CAACiQ,IAAD,SACPpU,MAAO,gBACPkG,cAAeA,E,UACP,mCACR2V,aAAc,WACdxW,YAAY,KAGdpV,YAACi6B,QACAj6B,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,+BACPhV,OAAQ,CAAC,EAAG,EAAG,GAAI,IAAK,KACxB++B,aAAc,EACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,mBAEf5rB,YAAC65B,IACAjkB,UAAWA,EACX7F,MAAO,gBACPhV,OAAQ,CAAC,GAAI,IAAK,IAAM,IAAM,IAAM,IAAM,IAAO,KACjD++B,aAAc,IACd9nB,eAAgB,YAAU,OAAA23C,OAAA,IAC1B3vB,cAAe,YAAU,OAAA3nB,GACzB4D,cAAeA,EACf2V,aAAc,iBAMnB5rB,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,sCD/FfrT,MAPqB,GAQrBC,MARqB,GASrB+G,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KAAD,KAA6BA,KADnC,MAER7B,WAAY,CACX61C,SADW,IAEXsb,eAFW,EAGXtwD,SAAU,OAKdwyB,2BAA4B,WAC3B,MAAO,CACN+9B,kBAAkB,IAGpBr6C,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IEpCI+1C,GACO,aAGAC,GAAeD,GCctB/R,GAAatgD,wBAAwC,CAAC,GAA5D,KAKaugD,GAAc,SAAC92B,GACrB,MAAgB3V,qBAAfkP,EAAG,EAAJ,GAAMw9B,EAAM,EAAZ,GACAC,EAAS78B,mBACT,EAAwD9P,mBAAxD,iBAACgtC,EAAuB,EAAxB,GAA0BC,EAA0B,EAApD,GACA,EAAsCjtC,wBAAtC,GAAC0tC,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GACA,EAAwB3tC,mBAAxB,IAEAqC,EAAkC,CACvC,CACC6M,IADD,EAECy9B,OAFD,EAGCK,wBAHD,EAICU,eAJD,EAKC+Q,QARY,EAAR,IAUL,CACC/R,OADD,EAECO,2BAFD,EAGCU,kBAHD,EAIC+Q,WAdwB,EAApB,KAkBN,OAAO,kBAAClS,GAAD,sBAAqBnqC,MAAOA,GAAnC,KAGYisC,GAAgB,WAC5B,IAAM/oC,EAAUmJ,qBAAhB,IACA,MACC,MAAM,IAAIpb,MAAV,mDAED,UCpDKqrD,GAAS,CAAC,UAAW,UAAW,UAAW,UAAW,UAA5D,WAGaC,GAAiB1pD,IAAvB,MCiBD2pD,GAAoB3yD,wBAAwC,CAAC,GAAnE,KAKa4yD,GAAqB,SAACnpC,GAC5B,MAAsC3V,qBAArC++C,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GACA,EAAsCh/C,qBAArCi/C,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GACA,EAAgDl/C,qBAA/Cm/C,EAAmB,EAApB,GAAsBC,EAAsB,EAA5C,GACA,EAAgBp/C,mBAAhB,GAACktC,EAAG,EAAJ,GAAMC,EAAM,EAAZ,GACA,EAAgBntC,mBAAhB,GAACiT,EAAG,EAAJ,GAAMu6B,EAAM,EAAZ,GACA,EAA0CxtC,mBAA1C,IAACq/C,EAAgB,EAAjB,GAAmBC,EAAmB,EAAtC,GACA,EAAwDt/C,qBAAvDu/C,EAAuB,EAAxB,GAA0BC,EAA0B,EAApD,GAEN/+C,qBAAU,W,MACHjR,EAAmBsC,QAAb,EAAaA,cAAcitD,eAAc,IAAdA,IAAdjtD,mBAAzB,GACMmB,EAASoQ,YAAf,GACM6pC,EAAMj6C,eAAM,IAANA,WAAZ,GACMggB,EAAMhgB,eAAM,IAANA,WAAZ,GACAk6C,KACAK,OACE,CAPH/sC,IASAA,qBAAU,W,QACH2sC,EAAW,CAAC,QAAS,CAAC,MAAX,SAAwDqS,QAAxD,EAA4CtvD,QAA5C,EAA4B8uD,eAAc,IAAdA,WAAgB9uD,iCAAYsvD,sBAAxD,EAAjB,IACA3tD,YAAYitD,eAAc,IAAdA,IAAZjtD,aAA0C,Y,SAErBkS,QAApB,EAAK3B,IADS08C,EAAd,IACoB/6C,aAAgC7T,QAAhC6T,EAAgBi7C,eAAc,IAAdA,WAAgB9uD,iCAAhC6T,uBAApB,KACCopC,OAASppC,OAATopC,IACAA,eAGFA,WACAoS,OACE,CAACT,EAXJt+C,IAaAA,qBAAU,WACT,IAAIytC,EAAaj7B,EAAjB,GACIi7B,KAAkB/pC,MAAlB+pC,IAAgC/pC,MAApC,MAAgD+pC,KAGhD,IAFA,IAAMC,EAAOlrC,UAAUirC,EAAvB,GACId,EAAJ,GACS9pC,EAAT,EAAgBA,EAAhB,EAAuBA,IAAK,CAC3B,IAAM8qC,EAAQD,IAAd,EACMlvB,EAAWmvB,IAAjB,EACAhB,OAAS,CAAEnuB,SAAF,EAAsBovB,SAAtB,EAAuCjrC,MAAOu7C,GAAOr7C,KAE/D8pC,EAAMA,EAAA,MAAS,cACd,OAAI7H,WAAaD,EAAjB,WACSC,WAAaD,EAAjB,YACO,KAEb8Z,OACE,CAAClS,EAhBJzsC,IAkBAA,qBAAU,cAAVA,IAEAA,qBAAU,WACT,IAAM2sC,EAAW,CAAC,QAAS,CAAC,MAA5B,UACAt7C,YAAYitD,eAAc,IAAdA,IAAZjtD,aAA0C,YACzC,IAAMuQ,EAAQ2B,OAAO+6C,EAArB,IACI1uD,EAAJ,EACA,IAAKA,EAAL,EAAgBA,EAAQ8uD,EAAxB,OAAoD9uD,IACnD,GAAIgS,GAAS88C,KAAT98C,UAAgDA,GAAS88C,KAA7D,SAAkG,CACjG/R,OAASppC,OAATopC,IACAA,OAAS+R,KAAT/R,OACA,UAIHA,WACAkS,OACE,CAACpS,EAAKj6B,EAAK8rC,EAfdt+C,IAiBA,IAAM4B,EAAkC,CACvC,CACC08C,eADD,EAEC7R,IAFD,EAGCj6B,IAHD,EAICgsC,eAJD,EAKCE,oBALD,EAMCE,iBAND,EAOCE,wBAAuB,GAExB,CACCL,kBADD,EAECE,uBAFD,EAGCJ,kBAAiB,IAInB,OAAO,kBAACH,GAAD,sBAA4Bx8C,MAAOA,GAA1C,KAGYq9C,GAAuB,WACnC,IAAMn6C,EAAUmJ,qBAAhB,IACA,MACC,MAAM,IAAIpb,MAAV,gEAED,UCxHM,IAKMqsD,GAAgB,YAAhBA,GAEJ,SCPT,IAAMC,GACI,CACRC,QADQ,GAERC,QAFQ,GAGRC,UAAW,ICJN,IAAMtR,GAAc,wBAAdA,GAAc,sBAAdA,GAAc,2BAAdA,GAMY,yBCJnBuR,GAAc,CAEnBvR,GACAA,GACAA,GACAA,GALD,iB,SCAwBwR,GAAyBhqC,G,IAAE04B,EAAS,YACrDt+C,EAAQ2vD,WAAd,GACA,OAAOA,GAAY3vD,EAAnB,G,SCMuB6vD,GAAgBjqC,G,IACvC+4B,EAAU,aACVL,EAAS,YACTwR,EAAW,cACXC,EAAO,UACPC,EAAO,UAQEnxC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,GACAyO,WACC,CACCsF,GADD,EAEC7iB,KAFD,OAGCkiB,OAHD,EAIC,eAJD,EAKCvH,OALD,GAMCykC,MAAO,CACN,aADM,OAEN,eAAgB6O,GAA0BC,SAE3CO,QAVD,EAWCC,QAAO,GAERJ,GAAyB,CAAEtR,UAAS,OAEnC,CAACz/B,EAAK8/B,EAAYL,EAAW0R,EAASD,EAlBzC3/C,I,SCrBuCwV,G,IACvC+4B,EAAU,aACVL,EAAS,YACTyR,EAAO,UACPC,EAAO,UAOEnxC,EAASo/B,QAATp/B,IACH,EAAuEwwC,KAAtEvwD,IAAD,GAAG8vD,EAAc,EAAjB,eAAmBM,EAAuB,EAA1C,wBAAgDL,EAAiB,KAAjE,kBAEAoB,EAAcn2C,uBAAY,WAC/B,IAAMmS,EAAOpN,EAAb,UACA,OAAIoN,MAAmBA,GAAvB,IAKE,CAACpN,EAAKkxC,EAPT,IASA3/C,qBAAU,WACT,OACeyO,YAAf,IAEcA,WAAd,IACA,CACA,IAAMygC,EAAc,SAACprC,GACpB,GAAK+7C,IAAL,CACA,IACMhT,EADWp+B,EAAA,sBAA0B3K,EAA1B,MAAmC,CAAEqrC,OAAQ,CAACjB,KAC/D,GACAuQ,OAGD,OADAhwC,oBACO,WACNA,yBAEC,CAACA,EAAKoxC,EAAa3R,EAAWuQ,EAhBjCz+C,IAkBAA,qBAAU,WACT,GACAyO,oCAAgDqwC,eAAuB,IAAvBA,IAAhDrwC,MACE,CAAC+vC,EAAgB/vC,EAAKqwC,EAHzB9+C,IDAA8/C,CAAgB,CAAE5R,UAAF,EAAwBK,WAAxB,EAAgDoR,QAAhD,EAAyDC,QAAO,I,SEzC5CpqC,G,IAAE04B,EAAS,YACxC,EAAoBL,KAApB,GAAEp/B,EAAG,EAAL,IAAOuvC,EAAO,EAAd,QAEPh+C,qBAAU,WACT,MACcyO,WAAd,GACA,CACA,IAAM0/B,EAAa6P,IAAYF,GAAZE,UAAnB,OACAvvC,yCACE,CAACuvC,EAASvvC,EANbzO,IFuCAiuC,CAAa,CAAEC,UAAS,I,SG1CsB14B,G,IAAE+4B,EAAU,aAAEL,EAAS,YAC5Dz/B,EAASo/B,QAATp/B,IACAmwC,EAAsBK,QAAtBL,iBAGT5+C,qBAAU,WACT,OACeyO,YAAf,IAEcA,WAAd,IAEA,IACCA,qCACC,aAGA,CAACA,EAAK8/B,EAAYL,EAXrBluC,IHsCA+/C,CAAuB,CAAExR,WAAF,EAAcL,UAAS,I,SIxCvB8R,GAAgBxqC,G,IACvC+4B,EAAU,aACVL,EAAS,YACTwR,EAAW,cACXC,EAAO,UACPC,EAAO,UAQEnxC,EAASo/B,QAATp/B,IAETzO,qBAAU,WACT,GACAyO,WACC,CACCsF,GADD,EAEC7iB,KAFD,OAGCkiB,OAHD,EAIC,eAJD,EAKCvH,OALD,GAMCykC,MAAO,CACN,aAAc77C,IADR,MAEN,eAFM,GAGN,aAAc,GAEfkrD,QAXD,EAYCC,QAAO,GAERJ,GAAyB,CAAEtR,UAAS,OAEnC,CAACz/B,EAAK8/B,EAAYL,EAAW0R,EAASD,EAnBzC3/C,I,SCZuBigD,M,WCLd,IAAAxxC,EAASo/B,QAATp/B,IAGTzO,qBAAU,WACT,KAQA,OAPkByO,YXVb,8BWWUA,eXXV,6BWYLA,YXZK,4BWYoC,CACxCvd,KADwC,SAExCgvD,MAAO,CAFiC,6DAGxC9N,YAAY,IAEN,eACL,CAVHpyC,IAaAA,qBAAU,WACT,KAQA,OAPkByO,YXtBb,4BWuBUA,eXvBV,2BWwBLA,YXxBK,0BWwBkC,CACtCvd,KADsC,SAEtCgvD,MAAO,CAF+B,4DAGtC9N,YAAY,IAEN,eACL,CAVHpyC,IDVAmgD,GACAH,GAAgB,CACfzR,WVbK,4BUcLL,UAAWF,GACX0R,YAAaR,GACbS,QAJe,EAKfC,QAAS,IAEVI,GAAgB,CACfzR,WVnBK,0BUoBLL,UAAWF,GACX0R,YAAaR,GACbS,QAJe,EAKfC,QAAS,KAEVH,GAAgB,CACflR,WV3BK,4BU4BLL,UAAWF,GACX0R,YAAaR,GACbS,QAJe,EAKfC,QAAS,IAEVH,GAAgB,CACflR,WVjCK,0BUkCLL,UAAWF,GACX0R,YAAaR,GACbS,QAJe,EAKfC,QAAS,K,SE9BajQ,GAAMn6B,G,IAAEo6B,EAAK,QAAEC,EAAU,aAChD,OAAO,sBAASD,MAAOA,EAAOC,WAAYA,IAG3C,I,GAAMC,GAAU,+GAAU,oBAC6C,sBACC,UADxD,YAAmB,OAAC56B,aAAmBA,EAAnBA,MAAD,KAClB,YAAmB,OAACA,eAAuBA,EAAxB,S,SCPZ66B,GAAKv6B,G,IAAEq6B,EAAU,aACxC,OAAO,sBAASA,WAAYA,IAG7B,I,GAAMC,GAAU,uHAAU,mBACC,gBACsC,eACD,SAFjDr7C,IADC,OAEL,YAAmB,OAACygB,oBAAD,SACpB,YAAmB,OAACA,mBAAD,U,SCHLkrC,KACd,IAAA7T,EAA6BsB,QAA7BtB,wBACF,EAAsC0S,KAAtC,GAAET,EAAc,EAAhB,eAAkBF,EAAc,EAAhC,eACD,EAA8B/+C,mBAA9B,GAAC2xC,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACQC,EAAY7xC,mBAApB,MACA,EAA0BA,qBAAzB8gD,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GACA,EAA4B/gD,qBAA3BghD,EAAS,EAAV,GAAYC,EAAY,EAAxB,GAqBN,OAnBAxgD,qBAAU,W,YACT,MACA,IAAMub,EAASg0B,kBAAf,GACM8Q,EAA6BhY,QAArB,EAAW4H,QAAX,EAAG10B,eAAM,IAANA,WAAQ00B,+BAAU5H,kCAAnC,GACMkY,EAA8BlY,QAArB,EAAW4H,QAAX,EAAG10B,eAAM,IAANA,WAAQ00B,+BAAU5H,kCAApC,GACAmY,KACAF,QACE,CAPHtgD,IASAA,qBAAU,W,QACHygD,EAAwB/wD,QAAnB,EAAG8uD,eAAc,IAAdA,WAAgB9uD,uCAC9ByhD,EAAc5tC,OAAqB,QAAf,EAAC+6C,eAAc,IAAdA,WAAc,kBAAnCnN,MACE,CAACqN,EAHJx+C,IAKAA,qBAAU,W,MACH4B,EAAwBlS,QAAnB,EAAG8uD,eAAc,IAAdA,WAAgB9uD,2DAC9B0hD,OACE,CAHHpxC,IAKA,EAEC,0BACC8O,0BADD,cAEC,sBAAO8gC,MAAO,MAAOC,YAAY,IACjC,sBAAMA,YAAY,IAClB,sBAAOD,MAAO,MAAOC,YAAY,IACjC/gC,0BACCA,0BAAWy9B,EAA0BA,EAAH,IADnCz9B,gBAECA,0B,SC7CkC+O,GACrC,IACC,OAAOza,cAAP,OACC,SACD,UDyCUs9C,CAPV,KASC5xC,0BACCA,0BADDA,aAECA,0BAXF,IAaCA,0BACCA,0BADDA,cAECA,0BAhBH,KAD4B,KAuB7B,I,eAAMghC,GAAU,+KAAU,2GAMC,SAAZr7C,IANf,OAQMy7C,GAAM,qFAAU,2BAGhB7wC,GAAQ,sMAAU,4IAQlB8wC,GAAW,kMAAU,wIASrBC,GAAQ,4KAAU,kHEhFlBG,GAAgB,SAAC3uC,GACtB,OAAI8B,MAAJ,SACS9B,IAAJ,IAA+B,MAC7BwB,cAAP,YAGD,SAAwBmb,K,MACdy/B,EAAanQ,QAAbmQ,QACAU,EAAyBO,QAAzBP,oBACH,EAA8Bn/C,mBAA9B,IAACohD,EAAU,EAAX,GAAaC,EAAa,EAA1B,GAEN5gD,qBAAU,WACT4gD,EAAclC,eAAmB,IAAnBA,IAAdkC,MACE,CAAC5C,EAFJh+C,IAIA,IAAM0uC,EAAkB79C,mBAAQ,WAC/B,OAAO,qBAAqB,cAC3B,OAAIi0C,WAAaD,EAAjB,WACSC,WAAaD,EAAjB,YACO,OAEX,CANH,IAQA,OAAImZ,IAAYF,GAA6B,KAE5C,0BACC,0BACC,sBAAelO,MAAO,QACrB,OAAAlB,QAAe,IAAfA,OAAA,EAAAA,EAAA,KAAqB,cAAqC,OAC1D,kBAAC5/B,IAAD,UAAgB/L,IAAKnT,GACpBkf,qBADD,MAEC,sBAAY2hC,WAAYC,EAAK/tC,YAG/BmM,qBATF,OAWC,sBAAiB8gC,MAAO,QACxB,0BACElB,EAAA,KAAoB,cAAqC,OACzD,kBAAC5/B,IAAD,UAAgB/L,IAAKnT,GACpBkf,0BAAYyhC,GAAcG,EAD3B,WAEC,sBAAed,MAAO,YAGxB9gC,0BAAYyhC,GAA6B,QAAhB,EAAC7B,eAAe,IAAfA,YAAkB,OAAAA,QAAe,IAAfA,OAAA,EAAAA,EAAA,QAAH,yBApB5C,aAyBD,I,2BAAMiC,GAAY,iJAAU,uFAOtBC,GAAe,0FAAU,gCAOzBC,GAAgB,wFAAkB,oBACM,UAA9B,YAAmB,OAAA37B,EAAA,SAE7B47B,GAAkB,yFAAkB,qBACK,UAA9B,YAAmB,OAAA57B,EAAA,SAG9B46B,GAAU,mLAAU,6FAKC,2BAAZr7C,IALf,OASMs8C,GAAO,uHAAU,mDAGI,SAAZt8C,IAHf,OASMu8C,GAAa,wHAAU,mBAC0B,2CAAxC,YAAwB,OAAA97B,EAAA,cCpF1B2rC,GAAsB,SAAC,G,IACnC10D,EAAI,OACJ8d,EAAa,gBAEJiiC,EAAY2B,QAAZ3B,OACDqS,EAAsBU,QAAtBV,kBAYR,OAVAv+C,qBAAU,WACTu+C,EAAkBltD,iBAAlBktD,MACE,CAACA,EAFJv+C,I,SClBuCwV,G,IAAEvL,EAAa,gBAC9CuiC,EAA+BqB,QAA/BrB,2BAERxsC,qBAAU,W,UACHlR,EAA+CqB,QAAvC,EAA2B1D,QAA3B,EAAkBuB,QAAlB,EAAGic,eAAa,IAAbA,WAAejc,8BAASvB,iCAAY0D,4CAArD,GACAq8C,OACE,CAACviC,EAHJjK,IDmBA2xC,CAAgB,CAAE1nC,cAAa,IElBhC,WACO,MAA2B4jC,KAAxB3B,EAAM,KAAT,OAAeD,EAAM,KAArB,OAENjsC,qBAAU,W,MACT,MACA4xC,iBARF,4FAUE,IAAM5jD,EAAU,CACfutB,OAAQ,CACPs2B,KADO,QAEPC,IAAK,SAEN5xC,UAAmB4c,QAAV,EAAEovB,eAAM,IAANA,WAAQpvB,uBALJ,UAMf1a,MANe,mCAOf2vC,aAPe,cAQfl2B,KARe,EASfm2B,oBATe,EAUf8O,QAAS,IAEJzoB,EAAI,IAAI,GAAJ,IAAV,GACAA,aAAa,WACZ4T,WAEC,CAACA,EApBJjsC,IFgBAiyC,GAGAgO,KAGCjsD,mBAAKF,IAAKitD,IACT/sD,mBAAKF,IAAKm/C,GAAU3gC,IAAK45B,IACzBl4C,YAACosD,SACDpsD,YAACuqB,GAJH,QASK00B,GAAWn/C,YAAG,+FAKditD,GAAejtD,YAAG,qJGzCjB,ICGDoU,GAAQ,CAACiQ,IAAf,UAEa/mB,GAAS,CACrB2R,IADqB,iBAErBgB,MAFqB,iBAGrBsK,KAHqB,QAIrBvE,OAJqB,GAKrBwE,Q,SCToCkH,G,IAAErpB,EAAI,OAAE8d,EAAa,gBACzD,OACC,0BACC,0BACC,sBAAqB9d,KAAMA,EAAM8d,cAAeA,ODMnD2E,SANqB,GAOrBC,MDZiC,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAC5D,OACC,kBAAC6E,IAAD,cACC,sBACClF,UAAWA,EACX1B,MAAO,CAACiQ,IAAD,UACPpU,MAAO,oBACPkG,cAAeA,E,UACP,mCACR+oC,WAAY,eACZ5pC,YAAY,IAEb,sBACCQ,UAAWA,EACXoE,UAAW,EACX9F,MAAO,CAACiQ,IAAD,SACPpU,MAAO,mBACPkG,cAAeA,E,UACP,mCACR2V,aAAc,wBACdxW,YAAY,MCPflB,MARqB,GASrB+G,qBAAsB,YASrB,MARY,CACXjhB,QAAS,CACRvB,WAAY,CACX2C,UAAW,KAEZ5C,aAAc,OAAA8B,QAAkB,IAAlBA,OAAA,EAAAA,EAAA,KAAwB,YAAU,OAAAka,EAAA,WAKnDsX,2BAA4B,YAC3B,MAAO,CACNmzB,SADM,YAENC,YAFM,UAGNC,aAHM,EAIN73B,WAJM,OAKN83B,WALM,0BAMNC,aAAc,iGAGhB7vC,QAAS,YACR,OAAOuE,GAAiBC,EAAwB,GAAzCD,YAAP,IErCIi5C,IAAmBC,EAFJC,OAAhBD,cAEiC,EAAtC,GAUA,SAAgBE,GAAc77C,EACV87C,EACZC,EACA3+C,GACJ,OAAGA,EAAc,MAAO,CAACR,MAAD,EAASC,OAAT,EAAkBm/C,KAAK,GAE/C,IACMx8C,EADN,GACgBE,WAAhB,MACAF,OAAepC,QAAfoC,EACA,IAAMy8C,EAAUz8C,cAAhB,GAEM3C,EA2CV,SAAoBo/C,GAChB,OAAO/+C,SAAS++C,EAAT/+C,0BACAA,SAAS++C,EADhB,yBA5CeC,CAAf,GACMt/C,EA+CV,SAAmBq/C,GACf,OAAO/+C,SAAS++C,EAAT/+C,uBACNA,SAAS++C,EADV,wBAhDcE,CAAd,GAEA,MAAO,CACHv/C,MAAMw/C,GAAsBv/C,EAAQD,EADjC,GAEHC,OAAOw/C,GAAuBx/C,EAAQD,EAFnC,GAGHo/C,KAAKn/C,EAAOD,GAUpB,SAASw/C,GAAsBv/C,EAA/B,KACI,IAAMy/C,EAAiBp/C,UAAUA,cAAUA,WAA3C,IAEMq/C,EAAkBT,EAAD,IAAe5+C,KAAtC,GASMs/C,EALat/C,UAAUN,EAA7B,GAKA,EAEA,OAAOM,SAASA,YAAhB,GASJ,SAASm/C,GAAuBx/C,EAAhC,KACI,OAAOu/C,GAAsBx/C,EAAD,EAA5B,GC5DJ,IAAI6/C,GAAQb,EAAZ,KACK,GAAgBA,OAAhBD,aAQQe,GAAY,SAACpnB,EAAK6B,GAC9B,MAKA,EAuCA,EAwIA,OA9KAwlB,EAAc,kBACb,IAAMC,EAAmB9zC,WAAWA,eAApC,IACM+zC,EAAgBv/C,qBACT,CAAC,EAAEw/C,EADMx/C,wBAEV,CAACw/C,EAAD,UAAyBA,EAFrC,YAMAF,WAAgB,YACfG,IAJ8BF,KAC3B3/C,cAAc4/C,EADa,kBAK9B,IAAME,EAAc99C,GAAA,MACnB,YAAK,OAAA3B,EAAA,QAAUu/C,EAAV,aADN,EAGAC,UAAYC,EAAYD,EAAxBA,YAGD,IAAME,EAAUC,EAAWN,EAAD,IAA1B,GAMA,OAJAA,WAAgB,YACfG,UAAYE,EAAUF,EAAtBA,YAIA,UAAa,CAACngD,EAAd,YACS,WAAa,OAAO++C,GAAa,EAApB,MADtB,iBAGS,YAAoB,OAAAoB,EAAA,KAH7B,KAIOD,EAJP,gBAKW,YAA6B,OAAOC,EAAP,WALxC,aADD,MAiBDG,EAAa,kBAEZ,IAAMN,EAAmB9zC,WAAWA,eAApC,IAGIq0C,EAAJ,EACAP,WAAgB,YACfO,EAAUjgD,WAAiB6/C,EAA3BI,YAID,IACMC,EAAgB9/C,qBACP,CAAC,EADMA,UAER,CAACw/C,EAAD,YAHd,MAIAF,WAAgB,YACfG,UAAYK,EAAcL,EAA1BA,YAOD,IAHA,IAAIM,EAAJ,EACIC,EAAJ,EACIC,EAAJ,EACiB,MAAjB,EAAiB,IAAjB,OAAiB,IAAS,CAArB,IAAIC,EAAI,EAAR,GACEC,EAAa5B,GAAc2B,EAAD,KAAWA,EAAX,EAAkBV,EAAlB,KAAqCU,EAArE,SACAH,GAAaI,EAAbJ,KACAC,EAAWpgD,WAAkBugD,EAA7BH,OACAC,EAAYrgD,WAAmBugD,EAA/BF,QAID,IAAMG,EAAiB9gD,EAAvB,EACM+gD,EAAoBzgD,UAAUwgD,EAApC,GACME,EAAc1gD,WAApB,GAIM2gD,EAAchhD,EAHCK,SAASmgD,EAATngD,EAArB,GAIM4gD,EAAalhD,EAAnB,EACMmhD,EAAkB7gD,WAAxB,GACA,OAAOI,qBACI,CAAC,EADLA,UAEG,CAACw/C,EAAD,YA/BV,IAgCMkB,EAHN,KA+FM,CACNlxC,OAtCQ,kBACR,IAAWgwC,KAmBX,IAfA,IAAMmB,EAAgBC,EAAtB,OACIC,EAAJ,EACIC,EAAJ,EACIC,EAAJ,EAKMC,EAAU,SAACngD,EAAD,GACXA,WAAJ,GA/DF,cACC,IAAIogD,EAAY,OAAAjhD,EAAA,uBACI,aAAeiJ,YAAf,MAA4CA,YAA5C,EADJ,iCAGF,YAA6B,OAAOpI,EAAP,QAG3CogD,6CAEuBzB,EAFvByB,oBAGgB,YAAoB,OAAApgD,EAAA,SAHpCogD,uDAMO,YAAc,OAAOpgD,EAAP,QANrBogD,8CASsB,YAA6B,OAAOpgD,OAAP,QATnDogD,kBAUqB,YAClB,MAAO,aAAe,CAACpgD,EAAD,EAAMA,EAArB,cAAyCA,EAAzC,EAAP,OAXHogD,wBAgBAA,gDAGsB,YAA6B,OAAOpgD,OAAP,QAHnDogD,kBAIqB,YAClB,MAAO,aAAe,CAACpgD,EAAD,EAAMA,EAArB,cAAyCA,EAAzC,EAAP,OALHogD,4CAQwBzB,EARxByB,oBASiB,YAAoB,OAAApgD,EAAA,SAGrCogD,4FAMOL,EAAP,OAuBEM,CAAMrgD,EAANqgD,GAEDL,EAAgBhgD,EAAhBggD,Q,aAKA,IAAM53C,EAASo2C,EAAYuB,EAAD,IAA1B,GACA33C,YAAiB,SAAApI,GAAK,OAAAmgD,EAAQngD,EAAR,MAAtBoI,QAEA63C,IACAC,GAhBD,IAUOF,OAAmCC,GAX1C,K,KA8BAnlB,MAND,WACC37B,0CC/KWmhD,GAAkB,SAAC,G,IAAE/hD,EAAU,aAClC7V,EAAI,OACJ+d,EAAmB,sBACtBkF,EAASC,mBACT,EACkC9P,qBADjCwiD,EAAK,EAAN,GAAQiC,EAAQ,EAAhB,GAmCN,OA3BAhkD,qBAAU,WAWT,GAAI7T,MAAJ,EAA+C,CAC9C,IAAIi1C,EAD0C,EAI9C,IACCA,EARM4gB,GAAU5yC,EAAjB,SASC40C,MAGD5iB,aAEGp/B,EAFHo/B,OAGGp/B,EAHHo/B,UAKC,CAAC2gB,EAAO51D,EAAM6V,EAzBjBhC,IA4BChM,YAAC8a,IAAMC,cACN/a,mBACCkO,MAAOF,EAAWE,MAClBC,OAAQH,EAAWG,QAEnBnO,iBAAGse,IAAKlD,OC9BL,I,kBCCP,GCxBMnH,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,aAErBgB,MAFqB,qBAGrBsK,KAHqB,QAIrBC,QCMD,SAAiCkH,G,IAAE+Y,EAAa,gBAAEvsB,EAAU,aAAE7V,EAAI,OAAE+d,EAAmB,sBAAE7c,yBAAa,MAACwX,KAChG,EAAoCtF,mBAApC,MAACiP,EAAa,EAAd,GAAgB4J,EAAgB,EAAhC,GA8BN,OA3BApY,qBAAU,WACT,IAMA,EANMzN,EAAK,OAAApG,QAAI,IAAJA,OAAA,EAAAA,EAAA,aAAkB,SAAAsX,GAAG,OAAAA,EAAA,OAC1B+qB,EAAN,GACIriC,EAAJ,WAKI,OAAA+d,QAAmB,IAAnBA,OAAA,EAAAA,EAAA,cAAoC3Z,GAAxC,YACCg+B,SAAqB,CAAC,EAAGh8B,UAAzBg8B,IACApO,EAAW,cAAU,OAAAoO,EAAA,MAErBA,YACApO,EAAW,cAAU,OAAAoO,EAAc9qB,EAAd,OAItBtX,mBAAqB,cACpBqiC,OAAe,CACdlpB,KAAK7B,EADS,IAEdd,MAAMwd,EAAS1c,EAFD,GAGdwgD,QAAQxgD,EAAE2M,WAGZgI,QACC,CAACjsB,EAAMoiC,EAzBTvuB,KA2BO,OAAAwO,QAAa,IAAbA,OAAA,EAAAA,EAAA,UACN,sBAAiBriB,KAAMqiB,EAClBxM,WAAYA,EACZkI,oBAAqBA,IAE1B,uBACCqE,MAAM,gBACNF,KAAK,eACLK,YAAaC,KD5CfC,SALqB,GAMrBC,MFe6B,SAAC,G,IAAEjF,EAAS,YAAEK,EAAa,gBAAEhC,EAAK,QAAEiC,EAAmB,sBAC9Eg6C,EAAW,SAACzzC,GAAK,MAAM,CAAC1M,MAAM45C,OAAP,GAAiB/7C,MAAM6O,IACpD,OACCzc,YAACskB,SACAtkB,YAACukB,KACAxE,GAAG,OACHxF,MAAM,OACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAAC+Z,IACAnE,UAAWA,EACXoE,UAAW,EACX/F,MAAOA,EACPlE,MAAM,WACNkG,cAAeA,IAEhBjW,YAAC84B,IACAljB,UAAWA,EACXK,cAAeA,EACf2kB,aAAc,GACd7qB,MAAO,aACPopB,cAAc,aAGhBn5B,YAACi6B,QACAj6B,YAACy5B,IACA7jB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,sBACb1X,MAAO,CAACiQ,IAAD,SACPpU,MAAM,uBACNqF,YAAY,IAEbpV,YAAC65B,IACAjkB,UAAWA,EACXK,cAAeA,EACf2V,aAAa,oBACb7b,MAAM,qBACNhV,OAAQqV,GACR0pB,aAAc1pB,GAA0B,SAM7CpQ,YAACukB,KACAxE,GAAG,QACHxF,MAAM,QACNiK,MACCxkB,YAAC8a,IAAMC,cACN/a,YAACi6B,QACAj6B,YAACu5B,IACA3jB,UAAWA,EACXM,oBAAqBA,EACrBzD,WAAYyD,eAAmB,IAAnBA,WAAqBoR,W,UACzB,gCAGTtnB,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,cACN6b,aAAc,OACd7wB,OAAQ6V,GACRkpB,aAAclpB,GAAc,KAG7B5Q,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,oBACN6b,aAAc,cACd7wB,OAAQ,CAAC,EAAD,iBACR++B,aAAco2B,EAAS,KAGxBlwD,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,uCACN6b,aAAc,kBACd7wB,OAAQ,CAAC,EAAD,iBACR++B,aAAco2B,EAAS,KAGxBlwD,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,4BACN6b,aAAc,cACd7wB,OAAQ,CAAC,GAAD,mCACR++B,aAAco2B,GAAQ,MAGvBlwD,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,4BACN6b,aAAc,cACd7wB,OAAQ,CAAC,EAAD,8BACR++B,aAAco2B,EAAS,MAGxBlwD,YAAC4tC,IACAh4B,UAAWA,EACXM,oBAAqBA,EACrBnG,MAAM,wBACN6b,aAAc,YACd7wB,OAAQyV,GACRspB,aAActpB,GAAkB,WE5HvCyD,MAPqB,GAQrBgH,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACX0B,QADW,GAEX8jC,YAAa,QAKjBnS,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GADN,YAEN4zD,gBAFM,EAGNC,WAHM,GAINC,UAJM,GAKNhD,KAAKz8C,MALC,MAMN29C,UAAU/9C,MANJ,MAON8/C,YAAY,IAGd9gD,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,IEpCWw8C,GAAmB,SAACC,GAAQ,OAACA,EAAMhiD,KAAP,QCa5BiiD,GACZ,SAAC,G,IAECp3D,aAAYq3D,EAAK,QAAEC,EAAK,QACxBj2D,WAAUk2D,EAAQ,WAAExiC,EAAY,eAAEyiC,EAAO,UAAEC,EAAK,QAAEC,EAAQ,WAC1DhmB,EAAQ,WAIJzsB,EAAMjD,iBAAZ,MAqCC,OAnCArP,qBAAU,WAKT,IAAMglD,EAAW,OAAApiD,EAAA,gBAEJ2hD,GAFI,eAINA,GAJM,WAAjB,MAQMU,EAAMtzD,cAAZ,GACMuzD,EAASF,EAAf,GACMG,EAASviD,yCAAf,GAQMD,EAAQ,SAACzU,EAAI2U,GAAM,OAAE+hD,GAAY/hD,IAAb,EAAoCpO,IAApC,MADT,SAACoO,GAAM,OAAAuf,GAAcyiC,EAAUE,IAAH,EAAR,GAAmCE,EAAhD,QACqD9kC,CAApD,IAGzBvd,YAAU0P,EAAV1P,8FAOE,CAACgiD,EAAUF,EAAOtiC,EAAcuiC,EAAOryC,EAAKuyC,EAASC,EAjCxD9kD,IAmCO,uBAAGsS,IAAKA,EAAKtP,UAAW,aAAa+7B,EAAb,OAA4BA,EAA5B,SC5CpBqmB,GAAc,SAAC,G,IAAEC,EAAY,eAAEC,EAAY,eAAEC,EAAY,eAAExmB,EAAQ,WACzEzsB,EAAMjD,iBAAZ,MAgCA,OA9BArP,qBAAU,WACT,IAGMwlD,EAAejB,GAArB,KAGMkB,GAFalB,GAAnB,KACA,IACsC,EAAI/hD,KAA1C,IAGMkjD,EFPkCnB,GAPV,SAACoB,GAAS,WAAAA,EAOiBC,CEOvBP,EAAjBQ,MAAgErjD,QAAjF,EAEMsjD,EAAaR,EAAe9iD,SAAlC,GACMujD,EAAaT,EAAe9iD,SAAlC,GAKM3T,EAAO,CAAC,KAJO02D,EAAe/iD,SAASkjD,EAAWljD,QAAxD,GAIc,KAHO+iD,EAAe/iD,SAASkjD,EAAWljD,QAAxD,GAGc,gBAFO+iD,EAAe/iD,SAASkjD,EAAWljD,QAAxD,GAEc,IADO+iD,EAAe/iD,SAASkjD,EAAWljD,QAAxD,IAIAI,YAAU0P,EAAV1P,yCAIE,YAAW,OAAAuP,EAAA,wBAA+BtjB,EAA/B,mBAxBb,QAyBE,YAAY,OAAAujB,EAAA,SAAiBvjB,EAAjB,SAEZ,CAACw2D,EAAcC,EA5BlBtlD,IA+BC,uBAAGsS,IAAKA,EAAKtP,UAAW,aAAa+7B,EAAb,OAA4BA,EAA5B,OACvB,4BAAQ/N,EAAGu0B,MC1CRS,GAAmB,CACxBC,SAAU,CAAEvB,MAAF,EAAYC,MAAO,GAC7BzL,OAAQ,CAAE0L,UAAF,EAAmBxiC,kBAAnB,EAA4CyiC,SAA5C,EAA4DC,MAA5D,EAAsEC,SAAU,GACxFmB,uBAAwB,CAAE5qB,MAAF,EAAYC,IAAK,GACzCwD,SAAU,CAAEx8B,EAAF,EAAQE,EAAG,IAGhB0jD,GAAsB,CAC3BD,uBAAwB,CAAE5qB,MAAF,EAAYC,IAAK,GACzC8pB,aAF2B,EAG3BC,aAH2B,EAI3BC,aAJ2B,EAK3BxmB,SAAU,CAAEx8B,EAAF,EAAQE,EAAG,IAiBT2jD,GAA8B,SAAC,G,IAC3C/4D,eAAc6U,EAAK,QAAEC,EAAM,SAC3BzT,wBAAuBvC,EAAI,OAAE+sD,EAAM,SAAEhrD,0BAAc,IAAG,aAAUe,oBAAQ,IAAG,OAAIm4C,EAAM,SAE/Eh4B,EAASC,iBAAf,MACM,EAA4B9P,mBAA5B,IAAC8mD,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACA,EAAkC/mD,mBAAlC,IAACgnD,EAAY,EAAb,GAAeC,EAAe,EAA9B,GAECt4C,EAAY0d,KAAZ1d,SAwCP,OAvCAlO,qBAAU,WAETkO,GAAYA,EAAS,CAAChd,KAAD,2BAAmC8Z,SAAS,MAFlEhL,IAKAA,qBAAU,WACT,IAAMymD,EAAN,GACMC,EAAN,GAEMC,EAAWv3C,UAAjB,YACMw3C,EAAYx3C,UAAlB,aAIMu1C,EAHeniD,SAASmkD,EAATnkD,EAArB,GACA,GAGMkiD,EAAQC,EAAd,EACMkC,GAAUlC,EAAD,GAAf,EAEA8B,WAAwB,CAAE/B,MAAF,EAASC,MAAK,GACtC8B,sBACC7B,UAAU,EACVxiC,aAAcxf,IACdiiD,SAAS,EACTC,MAAO34D,EAAK24D,MACZC,SAAU,GALX0B,GAQAA,WAAwB,CAAElkD,EAAGokD,EAAL,EAAmBlkD,EAAGmkD,EAAYzc,MAC1Dmc,GAAa,YAAgB,kCAAMQ,GAAN,MAG7BJ,yBAAyCD,EAAzCC,uBACAA,eAA+Bv6D,EAA/Bu6D,MACAA,eAA+BK,eAAuCN,WAAtEC,GACAA,eAA+BlkD,YAAakiD,EAA5CgC,IACAA,WAA2BD,EAA3BC,SACAF,GAAgB,YAAgB,kCAAMM,GAAN,QAC9B,CAACE,EAAU9N,EAAQ/sD,EAAM46D,EAAgB7kD,EAAOC,EAhCnDnC,IAmCChM,mBAAKF,IAAKmzD,IACTjzD,mBAAKse,IAAKlD,EAAQlN,MAAM,OAAOC,OAAO,QACrCnO,YAACywD,kBAAa4B,IAEdryD,YAACoxD,kBAAgBmB,KAElBvyD,mBAAKF,IAAKinB,IACT/mB,mBAAKF,IAAKozD,IAAa9f,EAAOnX,MAC9Bj8B,mBAAKC,UAAU,YAAYH,IAAKqzD,GAAW/kD,MAAO,CAAEF,MAAkC,EAA3BmkD,mBAC1DryD,mBAAKF,IAAKszD,IAAa7jD,OAAOpX,QAAaA,EAApBoX,yBACvBvP,uBAAMozC,EAAOj7C,OAEd6H,mBAAKF,IAAKozD,IAAa9f,EAb1B,UAmBK6f,GAAiBnzD,YAAG,6KAMpBinB,GAAiBjnB,YAAG,wNAIJ,8BAAZW,IAJV,OAQMyyD,GAAapzD,YAAG,iCAEhBqzD,GAAYrzD,YAAG,+HAKfszD,GAAatzD,YAAG,mGACK,mDAAjBW,IADV,YC3HMwT,GAAQ,CAAC+G,IAAf,aAEa5d,GAAS,CACrB2R,IADqB,QAErBgB,MAFqB,QAGrBsK,KAHqB,YAIrBC,QCiBwD,SAAC,G,IAAEtM,EAAU,aAAuB5Q,EAAM,sBAAEjF,EAAI,OAAO,OAC/G,sBAAO6V,WAAYA,EAAYkI,oBAAmB,2BAAO9Y,IAAQjF,KAAI,ODjBrEyiB,SALqB,GAMrBC,MEbmC,WAAM,sDFczC5G,MAPqB,GAQrBgH,qBAAsB,YACrB,MAAO,CACNjhB,QAAS,CACRxB,aAAc,CAAC8B,KADP,MAER7B,WAAY,CACX0B,QAAS,OAKb2xB,2BAA4B,YAC3B,MAAO,CACNxE,WAAY/qB,GAAwBU,aAGtCuS,QAAS,YACR,OAAOuE,GAAiBC,EAAjBD,YAAP,KPDF,SAAYs/C,GACXA,oCACAA,4BACAA,gCACAA,0CACAA,4BACAA,wBACAA,kCACAA,0BACAA,YACAA,kBACAA,gBACAA,oBACAA,4BACAA,gCACAA,sBACAA,0BACAA,wCACAA,sCACAA,gBACAA,4BACAA,sBACAA,sBACAA,wBACAA,kBACAA,wBACAA,0BA1BD,CAAYA,QAAZ,KA6BA,IUlDA,GVkDaC,KAAO,OAClBD,GAAD7xC,iBAAgC+xC,GAChC/xC,GAAC6xC,GAAD7xC,aAA4BgyC,GAC5BhyC,GAAC6xC,GAAD7xC,eAA8BiyC,GAC9BjyC,GAAC6xC,GAAD7xC,oBAAmCkyC,GACnClyC,GAAC6xC,GAAD7xC,aAA4BmyC,GAC5BnyC,GAAC6xC,GAAD7xC,WAA0BoyC,GAC1BpyC,GAAC6xC,GAAD7xC,gBAA+BqyC,GAC/BryC,GAAC6xC,GAAD7xC,YAA2BsyC,GAC3BtyC,GAAC6xC,GAAD7xC,QAAuBuyC,GACvBvyC,GAAC6xC,GAAD7xC,OAAsBwyC,GACtBxyC,GAAC6xC,GAAD7xC,SAAwByyC,GACxBzyC,GAAC6xC,GAAD7xC,aAA4B0yC,GAC5B1yC,GAAC6xC,GAAD7xC,eAA8B2yC,GAC9B3yC,GAAC6xC,GAAD7xC,UAAyB4yC,GACzB5yC,GAAC6xC,GAAD7xC,YAA2B6yC,GAC3B7yC,GAAC6xC,GAAD7xC,mBAAkC8yC,GAClC9yC,GAAC6xC,GAAD7xC,kBAAiC+yC,GACjC/yC,GAAC6xC,GAAD7xC,aAA4BgzC,GAC5BhzC,GAAC6xC,GAAD7xC,OAAsBizC,GACtBjzC,GAAC6xC,GAAD7xC,UAAyBkzC,GACzBlzC,GAAC6xC,GAAD7xC,UAAyBmzC,GACzBnzC,GAAC6xC,GAAD7xC,WAA0BozC,GAC1BpzC,GAAC6xC,GAAD7xC,QAAuBqzC,GACvBrzC,GAAC6xC,GAAD7xC,WAA0BszC,GAC1BtzC,GAAC6xC,GAAD7xC,YAA2BuzC,GAzBrB,IAiCMC,GAAa,SAACC,EAAgBle,QAAA,IAAAA,MAAA,IAC1C,IAEIlhC,EAFQgiC,YAAKd,SAAa15C,YAA9B,MAEc,KAAU,YAAU,MAAC,CAClC0R,IADkC,EAElCkmD,eAAgB,OASjB,OANAp/C,WAAgB,YACf,IAAMzY,EAAS63D,EAAen/C,EAA9B,KACA,IACCA,iBAAwB1Y,EAAxB0Y,mBAGF,GUtFD,SAAgBo/C,GACf19C,EACA29C,GAEA,IAAM/+C,EAAUV,uBAAY,cAC3B,OAAQY,EAAR,MACC,KAAK8+C,GAAL,QACC,OAAOpgC,YAAwB,CAAE78B,KAAF,KAAcC,SAAd,EAA6BC,MAAO,MACpE,KAAK+8D,GAAL,QACC,MAAO,CAAEj9D,KAAMme,EAAR,QAAwBle,SAAxB,EAAwCC,MAAO,MACvD,KAAK+8D,GAAL,QACC,MAAO,CAAEj9D,KAAF,KAAcC,SAAd,EAA8BC,MAAOie,EAAOje,UAPtD,IAWM,EAAoBk/B,qBAAWnhB,EAAS,CAAEje,KAAF,KAAcC,SAAd,EAA6BC,MAAO,OAA3E28B,EAAK,EAAN,GAAQ9a,EAAQ,EAAhB,GACAoE,EAAMjD,mBAyBZ,OAxBAiD,YAEAtS,qBACC,WACCkO,EAAS,CAAEhd,KAAMk4D,GAAYC,UAC7B,IAAIC,GAAJ,EAWA,OAVAC,gBAAgB/9C,KAAhB+9C,MACO,aACAD,GAAaE,YAAQL,EAAc72C,EAAxC,UACCpE,EAAS,CAAEhd,KAAMk4D,GAAR,QAA6BK,QAASC,OAHlDH,OAMQ,aACN,GAAcr7C,EAAS,CAAEhd,KAAMk4D,GAAR,QAA6B/8D,MAAK,IACzD8F,oBAEK,WACNm3D,QAfM,YAATtpD,IAsBA,GApDD,SAAKopD,GACJA,yBACAA,yBACAA,yBAHD,CAAKA,QAAL,KCLQ,IAER,GAFQ,GAA0Dz7C,GAA5Cg8C,GAA4Ch8C,GAAtBuK,GAAsBvK,GAQlE,SAASi8C,GAAkBC,GAC1B,OACCA,eAAS,IAATA,IAAa,CACZC,aADY,GAEZC,yBAFY,GAGZC,WAAY,KAXf,SAAYC,GACXA,UACAA,YACAA,0BAHD,CAAYA,QAAZ,KAqBA,ICJA,GAsBA,GDlBaC,GAAiB,WACvB,MAOFj8C,qBAPE,IAGgB47C,EAAS,yBAHzB,OAML37C,EAAQ,EANH,SAQAthB,EAASiE,mBAAQ,WACtB,OAAO+4D,GAAP,KACE,CAFH,IAGQE,EAAuDl9D,EAAvDk9D,aAAcC,EAAyCn9D,EAAvD,yBAAwCo9D,EAAep9D,EAAvD,WAQFu9D,EAA8B,WACnC,UAYKC,EAAmB1gD,uBACxB,YACCwE,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQo9D,WAAYK,QAE1D,CAACn8C,EAJF,IA2EMo8C,EAAW,SAACx7D,EAAD,KAGhBof,EAASy7C,GAAqB,UAAU,Y,YACjC/8D,EAASg9D,GAAf,GACQE,EAAiBl9D,EAAjBk9D,aAEJS,EAAJ,GAGA,UAAIT,GACY,MACdt0C,WACCnoB,GAAcm9D,EADfh1C,GADD+0C,QAKM,CACN,IAAME,EAAgBX,oBAAwCA,EAAxCA,GAAtB,GACAS,EAAkB,OAAH,IAAG,CAAH,eACXT,WACFh7D,8BACG27D,WACFC,GAAaF,MAJhBD,IAQD,kCAAY39D,IAAQk9D,aAAcS,QAE/BC,IAAaP,GAAjB,IACC9P,GAAgB,aAAiBrrD,MAAjCqrD,IAUIwQ,EAAuB,SAAC77D,EAAD,K,YACxB87D,EAAJ,GAGA,UAAIb,GACwB,MAC1Bv0C,WACCnoB,GAAcm9D,EADfh1C,GADDo1C,QAKM,CACN,IAAMH,EAAgBV,oBAAoDA,EAApDA,GAAtB,GACAa,EAA8B,OAAH,IAAG,CAAH,eACvBb,WACFj7D,8BACG27D,WACFC,GAAaF,MAJhBI,IAUGb,EAAJ,IACC14D,YAAY04D,eAAwB,IAAxBA,WAAZ14D,aAA0D,YACrDqU,eAA8BA,IAAlC,UACQklD,KAAP,MAKH18C,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQm9D,yBAA0Ba,MACnEJ,IAAaP,GAAjB,IACC9P,GAAgB,yBAA6BrrD,MAA7CqrD,IASI0Q,EAAc,SAAC/7D,EAAD,G,MACbg8D,EAAchB,EAApB,GACMiB,EAAYC,YAAKF,EAAvB,GAEIP,EAAkB,OAAH,IAAG,CAAH,eACfT,WACFh7D,GAAWi8D,EAFb,IAMI15D,YAAYk5D,EAAZl5D,WAAJ,UACQk5D,EAAP,GAIGl5D,sBAAJ,GACC6c,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQk9D,aAAc,OAC3D57C,EAASgK,GAAkB,SAA3BhK,QAEAA,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQk9D,aAAcS,OASvDU,EAA0B,SAACn8D,EAAD,G,MACzBg8D,EAAcf,EAApB,GACMgB,EAAYC,YAAKF,EAAvB,GAEIF,EAA8B,OAAH,IAAG,CAAH,eAC3Bb,WACFj7D,GAAWi8D,EAFb,IAMI15D,YAAYu5D,EAAZv5D,WAAJ,UACQu5D,EAAP,GAIGv5D,sBAAJ,GACC6c,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQm9D,yBAA0B,OACvE77C,EAASgK,GAAkB,SAA3BhK,QAEAA,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQm9D,yBAA0Ba,OAuEnEM,EAAgB,SAACp8D,EAAD,G,MACrB,OAAmB,QAAZ,SAAAg7D,QAAY,IAAZA,OAAA,EAAAA,EAAY,yBAAZ,KAAqCG,GAA5C,YASKkB,EAA4B,SAACr8D,EAAD,G,MACjC,OAA+B,QAAxB,SAAAi7D,QAAwB,IAAxBA,OAAA,EAAAA,EAAwB,yBAAxB,KAAiDE,GAAxD,YAIKmB,EAAiB1hD,uBAAY,WAClCwE,EAAS+J,GAAa,SAAU,CAAE+xC,WAAF,GAAkBF,aAAlB,GAAoCC,yBAA0B,MAC9F77C,EAASgK,GAAkB,SAA3BhK,SACE,CAHH,IA6CA,MAAO,CACNm9C,gBAhWuB,WACvB,UAgWAlB,4BAFM,EAGNmB,cAxVqB,WACrB,OAAOtB,GAAP,IAwVAI,iBAJM,EAKNmB,WA3TkB,SAACz8D,EAAD,GAClBlC,WAAe,YACd09D,EAASx7D,EAAU4W,EAAOukD,GAA1BK,QA0TDkB,YAvUmB,SAAC18D,EAAD,GACnB,IAAMk6B,EAAQkiC,EAAcp8D,EAA5B,GACIk6B,IAAUihC,GAAVjhC,IAA4BA,IAAUihC,GAA1C,IAA2DY,EAAY/7D,EAAvE,GACKw7D,EAASx7D,EAAU4W,EAAOukD,GAA1BK,KAqULmB,wBAjT+B,SAAC38D,EAAD,KAC/B,IAAMk6B,EAAQmiC,EAA0Br8D,EAAxC,GACA,EACKk6B,IAAUihC,GAAd,IAA+BgB,EAAwBn8D,EAAvD,GACK67D,EAAqB77D,EAAU4W,EAAOukD,GAAtCU,KAED3hC,IAAUihC,GAAVjhC,IAA4BA,IAAUihC,GAA1C,IAA2DgB,EAAwBn8D,EAAnF,GACK67D,EAAqB77D,EAAU4W,EAAOukD,GAAtCU,KA2SNe,mBAlS0B,SAAC58D,EAAD,GACZo8D,EAAcp8D,EAA5B,KACcm7D,GAAd,IAA+BY,EAAY/7D,EAA3C,GACKw7D,EAASx7D,EAAU68D,EAAgB1B,GAAnCK,MAgSLsB,+BAvRsC,SAAC98D,EAAD,GACxBq8D,EAA0Br8D,EAAxC,KACcm7D,GAAd,IAA+BgB,EAAwBn8D,EAAvD,GACK67D,EAAqB77D,EAAU68D,EAAgB1B,GAA/CU,MAqRLO,cAVM,EAWNC,0BAXM,EAYNU,aAtIoB,SAAC/8D,EAAD,G,MAEhBg9D,EAAJ,GACAC,WAAuB,YAEtBD,KAAqB7B,GAArB6B,MAGD,IAAIvB,EAAkB,OAAH,IAAG,CAAH,eACfT,WACFh7D,GAAWg9D,EAFb,IAKIz6D,sBAAJ,UACQk5D,EAAP,GAGGl5D,sBAAJ,GACC6c,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQk9D,aAAc,OAC3D57C,EAASgK,GAAkB,SAA3BhK,QAEAA,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQk9D,aAAcS,OAkH5DyB,yBAxGgC,SAACl9D,EAAD,G,MAE5Bg9D,EAAJ,GACAC,WAAuB,YAEtBD,KAAqB7B,GAArB6B,MAGD,IAAIlB,EAA8B,OAAH,IAAG,CAAH,eAC3Bb,WACFj7D,GAAWg9D,EAFb,IAKIz6D,sBAAJ,UACQu5D,EAAP,GAGGv5D,sBAAJ,GACC6c,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQm9D,yBAA0B,OACvE77C,EAASgK,GAAkB,SAA3BhK,QAEAA,EAAS+J,GAAa,SAAU,OAAX,IAAW,CAAX,eAAgBrrB,IAAQm9D,yBAA0Ba,OAoFxEQ,eAdM,EAeNa,iBAlDwB,SAACn9D,EAAD,GACxB,IAAMk6B,EAAQmhC,IACd,QAAInhC,iBAAJ,IACQ33B,OAAA,KAAY23B,EAAZ,UAAkC,YACxC,SAAI/kB,eAA0BA,IAA9B,GACK+kB,UAA2BihC,GAA/B,QA8CHiC,iBA/BwB,SAACp9D,EAAD,GACxB,IAAMk6B,EAAQmhC,IACd,QAAInhC,iBAAJ,IACQ33B,OAAA,KAAY23B,EAAZ,UAAkC,YACxC,SAAI/kB,eAA0BA,IAA9B,GACK+kB,UAA2BihC,GAA/B,YCxWL,SAAYkC,GACXA,eACAA,kBACAA,iBACAA,wBACAA,oBACAA,2BACAA,mBACAA,uBACAA,iBACAA,gBACAA,oBACAA,iBACAA,yBACAA,uBACAA,oBACAA,mBACAA,mBACAA,6BAlBD,CAAYA,QAAZ,KAsBA,SAAYC,GAEXA,aAEAA,WAEAA,eAND,CAAYA,QAAZ,KC3CO,IAaMC,GAAiB,SAACtpD,EAAKwI,G,YACnC,GAAIxI,UAAgB+V,YAApB,GAAqC,MAArC,GAEK,oBAAI/V,EAwBR,MAAO,CAAEiW,KAvBS3nB,OAAA,QAAeka,GAAf,SAAiC,Y,IAAExI,EAAG,KAAEhU,EAAM,KACzDu9D,EAAWj7D,OAAA,mBACR,YACP,OADgB,OACC44D,GAAjB,MAFe,KAIX,Y,MAAEroD,EAAK,KACX,aAASvU,GAAOuU,EAAhB,KAGI2qD,EAAYl7D,OAAA,mBACT,YACP,OADgB,OACC44D,GAAjB,OAFgB,KAIZ,Y,QAAEroD,EAAK,KACX,aAASvU,WAAU8+D,GAADz9D,WAAkCkT,EAA3CvU,GAAT,KAGIwyB,EAAN,GAIA,OAHIysC,EAAJ,SAAqBzsC,EAAYusC,GAAZvsC,OACjB0sC,EAAJ,SAAsB1sC,EAAYusC,GAAZvsC,QAEtB,MAKG,gCAAI9c,EAwBR,MAAO,CAAEiW,KAvBS3nB,OAAA,QAAeka,GAAf,SAAiC,Y,IAAExI,EAAG,KAAEhU,EAAM,KACzDu9D,EAAWj7D,OAAA,mBACR,YACP,OADgB,OACC44D,GAAjB,MAFe,KAIX,Y,QAAEroD,EAAK,KACX,aAASvU,WAAU8+D,GAADz9D,YAAmCkT,EAA5CvU,GAAT,KAGIk/D,EAAYl7D,OAAA,mBACT,YACP,OADgB,OACC44D,GAAjB,OAFgB,KAIZ,Y,QAAEroD,EAAK,KACX,aAASvU,WAAU8+D,GAADz9D,eAAsCkT,EAA/CvU,GAAT,KAGIwyB,EAAN,GAIA,OAHIysC,EAAJ,SAAqBzsC,EAAYusC,GAAZvsC,OACjB0sC,EAAJ,SAAsB1sC,EAAYusC,GAAZvsC,QAEtB,MAKG,gBAAI9c,EAAoB,CACpB,IAAAypD,EAA8BjhD,EAA9BihD,aAAcC,EAAgBlhD,EAA9B,YACR,IAAKihD,IAAL,EACC,OAQD,MANoB,CACnBxzC,KAAM,OACHxD,EAACg3C,EAADh3C,YAAuBnoB,EAAC8+D,GAAD9+D,mBAA0Co/D,EAAY,GAA7Ej3C,GADG,SAEH9mB,EAAC89D,EAAD99D,YAAuBR,EAACi+D,GAADj+D,UAAiCu+D,EAAY,GAApE/9D,GAFG,KAQP,UC/E8B,8HAIA,wHAIL,0EAGC,oHASC,kNApB7B,I,4DA0Bag+D,GAAgB54D,YAAG,iLAcnB64D,IAT6B,wHASD74D,YAAG,sKAE1B,wCAGA,wCAHbyN,IAFuC,MAKvCA,IALE,QASMqrD,GAA2B94D,YAAG,kKAEzB,uCAGA,uCAHbyN,IAFsC,MAKtCA,IALE,OASMsrD,GAAuB/4D,YAAG,iDACX,OACD,QAFY,GAAhC,IAQMg5D,GAAW,YAAG,yBAAH,CAAG,0CAAe,uBAO7BC,GAAe,uFAAU,4BAUzBC,IAHW,0CAAU,sBAGb,YAAG,yBAAH,CAAG,0CAAU,wBAWrBC,IARW,0CAAU,sBAQJ,SAAC,EAAD,GAGzB,YAFJ,IAAAC,MAAA,QACA,IAAAC,MAAA,MACI,YAAG,8JACkB,kEACW,gCAF7B,EAEOD,EAFV,KASQE,GAAmBt5D,YAAG,mOAWtBu5D,GAAsBv5D,YAAG,iaAMY,wBACd,iDAIe,wBACf,iBAGd,yCAC+B,wBACR,cAXvB2lD,GANgB,mBAOpBhlD,GAPoB,YAWhBglD,GAXgB,oBAYpBhlD,GAZoB,YAD/B,8BAiBeglD,GAhBgB,sBAiBpBA,GAjBX,mBA0BM6T,GAAgCx5D,YAAG,2JACtB,qDAIJ,YACG,kDAPlB,cA1BA,8BA0BA,eAYMy5D,GAA6Bz5D,YAAG,wHAEpB,4CAdlB,eCjJD05D,GAAc/hE,wBAApB,MCqBA,SAAgBgiE,GAAgBj4C,G,IAC/BppB,EAAO,UACPD,EAAI,OACJkB,yBAAa,IAAG,EAAAwX,KAChBmD,EAAsB,yBACtBkC,EAAmB,sBACnBD,EAAa,gBACbjI,EAAU,aACV9Q,EAAI,OACJ0Y,EAAS,YACTyB,EAAO,UAEDqiD,EAAgBpG,MAAtB,QACMqG,EAAmB1/C,qBAAzB,IACM2/C,EAAc3/C,qBAApB,IAEMmgB,EAAangB,qBAAnB,IACMkS,EAAWtvB,mBAAQ,WACxB,UAIAu9B,WAAwBlkB,EAAxBkkB,sBACOA,YAAyBlkB,EAAhC,aAJQkkB,EAAA,QAAmBl9B,KAK1B,CAPF,IASA8O,qBAAU,WAET,GAAG2tD,MAA2CxtC,YAAqBjW,EAAhEyjD,iBAAH,IAAqG/jD,EAAyB,CACrH,IAAAsE,EAAay/C,EADwG,SAGvHxiD,EAAgBiD,WAAWA,eAAjC,IACAjD,aAA2BgV,EAA3BhV,QACA+C,EAASP,KAATO,OAEC,CAAChE,EAAqByjD,EAAkB/jD,IAInC,IAAsBikD,GAAiBD,GAAe,CAAEE,sBAAsB,IAA9EA,qBAEFC,EAAa1+C,mBACb2+C,GAAmB5hE,IAAzB,EAkBA,OAjBKyhE,GAAL,IACCE,UAEC/5D,YAAC05D,GACAvhE,KAAMA,EACN+d,oBAAqBA,EACrBD,cAAeA,EACfoB,QAASA,EACTrJ,WAAYA,EACZ5V,QAASA,EACTwd,UAAWA,EACX5B,uBAAwBA,EACxBumB,cAAepO,KAMjBnsB,YAAC8a,IAAMC,cACL5iB,GAAQ4hE,EAAWjxC,QAGnBkxC,GAEAh6D,YAACo2C,KACA77B,MAAO,gBACPF,KAAM,QACNK,YAAaC,IAGdviB,IACCD,EACA6H,mB,UAAa,oBAAoBF,IAAKm6D,IACrCj6D,YAACD,IAAYO,KAAM,MAGpBN,mBAAKF,IAAKo6D,IACTl6D,YAACD,GApBN,SA2BD,I,MAAMk6D,GAAmBn6D,YAAG,iIAMtBo6D,GAAkBp6D,YAAG,6LAMX,SANhB,I,eC1GA,2D,OACCq6D,QAAQ,CACPC,UAAU,GAWXD,aAAa,W,QACZ,UAAKj5C,QAAL,IAAKA,4BAAL,gCACAi5C,WAAc,CAACC,UAAU,K,EA8B3B,OA7CmCz6D,iBAKlC06D,4CACCziE,KAAA,SAAc,CACbwiE,UAAU,IAGXj8D,oBAQDk8D,8BACC,IAAM74C,EAMF5pB,KANJ,MAGC2uB,EAAQ,EAHT,SAICrsB,IAJD,gBAICA,OAAe,IAAG,GAJnB,EAKIogE,EAAU,cALR94C,kCAAN,oBAQA,OADmB5pB,KAAKo9B,MAAjBolC,SAGLp6D,YAACo2C,iBACA/7B,KAAM,QACN/D,SACC,GACCtW,YAACmN,K,UAAe,qBAAqBmE,KAAMipD,EAAiBtuD,QAASrU,KAAK4iE,cAL9E,IAcA,GAGH,E,CA7CA,iBCiFmB,kYAUK,kKAMH,8ICnED,oJDmDpB,I,iCE5FA,GCDaC,GAAiB,CAC5BC,IAAK,CACH3rD,IADG,MAEHgB,MAFG,UAGHojC,OAAQrzC,YAAG,2EAGX4W,UAAW,GAEbikD,IAAK,CACH5rD,IADG,MAEHgB,MAFG,WAGHojC,OAAQrzC,YAAG,2HAGX4W,UAAW,GAEbkkD,aAAc,CACZ7rD,IADY,eAEZgB,MAFY,sBAGZojC,OAAQrzC,YAAG,2LAIX4W,UAAW,GAEbiQ,MAAO,CACL5X,IADK,QAELgB,MAFK,WAGLojC,OAAQrzC,YAAG,qVAOX4W,UAAW,GAEbmkD,KAAM,CACJ9rD,IADI,OAEJgB,MAFI,WAGJojC,OAAQrzC,YAAG,mMAIX4W,UAAW,GAEbokD,IAAK,CACH/rD,IADG,MAEHgB,MAFG,WAGHojC,OAAQrzC,YAAG,2MAIX4W,UAAW,IClDFqkD,GAAiB,SAACjlD,EAAQ,G,IAAE7D,EAAW,cAAEC,EAAS,YAAE7Y,iBAAK,IAAG,MACxE,OAAK6Y,EAAL,iBAIClS,YAACmS,K,UACS2D,EAAO/G,IAChBA,IAAKnT,EACLwW,OAAQF,EAAUE,OAClBtE,SAAUoE,EAAUpE,SACpB7B,QAASgG,EACTX,KAAMwE,GAAUA,EAAO/F,MACvBsK,KAAMvE,QAAe9V,YAACuhB,IAAKlH,KAAMvE,EAAOuE,SAVzC,MAeW2gD,GAAgB,SAAC,G,IAAEtoD,EAAkB,qBAAE9E,EAAK,QAAEqtD,EAAgB,mBAC1E,OACCj7D,YAAC6S,KACAC,MAAOmoD,EACPloD,cAAe,cAAgB,OAAAV,EAAA,qBAC/BW,aAAc+nD,GACd9nD,UAAWjT,YAACmS,KAASrE,UAAU,EAAMwD,KAAK,gBAC1C4B,aAAcR,EACdD,WAAY7E,EACZuF,aAAc,CAAEC,SAAS,IAEzBpT,YAACmN,K,UACQ,cACRkN,KAAMra,YAACuhB,IAAKlH,KAAMzM,eAAK,IAALA,WAAOyM,OACzBhH,UAAW,aACXD,SAAO,GAENxF,eAAK,IAALA,WAhBJ,SClBYstD,GAAS,SAAC,GAAE,IAAAC,EAAI,EAAJA,KAAMC,EAAM,EAAZ,OAAchtD,EAAK,EAAnB,MAAwB8S,EAAK,cAA/B,2BAEtB,OACClhB,YAACq7D,iBACAv7D,IAAKsO,EAMLs9B,QAAM,GAMFxqB,GAEHi6C,EAhBH,IAuBYG,GAAoB,SAAC,G,IAAEC,EAAI,OAAEC,EAAqB,wBAAEC,EAAQ,WAAElhD,EAAK,QAAEjJ,EAAI,OAAE+I,EAAI,OACrF,EAAoC9O,oBAApC,GAACmwD,EAAc,EAAf,GAAiBC,EAAe,EAAhC,GACA,EAAkCpwD,mBAAlC,MAACqwD,EAAY,EAAb,GAAeC,EAAe,EAA9B,GACA,EAAoDtwD,oBAApD,GAACuwD,EAAqB,EAAtB,GAAwBC,EAAwB,EAAhD,GAOAC,EAAa,WAClBL,OAGKM,EAA0BvmD,uBAAY,YAC3C,SAAKomD,GAAyBN,EAA9B,MAVkBtwB,EAWjBgxB,EAVDP,MACAE,MAUC,GAZgB,IAAC3wB,IAehB,CAAC4wB,EANJ,IAQMK,EAA+BzmD,uBAAY,WAChDimD,MACA,GACCI,QAEC,CALH,IAaA,OANA/vD,qBAAU,WACT,GACCyvD,EAASG,EAATH,YAEC,CAACK,EAAuBF,EAJ3B5vD,IAOChM,YAAC+a,gBACA/a,YAACo8D,KACAb,KAAMA,EACNruD,QAAS+uD,IAGVj8D,YAACq7D,KACA3vB,OAAQgwB,EACRW,QAASL,EACTzhD,MAAOA,EACPza,IAAKqzC,GAAO+nB,OACZ7gD,KAAMA,EACNkM,SACCvmB,YAAC+a,gBACA/a,mBAAKC,UAAWsN,IAAQ+uD,aACvBt8D,qBAAIsR,IAELtR,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KAAOiG,SAAO,EAACnH,QAAS+vD,G,UACzBh8D,YAACmN,KAAOqvD,UAAQ,EAACvwD,QAASkwD,EAA8Bh8D,OAAO,W,kBAUhEgzC,GAAS,CACd+nB,OAAQp7D,YAAG,mHACM,uCAGO,wCAHrByN,IADQ,OAIRA,IAJQ,gBC7DZ,SAAgBkvD,GACfzmD,EACAb,EACApW,EACA9C,G,UAEA,YAFA,IAAAA,MAAA,IAEO,CACNiB,KAAM8Y,EADA,KAEN0mD,kBAAmB,CAClBvnD,mBADkB,EAElBpW,QAAS,CACR+2D,cAAsBl9D,QAAR,EAAAmG,EAAQnG,6BAAR,eADN,GAERm9D,0BAAkCn9D,QAAR,EAAAmG,EAAQnG,6BAAR,2BAFlB,GAGRL,SAAUwG,EAAQxG,UAEnB0d,cAAe,CACd0mD,YAAa3mD,EADC,KAEdb,mBAFc,EAGdnb,QAASgc,gBAHK,QAIdvd,WAAYud,gBAAmBvd,aAGjCyd,oBAA0BA,QAAP,EAAEF,EAAKE,mCAhBpB,GAiBN4D,SAAU,CACT7d,KADS,EAETiB,KAAM0/D,GAFG,OAGT78C,GAHS,GAIT88C,YAAY,KJ5Df,SAAYD,GACXA,sBACAA,kBACAA,wBAHD,CAAYA,QAAZ,KKCO,IAAME,GAAqB,gBAArBA,GAAqB,cAArBA,GAAqB,cAYrBC,GAKE,gBAA6B,YAAd,IAAA9gE,MAAA,IAAe,CAC3CiB,KAAM4/D,GACN9lD,QAAS,CACR+I,GADQ,EAERi9C,KAAM,OAAF,IAAE,CAAF,eACAxmD,IACHsD,SAAU,CACT5c,KAAM0/D,GADG,SAET3gE,KAFS,EAGT8jB,GAAE,QAdMg9C,GAwCA,yBAKX,IAAA9gE,MAAA,IAEA,IAAMghE,EAAoBR,GAAiC3mD,EAAQ9B,EAAwBjV,EAA3F,GAEA,OADAk+D,gBACO,CACN//D,KAAM4/D,GACN9lD,QAAS,CACR+I,GADQ,EAERi9C,KAAMC,KArDGF,GAoEA,Y,MACLG,EAAiBpjD,QAAT,EAAGkjD,eAAI,IAAJA,WAAMljD,+BAAvB,KAEA,OAAIojD,IAAaN,GAAjB,QAQWM,IAAaN,GAAjB,UAQIM,IAAaN,GAAjB,UAfC,CACN1/D,KAAM4/D,GACN9lD,QAAS,CACR+I,GAAIi9C,WADI,GAERA,KAAI,IAoBC,CACN9/D,KADM,OAEN8Z,QAAS,KC1GAmmD,GAAqB1lE,wBAA3B,MA+FP,SAAgB2lE,KAEf,IADkBnjD,yBAAV+a,MACHA,SAAL,mBAAwC,MAAO,GACzC,MAGF/a,qBAHE,IACL5gB,IADK,MACIgkE,EAAqB,EADzB,sBACsCC,EAAW,EADjD,UAC4DC,EAAS,EADrE,QACmFC,EAAY,EAD/F,WAELtjD,EAAQ,EAFH,SAMAujD,EAAa5gE,mBAAQ,WAC1B,OAAOQ,OAAA,gBAAiC,Y,IAAE0iB,EAAE,KAAE29C,EAAS,KAAM,kCACzDA,IACH5jD,SAAU,OAAF,IAAE,CAAF,CACPiG,GAAE,GACC29C,EAAU5jD,iBAGb,CARH,IAWMjE,EAAUhZ,mBAAQ,WACvB,OAAOQ,OAAA,gBAA8B,Y,IAAE0iB,EAAE,KAAEjK,EAAM,KAAM,kCACnDA,IACHgE,SAAU,OAAF,IAAE,CAAF,CACPiG,GAAE,GACCjK,EAAOgE,iBAGV,CARH,IAqBA,MAAO,CAAEujD,sBAAF,EAAyBI,WAAzB,EAAqCE,UAV1B9gE,mBAAQ,WACzB,OAAOQ,OAAA,gBAAgC,Y,IAAE0iB,EAAE,KAAEvJ,EAAQ,KAAM,kCACvDA,IACHsD,SAAU,OAAF,IAAE,CAAF,CACPiG,GAAE,GACCvJ,EAASsD,iBAGZ,CARH,IAUuDjE,QAAhD,EAAyDqE,SAAQ,GC3GzE,IAAM9D,GAAUC,aAAQ,cACvB,OAAQC,EAAR,MACC,KAAKsnD,GAAL,iBACO,MAAqBtnD,EAArB,QAAEvH,EAAG,EAAL,IAAO2uD,EAAS,EAAhB,UACN/mD,8BACA,MAED,KAAKinD,GAAL,cACO,MAAkBtnD,EAAlB,QAAOR,GAAL/G,EAAG,EAAL,IAAa,EAAb,QACN4H,2BACA,MAED,KAAKinD,GAAL,eACCjnD,sBAA4BL,EAA5BK,QACA,MAED,KAAKinD,GAAL,iBACCjnD,cAAoBL,UAApBK,YACA,MAED,KAAKinD,GAAL,gBACC,IAA2B,UAAAvgE,OAAA,QAAeiZ,EAA1C,SAA2B,IAA3B,OAA2B,IAAgC,CAAhD,WAAM1I,GAALmB,EAAG,EAAJ,GAAW,EAAX,IACN1R,YAAYsZ,EAAZtZ,mBAAJ,KACCsZ,sBAsBDiB,GAAkC,CACrCgC,YAAa,CACZ6jD,WADY,GAEZ5nD,QAAS,IAEVkkC,SAAU,CACT8jB,oBAAoB,IAITD,GAA0B,CACtCE,iBADsC,mBAEtCC,cAFsC,gBAGtCvkD,eAHsC,iBAItCwkD,iBAJsC,mBAKtCC,gBAAiB,mBA0BlB,SAAgBC,K,MACTptD,EAAUmJ,qBAAhB,IACA,OAAgB+a,QAAhB,EAAOlkB,eAAO,IAAPA,WAASkkB,4BAAO+kB,SAAvB,mBC1GD,I,MAAaokB,GAAkB,WACxB,MAGFlkD,qBAHE,IACIzD,EAAQ,QADZ,SAEK4nD,EAAiB,EAFtB,SAKA,EAA0BhB,KAAxBO,EAAS,EAAX,UAAazjD,EAAQ,EAArB,SACAmkD,EAAYH,KAEZ,EAAkB3yD,mBAAlB,IAACtP,EAAI,EAAL,GAAOqiE,EAAO,EAAd,GACA,EAAiC/yD,oBAAjC,GAACgzD,EAAY,EAAb,GAAeC,EAAc,EAA7B,GACA,EAA8CjzD,oBAA9C,GAACkzD,EAAkB,EAAnB,GAAqBC,EAAqB,EAA1C,GACA,EAAcnzD,mBAAd,MAACwU,EAAE,EAAH,GAAK4+C,EAAK,EAAV,GAOAC,EAAiB,WACtBJ,OAqBD,OARAxyD,qBAAU,WACT,KAAwB,CACvB,IAAM6yD,EAAgBlB,EAAA,QAAiB,YAAO,OAAApvD,EAAA,mBAA9C,GACA6vD,EAAkBzkD,GAAsCklD,EAAxDT,WACAQ,OAEC,CAAC7+C,EAAI0+C,EAAoBd,EAN5B3xD,IAQA,EAGChM,YAAC+a,gBACA/a,YAACwrC,KAAQxlB,QAAS,mBAAoB/lB,UAAWsN,IAAQuxD,OACxD9+D,YAACmN,KACAkN,KAAM,OACNpO,QAlCkB,WACrBqyD,EAAQS,MACRP,UAmCCx+D,YAACk7D,IACAxvB,OAAQ6yB,EACRlC,QAASuC,EACTrkD,MAAO,gBACPF,KAAM,OACN8gD,KACCn7D,mBAAKC,UAAWsN,IAAQ+uD,aACvBt8D,0DACAA,YAACsN,KAAWpQ,KAAK,OAAO0Q,MAAO3R,EAAMyR,SAAU,YAAO,OAAA4wD,EAAQxuD,SAAR,QAAyBzC,MAAI,KAGrF+tD,OACCp7D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KAAOiG,SAAO,EAACnH,QAAS2yD,G,UAGzB5+D,YAACmN,KAAOqvD,UAAQ,EAACvwD,QA5CJ,WACjB,QAAIhQ,EAAa,CAChB,IAAM+iE,EAAKC,cACXN,KACAzkD,EAAS6iD,OAAT7iD,IACAwkD,QAuCwCv+D,OAAO,W,YA1B1B,MAoCX++D,GAAmB,WACzB,MAAsC3zD,oBAAtC,GAAC4zD,EAAe,EAAhB,GAAkBC,EAAgB,EAAlC,GAMAR,EAAiB,WACtBQ,OAIA,EACGnlD,yBADH+a,MAASxe,EAAQ,EAAjB,SAA6B6oD,EAAiB,EAA9C,SAGOnlD,EAAakjD,KAAbljD,SAQR,OAPkBgkD,MASbmB,EAAL,SAGCr/D,YAAC8a,IAAMC,cACN/a,YAACwrC,KAAQxlB,QAAS,iBAAkB/lB,UAAWsN,IAAQuxD,OACtD9+D,YAACmN,KACAkN,KAAM,cACNpO,QA7BkB,WACrBmzD,UAgCCp/D,YAACk7D,IACAxvB,OAAQyzB,EACR9C,QAASuC,EACTrkD,MAAO,YACPF,KAAK,cACL8gD,KACCn7D,mBACCC,UAAWsN,IAAQ+uD,YACnBx8D,IAAKA,YAAG,0HAIRE,qGAGFo7D,OACCp7D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KAAOiG,SAAO,EAACnH,QAAS2yD,G,UAGzB5+D,YAACmN,KAAOqvD,UAAQ,EAACvwD,QAtCJ,WACjB2yD,IACA1kD,EAAS6iD,GAAT7iD,KAoCyC/Z,OAAO,W,YAjC1B,MA2CxB,SAAgBm/D,GAAW99C,G,IAAExL,EAAI,OACxBkE,EAAakjD,KAAbljD,SAEF,EAAiC3O,oBAAjC,GAACgzD,EAAY,EAAb,GAAeC,EAAc,EAA7B,GACA,EAAkBjzD,mBAAlB,IAACtP,EAAI,EAAL,GAAOqiE,EAAO,EAAd,GAOAM,EAAiB,WACtBJ,OAKC,EAEEvkD,+BAFFzD,SAAYxC,EAAsB,EAAlC,uBAAoCjV,EAAO,EAA3C,QAIIwgE,EAAa7pD,uBAAY,WAC9B,KAAU,CACT,IAAMqK,EAAKk/C,cACX/kD,EAAS6iD,WAAT7iD,IAED0kD,MACE,CAAC1kD,EAAUlE,EAAMhC,EAAwBjV,EAN5C,IAQA,OACCiB,YAAC+a,gBACA/a,YAACmN,K,UACQ,qBACRkN,KAAK,cACLpO,QA5BmB,WACrBqyD,EAAQS,MACRP,OA2BEprD,SAAO,IAERpT,YAACk7D,IACAxvB,OAAQ6yB,EACRlC,QAASuC,EACTrkD,MAAO,mBACPF,KAAK,cACL8gD,KACCn7D,mBAAKC,UAAWsN,IAAQ+uD,aACvBt8D,iEACAA,YAACsN,KAAWpQ,KAAK,OAAO0Q,MAAO3R,EAAMyR,SAAU,YAAO,OAAA4wD,EAAQxuD,SAAR,QAAyBzC,MAAI,KAGrF+tD,OACCp7D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KACAlB,QAAS2yD,EACTr4C,SAAU,SACVzmB,IAAKA,YAAG,+IAGRsT,SAAO,IAERpT,YAACmN,KAAOlB,QAASszD,EAAYh5C,SAAU,OAAQpmB,OAAO,UAAUq8D,UAAQ,EAAC1uD,SAA0B,IAAhB7R,eAQzF,SAAS8iE,KACR,IAAMS,EAAa,CAAC,QAAS,SAAU,QAAvC,UACMC,EAAQ,CAAC,QAAS,SAAU,QAAlC,SACMC,EAAalxD,WAAWA,cAAgBgxD,EAA9C,QACMG,EAAcnxD,WAAWA,cAAgBixD,EAA/C,QACA,OAAUD,SAA0BC,EAApC,GCzND,IAAaG,GAAuB3nE,IACnC,kBAOM,MAA2Bi9D,IAAiB,W,gHACjD,OAAKn9D,eAAM,IAANA,WAAD,YAAsBke,eAAa,IAAbA,WAA1B,SAMO,IAHD2E,EAA4B04C,MAA5B14C,UAGgB,EAAD,EAGpB3E,EAHM,UAN2C,I,OAMlD,SAAO,EAAP,iBAKE,CAACA,EAAejC,EAAwBjc,EAZrC,IAAEI,EAAI,EAAN,KAAQC,EAAO,EAAf,QAAiBC,EAAK,EAAtB,MAeGwnE,EAAmBt0D,mBAAtB,SASN,OARAS,qBAAU,WACT,GACC6zD,GAAgB,WACf,aAGA,CANH7zD,IAQO,CAAE7T,KAAF,EAAQC,QAAR,EAAiBC,MAAK,MC5BjBynE,GAAe,SAAC,G,IAAE/nE,EAAM,SAAEic,EAAsB,yBAAEkG,EAAQ,WAAElE,EAAI,OAAEJ,EAAS,YAAEvc,sBAAU,IAAG,KAEhG,EAA8BkS,mBAAS,CAAE2C,MAAF,IAAcC,OAAQ,MAA5DH,EAAU,EAAX,GAAayiB,EAAa,EAA1B,GAIA,EAAsG6iC,GAC3Gt9C,EADK,MAAE4O,EAAO,EAAT,QAAW3Q,EAAK,EAAhB,MAAkBC,EAAK,EAAvB,MAAyB+G,EAAoB,EAA7C,qBAA+C6Q,EAA0B,EAAzE,2BAA2E7wB,IAA3E,kBAKAX,EAAqBua,GAAsBb,EAAwBC,EAAOC,OALkB,IAAG,KAA/F,GAiCN,OAzBAlI,qBAAU,W,MACT,KAAWiK,QAAP,EAACD,eAAI,IAAJA,WAAMC,oCAAX,SAAmC,CAClC,IAAMjc,EAAUihB,EAAhB,GACAf,EAASP,KAATO,OAEC,CAAClE,EAAMhC,EAAwBkG,EAAU5f,EAAoBsb,EALhE5J,IAQAA,qBAAU,WAGT,KAAKgK,eAAI,IAAJA,WAAD,sBAAJ,EAA8D,CAC7D,IAAM+pD,EAAej0C,EAArB,GACA5R,EAASP,KAATO,OAEC,CAAClE,EAAMJ,EAAWkW,EAA4B5R,EAPjDlO,IAkBChM,mBAAKF,IAAKkgE,IAERp7C,GACA5kB,mBAAKF,IAAKmgE,IACTjgE,YAAC4kB,GAAQhP,UAAWA,EAAWyB,QAASrB,EAAKqB,WAK/CrX,YAACq6D,IACA3/C,YACC,oHAED6/C,gBAAiB,eAEjBv6D,YAACkgE,KAAaC,SAvBjB,YACC,MAAiB,CAChB,IAAMnwD,EAAQH,KAAd,YACA4gB,EAAc,CAAEviB,MAAO8B,EAAT,MAAsB7B,OAAQ6B,EAAM7B,YAqBhDnO,YAACo3B,QACAp3B,mB,UAAa,mBAAmBF,IAAKyjB,IACpCvjB,YAACogE,IACAxqD,UAAWA,EACX5H,WAAYA,EACZgI,KAAMA,EACNje,OAAQA,EACRic,uBAAwBA,UAUhC,SAASosD,GAAa,G,IAAExqD,EAAS,YAAE5H,EAAU,aAAEgI,EAAI,OAAEje,EAAM,SAAEic,EAAsB,yBAE5E,EAAoB4rD,GAAqB7nE,EAAQic,EAAwBgC,EAAjC,KAA4CA,EAApF,eAAE7d,EAAI,EAAN,KAAQC,EAAO,EAAf,QAGA,EAA4BmT,mBAA5B,MAAC80D,EAAS,EAAV,GAAYC,EAAY,EAAxB,GAON,OANAt0D,qBAAU,YACL7T,GAAJ,KAAY,OAAAJ,QAAM,IAANA,OAAA,EAAAA,EAAA,YACXuoE,OAEC,CAACnoE,EAJJ6T,IAOChM,YAACy5D,I,UACQ,mBACRthE,KAAMkoE,EACNzqD,UAAWA,EACX1Y,KAAM8Y,EAAK9Y,KACX9E,QAASA,EACT4V,WAAYA,EACZqJ,QAASrB,EAAKqB,QACdrD,uBAAwBA,EACxBkC,oBAAqBF,EAAKE,oBAC1BD,cAAeD,EAAKC,gBAKvB,I,SAAMgqD,GAAYngE,YAAG,+GAKfkgE,GAAUlgE,YAAG,qMAObyjB,GAAezjB,YAAG,uMCxHlBygE,GAAe,WAAfA,GAEG,SAGT,YAAyB/+C,G,IAAEkqB,EAAM,SAAE80B,EAAK,QAAExqD,EAAI,OAAEJ,EAAS,YAClD,EAA4BrK,mBAASg1D,IAApCE,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACA,EAA4Bn1D,oBAA5B,GAACo1D,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACAC,EAAsBxlD,mBACtBylD,EAAoBzlD,mBAClBnB,EAAaD,yBAAbC,SAERlO,qBAAU,WACT,GAEC60D,UAA8BzmD,WAAWA,eAAepE,EAF7C,gBAIX8qD,UAA4B9qD,sBACzBoE,WAAWA,eAAepE,EADDA,sBAEzBA,EAFH8qD,qBAKAJ,EAAaH,MAEZ,CAZHv0D,IAgCAA,qBAAU,WACT,IACCw0D,IACAI,SAGC,CAAC5qD,EAAD,cAAqBA,EAAKE,sBAE7B,IAAMtI,EAAQ/Q,mBACb,WAAM,MAAC,CACNi9D,sBAAuBpuB,KAExB,CAJD,IAOA,OACC1rC,YAAC8a,IAAMC,cACN/a,YAACw5D,GAAY9hC,UAAS9pB,MAAOA,GAC5B5N,YAAC+gE,IACAr1B,OAAQA,GAAU+0B,IAAcF,GAChCS,OAAQR,EACRS,SAvCgB,WAEjBzL,YAAQqL,EAAD,QAA8B7qD,EAAtC,gBACCw/C,YAAQsL,EAAD,QAA4B9qD,EAFrC,qBAMCwqD,IAFAE,EAAaH,KAmCXvqD,KAAMA,EACNJ,UAAWA,IAEZ5V,YAACkhE,IACAx1B,OAAQA,GAAU+0B,IAAcF,GAChCC,MAjCoB,WACvBtmD,EAASP,KAA0CknD,EAAnD3mD,UACAA,EAASP,KAAgDmnD,EAAzD5mD,UAEA0mD,OA8BG5qD,KAAMA,EACNJ,UAAWA,EACX8qD,aAAcA,MAOnB,SAASK,GAAS,G,IAAEr1B,EAAM,SAAEs1B,EAAM,SAAEC,EAAQ,WAAEjrD,EAAI,OAAEJ,EAAS,YACtD,EAMFqE,qBANE,IACLvf,IADK,MAEQsZ,EAAsB,WAF9B,uBAGSgE,EAAY,YAHrB,aAKLkC,EAAQ,EALH,SAOAhE,EAA6CF,EAA7CE,oBAAqBD,EAAwBD,EAA7C,cAAoC9Y,EAAS8Y,EAA7C,KACA,EAAiCs9C,GAAjC,GAAEz4C,EAAK,EAAP,MAAS5G,EAAK,EAAd,MAAgBC,EAAK,EAArB,MAAuBnE,EAAK,EAA5B,MAEAoxD,EAAqBlnD,qBAA3B,IACA,KAAyB,CAExB,IAAImnD,GACH,OAAAD,QAAkB,IAAlBA,OAAA,EAAAA,EAAA,yBAAgDjrD,eAAmB,IAAnBA,WADjD,sBAEAA,EAAsB,OAAH,IAAG,CAAH,CAAKkrD,qBAAoB,GAA5ClrD,GAGD,OACClW,YAACk7D,KAAOxvB,OAAQA,EAAQ5rC,IAAKuhE,IAC5BrhE,mBAAKC,UAAU,qBACdD,kBAAIC,UAAU,eAAe8P,eAC7B/P,YAACmN,K,UACQ,+BACRmE,KAAM,QACN8B,SAAS,EACTtT,IAAKwhE,GACLr1D,QAASg1D,IAEVjhE,YAACmN,K,UACQ,8BACRmE,KAAM,OACNkrD,UAAU,EACVr8D,OAAQC,IAAOC,QACf4L,QAAS+0D,KAGXhhE,mBAAKC,UAAWsN,IAAQ+uD,YAAax8D,IAAKyhE,IACzCvhE,YAACwmB,KAAK1mB,IAAK0hE,IACVxhE,YAAC6a,GACAjF,UAAWA,EACXK,cAAeA,EACfC,oBAAqBA,EACrBjC,MAAOA,EACPC,MAAOA,KAGTlU,YAACwmB,KAAK1mB,IAAK2hE,IACVzhE,YAACimB,oBACDjmB,YAAC8/D,IACA4B,YAAY,EACZxnD,SAAUA,EACVtE,UAAWA,EACXI,KAAMA,EACNhC,uBAAwBA,EACxBjc,OAAQigB,OAOd,IAAMqpD,GAAavhE,YAAG,+RAOhByhE,GAAazhE,YAAG,+SAOhB0hE,GAAW1hE,YAAG,2EAGd2hE,GAAa3hE,YAAG,6MAMhBwhE,GAAexhE,YAAG,iFAIxB,SAASohE,GAAc,G,IAAEx1B,EAAM,SAAEg1B,EAAY,eAAEF,EAAK,QAKnD,OACCxgE,YAACk7D,KAAOxvB,OAAQA,EAAQ5rC,IAAK6hE,IAC5B3hE,mBAAKC,UAAU,qBACdD,YAACuhB,KACAlH,KAAM,eACNva,IAAKA,YAAG,kGACgC,8BAA9BmG,GADF,qBAITjG,YAAC4hE,KAAG3hE,UAAU,e,mBAEfD,mBAAKC,UAAWsN,IAAQ+uD,a,2GAGxBt8D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,mBAAKC,UAAWsN,IAAQs0D,uBACvB7hE,YAACmN,K,UACQ,+BACRmE,KAAM,qBACN8B,SAAS,EACTtT,IAAKwhE,GACLr1D,QAzBW,WACfy0D,EAAaH,OA0BVvgE,YAACmN,K,UACQ,+BACRmE,KAAM,iBACNkrD,UAAU,EACVr8D,OAAQC,IAAOC,QACf4L,QAASu0D,OAQf,I,wBAAMmB,GAAkB7hE,YAAG,mEACwB,SAApCmG,GADf,yBCzKa67D,GAAsB,SAAC,G,IAAElsD,EAAS,YAAEmsD,EAAmB,sBAC7D,EAKF9nD,qBALE,IAEQjG,EAAsB,iBAF9B,uBAILkG,EAAQ,EAJH,SAOErE,EAAYunD,KAAZvnD,QAEFmsD,EAAenlE,mBAAQ,WAC5B,IAAMmlE,EAAensD,EAAA,KACf,YAAY,MAAC,CACjB9G,IAAK+G,WADY,GAEjB/F,MAAO+F,WAFU,KAGjB5Y,KAAM4Y,EAHW,KAIjBuE,KAAMi5C,GAAQx9C,EAARw9C,MAJW,KAKjB2O,YALiB,EAMjBn0D,SAAUgI,yCAAgD9B,MAPvC,MASd,cAAU,OAAC88B,aAAeD,EAAfC,WAAgCD,cAAjC,KAEjB,OAAOkxB,EACJC,EAAA,KAAiB,cACjB,OAAIpmE,EAEH,OADAka,eACA,EAED,IAAMwS,EAAO05C,EAAapmE,EAA1B,GACA,kCACIka,IACHosD,UACC55C,qDACAxS,gCAAqCX,wBAGvC6sD,EAAA,QACA,Y,QAAY,OAAqBtF,QAArB,EAAQuF,QAAR,SAAAnsD,QAAM,IAANA,OAAA,EAAAA,EAAQmsD,kCAAavF,wCAArB,6BAEb,CAAC1oD,EAAwB6B,EA7B5B,IA+BMssD,EAAN,IAAqBH,SAEfI,EAAqB1sD,uBAC1B,YACC,IAAMwB,EAAU,CACfjB,cAAe,CACdjc,QAAS8b,8CAAmD9b,SAE7DkD,KAAM4Y,cAJS,KAKfI,oBAAqBJ,cAAmBI,qBAEzCgE,EAASP,KAATO,MAED,CAACtE,EAXF,IAcA,OACC5V,YAAC6S,KACAC,MAAOzV,iBACP6V,aAAckvD,EACdpvD,aAAcqvD,GACdhqC,YAAY,EACZllB,aAAc,CAAEC,SAAS,GACzBtF,SAAUq0D,EACV1vD,WAAY,MAEZzS,YAACmN,KAAOW,SAAUq0D,EAAc9nD,KAAM,SAAUjH,SAAO,MAKpDivD,GAAqB,SAAChwD,EAAM,G,IAAEJ,EAAW,cAAEC,EAAS,YAAEtW,EAAK,QAChE,IAAKsW,EAAL,iBACC,YAGD,IAAMiD,EAAqB9C,gCAA3B,mBACA,OACCrS,mBAAK+O,IAAKnT,GACRyW,aACArS,YAAC8a,IAAMC,cACLnf,OAAeoE,YAACsiE,UACjBtiE,mBAAKF,IAAKyiE,IAAWptD,IAGvBnV,YAACmS,KACAC,OAAQF,EAAUE,OAClBtE,SAAUoE,YAAsBG,EAAKvE,SACrC7B,QAASgG,EACTX,KAAMe,EAAKtC,MACXsK,KAAMhI,QAAarS,YAACuhB,IAAKlH,KAAMhI,EAAKgI,WAMlCkoD,GAAWziE,YAAG,+HCvIZ0iE,GAA6C7oD,GAAnB8oD,GAAmB9oD,GAErD,SAAwB+oD,GAAQlhD,G,QAAExL,EAAI,OAAEJ,EAAS,YAAEqlD,EAAgB,mBAAE/gE,yBAAa,IAAG,OAAAs5B,IAAWv4B,+BAAmB,IAAG,KAAOC,oBAAQ,IAAG,KAAO69B,sBAAU,IAAG,KACrJ,EAMF9e,qBANE,IACL0oD,IADK,MAEJC,IAFI,SAEQ/qD,EAAM,EAFd,OAEgB7D,EAAsB,EAFtC,uBAGSgE,EAAY,YAHrB,aAKLkC,EAAQ,EALH,SAOAmkD,EAAYH,KAEZ2E,EAAiDC,QAA9B,EAAS5sD,QAAT,EAAGF,eAAI,IAAJA,WAAME,0CAAqB4sD,6BACjD,EAA0Cv3D,oBAA1C,GAACw3D,EAAc,EAAf,GAAiBC,EAAqB,EAAtC,GAEAC,EAAc,WAAM,OAAA/oD,EAASsoD,GAAyB5sD,EAAWI,EAA7C,QACpBS,EAAcysD,EAAgBA,EAAcrrD,cAAjB,KAA2C4iD,GAAe5iD,cAA3F,KAEMsrD,EAAuB,WAC5BH,GAAsB,YAAO,aAGxBp1D,EAAQ/Q,mBACb,WAAM,MAAC,CACNi9D,qBAAsBiJ,KAEvB,CAJD,IAOMK,EAAoBvmE,mBAAQ,WACjC,OAAQo+D,EAAA,QAAwB,SAAA1sD,GAAK,OAAAA,EAAA,MAAUyH,EAAV,QAA9B,OAAP,IACE,CAACA,EAFJ,IAIA,OACChW,YAACw5D,GAAY9hC,UAAS9pB,MAAOA,GAC5B5N,YAACwmB,K,UAAa,cAAc1mB,IAAKujE,KAC9BC,GACDtjE,mBAAKF,IAAKyjE,IACTvjE,YAACg7D,IACAtoD,mBAAoB,YAAY,OAAAwH,EAASsoD,GAAyB5sD,EAAWE,EAA7C,OAChCmlD,iBAAkBA,EAClBrtD,MAAO0lD,GAAQt9C,EAAD,QAEfhW,YAAC+4D,SACA8J,GACA7iE,YAACmN,K,UACQ,uBACRiG,SAAO,EACPnH,QAASk3D,EACT9oD,KAAM,WACNkM,SAAU,aAGZvmB,YAACmN,K,UAAe,eAAeiG,SAAO,EAACnH,QAASg3D,EAAa5oD,KAAM,UAClEgkD,OACAr+D,YAAC8a,IAAMC,cACN/a,YAACs/D,IAAWtpD,KAAMA,IAClBhW,YAAC8hE,IAAoBlsD,UAAWA,EAAWmsD,oBAAqBA,KAGjEtrD,eACAzW,YAACmN,KAAOiG,SAAO,EAACnH,QAAS,WAAM,OAAAiO,EAASuoD,GAAT,KAAqCpoD,KAAM,cAI7Era,YAACsiE,KAAQxiE,IAAK0jE,KAGdxjE,YAACq6D,IACA9/C,MAAO,UACPG,YAAa,+EACb6/C,gBAAiB,SACjBkJ,QAASR,GAERG,EACApjE,YAACwmB,SADgB,sBAGhBxmB,YAAC8/D,IACA5lD,SAAUA,EACVtE,UAAWA,EACXI,KAAMA,EACNhC,uBAAwBA,EACxBjc,OAAQigB,KAKZhY,YAAC0jE,IAAeh4B,OAAQq3B,EAAgBvC,MAAO2C,EAAsBntD,KAAMA,EAAMJ,UAAWA,MAMhG,I,eAAM2tD,GAAgBzjE,YAAG,+LAOnB0jE,GAAe1jE,YAAG,2FAIXujE,GAAYvjE,YAAG,uPCxFf6jE,GAAwB,SAAC,G,IAAEtqE,yBAAa,IAAG,OAAAm6B,IAAW94B,+BAAmB,IAAG,KAClF,EAMFuf,qBANE,IACLhf,IADK,MAEJC,IAFI,SAEQ2c,EAAM,EAFd,OAEgB7D,EAAsB,EAFtC,uBAGS6B,EAAO,YAHhB,QAKLqE,EAAQ,EALH,SAQAmkD,EAAYH,KAEZznD,EAAcysD,EAAgBA,EAAcrrD,cAAjB,KAA2C4iD,GAAe5iD,cAA3F,KACMs7B,EAAS18B,eAAW,IAAXA,WAAf,OAKMwkD,EAAmBp+D,mBAAQ,WAChC,OAAOgZ,EAAA,KACD,YAAY,OAAAy9C,GAAQx9C,EAAR,QADX,QAEE,YAAY,0BAAOA,EAAP,SAAwCA,UAAxC,QACnB,CAACD,EAJJ,IAQM0kB,EAAgB59B,GADIsd,qBAA1B,KAWA,OANAjO,qBAAU,WACL6L,EAAA,cAAoB,SAAA7B,GAAQ,OAACilD,EAAA,MAAsB,SAAA1sD,GAAK,OAAAA,EAAA,MAAUyH,EAAV,WAAxD,OAAJ,GACCkE,EAASP,QAER,CAACshD,EAAkB/gD,EAAUrC,EAJhC7L,QAMI8Y,YAAJ,GACQ9kB,kBAAP,MAIAA,YAACrI,GAAmB+/B,UAAS9pB,MAAO2sB,GACnCv6B,mB,UAAa,iBAAiBF,IAAK,CAAC8jE,GAAkBzwB,IACpDt7B,EAAA,WAAiB,cAAa,OAC9B7X,YAAC0iE,IACA3zD,IAAQF,MAAKmH,EAAK9Y,KAClB8Y,KAAMA,EACNJ,UAAW/G,EACXosD,iBAAkBA,EAClBiI,cAAeA,EACfnB,oBAAqBA,OAGtBlqD,qBACA7X,YAACwmB,K,UAAa,cAAc1mB,IAAK+jE,IAdrC,0BAuBKD,GAAmB9jE,YAAG,ukBAatB+jE,GAAc/jE,YAAG,oHACX,kFADZ,I,SCnGgBgkE,GAAmBtiD,GAElC,OAAO+E,EAFqC,YACvBtM,qBAArB,KDyGD0pD,aAAkC,CAAE5rE,OAAQwI,OE/G5C,I,SC4BA,GD5BA,G,YACC,oBACCwjE,gBADD,K,OAiDA5J,UAAU,YACH,MAAgCA,EAAhC,MAAE9pB,EAAY,EAAd,aAAgB2zB,EAAW,EAA3B,YACEv5C,EAAW4lB,EAAX5lB,OACFjsB,EAASsO,EAAf,UAEA,IAECk3D,EADyBxlE,MAAWisB,EAApC,SAEA0vC,iBAtDDA,WACAA,YAAiBr/C,IAAjBq/C,Y,EA0EF,OA/EqCx6D,iBAQpCskE,kCAEC,IAAI9rD,EAAYvJ,YAAUhX,KAAKugB,UAA/B,SACAA,yDAME,WACCA,OAAevgB,KAAKo9B,MAAMkvC,MAA1B/rD,WACAA,yBAFD,KANFA,QAaD8rD,yCAECrsE,KAAA,sBAGDqsE,0CACS,IAAA5zB,EAAiBz4C,KAAKspB,MAAtBmvB,aACAnI,EAAkCmI,EAAlCnI,OAAQuH,EAA0BY,EAAlC,WAAoBb,EAAca,EAAlC,UACF8zB,EAAmB,CACxB,CAACj8B,EAAD,KAAcA,EADU,KAExB,CAACsH,EAAYtH,EAAb,KAA0BuH,EAAavH,EAFxC,MAIIk8B,EAAaxsE,KAAKo9B,MAAtB,MAEA,SAAIovC,EAAoB,CAGvB,IAAIC,EAAYz1D,uBAAsBhX,KAAtC,SAEAA,KAAA,SAAc,CAAEssE,MAAOG,IACvBD,IAGDx1D,YAAUhX,KAAKugB,UAAfvJ,cAAuCw1D,SAAvCx1D,KAeDq1D,8BACC,OACCjkE,iB,UACS,WACRC,UAAU,UACVqe,IAAK1mB,KAAKugB,WAEVnY,oBACCF,IAAKA,YAAG,iTASb,E,CA/EqCH,IAArC,WEIa2kE,GAAU,EAAVA,GAED,EAENnxB,GAAS,CACdoxB,SAAUzkE,YAAG,6rBAsBb0kE,aAAc1kE,YAAG,oHAKlB,SAAgB2kE,GAASjjD,G,IAAE+iD,EAAQ,WAAEG,EAAc,iBAE5Cr0B,EAAep2B,qBAArB,IACQwQ,EAA0C4lB,EAA1C5lB,OAAQglB,EAAkCY,EAA1C,WAAoBb,EAAsBa,EAA1C,UAA+BnI,EAAWmI,EAA1C,OAEF,EAAY9kC,qBAAXgD,EAAC,EAAF,GAAIo2D,EAAI,EAAR,GACA,EAAoCp5D,qBAAnCq5D,EAAa,EAAd,GAAgBC,EAAgB,EAAhC,GACA,EAAwCt5D,oBAAxC,GAACu5D,EAAe,EAAhB,GAAkBC,EAAkB,EAApC,GACAC,EAAc3pD,iBAApB,MAGA4pD,2BAAgB,WACf,GAAIV,GAAJ,EAAwB,CACjB,MAyLT,SAAqCA,EAArC,GACC,IAAMW,EAAeX,MAArB,GACMh2D,EAAI22D,EAAV,GACMh3D,EAAQg3D,KAAkBA,EAAhC,GACA,MAAO,CAAE32D,EAAF,EAAKq2D,cAAe12D,GA7LIi3D,CAA4BZ,EAAnD,GAAE36B,EAAC,EAAH,EAAKw7B,EAAa,EAAlB,cACNT,KACAE,QAEC,CAACN,EANJU,IASAj5D,qBAAU,WACT,KAAqB,CACpB,IAAMq5D,EAAkB,CAAC56C,SAAD,GAAmBA,SAAclc,EAAzD,IACAw2D,MACAL,QAEC,CAACj6C,EAAQi6C,EAAgBI,EAAiBv2D,EAN7CvC,IASA,IAAMs5D,IAAkB,MAAxB,EAMA,KAAqB,EAyGtB,SAAoC,EAApC,SAOC,IAAMC,EAAa32D,YAAUo2D,EAA7B,SAGMQ,EAAWD,SAAjB,kBACME,EAAiB,OAAA72D,EAAA,gBAEV,SAAU9B,GAErB,IAAIimC,EAAS,OAAAnkC,EAAA,GAAW9B,GAAxB,GAGA43D,EAAen2D,EADEwkC,EAAjB,MANqB,SAAvB,GAWAyyB,UAGA,IAAME,EAAUH,SAAhB,SACMI,EAAgB,OAAA/2D,EAAA,gBAET,SAAU9B,GAErB,IAAIimC,EAAS,OAAAnkC,EAAA,GAAW9B,GAAxB,GAGA43D,EADa3xB,EAASuxB,GADLM,GAAiB7xB,EAAjB6xB,GAA+BN,OAL5B,SAAtB,GAWAoB,UAGA,IAAME,EAAiBh3D,YAAvB,aACMi3D,EAAe,CAAEt3D,EAAC,GACxBq3D,OAAoB,CAApBA,IAEA,IAAME,EAAe,OAAAl3D,EAAA,gBAER,SAAU9B,EAAO2C,GAE5B,IAAIsjC,EAAStjC,IAAM3C,EAAnB,GAEA2C,MACAi1D,EAAe3xB,EAAf2xB,MAPmB,SAArB,GAWAkB,UAnJCG,CAA2Bf,GAT3B,SAA6Bz2D,EAAGL,GACzB,MAAeuc,eAAf,IAqKT,SAA0Bu7C,EAAMC,EAAM/3D,EAAOK,GAC5C,IAIM23D,EAAah4D,EAnPpB,GAoPOi4D,EAAa53D,EAAIy3D,EAAvB,EACMI,EAAY73D,IAAlB,EAGA,QANiBL,EAHC+3D,EAAlB,GAQ2BI,MAA3B,IA7K2BC,CADd,EAAL,GAAW,EAAX,GACgDp4D,EAAtD,KAECy2D,KACAE,SAbH,WACCE,QAgBwEx2D,EAAxEw3D,GAGD,OACC/lE,YAAC8a,IAAMC,cAEN/a,YAAC48B,UACC0oC,EACAtlE,YAACi9B,KAAO/e,GACPnP,IAAK,eACLuP,IAAK0mD,EACL7nC,QAAS,CAAEpc,QAAS,GACpBqc,QAAS,CAAErc,QAAS,GACpB1C,KAAM,CAAE0C,QAAS,IAEjB/gB,iBAAGF,IAAKqzC,GAAOqxB,cACdxkE,oBACCuO,EAAG25B,EAAOjM,KACV/tB,MAAOK,EAAI25B,EAAJ35B,KAAkB+1D,GACzB71D,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,IAETzvC,oBACCuO,EAAGA,IAAoB+1D,GACvBp2D,MAAOshC,GAAajhC,IAAoB+1D,IACxC71D,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,MAIR,MAGLzvC,YAACikE,IAAgBD,YAAaU,EAAgBr0B,aAAcA,IAE5DrwC,YAAC48B,UACC0oC,EACAtlE,YAACi9B,KAAO/e,GACPnP,IAAK,WACLjP,IAAKqzC,GAAOoxB,SACZjmD,IAAK0mD,EACL7nC,QAAS,CAAEpc,QAAS,GACpBqc,QAAS,CAAErc,QAAS,GACpB1C,KAAM,CAAE0C,QAAS,IAEjB/gB,iBAAGC,UAAW,gBACbD,oBACCyO,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,EACRlhC,EAAGA,EAAI+1D,GAAJ/1D,EAAwB+1D,GAAoB,EAC/Cp2D,MAAOo2D,KAERtkE,oBACCC,UAAU,UACVwO,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,EACRlhC,EAAGA,EAAI+1D,GACPp2D,MAAOo2D,MAITtkE,oBACCC,UAAU,WACVwO,EAAGy5B,EAAOpM,IAAKvtB,EAAGA,EAClBL,MAAO02D,EACPz2D,OAAQshC,IAGTzvC,iBAAGC,UAAW,iBACbD,oBACCyO,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,EACRlhC,EAAGA,IAAoB+1D,GAApB/1D,EAAwC+1D,GAAoB,EAC/Dp2D,MAAOo2D,KAERtkE,oBACCC,UAAU,UACVwO,EAAGy5B,EAAOpM,IACV3tB,OAAQshC,EACRlhC,EAAGA,EAAIq2D,EACP12D,MAAOo2D,OA7Ed,QD3DD,SAAYiC,GACXA,0BAmBAA,gBAEAA,uBAEAA,cAxBD,CAAYA,QAAZ,KA+BA,IAAavzB,GAA4B,SAAC,GAAE,IAAAS,EAAgB,EAAhBA,iBAAqBvyB,EAAK,cAA5B,sBACnC,EAA0BiE,GAAW,CAC1CO,UAD0C,eAE1CxT,UAAW,CACV,CACCjW,KADD,SAECjC,QAAS,CACR+4C,OAAQ,CAAC,EAAG,QANTtrB,EAAO,EAAR,GAAUC,EAAY,EAAtB,GAaA,EAaFzN,qBAbE,IACL/f,IADK,MAIFe,qBAJE,SAIFA,OAAQ,IAAG,GACVw9D,YADU,KAEVD,aAAc,MANb,EAUJt9D,cAAa8c,EAAY,EAVrB,aAUuBjB,EAAU,EAVjC,WAYLmD,EAAQ,EAZH,SAcEu+C,EAA8BlgE,EAA9BkgE,YAAaD,EAAiBjgE,EAA9B,aAGFiuE,EAAgB9wD,uBACrB,YACCwE,EACCP,GAAA,sCACIphB,IACHkgE,YAAW,MAGbtS,GAAgB,uBAAuB,WACtC,OAAUsS,0BAAmCA,KAA7C,mBAGF,CAAClgE,EAZF,IAeAyT,qBAAU,W,QACT,GAAKwsD,GAAL,GAEA,IAAM9gD,EAAc,CACnBsN,KAAM,OAAGxD,EAACg3C,EAADh3C,MAAqB,CAAEilD,KAAMhO,EAAY,IAA5C,SAAsDp/D,EAACm/D,EAADn/D,MAAqB,CAAEqtE,IAAKjO,EAAY,IAA9F,KAEPv+C,EAASP,cAATO,OACE,CAACA,EAAUu+C,EAPdzsD,IAUM,MAA8BT,mBAAS,CAAE4C,OAAF,KAAgBD,MAAO,OAA7DF,EAAU,EAAX,GAAayiB,EAAa,EAA1B,GACAk2C,EAAuBjxD,uBAC5B,YACC,IAAMkxD,EAAMC,KAAZ,YACAp2C,EAAc,CACbtiB,OAAQy4D,EADK,OAEb14D,MAAO04D,EAAI14D,UAGb,CARD,IAcM44D,MACF,OAAA9uD,QAAY,IAAZA,OAAA,EAAAA,EAAA,aAA0BjB,eAAU,IAAVA,WAA7B,YAAsDiB,aAA0BjB,EADjF,SAIM,EAAuCm+C,IAAmD,W,uHAC3Fn+C,GAAcyhD,GAEb,OAAAzhD,QAAU,IAAVA,OAAA,EAAAA,EAAA,iCAA8CyhD,EAAlD,mBACC,IAIGzhD,EAAA,MAAmB,EACf,GAAMgwD,YAAuBhwD,EAAY,CAAb,gBAClCiwD,iBAAkBvzB,GACfwzB,GAAqBj5D,EAAD,MAFjB,MADJ,MAPD,M,OAQF,SAAO,EAAP,Q,OAKA,e,0BAGA,CAAC+I,EAAYyhD,EAAc/kB,EAAkBzlC,EAjB1C,QAAQwiC,EAAQ,EAAhB,KAAyB02B,EAAS,EAAlC,MAoBA,EAA2ChS,IAAiB,W,uHAC7Dl9C,GAAA,GAA4BwgD,EAC3BsO,GAAsB9uD,QAAqB,EACzB,GAAM+uD,YAAuB/uD,EAAc,CAAf,gBAChDmvD,UAAW32B,EAAS42B,UACpBC,QAAS72B,EAAS82B,QAClBN,iBAAkBvzB,GACfwzB,GAAqBj5D,EAAD,MAJH,MADlB,MADD,M,OAQF,SANqB,EAAfu5D,Q,OAQN,e,0BAGA,CAAC/2B,EAAUx4B,EAAcwgD,EAAcsO,EAAoBrzB,EAAkBzlC,EAd1E,QAAQ2jC,EAAU,EAAlB,KAA2B61B,EAAW,EAAtC,MAiBGC,EAAYl8D,qBAAf,GACNS,qBAAU,YACLk7D,GAAJ,IAECO,GAAS,WACR,MAAM,IAAI5oE,MAAV,uCAGA,CAAC2oE,EAPJx7D,IAUA,IAAM07D,EAAsB7qE,mBAAQ,WAAM,OAAA6yC,GAAA,KAA+B,CAAzE,IAEA,OACC1vC,YAACkgE,KAAaC,SAAUwG,GACvB3mE,+BAAKoO,MAAO,CAAED,OAAF,OAAkBD,MAAlB,OAAiC6zB,SAAU,WAAgB7gB,GAEpElJ,EAAiCA,YAA2BhY,YAACo2C,SAA5Bp+B,WAAoE,KAAtFhY,YAACD,GAAjB,MAGAywC,GAAA,GACA,OAAAA,QAAQ,IAARA,OAAA,EAAAA,EAAA,MACCxwC,YAAC8a,IAAMC,cACL0M,EAEDznB,YAAC+uC,IAAcC,iBAAkBwB,EAAUxiC,WAAYA,EAAYilC,kBAAgB,GAClFjzC,YAAC+xC,IACAJ,WAAY+1B,EACZ5nE,IAAK,CAACqzC,GAAD,QAAkB2zB,EAAlB,KAAuC3zB,GAAtB,aAGvBnzC,YAACykE,IAASF,SAAU9L,EAAaiM,eAAgB8B,IAGjDxmE,YAAC8jE,SACC,Y,IAAGr5C,EAAM,SAAEglB,EAAU,aAAEvH,EAAM,SAAEU,EAAM,SAAEzwC,EAAI,OAC3C,OACC6H,iBAAGgP,UAAW,aAAak5B,EAAb,UAA6BA,EAA7B,SACZ/vC,EAAA,KAAS,c,UAGT,GAAIgY,YAAI9S,cAAcoS,EAAlBU,SAAJ,EAAsC,CACrC,IAAMw3D,EACLD,GACAA,EADAA,OAGAA,YAJD,MAKME,EAAQn9C,EAAOhb,EAArB,OAEIo4D,EAAQj/B,EAAOn5B,SAAnB,OACItB,EAASshC,EATwB,EAOrC,EAKA,IACCo4B,EAAQp4B,EANT,EAOCthC,EAPD,GAWA,IAAID,EAAQuc,EAAOhb,EAAPgb,KAAgBA,EAAOhb,EAAnC,OACAvB,GAECmjC,qBACS,CAAC,EAAD,IADTA,YAEQ,CAAC,IAFTA,gBArBoC,GA2BrC,IAGMy2B,EAAiB,kBAAsC,QAAtC,EAAoB/3D,QAApB,EAAiBN,eAAC,IAADA,WAAGM,4BAAOg4D,MAAM,KAAK,yBAAtC,oBAA8DxgC,QAA9D,EAA2D93B,eAAC,IAADA,WAAG83B,0BAArF,eAEA,OACCvnC,gC,UACU8nE,EACT7nE,UAAW,UACXH,IAAKA,YAAG,iUAIRiP,IAAKF,EACLN,EAAGq5D,EACHn5D,EAAGo5D,EACH15D,OAAQA,GAAkB,EAC1BD,MAAOA,GACHwZ,EACH1nB,YAACqmB,IACA9L,MAAO9K,EAAEM,MACTuW,cAhDiC,aAiDjCN,QAAS,CACR2sB,MAAOljC,EADC,MAERmjC,IAAKnjC,EAFG,IAGRojC,SAAUC,aAAerjC,EAAD,MAAUA,EAH1B,KAIR,iBAAkBk4D,aAJV,EAKR,cAAel4D,SAAS6Z,YAMvB,OAAO,cAjFtB,yCAPJ,QAyGD,SAAS29C,GAAqB/4D,EAA9B,GACC,OAAI85D,IAAczB,GAAlB,UACQ,CACN0B,iBAAkBz5D,SAASA,WAAWN,EAApBM,KADZ,GAEN05D,iBAAkB15D,SAASA,WAAWN,EAApBM,QAGnB,GAIF,I,SAAM2kC,GAAS,CACdg1B,QAASroE,YAAG,+EACe,kBACJ,WADdW,GADG,YAEDA,GAHG,OAKd2nE,UAAWtoE,YAAG,6DACyB,WAA9BmG,GADK,oBE5RToiE,GAAN,GAGA,SAAgBC,GAAiFv5D,GAChG,OAAOs5D,GAAP,GCdM,IAAME,GAAmD,WACzD,MAaFtuD,qBAbE,IAEJ5gB,UAFI,SAGH2a,EAAsB,EAHnB,uBAKFtZ,YALE,SAKFA,OAAQ,IAAG,GACV+9D,YADU,KAEVD,aAAc,MAPb,EAYLt+C,EAAQ,EAZH,SAcEs+C,EAAiBjgE,EAAjBigE,aAEFrjD,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIMi0D,EAAqB3rE,mBAAQ,WAClC,O,SrQ5BkCkY,EAAmB7X,GACtD,IAAMxB,EAA8BoZ,GAApC,GACA,OAAOzX,OAAA,kBAAiC,SAAAvC,GAAY,OAAAA,EAAA,YqQ0B5C2tE,CAAoBtzD,EAAoBgP,IAA/C,YACE,CAFH,IAIAnY,qBAAU,WACT,IAAIwsD,GAAJ,GAIA,IAAMkQ,EAAsBJ,GAA5B,2BACMK,EAAkBD,EACrBhwE,YAAiCsb,EAAwB,CAAzDtb,IADwC,GAA3C,KAIAwhB,EACCP,GAAA,sCACIphB,IACHigE,aAAcmQ,eAAe,IAAfA,IAAmBH,EAAmB,UAIpD,CAACx0D,EAjBJhI,IA8BA,OAEChM,WAFD,CAEEuS,IACAvY,QAASwuE,GAAsB,GAC/B91D,mBAfF,YACCwH,EACCP,GAAA,sCACIphB,IACHigE,aAAc19D,OAYf2X,WAAY+lD,EACZxmD,eARqB,SAACzD,GAAM,OAACA,EAAIA,EAAH,KAAF,IAS5B+E,UAAWk1D,sCAA2D,yBACtE16D,UAAW06D,EAAmB5mC,U,SCjEjBgnC,GAAoB1uD,EAAU3hB,GAC7C2hB,EACCP,GAAA,sCACIphB,IACHkgE,YAAa,SAGfv+C,EAASP,cAATO,OAGD,I,yDAAa2uD,GAAmC,SAAC3nD,GAC1C,MAOFjH,qBAPE,IAGQ1hB,EAAQ,yBAHhB,SAML2hB,EAAQ,EANH,SAaA,MAA4CY,aACjDyrD,GADK,WAACuC,EAAiB,EAAlB,GAAoBC,EAAoB,EAAxC,GAKAC,EAAgC,iBAAkB,WACvD,OACChpE,YAAC4zB,SACCv2B,OAAA,cAAuC,YACvC,OACC2C,YAACmS,KACApD,IAAKk6D,EACL33D,KAAM23D,EACNh9D,QAAS,WAAM,OAAA88D,EAAqBxC,GAArB,KACfpmE,OAAQomE,UAAuDnmE,IAAvDmmE,QAAwEnmE,IAAO8oE,aAM1F,CAfH,IAiBA,OACClpE,+BAAKF,IAAKitD,IAAkB7rC,GAC3BlhB,YAACq6D,IAAcE,gBAAiB,QAAS7/C,YAAa,MAErD1a,mBAAKF,IAAKqpE,IAETnpE,mBAAKF,IAAKspE,IACTppE,sBAAQF,IAAKupE,I,gBAGbrpE,mBAAKF,IAAKwpE,IACTtpE,YAACuoE,WAIHvoE,mBAAKF,IAAKypE,IACTvpE,YAACmN,KAAOiG,SAAO,EAACnH,QA1CrB,WACC28D,GAAoB1uD,EAApB0uD,IAyC8CvuD,KAAK,UAC/Cra,YAACwpE,KAAQxjD,QAAShmB,YAACgpE,QAAkCj+B,SAAUC,IAASy+B,YAAah+B,SAAU,YAC9FzrC,YAACmN,KAAOiG,SAAO,EAACiH,KAAK,OAAOjM,MAAO,CAAEY,UAAW,sBAMnDhP,YAACgzC,IAASS,iBAAkBq1B,OAO1B/b,GAAejtD,YAAG,qVAMF,IAAY,SAAtB0lD,GAAcA,IAEpB2jB,GAAcrpE,YAAG,uRAOjBspE,GAA+BtpE,YAAG,6NAMlCupE,GAA6BvpE,YAAG,iNAGhCwpE,GAA+BxpE,YAAG,uLAGlCypE,GAAqBzpE,YAAG,qPCpGjB4pE,GAAS,SAAC,G,IAAKxoD,EAAK,cAAV,IAGPlJ,EAEXiC,yCAFWjC,aAGT,EAA0BzM,mBAA1B,IAACo+D,EAAQ,EAAT,GAAWC,EAAW,EAAtB,GACA,EAA8Br+D,oBAA9B,GAACs+D,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAAwCv+D,oBAAxC,GAACw+D,EAAe,EAAhB,GAAkBC,EAAkB,EAApC,GAEAC,EAAe,W,sHAIA,OAHpBL,MACAI,MAEoB,GAAMjuE,YAAKmuE,WAAyBlyD,EAA1B,UAAkD,CAC/EmyD,SAD+E,uCAE/EC,WAAYT,GAAY,qB,OAFrBU,EAAgB,EAAhBA,O,wBAKIA,EAAcC,e,GACrB,IA9BYC,EA8BZ,IA7BK,IAAIhV,SAAQ,YAAa,OAAA7Q,WAAW8lB,EAAX,Q,OA8Bd,OADhB,SACgB,GAAMC,YAAI,eAAeJ,EAAf,SAAD,UAAT,K,cAAhBA,EAAgB,EAAhBA,O,oBAIDv7C,YAAYu7C,EAAZv7C,cACAk7C,MACAF,M,IArCY,IAACS,SAwCRG,EAAe,WACpBZ,MACAF,MACAI,OAGD,OACChqE,YAAC8a,IAAMC,cACN/a,YAACmN,iBACAkG,UAAW,SACXpH,QAAS,WAAM,OAAA69D,GAAA,IACfvjD,SAAU,SAEVnT,SAAO,E,UACC,iBACJ8N,IAELlhB,YAACk7D,KAAO3gD,MAAO,gBAAiBF,KAAM,SAAUqxB,OAAQm+B,EAAYxN,QAASqO,GAC5E1qE,mBAAKF,IAAKoM,IACP69D,EA6BD/pE,YAACE,IA1CN,MAcKF,YAAC8a,IAAMC,cACN/a,iEACwCA,0BAASgY,eAAY,IAAZA,WAAcoE,iBAE/Dpc,YAACsN,KACAnN,OAAQC,IAAOC,QACfsN,YAAa,8BACbE,WAAS,EACTR,MAAI,EACJs9D,OAAK,EACL/8D,MAAO+7D,EACPiB,WAAY,YAAO,MAAC96D,gBAAoBm6D,IAArB,MACnBv8D,SAAU,YAAO,OAAAk8D,EAAY95D,SAAZ,QACjBrC,SAAU,S,UACF,mBAETzN,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,mBAAKC,UAAWsN,IAAQs0D,uBACvB7hE,YAACmN,KAAOhN,OAAQC,IAAOC,QAAS4L,QAASg+D,E,UAAsB,sB,QAG/DjqE,YAACmN,KAAOhN,OAAQC,IAAO8oE,KAAMj9D,QAASy+D,E,UAAsB,wBAtB/D,iBAqCAx+D,GAAYpM,YAAG,yNC/FR+qE,GAAiB,SAAC,G,IAAE3H,EAAa,gBACvC,EAOFjpD,qBAPE,IAGOxD,EAAW,wBAHlB,YAMLyD,EAAQ,EANH,SASIN,EACNK,+BADML,YASV,OACC5Z,YAAC6S,KACAC,MAAOzV,iBACP6V,aATF,YACCgH,EACCP,GAA4C,CAAE5K,IAAK8I,EAAP,IAAmBnB,UAAWmB,EAAOnB,WADlFwD,KASCzH,WAAYywD,EAAczsD,EAAD,KACzBzD,aAAc+kB,GACdM,YAAY,EACZllB,aAAc,CAAEC,SAAS,IAEzBpT,YAACmN,K,UACQ,iBACRkN,KAAM,cACNhH,UAAW,aACXD,SAAO,EACP/F,MAAI,GAGH61D,EAAczsD,EAAdysD,KAjBJ,SAwBKnrC,GAAe,SAAClgB,EAAQ,G,IAAE5F,EAAW,cAAEC,EAAS,YAAEtW,EAAK,QAC5D,OAAKsW,EAAL,iBAIClS,YAACmS,K,UACS0F,EAAO9I,IAChBA,IAAKnT,EACLwW,OAAQF,EAAUE,OAClBtE,SAAUoE,EAAUpE,SACpB7B,QAASgG,EACTX,KAAMuG,EAAO9H,QATd,MCpDW+6D,GAAchrE,YAAG,6RCqBjBirE,GAAuB,SAAC,G,IAAEC,EAAY,eAC5C,EAMF/wD,qBANE,IACLvf,IADK,MAEM2kE,EAAiB,EAFvB,SAGQrrD,EAAsB,WAH9B,uBAKKoqD,EAAiB,EALtB,SAOAT,EAAcP,KAAdO,UAEA5wB,EAAU9f,cAEV,EAA8B1hB,mBAA9B,MAAC0/D,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAAyD3/D,oBAAzD,GAAC4/D,EAA0B,EAA3B,GAA6BC,EAAwB,EAArD,GACA,EAAkD7/D,oBAAlD,GAAC8/D,EAAoB,EAArB,GAAuBC,EAAuB,EAA9C,GAGAC,EAA6B,WAAM,OAAAH,GAAA,IAKnCI,EAAe91D,uBACpB,YAEC0oD,EAAkBzkD,cADlB,MAGD,CALD,IAQM8xD,EAAmB/1D,uBACxB,YACC,IAAMg2D,EAAW,uBAAsB,YAAO,OAAAn9D,EAAA,cAAkByuD,EAAlB,OAA9C,GACAwO,OAED,CAAC7N,EALF,IAQMgO,EAAiBj2D,uBAAY,WAClC+1D,KACAF,MACE,CAACN,EAHJ,IAKMW,EAAiB/uE,mBAAQ,W,MAC9B,OAA0Bid,QAA1B,EAAOulD,eAAiB,IAAjBA,WAAmBvlD,+BAA1B,KACE,CAFH,IAYM+xD,EAAqBn2D,uBAAY,WACtC0oD,EAAkBzkD,QAAlBykD,MACE,CAFH,IAIMtmD,EAAQjb,mBAAQ,WACrB,IAAMivE,EAAiBnO,EAAA,KACjB,YAAc,MAAC,CACnB5uD,IAAKyH,WADc,GAEnBzG,MAAOyG,WAFY,KAGnBtZ,KAAMsZ,WAHa,KAInB6D,MAlBc6iD,EAkBA1mD,WAJK,KAbd0mD,IAAaN,GAAbM,SACJ7sC,IADI6sC,UAEJA,IAAaN,GAAbM,OACA7sC,IADA6sC,OAFH,IAkBE2B,cALmB,EAMnBkN,eAAgBF,GApBH,IAAC3O,KAaO,MAShB,cAEL,IAAkCpsB,EAOlC,OAPkCA,EAOFviC,GAAzBy9D,EANLn7B,2CAAD,IACCC,6CADD,IAEkB,SAACA,EAAGD,GACtB,OAAAC,EAAA,mDAAqDD,gBAArD,wBAGwCo7B,CAAW19D,EAA7Cy9D,IAFa,SAACl7B,EAAGD,GAAM,OAAAC,EAAA,oBAAsBD,EAAtB,OAE+Bq7B,CAAY39D,EAAzE,MAEF,OAAOy8D,EACJc,EAAA,KAAmB,cACnB,OAAIlwE,EAEH,OADAohE,eACA,EAED,IAAM10C,EAAOwjD,EAAelwE,EAA5B,GACA,kCACIohE,IACHkF,UAAW55C,yCAA8C00C,gBAAmBhpD,4BAG7E83D,EAAA,QAAsB,YAAc,OAAAt1D,EAAA,8CACrC,CAACq1D,EAAoBlO,EAAW3pD,EAlCnC,IA6CMm4D,EAAoB,WACzB,YAAIP,EACH,SAED,IAAM/M,EAAgBlB,EAAA,QAAiB,YAAO,OAAApvD,EAAA,mBAA9C,GACA,OACCinD,YAAQqJ,EAAD,QAAwBQ,EAA/B7J,WACAA,YAAQqJ,EAAD,OAAuBQ,EAF/B,SAUD,OACCr/D,YAAC8a,IAAMC,cACN/a,YAACs7D,IACA/gD,MAAO,kBACPF,KAAMra,YAACuhB,KAAKlH,KAAMgW,IAAU+7C,aAAcjsE,OAAQ,YAClDmR,KAAM,+DACNiqD,KAAM4Q,IACN1Q,SAAU,YAAU,OAAA1uB,EAAA,SACpByuB,sBAAuB,WACtB,QAAI2Q,OAMLhB,GACAnrE,YAACqsE,IAAqBhQ,QAASkP,EAA4Bt/D,QAAS0/D,IAEpEN,GAAwBrrE,YAACssE,IAAmBjQ,QArHf,WAAM,OAAAiP,GAAA,MAsHpCtrE,YAACusE,IACAx9D,IAAKiF,EACL8D,MAAOA,EACP8zD,eAAgBA,EAChBl5D,mBA/CyB,SAACsqD,GACxBmP,KACHjB,KAjFsCE,GAAA,IAoFtCK,UAiDGc,GAAa,SAAC,G,IAAEz0D,EAAK,QAAE8zD,EAAc,iBAAEl5D,EAAkB,qBACxDyvD,EAAN,IAAqBrqD,SACf00D,EAAe10D,EAAA,MAAW,YAAO,OAAAvJ,EAAA,YAAvC,KAEA,OACCvO,YAAC6S,KACAC,MAAOzV,iBACP6V,aAAcR,EACdD,WAAY+5D,EACZx5D,aAAc+kB,GACdM,YAAY,EACZvqB,SAAUq0D,EACVhvD,aAAc,CAAEC,SAAF,EAAiB/F,MAAM,GACrCpN,UAAWsN,IAAQC,KACnB1N,IAAKA,YAAG,wGAIRE,YAACmN,KAAOkG,UAAWgd,IAAUoF,WAAY3nB,SAAUq0D,EAAcsK,UAAW,OAAQp/D,MAAI,GACtF80D,EAAe,iBAAmBqK,EAAeA,EAAH,MAflD,wBAuBKz0C,GAAe,SAAC1lB,EAAM,G,IAAEJ,EAAW,cAAEC,EAAS,YAAEtW,EAAK,QAM1D,OACCoE,mBAAK+O,IAAKnT,GACRyW,aACArS,YAAC8a,IAAMC,cACLnf,OAAeoE,YAAC0sE,UACjB1sE,mBAAKF,IAAK6sE,IAAkBt6D,gBAAmB2B,yBAGjDhU,mBAAKF,IAAK8sE,IACT5sE,YAACmS,KACAC,OAAQF,EAAUE,OAClBtE,SAAUoE,EAAUpE,SACpB7B,QAASgG,EACTX,KAAMe,EAAKtC,MACXsK,KAAMhI,EAAKgI,OAEXnI,UAAoBlS,YAACmN,KAAOkN,KAAMgW,IAAUw8C,MAAOz5D,SAAO,EAACnH,QArBlC,SAAC6D,GAC7BA,mBACAuC,yBAyBIg6D,GAAuB,SAAC,G,IAAEhQ,EAAO,UAAEpwD,EAAO,UAC/C,OACCjM,YAACk7D,IACA3gD,MAAO,kBACP4gD,KACCn7D,mBAAKC,UAAWsN,IAAQ+uD,aACvBt8D,sFAGFqa,KAAMra,YAACuhB,KAAKlH,KAAMgW,IAAU+7C,aAAcjsE,OAAQ,YAClDk8D,QAASA,EACTjB,OACCp7D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KACAiG,SAAS,EACTtT,IAAKA,YAAG,qOAKRmM,QAASowD,G,UAIVr8D,YAACmN,KAAOqvD,UAAU,EAAMvwD,QAASA,EAAS9L,OAAO,W,gBAShDmsE,GAAqB,SAAC,G,IAAEjQ,EAAO,UACpC,OACCr8D,YAACk7D,IACA9sD,MAAO08D,GACP3P,KACCn7D,mBAAKC,UAAWsN,IAAQ+uD,aACvBt8D,yDAGFqa,KAAMra,YAACuhB,KAAKlH,KAAMgW,IAAUy8C,sBAAuB3sE,OAAQ,SAC3Dk8D,QAASA,EACTjB,OACCp7D,mBAAKC,UAAWsN,IAAQgvD,eACvBv8D,YAACmN,KACAiG,SAAS,EACTtT,IAAKA,YAAG,qOAKRmM,QAASowD,G,cAUTsQ,GAAkB7sE,YAAG,+HAKrB8sE,GAAgB9sE,YAAG,qPChRZitE,GAAe,SAAC,G,IAAE1zE,wBAAY,IAAG,KACvCglE,EAAYH,KAElB,OACCl+D,mBAAKF,IAAKktE,IAEThtE,mBAAKF,IAAKmtE,IACTjtE,4CACAA,YAAC6qE,IACA3H,cAAezI,GACfrnD,SAAO,IAERpT,YAAC+4D,SACD/4D,YAAC0pE,UAGDrL,GACAr+D,YAACktE,KAAa7/D,MAAI,EAACvN,IAAKqtE,IACvBntE,YAAC+qE,IAAqBC,aAAcA,IACpChrE,YAACk/D,SACDl/D,YAACm+D,GAjBL,SAyBK6O,GAAkBltE,YAAG,+JACP,IAAY,WAET,UACH,eAGM,mEANd0lD,GAAYA,GAEpBj4C,IAHuB,eAOvBA,IAPJ,gBAYM0/D,GAAentE,YAAG,yHAKlBqtE,GAAsBrtE,YAAG,6DACZ,WAAR0lD,IC3DH,GAAwC7rC,GAAjByzD,GAAiBzzD,GASnC0zD,GAAU,WAChB,MAMFpzD,qBANE,IACL5gB,IADK,MAEQ2a,EAAsB,WAF9B,uBAGJtZ,cAAaR,IAHT,QAGkBozE,OAAgB,IAAG,KAHrC,EAGyCp1D,EAAY,EAHrD,aAGuDnB,EAAU,EAHjE,WAKLmD,EAAQ,EALH,SAQA,EAAwB3O,mBAAxB,IAACkqD,EAAO,EAAR,GAAU8X,EAAU,EAApB,GACA,EAAwChiE,mBAAxC,MAACiiE,EAAe,EAAhB,GAAkBC,EAAkB,EAApC,GAYA,EAAoBvY,IAAiB,W,oIAC1C,MAAiB,UAKbO,EAAU,CAAC,CAAE1mD,IAAF,MAAcnB,MAAOmJ,IAChC2+B,IACE7lC,EAAUxS,eAAVwS,GACGhB,I,wBAAOA,EAAIgB,EAAQ+xB,QACrBpgB,EAAsB3R,EAAtB2R,GAACzS,EAAG,EAAJyS,GACe,QADTksD,EAAY,EAAlBlsD,IACF,MACY,GAAMjK,YAAOm+B,EAAUnhC,YAAX,GAAZ,KAHWqtB,G,UAGpB7pC,EAAS,EAATA,OACN09D,OAAa,CAAE1mD,IAAF,EAAYnB,MAAO7V,IAChC29C,I,wBALkC7mC,I,aASpC,SAAO,CAAE4mD,QAAF,EAAW/f,SAAX,EAAqB3+B,WAAU,aACpC,CAACA,EAAY/C,EAAwBkE,EAnBlC,IAAE/f,EAAI,EAAN,KAAQC,EAAO,EAAf,QAqBN4T,qBAAU,WACH,MAA+D7T,eAAI,IAAJA,IAA/D,GAAWw1E,EAAU,EAArB,QAAuBj4B,EAAQ,EAA/B,SAA6Ck4B,EAAa,EAA1D,WACFD,GAAJ,IACCzzD,EAASkzD,GAAa13B,EAAtBx7B,IACAqzD,EAFgC,GAKhC,IACCrzD,EAAS4rB,GAAsB0nC,EAAD,IAA9BtzD,OACAuzD,YAIA,CAACt1E,EAbJ6T,IAoBQ,IAAM6hE,EAAkB3Y,IAAiB,W,8HAGhD,OAFMrlD,EAAUxS,eAAVwS,GACF9X,OACJ,IAAI8X,UACH49D,QACA,MAEKjsD,EAAe3R,EAAf2R,GAACzS,EAAG,EAAJyS,GAAM5T,EAAK,EAAX4T,GACG,GAAMipD,YAAI,gBAAgB78D,KAA1B,M,OAET,OAFA7V,EAAS,EAATA,OAEA,GAAO,CAAEgX,IAAF,EAAYhX,OAAQA,aACzB,CAX6Bm9D,IAAxB/8D,KAeR6T,qBAAU,WACT,IACCkO,EAASkzD,GAAaS,EAAD,OAArB3zD,IACAuzD,QAGC,CAACI,EANJ7hE,IAeA,OACChM,mBAAKF,IAAKs1B,IACTp1B,YAAC0mC,KAAY5zB,MAAO2iD,GAAW,GAAI9uB,mBAnFhB,SAAC,G,IAAE53B,EAAG,MAAEnB,EAAK,QACjC,OACC5N,YAACgmC,SACAhmC,YAACimC,KAAI9lC,OAAQqtE,EAAkBptE,IAAH,KAAiBA,IAAOC,SAAa0O,OAAQnB,EAARmB,MAFnE,SAmFC/O,mBACCF,IAAKA,YAAG,qHAIR0tE,GACAxtE,YAACgmC,SACAhmC,YAACimC,KACA9lC,OAAQC,IAAOC,QACfytE,SAAU,WAlBE,IAAA/+D,IAmBFy+D,EAATM,IAlBL5zD,EAASkzD,GAAa3X,SAAiBA,EAAQA,SAARA,GAAjBA,MAAD,EAArBv7C,IACAA,EAAS4rB,GAAsB/2B,EAA/BmL,OACAuzD,UAmBQD,WAAwBA,SAAxBA,YAINp1E,GAAW4H,YAACD,IAAYO,KAAM,GAAIR,IAAKF,OAKrCw1B,GAAct1B,YAAG,iSASjBF,GAAgBE,YAAG,2GCvIjB,GAAoC6Z,GAAtBuK,GAAsBvK,GAiB/Bo0D,GAAyC,SAAC,GACtD,QAAAC,kBAAU,IAAG,WAAb,EACAtzE,IADA,MACAA,OAAK,IAAG,GADR,EAEAR,IAFA,YAEAA,OAAW,IAAG,0BAFd,EAGAe,IAHA,mBAGAA,OAAkB,IAAG,KAHrB,EAIGimB,EAAK,cAL8C,2DAOhD,EAaFjH,qBAbE,IAEJ8e,UAFI,SAIFk1C,YAJE,OAIMC,OAAW,IAAG,GACrBC,MADqB,GAErBC,OAAQ,IANP,EASHp6D,EAAsB,EATnB,uBAYLkG,EAAQ,EAZH,SAcEi0D,EAAUD,EAAVC,MAEF,EAAkB5iE,mBAAlB,IAAC+F,EAAI,EAAL,GAAO+8D,EAAO,EAAd,GAEAC,EAAgBC,GAA4Bv6D,EAAlD,GAEMw6D,EAAqB,SAACC,GAC3BJ,MAEA,IAAII,SACHC,GAAiBx0D,EAAjBw0D,GAEAx0D,EACC+J,GAAa,SAAU,CACtBkqD,MADsB,EAEtBC,OAAQE,MAMNK,EAAkBj5D,uBAAY,YACnCywC,GAAgB,oBAAqBgoB,EAArChoB,MADD,IAsCA,OAxBAn6C,qBAAU,WACT,OAAIkiE,eAAJ,CAMA,IAAMU,EAAWV,EAAA,WAAsB,YACtC,OAAOA,EAAA,YAAuB,Y,MAC7B,aAAS1sD,GAAS,CAAEqtD,GAAIhpC,GAAxB,QAMF3rB,EACCgK,GAAkB,SAAU,CAC3Bc,KAAM4pD,EAAA,KAAa,YAClB,MAAO,CAAE7pD,IAAK+pD,YAIf,CAACZ,EAtBJliE,IAyBChM,+BAAKF,IAAKivE,GAAmB,CAAEpE,MAAK,KAASzpD,GAC5ClhB,YAACktE,K,UAAqB,SAAS7/D,MAAI,GAClCrN,YAACgvE,KACAthE,SAAU8gE,EACVS,WAAY39D,EACZ49D,cAAe,YAAO,OAAAb,EAASv+D,SAAT,QACtB/U,OAAQozE,EACRgB,MAAOR,EACPhhE,YAAaA,EACbyhE,aACCpvE,YAACmN,K,UAAe,eAAelB,QA7ChB,WACnBoiE,MACIF,SAAJ,GAAsBK,OA2CmCn0D,KAAM,QAASjH,SAAO,EAACtF,SAAUqgE,cAAsC,IAAhB78D,WAE7G+9D,SAAU,CACTj8D,SAAS,GAEV/F,MAAI,EACJs9D,MAAOA,EACPl9D,SAAU,WAEXzN,YAACmN,K,UACQ,iBACRmE,KAAM08D,EACN7tE,OAAQ,UACRjD,KAAK,SACL+O,QAtDmB,WACtB,KAAIqF,GACJk9D,EAAmB,OAAD,IAAC,CAAIL,GAAvBK,MAqDG1gE,SAA0B,IAAhBwD,SACVq5D,MAAOA,EACP1qE,UAAWsN,IAAQuxD,MACnBh/D,IAAKwvE,QASV,SAAgBZ,GAAiBx0D,EAAUo0D,GAC1Cp0D,EACC+J,GAAa,SAAU,CACtBkqD,MADsB,GAEtBC,OAAQE,KAKVp0D,EAASgK,GAAkB,SAA3BhK,OAID,SAAgBq0D,GAA4Bv6D,EAAwBu7D,GAOnE,OANsB,GAAsB,EAAD,GAG1C,CAACprD,IAAD,KAAuBA,IAHmB,QAArB,QAKhB,YAAO,OAAAhI,EAAA,QAId,I,0CCrKA,GDqKM4yD,GAAqB,SAAC,G,IAAEpE,EAAK,QAAO,mBAAG,0oBAEiC,6HASlD,iLAKX,KAAuB,qFAInB,QAlBVA,EAAQxiE,GAAH,sBAAqCA,GAFR,gBAWzCoF,IAXyC,iBAgBzCA,IAhByC,MAgBvBA,IAhBuB,WAAH,KAuBpC+hE,GAAoBxvE,YAAG,2FAIvB0vE,GAAqB1vE,YAAG,qYAEL,YACH,eACD,8BAC0B,8CAI3B,8EAE2B,8BAT3CyN,IAF0B,cAGzBA,IAHyB,UAIvBA,IAJuB,OAKTpF,GALS,iBASxBoF,IATwB,OAWTpF,GAXrB,kBEnLasnE,GAAc,SAAC,GAAE,QAAAC,cAAM,IAAG,YAAT,EAAuBxuD,EAAK,cAA9B,YACrB,EAAsCg1C,KAApCoB,EAAa,EAAf,cAAiBlB,EAAgB,EAAjC,iBACAJ,EAAasB,IACb,EAAkB/rD,mBAAlB,GAAC+F,EAAI,EAAL,GAAO+8D,EAAO,EAAd,GACA,EAA4B9iE,oBAA5B,GAACokE,EAAS,EAAV,GAAYC,EAAY,EAAxB,GAQAC,EAAwBn6D,sBAC7BkmB,aAAS,YACRw6B,OAFuC,KAIxC,CAJD,IAgBM0Z,EAAkB,SAAChgE,GACxBA,oBACA8/D,MACAvB,MACAjY,OAIK2Z,EAAer6D,uBACpB,YACC5F,mBACA8/D,MACAxZ,OAED,CAAC9kD,EANF,IAeM0+D,EAAkB,WACvB3B,KACAuB,OAED,OACC5vE,kCAAUkhB,GAAOsB,SAAUutD,EAAcE,OApCvB,SAACnjE,GACdA,yBAA6BA,EAAlC,iBACC8iE,MACAvB,SAkCCsB,EACA3vE,YAACsN,K,UACQ,iBACRI,SAfmB,SAACoC,GACvB,IAAMwB,EAAOxB,SAAb,MACAu+D,KACAwB,MAaGliE,YAAa,mBACbC,MAAO0D,EACPxR,IAAKowE,GACL7iE,MAAI,EACJ+hE,aAAcpvE,YAACmN,KAAOkN,KAAM,QAASpO,QAAS6jE,EAAiB18D,SAAO,IACtEvF,WAAS,EACTsiE,QAAS,Y,aAAS9wD,Q,EAAFvP,EAAEuP,6BAAQhO,UAC1B++D,OAAK,IAEHpa,EACHh2D,YAACimC,KAAIh6B,QAAS+jE,EAAiBlC,SAAUgC,EAAiBlwB,aAAW,EAACxsC,SAAO,GADhE,GAKbpT,YAACmN,K,UACQ,qBACRkG,UAAW,kBACXpH,QAAS+jE,EACTlwE,IAAK+4D,GACLzlD,SAAO,EACPg9D,OAAK,GA1BT,UAmCKF,GAAapwE,YAAG,+lBC3FTuwE,GAAgB,SAAC,GAC7B,QAAAC,kBAAU,IAAG,GAAb,EACA51E,IADA,WACAA,OAAU,IAAG,GADb,EAEAR,IAFA,mBAEAA,OAAkB,IAAG,GAFrB,EAGAe,IAHA,mBAGAA,OAAkB,IAAG,GAHrB,EAIAC,IAJA,iBAIAA,OAAgB,IAAG,GAJnB,EAKA69B,IALA,iBAKAA,OAAgB,IAAG,GALnB,EAMG7X,EAAK,cAPqB,6GAWvB4gB,GAAkBwuC,IAAF,IAAiCrY,GAAvD,GACMsY,GAAYzuC,GAAkB0uC,IAAnB,GAAjB,EACMj0D,EAAW+zD,GAAjB,EACMG,EAAWC,OAAsCzY,GAAvD,EAEA,OACCj4D,YAAC2wE,gBACArlD,QAAS/O,EACTk0D,SAAUA,EACV3uC,cAAeA,EACfyuC,SAAUA,GALZ,KAYKK,GAAgB,SAAC,GAAE,IAAuB1vD,EAAK,cAA9B,yBAAqC,OAAClhB,YAACwrB,mBAAF,KAEtDmlD,GAAc,YAAG,wBAAH,CAAG,sGAAqB,sBAEf,WACqB,SAC0B,SACa,SACvC,SACU,aALxDpjE,IAFmB,mBAGnB,SAAA4O,GAAO,GAAIA,EAAJ,SAAgB,OAAO00D,MAC9B,SAAA10D,GAAO,GAAIA,aAAeA,EAAnB,SAA+B,OAAO20D,MAC7C,SAAA30D,GAAO,GAAIA,aAAeA,EAAfA,WAA8BA,EAAlC,cAAmD,OAAO40D,MACjE,SAAA50D,GAAO,GAAIA,EAAJ,SAAgB,OAAO60D,MAC9B,SAAA70D,GAAO,GAAIA,EAAJ,cAAqB,OAAO80D,MAIjCD,GAAgBlxE,YAAG,+MAOnB+wE,GAAgB/wE,YAAG,kJAEQ,oBAAZW,GAFrB,OAKMqwE,GAA2BhxE,YAAG,oLAEF,yDAGA,yBAHZW,GAFc,MAKdA,GALtB,OASMswE,GAAoBjxE,YAAG,2JAEQ,2BChF3B,m1BDoFJmxE,GAAqBnxE,YAAG,uEE/ExBs3C,GAAS,SAAA36B,GAAK,WAAAA,GAAA,eAWPy0D,GAA8B,SAAC,GAC3C,IAAAC,EAAG,EAAHA,IACAC,EAAK,EADL,MAEA/3E,IAFA,QAEAA,OAAO,IAAG,QAFV,EAGG6nB,EAAK,cAJmC,2BAQ3C,OADIiwD,SAAJ,MAAmBC,IAAeC,QAEjCrxE,+BACCF,IAAKitD,IACD7rC,GAEHiwD,SAAenxE,oBAAMF,IAAKwxE,IAAWl6B,GAAO+5B,IAC5CE,SAAmBrxE,oBAAMF,IAAK0jE,IAAe6N,GAC7CD,SAAiBpxE,oBAAMF,IAAKyxE,IAAan6B,GAP5C,MAYK2V,GAAejtD,YAAG,2EAIlBwxE,GAAWxxE,YAAG,qGAEsB,SAAhCmG,GAFV,qBAKMu9D,GAAe1jE,YAAG,yDACqB,SAAnCmG,GADV,wBAIMsrE,GAAazxE,YAAG,yDACoB,SAAhCmG,GADV,qBJ1BA,SAAgBurE,GACfC,GAEA,OAAIA,SAAJ,IAAqBA,EACb,CACNv0E,KAAMw0E,GADA,UAEN9jE,WAAO4lB,GAGT,mBAAWi+C,EACH,CACNv0E,KAAMw0E,GADA,QAEN9jE,MAAO6jE,GAGLE,YAAJ,GACQ,CACNz0E,KAAMw0E,GADA,MAEN9jE,MAAO6jE,EAAA,KAAU,SAAAG,GAAgB,OAAAJ,GAAA,OxPApC,SAAyBC,GACxB,OAASE,YAAD,IAAR,kBAAkCF,EwPE9BI,CAAJ,GACQ,CACN30E,KAAMw0E,GADA,OAEN9jE,OxPAF2jC,EwPAmBkgC,ExPCnBK,EwPDiD,YAAkB,OAAAN,GAAA,IxPI5Dn0E,OAAA,YACNA,OAAA,gBACC,c,IAAEi4B,EAAC,KAAEz3B,EAAC,KAAS,SAAIi0E,EAAGj0E,EAAGy3B,EAAV,UAzClB,SAM0Bm8C,GAGzB,MADA,gEACOM,KAAP,GwP8BIC,CADJP,KAEQ,CACNv0E,KAAMw0E,GADA,KAEN9jE,MAAOuY,QAFD,IxP5BT,SAQsBsrD,GACrB,IACa,IAAIQ,IAAhB,GACA,SACC,SACD,UwPmBGC,CAAJ,GACQ,CACNh1E,KAAMw0E,GADA,IAEN9jE,MAAO,IAAIqkE,IAAIR,IAQT,CACNv0E,KAAMw0E,GADA,OAEN9jE,MAAO6jE,GxPvBV,IACClgC,EACAugC,EwPuDD,SAAgBK,GACfC,GAGA,GAAIA,SAA2BV,GAA/B,MACC,OAAOU,EAAA,WACD,SAAAC,GAA4B,OAAAF,GAAA,MAD3B,KAAP,MAID,GAAIC,SAA2BV,GAA/B,OAAoD,CACnD,IAAIY,EAAJ,GACA,IAAK,IAAL,KAAkBF,EAAlB,MAA2C,CAC1C,GAAI/0E,qCAAqC+0E,EAArC/0E,MAAJ,GAECi1E,GAAkBvjE,OAAQojE,GADOC,QAAjC,IACAE,KAGF,SAED,OAAIF,SAA2BV,GAA/B,UACC,GAGOU,QAAP,YA1HF,SAAYV,GACXA,wBACAA,gBACAA,kBACAA,kBACAA,kBACAA,cACAA,YACAA,oBARD,CAAYA,QAAZ,KKMA,O,YACC,oBACC3N,gBADD,K,OAoEA5J,oBAAoB,WACb,MAAuBA,EAAvB,MAAE7oD,EAAI,EAAN,KAAQihE,EAAU,EAAlB,WAGAC,EAAN,GACAD,WAAmB,SAAAE,GAClBD,OAAY,CACXlrC,MAAOmrC,EADI,GAEX7kE,MAAO6kE,EAAUnrC,QAElBkrC,OAAY,CACXjrC,IAAKkrC,EADM,GAEX7kE,MAAO6kE,EAAUlrC,SAGnBirC,QAAY,cACX,OAAO1hC,QAAUD,EAAjB,SAKD,IAAI6hC,EAAeF,EAAA,QAAc,cAC1B,MAA2BE,EAAal3B,EAAbk3B,QAA3B,GAAEr5E,IAAF,MAAEA,OAAK,IAAG,KAAV,EAAcqB,IAAd,IAAcA,OAAG,IAAG,KAApB,EAQN,OAPI8gD,EAAJ,OACClU,OAAWkU,EAAXlU,OAEGkU,EAAJ,KACCjU,OAASiU,EAATjU,KAEDmrC,EAAal3B,EAAbk3B,OAA4B,CAAEprC,MAAF,EAASC,IAAG,GACxC,IATD,IAWAmrC,EAAer1E,OAAA,gBAAiC,Y,IAAEuQ,EAAK,KAAEvU,OAAoB,MAAC,CAAEuU,MAAF,EAAS05B,MAAvB,QAA8BC,IAAzB,UAGrE,IAAIorC,EAAJ,EACIC,EAAJ,GACIC,EAAJ,GA2BA,OAzBAx1E,0BAAoC,SAAAm+C,GACnCq3B,OAAe,CACdN,WAAY,OAAF,IAAE,CADE,GAEdjhE,KAAMA,UAAyBkqC,EAFjB,OAGdz7B,GAAI4yD,IAGLn3B,iBAAoB,SAAAs3B,GACnBF,aAEDp3B,eAAkB,SAAAs3B,GACjBF,SAAyBA,UAAzBA,SAGDD,EAAen3B,EAAfm3B,SAIGA,IAAiBrhE,SAArB,GACCuhE,OAAe,CACdN,WADc,GAEdjhE,KAAMA,UAAyBA,EAAzBA,UAIR,GAlIA6oD,aAAkBr/C,IAAlBq/C,Y,EAoLF,OAvLwCx6D,iBAMvCozE,yCAEOvxD,EAUF5pB,KAVJ,MACCo7E,EAAa,EADd,cAECzsD,EAAQ,EAFT,SAIa0sD,EAAc,EAJ3B,WAOC/4E,IAPD,MAOCA,OAAK,IAAG,KAPT,EAQC+F,EAAS,EARV,UASIq6D,EAAU,cATR94C,oGAAN,cAaM0xD,EAAgBF,GAAtB,OAGMG,EAFYv7E,KAAlB,oBAEsB,KAAc,cAC3B,IAAA26E,EAAqBa,EAArBb,WAAYjhE,EAAS8hE,EAArB,KACFC,EAAkBd,EAAA,KAAe,SAAAhkE,GAAK,OAAA0kE,EAAA,MAAoB,SAAAxzE,GAAK,OAAAA,EAAA,aACrE,0BAAW8mB,EACHA,EAASjV,EAAM+hE,EAAtB,GAEMlZ,sBAAP,MAGD,OACC,mCACKG,GACJlsD,MAAOA,EACPkQ,IAAK1mB,KAAK07E,WACVrzE,UAAWA,IALb,IAuBD8yE,4CACS,MAAwCn7E,KAAKspB,MAA7CqyD,6BAAqB,IAAG,cAAxB,EACR,OACC,0BAAMxkE,IAAKF,EAAGT,MAAOxW,KAAK47E,iBAAiBH,EAAA,KAAoB,SAAA9kE,GAAK,OAACA,GAAKA,EAAN,cADrE,IAkFDwkE,0CACC,IAOA,EAPIl3E,EAAUjE,KAAK07E,WAAnB,QAGIhsC,EAAJ,EACIC,EAAJ,EACMksC,EAAM53E,iBAAyBA,EAArC,SACM63E,EAAMD,eAAmBA,EAA/B,aAEA,wBAAWC,EAAP,cAEH,IADAC,EAAMD,EAANC,gBACIA,WAAJ,EAAwB,CACvB,IAAIC,EAAQF,4BAAZ,GACIG,EAAgBD,EAApB,aACAC,wBACAA,SAAqBD,EAArBC,eAA2CD,EAA3CC,aACAvsC,EAAQusC,aAARvsC,OACAusC,SAAqBD,EAArBC,aAAyCD,EAAzCC,WACAtsC,EAAMssC,aAANtsC,aAEK,IAAKosC,EAAMF,EAAP,YAAJ,YAA6BE,OAAwB,CAC3D,IAAIG,EAAYH,EAAhB,cACII,EAAoBN,OAAxB,kBACAM,uBACAA,8BACAzsC,EAAQysC,OAARzsC,OACAysC,4BACAxsC,EAAMwsC,OAANxsC,OAED,MAAO,CAAED,MAAF,EAASC,IAAT,EAAcosC,IAAG,IAQzBZ,yCACC,MAAO,CACN9kE,gBAAiBi3C,EADX,GAENp6B,gBAAiBo6B,WAAoB,mBAAmBA,OAAnB,MAApBA,SAA8D1xB,IAGlF,E,CAvLA,iBAyLAu/C,aAAuB,CACtBxsD,SAAUhmB,IADY,KAEtByyE,cAAezyE,IAFO,YAGtBgzE,sBAAuBhzE,IAHD,OAItBgyE,WAAYhyE,UAJU,WAKtB6N,MAAO7N,IALe,OAMtB+Q,KAAM/Q,IANgB,OAOtBN,UAAWM,IAAUyzE,Q,OC9LTC,GAAkE,SAAC,G,IAC/E3iE,EAAI,OACJiV,EAAQ,WACR2tD,EAAa,gBACbC,EAAc,iBACdl0E,EAAS,YAML,EAMAga,gDANAm6D,OAAUjG,QAAK,MAAK,CACnBA,MAAO,IADY,GAApB,MAQJ,OACCnuE,YAACq0E,kBACI,CACH9tD,SAAUjV,eAAI,IAAJA,IADP,EAEH4iE,cAFG,EAGHC,eAHG,EAIHhG,MAJG,EAKHluE,UAAS,MAcAo0E,GAAgD,SAAC,GAC7D,IAAA9tD,EAAQ,EAARA,SACAltB,IADA,MACAA,OAAK,IAAG,KADR,EAEAqB,IAFA,eAEgB45E,OAAO,IAAG,SAF1B,EAGAp6E,IAHA,cAGAA,OAAa,IAAG,YAHhB,EAIA+F,EAAS,EAJT,UAKG2S,EAAI,cANsD,mEAQ7D,MACC,OACC5S,YAACs0E,iBAAY1hE,GAAM3S,UAAWA,IAC7BD,kBACCumB,SAAU2tD,EACVp0E,IAAKA,YAAG,uFACqC,mBAAnCmG,GADF,wBAGRhG,UAAWA,KAMf,OAAIkuE,SACH,OACCnuE,YAACs0E,iBACI1hE,GACJ2T,SAAUA,EACVtmB,UAAWA,KAKd,IAAMqR,EAAOiV,EAAb,WACMgsD,EAKP,SAA2B73D,EAA3B,GAEC,IAAM65D,EAAiBpG,EAAA,KAAU,YAAU,OAAAtoC,EAAA,yCAErC2uC,EAAQ,IAAIC,OAAO,IAAIF,OAAJ,KAAX,IAAd,MAQMG,EAAgBh6D,WAAtB,GAGA,OAAO/c,MAAA,aAA8B,YAAW,MAAC,CAChDoiB,GAAIwC,cACJ3U,MAAO+mE,EAFyC,GAGhDrtC,MAAOqtC,EAHyC,MAIhDptC,IAAKotC,YAAkBA,EAAM/4E,UAxBXg5E,CAAkBtjE,EAArC,GACA,OAAOtR,YAAC+yE,kBAAengE,GAAM2/D,WAAYA,EAAYjhE,KAAMA,EAAM0hE,cAAesB,EAASr0E,UAAWA,MC1DrG,I,0FCjBA,GDiBa40E,GAA8E,SAAC,G,MAC3FxiE,EAAI,EAAJA,KACAyiE,EAAc,EADd,eAEA3G,EAAK,EAFL,MAGAC,EAAM,EAHN,OAIA1zE,IAJA,aAIAA,OAAY,IAAG,GAJf,EAKAR,IALA,gBAKAA,OAAe,IAAG,GALlB,EAYM66E,GANE,cAPmF,8EASxED,eAAc,IAAdA,IAAkBz3E,YAAiB23E,QAAjB33E,EAAYgV,EAAK2iE,8BAAtD,KAIyB,KACnB,YAGJ,IAAIC,EAAgB5iE,iBAApB,GACI6iE,EAA4B1D,GAAhC,GAEA,OAAI2D,GAAmBD,SAAmCxD,GAA1D,UAAkF,MAO9EwD,SAAmCxD,GAAvC,QACCwD,EAA4B,CAC3Bh4E,KAAMw0E,GADqB,OAE3B9jE,MAAOukE,GAAiC+C,KAOnC,CACNp6E,SADM,EAENm6E,cAFM,EAGNC,0BAHM,EAINE,WAPkBhH,WAAnB,GAQCiH,cAPoB,OAAAJ,QAAa,IAAbA,OAAA,EAAAA,EAAA,QAArB,SAtBuB,QAgChB,YAAc,aAAAn6E,MAEvB,OACCkF,mBAAKF,IAAK,CAACw1E,GAAqBC,OAAe/hD,EAArC,KACRuhD,EAAA,KAAqB,Y,QAAGj6E,EAAQ,WAAiBo6E,EAAyB,4BAAEE,EAAU,aAAEC,EAAY,eAC9FG,EAAmB,CAACC,GAAoBJ,EAAeK,QAA7D,GACIC,EAAe76E,EAAA,sDAAnB,KAKA,OACCkF,YAAC8a,IAAMC,UAAShM,IAAKjU,GACpBkF,YAACimB,KACAM,SAAUzrB,EACVgF,IAAK,CAAC81E,GAAoBP,EAAeK,QAApC,G,UACOC,EAAY,WAGxBT,EAAAh4E,OAAmCw0E,GAAnC,KAEA1xE,mBACCF,IAAK01E,EACLjvD,SAAU2uD,6B,UACES,EAAY,UAGzB31E,YAACq0E,IACAlG,MAAOiH,EAAajH,OAAQ36C,EAC5B2gD,eAAgB,IAChB5tD,SAA2CsvD,QAAnC,EAA4BjoE,QAA5B,EAAEsnE,EAA0BtnE,4BAAOioE,0BAAc,GACzD3B,cAAe,OACfp0E,IAAK01E,E,UACOG,EAAY,gBAS1BC,GAAqB91E,YAAG,mIAIxB21E,GAAqB31E,YAAG,qHAIxB41E,GAAc51E,YAAG,qFAGjBw1E,GAAsBx1E,YAAG,sEACX,IAAY,IAAe,UAAnC0lD,GAAYA,GAAYA,IAE9BswB,GAA0Bh2E,YAAG,+TAMZ,SAAR0lD,IElIFuwB,GAAyB,CAErC12D,OAFqC,SAGrC22D,IAAK,uBCsBOC,GAA4E,SAAC,G,QACzF5jE,EAAI,EAAJA,KACA6jE,EAAa,EADb,cAEAC,EAAY,EAFZ,aAGAhI,EAAK,EAHL,MAIAiI,EAAQ,EAJR,SAKA7vD,EAAQ,EALR,SAMGrF,EAAK,cAPiF,uEASnF3G,EAAay6D,QAAR,EAAG3iE,EAAK2iE,qCAAnB,GACMqB,EAAgBrB,QAAR,EAAG3iE,EAAK2iE,qCAAtB,GAEA,OACCh1E,YAACs2E,kBAAkBp1D,GAClBlhB,YAACqL,IAAMkP,MAAOA,GACbva,YAACq0E,IAAelG,MAAOA,EAAO+F,cAAe,WAAY3tD,SAAUhM,E,UAAe,2BAGlF67D,EAEDp2E,YAACu2E,QACCJ,GACAn2E,YAACw2E,iBACAr2E,OAAQC,IAAOC,QACfgT,UAAW,cACX/B,KAAM,OACN04B,KAAMqsC,EACNvoE,UAAWuoE,GACPN,KAhBT,KA0BKO,GAAgB,8HAAU,gBACZ,IAAY,IAAY,kCACa,SAD7C9wB,GAAYA,GAAYA,GACRv/C,GAF5B,kBAIMoF,GAAK,YAAG,wBAAH,CAAG,6HAAU,OACJ,sBACM,sBACD,sDAFtB4tD,GADW,GAEIzT,GACDA,IAGX+wB,GAAU,6GAAU,mDCjEbE,GAAiD,SAAC,GAAE,IAAAlwD,EAAQ,EAARA,SAAUmwD,EAAU,EAApB,WAAyBx1D,EAAK,cAAhC,2BAC9D,OACClhB,+BACCF,IAAKA,YAAG,04CAiBY,gLAMqD,2LAOH,6FAb1D0lD,GAMqCC,GAvBzC,eA8BsCA,GA9BtC,iBAoCJvkC,GAEJlhB,iCACK02E,GACJ52E,IAAK,CAACA,YAAG,+QAIN42E,eAAU,IAAVA,WAJE,OA1CR,KCcYC,GAA+D,SAAC,GAC5E,IAAAT,EAAa,EAAbA,cACApB,EAAc,EADd,eAEAqB,EAAY,EAFZ,aAGAS,EAAgB,EAHhB,iBAIAv9E,IAJA,eAIgBw9E,OAAe,IAAG,EAAAZ,GAJlC,EAKAv7E,IALA,gBAKiBo8E,OAAgB,IAAG,EAAAjC,GALpC,EAMAU,EAAY,EANZ,aAOAJ,EAAe,EAPf,gBAQAzpC,EAAM,EARN,OASA2wB,EAAO,EATP,QAUAniE,IAVA,KAUAA,OAAI,IAAG,MAVP,EAYGgnB,EAAK,cAboE,oKAetE,EAOFjH,qBAPE,IAGM88D,EAAc,uBAHpB,eAML78D,EAAQ,EANH,SASF88D,EAAqBD,eAAc,IAAdA,WAAzB,mBACArrC,EAASA,eAAM,IAANA,MAATA,EAEA2wB,EAAUA,eAAO,IAAPA,IAAW3mD,uBAAY,WAChCwE,EACCP,oBADDO,SAGE,CAJHmiD,IAMM,MAMFnH,IAAiB,W,uHACM,MAAtB8hB,EAAA,MACI,GAAMvM,YAAIwM,oBAAV,K,OAAP,SAAO,EAAP,Q,0BAEC,CAVG,IACC5kE,EAAI,EADL,KAELja,EAAO,EAFF,QAgBF,EAOA6hB,gDAPAm6D,OAAA,aAA4B,CAC3BjG,MAD2B,GAE3BC,OAAQ,IAFT,EAAUD,EAAK,EAAf,MAAiBC,EAAM,EAAvB,OASJ,OACCpuE,YAACk3E,mBAAWh2D,GAAOwqB,OAAQA,EAAQ2wB,QAASA,EAAS/7D,KAAMA,IAEzDlI,GAAW4H,YAACD,UAEX3H,GAAWia,GACZrS,YAAC8a,IAAMC,cACN/a,YAACm3E,QACAn3E,YAACmN,KAAOlB,QAASowD,EAAShiD,KAAM,QAASjH,SAAO,E,UAAS,kCAG1DpT,YAAC62E,iBACI,CAAExkE,KAAF,EAAQ6jE,cAAR,EAAuBC,aAAvB,EAAqChI,MAAK,GAA1C,CACJiI,SAAUQ,GAAoB52E,YAACo3E,QAAcR,EAAiB,CAAEvkE,KAAI,QAGrErS,YAACy2E,QACAz2E,YAAC82E,iBAAqB,CAAEzkE,KAAF,EAAQ87D,MAAR,EAAeC,OAAf,EAAuB0G,eAAvB,EAAuCS,aAAvC,EAAqDJ,gBAAe,SAO1FgC,GAAkB,oIAAU,yEAM5BC,GAAe,iFAAQ,cACa,SAAhCnxE,GADV,qBCzFaoxE,GAAY,SAAC,GACzB,QAAAC,iBAAS,IAAG,QAAZ,EAEA58E,IAFA,gBAEAA,OAAe,IAAG,KAFlB,EAIAR,IAJA,mBAIAA,OAAkB,IAAG,KAJrB,EAMAq9E,EAAe,EANf,gBAQAC,EAAa,EARb,cASAC,EAAc,EATd,eAUAC,EAAW,EAVX,YAWAz8E,IAXA,OAWAA,OAAM,IAAG,GAXT,EAYAC,IAZA,SAYAA,OAAQ,IAAG,GAZX,EAaAymD,EAAK,EAbL,MAeA5oB,IAfA,SAeAA,OAAQ,IAAG,GAfX,EAgBG7X,EAAK,cAjBiB,8JAoCjBwvD,EAAuDiH,EAAvDjH,WAAYkH,EAA2CD,EAAvD,mBAAgCnH,EAAuBmH,EAAvD,mBAER,OACC33E,+B,UACS,aACRF,IAAK,CAAC,GAAD,OACLmM,QArBqB,SAAC6D,GACvBA,mBACA,GAAmB0nE,OAoBdt2D,GAEHygC,SACA3hD,YAACmN,KACAkN,KAAMw9D,EAAW,MAAQnsC,EAAS,eAAiB,gBACnDt4B,SAAO,EACPg9D,OAAK,EACLtiE,SAAU+pE,EACV5rE,QApBe,SAAC6D,GACnBA,oBACA,GAAiB4nE,MAmBd53E,IAAKA,YAAG,uJACkB,+BACI,oBAK5B,kBANe0lD,GACD7D,KAFR,EAGLk2B,GAHK,6FAWV73E,YAACqwE,kBAAkBsH,IACnB33E,YAAC83E,IACA77E,KAAMq7E,EACNC,gBAAiBA,EACjBz3E,IAAKiQ,GACL2gE,WAAYA,GAAckH,EAC1B9pE,SAAUA,MAAkC0iE,IAE7CxwE,YAACkxE,kBAAe6G,IAChB/3E,YAACwrC,KAAQwsC,eAAgB,IAAMhyD,QAAS0qD,EAAa,QAAU,UAAWzwE,UhDoDtE,egDnDHD,YAACmN,KACAkN,KAAMq2D,EAAa,QAAU,cAC7BzkE,QAjDmB,SAAC6D,GACvBA,oBACA,GAAoB2nE,MAiDjBjb,UAAQ,EACR4T,OAAK,EACLtwE,IAAKA,YAAG,mGACiB,mBAAT0lD,SAWRyyB,GAAsB,SAAC,G,IAAK/2D,EAAK,cAAV,IAEnC,OACClhB,+BAAKF,IAAK,CAAC,GAAD,QAAgEohB,GACzElhB,YAACwrB,KACAvrB,UAAWsN,IAAQ8W,SACnBvkB,IAAKA,YAAG,2FACc,qBAAT0lD,MAGdxlD,oBAAMC,UAAWsN,IAAQ8W,UAR3B,gBAaYyzD,GAAa,SAAC,GAAE,IAAA77E,EAAI,EAAJA,KAAM5C,IAAN,UAAMA,OAAS,IAAG,cAAlB,EAA+Bq3E,EAAU,EAAzC,WAA2C5iE,EAAQ,EAAnD,SAAqDypE,EAAe,EAApE,gBAAyEr2D,EAAK,cAAhF,gEAEpBg3D,EAAWj8E,GAAjB,EACA,OACC+D,YAACq0E,gBACAlG,MAAOoJ,EAAkB,CAAH,GAAuB,GAC7CpD,eAAgBgE,IAChB59D,MAAO29D,EACP3xD,SAAU2xD,EACVp4E,IAAK,EAAE7D,GAAF,GAAsBy0E,GAAtB,GAAmD5iE,GAAnD,IACLsqE,WAAS,GAPX,KAeK99D,GAAUxa,YAAG,4LAGG,gBACM,gCADd0lD,GALP,IAUDz1C,GAAQjQ,YAAG,2EAIXu4E,GAAgBv4E,YAAG,yDACoB,SAAnCmG,GADV,wBAGMqyE,GAAax4E,YAAG,+EACuB,+BAAnCmG,GADV,wBAIMsyE,GAAgBz4E,YAAG,yIACoB,yFAAnCmG,GADV,wBAUauyE,GAAwB,SAAC,G,IAAEC,EAAc,iBAAEjhB,EAAW,cAAE18D,EAAQ,WAGtE21E,EAAWpzE,OAAA,mBACR,YAAW,OAAA2S,EAAA,UADH,KAEX,YACJ,OAAO3S,OAAA,QAAe2S,EAAf,YACE,YACP,cAAOF,QAFF,KAID,YACJ,MAAO,CAAEf,IAAKiB,EAAP,GAAiBpC,MAAOkC,EAAE,UARrC,OAaA,WAAI2gE,SAA8B,KAGjCzwE,mBACCF,IAAKA,YAAG,2IACa,IAAY,uEAArB0lD,GAAaA,KAKxBirB,EAAA,KAAa,YACb,OACCzwE,YAACimC,KACAl3B,IAAKsD,EAAKzE,MACV9N,IAAKA,YAAG,yGACa,IAAY,uBAApB0lD,GAAYA,IAEzBsoB,SAAU,WACTtW,EAAYnlD,EAAD,IAAWA,EAAtBmlD,QAED5X,aAAW,EACXxsC,SAAO,GAEPpT,YAAC83E,IAAW77E,KAAMoW,EAAKzE,MAAO8iE,YAAY,UC9MnCgI,GAAc,SAAC,GAC3B,IAAA9sD,EAAY,EAAZA,aACAvyB,IADA,UACAA,OAAS,IAAG,QADZ,EAEAs/E,EAAQ,EAFR,SAGAj+E,IAHA,iBAGAA,OAAgB,IAAG,IAHnB,EAIAR,IAJA,gBAIAA,OAAe,IAAG,IAJlB,EAKGgnB,EAAK,cANmB,8EAQrB,EAAoEg1C,KAAlEwB,EAAkB,EAApB,mBAAsBF,EAAW,EAAjC,YAAmCN,EAAa,EAAhD,cAAkDI,EAAa,EAA/D,cACAtiC,EAAQkiC,EAActrC,EAA5B,GACMoqC,EAAasB,IACbgZ,EAAat7C,IAAUihC,GAA7B,GACMya,EAAa17C,IAAUihC,GAA7B,IAMA,OACCj2D,YAACq3E,gBACAM,mBAAoB,CACnBrH,WADmB,EAEnBI,WAAU,GAEXqH,gBAAiB,CAChB5G,IADgB,EAEhBC,MAAOwH,GAERtB,UAAWA,EACXC,gBAAiBvhB,EACjBwhB,cAhBqB,WAAQhgB,EAAY5rC,EAAZ4rC,IAiB7BigB,eAfqB,WAAQ/f,EAAmB9rC,EAAnB8rC,KAE/B,KCHYmhB,GAAa,SAAC,GAC1B,IAAA/9E,EAAQ,EAARA,SACAg+E,EAAY,EADZ,aAEAC,EAAc,EAFd,eAGA1/E,IAHA,OAGAA,OAAM,IAAG,GAHT,EAIAqB,IAJA,QAIAA,OAAO,IAAG,GAJV,EAKAR,IALA,iBAKAA,OAAgB,IAAG,IALnB,EAMAe,IANA,gBAMAA,OAAe,IAAG,IANlB,EAOAC,IAPA,oBAOAA,OAAmB,IAAG,EAAA89E,EAPtB,EAQAC,EAAY,EARZ,aASA1yD,EAAQ,EATR,SAUGrF,EAAK,cAXkB,sJAmBpBg4D,EAA0B,SAACppE,GAChCA,oBACAgpE,MAGKK,EAAwBztC,EAAS,iBAAvC,kBAEA,OACC1rC,iCAASkhB,G,UAAe,cAAcphB,IAAK,CAACs5E,MAC3Cp5E,mBACCF,IAAK,CAACu5E,GAAgB9f,GAA4BF,IAClDptD,QAAS,WAAM,OAAA8sE,EAAej+E,EAAf,QAEfkF,YAACwrC,KAAQwsC,eAAgB,IAAMhyD,QAAS0lB,EAAS,WAAa,QAC7D1rC,YAACmN,I,WAESgsE,EACT9lE,UAAWq4B,EAAS,eAAiB,gBACrCt4B,SAAO,EACPg9D,OAAK,EACLtwE,IAAKA,YAAG,oIAMVE,mBAAKF,IAAKya,IAAQzf,EAASmB,MAE3B+D,YAACkxE,IAAWC,IAAKmI,EAAkBlI,MAAO4H,IAE1Ch5E,YAACwrC,KAAQwsC,eAAgB,IAAMhyD,QAAS5tB,EAAU,KAAO,QAAS6H,UlD0E/D,ekDzEFD,YAACmN,KACA/U,QAASA,EACT6T,QArCoB,SAAC6D,GACzBA,oBACAmpE,KAoCIzc,UAAQ,EACR4T,OAAK,EACL/8D,UAAW,QACXvT,IAAKA,YAAG,yGACiB,qBAAT0lD,OAKlBxlD,YAACmN,I,WACQ,0BACRlB,QAASitE,EAET7lE,UAAW,cACXpT,UlDwDE,ckDvDFE,OAAQ,UACRq8D,UAAQ,EACR4T,OAAK,EACLtwE,IAAKA,YAAG,mGACiB,mBAAT0lD,OAKlBxlD,YAACu5E,KAAS7tC,OAAQA,GAChBnlB,EAEDvmB,mBAAKF,IAAK05E,IC5GP,GD6GDC,GACAz5E,YAACmN,I,WACQ,WACRlB,QAASitE,EACT5nE,KAAM,WACN+B,UAAW,cACXlT,OAAQ,UACRL,IAAK,CAAC+4D,IACNzlD,SAAO,EACPg9D,OAAK,QASN71D,GAAQza,YAAG,qGACE,oCAEI,+BAHN,GAGJ0lD,IAIP4zB,GAAiBt5E,YAAG,6FAC+B,SAA7BmG,GAD5B,kBAIMozE,GAAiBv5E,YAAG,2IAEN,IAAY,mDAApB0lD,GAAYA,IAKlBg0B,GAAY15E,YAAG,mEACD,IAAY,IAAY,SAAjC0lD,GAAaA,GAAYA,KPvIpC,SAAYk0B,GACXA,oBACAA,8BAFD,CAAYA,QAAZ,KAIO,I,iCAAMC,KAAU,OACrBD,GAADl4D,SAA2B,CAAE5T,MAAF,QAAkBmC,MAAO,SACpDyR,GAACk4D,GAADl4D,cAAgC,CAAE5T,MAAF,eAAyBmC,MAAO,QAF1D,IAcM6pE,GAA8B,SAAC,GAC3C,QAAAC,mBAAW,IAAG,KAAd,EACAC,EAAkB,EADlB,mBAEAC,EAAqB,EAFrB,sBAGAr/E,IAHA,aAGAA,OAAY,IAAG,GAHf,EAIAs/E,EAAe,EAJf,gBAKA9/E,IALA,MAKAA,OAAK,IAAG,UALR,EAMGgnB,EAAK,cAPmC,uGAY3C,OACClhB,YAACi6E,iBACA7mE,SAAO,EACPnT,UAAWsN,IAAQ2sE,MACnBp6E,IAAKq6E,IACDj5D,GAEJlhB,YAACwpE,KACA1pE,IAAKs6E,GACLp0D,QACChmB,YAAC4zB,SACCimD,EAAA,KAAgB,cAAe,OAC/B75E,YAACmS,KACApD,IAAKqpB,EACL9mB,KAAM8mB,EACNnsB,QAAS,WACR8tE,KACAC,GAAmBA,GAAnBA,IAED5nE,OAAQgmB,GAAU0hD,SAMtB95E,YAACmN,KACArN,IAAKu6E,GACLjK,OAAK,EACL/iE,MAAI,GAEJrN,0BAAS+P,GAAgB,IACzB/P,wBAAO85E,GAAsB,UAI9BE,GACAh6E,YAACmN,KACAkN,KAAMigE,EAAe,YAAc,W,UAC1B,gBAAeA,EAAe,YAA9B,YACTruE,QAAS,WAAM,OAAA+tE,GAAA,IACf5J,OAAK,MAOJ+J,GAAmBr6E,YAAG,+EAItBu6E,GAAkBv6E,YAAG,2FAEJ,SACH,YADhByN,IAFuB,YAA3B,IAOM6sE,GAAet6E,YAAG,mFACO,qCAAtByN,IADT,gBS5FagtE,GAAqB,SAAC,G,IAAKr5D,EAAK,cAAV,IAE5B3J,GAAS+/C,EADWpB,KAAlBoB,iBAER,OACCt3D,iCAASkhB,GAAOphB,IAAK06E,K,mBACHjjE,EAFnB,MAMKijE,GAAgB16E,YAAG,kGACoB,yCAExB,SAFXmG,GADe,uBAGZu/C,ICKAi1B,GAAe,SAAC,G,YAAE3/E,EAAQ,WAAEg+E,EAAY,eAAEC,EAAc,iBAAE79E,kBAAM,IAAG,KACzE,EAAwBqQ,mBAAxB,MAACxM,EAAO,EAAR,GAAU27E,EAAU,EAApB,GACA,EAAuExkB,KAArEoB,EAAa,EAAf,cAAiBD,EAAe,EAAhC,gBAAkCK,EAAkB,EAApD,mBAAsDG,EAAY,EAAlE,aACA7B,EAAasB,IAElB,EAIGr9C,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEC4uD,cAAa5qD,EAAY,EAF1B,aAE4BjB,EAAU,EAFtC,WAMKuiE,EAAmBj8E,eAA6B,QAAf,EAAAg6D,WAAe,eAAKv8D,EAApB,QAAduC,IAAzB,OACM27E,EAAyB,QAAV,EAAGj6E,eAAO,IAAPA,WAAUjE,EAAH,4BAA/B,SAGMqa,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IASM,EAAoB2gD,IAAiB,W,uIACtCl9C,GAAA,MAAkDjB,GACjDiB,EAAA,MAAqB,GAClB2iE,EAAwBrS,GAAxBqS,yBACAzsC,EAAiB,QAAb,EAAGyrC,gBAAU,IAAVA,aAAagB,eAAqB,IAArBA,WAAwB7/E,EAA3B,6BAAjBozC,MACAz1C,EAAa,CAClBysB,UFtDE,GEuDF8wC,WAFkB,EAGlB9nB,KAAMA,eAAI,IAAJA,IAHY,KAIlB0sC,eAAgB7jE,EAAWjb,UAMtB++E,EAAiB7iE,aAA0BjB,EAA3C8jE,SACW,GAAMjiF,GAAO,EAAD,EAG5B,CACCJ,aAAc,CAACsC,EADhB,MAECrC,WAAYA,GALG,KAff,M,OA0BF,OAXMi9D,EAAW,EAAXA,OAWN,GAAO,CAAE32D,QADO22D,EAASvgD,EAAnB2lE,sB,0BAIN,CAAC9iE,EAAcld,EAAUk7D,EAAY7gD,EA9BlC,IAAEhd,EAAI,EAAN,KAAQC,EAAO,EAAf,QA+CN,OAbA4T,qBAAU,YACJ5T,GAAL,IAECiF,cAAclF,EAAdkF,kBAAoC,YACnCtC,mBAAuB,YACtBiV,QAAcA,EAAdA,IACAA,MAAYA,MAAZA,oBAGF0qE,EAAWviF,EAAXuiF,YAEC,CAACviF,EAXJ6T,IAcChM,YAAC64E,gBACAI,aAAc,WACbphB,EAAa/8D,EAAD,KAAZ+8D,MAEG,CACH/8D,SADG,EAEHg+E,aAFG,EAGHC,eAHG,EAIHrtC,OAJG,EAKHtzC,QALG,EAMHkhF,iBANG,EAOHN,gBAAe,IAGhBh5E,YAACw4E,IACAC,eAAgBphB,IAChBG,YAAaE,EACb58D,SAAUA,EAASmB,OAGZ,Q,EAAP8C,eAAO,IAAPA,WAAUjE,EAAH,4BAAmB+U,QAAQkrE,MAAM,EFpHrC,IEoH2DtgE,KAAI,YAClE,OACCza,YAAC04E,IACA3pE,IAAK2C,EAAM3C,IACX4pE,SAAUjnE,EAAM3C,IAChB6c,aAAc9wB,EAASmB,KACvBq7E,UAAW5lE,EAAM3B,MACjBirE,iBAAkBtpE,EAAM0K,MACxBw8D,gBAAiBlnE,eAAK,IAALA,WAAO+oB,eAK1B,KAAO,QAAP,SAAA17B,QAAO,IAAPA,OAAA,EAAAA,EAAUjE,EAAH,4BAAmB+U,QAA1B,SAAkD7P,YAACu6E,GAlCtD,QClFYU,GAAc,SAAC,GAC3B,QAAA1gE,aAAK,IAAG,YAAR,EACA7f,IADA,QACAA,OAAO,IAAG,GADV,EAEAu+E,EAAY,EAFZ,aAGAiC,EAAW,EAHX,YAIGh6D,EAAK,cALmB,kDAU3B,OACClhB,iCAASkhB,GACPg6D,SACAl7E,YAACmN,K,UACQ,cACRlB,QAASivE,EACT7gE,KAAM,aACNla,OAAQ,UACRiT,SAAO,EACPg9D,OAAK,EACL9+D,KAAM,cACNxR,IAAK,CAAC+4D,GAAsBsiB,MAG9Bn7E,mBAAKF,IAAKs7E,IACTp7E,YAACg5D,QAAUz+C,GACXva,YAACmN,K,UACQ,eACRlB,QAASgtE,EACT7gF,QAASA,EAETkZ,MAAOlZ,GAAW,YAClBib,UAAW,QACXvT,IAAK+4D,GACLzlD,SAAO,EACPg9D,OAAK,OAOJ+K,GAAar7E,YAAG,yEACK,SAAT0lD,IAGZ41B,GAAWt7E,YAAG,+LC7BPu7E,GAAa,SAAC,G,IAAEC,EAAU,aAAExgF,EAAQ,WAC1C,EAA8ByQ,mBAA9B,MAACgwE,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAA4BjwE,mBAA5B,IAACkwE,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACA,EAAwBnwE,mBAAxB,MAACxM,EAAO,EAAR,GAAU27E,EAAU,EAApB,GACA,EAAkBnvE,oBAAS,W,QAC1BovE,EAAwBrS,GAA9B,yBACA,OAA6Dv4D,QAA7D,EAAiB,QAAjB,EAAO4pE,gBAAU,IAAVA,aAAagB,eAAqB,IAArBA,WAAwB7/E,EAA3B,6BAA4CiV,qBAAS4pE,WAAtE,SAFMzrC,EAAI,EAAL,GAAOytC,EAAO,EAAd,GAKL,EAIG1hE,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEC+kB,cAAa/gB,EAAY,EAF1B,aAE4BjB,EAAU,EAFtC,WAKK,EAAuEm/C,KAArE2B,EAAY,EAAd,aAAgBR,EAAe,EAA/B,gBAAiCC,EAAa,EAA9C,cAAgDI,EAAkB,EAAlE,mBACA1B,EAAasB,IAEbniD,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAKAvI,qBAAU,WACT0vE,QACE,CAFH1vE,IAKA,IAAMvT,EAAaoE,mBAAQ,WAC1B,OAAK0+E,GAAL,EAEA,yBACCr2D,UAAW,IACRq2D,IACHvlB,WAAYA,EACZ9nB,KAAMA,IAASyrC,WAATzrC,MAAoCyrC,WAApCzrC,MAA+DyrC,gBAAwB/rE,QANvD,OAQrC,CAAC2tE,EAAYvlB,EAAY9nB,EAT5B,IAYM,EAAoBgnB,IAAiB,W,iIACpC0mB,EAAyB,OAAH,IAAG,CAAH,eAAQnjF,IAAYmiF,eAAgB7jE,EAAWjb,WACvEib,GAAA,MAA0C5B,GACzC6C,EAAA,MAAqB,EACP,GAAMpf,GAAOof,EAAchE,EAAwB,CACnExb,aAAc,CAACsC,EADoD,MAEnErC,WAAYmjF,KAJX,M,OAQF,OANMlmB,EAAW,EAAXA,OAMN,GAAO,CAAE32D,QADe,QAAlB+7E,EAAUplB,EAASvgD,EAAD,0CAA0Cra,EAA5DggF,Q,0BAIN,CAAC9iE,EAAcld,EAAUic,EAAY5B,EAblC,IAAEhd,EAAI,EAAN,KAAQC,EAAO,EAAf,QAiBN4T,qBAAU,WACT,IAEK7T,eAAI,IAAJA,WAAJ,WACCA,2BAA6B,YAC5B6X,QAAcA,EAAdA,IACAA,MAAYA,MAAZA,iBAED0qE,EAAWviF,EAAXuiF,YAGA,CAACviF,EAXJ6T,IAaAA,qBAAU,WACT,OAAI+K,GACHukE,MAEC,CAACvkE,EAJJ/K,IAQAA,qBAAU,WACT,MAEA,IAAM6vE,EAAgB98E,EAAtB,QAEA28E,GAAa,YAGZ,IAFA,IAAMI,EAAe,OAAH,IAAG,CAArB,GACIjtE,EAAJ,EACOA,EAAIgtE,EAAX,OAAiChtE,IAChCitE,EAAaP,aAAbO,GAA0CD,EAA1CC,GAED,OAAOA,UAAsBP,aAA7B,SAEC,CAACx8E,EAbJiN,IAgBA,IAKM+vE,EAAcrmE,uBACnB,Y,IAAG9Z,EAAK,QACP,gBAAO6/E,OAER,CAJD,IAOMpE,EAAY,SAAC,G,IAAEjpE,EAAK,QAAEW,EAAG,MAAEnT,EAAK,QACrC,IAAKmgF,EAAY,CAAEngF,MAAK,IACvB,OACCoE,YAACi4E,IAAoBlpE,IAAKA,EAAKX,MAAOA,EAAOtO,IAAKk8E,IADnD,cAOK,MAAyCP,EAAzC,GAAOx/E,EAAI,EAAX,IAAa8T,EAAK,EAAlB,MAAoBqM,EAAK,EAAzB,MAA2Bqe,EAAS,EAApC,UAEN,OACCz6B,YAAC04E,IACA3pE,IAAKA,EACLX,MAAOA,EACPwd,aAAc9wB,EAASmB,KACvBq7E,UAAWvnE,EACX4oE,SAAU18E,EACV++E,iBAAkB5+D,EAClBw8D,gBAAiBn+C,EACjB36B,IAAKk8E,MASR,OACCh8E,YAAC87C,QACA97C,2BACCA,YAACi7E,IACA1gE,MAAOzf,EAASmB,KAChB7D,QAASA,EACT6gF,aAVmB,WACtBphB,EAAa/8D,EAAD,KAAZ+8D,KAUGqjB,YAAaI,EACbx7E,IAAKA,YAAG,iGACW,IAAY,IAAY,mBAAhC0lD,GAAYA,GAAYA,MAIpCxlD,YAAC84D,SAED94D,mBAAKF,IAAKm8E,IACTj8E,YAAC45E,IACAC,YAAa,CAACF,WAAD,MAA2BA,gBAA3B,OACbG,mBAAoB5rC,EACpB6rC,sBAAuB4B,EACvB77E,IAAK,CAAC+4D,MAGP74D,YAAC+4D,SAED/4D,YAACyvE,IAAYC,OAAQ50E,EAASmB,QAG/B+D,YAAC84D,UAGF94D,YAACw4E,IACAC,eAAgBphB,IAChBG,YAAaE,EACb58D,SAAUA,EAASmB,OAGpB+D,YAACy2E,QACC,cAAA13E,QAAO,IAAPA,OAAA,EAAAA,EAAA,eAA6BA,WAC7BiB,YAACu6E,IAAmBz6E,IAAKo8E,KAEzBl8E,YAACm8E,MACAC,aAnFgB,SAAC,G,IAAE/gF,EAAU,aAAEghF,EAAS,YAC5Cb,EAAc,CAAEngF,WAAF,EAA0BC,SAAU+gF,KAmF9CN,YAAaA,EACbh5C,UAAU,OAAAhkC,QAAO,IAAPA,OAAA,EAAAA,EAAA,WAAqB,EAC/Bu9E,iBA5LN,KA8LO,Y,IAAGC,EAAc,iBAAEC,EAAa,gBAAO,OACvCx8E,YAACy8E,WACC,Y,IAAGvuE,EAAK,QAAEC,EAAM,SAChB,OACCnO,YAAC08E,MACAp+D,IAAKk+D,EACLtuE,MAAOA,EACPC,OAAQA,EACRouE,eAAgBA,EAChB15C,UPvEJ,GOwEIE,UAAU,OAAAhkC,QAAO,IAAPA,OAAA,EAAAA,EAAA,WAAqB,EAC/B49E,YAAatF,aAalB4E,GAAan8E,YAAG,mJAGD,IAAY,SAAtB0lD,GAAcA,IAGnB1J,GAAU,uKAAU,4GAQpBkgC,GAAiBl8E,YAAG,6DACE,WPrGrB,IOwGDo8E,GAAqBp8E,YAAG,+DACX,IAAY,SAApB0lD,GAAYA,ICnPVo3B,GAAgBnlF,wBAAtB,MCQA,I,YAAMolF,GAA0B,SAA1BA,EAA2B,GACvC,IAAAnrE,EAAK,EAALA,MACA5W,EAAQ,EADR,SAEAzB,IAFA,UAEAA,OAAS,IAAG,OAFZ,EAGAqB,IAHA,mBAGAA,OAAkB,IAAG,GAHrB,EAIAR,IAJA,mBAIAA,OAAkB,IAAG,GAJrB,EAKA4iF,EAAU,EALV,WAMA7hF,IANA,MAMAA,OAAK,IAAG,IANR,EAOGimB,EAAK,cAR+B,iGAUjC,EAOFg1C,KANHuB,EAAuB,EADlB,wBAELN,EAAyB,EAFpB,0BAGLS,EAA8B,EAHzB,+BAILK,EAAgB,EAJX,iBAKLC,EAAgB,EALX,iBAQAlC,GAAasB,EAFL,EANR,iBAUOr7D,EAAqCyV,EAA1C3C,IAAWqN,EAA+B1K,EAA1C,MAAkB6U,EAAwB7U,EAA1C,SAA4B+oB,EAAc/oB,EAA1C,UACFka,EAAe9wB,EAArB,KACMiiF,EAAgBxoC,EACnB,QAAsBhuB,EAAWzrB,EAAH,UADF,IAE5B,KAAUA,EAFb,UAIM,EDwCP,SAA8BilB,GAC7B,IAAMjP,EAA0BmJ,qBAAhC,IACM,EAA+B1O,oBAA/B,GAACyxE,EAAe,EAAhB,GAAkBC,EAAS,EAA3B,GACAC,EAAoBC,QAAQrsE,eAAO,IAAPA,0BAAlC,IAEMssE,EAAoB1nE,uBAAY,W,MACrC,UAAA5E,EAAA,gCAAAA,EAAA,KACE,CAACA,EAFJ,IAIMusE,EAAkB3nE,uBAAY,WACnCunE,GAAU,YAAO,cADlB,IAIA,OAAOnsE,EAAU,CAACosE,EAAJ,GAA4C,CAACF,EAA3D,GCrD6BM,CAAvB,GAAC5xC,EAAM,EAAP,GAAS6xC,EAAU,EAAnB,GAEAvoD,EAAQmiC,EAA0Br8D,EAAD,KAAvC,GACMw1E,EAAat7C,IAAUihC,GAA7B,GACMya,EAAa17C,IAAUihC,GAA7B,IACMunB,GAAiBhN,GAAD,KAAtB,EAGMiN,GACJjN,IAAD,GAEAx7C,IAAUihC,GAFV,YAGAgC,EAAiBrsC,EAJlB,GAKM8xD,GACJlN,IAAD,GAEAx7C,IAAUihC,GAFV,YAGAiC,EAAiBtsC,EAJlB,GAaA,OACC5rB,YAAC+a,gBACA/a,YAACq3E,gBACAM,mBAAoB,CACnBrH,WADmB,EAEnBI,WAFmB,EAGnBF,mBAHmB,EAInBoH,mBAJmB,EAKnB3f,iBALmB,EAMnBC,iBANmB,EAOnBpqD,SAAU0vE,GAEXzF,gBAAiB,CAChB5G,IADgB,EAEhBC,MAAO32C,GAER68C,UAAWr7E,EACXs7E,gBAAiBvhB,EACjBwhB,cAzBoB,WACtB,GAAoB/f,EAAwB7rC,EAAcmxD,EAAtCtlB,IAyBlBggB,eAvBoB,WACtB7f,EAA+B98D,EAAD,KAA9B88D,IAuBE8f,YAAa6F,EACb7xC,OAAQA,EACRmsC,SAAsB,MAAZtxD,EACVo7B,MAAOA,GACHzgC,SAGJqF,OACAvmB,YAACu5E,KAAS7tC,OAAQA,EAAQiyC,qBAAqB,GAC7Cp3D,EAAA,QAAkBu2D,GAAcv2D,EAAhC,aAAqD,YAAW,OAChEvmB,YAAC68E,GACAl7B,MAAOA,EAAQ,EACf5yC,IAAK,KAAmBiB,EAAMjB,IAC9B2C,MAAO1B,EACPlV,SAAUA,EACVy5C,UAAWwoC,EACXvM,mBAAoBx7C,IAAUihC,GAAVjhC,IAA4Bw7C,EAChDoH,mBAAoB5iD,IAAUihC,GAAVjhC,KAA6B4iD,EACjDkF,WAAYA,UCvFNc,GAA2B,SAAC,G,MAAE9iF,EAAQ,WAAEg+E,EAAY,eAAEC,EAAc,iBAAEr+E,kBAAM,IAAG,KACrF,EAAwB6Q,mBAAxB,MAACxM,EAAO,EAAR,GAAU27E,EAAU,EAApB,GACA,EACLxkB,KADOoB,EAAa,EAAf,cAAiBnB,EAA2B,EAA5C,4BAA8CyB,EAA8B,EAA5E,+BAA8EI,EAAwB,EAAtG,yBAEAhC,EAAasB,IAElB,EAIGr9C,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEC+kB,cAAa/gB,EAAY,EAF1B,aAE4BjB,EAAU,EAFtC,WAMKuiE,EAAmBj8E,eAAyC,QAA3B,EAAA84D,WAA2B,eAAKr7D,EAAhC,QAAduC,IAAzB,OACM27E,EAAkBj6E,eAAO,IAAPA,WAAxB,SAGMoW,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAmBM,EAAoB2gD,IAAiB,W,iIACWn+C,GAChDiB,EAAA,MAAqB,GAClBvf,EAAa,CAClBu9D,WADkB,EAElB4kB,eAAgB7jE,EAAWjb,UAGX,GAAMlB,GAAmBod,EAAchE,EAAwB,CAC/Exb,aAAc,CAACsC,EADgE,MAE/ErC,WAAYA,MATX,M,OAaF,OANMi9D,EAAW,EAAXA,OAMN,GAAO,CAAE32D,QADe,QAAlB+7E,EAAUplB,EAASvgD,EAAD,0CAA0Cra,EAA5DggF,Q,0BAIN,CAAC9iE,EAAcld,EAAUqa,EAjBtB,IAAEhd,EAAI,EAAN,KAAQC,EAAO,EAAf,QAkCN,OAbA4T,qBAAU,WACT,IAEK7T,eAAI,IAAJA,WAAJ,WACCA,2BAA6B,YAC5B6X,QAAcA,EAAdA,IACAA,MAAYA,MAAZA,iBAED0qE,EAAWviF,EAAXuiF,YAGA,CAACviF,EAXJ6T,IAcChM,YAAC64E,gBACAI,aAAc,WACbjhB,EAAyBl9D,EAAD,KAAxBk9D,MAEG,CACHl9D,SADG,EAEHg+E,aAFG,EAGHC,eAHG,EAIHrtC,OAJG,EAKHtzC,QALG,EAMHkhF,iBANG,EAOHN,gBAPG,EAQH6E,oBAAqB9+E,eAAO,IAAPA,mBAAiB6iC,SAGvC5hC,YAACw4E,IACAC,eAAgBtiB,IAChBqB,YAAaI,EACb98D,SAAUA,EAASmB,OAGnB,OAAA8C,QAAO,IAAPA,OAAA,EAAAA,EAAA,gBPjHG,IOiHH,KAAiD,YACjD,OAAOiB,YAAC68E,IAAwB9tE,IAAK2C,EAAM3C,IAAK2C,MAAOA,EAAO5W,SAAUA,EAAUgiF,WAAY,OAG9F,YAAA/9E,QAAO,IAAPA,OAAA,EAAAA,EAAA,iBAAiCiB,YAACu6E,GA1BrC,QChEYuD,GAAyB,SAAC,G,QAAExC,EAAU,aAAExgF,EAAQ,WACtD,EAAwByQ,mBAAxB,MAACxM,EAAO,EAAR,GAAU27E,EAAU,EAApB,GACA,EAAkBnvE,mBAASouE,WAA3B,OAACzrC,EAAI,EAAL,GAAOytC,EAAO,EAAd,GAGL,EAIG1hE,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEC+kB,cAAa/gB,EAAY,EAF1B,aAE4BjB,EAAU,EAFtC,WAKK,EACLm/C,KADO8B,EAAwB,EAA1B,yBAA4B7B,EAA2B,EAAvD,4BAAyDmB,EAAa,EAAtE,cAAwEG,EAAuB,EAA/F,wBAEAzB,EAAasB,IAEbniD,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAKM9b,EAAaoE,mBAAQ,WAC1B,MAAO,CACNm5D,WADM,EAEN9nB,KAAMA,IAASyrC,WAATzrC,MAAoCyrC,WAApCzrC,MAA+DyrC,gBAF/D,MAGNiB,eAAgB7jE,EAAWjb,YAE1B,CAACk6D,EAAY9nB,EAAMn3B,EANtB,WAQA/K,qBAAU,WACT,OAAI+K,GACHukE,MAEC,CAACvkE,EAJJ/K,IAOM,MAAoBkpD,IAAiB,W,+HACtCl9C,GAAA,GAA4B7C,GAC3B6C,EAAA,MAAqB,EACP,GAAMpd,GAAmBod,EAAchE,EAAwB,CAC/Exb,aAAc,CAACsC,EADgE,MAE/ErC,WAAYA,KAJX,M,OAQF,OANMi9D,EAAW,EAAXA,OAMN,GAAO,CAAE32D,QADe,QAAlB+7E,EAAUplB,EAASvgD,EAAD,0CAA0Cra,EAA5DggF,Q,0BAIN,CAAC9iE,EAAcld,EAAUqa,EAZtB,IAAEhd,EAAI,EAAN,KAAQC,EAAO,EAAf,QAgBN4T,qBAAU,WACT,IAEK7T,eAAI,IAAJA,WAAJ,WACCA,2BAA6B,YAC5B6X,QAAcA,EAAdA,IACAA,MAAYA,MAAZA,iBAED0qE,EAAWviF,EAAXuiF,YAGA,CAACviF,EAXJ6T,IAaM,MHzEP,SAAkCpT,GAK3B,MAAsC2S,mBAAtC,IAACwyE,EAAc,EAAf,GAAiBC,EAAiB,EAAlC,GAGAC,EAAgBphF,mBACrB,WAAM,QAAEQ,OAAA,kBAAqC,cAAU,OAAA8/E,QAAQrsC,GAAR,MAAjD,KACN,CAFD,IAMMotC,EAAerhF,mBAAiB,WACrC,MAAO,CACNshF,eADM,EAENZ,WAAY,YACX,IAAMa,EAAe,OAAH,IAAG,CAAH,GAAlB,GACM1sE,EAAQ0sE,EAAd,GAECA,MADD,GACCA,KAIDJ,SAGA,CAdH,IAuBMK,EAAY3oE,uBAAY,WAC7B,KACCsoE,UACM,CACN,IAAIM,EAAJ,IAC2B,SAArBC,EAAsB3lF,GAC3BA,WAAe,YACd0lF,OAAkB5sE,EAAlB4sE,KACA,IAAM/3D,EAAW7U,EAAjB,SACA,GACC6sE,QAIHA,IACA,IAAMC,EAAW,UAAoB,c,MAAiB,kCAAM5lF,WAASmW,IAAM,EAArB,MAAtD,IACAivE,QAEC,CAACC,EAlBJ,IAoBA,MAAO,CACNA,cADM,EAENC,aAFM,EAGNG,UAAS,GGayCI,CAAkB1/E,eAAO,IAAPA,WAA/D,SAAEk/E,EAAa,EAAf,cAAiBC,EAAY,EAA7B,aAA+BG,EAAS,EAAxC,UAMN,OACCr+E,YAAC87C,QACA97C,2BACCA,YAACi7E,IACA1gE,MAAOzf,EAASmB,KAChB7D,QAASA,EACT6gF,aAV0B,WAC7BjhB,EAAyBl9D,EAAD,KAAxBk9D,KAUGkjB,YAAaI,EACbx7E,IAAKA,YAAG,iGACW,IAAY,IAAY,mBAAhC0lD,GAAYA,GAAYA,MAIpCxlD,YAAC84D,SAED94D,mBAAKF,IAAKm8E,IACTj8E,YAACmN,KACAkN,KAAM4jE,EAAgB,eAAiB,aACvChyE,QAASoyE,EACTjrE,SAAO,EACPg9D,OAAK,EACLtwE,IAAKA,YAAG,mIAKTE,YAAC45E,IACAC,YAAa,CAACF,WAAD,MAA2BA,gBAA3B,OACbG,mBAAoB5rC,EACpB6rC,sBAAuB4B,IAGxB37E,YAAC+4D,SAED/4D,YAACyvE,IAAYC,OAAQ50E,EAASmB,QAG/B+D,YAAC84D,UAGF94D,YAACw4E,IACAC,eAAgBtiB,IAChBqB,YAAaC,EACb38D,SAAUA,EAASmB,OAGpB+D,YAAC48E,GAAcllD,UAAS9pB,MAAOswE,GAC9Bl+E,YAACy2E,QACU5mE,QADV4mE,EACC13E,eAAO,IAAPA,WAAS8Q,8BAAS4K,KAAI,YACtB,OAAOza,YAAC68E,IAAwB9tE,IAAKsD,EAAKtD,IAAK2C,MAAOW,EAAMvX,SAAUA,OAEtE,KAAS+U,QAAT,SAAA9Q,QAAO,IAAPA,OAAA,EAAAA,EAAS8Q,8BAAT,SAAkC7P,YAACu6E,GAnDxC,UA0DK0B,GAAan8E,YAAG,mJAGD,IAAY,SAAtB0lD,GAAcA,IAGnB1J,GAAU,uKAAU,4GCzJpB4iC,GAAoB,qBAApBA,GAEG,QAMT,SAAgBC,GAAWjjF,EAAgC0B,QAAhC,IAAA1B,MAAA,SAAgC,IAAA0B,MAAA,IAsDzD,MAAO,CAACwhF,iBAxCiBljF,EAAA,KAAe,YACtC,IAAMmjF,EAbgB,SAAC/jF,EAAD,GACtB,WAGSA,iBAAwBkgB,IAA5B,cACI0jE,GAEA5jF,iBAAwBkgB,IAA5B,aACI0jE,QADJ,GAMwBI,CAAgBhkF,EAAUsC,EAAOtC,EAA9D,OACA,OAAI+jF,IAAiBH,GAEX,CACN5jF,SADM,EAENikF,UAAW,kBAIT,6BACEhwE,IAAKA,EACLjU,SAAUA,EACVg+E,aAAc,WAAM,UAAgBA,EAAah+E,EAA7B,KACpBi+E,eAAgBA,EAChBrtC,OAAQA,MAIPmzC,IAAiBH,GAChB,CACN5jF,SADM,EAENikF,UAAW,kBAIT,6BACEhwE,IAAKA,EACLjU,SAAUA,EAChBg+E,aAAc,WAAM,UAAgBA,EAAah+E,EAA7B,KACdi+E,eAAgBA,EAChBrtC,OAAQA,MAKd,QApCqB,QAsCf,SAAAn9B,GAAK,cAAAA,MC1CV,I,YAAMywE,GAAY,SAAC,G,IAAEC,EAAS,YAAE5lF,0BAAc,IAAG,SAAMqB,+BAAmB,IAAG,SAC7E,EAA8B6Q,mBAA9B,IAAC7P,EAAU,EAAX,GAAawjF,EAAa,EAA1B,GACA,EAAgD3zE,mBAAhD,IAAC4zE,EAAmB,EAApB,GAAsBC,EAAsB,EAA5C,GACEhoB,EAAmBlB,KAAnBkB,eAEP,EAIGn9C,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEc+C,EAAU,YAFxB,WAKKsoE,EAA2BF,SAAjC,EAIQP,EAAqBD,MAArBC,iBAGFzpE,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAIAvI,qBAAU,WACT,KAAgB,CACf,IAAIszE,OAAiB,EACrB,EACCA,EAAoBvrE,6BAAiBC,GAArCsrE,KxSpBH,kBADgCvqE,EwSuB7BuqE,KxStB0BvqE,EAAMR,YAANQ,IwSsB1BuqE,ExSrBIjiF,cAAc0X,EAArB,ewSwBE,EACCuqE,UAGAA,QAAuB,cAAU,OAACxuC,OAASD,EAATC,QAAuBvhC,OAAOuhC,OAASD,EAAxC,SAElCquC,UAEAA,MxSlCH,IAAiCnqE,IwSoC7B,CAACgC,EAAY5B,EAAoBnB,EAAwBurE,EAnB5DvzE,IAsBAA,qBAAU,WACTozE,GAAuB,OAAA1jF,QAAU,IAAVA,OAAA,EAAAA,EAAA,KAAgB,YAAO,OAAAygB,EAAA,UAA9CijE,MACE,CAFHpzE,IAOA,IAgBM8sE,EAAe,SAACh+E,EAAUikF,GAC/BE,EAAU,CACTF,UADS,EAET79D,MAAO,CAAEpmB,SAAQ,GACjByf,MAAOzf,EAASmB,QAIlB,OACC+D,YAAC87C,QACA97C,2BACCA,YAACi7E,IACA1gE,MAAO,UACP0+D,aAAc7hB,EACdt3D,IAAKA,YAAG,iGACW,IAAY,IAAY,mBAAhC0lD,GAAYA,GAAYA,MAIpCxlD,YAAC84D,SAED94D,mBAAKF,IAAKm8E,IACTj8E,YAACmN,K,UACQ,sBACRlB,QA9BiC,WAErCmzE,EAAuBC,EAA2B,GAAK3jF,EAAA,KAAe,YAAc,OAAAZ,EAAA,UA6BhFuf,KAAMglE,EAA2BhvD,IAAH,WAA0BA,IAAUmvD,aAClEluE,KAAM+tE,EAA2B,aAAe,eAChDv/E,IAAK+4D,GACLzlD,SAAO,EACPg9D,OAAK,IAENpwE,YAAC+4D,SACD/4D,YAACyvE,UAGFzvE,YAAC84D,UAGF94D,YAACy2E,IACAC,WAAY,CACX52E,IAAKA,YAAG,yGACoB,mBAAT0lD,MAInBo5B,EAAA,KAAqB,YACb,IAAA9jF,EAAwB2kF,EAAxB3kF,SAAUikF,EAAcU,EAAxB,UAEF/zC,GAAUyzC,WAA6BrkF,EAA7C,MACA,OAAOikF,EAAUjG,GAFM,WAAM,OA/DDltD,EA+DwB9wB,EAAvB,UA9DhCskF,GAAuB,YACtB,OAAIM,WAAJ,GACQA,EAAA,iBAA8B,YAAO,OAAAnxE,IAAA,KAE7C,YAAWmxE,GAAX,OAL6B,IAAC9zD,IAiEmB8f,EAAQ5wC,EAAvD,YAOCghD,GAAU,sKAAU,4GAQpBmgC,GAAan8E,YAAG,2HAED,IAAY,iCAAtB0lD,GAAcA,ICzIzB,SAAgBm6B,GAAUn+D,G,IACzBnoB,0BAAc,IAAG,SACjBqB,+BAAmB,IAAG,SAEdwf,EAAaD,yBAAbC,SACF,EAAmDg8C,KAAjDmB,EAAe,EAAjB,gBAAmBlB,EAA2B,EAA9C,4BACAL,EAAeuB,IACftB,EAA2BI,IAWjC,OAPAnqD,qBAAU,WACT,IAAI8Y,iBAAyBA,YAA7B,IACA,IAAM86D,EAAoBvnB,GAAe,eAAzC,GACMwnB,EAAgCxnB,GAAe,2BAArD,GACAn+C,EAASP,Y/D/BsB,SAACzB,GAEjC,IAAM4nE,EAAW,GAAGC,OAAOC,MAAM,GAAI9nE,EAAA,KAAiB,SAAAR,GAAe,OAAAA,EAAY0gD,GAAZ,YAC/D6nB,EAAY,GAAGF,OAAOC,MAAM,GAAI9nE,EAAA,KAAiB,SAAAR,GAAe,OAAAA,EAAY0gD,GAAZ,aAEhEvsC,EAAN,GAIA,OAHIi0D,EAAJ,SAAqBj0D,EAAYusC,GAAZvsC,OACjBo0D,EAAJ,SAAsBp0D,EAAYusC,GAAZvsC,QAEtB,E+DsB6Dq0D,CAAkB,CAACN,EAA/E1lE,SACE,CAAC47C,EAAcC,EALlB/pD,IAQChM,YAAC87C,QACA97C,YAACq6D,IAAcE,gBAAiB,QAAS7/C,YAAa,MACrD1a,YAAC87C,QACA97C,YAACmgF,I,CACAC,aAAc,CACbrB,UADa,GAEb79D,MAAO,CAACq+D,eAAD,EAAiCc,oBAAqBA,IAG9DC,iBAAiB,OAQvB,I,GAAMxkC,GAAU,sNAAU,4JCnDnB,I,GAAMykC,GAA2B,WACvC,OACCvgF,mBAAKF,IAAK0gF,IACTxgF,YAACD,IAAYO,KAAM,OAKhBkgF,GAAkB1gF,YAAG,2GCAnB2gF,GAA6E9mE,GAA1D+mE,GAA0D/mE,GAAhCyzD,GAAgCzzD,GAAlBgnE,GAAkBhnE,GAcxEinE,GAAY,SAAC,G,IACzBC,EAAO,UACPt6D,EAAQ,WACRu6D,EAAW,cACXC,EAAc,iBACdC,EAAe,kBACf3nF,uBAAW,IAAG,cACdqB,4BAAgB,IAAG,SAGTkf,EACNK,+BADML,YAEJ,EAMFK,qBANE,IACLhf,IADK,MAEJC,IAFI,SAEQ2c,EAAM,EAFd,OAEgB7D,EAAsB,EAFtC,uBAGJ+kB,cAAa9gB,EAAW,EAHpB,YAGsBpC,EAAO,EAH7B,QAKLqE,EAAQ,EALH,SAYNlO,qBAAU,WACT,MAEA,IAEMivD,EAFMpjB,aAAMipC,GAAD,WAA2BzjF,YAAYuc,EAAxD,WAEyB,QAChB,YAEP,QAAKvc,YAAYuc,EAAZvc,kBAAL,KAGA,GACS2jF,WAAR,IACUD,GACHA,WAAP,OATsB,KAcnB,YAAS,OAAAnnE,EAAA,cAdU,QAgBvB,YACC,0BAAO05C,GAAQx9C,EAARw9C,KAAP,SAAqDA,GAAQx9C,EAARw9C,aAArD,MAGHp5C,EAASymE,GAATzmE,OACE,CAAC4mE,EAAaE,EAAiBD,EAAgBnnE,EAAaM,EA1B/DlO,IA8BAA,qBAAU,WACJ6L,IAAU7D,GAA2B8Q,YAA1C,IACC5K,EAASumE,QAER,CAACvmE,EAAUrC,EAAQ+B,EAAa5F,EAAwB6B,EAJ3D7J,IAQAA,qBAAU,WACJ60E,IAAL,GACA3mE,EAASwmE,GAAyBO,cAAD,GAAjC/mE,MACE,CAAC2mE,EAAS3mE,EAAUlG,EAHvBhI,IAMQ,IAAA+K,ECxFT,SACC/C,EACAiE,EACAipE,GAHD,WAKO,EAAsB31E,mBAAtB,MAACxT,EAAM,EAAP,GAASopF,EAAS,EAAlB,GAGA,EAA2BjsB,IAAiB,W,2GACjD,SAGO,GAAMzjD,YAAM8C,YAAD,GAAoD2sE,eAAgB,IAAhBA,IAA/D,KAHsB,I,OAG7B,SAAO,EAAP,iBACE,CAACltE,EALE,IAAE7b,EAAI,EAAN,KAAQC,EAAO,EAAf,QAAiBC,EAAK,EAAtB,MAaN,OANA2T,qBAAU,WACT,GACCm1E,OAEC,CAJHn1E,IAMO,CACN+K,WADM,EAEN3e,QAFM,EAGNC,MAAK,GDgEiB+oF,CAAmBptE,EAAwBiE,EAA3CmpE,GAAfrqE,WAOR,OAJA/K,qBAAU,WACTkO,EAASkzD,GAAar2D,EAAtBmD,MACE,CAACnD,EAFJ/K,IAIK60E,GAAD,GAAJ,EAIO7gF,YAAC8a,IAAMC,cAAd,GAHQ/a,YAACugF,GAAR,OEtFWc,GAAS,SAAC,G,IAAER,EAAO,UAAEloF,EAAO,UAAEqoF,EAAe,kBAAED,EAAc,iBAAED,EAAW,cAAEI,EAAgB,mBAAE36D,EAAQ,WAC3G,E,W3SJD,MAAoBgR,qBAAW,GAA/B,IACN,MAAO,CADK,EAAN,GAAgB,EAAhB,I2SIqB+pD,GAAnBtsD,EAAK,EAAN,GAAQ9a,EAAQ,EAAhB,GAEAgkE,EAAerhF,mBAAQ,WAC3B,MAAO,CAAEm4B,MAAF,EAAS9a,SAAQ,KACvB,CAAC8a,EAFJ,IAWA,OAPAhpB,qBAAU,WACV,GAAGrT,GAAH,EAAsB,CAClB,IAAMK,EAAMub,YAAZ,GACA2F,EAASP,GAATO,OAED,CAAC2mE,EAAS3mE,EALblO,IAQEhM,YAACtI,GAAiBggC,UAAS9pB,MAAOswE,GAChCl+E,YAAC4gF,IAAUC,QAASA,EAClBG,gBAAiBA,EACjBD,eAAgBA,EAChBD,YAAaA,EACbI,iBAAkBA,GANxB,KCqBuB,4aAQc,8BARvC,I,mDAYMjqE,GAAQnX,YAAG,yHAKXyhF,GAAYzhF,YAAG,+EACb,6CADR,IClEa0hF,IDwEK,uDACN,qBAIK,wKAMG,kEACR,gCAIM,kEACN,gCAIY,8NC7FG,CAC1BD,UAAWzhF,YAAG,uNAQF2hF,GAAiB,CAC7Bv1E,UAAWpM,YAAG,8dAQyB,kCAAlBW,IATQ,aAY7B1B,QAASe,YAAG,0EACY,oCAArB0hF,GAb0B,WAgB7B3rE,QAAS/V,YAAG,iDACY,WAArB0hF,GAjB0B,WAmB7BjpF,SAAUuH,YAAG,0EACW,oCAArB0hF,GApB0B,WAuB7B5oF,OAAQkH,YAAG,iDACa,WAArB0hF,GAxB0B,WA0B7BpN,OAAQt0E,YAAG,+GACgB,mEAArB0hF,GA3BuB,WA+B7Bv3D,KAAMnqB,YAAG,2LACe,qJAArB0hF,GAhC0B,WAwC7BE,OAAQ5hF,YAAG,oDACc,UAArB0hF,GADO,YClCZ,SAAgBG,GAAkBngE,G,IACjCq/D,EAAO,UACPloF,EAAO,UACPipF,EAAa,gBACbC,EAAW,cACXb,EAAe,kBACfD,EAAc,iBACdD,EAAW,cACX9V,EAAY,eAEZ,OACChrE,YAACqhF,IACAR,QAASA,EACTloF,QAASA,EACTqoF,gBAAiBA,EACjBD,eAAgBA,EAChBD,YAAaA,GAEb9gF,mBAAKF,IAAK2hF,GAAev1E,WACxBlM,mBACCF,IAAKA,YAAG,kGACiB,4CAAtB2hF,GADK,UAKRzhF,oBACCF,IAAKA,YAAG,mIAGRG,UAAW,sB,aAIZD,YAACqtE,UAGFrtE,mBAAKF,IAAK2hF,GAAerN,QACxBp0E,YAAC+tE,IAAO8T,YAAaA,KAGtB7hF,YAACwmB,KAAK1mB,IAAK2hF,GAAex3D,MACzBjqB,YAACwmB,KAAK1mB,IAAKgiF,IACV9hF,YAAC+sE,IAAa/B,aAAcA,KAE5B4W,GAGF5hF,YAACwmB,KAAK1mB,IAAK2hF,GAAelpF,UACzByH,YAAC6oE,UAGF7oE,mBAAKF,IAAK0kB,IACTxkB,YAACwmB,KAAK1mB,IAAKlH,IACVoH,YAAC2/E,WAIH3/E,mBAAKF,IAAK0kB,IACTxkB,YAACwmB,KAAK1mB,IAAKlH,IACVoH,YAAC2jE,GAjDN,UAyDD,I,wBAAMn/C,GAAQ1kB,YAAG,yKAMXgiF,GAAehiF,YAAG,uPAQlBmX,GAAQnX,YAAG,yHAKXyhF,GAAYzhF,YAAG,+EACb,6CADR,IAcMlH,IARU,4KAQDkH,YAAG,uDACN,qBADZ,KC/DyB,4aAQc,8BARvC,I,2BAYMmX,GAAQnX,YAAG,yHAKXyhF,GAAYzhF,YAAG,+EACb,6CADR,IAM2B,2GACf,yEAQM,uDACN,qBAIQ,kEACR,gCAIM,kEACN,gCAIK,wKAMO,8N,+BCjFXiiF,GAAwD,SAAC,G,IACxD7lC,EAAG,cAChB7iD,2BAAwB2oF,OAAc,IAAG,EAAAC,KACzCvmF,EAAU,aACVhB,wBAAY,IAAG,OACfR,qBAAS,IAAG,OACZuB,EAAY,eACZR,0BAAc,IAAG,KAEXinF,EAAQ7mE,iBAAO,IAAI,GAAJ,EAAsB,CAAE8mE,YAAF,EAAoBC,cAApB,EAAiDC,UAAWC,KACjG,EAA8B/2E,qBAA7BgwE,EAAU,EAAX,GAAaC,EAAa,EAA1B,GACA,EAA4BjwE,mBAA5B,IAACkwE,EAAS,EAAV,GAAYC,EAAY,EAAxB,GACA6G,EAAUlnE,mBACVmnE,EAAkB9sE,uBAAY,YAAgB,OAAA6sE,EAAA,QAAAt4D,IAAwB,CAA5E,IAGC,EAIGhQ,yBAJH+a,MACahhB,EAAsB,WADnC,uBAEcgE,EAAY,YAF1B,aAMK7C,EAAqBtY,mBAAQ,WAClC,OAAO0X,YAAP,KACE,CAFH,IAKM9b,EAAaoE,mBAAQ,WAC1B,SAEA,aACCpB,aAAcA,GAAgB/C,YAAiCsb,EAAwB,CAAzDtb,OAC9BuqC,WAAYw/C,GAFb,GAFwB,OAOtB,CAAClH,EAAYvnE,EAAwBvY,EARxC,IAUQtD,EC1DT,SAA+Bgd,EAC3Bpd,EACA2D,EACAjD,GAEI,MAA0B8S,oBAA1B,GAACm3E,EAAS,EAAV,GAAYC,EAAU,EAAtB,GACA,EAAoBp3E,mBAApB,MAAClT,EAAK,EAAN,GAAQovE,EAAQ,EAAhB,GACA,EAAkBl8D,mBAAlB,MAACpT,EAAI,EAAL,GAAOggD,EAAO,EAAd,GA2BN,OAzBAnsC,qBAAU,WAoBR,GAnBA,W,+GAEE,GADA22E,OACA,EACE,U,iBAGuC,O,sBAAA,GAAM5nF,YAAOhD,EAAQod,EAAT,aAAZ,I,cAAnCugD,EAAmC,EAAnCA,OACJvd,EAAQud,EAAA,KAAa,SAAAnnD,GAAM,oBAAQq0B,WAAYr0B,EAAEq0B,WAAYggD,WAAYr0E,EAAEq0E,YAAer0E,EAA/D,oBAC3Bo0E,M,+BAEAA,MACAlb,KACAtvB,QAGAh6C,iB,8BAKF0kF,KAED,CAAC9qF,EAAQod,EAAoBzZ,EAvBhCsQ,IAyBO,CAAC7T,KAAD,EAAOC,QAAP,EAA2BC,MAAK,GDwBvByqF,CAAe3tE,EAAoB6C,EAActc,EAAjDonF,GAAT3qF,KAKR6T,qBAAU,WACT,KAIA,GAAI7T,SAAcojF,WAAlB,EACCC,GAAc,SAAA5H,GAAS,kCACnBA,IACHt4E,SAAUnD,SAAc,YAI1B,KAAIA,WAAkBojF,WAAsBA,EAA5C,aAGA,IAAK,IAAI1sE,EAAT,EAAgBA,EAAI1W,EAApB,OAAiC0W,IAChC4sE,EAAUF,aAAVE,GAAuCtjF,EAAvCsjF,GACAyG,gBAAoB3G,aAApB2G,KAEDxG,QACE,CAACvjF,EAAMojF,EAAYE,EApBtBzvE,IAuBA,IAAM+2E,EAAcrtE,sBAAYkmB,aAAS,W,MACxCsmD,qBACA,UAAAK,EAAA,gDAF8B,KAGtB,CAACA,EAHV,IAIAv2E,qBAAU,WAET,OADA8iB,oCACO,WAAM,OAAAA,OAAA,mCACX,CAHH9iB,IAMA,IAQM+vE,EAAc,SAAC,G,IAAEngF,EAAK,QAC3B,gBAAO6/E,MAIFuH,EAActtE,uBAAY,cAC/B+lE,OACAC,KACAwG,uBACE,CAACzG,EAAWC,EAAcwG,EAJ7B,IAOMe,EAA2B,SAAC,G,IAAErnF,EAAK,QAAEmT,EAAG,MAAEX,EAAK,QAAE+3B,EAAM,SAAO,OACnEnmC,YAACkjF,MAAahB,MAAOA,EAAMp5D,QAAS/Z,IAAKA,EAAKo3B,OAAQA,EAAQvqC,MAAOA,IACnE,Y,IAAG4gF,EAAa,gBAAO,OACvBx8E,mBAAKF,IAAKsO,EAAoBkQ,IAAKk+D,GAC/BT,EAAY,CAAEngF,MAAK,IAEnBsgD,EAAI,CAAE7pC,KAAMopE,EAAR,GAA0B7/E,MAA1B,EAAiConF,YAAW,IADhDhB,EADF,SASL,OACChiF,YAACy2E,QACAz2E,YAACm8E,MACAC,aApCkB,SAAC,G,IAAE/gF,EAAU,aAAEghF,EAAS,YAC5C,OAAO,IAAI9mB,SAAQ,YAClBimB,EAAc,CAAEngF,WAAF,EAA0BC,SAAU+gF,IAClD7R,UAkCCuR,YAAaA,EACbh5C,UAAU,OAAA/qB,QAAY,IAAZA,OAAA,EAAAA,EAAA,QAAuB,EACjCskE,iBAAkB6G,IAEjB,Y,IAAG5G,EAAc,iBAAEC,EAAa,gBAAO,OACvCx8E,YAACy8E,WACC,Y,IAAGvuE,EAAK,QAAEC,EAAM,SAAO,OACvBnO,YAAC08E,MACAxuE,MAAOA,EACPC,OAAQA,EACRmQ,IAAK,YACJk+D,KACAgG,MAEDjG,eAAgBA,EAChB6G,yBAA0BlB,EAAMp5D,QAChC+Z,UAAWq/C,UAAcr/C,UACzBE,UAAU,OAAA/qB,QAAY,IAAZA,OAAA,EAAAA,EAAA,QAAuB,EACjC2kE,YAAasG,YAeRhB,GAA2D,SAAC,GAAE,IAAU/gE,EAAK,cAAjB,WAAwB,OAChGlhB,+BAAKF,IAAKA,YAAG,uDAAoB,IAAY,OAApB0lD,GAAYA,KAAiBtkC,GACrDlhB,YAACg5D,IAAS/4D,UAAWsN,IAAQ8W,SAAUvkB,IAAKA,YAAG,4H,gBAG/CE,iBAAGC,UAAWsN,IAAQ8W,UALyE,kKErIpFg/D,GAAgD,SAAC,GAC7D,IAAA7qF,EAAY,EAAZA,aACAqhF,EAAW,EADX,YAEAyJ,EAAgB,EAFhB,iBAGAjqF,IAHA,eAGAA,OAAc,IAAG,GAHjB,EAIAqB,IAJA,QAIAA,OAAO,IAAG,cAJV,EAKawhD,EAAG,EALhB,YAMwB8lC,EAAc,EANtC,uBAOA9nF,IAPA,OAOQqpF,OAAe,IAAG,GAP1B,EAQAlsE,EAAO,EARP,QASApc,IATA,aASAA,OAAY,IAAG,OAAAu4B,EATf,EAUGtS,EAAK,cAXqD,uJAavD,EASFjH,qBATE,IACL8e,IADK,MAEJk1C,IAFI,SAGM8I,EAAc,QAHpB,eAIH/iE,EAAsB,EAJnB,uBAMJ2uD,cAAa3qD,EAAY,EANrB,aAMuBjB,EAAU,EANjC,WAQLmD,EAAQ,EARH,SAUAxe,EAAa2f,iBAAnB,GACM,EAA4C9P,mBAA5C,GAACi4E,EAAiB,EAAlB,GAAoBC,EAAoB,EAAxC,GACA,EAAgDl4E,mBAAhD,GAACm4E,EAAmB,EAApB,GAAsBC,EAAsB,EAA5C,GAEAxoE,EAAW,SAAC9I,GACjB6H,EACCP,GAAA,iBAA8D,CAC7Dq9D,mBAAoB3kE,EAAKuwB,cAG3BujB,GAAgB,iBAAkB9zC,EAAlC8zC,aAkBKy9B,EAAgC/mF,mBAAQ,WAC7C,IAAIvC,EAAqB,GAAiB0Z,EAAwB,GAAzC,SAAqD,SAAAmI,GAAK,OAAAA,EAAA,QAGnF,OAFA,IACC7hB,EAAqBA,EAAAid,QAA0B,SAAAtb,GAAQ,OAAA49E,EAAA,gBACxD,IACE,CAACA,EALJ,IAOMgK,EAAgBnuE,uBAAY,WACjC,SAEC1V,mBAAKF,IAAKgkF,IACRzsE,EAAA,KAAY,c,IAAGtH,EAAK,QAAEsK,EAAI,OAAE/D,EAAM,SAAU,OAC5CtW,YAACmN,KACA4B,IAAKF,EACLuE,SAAO,EACPnH,QAASqK,EACThF,KAAMvB,EACNsK,KAAMA,EACN+1D,OAAK,QAVY,OAenB,CAhBH,IAkBMh0D,EAAQvf,mBAAQ,WAAM,OAAAmb,IAAA,EACzB,CACDo5D,MAAOr6D,eAAU,IAAVA,WAAYqF,OAChB,CACHg1D,MAAOr6D,eAAU,IAAVA,WADJ,MAEHo6D,KAAK,OAAAn5D,QAAY,IAAZA,OAAA,EAAAA,EAAA,QAFF,MAGHq5D,QAAS,UACP,CAACr5D,EAPL,IASA,OACChY,+BAAKF,IAAKitD,IAAkB7rC,GAC3BlhB,uBAASF,IAAKikF,IACb/jF,YAACg5D,IAASl5D,IAAKkkF,IAAeC,GAC9BjkF,YAACkxE,kBAAe90D,GAAOtc,IAAKskD,MAC5BpkD,YAAC+4D,SACD/4D,YAAC45E,IACAC,YAAa+J,EACb9J,mBAAoB0J,EACpBzJ,sBAAuB0J,EACvBnJ,aAAcoJ,EACd1J,gBAAiB2J,EACjB7jF,IAAKokF,MAGNL,IACAM,GAECnkF,YAAC+hF,IACDhzE,KAAK,OAAAiJ,QAAY,IAAZA,OAAA,EAAAA,EAAA,eAAoE,EACzEtc,WAAYA,EAAWotB,QACvB6zD,YAtEe,SAAC,G,IAAEtqE,EAAI,OAGzB,OACCrS,mBACCC,UAAWoS,gBAAoB0kE,eAAc,IAAdA,WAApB1kE,oBAAyD,4CAAkCmhB,EACtG1zB,IAAK,CAACskF,GAAcb,EAAkBlqB,QAAjC,MACLptD,QAASs3E,EAAkB,WAAM,kBAAiB/vD,E,UAC1C,uBAERxzB,YAACk8C,GAAI7pC,KAAMA,EAAM8I,SAAU,WAAM,aAAgBmoE,iBAAkBE,MA6DlEa,uBAAwBrC,EACxBvmF,aAAc+nF,EACdf,eAAgBiB,MAOf32B,GAAejtD,YAAG,mQASlBikF,GAAiBjkF,YAAG,kPAI+B,iBACrC,IAAY,SADJmG,GAJF,iBAKdu/C,GAAYA,IAGlBw+B,GAAelkF,YAAG,uEACC,SAAR0lD,IAEXpB,GAAatkD,YAAG,uEACG,SAAR0lD,IAEX0+B,GAAkBpkF,YAAG,oEACN,kBAAV0lD,IAGLs+B,GAAkBhkF,YAAG,kGACN,IAAY,iCACwB,SAD7C0lD,GAAaA,GACGv/C,GAF5B,kBAIMm+E,GAAetkF,YAAG,kGACJ,IAAY,iCACyB,SAD7C0lD,GAAYA,GACIv/C,GAF5B,kBCjHA,I,2BC0DsB,sGACH,2DAGG,SAGE,sHAKL,kTAUE,0JAOC,6FACmC,SAG/B,yIAEN,qDAKH,qGACE,oCAEI,+BClHK,skBCnBhB,4RCwMW,8HAKG,gKAMH,gYAUS,gcAYpB,kSAaa,kHAxEzB,I,8BA6EMgR,GAAQnX,YAAG,yHAKXyhF,GAAYzhF,YAAG,+EACb,6CADR,IAM2B,gJAMJ,8DACX,4BCOZ,I,GACY,kSC/KZ,I,GACY,kSC+EW,8HAKG,gKAMH,gYAUS,gcAYpB,kSAaa,kHA9CzB,I,+DAmDMmX,GAAQnX,YAAG,yHAKXyhF,GAAYzhF,YAAG,+EACb,6CADR,IAM2B,gJAMJ,8DACX,4BCgHG,0OAMH,wNAKM,oLAKA,0IAIF,oFAGN,oFAGK,oLAKH,wPAMA,0IAIS,wIAIX,ozBC1WV,I,SAAqB,gWAUG,gNAQD,wSCVvB,I,wHAAmB,oMAOK,kKC+FL,4OAQK,oFAIR,wcAcI,8UChMM,0cAaO,4/CCyFnBkrC,IAASs5C,IAIG,oRASI,sSASI,4hBAaL,oRAQL,8KAMG,gdC0KK,8OAQD,0PAOT,goCAyDK,oWASI,sRAQC,sRAQL,oKCzYT,sNAOM,4PClBN,wHAKM,gFCvBD,sOAOC,oOCgGT,0OAMH,4NAKM,oLAKF,oFAGN,oFAGK,kOAMH,wPAMA,0IAIF,4gCCvFCt5C,IAASs5C,IAGC,gWASQ,sIAIL,gNAOD,wSCmDvB,I,SAAsB,wSCjHH,4EChBE,sRCIrB,I,GAAuB,wiBC4FvB,I,MAAwB,wEAIN,8EC1ElB,I,GAA6B,46CC1C7B,ICHaC,GAAuBzpE,kBAA7B,MAEP,SAAgB0pE,GAAchjE,GAA9B,WAAgC+E,EAAQ,WACjC,EAIF2uC,IAAiB,W,iHAEH,MADL,sBACK,GAAMuvB,MADX,sBACsB,CACjCC,OADiC,MAEjCC,YAFiC,UAGjCC,QAAS,CACR,eAAgB,uB,OAGlB,IAPMlvB,EAAW,EAAXA,SAOUA,UAAZA,KAAsCA,SAA1C,IACC,SAAOA,EAAP,QAEA,MAAM,IAAI72D,MAAV,uFAhBI,IACCzB,EAAM,EADP,KAELhF,EAAO,EAFF,QAGLC,EAAK,EAHA,MAoBN,SAAoB2H,YAACugF,GAAR,MAEb,EAEEvgF,YAACo2C,KACA/7B,KAAM,QACNE,MAAO,aACPG,YAAa,sDAMT1a,YAACukF,GAAqB7sD,UAAS9pB,MAAOxQ,GAASmpB,EAAS,CAAEnpB,OAAM,KC3BxE,I,SCwE0B,kFAIN,wGAKA,mJACmB,6EAQhCmD,IADY,IAENA,IAFM,OAGNA,IAAUwpB,IC3EvB,ICnBM1H,GAA0B,SAACC,GAChC,IAAMuiE,EAAN,GAOA,OANAviE,WAAc,YACbuiE,OAAkB,CACjB9kE,GAAIwC,cACJjR,KAAM1D,OAGR,GAMD,SAAwBk3E,GAAiBtjE,G,IAAEw6C,EAAU,aAAElpD,EAAK,QAAEyH,EAAK,QAAElhB,2BAAe,IAAG,EAAAyZ,IAAOpY,wBAAY,IAAG,MACtG+nB,EAAoB3P,EAAA,QAAa,YAAU,OAAC4P,WAAD,MAC3CC,EAAiBN,GAAvB,GACMO,EAA2BP,GAAjC,GACMQ,EAA6BR,GAAnC,GAEM,EAA0B9W,mBAA1B,GAACgR,EAAQ,EAAT,GAAWuG,EAAW,EAAtB,GAEA,EAA8BvX,mBAA9B,GAACwX,EAAU,EAAX,GAAaC,EAAa,EAA1B,GAEAC,EAAevN,uBACpB,cACC,IAAMwN,EAAW3G,EAAjB,GACAuG,EACC1E,IAAO7B,EAAU,CAChB4G,QAAS,CACR,CAACC,EADO,GAER,CAACC,EAAe,EAFR,SAOZ,CAZD,IAeMC,EAAiB5N,uBACtB,cACC,IAAMwN,EAAWH,EAAjB,GACAC,EACC5E,IAAO2E,EAAY,CAClBI,QAAS,CACR,CAACC,EADO,GAER,CAACC,EAAe,EAFR,SAOZ,CAZD,IA0BM0hE,EAAkB,WACnBpiE,IAAJ,IACCG,KACAE,QAuBI+sD,EAAe,WACpB,IAAMhsD,EAAmBxH,EAAA,KAAa,YAAU,OAAAlK,EAAA,QAC1C2R,EAAqBjB,EAAA,KAAe,YAAU,OAAA1Q,EAAA,QAEpD2pD,EADqB,CAAEz/C,SAAF,EAA8BwG,WAAYiB,KAIxD1J,EAA6EyH,GAA7EzH,QAAS0H,EAAoED,GAA7E,YAAsBE,EAAuDF,GAA7E,WAAkCG,EAA2CH,GAA7E,cAAiDI,EAA4BJ,GAA7E,aAA+DK,EAAcL,GAA7E,UAER,OACC/hB,YAACk7D,KACA7gD,KAAK,SACLgiD,QAjBkB,WACnB0oB,IACAhV,KAgBCx1D,MAAOA,EACPmxB,QAAM,EACN79B,WAAS,EACTm3E,mBAAiB,EACjBC,sBAAoB,EACpBC,cAAY,EACZC,WAAS,EACTrlF,IAAKwa,GAELta,mBAAKF,IAAKkiB,GACThiB,YAACwmB,KAAKC,UAAWC,IAAUi0C,IAAK76D,IAAKmiB,GACpCjiB,kBAAIF,IAAKsiB,GACRpiB,sCAEDA,YAACyjB,KAAYC,QAASC,KACrB3jB,YAAC4jB,IAAmB9Q,MAAOiQ,EAAYlD,cAAeyD,EAAgBxD,eAjEtD,SAAC+D,GACrBf,GAAY,YAAc,mBAAIvG,GAAJ,OAC1ByG,EAAcD,EAAA,QAAkB,YAAU,OAAA1Q,IAAA,WAkExCrS,YAACwmB,KAAKC,UAAWC,IAAUi0C,IAAK76D,IAAKoiB,GACpCliB,YAACmN,KAAOlB,QAAS8jE,EAAcjwE,IAAKqiB,GACnCniB,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,aAE1Bra,YAACmN,KAAOlB,QA7CQ,WACnB6W,KACAE,MA2CiCljB,IAAKqiB,GAClCniB,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,WAE1Bra,YAACmN,KAAOlB,QAAS84E,EAAiBjlF,IAAKqiB,GACtCniB,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,0BAE1Bra,YAACmN,KAAOlB,QAzDc,WACrBsQ,UAAJ,IACAuG,EAAYH,UAAZG,IACAE,EAAcL,QAAdK,MAsDuCljB,IAAKqiB,GACxCniB,YAACuhB,IAAKG,SAAU,GAAIrH,KAAK,0BAG3Bra,YAACwmB,KAAKC,UAAWC,IAAUi0C,IAAK76D,IAAKmiB,GACpCjiB,kBAAIF,IAAKsiB,GACRpiB,oCAEDA,YAACyjB,KAAYC,QAASC,KACrB3jB,YAAC4jB,IACA9Q,MAAOyJ,EACPsD,cAAeoD,EACfnD,eArFiB,SAAC+D,GACnBtH,UAAJ,IACAyG,GAAc,YAAc,mBAAIzG,GAAJ,OAC5BuG,EAAYvG,EAAA,QAAgB,YAAU,OAAAlK,IAAA,cA2FxCyyE,aAA6B,CAI5B9oB,WAAYz7D,IAJgB,KAQ5BuS,MAAOvS,IARqB,MAa5BmiB,gBAAiBniB,IAbW,MAiB5Bga,MAAOha,IAAUyzE,QC3KX,IAAMoR,GAAc,SAAC,G,IAAE/rF,iBAAK,IAAG,OAAIgjE,EAAO,UAAE9hD,EAAK,QAAEgC,EAAQ,WAAE7hB,wBAAY,IAAG,MAC5E,EAAsB6Q,oBAAtB,GAACmgC,EAAM,EAAP,GAASuxC,EAAS,EAAlB,GAON,OACCj9E,YAAC8a,IAAMC,cACN/a,YAACmN,K,UAAe,oBAAoBrN,IAAKulF,GAAqBjyE,SAAO,EAACnH,QAAS,WAAM,OAAAgxE,GAAA,KACpFj9E,YAACuhB,IAAKlH,KAAK,W,sBAEXqxB,GACA1rC,YAACslF,IACA/qE,MAAOA,EACPyhD,WAAY,YAAsB,OAblB,SAACupB,GACpBtI,MACA5gB,KAWqCmpB,CAAA,IAClC1yE,MAAOA,EACP4P,gBAAiBnG,EACjBoI,aAAcA,MAOnBygE,aAAwB,CAIvBtyE,MAAOvS,IAJgB,MASvBgc,SAAUhc,IATa,MAavB87D,QAAS97D,IAbc,KAiBvBga,MAAOha,IAjBgB,OAmBvBokB,aAAcpkB,IAAU8gD,QAGzB,IASA,GATMgkC,GAAsBvlF,YAAG,mQ,0CCPlBglC,GAAW,SAAAC,GAAU,OAAIn2B,OACjC62E,GAAG,SAAS,SAACh2E,GACZb,KAAS82E,YAAYC,kBAChB/2E,KAASwD,QAAQ2yB,EAAW6gD,YAAY,IAAKC,UAClDp2E,EAAE44C,GAAK54C,EAAElB,EACTkB,EAAE64C,GAAK74C,EAAEhB,KAEVg3E,GAAG,QAAQ,SAACh2E,GACXA,EAAE44C,GAAKz5C,KAASL,EAChBkB,EAAE64C,GAAK15C,KAASH,KAEjBg3E,GAAG,OAAO,SAACh2E,GACLb,KAASwD,QAAQ2yB,EAAW6gD,YAAY,GAC7Cn2E,EAAE44C,GAAK,KACP54C,EAAE64C,GAAK,SCnDAw9B,GAAkB,SAAC,GAA0B,IAAxB3tF,EAAuB,EAAvBA,KAAM6V,EAAiB,EAAjBA,WAC9B0N,EAAiBvjB,EAAjBujB,MAAOC,EAAUxjB,EAAVwjB,MACTP,EAASC,iBAAO,MAChB0qE,EAAe1qE,iBAAO,MACtBC,EAAeD,iBAAO,MACtBG,EAAeH,iBAAO,MAE5B,EAA4B9P,mBAAS,IAArC,mBAAO65B,EAAP,KAAeC,EAAf,KAEM/d,EAAa1Y,KAAmBA,MAEhC02B,EAAgBzoC,mBAAQ,WAC5B,IAAM2B,EAASoQ,KAAU8M,GAAO,SAAAW,GAAI,OAAIA,EAAKD,SAC7C,OAAOxN,OAAiBo3E,OAAOxnF,GAAQo1E,MAAM,CAAC,GAAI,OACjD,CAACl4D,IAEJ,EDrBgC,SAAC,GAAkC,IAAhCvjB,EAA+B,EAA/BA,KAAMitC,EAAyB,EAAzBA,OAAQp3B,EAAiB,EAAjBA,WACjD,EAAwBzC,mBAASoM,KAAKsuE,OAAtC,mBAAOj/D,EAAP,KAAaue,EAAb,KACA,EAAoCh6B,mBAAS,MAA7C,mBAAOw5B,EAAP,KAAmBS,EAAnB,KAgBA,OAdAx5B,qBAAU,WACR,IAAM+4B,EAAan2B,KACAzW,GAChBstF,GAAG,QAAQ,kBAAMlgD,EAAQ5tB,KAAKsuE,UAC9BR,GAAG,OAAO,kBAAMlgD,EAAQ5tB,KAAKsuE,UAOhC,OALA7gD,EAAOwT,SAAQ,SAAAnoC,GACbs0B,EAAWJ,MAAMl0B,EAAExU,KAAMwU,EAAEk0B,UAG7Ba,EAAcT,GACP,kBAAMA,EAAWmhD,UACvB,CAAC/tF,EAAMitC,EAAQp3B,IAEX,CAAC+2B,aAAY/d,QCGSye,CAAmB,CAAEL,SAAQjtC,KAAMujB,EAAO1N,eAA/D+2B,EAAR,EAAQA,WAAY/d,EAApB,EAAoBA,KAsMpB,OD9LqB,SAAC,GAA0D,IAAzD5L,EAAwD,EAAxDA,OAAQI,EAAgD,EAAhDA,aAAgD,IAAlCkqB,eAAkC,MAAxB,GAAwB,MAAnBygD,eAAmB,MAAT,EAAS,EAC/En6E,qBAAU,WACHoP,GAAWI,GAGhB5M,KAAUwM,EAAO0N,SACds9D,KAAKx3E,OACHy3E,YAAY,CAAC3gD,EAASygD,IACtBV,GAAG,QAAQ,WAAQ72E,KAAU4M,EAAasN,SAASw9D,KAAK,YAAa13E,KAASI,iBAElF,CAACoM,EAAQI,EAAckqB,EAASygD,ICjBnCxgD,CAAQ,CAAEvqB,SAAQI,iBAElBxP,qBAAU,WACR,IAAMo5B,EAAS,CACb,CAAEnpC,KAAM,SAAU0oC,MAAO/1B,KAAeZ,EAAWE,MAAQ,EAAGF,EAAWG,OAAS,IAClF,CAAElS,KAAM,SAAU0oC,MAAO/1B,OAAmBy0B,UAAU,MACtD,CAAEpnC,KAAM,IAAK0oC,MAAO/1B,KAAUZ,EAAWE,MAAQ,GAAGm1B,SAAS,KAC7D,CAAEpnC,KAAM,IAAK0oC,MAAO/1B,KAAUZ,EAAWG,OAAS,GAAGk1B,SAAS,IAC9D,CAAEpnC,KAAM,QAAS0oC,MAAO/1B,KAAa+M,GAAOoE,IAAG,SAAAtQ,GAAC,OAAIA,EAAEsQ,MAAIsjB,SAAS,IAAIoY,SAAS,MAGlFpW,EAAUD,KACT,CAACzpB,EAAO3N,EAAYs3B,IAEvBt5B,qBAAU,WAEU4C,KAAUm3E,EAAaj9D,SACtCy9D,UAAU,aACVpuF,KAAKujB,EAAMnE,QAAO,SAAA9H,GAAC,MAAe,aAAXA,EAAEvS,SAAsB,SAAAuS,GAAC,OAAIA,EAAEM,SACtDy2E,MAAK,SAAAroE,GACF,IAAMkQ,EAAQlQ,EAAMsoE,OAAO,KACxBC,QAAQ,YAAY,GACpBjB,GAAG,aAAa,SAASh2E,GACxBb,KAAUhX,MACPyZ,OAAO,UACPs1E,QACAhjC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,SAElB13E,KAAUhX,MACPyZ,OAAO,cACPsyC,aAAaG,SAAS,KACtB11C,MAAM,UAAW,GAEpBQ,KAAUm3E,EAAaj9D,SACpBy9D,UAAU,aACVhvE,QAAO,SAAAT,GAAC,OAAIA,EAAEiJ,KAAOtQ,EAAE42B,YACvBh1B,OAAO,UACPsyC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,YAGnBb,GAAG,YAAY,SAASh2E,GACvBb,KAAUhX,MACPyZ,OAAO,UACPsyC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,SAElB13E,KAAUhX,MAAMyZ,OAAO,cACpBsyC,aAAaG,SAAS,KACtB11C,MAAM,UAAW,GAEpBQ,KAAUm3E,EAAaj9D,SACpBy9D,UAAU,aACVhvE,QAAO,SAAAT,GAAC,OAAIA,EAAEiJ,KAAOtQ,EAAE42B,YACvBh1B,OAAO,UACPsyC,aACAG,SAAS,KACTwiC,KAAK,QAAQ,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,eAC9CN,KAAK,UAAU,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,kBAGvDv4D,EAAMo4D,OAAO,UACVH,KAAK,IAAK,GACVA,KAAK,OAAQ,SACbA,KAAK,cAAe,IACpBA,KAAK,SAAU,SAGlB,IAAMvoE,EAAYsQ,EAAMo4D,OAAO,KAC5BC,QAAQ,aAAa,GACrBJ,KAAK,YAFU,oBAGfl4E,MAAM,UAAW,GACjBA,MAAM,iBAAkB,QAG3B2P,EAAU0oE,OAAO,QACdn1E,MAAK,SAAA7B,GAAC,OAAIA,EAAEM,SACZu2E,KAAK,YAAa,IAClBA,KAAK,cAAe,UACpBA,KAAK,SAAU,QACfA,KAAK,OAAQ,QAGhBvoE,EAAU0oE,OAAO,QACdH,KAAK,KAAK,SAAS72E,GAClB,MAA0Bb,KAAUhX,KAAK08C,YAAYjjC,OAAO,QAAQgL,OAAO+rB,UAAnEl6B,EAAR,EAAQA,MAAOC,EAAf,EAAeA,OACT8P,EAAY,EAAE/P,EAAQ,EAAI,GAAIC,EAAS,EAAI,GACjD,MAAM,KAAN,OAAY8P,EAAU,GAAtB,YAA4BA,EAAU,GAAtC,0BACA/P,EAAQ,EADR,8BAEEC,EAAS,EAFX,2BAGCD,EAAQ,EAHT,oEAMCA,EAAQ,EANT,SAUJ6P,EAAU0oE,OAAO,QACdn1E,MAAK,SAAA7B,GAAC,OAAIA,EAAEM,SACZu2E,KAAK,UAAW,GAChBA,KAAK,YAAa,IAClBA,KAAK,cAAe,UACpBA,KAAK,oBAAqB,UAC1BA,KAAK,SAAU,QACfA,KAAK,OAAQ,YAGlB,SAAAloE,GAAM,OAAIA,EAAOkoE,KAAK,aAAa,SAAA72E,GAAC,0BAAiBA,EAAElB,EAAnB,YAAwBkB,EAAEhB,EAA1B,WACpC,SAAA4P,GAAI,OAAIA,EAAKwoE,YAGPT,KAAKthD,GAASC,IAGLn2B,KAAUm3E,EAAaj9D,SACvCy9D,UAAU,aACVpuF,KAAKujB,EAAMnE,QAAO,SAAA9H,GAAC,MAAe,aAAXA,EAAEvS,SAAsB,SAAAuS,GAAC,OAAIA,EAAEM,SACtDy2E,MAAK,SAAAroE,GACF,IAAMkQ,EAAQlQ,EAAMsoE,OAAO,KACxBC,QAAQ,YAAY,GACpBjB,GAAG,aAAa,SAASh2E,GACxBb,KAAUhX,MAAMyZ,OAAO,UACpBsyC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,SAElB13E,KAAUhX,MAAMyZ,OAAO,UACpBsyC,aACAG,SAAS,KACTwiC,KAAK,YAAa,IAClBA,KAAK,cAAe,UAEvB13E,KAAUm3E,EAAaj9D,SACpBy9D,UAAU,aACVhvE,QAAO,SAAA4E,GAAC,OAAIA,EAAEkqB,WAAa52B,EAAEsQ,MAC7BwmE,UAAU,UACV5iC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,YAEnBb,GAAG,YAAY,SAASh2E,GACvBb,KAAUhX,MAAMyZ,OAAO,UACpBsyC,aACAG,SAAS,KACTwiC,KAAK,QAAQ,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,eAC9CN,KAAK,UAAU,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,eAEnDh4E,KAAUm3E,EAAaj9D,SACpBy9D,UAAU,aACVhvE,QAAO,SAAA4E,GAAC,OAAIA,EAAEkqB,WAAa52B,EAAEsQ,MAC7BwmE,UAAU,UACV5iC,aACAG,SAAS,KACTwiC,KAAK,OAAQ,SACbA,KAAK,SAAU,SAElB13E,KAAUhX,MAAMyZ,OAAO,UACpBsyC,aACAG,SAAS,KACTwiC,KAAK,YAAa,IAClBA,KAAK,cAAe,UACpBA,KAAK,OAAQ,YAGpBj4D,EAAMo4D,OAAO,UACVC,QAAQ,SAAS,GACjBJ,KAAK,KAAK,SAAA72E,GAAC,OAAI61B,EAAc71B,EAAE2M,UAC/BkqE,KAAK,QAAQ,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,eAC9CN,KAAK,cAAe,IACpBA,KAAK,UAAU,SAAA72E,GAAC,OAAI6X,EAAW7X,EAAE22B,WAAa32B,EAAEm3E,eAEnDv4D,EAAMo4D,OAAO,QACVC,QAAQ,SAAS,GACjBp1E,MAAK,SAAA7B,GAAC,OAAIA,EAAEM,SACZu2E,KAAK,KAAK,SAAA72E,GAAC,OAAI61B,EAAc71B,EAAE2M,OAAS,KACxCkqE,KAAK,OAAQ,SACbA,KAAK,YAAa,MAClBA,KAAK,cAAe,UACpBA,KAAK,oBAAqB,cAE/B,SAAAloE,GAAM,OAAIA,EAAOkoE,KAAK,aAAa,SAAA72E,GAAC,0BAAiBA,EAAElB,EAAnB,YAAwBkB,EAAEhB,EAA1B,WACpC,SAAA4P,GAAI,OAAIA,EAAKwoE,YAGNT,KAAKthD,GAASC,MAExB,CAACghD,EAAczqE,EAAcnjB,EAAM6uB,EAAM+d,EAAYrpB,EAAO4L,EAAYge,IAGzE,yBAAKp3B,MAAOF,EAAWE,MAAOC,OAAQH,EAAWG,OAAQmQ,IAAKlD,EAAQhN,MAAO,CAC3EC,WAAY,4FAEZ,uBAAGiQ,IAAK9C,GACN,uBAAG8C,IAAKynE,IACR,uBAAGznE,IAAKhD,OCzNT,ICdDrH,GAAQ,CAAC+G,IAAgBhe,aAElBI,GAAS,CACpB2R,IAAK,aACLgB,MAAO,aACPsK,KAAM,QACNC,QCIK,YAAkF,EAAjDpE,oBAAiD,EAA5B9d,QAA6B,IAAD,EAAnB4V,EAAmB,EAAnBA,WAAY7V,EAAO,EAAPA,KAChF,EAA0CoT,mBAAS,CAACmQ,MAAO,GAAIC,MAAO,KAAtE,mBAAOnB,EAAP,KAAsB4J,EAAtB,KA+BA,OA7BApY,qBAAU,WAAO,IAAD,EACR0P,EAAQ,GACRC,EAAQ,GAGe,KAArB,OAAJxjB,QAAI,IAAJA,GAAA,UAAAA,EAAM4C,cAAN,eAAc6mC,SAChBxd,EAAiB,CAAC1I,MAAO,GAAIC,MAAO,KAIjCxjB,IAAQ,OAACA,QAAD,IAACA,OAAD,EAACA,EAAM4C,UAIpB5C,EAAK4C,OAAO69C,SAAQ,WAAgC/pC,GAAO,IAArCvO,EAAoC,EAApCA,KAAMsN,EAA8B,EAA9BA,MAAO7S,EAAuB,EAAvBA,OAAQ+rF,EAAe,EAAfA,OACnC3gD,EAAS,CAACp2B,MAAOnC,EAAO1Q,KAAM,WAAYkpC,WAAYv3B,EAAGkR,GAAIlR,EAAG+3E,WAAYzuF,EAAK4C,OAAO6mC,OAAQxlB,MAAO9b,EAAMwmF,UACnHprE,EAAMqrE,KAAK5gD,GAGXprC,EAAO69C,SAAQ,YAAmC,EAAjCt4C,KAAkC,IAA5BsN,EAA2B,EAA3BA,MACfqC,GAD0C,EAApBlV,OAAoB,EAAZ+rF,OACtB,CAAC/2E,MAAOnC,EAAO1Q,KAAM,WAAYkf,MAAO,EAAGgqB,WAAYv3B,EAAG+3E,WAAYzuF,EAAK4C,OAAO6mC,OAAQyE,SAAUx3B,IAClH6M,EAAMqrE,KAAK92E,GACX0L,EAAMorE,KAAK,CAAC3nE,OAAQ+mB,EAAQ9mB,OAAQpP,UAIxCmU,EAAiB,CAAC1I,QAAOC,aACxB,CAACxjB,KAGY,OAAbqiB,QAAa,IAAbA,GAAA,UAAAA,EAAekB,aAAf,eAAsBkmB,QAAS,EAC5B,kBAAC,GAAD,CAAiBzpC,KAAMqiB,EAAexM,WAAYA,IAClD,kBAAC,IAAD,CAAeuM,MAAO,oBACPF,KAAM,eACNK,YAAa,qFDxClCE,SAAU3gB,GACV4gB,MDMkC,SAAC,GAIM,EAHJjF,UAGI,EAFJK,cAEI,EADJC,oBAErC,OACE,YAAC,IAAM6E,SAAP,OCXF9G,MAAOA,GACPgH,qBAAsB,WACpB,MAAO,CACLjhB,QAAS,CACPxB,aAAc,CACZ,WACA,SAEFC,WAAY,CACVysB,UAAW,QAKnB1V,QAAS,SAACwE,GACR,OAAOD,GAAiBC,EAAwBC,IAAO2tB,QAAU,IErB9D,SAASolD,KAEf3zB,GAAY,WAAiB,aAC7BC,GAAQD,GAAa4zB,YAAc7pF,GAEnC,I9HmH+BmB,E8HnHzB2oF,EAAgB,CACrB7zB,GAAa8zB,UACb9zB,GAAa+zB,mBACb/zB,GAAag0B,gBACbh0B,GAAai0B,YACbj0B,GAAak0B,MACbl0B,GAAam0B,kBACbn0B,GAAao0B,SACbp0B,GAAaq0B,cACbr0B,GAAas0B,WACbt0B,GAAau0B,SACbv0B,GAAaw0B,YAIR/G,EAAc,CAEnBztB,GAAa8zB,UACb9zB,GAAa+zB,oBAUd,MAAO,CACNxtE,YAAa,CACZ/D,S9HqF6BtX,E8H5F9B2oF,E9H6FM,G8H5FN/wE,GACA2qE,G9H2FM,QAAyC,YAC/C,OAAOviF,UAAauX,EAAbvX,MAAP,M8HvFkB08B,QAChB,SAACxgB,EAAK82B,GAAN,oBAAC,gBACG92B,GADJ,mBAEE82B,EAAIxiC,IAAMwiC,MAEZ,M,qIC/CyBzxC,YAAH,2EAIGA,YAAH,wEAIFA,YAAH,kEAIIA,YAAH,yGAgBIA,YAAH,qHAOMA,YAAH,oGAMaA,YAAH,wE,QCjBvBgoF,GAAa,WACzB,IAAM1qF,EAAS6c,qBAAWsqE,IAS1B,OACC,YAACwD,GAAD,CAAc9nF,UAAWsN,IAAQy6E,KAAMC,UAAW7qF,EAAO6qF,WACxD,YAAC,IAAD,KACC,YAAC,IAAD,CACCnoF,IAAKA,YAAF,uGAKH,YAAC,IAAD,CAAMua,KAAM,mBAAKhO,IAAI,OAAOF,IAAK+7E,KAAM/5E,OAAQ,OAC/C,YAAC,IAAD,CACCrO,IAAKA,YAAF,0EAIH,aAvBW,SAAC,GAAkB,IAAhBymB,EAAe,EAAfA,SAElB,OADkB4hE,yBAAc,CAAE/mD,SAAU,OACzB7a,EAAW,OAqB1B,uFACA,aApBa,SAAC,GAAkB,IAAhBA,EAAe,EAAfA,SAEpB,OADiB4hE,yBAAc,CAAE/mD,SAAU,IAAKwtB,SAAU,OACxCroC,EAAW,OAkBzB,oBAIH,YAAC,IAAD,CAAa6hE,MAAOC,KAAUC,OAC7B,YAAC,IAAD,CAAStiE,QAAS,0BAAQ,8VACzB,YAAC,IAAD,CAAM3L,KAAK,YAAYqH,SAAUH,IAAKgnE,cAEvC,YAAC,IAAOjmB,QAAR,MACA,YAAC,IAAD,CAASt8C,QAAS,uBACjB,YAAC,IAAD,CAAM3L,KAAM,mBAAKhO,IAAI,WAAWF,IAAKq8E,aAOpCT,GAAeU,aAAOC,IAAPD,CAAH,qKACf,mBDjD6B,SAACR,GAAD,OAAenoF,YAAd,KAAD,yOACHmoF,GCgDPU,CAAnB,EAAGV,c,UCpDOW,IAVMh6E,OAEjBo3E,OAAO,CAAC,EAAG,GAAK,IAChBpS,MAAM,CAAC,MAAO,SAAU,UAOE,WAC3B,IAEM13B,EAAMxmC,uBAAY,YAAyB,IAAtBrD,EAAqB,EAArBA,KAAM8I,EAAe,EAAfA,SACxB9P,EAAwCgH,EAAxChH,MAAOw9E,EAAiCx2E,EAAjCw2E,UAAWC,EAAsBz2E,EAAtBy2E,QAASC,EAAa12E,EAAb02E,SAEnC,OACC,YAAC,IAAMhuE,SAAP,KACC,mBAAKjb,IAAK2M,GAAY8N,MAAOlP,GAC5B,YAAC,GAAD,CAAyBiG,KAAM8mE,GAAU/sE,EAAO,KAAM6oE,cAAe,cAEtE,mBAAKp0E,IAAKkpF,IACT,YAAC,GAAD,CAAyB13E,KAAM8mE,GAAU2Q,EAAU,QAEpD,mBAAKjpF,IAAKmpF,GAAchpF,UAAW,iCAClC,mBAAKH,IAAKopF,IACT,oBACCppF,IAAKA,YAAF,mFAIFohD,GAAW2nC,IAEb,oBAAM/oF,IAAKqpF,IAAUL,IAEtB,oBAAM16E,MAAO,CAAE0nC,KAAM,OACrB,YAAC,IAAD,CACC1iC,SAAO,EACPg9D,OAAK,EACLjwE,OAAQC,IAAOC,QACfgT,UAAW,cACX/B,KAAM,UACNrF,QAASkP,QAKX,IAEGghC,EAAWzmC,uBAAY,YAAe,IAAD,EAC1C,YAD0C,EAAXrD,KACK2iE,sBAApC,QAAsD,GAA9C6T,EAAR,EAAQA,UAAWC,EAAnB,EAAmBA,QACbI,EAAYhoC,GAAW2nC,GAC7B,OACC,YAAC,IAAM9tE,SAAP,kBACYmuE,EADZ,OAC2BJ,KAG1B,IAEH,OACC,YAAC,IAAM/tE,SAAP,KACC,YAAC,GAAD,CACCviB,aAnDgB,CAAC,QAAS,YAAa,UAAW,OAAQ,YAoD1D8qF,iBAAkB,YAClBb,eAAgB,OAChBwB,QAAS,eACTtH,YAAazgC,EACbi6B,aAAc,OACd9kE,QAAM,IAEP,YAAC,GAAD,CACC6kE,cAAe,QACfC,aAAc,OACdS,iBAAkBz6B,EAClB24B,eAAgB,CACf,eACA,aACA,YACA,kBACA,UACA,UACA,uBACA,UACA,OACA,MACA,OACA,WACA,WAMDK,iBAAe,OAMb/E,GAAQtwE,YAAH,iDAILopF,GAAYppF,YAAH,oGAMTqpF,GAAUrpF,YAAH,+IAQP2M,GAAa3M,YAAH,kVACbswE,IAgBG4Y,GAAYlpF,YAAH,kFACZswE,IAKG6Y,GAAenpF,YAAH,+EACfswE,IC1IUgZ,GAAmB,WAC9B,IAAMvI,EAAU5mE,qBAAWovE,IACrBC,EAAMjuE,iBAAO,CAACg4C,GAAa4zB,aAEjC,OACE,kBAACtF,GAAD,CAAmBd,QAASA,EACTloF,QAAS,aACTipF,cAAe,kBAAC,GAAD,MACfZ,gBAAiBsI,EAAIxgE,W,qBCD/BugE,GAAe5xF,yBAAc,GAEpC8xF,GAAO,kBAAM,YAAC,IAAD,CAAelvE,KAAM,WAAYE,MAAO,mBAEpD,SAASivE,KACf,OACC,YAAChF,GAAD,MAAgB,gBAAGpnF,EAAH,EAAGA,OAAH,OAAgB,YAACqsF,GAAD,CAAKrsF,OAAQA,OAI/C,SAASqsF,GAAT,GAA0B,IAAXrsF,EAAU,EAAVA,OACd,EjBnBoC,W,IAAC,sDACrC,IAAMssF,EAAWC,iBAAjB,GASA,OANA39E,qBAAU,WACL09E,EAAJ,SACCpjC,OAEC,CAACojC,EAJJ19E,UAMA,EiBSyC49E,CACxCxsF,EAAOysF,SACPzsF,EAAOvC,KACP,CAAEivF,YAAa1sF,EAAO0sF,cAHfjJ,EAAR,EAAQA,QAASv1E,EAAjB,EAAiBA,aAAcjT,EAA/B,EAA+BA,MAU/B,E,SxGnCmCgd,QAAA,IAAAA,MAAA,IACnC,IAAM6zB,EAAOxzB,uBACZ,YAUC,GATIL,GAAWA,EAAf,cACKA,cAAJ,aACC00E,yBAAuC10E,cAAvC00E,YAGG10E,cAAJ,UACC00E,sBAAoC10E,cAApC00E,UAGE10E,GAAWA,EAAf,SAAiC,CAChC,IAA2B,UAAAhY,OAAA,QAAegY,EAA1C,UAA2B,IAA3B,OAA2B,IAAkC,CAAlD,WAACtG,EAAG,EAAJ,GAAMnB,EAAK,EAAX,GACNvQ,YAAY0sF,EAAZ1sF,mBAAJ,GACC0sF,gBAEA5rF,aACC,iCAAmC4Q,EADpC5Q,sGAKF4rF,WAAyB10E,EAAzB00E,SAED,WAED,CAzBD,IA4BM,EAAoBxyD,qBAAW,GAAD,GAA9B,GACN,MAAO,CADK,EAAN,GAAgB,EAAhB,IwGMoByyD,CAHLhD,MAGrB,mBAAOhyD,EAAP,KAAc9a,EAAd,KAGMgkE,EAAerhF,mBAAQ,WAC5B,MAAO,CAAEm4B,QAAO9a,cACd,CAAC8a,EAAO9a,IAKX,OCxCD,SAAyC+vE,GAAzC,gBAAyC,IAAAA,MAAA,IAGxCj+E,qBAAU,WACT,IAAMk+E,EAAQC,aAAY,WACrBp5E,SAAJ,Q,oGAME,O,sBAAA,GAAM05D,YAAI2f,IAAV,U,8DAGAH,KAVH,KAWA,OAAO,WACNI,oBAEC,CAfHr+E,IAkBAA,qBAAU,WACT,IAAMs+E,EAAU,W,oGAGb,O,sBAAA,GAAM7f,YAAI2f,IAAV,U,6DAKH,OADAt7D,mCACO,WACNA,yCAEC,CAZH9iB,IDiBAu+E,GAGC,YAAClB,GAAa3xD,SAAd,CAAuB9pB,MAAOizE,GAC7B,YAACrpF,GAAckgC,SAAf,CAAwB9pB,MAAOswE,GAC9B,YAAC,IAAD,CACC/qC,OAAQrzC,YAAF,ogBAqBP,YAAC,IAAD,CAAe0qF,SAAUptF,EAAO6qF,WAAa,KAC1CpH,GACD,mBAAK/gF,IAAK+X,IACT,YAAC,GAAD,MACA,YAAC,IAAD,KACC,YAAC,IAAD,CAAO4yE,OAAK,EAAC5vF,KAAK,KACjB,YAAC,IAAD,CAAU6vF,GAAG,eAEd,YAAC,IAAD,CAAOD,OAAK,EAAC5vF,KAAK,YAAYkkF,UAAWqK,KACzC,YAAC,IAAD,CAAOrK,UAAWwK,QAIlB1I,GACF,mBAAKzyE,MAAO,CAAE+nC,QAAS,IAAKw0C,UAAW,SAAUz8E,MAAO,SACvD,8CAIA9Q,EAAO0sF,aACR,YAAC,GAAD,CACCvvE,MAAOlP,GACPhT,MAAOA,EACPuyF,gBAAiB/J,EACjBv1E,aAAcA,EACdyB,WAAY3P,EAAO0sF,YACnB19E,YAAa87E,KACb57E,iBAAkBu+E,QASzB,IAAMx/E,GAAQ,WACb,MAAO,IAGFwM,GAAS/X,YAAH,yFAKN+qF,GAAY/qF,YAAH,gH,iBE/GfgrF,KAAkBC,sBAElBC,IAASC,OAAO,kBAACzB,GAAD,MAASz4E,SAASm6E,eAAe,W","file":"static/js/main.6d7028b3.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/virus-pixabay.1f81013a.png\";","module.exports = __webpack_public_path__ + \"static/media/Serberus.ff2d7734.svg\";","module.exports = __webpack_public_path__ + \"static/media/corona-virus-pixabay-bw.4401f63b.png\";","import { createContext } from 'react';\n\nexport const SlykitContext = createContext(null);\n","import { createContext } from 'react';\n\nexport const WorkspaceContext = createContext(null);\n","import { createContext } from 'react';\n\n/* This is the Types for tsx file. For some reason when this file is .tsx things don't compile. 🤷‍. For a latter date.\ntype ColorScalesContextType = {\n\tgetColor: (defaultColors: Array) => (appSpecificColors: Array) => (value: string) => string\n}\nexport const ColorScalesContext = createContext(null);*/\n\nexport const ColorScalesContext = createContext(null);\n","import { Result } from 'srs-middleware';\n\nexport class EmptyResultError {\n\t/**\n\t *\n\t */\n\n\tmessage: string;\n\tname: string;\n\n\tconstructor() {\n\t\t//super('No data available in result object');\n\t\tthis.message = 'No data available in result object';\n\t\tthis.name = 'EmptyResultError';\n\t}\n}\n\n/**\n * Wraps an endpoint function so that an EmptyResultError will\n * be thrown if the function is called on an empty result.\n * Without this decorator, endpoints throw Internal Server Errors\n * when called with empty results, which isn't as informative and\n * thus can't be dealt with as easily.\n * @note When serberus 2.0 comes out this functionality\n * should me moved to srs-middleware\n * @param originalFunction the function to wrap\n * @returns a function that checks to make sure the passed result\n * is not empty before handing if off to originalFunction.\n * If it is empty, an EmptyResultError will be thrown\n */\nexport function throwEmptyResult(originalFunction): typeof originalFunction {\n\treturn function (result: Result): Promise {\n\t\tif (result?.resultId === 0) {\n\t\t\t// If result is empty\n\t\t\tthrow new EmptyResultError();\n\t\t}\n\t\tconst newResult = originalFunction.apply(this, arguments);\n\t\tif (newResult.resultID === 0) {\n\t\t\t// if the newResult is empty\n\t\t\tthrow new EmptyResultError();\n\t\t}\n\t\treturn newResult;\n\t};\n}\n\n/**\n *\n * @param originalFunction\n * @returns the same function but when result.resultId is 0 it will\n * return {data:null,loading:false,error:EmptyResultError}.\n */\nexport function returnEmptyResultError(originalFunction): typeof originalFunction {\n\treturn function (result: Result) {\n\t\t// Call the function no matter what so that React hooks don't break\n\t\tconst originalReturn = originalFunction.apply(this, arguments);\n\t\tif (result?.resultId === 0) {\n\t\t\t// If result is empty\n\t\t\treturn {\n\t\t\t\tdata: null,\n\t\t\t\tloading: false,\n\t\t\t\terror: new EmptyResultError(),\n\t\t\t};\n\t\t}\n\t\treturn originalReturn;\n\t};\n}\n","import {\n\tbuildHistogramTimeline,\n\tgenerateFacets,\n\tgenerateGeoJson,\n\tgenerateGraph,\n\tgenerateHierarchicalFacets,\n\tgenerateParallelCoordinates,\n\tgeneratePropertyHierarchy,\n\tgenerateTextClusters,\n\tHistogramEndpointMajorBin,\n\tHistogramEndpointMinorBin,\n\tHistogramEndpointResponse,\n\tpost,\n\tResult,\n\tselectPropertyListFromDilByNames,\n\tvalues as listValues,\n\tfilter as originalFilter,\n\tDILProperty, get, put,\n} from 'srs-middleware';\n\nimport { EndpointRequest } from 'interfaces';\n\nimport { throwEmptyResult } from './endpointDecorators';\n\n/**\n * @param result\n * @param dilName\n * @param options\n * @returns {Promise}\n */\nexport const timeline: EndpointRequest = throwEmptyResult(\n\t(result: Result, dilName: string, { propertyList, parameters }): Promise =>\n\t\tbuildHistogramTimeline(result, selectPropertyListFromDilByNames(dilName, propertyList), parameters)\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const facets: EndpointRequest = throwEmptyResult((result, dil, { propertyList, parameters }, ignoreParentResult = false) =>\n\t{\n\t\tconst {parentId, ...resultWithoutParent} = result; //remove parentId from facets calls\n\t\treturn generateFacets(ignoreParentResult ? resultWithoutParent : result, selectPropertyListFromDilByNames(dil, propertyList), parameters, dil)\n\t}\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const paraCord: EndpointRequest = throwEmptyResult((result, dil, { propertyList, parameters }) =>\n\tgenerateParallelCoordinates(result, selectPropertyListFromDilByNames(dil, propertyList), parameters)\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const textClusters: EndpointRequest = throwEmptyResult((result, dil, { propertyList, parameters }) =>\n\tgenerateTextClusters(result, selectPropertyListFromDilByNames(dil, propertyList), { maxClusters: 15, ...parameters })\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const graph: EndpointRequest = throwEmptyResult(\n\t(result, dil, { propertyList, parameters: { metadata, ...otherParams } }) => {\n\t\tconst fullMetadata = selectPropertyListFromDilByNames(dil, metadata || []);\n\t\treturn generateGraph(result, selectPropertyListFromDilByNames(dil, propertyList), {\n\t\t\tmetadata: fullMetadata,\n\t\t\t...otherParams,\n\t\t});\n\t}\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const nodeGraph: EndpointRequest = throwEmptyResult(\n\t(result, dil, { propertyList, parameters: { metadata, ...otherParams } }) => {\n\t\tconst fullMetadata = selectPropertyListFromDilByNames(dil, metadata || []);\n\t\treturn generateNodeGraph(result, selectPropertyListFromDilByNames(dil, propertyList), {\n\t\t\tmetadata: fullMetadata,\n\t\t\t...otherParams,\n\t\t});\n\t}\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const clusterGraph: EndpointRequest = throwEmptyResult(\n\t(result, dil, { propertyList, parameters: { metadata, ...otherParams } }) => {\n\t\tconst fullMetadata = selectPropertyListFromDilByNames(dil, metadata || []);\n\t\treturn generateClusterGraph(result, selectPropertyListFromDilByNames(dil, propertyList), {\n\t\t\tmetadata: fullMetadata,\n\t\t\t...otherParams,\n\t\t});\n\t}\n);\n\nexport const geopoints = throwEmptyResult(\n\t(\n\t\tresult: Result,\n\t\tdilName: string,\n\t\toptions: {\n\t\t\tpropertyList: string[];\n\t\t\tparameters: GeoJsonParams;\n\t\t}\n\t) => {\n\t\treturn generateGeoJson(result, dilName, options.propertyList, options.parameters);\n\t}\n);\n\n///todo - pull from middleware\ninterface GeoJsonParams {\n\tmetadataPropertyNames?: string[];\n\tincludeDocumentIds?: boolean;\n\tenableCaching?: boolean;\n}\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const propertyHierarchy: EndpointRequest = throwEmptyResult(\n\t(\n\t\tresult,\n\t\tdil,\n\t\t{ propertyList, parameters: { maxRoot, metadata, aggregationProperty, distinctProperty, ...otherParams } }\n\t) => {\n\t\tconst filteredProperties = propertyList.filter((x) => !!x);\n\t\tconst fullMetadata = selectPropertyListFromDilByNames(dil, metadata || []);\n\n\t\treturn generatePropertyHierarchy(result, handlePropertySelection(dil, filteredProperties), {\n\t\t\t...otherParams,\n\t\t\tmaxRoot: maxRoot,\n\t\t\tmetadata: fullMetadata,\n\t\t\taggregationProperty: aggregationProperty\n\t\t\t\t? selectPropertyListFromDilByNames(dil, [aggregationProperty])?.[0]\n\t\t\t\t: null,\n\t\t\tdistinctProperty: distinctProperty ? selectPropertyListFromDilByNames(dil, [distinctProperty])?.[0] : null,\n\t\t});\n\t}\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const matrix: EndpointRequest = throwEmptyResult(\n\t(result, dil, { propertyList, parameters: { aggregationProperty, ...otherParams } }) => {\n\t\t//return generateMatrix(result, selectPropertyListFromDilByNames(dil, propertyList), parameters);\n\t\treturn generateMatrix(result, selectPropertyListFromDilByNames(dil, propertyList), {\n\t\t\t...otherParams,\n\t\t\taggregationProperty: aggregationProperty\n\t\t\t\t? selectPropertyListFromDilByNames(dil, [aggregationProperty])?.[0]\n\t\t\t\t: null,\n\t\t});\n\t}\n);\n\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const hierarchicalFacets: EndpointRequest = throwEmptyResult((result, dil, { propertyList, parameters }) =>\n\tgenerateHierarchicalFacets(result, dil, propertyList, parameters)\n);\n\n// TODO: update path to use generatePathHierarchy once the middleware has been updated to use MaxChildren\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @param parameters\n * @returns {Promise}\n */\nexport const path: EndpointRequest = throwEmptyResult((result, dil, { propertyList, parameters }) =>\n\tpost(`/SRS/Analytics/Categorical/${result.resultId}/PathHierarchy`, {\n\t\tproperty: selectPropertyListFromDilByNames(dil, propertyList)[0],\n\t\tparameters: {\n\t\t\t...parameters,\n\t\t},\n\t})\n);\n\n// TODO: Why is this so different looking\n/**\n * @param result\n * @param dil\n * @param propertyList\n * @returns {Promise}\n */\nexport const values: EndpointRequest = throwEmptyResult((\n\tresult,\n\tdil,\n\t{ columns, parameters: { MaxValues = null, sortProperty = \"\", ...otherParams } = {} }\n) => {\n\tconst startEndProps =\n\t\tMaxValues != null\n\t\t\t? {\n\t\t\t\t\tstartIndex: 0,\n\t\t\t\t\tendIndex: MaxValues - 1,\n\t\t\t }\n\t\t\t: {};\n\tconst fullSortProperty = selectPropertyListFromDilByNames(dil, [sortProperty])?.[0];\n\treturn listValues(result, selectPropertyListFromDilByNames(dil, columns), {\n\t\t...startEndProps,\n\t\tsortProperty: fullSortProperty,\n\t\t...otherParams,\n\t});\n});\n\n// TODO: Not sure of the use case for supporting multiple of the same property type,\n// if so we should support directly in the to the middleware call with a boolean flag or something\nconst handlePropertySelection = (dil, properties) => {\n\t// Allows for multiple of the same property to be returned from selectPropertyListFromDilByNames\n\tconst duplicateProperties = [];\n\tfor (let index = 0; index < properties.length; index++) {\n\t\tconst element = properties[index];\n\t\tif (properties.indexOf(element) !== properties.lastIndexOf(element)) {\n\t\t\tduplicateProperties.push(properties.pop(index));\n\t\t}\n\t}\n\treturn selectPropertyListFromDilByNames(dil, properties).concat(\n\t\tselectPropertyListFromDilByNames(dil, duplicateProperties)\n\t);\n};\n\n/* EDITED SRS-MIDDLEWARE ENDPOINTS */\n/**\n * When serberus 2.0 comes out, this functionality should\n * be moved up-stream to srs-middleware.\n *\n * The purpose of these edited endpoints are to catch endpoint requests\n * made with empty results. This makes handling this error case much easier\n */\nexport const filter = throwEmptyResult(originalFilter);\n\n/* NEW SRS-MIDDLEWARE ENDPOINTS */\n\n// These all look the same so I'm abstracting it for my new endpoints.\n// Once I figure out if I'd be stepping on any feet I may change the old\n// endpoints to use this as well.\ntype PathFunc = (resultId:number)=>string\n/**\n * A function for making a new endpoint function\n * @param pathFunc A function that will create the correct post path from a\n * result id.\n * @param singleProperty Whether or not to only use the first property in the\n * properties object.\n * @returns an endpoint function\n */\nconst makeEndpoint = (pathFunc:PathFunc,singleProperty:boolean=false):\n\t\t((result:Result | number,properties:DILProperty[],parameters:{})=>Promise) => {\n\treturn throwEmptyResult(async (result, properties, parameters = {}) => {\n\t\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\t\t\n\t\tconst postPropertyData = properties.length===0 ? {} :\n\t\t\tsingleProperty ? \n\t\t\t\t{property: properties.map(\n\t\t\t\t\t({ systemDefinitionId, name }) => \n\t\t\t\t\t\t({ systemDefinitionId, name }))[0]} \n\t\t\t\t:\n\t\t\t\t{propertyList: properties.map(\n\t\t\t\t\t({ systemDefinitionId, name }) => \n\t\t\t\t\t\t({ systemDefinitionId, name }))}\n\n\t\tconst postData = {...postPropertyData,parameters}\n\n\t\treturn post(pathFunc(resultId), postData);\n\t});\n}\n\nconst makeEndpointWithDil= (pathFunc:PathFunc,singleProperty:boolean=false):\n\t\t((result:Result | number, dilName:string, { propertyList, parameters })=>Promise) => {\n\t\t\t\n\tconst endPointFunc = makeEndpoint(pathFunc,singleProperty)\n\treturn (result, dilName, { propertyList, parameters }) => {\n\t\tconst properties = selectPropertyListFromDilByNames(dilName, propertyList);\n\t\treturn endPointFunc(result,properties,parameters)\n\t}\n}\n\n// If you need to create a new endpoint, add it here, document the need to move in a Jira ticket and then it will be moved to middleware in another PR\n// TODO: MOVE TO SRS-MIDDLEWARE\nconst generateMatrix = throwEmptyResult(async (result, properties, parameters = {}) => {\n\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\n\treturn post(`/SRS/Analytics/Categorical/${resultId}/Matrix`, {\n\t\tpropertyList: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name })),\n\t\tparameters,\n\t});\n});\n\nconst generateNodeGraph = throwEmptyResult(async (result, properties, parameters = {}) => {\n\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\n\treturn post(`/SRS/Analytics/Categorical/${resultId}/NodeGraph`, {\n\t\tpropertyList: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name })),\n\t\tparameters,\n\t});\n});\n\n//TODO: move to srs middleware\nexport const choropleth = throwEmptyResult(\n\tasync (\n\t\tresult: Result,\n\t\tdilName: string,\n\t\toptions: {\n\t\t\tpropertyList: string[];\n\t\t\tparameters: GeoJsonParams;\n\t\t}\n\t) => {\n\t\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\t\treturn post(`/SRS/Analytics/Geospatial/${resultId}/Choropleth`, {\n\t\t\tpropertyList: handlePropertySelection(dilName, options?.parameters?.metadataPropertyNames ?? []),\n\t\t\tparameters: options?.parameters ?? {\n\t\t\t\tenableCaching: false,\n\t\t\t},\n\t\t});\n\t}\n);\n\nconst generateClusterGraph = throwEmptyResult(async (result, properties, parameters = {}) => {\n\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\n\treturn post(`/SRS/Analytics/Categorical/${resultId}/ClusterGraph`, {\n\t\tpropertyList: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name })),\n\t\tparameters,\n\t});\n});\n\nexport const facetsRatio = throwEmptyResult(async (result, dil, { propertyList, parameters }) => {\n\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\tconst properties = selectPropertyListFromDilByNames(dil, propertyList);\n\treturn post(`/SRS/Analytics/Categorical/${resultId}/FacetsRatio`, {\n\t\tproperty: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name }))[0],\n\t\tparameters,\n\t});\n});\n\nexport const facetsHierarchy = throwEmptyResult(async (result, dil, { propertyList, parameters }) => {\n\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\tconst properties = selectPropertyListFromDilByNames(dil, propertyList);\n\treturn post(`/SRS/Analytics/Categorical/${resultId}/FacetsHierarchy`, {\n\t\tproperty: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name }))[0],\n\t\tparameters,\n\t});\n});\n\nexport const getCuratedViewsHighlights = throwEmptyResult(async () => {\n\treturn get(`/SRS/Application/NCATS/CuratedViews`);\n});\n\nexport const logCuratedViewVisit = throwEmptyResult(async (payload) => {\n\treturn put(`/SRS/Application/NCATS/CuratedView`, payload);\n});\n\nexport const updateCuratedViewFavStatus = throwEmptyResult(async (payload: {id: string, favorite: boolean}) => {\n\treturn put(`/SRS/Application/NCATS/CuratedView/Favorite`, payload);\n});\n\n\nexport const duration = makeEndpointWithDil(\n\t(resultId)=>`/SRS/Analytics/Temporal/${resultId}/Duration`\n)\nexport const interval = makeEndpointWithDil(\n\t(resultId)=>`/SRS/Analytics/Temporal/${resultId}/Interval`\n)\n\nexport const similarOrgs = (result,parameters) => \n\tmakeEndpoint(\n\t\t(resultId)=>`/SRS/Application/NCATS/${resultId}/OrganizationSimilarity`\n\t)(result,[],parameters) // This endpoint doesn't take properties so neither does the function\n\nexport const orgPerformance = (result,parameters) => \n\tmakeEndpoint(\n\t\t(resultId)=>`/SRS/Application/NCATS/${resultId}/OrganizationPerformance`\n\t)(result,[],parameters) // This endpoint doesn't take properties so neither does the function\n\nexport const coverage = makeEndpointWithDil(\n\t(resultId)=>`/SRS/Application/NCATS/${resultId}/Coverage`\n)\n\nexport type StackedHistogramEndpointMinorBin = {\n\tcounts: Record;\n} & Omit;\n\nexport type StackedHistogramEndpointMajorBin = {\n\tbinData: StackedHistogramEndpointMinorBin[];\n} & Omit;\n\nexport type StackedHistogramEndpointResponse = {\n\tbins: StackedHistogramEndpointMajorBin[];\n\tkeys: string[];\n} & Omit;\n\n/**\n * Distinguishes between Stacked and normal HistogramEndpointResponses\n */\nexport function isStacked(arg): arg is StackedHistogramEndpointResponse {\n\treturn typeof arg.keys !== undefined\n}\n\n/**\n * @param result\n * @param dilName\n * @param options\n * @returns {Promise}\n */\nexport const stackedTimeline: EndpointRequest = throwEmptyResult(\n\t(result: Result, dilName: string, { propertyList, parameters }): Promise => {\n\t\tconst resultId = typeof result === 'number' ? result : result.resultId;\n\t\tconst properties = selectPropertyListFromDilByNames(dilName, propertyList);\n\t\tconst stackProperty = selectPropertyListFromDilByNames(dilName, parameters.stackProperty)[0];\n\n\t\treturn post(`/SRS/Analytics/Temporal/${resultId}/StackedTimeline`, {\n\t\t\tpropertyList: properties.map(({ systemDefinitionId, name }) => ({ systemDefinitionId, name })),\n\t\t\tparameters: {\n\t\t\t\t...parameters,\n\t\t\t\tstackProperty: { ...stackProperty },\n\t\t\t},\n\t\t});\n\t}\n);\n","// TODO: This might need to move\nexport enum DefaultChartColorScales {\n\t'Single Color' = 'Single Color',\n\tCategorical = 'Categorical',\n\tSequential = 'Sequential',\n}\n\nexport const DefaultCategoricalColors = [\n\t'#7d9968', // moss\n\t'#d73b41', // red\n\t'#e66f00', // orange\n\t'#0093ff', // blue\n\t'#9d79ff', // purple\n\t'#f3598c', // pink\n\t'#8d9980', // olive\n\t'#b9874b', // gold\n\t'#2d9db5', // teal\n\t'#7487fe', // indigo\n\t'#00a657', // green\n\t'#c470d3', // violet\n\t'#d27869', // salmon\n];\n","import { scaleLinear, scaleQuantile, extent } from 'd3';\nimport { WIDGET_TYPES } from 'widgets';\nimport { DefaultCategoricalColors } from 'styles/chartColors';\nimport { primaryColorLightest, primaryColor } from 'styles/colors';\nimport { useMemo } from 'react';\nimport { GenericObject } from 'interfaces/GenericObject';\n\ntype ScalesProp = {\n\t[widgetId in keyof WIDGET_TYPES]: {\n\t\t// We don't type the scaleId because a user could add a custom scale, or a scale name we don't have at compile time\n\t\t// so just leave it as a string. Widgets won't change after run time so that can be typed like it is\n\t\t[ScaleId: string]: { (value: string | number): string; default: undefined } | { default: boolean };\n\t};\n};\n\nconst categoricalColorCache = {};\nlet categoricalColorIndex = 0;\n\n/**\n * @param appSpecificColors\n */\nexport function useDefaultColors(appSpecificColors) {\n\treturn useMemo(() => {\n\t\tconst defaultColors = setUpColorScale(SlykitDefaultColors, {\n\t\t\t'*': {\n\t\t\t\t'Single Color': [primaryColor],\n\t\t\t\tCategorical: DefaultCategoricalColors,\n\t\t\t\tSequential: {\n\t\t\t\t\ttype: 'sequential',\n\t\t\t\t\tscale: [primaryColor, primaryColorLightest],\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (appSpecificColors) {\n\t\t\tappSpecificColors.addToChain(defaultColors);\n\t\t\treturn appSpecificColors;\n\t\t}\n\t\treturn defaultColors;\n\n\t\t// should really only ever fire once at init. Until we support user changing styles during app lifecycle\n\t}, [appSpecificColors]);\n}\n\nexport function useAppColors(appColorsConfig) {\n\treturn useMemo(() => {\n\t\treturn setUpColorScale(ColorScaleCommandHandler, appColorsConfig);\n\t}, [appColorsConfig]);\n}\n/**\n * @param type\n * @param config\n */\nexport function setUpColorScale(type: { new (arg1): T }, config): T {\n\tconst scales: ScalesProp = Object.entries(config).reduce((coll, [widgetId, scalesConfig]) => {\n\t\t//TODO fix ts ignore\n\t\t//@ts-ignore\n\t\tcoll[widgetId] = Object.entries(scalesConfig).reduce((c2, [scaleId, scaleConfig]) => {\n\t\t\tif (Array.isArray(scaleConfig)) {\n\t\t\t\thandleCategorical(c2, scaleId, scaleConfig);\n\t\t\t} else if (scaleConfig === 'default') {\n\t\t\t\thandleDefault(c2, scaleId);\n\t\t\t} else if (scaleConfig.hasOwnProperty('type')) {\n\t\t\t\tif (scaleConfig.type === 'sequential') {\n\t\t\t\t\thandleSequential(c2, scaleId, scaleConfig);\n\t\t\t\t} else if (scaleConfig.type === 'quantile') {\n\t\t\t\t\thandleQuantile(c2, scaleId, scaleConfig);\n\t\t\t\t} else if (scaleConfig.type === 'range') {\n\t\t\t\t\thandleRange(c2, scaleId, scaleConfig);\n\t\t\t\t} else if (scaleConfig.type === 'direct') {\n\t\t\t\t\thandleDirect(c2, scaleId, scaleConfig);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Supplied scale type '${scaleConfig.type}' is unknown`);\n\t\t\t\t}\n\n\t\t\t\tc2[scaleId].scaleType = scaleConfig.type;\n\t\t\t} else {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Defined scale's object does not match correct structure. Color Scale '${scaleId}' will be ignored`\n\t\t\t\t);\n\t\t\t\treturn c2;\n\t\t\t}\n\t\t\tc2[scaleId].scaleId = scaleId;\n\n\t\t\treturn c2;\n\t\t}, {});\n\n\t\treturn coll;\n\t}, {} as ScalesProp);\n\n\treturn new type(scales);\n}\n\n/**\n * Command Chain Pattern. Chain link for colors. Can be used on individual apps or app widgets.\n */\nexport class ColorScaleCommandHandler {\n\tprivate next: ColorScaleCommandHandler;\n\tprotected scales: ScalesProp;\n\tprivate filters: GenericObject> = {};\n\n\tpublic constructor(scales: ScalesProp) {\n\t\tthis.scales = scales;\n\t}\n\n\tpublic execute(widgetToUse, scaleToUse) {\n\t\tif(scaleToUse === undefined) {//if not passed in use the first available option\n\t\t\treturn this.execute(widgetToUse, this.getAvailableScales(widgetToUse)[0]);\n\t\t}\n\t\tif (this.scales.hasOwnProperty(widgetToUse) && this.scales[widgetToUse].hasOwnProperty(scaleToUse)) {\n\t\t\treturn this.scales[widgetToUse][scaleToUse];\n\t\t}\n\t\telse if(this.scales.hasOwnProperty(\"*\") && this.scales[\"*\"].hasOwnProperty(scaleToUse)) {\n\t\t\treturn this.scales[\"*\"][scaleToUse];\n\t\t}\n\t\telse if(this.next) {\n\t\t\treturn this.next.execute(widgetToUse, scaleToUse);\n\t\t}\n\t\t//default if all else fails. Hopefully Slykit default colors are in place to include Single Color or we're throwing the error\n\t\telse if(this.scales.hasOwnProperty(\"*\") && this.scales[\"*\"].hasOwnProperty(\"Single Color\"))\n\t\t\treturn this.scales[\"*\"][\"Single Color\"];\n\t\tthrow new Error('Color chain ran out of links');\n\t}\n\n\tgetAvailableScales(widgetId) {\n\t\tif(this.filters.hasOwnProperty(widgetId)) {\n\t\t\treturn this.filters[widgetId];\n\t\t}\n\n\t\tconst availScales = [];\n\t\t//app widget specific\n\t\tif (this.scales.hasOwnProperty(widgetId)) {\n\t\t\tavailScales.push(...Object.keys(this.scales[widgetId]));\n\t\t}\n\t\t//wild card\n\t\tif (this.scales.hasOwnProperty('*')) {\n\t\t\tavailScales.push(...Object.keys(this.scales[\"*\"]));\n\t\t}\n\t\tif (this.next) {\n\t\t\tavailScales.push(...this.next.getAvailableScales(widgetId));\n\t\t}\n\t\treturn availScales;\n\t}\n\n\tsetNext(h) {\n\t\tthis.next = h;\n\t}\n\n\tpublic addToChain(h) {\n\t\t//When moving between dashboard and explorer the appSpecificScales object gets a new pointer, so the useMemo function in\n\t\t//useDefaultColors (above) fires again. That fires this addToChain and what happens is the default colors get added everytime\n\t\t//the switch occurs. So we check if its a repeat and discard it if it is.\n\t\tif (this.next) {//if this object already has a next pass it along the chain to be added at the end\n\t\t\tthis.next.addToChain(h);\n\t\t} else if(!(h instanceof SlykitDefaultColors && this instanceof SlykitDefaultColors)) {\n\t\t\tthis.next = h;\n\t\t}\n\t}\n\n\tpublic filter(widgetId: string, scalesToKeep: Array) {\n\t\tif(Array.isArray(scalesToKeep))\n\t\t\tthis.filters[widgetId] = scalesToKeep\n\t}\n}\n\n/**\n * Default color chain link for slykit. Shouldn't be used outside slykit (so it's not exported in slykit's index.tsx file)\n */\nexport class SlykitDefaultColors extends ColorScaleCommandHandler {\n\t/*\n\tThere is a special case when adding to chain that we need to know if we are at the end of the line. (Other wise the\n\tdefault colors get added over and over again.) So as a way to know if we are at the end of the chain, or to know if the default colors\n\thave already been added and we don't need to add them again, we have this SlykitDefaultColors object.\n\tFor more details see ColorScaleCommandHandler.addToChain()\n\t */\n}\n\n//region Handle Color Scales\n/**\n * @param c2\n * @param scaleId\n * @param scaleConfig\n */\nfunction handleCategorical(c2, scaleId: string, scaleConfig: any) {\n\tc2[scaleId] = function (v) {\n\t\tv = (v.toLowerCase && v.toLowerCase()) || v;\n\t\treturn categoricalColorCache[v]?.[scaleId];\n\t};\n\tc2[scaleId].domain = (data) => {\n\t\tif (data === undefined) {\n\t\t\treturn {\n\t\t\t\tall: Object.keys(categoricalColorCache),\n\t\t\t\tscoped: data,\n\t\t\t};\n\t\t}\n\t\tdata?.forEach((v) => {\n\t\t\tv = (v.toLowerCase && v.toLowerCase()) || v;\n\t\t\tif (!categoricalColorCache.hasOwnProperty(v)) {\n\t\t\t\tcategoricalColorCache[v] = {};\n\t\t\t}\n\t\t\tif (!categoricalColorCache[v][scaleId]) {\n\t\t\t\tcategoricalColorCache[v][scaleId] = scaleConfig[categoricalColorIndex++ % scaleConfig.length];\n\t\t\t}\n\t\t});\n\t};\n\tc2[scaleId].scaleType = 'Categorical';\n}\n\n/**\n * if a widget wanted to include a default scale from the main app could just specify\n * the name of that scale : default\n * e.g. \"Categorical\" : \"default\"\n * @param c2\n * @param scaleId\n */\nfunction handleDefault(c2, scaleId) {\n\t// needs to be an object bc other things are attached (like .scaleId). So it can't just be a string.\n\tc2[scaleId] = { default: true };\n}\n\nfunction handleSequential(c2, scaleId, scaleConfig) {\n\tc2[scaleId] = scaleLinear().range(scaleConfig.scale);\n\tc2[scaleId]._domain = c2[scaleId].domain;\n}\n\n/**\n *\n * @param c2\n * @param scaleId\n * @param scaleConfig\n */\nfunction handleQuantile(c2, scaleId, scaleConfig) {\n\tc2[scaleId] = scaleQuantile().range(scaleConfig.scale);\n\tc2[scaleId]._domain = c2[scaleId].domain;\n\tc2[scaleId].domain = (keys) => {\n\t\tif (keys === undefined) return c2[scaleId]._domain();\n\t\tc2[scaleId]._domain(extent(keys));\n\t};\n}\n\n/**\n * e.g: 0:blue 100:green. User has defined domain and colors (e.g. percentages)\n * @param c2\n * @param scaleId\n * @param scaleConfig\n */\nfunction handleRange(c2, scaleId, scaleConfig) {\n\t// TODO test this. tested with donut and labels show %, but values passed to color function are raw values, no the %.\n\tconst orderedKeys = Object.keys(scaleConfig.scale).sort((a, b) => parseFloat(a) - parseFloat(b));\n\tc2[scaleId] = scaleLinear()\n\t\t.domain(orderedKeys.map((d) => parseFloat(d)))\n\t\t//scaleConfig.scale could have been reordered above, so need to iterate over it to grab correct color\n\t\t.range(orderedKeys.map((d) => scaleConfig.scale[d]));\n\t/*c2[scaleId]._domain = c2[scaleId].domain;\n\tc2[scaleId].domain = keys => {\n\n\t}*/\n}\n\n/**\n * @param c2\n * @param scaleId\n * @param scaleConfig\n */\nfunction handleDirect(c2, scaleId, scaleConfig) {\n\tc2[scaleId] = (v) => {\n\t\tif (scaleConfig.scale.hasOwnProperty(v)) {\n\t\t\treturn scaleConfig.scale[v];\n\t\t}\n\t\treturn null;\n\t};\n\tc2[scaleId].domain = (keys) => {\n\t\t//No op, domain is set by the scaleConfig\n\t\tif (keys === undefined)\n\t\t\t\treturn Object.keys(scaleConfig.scale);\n\t\treturn null;\n\t};\n}\n//endregion\n","// D3 and other js use this value in raw color calculations , so we cant use a css: var(--pr-intent-primary); here\nexport const primaryColor = '#006699'; // ColorAliases.PT_INTENT_PRIMARY;\nexport const primaryColorLightest = '#e6f7ff'; // TODO: Have Bradford fix this\n","import { css } from '@emotion/react';\n\nexport const loadingStyles = {\n loadingIconContainer: css`\n height: 100%;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `,\n};","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport { loadingStyles } from './loadingStyles';\nimport { Intent, Spinner } from '@blueprintjs/core';\n\nconst LoadingIcon = ({ size = 32, className = '' }) => {\n\treturn (\n\t\t
\n\t\t\t\n\t\t
\n\t);\n};\n\nexport default LoadingIcon;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Card, Classes, Elevation, InputGroup, Intent } from '@blueprintjs/core';\nimport LoadingIcon from 'components/loadingIcon';\n\n/**\n * A standard Serberus authentication dialog.\n *\n * @param title\n * @param authenticate\n * @param isAuthenticated\n * @param error\n * @returns {null|*}\n * @constructor\n */\nexport const Login = ({ title = 'Log In', authenticate, isAuthenticated, error }) => {\n\tconst [userName, setUserName] = useState('');\n\tconst [password, setPassword] = useState('');\n\tconst [loading, setLoadingStatus] = useState(false);\n\n\tconst onKeyDown = (event) => {\n\t\tif (event.keyCode === 13) {\n\t\t\tonClick();\n\t\t}\n\t};\n\n\tconst onClick = () => {\n\t\tsetLoadingStatus(true);\n\t\tif (userName && password) {\n\t\t\tauthenticate(userName, password);\n\t\t\tsetPassword('');\n\t\t}\n\t};\n\n\t// TODO: Add background blur/deblur\n\n\tif (isAuthenticated) return null;\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t

{title}

\n\t\t\t
\n\t\t\t{error && (\n\t\t\t\t
\n\t\t\t\t\t

{getErrorMessage(error)}

\n\t\t\t\t
\n\t\t\t)}\n\t\t\t

\n\t\t\t setUserName(event.target.value)}\n\t\t\t\tname=\"username\"\n\t\t\t\tplaceholder=\"Username\"\n\t\t\t\tvalue={userName}\n\t\t\t\tautoFocus\n\t\t\t/>\n\t\t\t setPassword(event.target.value)}\n\t\t\t\tvalue={password}\n\t\t\t/>\n\t\t\t\n\t\t\t\tLog In\n\t\t\t\n\t\t\t

\n\t\t\t

\n\t\t\t

\n\n\t\t\t{loading === true && !error && }\n\t\t
\n\t);\n};\n\nconst card = css`\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 400px;\n\theight: 220px;\n\tmargin: auto;\n\n\tdiv {\n\t\tmargin-bottom: 10px;\n\t}\n`;\n\nvar getErrorMessage = (error) => {\n\tif (error.message === 'Failed to fetch') {\n\t\treturn 'Server Connection Error';\n\t} else if (error.message === 'Unauthorized') {\n\t\treturn 'Invalid Username/Password';\n\t} else {\n\t\treturn error.message;\n\t}\n};\n\nLogin.propTypes = {\n\terror: PropTypes.any,\n\tisAuthenticated: PropTypes.bool,\n\tauthenticate: PropTypes.func,\n};\n","\nexport const DefaultColors = {\n\tBLACK: \"#10161a\",\n\tDARK_GRAY1: \"#182026\",\n\tDARK_GRAY2: \"#202b33\",\n\tDARK_GRAY3: \"#293742\",\n\tDARK_GRAY4: \"#30404d\",\n\tDARK_GRAY5: \"#394b59\",\n\tGRAY1: \"#5c7080\",\n\tGRAY2: \"#738694\",\n\tGRAY3: \"#8a9ba8\",\n\tGRAY4: \"#a7b6c2\",\n\tGRAY5: \"#bfccd6\",\n\tLIGHT_GRAY1: \"#ced9e0\",\n\tLIGHT_GRAY2: \"#d8e1e8\",\n\tLIGHT_GRAY3: \"#e1e8ed\",\n\tLIGHT_GRAY4: \"#ebf1f5\",\n\tLIGHT_GRAY5: \"#f5f8fa\",\n\tWHITE: \"#ffffff\",\n\tBLUE1: \"#0e5a8a\",\n\tBLUE2: \"#106ba3\",\n\tBLUE3: \"#137cbd\",\n\tBLUE4: \"#2b95d6\",\n\tBLUE5: \"#48aff0\",\n\tGREEN1: \"#0a6640\",\n\tGREEN2: \"#0d8050\",\n\tGREEN3: \"#0f9960\",\n\tGREEN4: \"#15b371\",\n\tGREEN5: \"#3dcc91\",\n\tORANGE1: \"#a66321\",\n\tORANGE2: \"#bf7326\",\n\tORANGE3: \"#d9822b\",\n\tORANGE4: \"#f29d49\",\n\tORANGE5: \"#ffb366\",\n\tRED1: \"#a82a2a\",\n\tRED2: \"#c23030\",\n\tRED3: \"#db3737\",\n\tRED4: \"#f55656\",\n\tRED5: \"#ff7373\",\n\tVERMILION1: \"#9e2b0e\",\n\tVERMILION2: \"#b83211\",\n\tVERMILION3: \"#d13913\",\n\tVERMILION4: \"#eb532d\",\n\tVERMILION5: \"#ff6e4a\",\n\tROSE1: \"#a82255\",\n\tROSE2: \"#c22762\",\n\tROSE3: \"#db2c6f\",\n\tROSE4: \"#f5498b\",\n\tROSE5: \"#ff66a1\",\n\tVIOLET1: \"#5c255c\",\n\tVIOLET2: \"#752f75\",\n\tVIOLET3: \"#8f398f\",\n\tVIOLET4: \"#a854a8\",\n\tVIOLET5: \"#c274c2\",\n\tINDIGO1: \"#5642a6\",\n\tINDIGO2: \"#634dbf\",\n\tINDIGO3: \"#7157d9\",\n\tINDIGO4: \"#9179f2\",\n\tINDIGO5: \"#ad99ff\",\n\tCOBALT1: \"#1f4b99\",\n\tCOBALT2: \"#2458b3\",\n\tCOBALT3: \"#2965cc\",\n\tCOBALT4: \"#4580e6\",\n\tCOBALT5: \"#669eff\",\n\tTURQUOISE1: \"#008075\",\n\tTURQUOISE2: \"#00998c\",\n\tTURQUOISE3: \"#00b3a4\",\n\tTURQUOISE4: \"#14ccbd\",\n\tTURQUOISE5: \"#2ee6d6\",\n\tFOREST1: \"#1d7324\",\n\tFOREST2: \"#238c2c\",\n\tFOREST3: \"#29a634\",\n\tFOREST4: \"#43bf4d\",\n\tFOREST5: \"#62d96b\",\n\tLIME1: \"#728c23\",\n\tLIME2: \"#87a629\",\n\tLIME3: \"#9bbf30\",\n\tLIME4: \"#b6d94c\",\n\tLIME5: \"#d1f26d\",\n\tGOLD1: \"#a67908\",\n\tGOLD2: \"#bf8c0a\",\n\tGOLD3: \"#d99e0b\",\n\tGOLD4: \"#f2b824\",\n\tGOLD5: \"#ffc940\",\n\tSEPIA1: \"#63411e\",\n\tSEPIA2: \"#7d5125\",\n\tSEPIA3: \"#96622d\",\n\tSEPIA4: \"#b07b46\",\n\tSEPIA5: \"#c99765\"\n};\n\nexport const DefaultColorAliases = {\n\tPT_INTENT_PRIMARY: \"#137cbd\",\n\tPT_INTENT_SUCCESS: \"#0f9960\",\n\tPT_INTENT_WARNING: \"#d9822b\",\n\tPT_INTENT_DANGER: \"#db3737\",\n\tPT_APP_BACKGROUND_COLOR: \"#f5f8fa\",\n\tPT_DARK_APP_BACKGROUND_COLOR: \"#293742\",\n\tPT_OUTLINE_COLOR: \"rgba(19, 124, 189, 0.6)\",\n\tPT_TEXT_COLOR: \"#182026\",\n\tPT_TEXT_COLOR_MUTED: \"#5c7080\",\n\tPT_TEXT_COLOR_DISABLED: \"rgba(92, 112, 128, 0.6)\",\n\tPT_HEADING_COLOR: \"#182026\",\n\tPT_LINK_COLOR: \"#106ba3\",\n\tPT_DARK_TEXT_COLOR: \"#f5f8fa\",\n\tPT_DARK_TEXT_COLOR_MUTED: \"#a7b6c2\",\n\tPT_DARK_TEXT_COLOR_DISABLED: \"rgba(167, 182, 194, 0.6)\",\n\tPT_DARK_HEADING_COLOR: \"#f5f8fa\",\n\tPT_DARK_LINK_COLOR: \"#48aff0\",\n\tPT_TEXT_SELECTION_COLOR: \"rgba(125, 188, 255, 0.6)\",\n\tPT_ICON_COLOR: \"#5c7080\",\n\tPT_ICON_COLOR_HOVER: \"#182026\",\n\tPT_ICON_COLOR_DISABLED: \"rgba(92, 112, 128, 0.6)\",\n\tPT_ICON_COLOR_SELECTED: \"#137cbd\",\n\tPT_DARK_ICON_COLOR: \"#a7b6c2\",\n\tPT_DARK_ICON_COLOR_HOVER: \"#f5f8fa\",\n\tPT_DARK_ICON_COLOR_DISABLED: \"rgba(167, 182, 194, 0.6)\",\n\tPT_DARK_ICON_COLOR_SELECTED: \"#137cbd\",\n\tPT_DIVIDER_BLACK: \"rgba(16, 22, 26, 0.15)\",\n\tPT_DARK_DIVIDER_BLACK: \"rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_DIVIDER_WHITE: \"rgba(255, 255, 255, 0.15)\",\n\tPT_CODE_TEXT_COLOR: \"#5c7080\",\n\tPT_DARK_CODE_TEXT_COLOR: \"#a7b6c2\",\n\tPT_CODE_BACKGROUND_COLOR: \"rgba(255, 255, 255, 0.7)\",\n\tPT_DARK_CODE_BACKGROUND_COLOR: \"rgba(16, 22, 26, 0.3)\"\n};\n\nexport const DefaultVariables = {\n\tPT_GRID_SIZE: \"10px\",\n\tPT_FONT_FAMILY: \"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Open Sans, Helvetica Neue, Icons16, sans-serif\",\n\tPT_FONT_FAMILY_MONOSPACE: \"Consolas, Menlo, monospace\",\n\tPT_FONT_SIZE: \"14px\",\n\tPT_FONT_SIZE_LARGE: \"16px\",\n\tPT_FONT_SIZE_SMALL: \"12px\",\n\tPT_LINE_HEIGHT: \"1.28581\",\n\tICONS16_FAMILY: \"Icons16\",\n\tICONS20_FAMILY: \"Icons20\",\n\tPT_ICON_SIZE_STANDARD: \"16px\",\n\tPT_ICON_SIZE_LARGE: \"20px\",\n\tPT_BORDER_RADIUS: \"3px\",\n\tPT_BUTTON_HEIGHT: \"30px\",\n\tPT_BUTTON_HEIGHT_SMALL: \"24px\",\n\tPT_BUTTON_HEIGHT_SMALLER: \"20px\",\n\tPT_BUTTON_HEIGHT_LARGE: \"40px\",\n\tPT_INPUT_HEIGHT: \"30px\",\n\tPT_INPUT_HEIGHT_LARGE: \"40px\",\n\tPT_INPUT_HEIGHT_SMALL: \"24px\",\n\tPT_NAVBAR_HEIGHT: \"50px\",\n\tPT_Z_INDEX_BASE: \"0\",\n\tPT_Z_INDEX_CONTENT: \"10\",\n\tPT_Z_INDEX_OVERLAY: \"20\",\n\tPT_BORDER_SHADOW_OPACITY: \"0.1\",\n\tPT_DROP_SHADOW_OPACITY: \"0.2\",\n\tPT_DARK_BORDER_SHADOW_OPACITY: \"0.2\",\n\tPT_DARK_DROP_SHADOW_OPACITY: \"0.4\",\n\tPT_ELEVATION_SHADOW_0: \"0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0)\",\n\tPT_ELEVATION_SHADOW_1: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2)\",\n\tPT_ELEVATION_SHADOW_2: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 1px 1px rgba(16, 22, 26, 0.2), 0 2px 6px rgba(16, 22, 26, 0.2)\",\n\tPT_ELEVATION_SHADOW_3: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2)\",\n\tPT_ELEVATION_SHADOW_4: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2)\",\n\tPT_DARK_ELEVATION_SHADOW_0: \"0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0)\",\n\tPT_DARK_ELEVATION_SHADOW_1: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_ELEVATION_SHADOW_2: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.4), 0 2px 6px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_ELEVATION_SHADOW_3: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_ELEVATION_SHADOW_4: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4)\",\n\tPT_TRANSITION_EASE: \"cubic-bezier(0.4, 1, 0.75, 0.9)\",\n\tPT_TRANSITION_EASE_BOUNCE: \"cubic-bezier(0.54, 1.12, 0.38, 1.11)\",\n\tPT_TRANSITION_DURATION: \"100ms\",\n\tPT_INPUT_BOX_SHADOW: \"inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2)\",\n\tPT_DIALOG_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2)\",\n\tPT_POPOVER_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2)\",\n\tPT_TOOLTIP_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2)\",\n\tPT_DARK_INPUT_BOX_SHADOW: \"inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_DIALOG_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_POPOVER_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4)\",\n\tPT_DARK_TOOLTIP_BOX_SHADOW: \"0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4)\"\n};\n","import { DefaultColorAliases, DefaultColors, DefaultVariables } from './variables-default';\n\nexport const Colors = {\n\tBLACK: `var(--black, ${DefaultColors.BLACK})`,\n\tDARK_GRAY1: `var(--dark-gray1, ${DefaultColors.DARK_GRAY1})`,\n\tDARK_GRAY2: `var(--dark-gray2, ${DefaultColors.DARK_GRAY2})`,\n\tDARK_GRAY3: `var(--dark-gray3, ${DefaultColors.DARK_GRAY3})`,\n\tDARK_GRAY4: `var(--dark-gray4, ${DefaultColors.DARK_GRAY4})`,\n\tDARK_GRAY5: `var(--dark-gray5, ${DefaultColors.DARK_GRAY5})`,\n\tGRAY1: `var(--gray1, ${DefaultColors.GRAY1})`,\n\tGRAY2: `var(--gray2, ${DefaultColors.GRAY2})`,\n\tGRAY3: `var(--gray3, ${DefaultColors.GRAY3})`,\n\tGRAY4: `var(--gray4, ${DefaultColors.GRAY4})`,\n\tGRAY5: `var(--gray5, ${DefaultColors.GRAY5})`,\n\tLIGHT_GRAY1: `var(--light-gray1, ${DefaultColors.LIGHT_GRAY1})`,\n\tLIGHT_GRAY2: `var(--light-gray2, ${DefaultColors.LIGHT_GRAY2})`,\n\tLIGHT_GRAY3: `var(--light-gray3, ${DefaultColors.LIGHT_GRAY3})`,\n\tLIGHT_GRAY4: `var(--light-gray4, ${DefaultColors.LIGHT_GRAY4})`,\n\tLIGHT_GRAY5: `var(--light-gray5, ${DefaultColors.LIGHT_GRAY5})`,\n\tWHITE: `var(--white, ${DefaultColors.WHITE})`,\n\tBLUE1: `var(--blue1, ${DefaultColors.BLUE1})`,\n\tBLUE2: `var(--blue2, ${DefaultColors.BLUE2})`,\n\tBLUE3: `var(--blue3, ${DefaultColors.BLUE3})`,\n\tBLUE4: `var(--blue4, ${DefaultColors.BLUE4})`,\n\tBLUE5: `var(--blue5, ${DefaultColors.BLUE5})`,\n\tGREEN1: `var(--green1, ${DefaultColors.GREEN1})`,\n\tGREEN2: `var(--green2, ${DefaultColors.GREEN2})`,\n\tGREEN3: `var(--green3, ${DefaultColors.GREEN3})`,\n\tGREEN4: `var(--green4, ${DefaultColors.GREEN4})`,\n\tGREEN5: `var(--green5, ${DefaultColors.GREEN5})`,\n\tORANGE1: `var(--orange1, ${DefaultColors.ORANGE1})`,\n\tORANGE2: `var(--orange2, ${DefaultColors.ORANGE2})`,\n\tORANGE3: `var(--orange3, ${DefaultColors.ORANGE3})`,\n\tORANGE4: `var(--orange4, ${DefaultColors.ORANGE4})`,\n\tORANGE5: `var(--orange5, ${DefaultColors.ORANGE5})`,\n\tRED1: `var(--red1, ${DefaultColors.RED1})`,\n\tRED2: `var(--red2, ${DefaultColors.RED2})`,\n\tRED3: `var(--red3, ${DefaultColors.RED3})`,\n\tRED4: `var(--red4, ${DefaultColors.RED4})`,\n\tRED5: `var(--red5, ${DefaultColors.RED5})`,\n\tVERMILION1: `var(--vermilion1, ${DefaultColors.VERMILION1})`,\n\tVERMILION2: `var(--vermilion2, ${DefaultColors.VERMILION2})`,\n\tVERMILION3: `var(--vermilion3, ${DefaultColors.VERMILION3})`,\n\tVERMILION4: `var(--vermilion4, ${DefaultColors.VERMILION4})`,\n\tVERMILION5: `var(--vermilion5, ${DefaultColors.VERMILION5})`,\n\tROSE1: `var(--rose1, ${DefaultColors.ROSE1})`,\n\tROSE2: `var(--rose2, ${DefaultColors.ROSE2})`,\n\tROSE3: `var(--rose3, ${DefaultColors.ROSE3})`,\n\tROSE4: `var(--rose4, ${DefaultColors.ROSE4})`,\n\tROSE5: `var(--rose5, ${DefaultColors.ROSE5})`,\n\tVIOLET1: `var(--violet1, ${DefaultColors.VIOLET1})`,\n\tVIOLET2: `var(--violet2, ${DefaultColors.VIOLET2})`,\n\tVIOLET3: `var(--violet3, ${DefaultColors.VIOLET3})`,\n\tVIOLET4: `var(--violet4, ${DefaultColors.VIOLET4})`,\n\tVIOLET5: `var(--violet5, ${DefaultColors.VIOLET5})`,\n\tINDIGO1: `var(--indigo1, ${DefaultColors.INDIGO1})`,\n\tINDIGO2: `var(--indigo2, ${DefaultColors.INDIGO2})`,\n\tINDIGO3: `var(--indigo3, ${DefaultColors.INDIGO3})`,\n\tINDIGO4: `var(--indigo4, ${DefaultColors.INDIGO4})`,\n\tINDIGO5: `var(--indigo5, ${DefaultColors.INDIGO5})`,\n\tCOBALT1: `var(--cobalt1, ${DefaultColors.COBALT1})`,\n\tCOBALT2: `var(--cobalt2, ${DefaultColors.COBALT2})`,\n\tCOBALT3: `var(--cobalt3, ${DefaultColors.COBALT3})`,\n\tCOBALT4: `var(--cobalt4, ${DefaultColors.COBALT4})`,\n\tCOBALT5: `var(--cobalt5, ${DefaultColors.COBALT5})`,\n\tTURQUOISE1: `var(--turquoise1, ${DefaultColors.TURQUOISE1})`,\n\tTURQUOISE2: `var(--turquoise2, ${DefaultColors.TURQUOISE2})`,\n\tTURQUOISE3: `var(--turquoise3, ${DefaultColors.TURQUOISE3})`,\n\tTURQUOISE4: `var(--turquoise4, ${DefaultColors.TURQUOISE4})`,\n\tTURQUOISE5: `var(--turquoise5, ${DefaultColors.TURQUOISE5})`,\n\tFOREST1: `var(--forest1, ${DefaultColors.FOREST1})`,\n\tFOREST2: `var(--forest2, ${DefaultColors.FOREST2})`,\n\tFOREST3: `var(--forest3, ${DefaultColors.FOREST3})`,\n\tFOREST4: `var(--forest4, ${DefaultColors.FOREST4})`,\n\tFOREST5: `var(--forest5, ${DefaultColors.FOREST5})`,\n\tLIME1: `var(--lime1, ${DefaultColors.LIME1})`,\n\tLIME2: `var(--lime2, ${DefaultColors.LIME2})`,\n\tLIME3: `var(--lime3, ${DefaultColors.LIME3})`,\n\tLIME4: `var(--lime4, ${DefaultColors.LIME4})`,\n\tLIME5: `var(--lime5, ${DefaultColors.LIME5})`,\n\tGOLD1: `var(--gold1, ${DefaultColors.GOLD1})`,\n\tGOLD2: `var(--gold2, ${DefaultColors.GOLD2})`,\n\tGOLD3: `var(--gold3, ${DefaultColors.GOLD3})`,\n\tGOLD4: `var(--gold4, ${DefaultColors.GOLD4})`,\n\tGOLD5: `var(--gold5, ${DefaultColors.GOLD5})`,\n\tSEPIA1: `var(--sepia1, ${DefaultColors.SEPIA1})`,\n\tSEPIA2: `var(--sepia2, ${DefaultColors.SEPIA2})`,\n\tSEPIA3: `var(--sepia3, ${DefaultColors.SEPIA3})`,\n\tSEPIA4: `var(--sepia4, ${DefaultColors.SEPIA4})`,\n\tSEPIA5: `var(--sepia5, ${DefaultColors.SEPIA5})`,\n};\n\nexport const ColorAliases = {\n\tPT_INTENT_PRIMARY: `var(--pt-intent-primary, ${DefaultColorAliases.PT_INTENT_PRIMARY})`,\n\tPT_INTENT_SUCCESS: `var(--pt-intent-success, ${DefaultColorAliases.PT_INTENT_SUCCESS})`,\n\tPT_INTENT_WARNING: `var(--pt-intent-warning, ${DefaultColorAliases.PT_INTENT_WARNING})`,\n\tPT_INTENT_DANGER: `var(--pt-intent-danger, ${DefaultColorAliases.PT_INTENT_DANGER})`,\n\tPT_APP_BACKGROUND_COLOR: `var(--pt-app-background-color, ${DefaultColorAliases.PT_APP_BACKGROUND_COLOR})`,\n\tPT_DARK_APP_BACKGROUND_COLOR: `var(--pt-dark-app-background-color, ${DefaultColorAliases.PT_DARK_APP_BACKGROUND_COLOR})`,\n\tPT_OUTLINE_COLOR: `var(--pt-outline-color, ${DefaultColorAliases.PT_OUTLINE_COLOR})`,\n\tPT_TEXT_COLOR: `var(--pt-text-color, ${DefaultColorAliases.PT_TEXT_COLOR})`,\n\tPT_TEXT_COLOR_MUTED: `var(--pt-text-color-muted, ${DefaultColorAliases.PT_TEXT_COLOR_MUTED})`,\n\tPT_TEXT_COLOR_DISABLED: `var(--pt-text-color-disabled, ${DefaultColorAliases.PT_TEXT_COLOR_DISABLED})`,\n\tPT_HEADING_COLOR: `var(--pt-heading-color, ${DefaultColorAliases.PT_HEADING_COLOR})`,\n\tPT_LINK_COLOR: `var(--pt-link-color, ${DefaultColorAliases.PT_LINK_COLOR})`,\n\tPT_DARK_TEXT_COLOR: `var(--pt-dark-text-color, ${DefaultColorAliases.PT_DARK_TEXT_COLOR})`,\n\tPT_DARK_TEXT_COLOR_MUTED: `var(--pt-dark-text-color-muted, ${DefaultColorAliases.PT_DARK_TEXT_COLOR_MUTED})`,\n\tPT_DARK_TEXT_COLOR_DISABLED: `var(--pt-dark-text-color-disabled, ${DefaultColorAliases.PT_DARK_TEXT_COLOR_DISABLED})`,\n\tPT_DARK_HEADING_COLOR: `var(--pt-dark-heading-color, ${DefaultColorAliases.PT_DARK_HEADING_COLOR})`,\n\tPT_DARK_LINK_COLOR: `var(--pt-dark-link-color, ${DefaultColorAliases.PT_DARK_LINK_COLOR})`,\n\tPT_TEXT_SELECTION_COLOR: `var(--pt-text-selection-color, ${DefaultColorAliases.PT_TEXT_SELECTION_COLOR})`,\n\tPT_ICON_COLOR: `var(--pt-icon-color, ${DefaultColorAliases.PT_ICON_COLOR})`,\n\tPT_ICON_COLOR_HOVER: `var(--pt-icon-color-hover, ${DefaultColorAliases.PT_ICON_COLOR_HOVER})`,\n\tPT_ICON_COLOR_DISABLED: `var(--pt-icon-color-disabled, ${DefaultColorAliases.PT_ICON_COLOR_DISABLED})`,\n\tPT_ICON_COLOR_SELECTED: `var(--pt-icon-color-selected, ${DefaultColorAliases.PT_ICON_COLOR_SELECTED})`,\n\tPT_DARK_ICON_COLOR: `var(--pt-dark-icon-color, ${DefaultColorAliases.PT_DARK_ICON_COLOR})`,\n\tPT_DARK_ICON_COLOR_HOVER: `var(--pt-dark-icon-color-hover, ${DefaultColorAliases.PT_DARK_ICON_COLOR_HOVER})`,\n\tPT_DARK_ICON_COLOR_DISABLED: `var(--pt-dark-icon-color-disabled, ${DefaultColorAliases.PT_DARK_ICON_COLOR_DISABLED})`,\n\tPT_DARK_ICON_COLOR_SELECTED: `var(--pt-dark-icon-color-selected, ${DefaultColorAliases.PT_DARK_ICON_COLOR_SELECTED})`,\n\tPT_DIVIDER_BLACK: `var(--pt-divider-black, ${DefaultColorAliases.PT_DIVIDER_BLACK})`,\n\tPT_DARK_DIVIDER_BLACK: `var(--pt-dark-divider-black, ${DefaultColorAliases.PT_DARK_DIVIDER_BLACK})`,\n\tPT_DARK_DIVIDER_WHITE: `var(--pt-dark-divider-white, ${DefaultColorAliases.PT_DARK_DIVIDER_WHITE})`,\n\tPT_CODE_TEXT_COLOR: `var(--pt-code-text-color, ${DefaultColorAliases.PT_CODE_TEXT_COLOR})`,\n\tPT_DARK_CODE_TEXT_COLOR: `var(--pt-dark-code-text-color, ${DefaultColorAliases.PT_DARK_CODE_TEXT_COLOR})`,\n\tPT_CODE_BACKGROUND_COLOR: `var(--pt-code-background-color, ${DefaultColorAliases.PT_CODE_BACKGROUND_COLOR})`,\n\tPT_DARK_CODE_BACKGROUND_COLOR: `var(--pt-dark-code-background-color, ${DefaultColorAliases.PT_DARK_CODE_BACKGROUND_COLOR})`,\n};\n\nexport const Variables = {\n\tPT_GRID_SIZE: `var(--pt-grid-size, ${DefaultVariables.PT_GRID_SIZE})`,\n\tPT_FONT_FAMILY: `var(--pt-font-family, ${DefaultVariables.PT_FONT_FAMILY})`,\n\tPT_FONT_FAMILY_MONOSPACE: `var(--pt-font-family-monospace, ${DefaultVariables.PT_FONT_FAMILY_MONOSPACE})`,\n\tPT_FONT_SIZE: `var(--pt-font-size, ${DefaultVariables.PT_FONT_SIZE})`,\n\tPT_FONT_SIZE_LARGE: `var(--pt-font-size-large, ${DefaultVariables.PT_FONT_SIZE_LARGE})`,\n\tPT_FONT_SIZE_SMALL: `var(--pt-font-size-small, ${DefaultVariables.PT_FONT_SIZE_SMALL})`,\n\tPT_LINE_HEIGHT: `var(--pt-line-height, ${DefaultVariables.PT_LINE_HEIGHT})`,\n\tICONS16_FAMILY: `var(--icons16-family, ${DefaultVariables.ICONS16_FAMILY})`,\n\tICONS20_FAMILY: `var(--icons20-family, ${DefaultVariables.ICONS20_FAMILY})`,\n\tPT_ICON_SIZE_STANDARD: `var(--pt-icon-size-standard, ${DefaultVariables.PT_ICON_SIZE_STANDARD})`,\n\tPT_ICON_SIZE_LARGE: `var(--pt-icon-size-large, ${DefaultVariables.PT_ICON_SIZE_LARGE})`,\n\tPT_BORDER_RADIUS: `var(--pt-border-radius, ${DefaultVariables.PT_BORDER_RADIUS})`,\n\tPT_BUTTON_HEIGHT: `var(--pt-button-height, ${DefaultVariables.PT_BUTTON_HEIGHT})`,\n\tPT_BUTTON_HEIGHT_SMALL: `var(--pt-button-height-small, ${DefaultVariables.PT_BUTTON_HEIGHT_SMALL})`,\n\tPT_BUTTON_HEIGHT_SMALLER: `var(--pt-button-height-smaller, ${DefaultVariables.PT_BUTTON_HEIGHT_SMALLER})`,\n\tPT_BUTTON_HEIGHT_LARGE: `var(--pt-button-height-large, ${DefaultVariables.PT_BUTTON_HEIGHT_LARGE})`,\n\tPT_INPUT_HEIGHT: `var(--pt-input-height, ${DefaultVariables.PT_INPUT_HEIGHT})`,\n\tPT_INPUT_HEIGHT_LARGE: `var(--pt-input-height-large, ${DefaultVariables.PT_INPUT_HEIGHT_LARGE})`,\n\tPT_INPUT_HEIGHT_SMALL: `var(--pt-input-height-small, ${DefaultVariables.PT_INPUT_HEIGHT_SMALL})`,\n\tPT_NAVBAR_HEIGHT: `var(--pt-navbar-height, ${DefaultVariables.PT_NAVBAR_HEIGHT})`,\n\tPT_Z_INDEX_BASE: `var(--pt-z-index-base, ${DefaultVariables.PT_Z_INDEX_BASE})`,\n\tPT_Z_INDEX_CONTENT: `var(--pt-z-index-content, ${DefaultVariables.PT_Z_INDEX_CONTENT})`,\n\tPT_Z_INDEX_OVERLAY: `var(--pt-z-index-overlay, ${DefaultVariables.PT_Z_INDEX_OVERLAY})`,\n\tPT_BORDER_SHADOW_OPACITY: `var(--pt-border-shadow-opacity, ${DefaultVariables.PT_BORDER_SHADOW_OPACITY})`,\n\tPT_DROP_SHADOW_OPACITY: `var(--pt-drop-shadow-opacity, ${DefaultVariables.PT_DROP_SHADOW_OPACITY})`,\n\tPT_DARK_BORDER_SHADOW_OPACITY: `var(--pt-dark-border-shadow-opacity, ${DefaultVariables.PT_DARK_BORDER_SHADOW_OPACITY})`,\n\tPT_DARK_DROP_SHADOW_OPACITY: `var(--pt-dark-drop-shadow-opacity, ${DefaultVariables.PT_DARK_DROP_SHADOW_OPACITY})`,\n\tPT_ELEVATION_SHADOW_0: `var(--pt-elevation-shadow-0, ${DefaultVariables.PT_ELEVATION_SHADOW_0})`,\n\tPT_ELEVATION_SHADOW_1: `var(--pt-elevation-shadow-1, ${DefaultVariables.PT_ELEVATION_SHADOW_1})`,\n\tPT_ELEVATION_SHADOW_2: `var(--pt-elevation-shadow-2, ${DefaultVariables.PT_ELEVATION_SHADOW_2})`,\n\tPT_ELEVATION_SHADOW_3: `var(--pt-elevation-shadow-3, ${DefaultVariables.PT_ELEVATION_SHADOW_3})`,\n\tPT_ELEVATION_SHADOW_4: `var(--pt-elevation-shadow-4, ${DefaultVariables.PT_ELEVATION_SHADOW_4})`,\n\tPT_DARK_ELEVATION_SHADOW_0: `var(--pt-dark-elevation-shadow-0, ${DefaultVariables.PT_DARK_ELEVATION_SHADOW_0})`,\n\tPT_DARK_ELEVATION_SHADOW_1: `var(--pt-dark-elevation-shadow-1, ${DefaultVariables.PT_DARK_ELEVATION_SHADOW_1})`,\n\tPT_DARK_ELEVATION_SHADOW_2: `var(--pt-dark-elevation-shadow-2, ${DefaultVariables.PT_DARK_ELEVATION_SHADOW_2})`,\n\tPT_DARK_ELEVATION_SHADOW_3: `var(--pt-dark-elevation-shadow-3, ${DefaultVariables.PT_DARK_ELEVATION_SHADOW_3})`,\n\tPT_DARK_ELEVATION_SHADOW_4: `var(--pt-dark-elevation-shadow-4, ${DefaultVariables.PT_DARK_ELEVATION_SHADOW_4})`,\n\tPT_TRANSITION_EASE: `var(--pt-transition-ease, ${DefaultVariables.PT_TRANSITION_EASE})`,\n\tPT_TRANSITION_EASE_BOUNCE: `var(--pt-transition-ease-bounce, ${DefaultVariables.PT_TRANSITION_EASE_BOUNCE})`,\n\tPT_TRANSITION_DURATION: `var(--pt-transition-duration, ${DefaultVariables.PT_TRANSITION_DURATION})`,\n\tPT_INPUT_BOX_SHADOW: `var(--pt-input-box-shadow, ${DefaultVariables.PT_INPUT_BOX_SHADOW})`,\n\tPT_DIALOG_BOX_SHADOW: `var(--pt-dialog-box-shadow, ${DefaultVariables.PT_DIALOG_BOX_SHADOW})`,\n\tPT_POPOVER_BOX_SHADOW: `var(--pt-popover-box-shadow, ${DefaultVariables.PT_POPOVER_BOX_SHADOW})`,\n\tPT_TOOLTIP_BOX_SHADOW: `var(--pt-tooltip-box-shadow, ${DefaultVariables.PT_TOOLTIP_BOX_SHADOW})`,\n\tPT_DARK_INPUT_BOX_SHADOW: `var(--pt-dark-input-box-shadow, ${DefaultVariables.PT_DARK_INPUT_BOX_SHADOW})`,\n\tPT_DARK_DIALOG_BOX_SHADOW: `var(--pt-dark-dialog-box-shadow, ${DefaultVariables.PT_DARK_DIALOG_BOX_SHADOW})`,\n\tPT_DARK_POPOVER_BOX_SHADOW: `var(--pt-dark-popover-box-shadow, ${DefaultVariables.PT_DARK_POPOVER_BOX_SHADOW})`,\n\tPT_DARK_TOOLTIP_BOX_SHADOW: `var(--pt-dark-tooltip-box-shadow, ${DefaultVariables.PT_DARK_TOOLTIP_BOX_SHADOW})`,\n}\n","/** @jsx jsx */\nimport { useEffect, useState } from 'react';\nimport { css, jsx } from '@emotion/react';\nimport { Button, Classes, InputGroup, Intent, Spinner } from '@blueprintjs/core';\nimport { ColorAliases } from 'styles/variables';\nimport logo from '../../images/Serberus.svg';\n\n/**\n *\n * @param {JSX.Element} Title\n * @param {function} authenticate\n * @param {string} error\n * @param {boolean} isLoading\n * @returns {JSX.Element}\n * @constructor\n */\nexport const LoginScreen = ({\n\ttitle: Title,\n\tauthenticate,\n\terror,\n\tanonymous = false,\n\tprojectLogo = null,\n\tprojectLogoStyle = null,\n}) => {\n\tconst [userName, setUserName] = useState('');\n\tconst [password, setPassword] = useState('');\n\tconst [localError, setLocalError] = useState(error);\n\tconst [localLoading, setLocalLoading] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetLocalLoading(false);\n\t\tsetLocalError(error);\n\t}, [error]);\n\n\tconst onKeyDown = (event) => {\n\t\tif (event.keyCode === 13) {\n\t\t\tonClick();\n\t\t}\n\t};\n\n\tconst onClick = () => {\n\t\tif (userName && password) {\n\t\t\tsetLocalLoading(true);\n\t\t\tauthenticate(userName, password);\n\t\t\tsetPassword('');\n\t\t}\n\t};\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t{localLoading ? (\n\t\t\t\t\t<Loading />\n\t\t\t\t) : localError ? (\n\t\t\t\t\t<LocalError localError={localError} password={password} setLocalError={setLocalError} userName={userName} />\n\t\t\t\t) : (\n\t\t\t\t\t<UserPass\n\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\tuserName={userName}\n\t\t\t\t\t\tpassword={password}\n\t\t\t\t\t\tsetUserName={setUserName}\n\t\t\t\t\t\tsetPassword={setPassword}\n\t\t\t\t\t\tonClick={onClick}\n\t\t\t\t\t\tanonymous={anonymous}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst LocalError = ({ localError, setLocalError }) => {\n\treturn (\n\t\t<div css={userpass}>\n\t\t\t<div cy-test=\"login-failed\" css={failedStyle}>\n\t\t\t\t<div>Login Failed</div>\n\t\t\t\t<div>{localError.message}</div>\n\t\t\t</div>\n\t\t\t<Button onClick={() => setLocalError(null)} intent={Intent.DANGER} fill={true}>\n\t\t\t\tRetry\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n\nconst UserPass = ({ onKeyDown, setUserName, userName, setPassword, password, onClick, anonymous }) => {\n\tif (anonymous) {\n\t\tsetUserName('demo');\n\t\tsetPassword('demo');\n\t\tonClick();\n\t}\n\treturn (\n\t\t<div css={userpass}>\n\t\t\t<InputGroup\n\t\t\t\tcy-test=\"username\"\n\t\t\t\tclassName={Classes.FILL}\n\t\t\t\tleftIcon=\"user\"\n\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\tonChange={(event) => setUserName(event.target.value)}\n\t\t\t\tname=\"username\"\n\t\t\t\tplaceholder=\"Username\"\n\t\t\t\tvalue={userName}\n\t\t\t\tautoFocus\n\t\t\t/>\n\t\t\t<InputGroup\n\t\t\t\tcy-test=\"password\"\n\t\t\t\tclassName={Classes.FILL}\n\t\t\t\tleftIcon=\"lock\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tname=\"password\"\n\t\t\t\tplaceholder=\"Password\"\n\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\tonChange={(event) => setPassword(event.target.value)}\n\t\t\t\tvalue={password}\n\t\t\t/>\n\t\t\t<Button\n\t\t\t\tcy-test=\"login-btn\"\n\t\t\t\tonClick={onClick}\n\t\t\t\tdisabled={!userName || !password}\n\t\t\t\tintent={Intent.PRIMARY}\n\t\t\t\tfill={true}\n\t\t\t>\n\t\t\t\tLogin\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n\nconst Loading = () => {\n\treturn <Spinner />;\n};\n\nconst container = css`\n\tdisplay: flex;\n\tbackground-color: ${ColorAliases.PT_INTENT_PRIMARY};\n`;\n\nconst titleStyle = css`\n\ttext-align: center;\n\tflex: 0 0 auto;\n\tpadding-bottom: 40px;\n`;\n\nconst userpass = css`\n\tflex: 0 0 auto;\n\twidth: 285px;\n`;\n\nconst failedStyle = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\n\tfont-size: 2.5rem;\n\tfont-weight: bold;\n\tcolor: ${ColorAliases.PT_INTENT_DANGER};\n\n\tdiv:last-of-type {\n\t\tfont-weight: lighter;\n\t\tfont-size: 1.5rem;\n\t}\n`;\n\nconst defaultLogoStyle = css`\n\tposition: absolute;\n\tleft: 20%;\n\ttop: 25%;\n\twidth: 60%;\n\topacity: 0.2;\n`;\n\nconst login = css`\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\twidth: 400px;\n\theight: 100%;\n\tmargin: auto;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\n\tdiv {\n\t\tmargin-bottom: 10px;\n\t}\n`;\n","var img = \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='64' height='38' viewBox='0 0 64 38'%3e %3cdefs%3e %3clinearGradient id='linear-gradient' x1='0.5' x2='0.5' y2='1' gradientUnits='objectBoundingBox'%3e %3cstop offset='0' stop-color='%23dedede'/%3e %3cstop offset='1' stop-color='%23b9b9b9'/%3e %3c/linearGradient%3e %3clinearGradient id='linear-gradient-4' x1='0.5' x2='0.5' y2='1' gradientUnits='objectBoundingBox'%3e %3cstop offset='0' stop-color='%23acacac'/%3e %3cstop offset='1' stop-color='%236b6b6b'/%3e %3c/linearGradient%3e %3clinearGradient id='linear-gradient-9' x1='1' x2='0.094' y2='0.839' xlink:href='%23linear-gradient-4'/%3e %3clinearGradient id='linear-gradient-15' x1='0' x2='0.906' y2='0.839' xlink:href='%23linear-gradient-4'/%3e %3cclipPath id='clip-Serberus'%3e %3crect width='64' height='38'/%3e %3c/clipPath%3e %3c/defs%3e %3cg id='Serberus' clip-path='url(%23clip-Serberus)'%3e %3crect width='64' height='38' fill='transparent'/%3e %3cg id='Group_102' data-name='Group 102'%3e %3cpath id='Path_145' data-name='Path 145' d='M8678%2c16054h4l10-4-5%2c8%2c3%2c7-3%2c4-5%2c13-4%2c2Zm-4%2c28-5-13-3-4%2c3-7-5-8%2c10%2c4h4v30Z' transform='translate(-8646 -16050)' fill='url(%23linear-gradient)'/%3e %3cpath id='Path_137' data-name='Path 137' d='M-8656-16044l12%2c5-2%2c5%2c3%2c5%2c3%2c7-4%2c4-6%2c1-9%2c6-4-4-1-2%2c6-9v-4l5-6Z' transform='translate(8664 16049)' fill='url(%23linear-gradient)'/%3e %3cpath id='Path_143' data-name='Path 143' d='M-8648-16044l-12%2c5%2c2%2c5-3%2c5-3%2c7%2c4%2c4%2c6%2c1%2c9%2c6%2c4-4%2c1-2-6-9v-4l-5-6Z' transform='translate(8704 16049)' fill='url(%23linear-gradient)'/%3e %3c/g%3e %3cg id='Group_101' data-name='Group 101' transform='translate(0 -1)'%3e %3cpath id='Path_144' data-name='Path 144' d='M8668%2c16050l4%2c1-4%2c2Zm-4%2c1%2c4-1v3Z' transform='translate(-8636 -16018)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_133' data-name='Path 133' d='M-8634.492-16032v2.448L-8640-16033Z' transform='translate(8663.492 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_134' data-name='Path 134' d='M-8644-16034l3%2c4%2c5%2c13%2c1-11Z' transform='translate(8664 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_135' data-name='Path 135' d='M-8646-16049l5%2c8%2c1.5-1.5Z' transform='translate(8664 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_138' data-name='Path 138' d='M-8656-16044l6%2c6-3%2c2Z' transform='translate(8664 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_139' data-name='Path 139' d='M-8658-16026v-2.542l5-.882Z' transform='translate(8664 16050)' fill='url(%23linear-gradient-9)'/%3e %3cpath id='Path_140' data-name='Path 140' d='M-8643-16029l3%2c7-4%2c4-6%2c1-9%2c6-4-4%2c5-4%2c11-6-5-1.463Z' transform='translate(8664 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_133-2' data-name='Path 133' d='M-8640-16032v2.448l5.508-3.448Z' transform='translate(8675 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_134-2' data-name='Path 134' d='M-8635-16034l-3%2c4-5%2c13-1-11Z' transform='translate(8679 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_135-2' data-name='Path 135' d='M-8639.5-16049l-5%2c8-1.5-1.5Z' transform='translate(8685.5 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_138-2' data-name='Path 138' d='M-8650-16044l-6%2c6%2c3%2c2Z' transform='translate(8706 16050)' fill='url(%23linear-gradient-4)'/%3e %3cpath id='Path_139-2' data-name='Path 139' d='M-8653-16026v-2.542l-5-.882Z' transform='translate(8711 16050)' fill='url(%23linear-gradient-15)'/%3e %3cpath id='Path_140-2' data-name='Path 140' d='M-8660-16029l-3%2c7%2c4%2c4%2c6%2c1%2c9%2c6%2c4-4-5-4-11-6%2c5-1.463Z' transform='translate(8703 16050)' fill='url(%23linear-gradient-4)'/%3e %3c/g%3e %3c/g%3e%3c/svg%3e\";\n export default img;","import React from 'react';\nimport * as d3 from 'd3';\nimport { widgetConfigurationProps, dimensionsProps } from \"./interfaces\"; \n\n/**\n * Sample Widget to work out and test layouts, resizing, and properties\n *\n * @param dimensions\n * @param data\n * @param backgroundColor\n * @returns {*}\n * @constructor\n */\nexport const TestWidget: React.FC<TestWidgetProps> = ({ dimensions, data, title, backgroundColor }) => {\n return (\n <svg width={dimensions.width} height={dimensions.height} style={{ background: backgroundColor }}>\n {data.map((label, i) => {\n const details = {\n x: Math.random() * dimensions.width,\n y: Math.random() * dimensions.height,\n fontSize: Math.random() * 10 + 10,\n color: d3.interpolateMagma(i / data.length),\n rotate: Math.random() * 360,\n };\n return (\n <text key={i}\n x={details.x}\n y={details.y}\n fill={details.color}\n transform={`rotate(${details.rotate} ${details.x} ${details.y})`}\n style={{\n fontSize: `${details.fontSize}px`,\n textAnchor: 'middle',\n dominantBaseline: 'central',\n }}\n >\n {label}\n </text>\n );\n })}\n </svg>\n );\n};\n\n\ninterface TestWidgetProps {\n data: number[]\n backgroundColor: string,\n title: string,\n dimensions: dimensionsProps\n}","import { Position } from '@blueprintjs/core';\nimport { extent, select, sum } from 'd3';\nimport isString from 'lodash-es/isString';\nimport ceil from 'lodash-es/ceil';\nimport numeral from 'numeral';\nimport { GenericObject } from 'interfaces/GenericObject';\n\n/**\n * Returns a consistent scientific notation format for strings, ints, and doubles\n * @param value\n * @param useScientificNotation\n */\nexport const formatValueScientificNotation = (value) => {\n\tconst useScientificNotation = value < 0.1;\n\treturn useScientificNotation ? numeral(value).format('0.0e+0') : formatValue(value);\n};\n\n/**\n * Returns a consistent format for strings, ints, and doubles\n * @param value\n */\nexport const formatValue = (value) => {\n\tif (isString(value)) return value;\n\tif (Number.isInteger(value)) return numeral(value).format('0,0');\n\treturn numeral(value).format('0,0.0');\n};\n\n/**\n * Hard truncates a string adding '...' or the given add\n * @param str\n * @param max\n * @param add\n * @returns {string|*}\n */\nexport function truncString(str, max, add) {\n\tadd = add || '...';\n\treturn typeof str === 'string' && str.length > max + add.length ? str.substring(0, max) + add : str;\n}\n\n/**\n *\n * @param d\n * @returns {boolean|boolean}\n */\nexport const isValid = (d) => {\n\treturn !isNaN(d[0]) && !isNaN(d[1]);\n};\n\n/**\n * Transform to get back to the parents element. This helps when the <g> has a transform applied to it but we need\n * the coordinate to use outside the svg. For example, placing to Tooltip.\n *\n * @param element\n * @param svgDocument\n * @returns {function(*, *): {x, y}}\n */\nexport function makeAbsoluteContext(element, svgDocument) {\n\treturn function (x, y) {\n\t\tconst offset = svgDocument.getBoundingClientRect();\n\t\tconst matrix = element.getScreenCTM();\n\t\treturn {\n\t\t\tx: matrix.a * x + matrix.c * y + matrix.e - offset.left,\n\t\t\ty: matrix.b * x + matrix.d * y + matrix.f - offset.top,\n\t\t};\n\t};\n}\n\n/**\n * Determines the orthogonal direction based on the given angle.\n *\n * @param angle\n * @returns {string}\n */\nexport function determinePositionForAngle(angle: number = 0): Position {\n\tlet position: Position = Position.TOP;\n\n\tif (angle > Math.PI / 4 && angle < (3 * Math.PI) / 4) position = Position.RIGHT;\n\tif (angle > (3 * Math.PI) / 4 && angle < (5 * Math.PI) / 4) position = Position.BOTTOM;\n\telse if (angle > (5 * Math.PI) / 4 && angle < (7 * Math.PI) / 4) position = Position.LEFT;\n\n\treturn position;\n}\n\n/**\n * Determines a reasonable choice for the next increment to show.\n *\n * This helps when you want to have some padding on the max extent of chart values.\n *\n * @param {number} value\n * @returns {number}\n */\nexport function nextIncrement(value: number): number {\n\tconst increment = order(value);\n\n\tif (increment === 1) {\n\t\treturn 10;\n\t} else if (increment === 0.1) {\n\t\treturn 0.9;\n\t} else if (increment === 0.01) {\n\t\treturn 0.09;\n\t} else if (value < 1 && increment < 0.01 && increment > 0) {\n\t\t//Using .01 for this case (eg increment = .0001) will work well with d3's custom axis creation.\n\t\treturn 0.01 + value;\n\t} else if (value < 50) {\n\t\treturn value % 2 === 0 ? value + 2 : value + 3;\n\t} else if (increment === 10 || increment === 100) {\n\t\treturn ceil(value, -1);\n\t}\n\n\tconst digits = increment.toString().length;\n\treturn ceil(value, -(digits - 2));\n}\n\n/**\n * Determines the order of magnitude of the given value.\n *\n * @param {number} value\n * @returns {number}\n */\nexport function order(value: number): number {\n\tconst order = Math.floor(Math.log(value) / Math.LN10 + 0.000000001); // because float math sucks like that\n\treturn Math.pow(10, order);\n}\n\nexport interface PropertyHierarchyData {\n\tcount: number;\n\tfullSize: number;\n\tpageSize: number;\n\tvalue: number;\n\tentries: KeyCountValue[];\n\tkeys: string[][];\n}\n\nexport interface KeyCountValue {\n\tkey: string;\n\tcount: number;\n\tvalue: number;\n\tmetadata?: GenericObject<string>;\n\tchildren?: KeyCountValue[];\n}\n\nexport interface Stacks {\n\tproperties: string[];\n\tkeys: string[];\n\textent: [number, number];\n\trolled: KeyValuePair[];\n\tdata: LabelValue[];\n\tcolorPropertyMap?: Record<string, string | number>;\n}\n\nexport interface KeyValuePair {\n\tkey: string;\n\tvalue: number;\n}\n\nexport interface LabelValue {\n\tlabel: string;\n\tvalue: number;\n\tcolor?: string | number;\n}\n\n/**\n * For use in stacked layouts\n *\n * need as {label:value, key1: value, key2: value}\n * @param {PropertyHierarchyData} data\n * @returns {Stacks}\n */\nexport function convertToStacks(data: PropertyHierarchyData): Stacks {\n\tconst keySet = new Set();\n\n\tconst entries = data.entries.map((entry) => {\n\t\tconst e = {\n\t\t\tlabel: entry.key,\n\t\t\tvalue: entry.value,\n\t\t};\n\t\tif(entry.hasOwnProperty(\"metadata\")) {\n\t\t\t//@ts-ignore\n\t\t\te.metadata = entry.metadata;\n\t\t}\n\n\t\tif (entry.children) {\n\t\t\tentry.children.forEach((child) => {\n\t\t\t\te[child.key] = child.value;\n\t\t\t\tkeySet.add(child.key);\n\t\t\t});\n\t\t} else {\n\t\t\te[e.label] = e.value;\n\t\t\tkeySet.add(e.label);\n\t\t}\n\t\treturn e;\n\t});\n\n\tconst properties = data.entries.map((d) => d.key);\n\tconst keys = Array.isArray(data.keys[1]) ? data.keys[1] : data.keys[0];\n\n\t// sum up each of the keys in the data to give the totals for each key (for the legend)\n\tlet rolled = keys.map((key) => {\n\t\treturn {\n\t\t\tkey: key,\n\t\t\tvalue: sum(entries, (d) => d[key]?.value ?? 0),\n\t\t};\n\t});\n\n\treturn {\n\t\tdata: entries,\n\t\tproperties,\n\t\tkeys,\n\t\textent: extent(entries, (d) => d.value),\n\t\trolled,\n\t};\n}\n\n/**\n * Possible aggregation values\n *\n * @type {({label: string, value: string}|{label: string, value: string})[]}\n */\nexport const AGGREGATION_METHOD_VALUES = [\n\t{\n\t\tlabel: 'Default',\n\t\tvalue: 'default',\n\t},\n\t{\n\t\tlabel: 'Sum',\n\t\tvalue: 'sum',\n\t},\n\t{\n\t\tlabel: 'Average',\n\t\tvalue: 'average',\n\t},\n];\n\n/**\n * Possible sort values\n *\n * @type {({label: string, value: string}|{label: string, value: string})[]}\n */\nexport const SORT_VALUES = [\n\t{\n\t\tlabel: 'Default',\n\t\tvalue: 'default',\n\t},\n\t{\n\t\tlabel: 'Count',\n\t\tvalue: 'count',\n\t},\n\t{\n\t\tlabel: 'Alphabetical',\n\t\tvalue: 'alphabetical',\n\t},\n\t{\n\t\tlabel: 'Computed Value',\n\t\tvalue: 'value',\n\t},\n\t{\n\t\tlabel: 'Ordinal',\n\t\tvalue: 'ordinal',\n\t},\n];\n\n/**\n * Possible Orientation Values\n * @type {({label: string, value: string}|{label: string, value: string}|{label: string, value: string})[]}\n */\nexport const ORIENTATION_VALUES = [\n\t{\n\t\tlabel: 'Horizontal',\n\t\tvalue: 'horizontal',\n\t},\n\t{\n\t\tlabel: 'Vertical',\n\t\tvalue: 'vertical',\n\t},\n\t{\n\t\tlabel: 'Auto',\n\t\tvalue: 'auto',\n\t},\n];\n\nexport const SORT_DIRECTIONS = [\n\t{\n\t\tlabel: 'Ascending',\n\t\tvalue: 'ascending',\n\t},\n\t{\n\t\tlabel: 'Descending',\n\t\tvalue: 'descending',\n\t},\n];\n\n/**\n * The hook for changing widget configs uses JSON.parse/stringify\n * so the value cannot be a function and needs to be looked up later\n * instead.\n */\nexport const SCALING_FUNCTIONS = [\n\t{\n\t\tvalue:\"noScale\",\n\t\tlabel: \"None\",\n\t\tf:(v:number) => v,\n\t},\n\t{\n\t\tvalue:\"log\",\n\t\tlabel: \"Logarithm\",\n\t\tf:Math.log,\n\t},\n\t{\n\t\tvalue:\"sqrt\",\n\t\tlabel: \"Square Root\",\n\t\tf:Math.sqrt,\n\t},\n]\n\nexport const FONT_FAMILIES = [\n\t{\n\t\tlabel:\"Times\",\n\t\tvalue:\"Times\"\n\t},\n\t{\n\t\tlabel:\"Arial\",\n\t\tvalue:\"Arial\"\n\t},\n\t{\n\t\tlabel:\"Helvetica\",\n\t\tvalue:\"Helvetica\"\n\t},\n\t{\n\t\tlabel:\"American Typewriter\",\n\t\tvalue:\"American Typewriter\"\n\t},\n\t{\n\t\tlabel:\"Andale Mono\",\n\t\tvalue:\"Andale Mono\"\n\t},\n\t{\n\t\tlabel:\"Courier New\",\n\t\tvalue:\"Courier New\"\n\t},\n\t{\n\t\tlabel:\"Monospace\",\n\t\tvalue:\"monospace\"\n\t},\n\t{\n\t\tlabel:\"Apple Chancery\",\n\t\tvalue:\"Apple Chancery\"\n\t},\n\t{\n\t\tlabel:\"Snell Roundhand\",\n\t\tvalue:\"Snell Roundhand\"\n\t},\n\t{\n\t\tlabel:\"Impact\",\n\t\tvalue:\"Impact\"\n\t},\n\t\n]\n\nexport const NO_DATA_MESSAGE = \"Unable to find data with the current parameters. Could you make another selection?\"\n\n\n\nconst canvas = document.createElement('canvas');\nconst context = canvas.getContext('2d');\n//This function checks if a word is longer than supplied width, and shrinks it till it fits\n//https://stackoverflow.com/a/27723752/\n//The original solution called getComputedTextLength which turned out to be very slow when called a lot (which was the case)\n// use canvas to measure seems to be faster\n// https://stackoverflow.com/a/35373030/\nexport function fitLabelWidth(fontSize: number, fontFace: string, checkWidth: (textLength: number) => boolean): () => void {\n\treturn function(): void {\n\t\tlet self = select(this);\n\t\tlet text = self.text();\n\t\tcontext.font = fontSize + 'px ' + fontFace;\n\t\tlet textLength = context.measureText(text).width;\n\t\t//here we just want to see if the text is longer than the supplied width, so setting maxText to a high number is ok.\n\t\twhile (checkWidth(textLength) && text.length > 0) {\n\t\t\ttext = text.slice(0, -1);\n\t\t\ttextLength = context.measureText(text + '...').width;\n\t\t}\n\t\tif(self.text() !== text) //for case when no label fits in the space, no need for ellipses\n\t\t\tself.text(text + '...');\n\t};\n}\n","import React, { useMemo } from 'react';\nimport { TestWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\n\nimport { widgetConfigurationProps, dimensionsProps } from \"./interfaces\"; \nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the Test Widget.\n *\n * FIXME: Currently does that thing where it won't allow the parent to shrink.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param noDataMessage\n * @returns {*}\n * @constructor\n */\nexport const TestWidgetWrapper: React.FC<TestWidgetWrapperProps> = ({\n\twidgetConfiguration = { backgroundColor: 'dodgerblue', title: 'Test' },\n\tdimensions,\n\tdata,\n\tnoDataMessage=NO_DATA_MESSAGE,\n}) => {\n\tconst convertedData = useMemo(() => {\n\t\treturn data?.entries?.map(value => value.value);\n\t}, [data]);\n\n\tif (!(\"backgroundColor\" in Object.keys(widgetConfiguration))) {\n\t\twidgetConfiguration.backgroundColor = 'dodgerblue';\n\t}\n\n\t//If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn (convertedData && Object.keys(convertedData).length > 0) ? (\n\t\t<TestWidget\n\t\t\tdata={convertedData}\n\t\t\tdimensions={dimensions}\n\t\t\tbackgroundColor={widgetConfiguration.backgroundColor}\n\t\t\ttitle={widgetConfiguration.title}\n\t\t/>\n\t) : (\n\t\t<NonIdealState\n\t\t\ttitle=\"No Data Found\"\n\t\t\ticon=\"graph-remove\"\n\t\t\tdescription={noDataMessage}\n\t\t/>\n\t);\n}\n\ninterface TestWidgetWrapperProps {\n\tdata: {\n\t\tfullSize: number,\n\t\tcount: number,\n\t\tentries: {\n\t\t\tkey: string,\n\t\t\tcount: number,\n\t\t\tvalue: number,\n\t\t\tchildren: {\n\t\t\t\tkey: string,\n\t\t\t\tcount: number,\n\t\t\t\tvalue: number\n\t\t\t}[]\n\t\t}[],\n\t\tkeys: string[][],\n\t\tpageSize: number,\n\t\tvalue: number\n\t},\n\twidgetConfiguration: widgetConfigurationProps,\n\tdimensions: dimensionsProps,\n\tnoDataMessage: string,\n}","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { MenuItem } from '@blueprintjs/core';\n\nexport const filterItem = (query, facet, _index, exactMatch) => {\n\tconst normalizedTitle = facet.toLowerCase();\n\tconst normalizedQuery = query.toLowerCase();\n\n\tif (exactMatch) {\n\t\treturn normalizedTitle === normalizedQuery;\n\t} else {\n\t\treturn normalizedTitle.indexOf(normalizedQuery) >= 0;\n\t}\n};\n\nexport const textItemRenderer = optionToString => (item, { handleClick, modifiers, index }) => {\n\tif (!modifiers.matchesPredicate) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<MenuItem\n\t\t\tkey={index}\n\t\t\tactive={modifiers.active}\n\t\t\tdisabled={modifiers.disabled}\n\t\t\tonClick={handleClick}\n\t\t\ttext={optionToString(item)}\n\t\t/>\n\t);\n};\n\nexport const textItemFilterer = optionsToString => (query, rawFacet, _index, exactMatch) => {\n\tconst facet = optionsToString(rawFacet);\n\tconst normalizedTitle = facet.toLowerCase();\n\tconst normalizedQuery = query.toLowerCase();\n\n\tif (exactMatch) {\n\t\treturn normalizedTitle === normalizedQuery;\n\t} else {\n\t\treturn normalizedTitle.indexOf(normalizedQuery) >= 0;\n\t}\n};\n\nexport const textItemStyles = css`\n /* font-weight: bold; */\n .bp3-icon.bp3-icon-select:first-of-type {\n margin: 0;\n }\n`;\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React from 'react';\nimport { Select } from '@blueprintjs/select';\nimport { Button, Classes, MenuItem } from '@blueprintjs/core';\nimport { PropTypes } from 'prop-types';\nimport { textItemFilterer, textItemRenderer, textItemStyles } from './utils';\n\n/**\n * Standardized dropdown for simple text items\n *\n * @param activeItem\n * @param onSelectionChanged\n * @param options\n * @param optionToString\n * @param emptyText\n * @param customRender\n * @param rest\n * @returns {*}\n * @constructor\n */\nexport const ObjectDropdown = ({\n\tactiveItem,\n\tonSelectionChanged,\n\toptions = [],\n\toptionToString,\n\temptyText = 'Select',\n\tcustomRender,\n\tdisabled = false,\n\t...rest\n}) => (\n\t<Select\n\t\titems={options}\n\t\titemPredicate={textItemFilterer(optionToString)}\n\t\titemRenderer={textItemRenderer(optionToString)}\n\t\tnoResults={<MenuItem disabled={true} text=\"No items.\" />}\n\t\tonItemSelect={onSelectionChanged}\n\t\tactiveItem={activeItem}\n\t\tpopoverProps={{ minimal: true }}\n\t\t{...rest}\n\t\tdisabled={disabled}\n\t>\n\t\t{customRender || (\n\t\t\t<Button\n\t\t\t\trightIcon=\"caret-down\"\n\t\t\t\tminimal\n\t\t\t\tcss={textItemStyles}\n\t\t\t\ttext={optionToString(activeItem) || emptyText}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tcy-test={rest['cy-test']}\n\t\t\t/>\n\t\t)}\n\t</Select>\n);\n\nObjectDropdown.propTypes = {\n\tactiveItem: PropTypes.oneOfType([PropTypes.object, PropTypes.string, PropTypes.number]),\n\tcustomRender: PropTypes.any,\n\temptyText: PropTypes.string,\n\tonSelectionChanged: PropTypes.func,\n\toptionToString: PropTypes.func.isRequired,\n\toptions: PropTypes.array.isRequired,\n\tdisabled: PropTypes.bool,\n};\n ","/** @jsx jsx */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React from 'react';\nimport { ObjectDropdown } from './objectDropdown';\nimport { Button, Classes } from '@blueprintjs/core';\nimport { css, jsx } from '@emotion/react';\nimport { ColorAliases, Variables as VARIABLES } from 'styles/variables';\n\n/**\n *\n * @param label\n * @param btnText\n * @param rest\n * @constructor\n */\nexport function CommonDropdownWithLabel({ label = '', btnText, ...rest }) {\n\treturn (\n\t\t<div>\n\t\t\t<span css={labelCss}>{label}</span>\n\n\t\t\t{/* @ts-ignore TODO investigate why ts-ignore is needed*/}\n\t\t\t<ObjectDropdown\n\t\t\t\tcss={dropDownCss}\n\t\t\t\tcustomRender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcy-test={rest['cy-test']}\n\t\t\t\t\t\trightIcon=\"caret-down\"\n\t\t\t\t\t\tclassName={`${Classes.MINIMAL}`}\n\t\t\t\t\t\tcss={selectBtnCss}\n\t\t\t\t\t\ttext={btnText}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t{...rest}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nconst labelCss = css`\n\tmargin-bottom: 0;\n\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\tcolor: ${ColorAliases.PT_HEADING_COLOR};\n\tfont-weight: normal;\n`;\n//To target the .popover-target would require popoverProps={{targetProps: {css : dropDownCss}}}. That doesn't work\n//because it \"stringifies\" the dropDownCss prop. This way gets us around that.\nconst dropDownCss = css`\n\t& > span {\n\t\twidth: 100%;\n\t}\n`;\nconst selectBtnCss = css`\n\tborder: 1px solid ${ColorAliases.PT_DIVIDER_BLACK};\n\tborder-radius: 3px;\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\t& .bp3-button-text {\n\t\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\t\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\t\tcolor: ${ColorAliases.PT_ICON_COLOR};\n\t\tline-height: 18px;\n\t}\n`;\n","import { useMemo } from 'react';\nimport { \n\tselectDilDefinitionByName\n\t, DILProperty\n\t, DIL\n\t, PropertyType\n\t, DILPropertyList\n\t, PropertyFlag\n } from 'srs-middleware';\n\nexport function getPropertiesOfType(DIL: DIL | string, type: PropertyType) {\n\tconst properties: DILPropertyList = getPropertyListFromDil(DIL);\n\treturn Object.values(properties).filter(property => property.type === type);\n}\n\n// Given an array of types, returns an array of properties that have 1 or more of those types\nexport function getPropertiesOfTypes(DIL: DIL | string, types: PropertyType[]) {\n\tconst properties: DILPropertyList = getPropertyListFromDil(DIL);\n\treturn Object.values(properties).filter(property => types.includes(property.type));\n}\n\n// Given a flag, returns an array of properties that have that flag\nexport function getPropertiesWithFlag(DIL: DIL | string, flag: PropertyFlag) {\n\tconst properties: DILPropertyList = getPropertyListFromDil(DIL);\n\treturn Object.values(properties).filter(property => property.flags.includes(flag));\n}\n\n// TODO: move to srs-client-middleware\n// return all of the properties\nexport function getAllProperties(DIL: DIL | string) {\n\tif (typeof DIL === 'string') DIL = selectDilDefinitionByName(DIL);\n\treturn Object.values(DIL.propertyList);\n}\n\nexport const filterProperties = (selectedDefinitionName: string\n\t, flags: PropertyFlag[] = []\n\t, types: PropertyType[] = []\n\t, allowedProperties: String[] = []\n\t, outFlags: PropertyFlag[] = []\n\t, outTypes: PropertyType[] = []\n\t): DILProperty[] => {\n\n\tconst allProperties: DILProperty[] = Object.values(selectDilDefinitionByName(selectedDefinitionName).propertyList);\n\n\tif (allowedProperties.length > 0) {\n\t\treturn allProperties.filter(prop => {\n\t\t\treturn allowedProperties.includes(prop.name)\n\t\t})\n\t} \n\t\n\n\tconst flagged: DILProperty[] =\n\t\tflags.length === 0\n\t\t\t? allProperties\n\t\t\t: allProperties.filter(property => {\n\t\t\t\t\treturn flags.some(flag => {\n\t\t\t\t\t\treturn property.flags.includes(flag);\n\t\t\t\t\t});\n\t\t\t });\n\n\tconst outFlagged: DILProperty[] =\n\t\toutFlags.length === 0\n\t\t\t? flagged\n\t\t\t: flagged.filter(property => {\n\t\t\t\t\treturn outFlags.every(flag => {\n\t\t\t\t\t\treturn !property.flags.includes(flag);\n\t\t\t\t\t});\n\t\t\t });\n\n\tconst typed: DILProperty[] =\n\t\ttypes.length === 0\n\t\t\t? outFlagged\n\t\t\t: outFlagged.filter(property => {\n\t\t\t\t\treturn types.some(type => {\n\t\t\t\t\t\treturn property.type === type;\n\t\t\t\t\t});\n\t\t\t });\n\n\treturn outTypes.length === 0\n\t\t? typed\n\t\t: typed.filter(property => {\n\t\t\t\treturn outTypes.every(type => {\n\t\t\t\t\treturn !(property.type === type)\n\t\t\t\t});\n\t\t });\n};\n\nexport const useFilteredProperties = (selectedDefinitionName: string\n\t, flags: PropertyFlag[] = []\n\t, types: PropertyType[] = []\n\t, allowedProperties: String[] = []\n\t, outFlags: PropertyFlag[] = []\n\t, outTypes: PropertyType[] = []\n\t): DILProperty[] => {\n\treturn useMemo(() => {\n\t\treturn filterProperties(selectedDefinitionName, flags, types, allowedProperties, outFlags, outTypes);\n\t}, [selectedDefinitionName, flags, types]);\n};\n\nfunction getPropertyListFromDil(DIL: DIL | string): DILPropertyList {\n\tDIL = (typeof DIL === \"string\") ? selectDilDefinitionByName(DIL) : DIL;\n\treturn DIL.propertyList;\n}","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { CommonDropdownWithLabel } from './common-dropdown-with-label';\nimport { filterProperties } from 'utilities/srsUtils';\n\nconst nullableProperty = {\n\tname: 'None',\n\tpropertyId: -1,\n};\n\nconst emptyText = 'Select a property';\n\nconst toProperty = (selectedDefinition, isNullable, toCheck) => {\n\tif (!toCheck) {\n\t\treturn isNullable ? nullableProperty : emptyText;\n\t}\n\n\tif (!toCheck.name) {\n\t\tconst name = toCheck;\n\t\treturn Object.values(selectedDefinition.propertyList)?.find((property) => property.name === name) ?? null;\n\t}\n\n\treturn toCheck;\n};\n\n/**\n *\n * @param selectedDefinition\n * @param onSelectionChanged\n * @param activeItem\n * @param flags\n * @param types\n * @param label\n * @param isNullable\n * @param rest\n * @returns {JSX.Element}\n * @constructor\n */\nexport function PropertyDropdown({\n\tselectedDefinition,\n\tonSelectionChanged,\n\tactiveItem,\n\tflags,\n\ttypes,\n\tallowedProperties,\n\tisNullable = false,\n\t...rest\n}) {\n\tconst optionToString = (x) => x?.name || x || '';\n\n\tlet filteredProperties = filterProperties(selectedDefinition.name, flags, types, allowedProperties);\n\n\tif (isNullable) {\n\t\tfilteredProperties.unshift(nullableProperty);\n\t}\n\n\tconst changeHandler = useCallback(\n\t\t(item) => {\n\t\t\tif (item.propertyId === -1) {\n\t\t\t\tonSelectionChanged(null);\n\t\t\t} else {\n\t\t\t\tonSelectionChanged(item);\n\t\t\t}\n\t\t},\n\t\t[onSelectionChanged]\n\t);\n\n\treturn (\n\t\t<CommonDropdownWithLabel\n\t\t\toptions={filteredProperties}\n\t\t\tonSelectionChanged={changeHandler}\n\t\t\tactiveItem={toProperty(selectedDefinition, isNullable, activeItem)}\n\t\t\toptionToString={optionToString}\n\t\t\temptyText={emptyText}\n\t\t\tbtnText={optionToString(toProperty(selectedDefinition, isNullable, activeItem)) || emptyText}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n\nPropertyDropdown.propTypes = {\n\tselectedDefinition: PropTypes.any,\n\tactiveItem: PropTypes.any,\n\tflags: PropTypes.any,\n\tlabel: PropTypes.string,\n\tonSelectionChanged: PropTypes.any,\n\ttypes: PropTypes.any,\n\tisNullable: PropTypes.bool,\n};\n","import { useContext, useReducer } from 'react';\nimport produce from 'immer';\nimport { WorkspaceContext } from '../views/workspace/workspaceContext';\n\n// idk why I can't import this?? possibly a circular dependency or build config issue\nexport function getPropertiesOfType(DIL, type) {\n\tif (!DIL) return [];\n\n\tconst { propertyList: properties } = DIL;\n\t// @ts-ignore\n\treturn Object.values(properties).filter((property) => property.type === type);\n}\n\nexport function useWorkspaceState() {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\treturn [state, dispatch];\n}\n\n/**\n * Creates a default card appropriate for the given card index.\n * @param cardIndex\n * @param widgets\n * @param selectedDefinitionName\n * @returns {{endpointQuery: null, type: *}}\n */\nconst createDefaultCard = (cardIndex, widgets, selectedDefinitionName) => {\n\tlet widgetIndex = cardIndex % widgets.length;\n\tlet widget = widgets[widgetIndex];\n\treturn createDefaultCardForType(widget, widgets, selectedDefinitionName);\n};\n\n/**\n * Creates a default card for the given widget\n * @param widget\n * @param widgets\n * @param selectedDefinitionName\n * @returns {{endpointQuery: null, type: *}}\n */\nconst createDefaultCardForType = (widget, widgets, selectedDefinitionName) => {\n\tlet card = {\n\t\ttype: widget.key,\n\t\tendpointQuery: null,\n\t\twidgetConfiguration: null,\n\t};\n\n\tlet widgetConfigurations = widget['configurations'][selectedDefinitionName];\n\tif (widgetConfigurations) {\n\t\tlet widgetConfiguration = widgetConfigurations.default;\n\t\tif (widgetConfiguration) {\n\t\t\tcard.endpointQuery = widgetConfiguration.endpointQuery;\n\t\t\tcard.widgetConfiguration = widgetConfiguration.widgetConfiguration;\n\t\t}\n\t}\n\n\treturn card;\n};\n\nconst reducer = produce((draft, action) => {\n\t// eslint-disable-next-line no-console\n\t// uncomment above for useful debugging output.\n\tswitch (action.type) {\n\t\tcase WorkspaceActions.CREATE_NEW_EXPLORER: {\n\t\t\t// This can be configurable if we need it\n\t\t\tlet explorer = {\n\t\t\t\tlayoutStyle: {\n\t\t\t\t\tkey: 'ONE',\n\t\t\t\t\tcardCount: 1,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// determine how many cards we should have based on layoutStyle and create a new card for each\n\t\t\texplorer.cards = [];\n\t\t\tfor (let i = 0; i < explorer.layoutStyle.cardCount; i++) {\n\t\t\t\texplorer.cards[i] = createDefaultCard(i, draft.transient.widgets, draft.explorer.selectedDefinitionName);\n\t\t\t}\n\t\t\tdraft.explorer.layout = explorer;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_SELECTED_DEFINITION: {\n\t\t\tconst { newDefinition } = action.payload;\n\t\t\tdraft.explorer.selectedDefinitionName = newDefinition && newDefinition.name;\n\t\t\tdraft.explorer.metaData = undefined;\n\n\t\t\t// create a new card because the properties will be different\n\t\t\tif (draft && draft.explorer.layout && draft.explorer.layout.cards) {\n\t\t\t\tdraft.explorer.layout.cards = draft.explorer.layout.cards.map((card) => {\n\t\t\t\t\tconst widget = draft.transient.widgets.find((c) => c.key === card.type) ?? draft.transient.widgets[0];\n\n\t\t\t\t\treturn createDefaultCardForType(widget, draft.transient.widgets, newDefinition.name);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Reset the filters\n\t\t\tdraft.explorer.filters = {};\n\t\t\tdraft.transient.queryStrings = {};\n\t\t\tdraft.transient.filters = {};\n\n\t\t\t// Reset results\n\t\t\tdraft.transient.rootResult = null;\n\t\t\tdraft.transient.activeResult = null;\n\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_RESULT: {\n\t\t\tconst { result, rootResult } = action.payload;\n\t\t\tdraft.transient.activeResult = result;\n\t\t\tdraft.transient.rootResult = rootResult;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_EXPLORER_LAYOUT: {\n\t\t\tlet { payload } = action.payload;\n\t\t\tdraft.explorer.layout.layoutStyle = payload;\n\n\t\t\t// check card count, if too many then remove, if too few create\n\t\t\tlet cards = draft.explorer.layout.cards;\n\t\t\tif (payload.cardCount < cards.length) {\n\t\t\t\tcards.splice(payload.cardCount);\n\t\t\t} else if (payload.cardCount > cards.length) {\n\t\t\t\tfor (let i = cards.length; i < payload.cardCount; i++) {\n\t\t\t\t\tcards[i] = createDefaultCard(i, draft.transient.widgets, draft.explorer.selectedDefinitionName);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.MAXIMIZE_WIDGET: {\n\t\t\t// TODO: Not sure if this is extensible\n\t\t\tdraft.explorer.layout.layoutStyle = { cardCount: 1, key: 'ONE' };\n\n\t\t\t// check card count, if too many then remove, if too few create\n\t\t\tlet cards = draft.explorer.layout.cards;\n\t\t\tif (cards.length !== 1) {\n\t\t\t\tcards.splice(0, cards.length, cards[action.payload]);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_EXPLORER_CARD: {\n\t\t\tconst { cardIndex, newCard } = action.payload;\n\t\t\tdraft.explorer.layout.cards[cardIndex] = newCard;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_WIDGET_CONFIGURATION: {\n\t\t\tconst { cardIndex, configuration } = action.payload;\n\t\t\tdraft.explorer.layout.cards[cardIndex].widgetConfiguration = configuration;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_EXPLORER_CARD_WIDGET: {\n\t\t\tconst { cardIndex, payload } = action.payload;\n\t\t\tconst widget = draft.transient.widgets.find((c) => c.key === payload);\n\t\t\tdraft.explorer.layout.cards[cardIndex] = createDefaultCardForType(\n\t\t\t\twidget,\n\t\t\t\tdraft.transient.widgets,\n\t\t\t\tdraft.explorer.selectedDefinitionName\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_EXPLORER_CARD_ACTIONS: {\n\t\t\tconst { cardIndex, actions } = action.payload;\n\t\t\tdraft.explorer.layout.cards[cardIndex].actions = actions;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.PATCH_EXPLORER_CARD_ENDPOINT_PARAMETERS: {\n\t\t\tconst { cardIndex, parameters } = action.payload;\n\t\t\tdraft.explorer.layout.cards[cardIndex].endpointQuery.options.parameters = {\n\t\t\t\t...draft.explorer.layout.cards[cardIndex].endpointQuery.options.parameters,\n\t\t\t\t...parameters,\n\t\t\t};\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_EXPLORER_CARD_ENDPOINT_OPTIONS: {\n\t\t\tconst { cardIndex, payload } = action.payload;\n\t\t\tdraft.explorer.layout.cards[cardIndex].endpointQuery = payload;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.SET_CURRENT_EXPLORER: {\n\t\t\tdraft.explorer = action.payload;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_FILTER: {\n\t\t\tconst { filterKey, filter } = action.payload;\n\t\t\tdraft.explorer.filters[filterKey] = filter;\n\t\t\tbreak;\n\t\t}\n\t\t// React batches non-async programmatic state changes which can lead to some\n\t\t// changes overriding each other. Use this to make updates based on previous\n\t\t// state (not out of date closures).\n\t\tcase WorkspaceActions.UPDATE_FILTER_CALLBACK: {\n\t\t\tconst { filterKey, callback } = action.payload;\n\t\t\tconst currentFilters = draft.explorer.filters[filterKey];\n\t\t\tif (callback) {\n\t\t\t\tdraft.explorer.filters[filterKey] = callback(currentFilters);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_TRANSIENT_FILTER: {\n\t\t\tconst { filterKey, filter } = action.payload;\n\t\t\tdraft.transient.filters[filterKey] = filter;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_QUERY_STRING: {\n\t\t\tconst { filterKey, queryString } = action.payload;\n\t\t\tdraft.transient.queryStrings[filterKey] = queryString;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.FORCE_REFRESH: {\n\t\t\tdraft.transient.refreshTime = Date.now();\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.LOAD_SAVED_VIEW: {\n\t\t\tconst { key, payload } = action.payload;\n\t\t\tdraft.transient.activeResult = draft.transient.rootResult;\n\t\t\tdraft.transient.queryStrings = {};\n\t\t\tdraft[key] = payload;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.LOAD_EMPTY_WIDGET: {\n\t\t\tdraft.explorer.layout.cards = [];\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_VIEW_PROPERTIES: {\n\t\t\tconst { key, payload } = action.payload;\n\t\t\tdraft.explorer.views[key] = payload;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_WIDGETS: {\n\t\t\tdraft.transient.widgets = action.payload;\n\t\t\tif (draft && draft.explorer.layout && draft.explorer.layout.cards) {\n\t\t\t\t// needed for saved views to prevent reloading the explorer\n\t\t\t\tif (draft.explorer.layout.cards?.[0].widgetConfiguration) return;\n\t\t\t\tdraft.explorer.layout.cards = draft.explorer.layout.cards.map((card) => {\n\t\t\t\t\tconst widget = draft.transient.widgets.find((c) => c.key === card.type);\n\t\t\t\t\tif (widget)\n\t\t\t\t\t\treturn createDefaultCardForType(widget, draft.transient.widgets, draft.explorer.selectedDefinitionName);\n\t\t\t\t\t//if widget wasn't found it is not supported in the selectedDefinitionName so just replace it with the first available widget\n\t\t\t\t\t//(We can't just remove it bc that would require layout updates, and that could get more involved than we need to. This is a simple fix)\n\t\t\t\t\treturn createDefaultCardForType(\n\t\t\t\t\t\tdraft.transient.widgets[0],\n\t\t\t\t\t\tdraft.transient.widgets,\n\t\t\t\t\t\tdraft.explorer.selectedDefinitionName\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_META_DATA: {\n\t\t\tdraft.explorer.metaData = action.payload;\n\t\t\tbreak;\n\t\t}\n\t\tcase WorkspaceActions.UPDATE_SELECTION: {\n\t\t\tdraft.transient.selection = action.payload;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n});\n\nlet initialState = {\n\texplorer: {\n\t\tlayout: null,\n\t\tfilters: {},\n\t\tselectedDefinitionName: null,\n\t\tviews: {},\n\t},\n\ttransient: {\n\t\trootResult: null,\n\t\tactiveResult: null,\n\t\trefreshTime: Date.now(),\n\t\tfilters: {},\n\t\tqueryStrings: {},\n\t\twidgets: [],\n\t\tselection: null,\n\t},\n};\n\nexport const WorkspaceActions = {\n\tCREATE_NEW_EXPLORER: 'CREATE_NEW_EXPLORER',\n\tUPDATE_SELECTED_DEFINITION: 'UPDATE_SELECTED_DEFINITION',\n\tUPDATE_RESULT: 'UPDATE_RESULT',\n\tSET_CURRENT_EXPLORER: 'SET_CURRENT_EXPLORER',\n\tFORCE_REFRESH: 'FORCE_REFRESH',\n\tUPDATE_EXPLORER_CARD: 'UPDATE_EXPLORER_CARD',\n\tUPDATE_EXPLORER_CARD_WIDGET: 'UPDATE_EXPLORER_CARD_WIDGET',\n\tUPDATE_EXPLORER_LAYOUT: 'UPDATE_EXPLORER_LAYOUT',\n\tMAXIMIZE_WIDGET: 'MAXIMIZE_WIDGET',\n\tUPDATE_EXPLORER_CARD_ENDPOINT_OPTIONS: 'UPDATE_EXPLORER_CARD_ENDPOINT_OPTIONS',\n\tUPDATE_EXPLORER_CARD_ACTIONS: 'UPDATE_EXPLORER_CARD_ACTIONS',\n\tPATCH_EXPLORER_CARD_ENDPOINT_PARAMETERS: 'PATCH_EXPLORER_CARD_ENDPOINT_PARAMETERS',\n\tUPDATE_WIDGET_CONFIGURATION: 'UPDATE_WIDGET_CONFIGURATION',\n\tUPDATE_FILTER: 'UPDATE_FILTER',\n\tUPDATE_FILTER_CALLBACK: 'UPDATE_FILTER_CALLBACK',\n\tUPDATE_TRANSIENT_FILTER: 'UPDATE_TRANSIENT_FILTER',\n\tUPDATE_QUERY_STRING: 'UPDATE_QUERY_STRING',\n\tLOAD_SAVED_VIEW: 'LOAD_SAVED_VIEW',\n\tLOAD_EMPTY_WIDGET: 'LOAD_EMPTY_WIDGET',\n\tUPDATE_VIEW_PROPERTIES: 'UPDATE_VIEW_PROPERTIES',\n\tUPDATE_WIDGETS: 'UPDATE_WIDGETS',\n\tUPDATE_META_DATA: 'UPDATE_META_DATA',\n\tUPDATE_SELECTION: 'UPDATE_SELECTION',\n};\n\nexport const WorkspaceActionCreator = {\n\tconfiguration: (cardIndex, configuration) => ({\n\t\ttype: WorkspaceActions.UPDATE_WIDGET_CONFIGURATION,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tconfiguration,\n\t\t},\n\t}),\n\tcreateNewExplorer: () => ({\n\t\ttype: WorkspaceActions.CREATE_NEW_EXPLORER,\n\t}),\n\tupdateSelectedDefinition: (newDefinition, savedStates) => ({\n\t\ttype: WorkspaceActions.UPDATE_SELECTED_DEFINITION,\n\t\tpayload: {\n\t\t\tnewDefinition,\n\t\t\tsavedStates,\n\t\t},\n\t}),\n\tpatchParameters: (cardIndex, parameterPatch) => ({\n\t\ttype: WorkspaceActions.PATCH_EXPLORER_CARD_ENDPOINT_PARAMETERS,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tparameters: parameterPatch,\n\t\t},\n\t}),\n\toptions: (cardIndex, payload) => ({\n\t\ttype: WorkspaceActions.UPDATE_EXPLORER_CARD_ENDPOINT_OPTIONS,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tpayload,\n\t\t},\n\t}),\n\tupdateResult: (result, rootResult) => ({\n\t\ttype: WorkspaceActions.UPDATE_RESULT,\n\t\tpayload: {\n\t\t\tresult,\n\t\t\trootResult,\n\t\t},\n\t}),\n\tupdateExplorerCard: (newCard, cardIndex) => ({\n\t\ttype: WorkspaceActions.UPDATE_EXPLORER_CARD,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tnewCard,\n\t\t},\n\t}),\n\tupdateExplorerLayout: (payload, savedStates) => ({\n\t\ttype: WorkspaceActions.UPDATE_EXPLORER_LAYOUT,\n\t\tpayload: {\n\t\t\tpayload,\n\t\t\tsavedStates,\n\t\t},\n\t}),\n\tupdateExplorerCardWidget: (cardIndex, payload, savedStates) => ({\n\t\ttype: WorkspaceActions.UPDATE_EXPLORER_CARD_WIDGET,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tpayload,\n\t\t\tsavedStates,\n\t\t},\n\t}),\n\tupdateExplorerCardActions: (cardIndex, actions) => ({\n\t\ttype: WorkspaceActions.UPDATE_EXPLORER_CARD_ACTIONS,\n\t\tpayload: {\n\t\t\tcardIndex,\n\t\t\tactions,\n\t\t},\n\t}),\n\tsetCurrentExplorer: (explorerKey, selectedDefinitionName) => ({\n\t\ttype: WorkspaceActions.SET_CURRENT_EXPLORER,\n\t\tpayload: {\n\t\t\texplorerKey,\n\t\t\tselectedDefinitionName,\n\t\t},\n\t}),\n\tmaximizeWidget: (cardIndex) => ({\n\t\ttype: WorkspaceActions.MAXIMIZE_WIDGET,\n\t\tpayload: cardIndex,\n\t}),\n\tupdateFilter: (filterKey, filter) => ({\n\t\ttype: WorkspaceActions.UPDATE_FILTER,\n\t\tpayload: {\n\t\t\tfilterKey,\n\t\t\tfilter,\n\t\t},\n\t}),\n\tupdateFilterCallback: (filterKey, callback) => ({\n\t\ttype: WorkspaceActions.UPDATE_FILTER_CALLBACK,\n\t\tpayload: {\n\t\t\tfilterKey,\n\t\t\tcallback,\n\t\t},\n\t}),\n\tupdateTransientFilter: (filterKey, filter) => ({\n\t\ttype: WorkspaceActions.UPDATE_TRANSIENT_FILTER,\n\t\tpayload: {\n\t\t\tfilterKey,\n\t\t\tfilter,\n\t\t},\n\t}),\n\tupdateQueryString: (filterKey, queryString) => ({\n\t\ttype: WorkspaceActions.UPDATE_QUERY_STRING,\n\t\tpayload: {\n\t\t\tfilterKey,\n\t\t\tqueryString,\n\t\t},\n\t}),\n\tforceRefresh: () => ({\n\t\ttype: WorkspaceActions.FORCE_REFRESH,\n\t}),\n\tloadSavedView: (key, payload) => ({\n\t\ttype: WorkspaceActions.LOAD_SAVED_VIEW,\n\t\tpayload: {\n\t\t\tkey,\n\t\t\tpayload,\n\t\t},\n\t}),\n\tloadEmptyWidget: () => ({\n\t\ttype: WorkspaceActions.LOAD_EMPTY_WIDGET,\n\t\tpayload: {},\n\t}),\n\tupdateViewProperties: (key, payload) => ({\n\t\ttype: WorkspaceActions.UPDATE_VIEW_PROPERTIES,\n\t\tpayload: {\n\t\t\tkey,\n\t\t\tpayload,\n\t\t},\n\t}),\n\tupdateWidgets: (widgets) => ({\n\t\ttype: WorkspaceActions.UPDATE_WIDGETS,\n\t\tpayload: widgets,\n\t}),\n\tupdateMetaData: (metaData) => ({\n\t\ttype: WorkspaceActions.UPDATE_META_DATA,\n\t\tpayload: metaData,\n\t}),\n\tupdateSelection: (selection) => ({\n\t\ttype: WorkspaceActions.UPDATE_SELECTION,\n\t\tpayload: selection,\n\t}),\n};\n\nexport function useIsWorkspaceAvailable() {\n\tconst context = useContext(WorkspaceContext);\n\treturn !!context;\n}\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useContext } from 'react';\nimport { PropertyDropdown } from 'components/dropdowns/propertyDropdown';\nimport { WorkspaceContext } from \"views/workspace/workspaceContext\";\nimport { WorkspaceActionCreator } from \"hooks/useWorkspaceState\";\nimport { selectDilDefinitionByName } from \"srs-middleware\";\n\nexport const PropertyListSelector = ({cardIndex, itemIndex, types, label, flags, endpointQuery, allowedProperties, isNullable = false, ...rest}) => {\n const {state: {explorer: {selectedDefinitionName}}, dispatch} = useContext(WorkspaceContext);\n\n const handlePropertySelection = (cardIndex, itemIndex, property) => {\n const newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n newEndpointQuery.options.propertyList[itemIndex] = property;\n dispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n }\n\n return (\n <PropertyDropdown\n selectedDefinition={selectDilDefinitionByName(selectedDefinitionName)}\n onSelectionChanged={(e) => handlePropertySelection(cardIndex, itemIndex, e?.name)}\n activeItem={endpointQuery?.options?.propertyList?.[itemIndex]}\n types={types}\n flags={flags}\n label={label}\n allowedProperties={allowedProperties}\n isNullable={isNullable}\n {...rest}\n />\n );\n};\n","import { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from '../endpoints';\n\nimport { TestWidgetWrapper } from './wrapper.tsx';\nimport { TestWidgetKnobs } from './knobs.jsx';\n\nexport const config = {\n\tkey: 'TEST_WIDGET',\n\tlabel: 'Test Widget',\n\ticon: 'doughnut-chart',\n\twrapper: TestWidgetWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: TestWidgetKnobs,\n\tflags: [SrsPropertyFlag.Categorical],\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {},\n\t\t\t},\n\t\t};\n\t},\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { PropertyListSelector } from '/components/selectors/propertyListSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const TestWidgetKnobs = ({ cardIndex, endpointQuery, _widgetConfiguration }) => {\n return (\n <React.Fragment>\n <PropertyListSelector\n cardIndex={cardIndex}\n itemIndex={0}\n flags={[SrsPropertyFlag.Queryable]}\n label={'Top Level Group'}\n endpointQuery={endpointQuery}\n cy-test=\"top-level-dropdown-button\"\n />\n <PropertyListSelector\n cardIndex={cardIndex}\n itemIndex={1}\n flags={[SrsPropertyFlag.Queryable]}\n label={'2nd Level Group'}\n endpointQuery={endpointQuery}\n cy-test=\"second-level-dropdown-button\"\n />\n </React.Fragment>\n );\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport * as d3 from 'd3';\n\nimport pick from 'lodash-es/pick';\nimport { primaryColor } from 'styles/colors';\n\nconst columnLabelWidth = 14;\n\nexport const ParaCord = ({ dimensions, data, onSelect, selected = [] }) => {\n\tconst svgRef = useRef(null);\n\tconst linkGroupRef = useRef(null);\n\tconst axisGroupRef = useRef(null);\n\tconst containerRef = useRef(null);\n\tconst selectionRef = useRef({ nodes: [], links: [] });\n\tconst nodesRef = useRef({ nodes: {} });\n\n\tconst { height, width } = dimensions;\n\tconst [xMargin, yMargin] = [55, 20];\n\n\tconst {\n\t\tnodes,\n\t\tlinks: { links },\n\t\tpropertyOrder,\n\t} = data;\n\n\t// scale to fill the usable space\n\tconst axisX = useMemo(\n\t\t() =>\n\t\t\td3\n\t\t\t\t.scaleLinear()\n\t\t\t\t.domain([0, propertyOrder.length - 1])\n\t\t\t\t.range([xMargin, width - xMargin]),\n\t\t[width, xMargin, propertyOrder]\n\t);\n\n\t// spread the nodes out evenly across the axis working space\n\tconst axisY = useMemo(\n\t\t() =>\n\t\t\td3\n\t\t\t\t.scaleLinear()\n\t\t\t\t.domain([0, 1])\n\t\t\t\t.range([yMargin, height - yMargin]),\n\t\t[yMargin, height]\n\t);\n\n\t// scale the opacity of the links based on count\n\t// const scaleLinkOpacity = useMemo(\n\t// () => d3.scaleLinear()\n\t// .domain([1, maxLinkCount])\n\t// .range([0.15, .6]), [maxLinkCount]);\n\t//\n\t// // scale the opacity of the links based on count\n\t// const scaleSelectedLinkOpacity = useMemo(\n\t// () => d3.scaleLinear()\n\t// .domain([1, maxLinkCount])\n\t// .range([0.45, .8]), [maxLinkCount]);\n\n\t// here we set the initial x value\n\tconst procProperties = useMemo(() => {\n\t\treturn propertyOrder.map((p, i) => {\n\t\t\tp.x = axisX(i);\n\t\t\treturn p;\n\t\t});\n\t}, [propertyOrder, axisX]);\n\n\t// TODO: Make this a util\n\tconst handleNodeClick = (node) => {\n\t\tconst n = pick(node, ['propertyKey', 'propertyIndex', 'key']);\n\t\tlet tempNodes = [];\n\t\tconst index = selected.findIndex((test) => test.propertyKey === n.propertyKey && test.key === n.key);\n\t\tif (index >= 0) {\n\t\t\tselected.splice(index, 1);\n\t\t\ttempNodes = selected;\n\t\t} else {\n\t\t\tselected.push(n);\n\t\t\ttempNodes = selected;\n\t\t}\n\n\t\tif (onSelect) onSelect([...tempNodes]);\n\t};\n\n\tuseEffect(() => {\n\t\t// store the current nodes in a ref\n\t\t// must store in a ref to ensure that the d3 calls have the correct objects\n\t\t// otherwise they get out of sync on data updates (like filtering)\n\t\tObject.values(nodes).forEach((column, i) => {\n\t\t\tconst count = Object.values(column).length;\n\t\t\tObject.values(column).forEach((node, j) => {\n\t\t\t\tnode.x = axisX(procProperties[i].index);\n\t\t\t\tnode.y = axisY((j + 1) / (count + 1));\n\t\t\t});\n\t\t});\n\t\tnodesRef.current.nodes = nodes;\n\n\t\t// manage the selection of nodes and links\n\t\t// must store in a ref to ensure that the d3 calls have the correct objects\n\t\t// otherwise they get out of sync on data updates (like filtering)\n\t\tselectionRef.current.nodes = [...selected];\n\t\tif (!selected.length) {\n\t\t\tselectionRef.current.links = [];\n\t\t} else {\n\t\t\tselectionRef.current.links = links.filter((link) => {\n\t\t\t\treturn link.full.some((s) => selected.map((n) => n.key).includes(s));\n\t\t\t});\n\t\t}\n\n\t\t// create a link from the source to the target\n\t\tconst linkLine = d3\n\t\t\t.linkHorizontal()\n\t\t\t.source((l) => {\n\t\t\t\tconst src = nodesRef.current.nodes[l.source.propertyKey][l.source.value];\n\t\t\t\treturn [src.x, src.y];\n\t\t\t})\n\t\t\t.target((l) => {\n\t\t\t\tconst tgt = nodesRef.current.nodes[l.target.propertyKey][l.target.value];\n\t\t\t\treturn [tgt.x, tgt.y];\n\t\t\t});\n\n\t\t// define the common transition\n\t\tconst t = d3.select(svgRef.current).transition().duration(750);\n\n\t\t// test if a link points to a given node\n\t\tconst nodeLinkTest = (link, node) => {\n\t\t\treturn link.propertyIndex === node.propertyIndex && link.value === node.key;\n\t\t};\n\n\t\t// test if two nodes are equivalent\n\t\tconst nodeTest = (node1, node2) => {\n\t\t\treturn node1.propertyIndex === node2.propertyIndex && node1.key === node2.key;\n\t\t};\n\n\t\t// test if the node is in the selection\n\t\tconst nodeInSelection = (node) => {\n\t\t\treturn selectionRef.current.nodes.some((n) => nodeTest(node, n));\n\t\t};\n\n\t\t// manage the link stroke opacity's many forms\n\t\tconst setLinkStrokeOpacity = (link) => {\n\t\t\tif (selectionRef.current.links.length) {\n\t\t\t\tconst filtered = selectionRef.current.links.filter((l) => l.key === link.key);\n\t\t\t\treturn filtered.length > 0 ? 1.0 : 0.2;\n\t\t\t}\n\t\t\treturn 0.5;\n\t\t};\n\n\t\t// create nodes is needed in two locations, so externalize it\n\t\tconst createNodes = (d3selection) => {\n\t\t\t// for each node\n\t\t\tconst nodeGroup = d3selection\n\t\t\t\t.append('g')\n\t\t\t\t.classed('node', true)\n\t\t\t\t.attr('id', (d) => `node-${d.propertyIndex}-${d.valueIndex}`)\n\t\t\t\t.attr('transform', (d) => `translate(0 ${d.y})`)\n\t\t\t\t.attr('cy-test', 'paracord-node')\n\t\t\t\t.on('click', (_d, evt) => handleNodeClick(evt))\n\t\t\t\t.on('mouseover', (_d, hoverNode) => {\n\t\t\t\t\t// add the hover \"border\"\n\t\t\t\t\td3.select(this).select('.nodeBorder').attr('stroke', 'black');\n\n\t\t\t\t\t// grey out any non-related links\n\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t.selectAll('.link')\n\t\t\t\t\t\t.filter((l) => !l.full.includes(hoverNode.key))\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(250)\n\t\t\t\t\t\t.attr('stroke', 'grey')\n\t\t\t\t\t\t.attr('stroke-opacity', 0.1);\n\n\t\t\t\t\t// grey out any non-related links\n\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t.selectAll('.nodeBody')\n\t\t\t\t\t\t.filter((l) => !l.full.includes(hoverNode.key))\n\t\t\t\t\t\t.attr('stroke', 'red')\n\t\t\t\t\t\t.attr('stroke-opacity', 0.1);\n\n\t\t\t\t\t// record all of the unique nodes in the set\n\t\t\t\t\tlet l = [];\n\n\t\t\t\t\t// highlight any related links\n\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t.selectAll('.link')\n\t\t\t\t\t\t.filter((l) => l.full.includes(hoverNode.key))\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(500)\n\t\t\t\t\t\t.attr('stroke', primaryColor)\n\t\t\t\t\t\t.attr('stroke-opacity', 0.9)\n\t\t\t\t\t\t.each((d) => {\n\t\t\t\t\t\t\tl.push(d.source);\n\t\t\t\t\t\t\tl.push(d.target);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t// remove duplicates\n\t\t\t\t\tl = Array.from(new Set(l));\n\n\t\t\t\t\t// show the node labels\n\t\t\t\t\td3.select(axisGroupRef.current)\n\t\t\t\t\t\t.selectAll('.nodeLabel')\n\t\t\t\t\t\t.filter((d) => l.filter((toTest) => nodeLinkTest(toTest, d)).length)\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(500)\n\t\t\t\t\t\t.style('opacity', 1);\n\t\t\t\t})\n\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\t// remove the node \"border\"\n\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t.select('.nodeBorder')\n\t\t\t\t\t\t.attr('stroke', (d) => (nodeInSelection(d) ? 'black' : 'transparent'));\n\n\t\t\t\t\t// return link opacity to normal\n\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t.selectAll('.link')\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(250)\n\t\t\t\t\t\t.attr('stroke', primaryColor)\n\t\t\t\t\t\t.attr('stroke-opacity', (d) => setLinkStrokeOpacity(d));\n\n\t\t\t\t\t// hide the node labels\n\t\t\t\t\td3.select(axisGroupRef.current).selectAll('.nodeLabel').transition().duration(250).style('opacity', 0);\n\t\t\t\t});\n\n\t\t\t// node \"border\"\n\t\t\tnodeGroup\n\t\t\t\t.append('circle')\n\t\t\t\t.classed('nodeBorder', true)\n\t\t\t\t.attr('r', 6)\n\t\t\t\t.attr('fill', 'transparent')\n\t\t\t\t.attr('stroke', (d) => (nodeInSelection(d) ? 'black' : 'transparent'))\n\t\t\t\t.attr('stroke-width', 2);\n\n\t\t\t// node body\n\t\t\tnodeGroup\n\t\t\t\t.append('circle')\n\t\t\t\t.classed('nodeBody', true)\n\t\t\t\t.attr('r', 4)\n\t\t\t\t.attr('stroke', 'white')\n\t\t\t\t.attr('fill', primaryColor);\n\n\t\t\t// create the labels, hidden by default\n\t\t\tconst textGroup = nodeGroup\n\t\t\t\t.append('g')\n\t\t\t\t.classed('nodeLabel', true)\n\t\t\t\t.attr('transform', `translate(0 -20)`)\n\t\t\t\t.attr('cy-test', 'paracord-node-label')\n\t\t\t\t.style('opacity', 0)\n\t\t\t\t.style('pointer-events', 'none');\n\n\t\t\t// fake label so the following path can get a real size\n\t\t\ttextGroup\n\t\t\t\t.append('text')\n\t\t\t\t.text((d) => truncString(d.label, columnLabelWidth))\n\t\t\t\t.attr('font-size', 12)\n\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t.attr('stroke', 'none')\n\t\t\t\t.attr('fill', 'none');\n\n\t\t\t// label background\n\t\t\ttextGroup.append('path').attr('d', function (_d) {\n\t\t\t\tconst { width, height } = d3.select(this.parentNode).select('text').node().getBBox();\n\t\t\t\tconst upperLeft = [-width / 2 - 4, -height / 2 - 5];\n\t\t\t\treturn `M ${upperLeft[0]},${upperLeft[1]} \n l ${width + 8},0 \n l 0,${height + 8} \n l ${-width / 2},0 \n l -4,4 \n l -4,-4 \n l ${-width / 2},0`;\n\t\t\t});\n\n\t\t\t// label itself\n\t\t\ttextGroup\n\t\t\t\t.append('text')\n\t\t\t\t.text((d) => truncString(d.label, columnLabelWidth))\n\t\t\t\t.attr('z-index', 1)\n\t\t\t\t.attr('font-size', 12)\n\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t.attr('dominant-baseline', 'middle')\n\t\t\t\t.attr('stroke', 'none')\n\t\t\t\t.attr('fill', 'white')\n\t\t\t\t.attr('cy-test', 'paracord-node-label-text');\n\n\t\t\t// drag support\n\t\t\tnodeGroup.call(\n\t\t\t\td3\n\t\t\t\t\t.drag()\n\t\t\t\t\t.on('start', (event) => {\n\t\t\t\t\t\tevent.sourceEvent.stopPropagation();\n\t\t\t\t\t})\n\t\t\t\t\t.on('drag', function (event, d) {\n\t\t\t\t\t\tconst { y } = event;\n\t\t\t\t\t\td.y = y;\n\t\t\t\t\t\t// move the whole group\n\t\t\t\t\t\td3.select(this).attr('transform', `translate(0, ${y})`);\n\n\t\t\t\t\t\t// update the links where this is the source\n\t\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t\t.selectAll('.link')\n\t\t\t\t\t\t\t.filter((l) => nodeLinkTest(l.source, d))\n\t\t\t\t\t\t\t.attr('d', (d) => linkLine(d));\n\n\t\t\t\t\t\t// update the links where this is the target\n\t\t\t\t\t\td3.select(linkGroupRef.current)\n\t\t\t\t\t\t\t.selectAll('.link')\n\t\t\t\t\t\t\t.filter((l) => nodeLinkTest(l.target, d))\n\t\t\t\t\t\t\t.attr('d', (d) => linkLine(d));\n\t\t\t\t\t})\n\t\t\t);\n\t\t\treturn nodeGroup;\n\t\t};\n\n\t\t// for each property, in order\n\t\td3.select(axisGroupRef.current)\n\t\t\t.selectAll('.axis')\n\t\t\t.data(procProperties, (d) => d.label)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\t// the axis\n\t\t\t\t\tconst g = enter\n\t\t\t\t\t\t.append('g')\n\t\t\t\t\t\t.classed('axis', true)\n\t\t\t\t\t\t.attr('transform', (d) => `translate(${d.x} 0)`);\n\n\t\t\t\t\t// axis label, truncated\n\t\t\t\t\tg.append('text')\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.text((d) => truncString(d.label, 14))\n\t\t\t\t\t\t.attr('transform', `translate(0 14)`)\n\t\t\t\t\t\t.attr('cy-test', 'paracord-axis-label');\n\n\t\t\t\t\t// axis line\n\t\t\t\t\tg.append('line')\n\t\t\t\t\t\t.classed('axisLine', true)\n\t\t\t\t\t\t.attr('stroke', 'black')\n\t\t\t\t\t\t.attr('x1', 0)\n\t\t\t\t\t\t.attr('y1', axisY(0))\n\t\t\t\t\t\t.attr('x2', 0)\n\t\t\t\t\t\t.attr('y2', axisY(1));\n\n\t\t\t\t\t// nodes (one per value)\n\t\t\t\t\tg.selectAll('.node')\n\t\t\t\t\t\t.data(\n\t\t\t\t\t\t\t(d) => {\n\t\t\t\t\t\t\t\treturn Object.values(nodesRef.current.nodes[d.label]);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(d) => d.key\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t.join(\n\t\t\t\t\t\t\t(enter) => createNodes(enter),\n\t\t\t\t\t\t\t(update) => update,\n\t\t\t\t\t\t\t(exit) => {\n\t\t\t\t\t\t\t\texit.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\t// axis line\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.call((enter) => enter.transition(t).attr('transform', (d) => `translate(${d.x} 0)`))\n\t\t\t\t\t\t.selectAll('line')\n\t\t\t\t\t\t.attr('y1', axisY(0))\n\t\t\t\t\t\t.attr('y2', axisY(1));\n\n\t\t\t\t\t// update nodes\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('.node')\n\t\t\t\t\t\t.data(\n\t\t\t\t\t\t\t(d) => {\n\t\t\t\t\t\t\t\treturn Object.values(nodesRef.current.nodes[d.label]);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(d) => d.key\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\n\t\t\t\t\t\t\t(enter) => createNodes(enter),\n\t\t\t\t\t\t\t(update) =>\n\t\t\t\t\t\t\t\tupdate.call((update) => update.transition(t).attr('transform', (d, _i) => `translate(0 ${d.y})`)),\n\t\t\t\t\t\t\t(exit) => {\n\t\t\t\t\t\t\t\texit.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\n\t\t\t\t\t// update labels\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('.nodeLabel')\n\t\t\t\t\t\t.data(\n\t\t\t\t\t\t\t(d) => {\n\t\t\t\t\t\t\t\treturn Object.values(nodesRef.current.nodes[d.label]);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t(d) => d.key\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\n\t\t\t\t\t\t\t(enter) => createNodes(enter),\n\t\t\t\t\t\t\t(update) => update.call((update) => update.transition(t)),\n\t\t\t\t\t\t\t(exit) => {\n\t\t\t\t\t\t\t\texit.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => {\n\t\t\t\t\texit.remove();\n\t\t\t\t}\n\t\t\t);\n\n\t\t// links\n\t\td3.select(linkGroupRef.current)\n\t\t\t.selectAll('.link')\n\t\t\t.data(links, (d) => d.key)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\t// link line\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('path')\n\t\t\t\t\t\t.classed('link', true)\n\t\t\t\t\t\t.attr('stroke', primaryColor)\n\t\t\t\t\t\t.attr('fill', 'none')\n\t\t\t\t\t\t.call((enter) =>\n\t\t\t\t\t\t\tenter\n\t\t\t\t\t\t\t\t.transition(t)\n\t\t\t\t\t\t\t\t.attr('stroke-opacity', (d) => setLinkStrokeOpacity(d))\n\t\t\t\t\t\t\t\t.attr('d', (d) => linkLine(d))\n\t\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\t// update the links\n\t\t\t\t\tupdate.attr('stroke', primaryColor).call((update) =>\n\t\t\t\t\t\tupdate\n\t\t\t\t\t\t\t.transition(t)\n\t\t\t\t\t\t\t.attr('stroke-opacity', (d) => setLinkStrokeOpacity(d))\n\t\t\t\t\t\t\t.attr('d', (d) => linkLine(d))\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\t(exit) => {\n\t\t\t\t\texit.remove();\n\t\t\t\t}\n\t\t\t);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [nodes, links, procProperties, axisY, selected]);\n\n\treturn (\n\t\t<svg cy-test=\"paracord-data\" width={dimensions.width} height={dimensions.height} ref={svgRef}>\n\t\t\t<g ref={containerRef}>\n\t\t\t\t<g ref={linkGroupRef} />\n\t\t\t\t<g ref={axisGroupRef} />\n\t\t\t</g>\n\t\t</svg>\n\t);\n};\n\nfunction truncString(str, max, add) {\n\tadd = add || '...';\n\treturn typeof str === 'string' && str.length > max ? str.substring(0, max) + add : str;\n}\n\nParaCord.propTypes = {\n\tcolorScaleType: PropTypes.any,\n\tdata: PropTypes.any,\n\tcolumns: PropTypes.any,\n\tdimensions: PropTypes.object,\n};\n","import React, { useContext, useEffect, useState } from 'react';\nimport { ParaCord } from './index';\nimport { Classes } from '@blueprintjs/core';\nimport * as d3 from 'd3';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nconst stableDummyDispatch = () => {};\n/**\n * ChartWrapper for the ParaCord widget.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param cardIndex\n * @param actions\n * @param loading\n * @returns {*}\n * @constructor\n */\nexport function ParaCordWrapper({ dimensions, data, cardIndex, actions, loading }) {\n\t// TODO: There's probably a less hacky way to get this component to work on the dashboard/savedViews pages\n \tconst { dispatch = stableDummyDispatch } = useContext(WorkspaceContext) ?? {};\n\tconst [convertedData, setConvertedData] = useState(null);\n\n\t// TODO: Reimplement selection/filtering when strategy is determined.\n\n\t// send the\n\t// const onSelect = selected => {\n\t// \tdispatch(WorkspaceActionCreator.updateExplorerCardActions(cardIndex, { selected: selected }));\n\t// };\n\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape, so we exit\n\t\tif (!data || !(data?.properties && data?.links && data?.propertyOrder)) return;\n\n\t\tif (loading) return;\n\n\t\tconst nodes = createNodes(data);\n\t\t// data only has less than two nodes, any result wouldn't make sense to the user\n\t\tif (Object.keys(nodes).length <= 1) return; \n\t\tconst links = createLinks(data, nodes);\n\t\tconst propertyOrder = data.propertyOrder.map((p, i) => {\n\t\t\treturn { label: p, index: i };\n\t\t});\n\n\t\t// new data need to clear the actions (if we are in the explorer)\n\t\tif (cardIndex) dispatch(WorkspaceActionCreator.updateExplorerCardActions(cardIndex, { selected: [] }));\n\t\tsetConvertedData({ nodes, links, propertyOrder });\n\t}, [cardIndex, data, dispatch, loading]);\n\n\treturn !!convertedData ? (\n\t\t<ParaCord\n\t\t\tdata={convertedData}\n\t\t\tcolumns={{}}\n\t\t\tdimensions={dimensions}\n\t\t\t//onSelect={onSelect}\n\t\t\t//selected={actions?.selected}\n\t\t/>\n\t) : (\n\t\t<div className={Classes.SKELETON} style={{ width: dimensions.width, height: dimensions.height }} />\n\t);\n}\n\n// Process the rawData into objects that will be the nodes\nconst createNodes = rawData => {\n\t// Create a node for each property value\n\tlet nodes = {};\n\trawData.propertyOrder.forEach((property, i) => {\n\t\tnodes[property] = {};\n\t\tObject.entries(rawData.properties[property]).forEach((value, j) => {\n\t\t\t// node is [label, count]\n\t\t\tnodes[property][value[0].toLowerCase()] = {\n\t\t\t\tkey: value[0].toLowerCase(),\n\t\t\t\tcount: value[1],\n\t\t\t\tlabel: value[0],\n\t\t\t\tpropertyIndex: i,\n\t\t\t\tpropertyKey: rawData.propertyOrder[i],\n\t\t\t\tvalueIndex: j,\n\t\t\t};\n\t\t});\n\t});\n\n\treturn nodes;\n};\n\n// Create the links, can be filtered and links in the visualization.\nconst createLinks = rawData => {\n\t// Create a renderable link for each ordered pair of values in each link\n\tlet links = {};\n\trawData.links.forEach(link => {\n\t\tfor (let i = 0; i < rawData.propertyOrder.length - 1; i++) {\n\t\t\t// get the pairs of values\n\t\t\tconst srcValue = link.link[i].toLowerCase();\n\t\t\tconst tgtValue = link.link[i + 1].toLowerCase();\n\n\t\t\t// create a unique reproducible key\n\t\t\tconst key = `${i}*${srcValue}^${i + 1}*${tgtValue}`;\n\n\t\t\tif (links[key]) {\n\t\t\t\tlinks[key].count += link.count;\n\t\t\t\tlinks[key].full = links[key].full.concat(link.link.map(l => l.toLowerCase()));\n\t\t\t} else {\n\t\t\t\t// store the renderable link\n\t\t\t\tlinks[key] = {\n\t\t\t\t\tsource: { propertyIndex: i, propertyKey: rawData.propertyOrder[i], value: srcValue },\n\t\t\t\t\ttarget: { propertyIndex: i + 1, propertyKey: rawData.propertyOrder[i + 1], value: tgtValue },\n\t\t\t\t\tcount: link.count,\n\t\t\t\t\tkey: key,\n\t\t\t\t\tfull: link.link.map(l => l.toLowerCase()),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t});\n\n\t// we don't need the map any longer\n\tlinks = Object.values(links);\n\tlinks = links.map(link => {\n\t\tlink.full = Array.from(new Set(link.full));\n\t\treturn link;\n\t});\n\n\treturn {\n\t\tlinks: links,\n\t\tmaxLinkCount: d3.max(links, l => l.count),\n\t};\n};\n","export default {\n Property: 'property',\n};\n","import { css } from '@emotion/react';\nimport { Colors } from 'styles/variables';\n\nexport const draggableStyles = {\n\titemContainer: css`\n /*width: 200px;*/\n `,\n\titemStyles: css`\n background-color: ${Colors.WHITE};\n cursor: move;\n margin-bottom: 4px;\n width: 100%;\n overflow: hidden;\n `,\n\titemButton: css`\n cursor: move;\n width: 100%;\n justify-content: left;\n `,\n};\n","/**\n * The MIT License (MIT)\n\n Copyright (c) 2015 Dan Abramov\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useRef } from 'react';\nimport { useDrag, useDrop } from 'react-dnd';\nimport PropTypes from 'prop-types';\nimport { Button } from '@blueprintjs/core';\nimport ItemTypes from './ItemTypes';\nimport { draggableStyles } from './styles';\n\nconst DraggableItem = ({ item, index, handleReorder, toggleSelected }) => {\n const { text, id } = item;\n const ref = useRef(null);\n const [, drop] = useDrop({\n accept: ItemTypes.Property,\n hover(item, monitor) {\n if (!ref.current) {\n return;\n }\n const dragIndex = item.index;\n const hoverIndex = index;\n // Don't replace items with themselves\n if (dragIndex === hoverIndex) {\n return;\n }\n // Determine rectangle on screen\n const hoverBoundingRect = ref.current.getBoundingClientRect();\n // Get vertical middle\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n // Get pixels to the top\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n // Only perform the move when the mouse has crossed half of the items height\n // When dragging downwards, only move when the cursor is below 50%\n // When dragging upwards, only move when the cursor is above 50%\n // Dragging downwards\n if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {\n return;\n }\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\n return;\n }\n // Time to actually perform the action\n handleReorder(dragIndex, hoverIndex);\n // Note: we're mutating the monitor item here!\n // Generally it's better to avoid mutations,\n // but it's good here for the sake of performance\n // to avoid expensive index searches.\n item.index = hoverIndex;\n },\n });\n const [{ isDragging }, drag] = useDrag({\n item: { type: ItemTypes.Property, id, index },\n collect: monitor => ({\n isDragging: monitor.isDragging(),\n }),\n });\n const opacity = isDragging ? 0 : 1;\n drag(drop(ref));\n\n const { itemStyles, itemButton } = draggableStyles;\n\n return (\n <div ref={ref} css={itemStyles} style={{ opacity }} onClick={() => toggleSelected(item)}>\n <Button minimal css={itemButton}>\n {text}\n </Button>\n </div>\n );\n};\nexport default DraggableItem;\n\nDraggableItem.propTypes = {\n item: PropTypes.object,\n index: PropTypes.number,\n handleReorder: PropTypes.func,\n toggleSelected: PropTypes.func,\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport DraggableItem from './draggableItem';\nimport { draggableStyles } from './styles';\n\nconst Container = props => {\n\tconst { items, handleReorder, toggleSelected } = props;\n\tconst renderDraggableItem = (item, index) => {\n\t\treturn (\n\t\t\t<DraggableItem\n\t\t\t\tkey={item.id}\n\t\t\t\tindex={index}\n\t\t\t\titem={item}\n\t\t\t\thandleReorder={handleReorder}\n\t\t\t\ttoggleSelected={toggleSelected}\n\t\t\t/>\n\t\t);\n\t};\n\n\tconst { itemContainer } = draggableStyles;\n\n\treturn (\n\t\t<React.Fragment>\n\t\t\t<div css={itemContainer}>\n\t\t\t\t{items.map((item, i) => renderDraggableItem(item, i))}\n\t\t\t</div>\n\t\t</React.Fragment>\n\t);\n};\nexport default Container;\n\nContainer.propTypes = {\n\titems: PropTypes.array,\n\ttoggleSelected: PropTypes.func,\n\thandleReorder: PropTypes.func,\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport PropTypes from 'prop-types';\nimport { Classes, Icon as BPIcon } from '@blueprintjs/core';\nimport styled from '@emotion/styled';\nimport * as iconPaths from './icons.json';\n\n// Props to Nancy O`Brien for finding Icomoon and figuring out how to use it in a react application.\n// Upload icons.json to https://icomoon.io/app/#/select to see available icons and names.\n\nfunction findIcon(iconName) {\n return iconPaths.icons.find(i => i.properties.name === iconName);\n}\n\nexport function getPath(iconName) {\n const icon = findIcon(iconName);\n return icon ? icon.icon.paths.join(' ') : '';\n}\n\nexport function isValidIcon(iconName) {\n return !!findIcon(iconName);\n}\n\nexport function getIconLabel(iconName) {\n const icon = findIcon(iconName);\n if (icon) {\n return (icon.tags && icon.tags[0]) || icon.properties.name;\n } else {\n return '';\n }\n}\n\nexport function Icon({ icon, iconSize = 16, className = '', includeTitle=true}) {\n if (isValidIcon(icon)) {\n return (\n <SvgIcon\n className={`${Classes.ICON} ${className}`}\n data-icon={icon}\n width={iconSize}\n height={iconSize}\n viewBox=\"0 0 1024 1024\"\n >\n {includeTitle ? <title>{getIconLabel(icon)} : null}\n \n \n \n \n );\n } else {\n return ;\n }\n}\n\nconst SvgIcon = styled.svg`\n path {\n fill: ${props => (props.color ? props.color : 'currentColor')};\n stroke: ${props => (props.color ? props.color : 'currentColor')};\n }\n`;\n\nIcon.propTypes = {\n className: PropTypes.string,\n icon: PropTypes.any,\n iconSize: PropTypes.number,\n style: PropTypes.object,\n includeTitle: PropTypes.bool,\n};\n","import { css } from '@emotion/react';\n\nexport const multiselectStyles = {\n wrapper: css`\n width: 650px;\n `,\n cardWrapper: css`\n display: flex;\n height: 420px;\n `,\n selectCard: css`\n width: 100%;\n height: 100%;\n overflow-y: auto;\n margin: 8px;\n `,\n centerSection: css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin: 8px 0;\n height: 100%;\n `,\n middleButton: css`\n margin-bottom: 4px;\n `,\n itemTitle: css`\n padding-left: 10px;\n `,\n};\n","/** @jsx jsx */\nimport { DndProvider } from 'react-dnd';\nimport Backend from 'react-dnd-html5-backend';\nimport DraggableContainer from 'components/multiselect/draggable';\nimport { Button } from '@blueprintjs/core';\nimport { Icon } from 'components/icon';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { css, jsx } from '@emotion/react';\nimport { Colors, ColorAliases, Variables } from 'styles/variables';\nimport update from 'immutability-helper';\nimport { useCallback, useState } from 'react';\nimport { multiselectStyles } from 'components/multiselect/styles';\n\nconst convertToArrayOfObjects = array => array.map(text => ({id: uuidv4(), text}));\nexport default function({ items, initialSelected = items, minimumItems=1, onSubmit}) {\n\n\tconst initialUnselected = items.filter(item => !initialSelected.includes(item));\n\tconst itemsAsObjects = convertToArrayOfObjects(items);\n\tconst initialSelectedAsObjects = convertToArrayOfObjects(initialSelected);\n\tconst initialUnselectedAsObjects = convertToArrayOfObjects(initialUnselected);\n\n\tconst [selected, setSelected] = useState(initialSelectedAsObjects);\n\n\tconst [unselected, setUnselected] = useState(initialUnselectedAsObjects);\n\n\tconst moveSelected = useCallback(\n\t\t(draggingIndex, hoveringIndex) => {\n\t\t\tconst dragItem = selected[draggingIndex];\n\t\t\tsetSelected(\n\t\t\t\tupdate(selected, {\n\t\t\t\t\t$splice: [\n\t\t\t\t\t\t[draggingIndex, 1],\n\t\t\t\t\t\t[hoveringIndex, 0, dragItem],\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[selected]\n\t);\n\n\tconst moveUnselected = useCallback(\n\t\t(draggingIndex, hoveringIndex) => {\n\t\t\tconst dragItem = unselected[draggingIndex];\n\t\t\tsetUnselected(\n\t\t\t\tupdate(unselected, {\n\t\t\t\t\t$splice: [\n\t\t\t\t\t\t[draggingIndex, 1],\n\t\t\t\t\t\t[hoveringIndex, 0, dragItem],\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[unselected]\n\t);\n\n\tconst handleSelect = newValue => {\n\t\tsetSelected(selected => [...selected, newValue]);\n\t\tsetUnselected(unselected.filter(item => item !== newValue));\n\t};\n\n\tconst handleUnselect = newValue => {\n\t\tif (selected.length <= minimumItems) return;\n\t\tsetUnselected(selected => [...selected, newValue]);\n\t\tsetSelected(selected.filter(item => item !== newValue));\n\t};\n\n\tconst handleSelectAll = () => {\n\t\tif (itemsAsObjects !== selected) {\n\t\t\tsetSelected(itemsAsObjects);\n\t\t\tsetUnselected([]);\n\t\t}\n\t};\n\n\t// Don't want to allow the user to unselect all (causes system to crash),\n\t// this doesn't do anything if the items are at n (the minimium number)\n\t// if there are more than the minimum number, select the first n\n\tconst handleUnselectAll = () => {\n\t\tif (selected.length <= minimumItems) return;\n\t\tsetSelected(itemsAsObjects.slice(0, minimumItems))\n\t\tsetUnselected(itemsAsObjects.slice(minimumItems))\n\t};\n\n\tconst handleReset = () => {\n\t\tsetSelected(initialSelectedAsObjects);\n\t\tsetUnselected(initialUnselectedAsObjects);\n\t};\n\n\tconst handleClose = () => {\n\t\thandleSelectAll();\n\t\thandleSubmit();\n\t};\n\n\tconst handleSubmit = () => {\n\t\tconst selectedToReturn = selected.map(item => item.text);\n\t\tconst unselectedToReturn = unselected.map(item => item.text);\n\t\tconst returnObject = { selected: selectedToReturn, unselected: unselectedToReturn };\n\t\tonSubmit(returnObject);\n\t};\n\n\tconst { itemTitle } = multiselectStyles;\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
Unselected
\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
Selected
\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t)\n}\n\nconst containerCss = css`\n\tdisplay: flex;\n\tborder: 1px solid #CED9E0; //TODO use colorAliases ?LIGHT_GRAY1\n\tborder-radius: ${Variables.PT_BORDER_RADIUS};\n`;\nconst selectionColumnCss = css`\n\tflex: 1\n`;\nconst buttonColumnCss = css`\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tflex-direction: column;\n\tflex-shrink: 0;\n\tflex-basis: 84px;\n\tbackground: ${Colors.LIGHT_GRAY1};\n\tcolor: ${ColorAliases.PT_ICON_COLOR};\n\t& > * {\n\t\tmargin: 7px;\n\t\tcursor: pointer;\n\t\tpadding: 5px;\n\t}\n`;\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useContext, useEffect } from 'react';\nimport { Button, Intent } from '@blueprintjs/core';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport isEmpty from 'lodash-es/isEmpty';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\n\nconst { updateFilter, updateQueryString } = WorkspaceActionCreator;\n\n/**\n * Custom renderer for the actions available to change the chart settings.\n *\n * This is a Filter Provider for the ParaCord chart.\n *\n * @param chartConfiguration\n * @param actions\n * @returns {*}\n * @constructor\n */\nexport const ParaCordActions = ({ actions }) => {\n const {\n state: {\n explorer: { filters: { paracord: paracordFilter = {} } },\n }, dispatch,\n } = useContext(WorkspaceContext);\n\n const onFilter = () => {\n if (actions?.selected.length) {\n const newFilter = {};\n actions.selected.forEach(node => {\n newFilter[node.propertyKey] = {\n ...newFilter[node.propertyKey],\n [node.key]: true,\n };\n });\n dispatch(updateFilter('paracord', newFilter));\n } else {\n dispatch(updateFilter('paracord', null));\n }\n };\n\n useEffect(() => {\n if (isEmpty(paracordFilter))\n return;\n\n let queryString = Object.entries(paracordFilter || {}).map(([key, values]) => {\n const keyValues = Object.keys(values).map(value => ({ [key]: value }));\n return {\n $or: keyValues,\n };\n });\n\n dispatch(updateQueryString('paracord', { $and: queryString }));\n }, [paracordFilter, dispatch]);\n\n\n return (\n \n {actions?.selected?.length ?\n : null\n }\n \n );\n};\n","import { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { paraCord } from '../endpoints';\nimport { ParaCordWrapper } from './wrapper';\nimport { ParaCordKnobs } from './knobs';\nimport { ParaCordActions } from \"./actions\";\nimport {filterProperties} from \"utilities/srsUtils\";\n\nconst flags = [SrsPropertyFlag.Categorical];\nconst types = [SrsPropertyType.String];\n\nexport const config = {\n key: \"PARACORD\",\n label: 'ParaCord',\n icon: 'parallel-coordinates',\n wrapper: ParaCordWrapper,\n endpoint: paraCord,\n Knobs: ParaCordKnobs,\n Actions: ParaCordActions,\n flags: flags,\n types: types,\n createDefaultOptions: (filteredProperties) => {\n return {\n options: {\n propertyList: [\n filteredProperties[0].name,\n filteredProperties[1].name,\n ],\n parameters: {\n maxValues: 15\n },\n },\n };\n },\n isValid: (selectedDefinitionName) => {\n return filterProperties(selectedDefinitionName, flags, types).length >= 2;\n },\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useContext } from 'react';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport CustomMultiSelect from 'components/custom-multiselect/custom-multiselect';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @param propertyList\n * @returns {*}\n * @constructor\n */\nexport const ParaCordKnobs = ({ cardIndex, endpointQuery, flags, types }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch\n\t} = useContext(WorkspaceContext);\n\tconst propertyName = 'propertyList';\n\n\tconst items = filterProperties(selectedDefinitionName, flags, types).map(property => property.name);\n\n\tconst handleSortingOfColumns = ({selected: sortedSelected/*, unselected: sortedUnselected */}) => {\n\t\tconst selected = sortedSelected;\n\t\tconst newColumns = selected.filter(selection =>\n\t\t\titems.includes(selection)\n\t\t);\n\n\t\t// create copy of options object\n\t\tconst newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n\t\tnewEndpointQuery.options[propertyName] = newColumns;\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n\t};\n\n\tconst initialSelected = endpointQuery?.options?.[propertyName];\n return (\n \t\n\t\t\t\n\t\t\t}/>\n\t\t\n );\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Manager, Popper, PopperProps } from 'react-popper';\n\ntype PopperPropsWithoutChildren = Omit, 'children'>;\n\n// NOTE: We might have to be smarter with multiple instances of this. Perhaps\nexport function useTooltip(\n\tpopperProps?: PopperPropsWithoutChildren\n): [JSX.Element, (Tooltip: JSX.Element) => { onMouseOut: () => void; onMouseOver: (event: any) => void }] {\n\tconst [activeTooltip, setActiveTooltip] = React.useState(null);\n\tconst [activeRef, setActiveRef] = React.useState(undefined);\n\n\tfunction setupTriggers(Tooltip: JSX.Element) {\n\t\treturn {\n\t\t\tonMouseOver: (event: any) => {\n\t\t\t\tsetActiveRef(event.target);\n\t\t\t\tsetActiveTooltip(Tooltip);\n\t\t\t},\n\t\t\tonMouseOut: () => {\n\t\t\t\tsetActiveRef(null);\n\t\t\t\tsetActiveTooltip(null);\n\t\t\t},\n\t\t};\n\t}\n\n\treturn [\n\t\t\n\t\t\t{ReactDOM.createPortal(\n\t\t\t\t\n\t\t\t\t\t{({ ref, style, placement, arrowProps }) => (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{activeTooltip}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t\t
,\n\t\t\t\tdocument.querySelector('#modal-container') as Element\n\t\t\t)}\n\t\t
,\n\t\tsetupTriggers,\n\t];\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { Card, Classes, Elevation, H6, ICardProps } from '@blueprintjs/core';\nimport * as moment from 'moment';\n\ntype MetaDataObject = {\n\t[itemLabel: string]: string | Date | number,\n};\n\ninterface MetaDataViewerProps extends React.ComponentPropsWithoutRef<'div'> {\n\ttitle?: string;\n\tcontent?: MetaDataObject;\n\tdateFormatter?: string,\n}\n\nexport const MetaDataViewer: React.FC = ({\n\ttitle,\n\tcontent,\n\tdateFormatter = 'HH:MM:SS MM/DD/YYYY (UTC)',\n\t...props\n}) => {\n\tif (!(title && content)) return null\n\treturn (\n\t\t
\n\t\t\t{title && (\n\t\t\t\t
\n\t\t\t\t\t{title}\n\t\t\t\t
\n\t\t\t)}\n\t\t\t{content && (\n\t\t\t\t
    \n\t\t\t\t\t{Object.keys(content).map((item, index) => {\n\t\t\t\t\t\tlet formattedItem = content[item];\n\t\t\t\t\t\tif (formattedItem == null) return null\n\t\t\t\t\t\t// if (typeof formattedItem === 'object') { // do we need this?\n\t\t\t\t\t\tif (moment.isDate(formattedItem)) {\n\t\t\t\t\t\t\tformattedItem = moment.utc(formattedItem).format(dateFormatter)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// }\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t{item}:\n\t\t\t\t\t\t\t\t{formattedItem}\n\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n}\n\nconst tooltipStyle = {\n\titem: css`\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t`,\n\tlabel: css`\n\t\tfont-weight: bold;\n\t\tpadding-right: 10px;\n\t`,\n\tvalue: css``,\n};\n\ninterface ChartToolTipProps extends MetaDataViewerProps { }\n\nexport function ChartTooltip({ content, title, dateFormatter, children, ...props }: ChartToolTipProps) {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{children}\n\t\t\n\t);\n}\n\nexport default ChartTooltip;\n","import { css } from '@emotion/react';\n\nexport const mapStyles = {\n wrapper: css`\n width: 100%;\n height: 100%;\n `,\n container: css`\n position: relative;\n display: flex;\n align-items: flex-end;\n `,\n map: css`\n position: absolute; \n top: 0;\n left: 0; \n bottom: 0; \n right: 0;\n `,\n animation: css`\n transition: fill 1.5s;\n `,\n};\n\nconst height = 30;\nexport const legendStyles = {\n wrapper: css`\n position: relative;\n height: ${height}px;\n `,\n container: css`\n display: flex;\n flex-direction: column;\n `,\n labelContainer: css`\n position: relative;\n font-size: 12px;\n line-height: 12px;\n `,\n tick: css`\n position: absolute;\n top: ${(height - 12) / 2}px;\n // horizontally center ticks based on where they land\n transform: translateX(-50%);\n `,\n gradient: css`\n width: 100%;\n height: ${height}px;\n `,\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useEffect, useState } from 'react';\nimport { Annotation, ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps';\nimport PropTypes from 'prop-types';\nimport * as d3 from 'd3';\nimport { useTooltip } from 'components/chartTooltip/useTooltip';\nimport ChartTooltip from 'components/chartTooltip';\nimport { legendStyles, mapStyles } from './styles';\nimport { primaryColor } from 'styles/colors';\n\nconst MapChart = ({ data, dimensions, shapes, max, dataMapper, projection, colorScale, center, legend }) => {\n\tconst [toolTip, setupTrigger] = useTooltip();\n\tconst [isTooltipEnabled, setIsTooltipEnabled] = useState(true);\n\tconst [zoom, setZoom] = useState(1);\n\tconst [animationClass, setAnimationClass] = useState(mapStyles.animation);\n\n\tconst defaultColorScale = d3\n\t\t.scaleLinear()\n\t\t.domain([0, max])\n\t\t.range(['#FFFFFF', primaryColor]);\n\n\t// render the shapes in white if there's no data\n\tconst fillColorScale = max ? (colorScale ? colorScale : defaultColorScale) : () => '#FFFFFF';\n\tconst disableTooltip = () => setIsTooltipEnabled(false);\n\tconst enableTooltip = () => setIsTooltipEnabled(true);\n\tconst handleZoom = (e) => {\n\t\tif (e.deltaY < 0) {\n\t\t\t// zoom in\n\t\t\tsetZoom(prev => prev + 0.25);\n\t\t} else if (e.deltaY > 0) {\n\t\t\t// zoom out -- prevent zooming out too far\n\t\t\tsetZoom(prev => prev > 0.25 ? prev - 0.25 : prev);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tsetAnimationClass(mapStyles.animation);\n\t}, [data]);\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{({ geographies }) => (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{geographies.map(geo => {\n\t\t\t\t\t\t\t\t\t\tconst current = dataMapper(geo);\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t setAnimationClass('')}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfill: fillColorScale(current),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke: '#607D8B',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 0.75,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\thover: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfill: '#263238',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke: '#607D8B',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 0.75,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tpressed: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfill: '#263238',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke: '#607D8B',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth: 0.75,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\toutline: 'none',\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t{...setupTrigger()}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t{/* Renders DC label */}\n\t\t\t\t\t\t\t\t\t{geographies.filter(geo => geo.properties.name === 'District of Columbia').map(dc => {\n\t\t\t\t\t\t\t\t\t\tconst count = dataMapper(dc);\n\t\t\t\t\t\t\t\t\t\tconst fillColor = fillColorScale(count);\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t)} />\n\t\t\t\t\t\t\t\t\t\t\t\t\tDC\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t{isTooltipEnabled && toolTip}\n\t\t\t{legend &&\n\t\t\t\t
{legend}
\n\t\t\t}\n\t\t
\n\t);\n};\n\nexport default MapChart;\n\nMapChart.propTypes = {\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.any,\n\tpaddingRange: PropTypes.array,\n\tcolorScale: PropTypes.any,\n\tprojection: PropTypes.string,\n\tshapes: PropTypes.any,\n\tmax: PropTypes.number,\n\tdataMapper: PropTypes.any,\n\tcenter: PropTypes.any,\n\tlegend: PropTypes.any,\n};\n","import { isArray } from 'lodash';\nimport numeral from 'numeral';\n\nexport function formatValue(num) {\n\treturn num < 10000 && num > 999 ? numeral(num).format('0.0a') : numeral(num).format('0a');\n}\n\nexport function formatDigitLength(num, digitLength) {\n\tif (typeof num.toPrecision !== 'function') return num;\n\treturn numeral(num.toPrecision(digitLength)).format('0[.][00]a');\n}\n\nexport function couldBeDate(thing: string): boolean {\n\t// it could just be a number tough\n\treturn !isNaN(Date.parse(thing))\n\t// return moment.isDate(thing)\n}\n\nexport function isIsoDate(thing: string): boolean {\n\t// https://stackoverflow.com/a/37563868/5648839\n\tvar ISO_8601_FULL = /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?$/i\n\treturn ISO_8601_FULL.test(thing)\n}\n\nexport function preformatNumber(thing: string): string {\n\treturn thing.replace(/,/g, \"\") // replace 12,345,678.00 commas for better parsing.\n}\n\nexport function isNumber(thing: string): boolean {\n\treturn !isNaN(Number(preformatNumber(thing)))\n}\n\nexport function isURL(thing: string): boolean {\n\ttry {\n\t\tconst url = new URL(thing)\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\nexport function isObject(thing: any): boolean {\n\treturn (!isArray(thing) && typeof thing === 'object')\n}\n\n/** transforms all keys in an object based on fn, and returns a new object */\nexport function objectMap(\n\tobj: Record,\n\tfn: (value: T, key: string, index: number) => R\n) {\n\t// https://stackoverflow.com/a/14810722/5648839\n\treturn Object.fromEntries(\n\t\tObject.entries(obj).map(\n\t\t\t([k, v], i) => [k, fn(v, k, i)]\n\t\t)\n\t)\n}\n\nexport interface Rectangle {\n\tx: number;\n\ty: number;\n\theight: number;\n\twidth: number;\n}\n\n/**\n * Returns true if the given rect intersects with any in the given list of rects\n * @param test\n * @param list\n * @returns {boolean|*}\n */\nexport const intersectsAny = (test: Rectangle, list: Rectangle[]): boolean => {\n\tif (list.length === 0) return false;\n\n\treturn list.some((l) => {\n\t\treturn intersectRect(test, l);\n\t});\n}\n\n/**\n * Tests if the two given rects intersect\n * @param r1\n * @param r2\n */\nexport const intersectRect = (r1: Rectangle, r2: Rectangle) => {\n\treturn !(r2.x > r1.x + r1.width || r2.x + r2.width < r1.x || r2.y > r1.y + r1.height || r2.y + r2.height < r1.y);\n}\n","import * as d3 from 'd3';\nimport { primaryColor } from 'styles/colors';\n\nexport const defaultColorScale = max =>\n\td3\n\t\t.scaleLinear()\n\t\t.domain([0, max])\n\t\t.range(['#FFFFFF', primaryColor]);\n\nexport const formatDataAsMap = data => {\n\ttry {\n\t\tlet map = {};\n\t\tdata.entries.forEach(value => {\n\t\t\tmap[value.key] = { value: value.count };\n\t\t});\n\t\treturn map;\n\t} catch {\n\t\treturn {};\n\t}\n};\n\nexport function removeFractionalTicks(ticks) {\n\tif (ticks[ticks.length - 1] <= 1) {\n\t\treturn [0, 1];\n\t} else if (ticks[ticks.length - 1] <= 2) {\n\t\treturn [0, 1, 2];\n\t}\n\treturn ticks;\n}\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport PropTypes from 'prop-types';\nimport { legendStyles } from './styles';\nimport { formatValue } from 'utilities/utils';\nimport { defaultColorScale, removeFractionalTicks } from 'widgets/map/helpers';\nimport * as d3 from 'd3';\nimport { readableColor } from 'polished';\n\n// For representing continuous data\nexport function Legend({ dimensions, maxValue }) {\n\tconst { width } = dimensions;\n\tconst minWidth = 200;\n\n\tconst colorScale = defaultColorScale(maxValue);\n\tconst xScale = d3\n\t\t.scaleLinear()\n\t\t.domain([0, maxValue])\n\t\t.range([0, width]);\n\n\tconst startColor = colorScale(0);\n\tconst endColor = colorScale(maxValue);\n\n\tconst gradient = `linear-gradient(to right, ${startColor} , ${endColor})`;\n\n\tconst ticks = removeFractionalTicks(xScale.ticks(4));\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{ticks.map((tick, i) => {\n\t\t\t\t\tconst isFirst = i === 0;\n\t\t\t\t\tconst positionStyles = isFirst\n\t\t\t\t\t\t? css`\n\t\t\t\t\t\t\t\tleft: 0;\n\t\t\t\t\t\t\t\ttransform: none;\n\t\t\t\t\t\t `\n\t\t\t\t\t\t: css`\n\t\t\t\t\t\t\t\tright: ${width - xScale(tick)}px;\n\t\t\t\t\t\t `;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{formatValue(tick)}\n\t\t\t\t\t\t
\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nLegend.propTypes = {\n\tdimensions: PropTypes.any,\n\tstartColor: PropTypes.string,\n\tendColor: PropTypes.string,\n\tticks: PropTypes.array,\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport * as d3 from 'd3';\nimport PropTypes from 'prop-types';\nimport worldMap from '../../data/world-110m-sans-antarctica';\nimport usStates from '../../data/states-10m';\nimport Map from './map';\nimport { Legend } from './legend';\nimport { mapStyles } from './styles';\n\nexport function USMap({ data, dimensions, showLegend }) {\n\tconst { width, height } = dimensions;\n\tconst max = d3.max(Object.values(data), (d) => +d.value);\n\n\treturn (\n\t\t
\n\t\t\t (data[geography.properties.name] ? data[geography.properties.name].value : 0)}\n\t\t\t\tdimensions={{\n\t\t\t\t\theight: height,\n\t\t\t\t\twidth: width,\n\t\t\t\t}}\n\t\t\t\tcenter={[-97, 37]}\n\t\t\t\tlegend={showLegend && }\n\t\t\t/>\n\t\t
\n\t);\n}\n\nUSMap.propTypes = {\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.any,\n\tshowLegend: PropTypes.bool,\n};\n\nexport function WorldMap({ data, dimensions, showLegend }) {\n\tconst { width, height } = dimensions;\n\n\tconst max = d3.max(Object.values(data), (d) => +d.value);\n\n\treturn (\n\t\t
\n\t\t\t {\n\t\t\t\t\tif (data[geography.properties.name]) {\n\t\t\t\t\t\treturn data[geography.properties.name].value;\n\t\t\t\t\t} else if (data[geography.properties.nameLong]) {\n\t\t\t\t\t\treturn data[geography.properties.nameLong].value;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}}\n\t\t\t\tdimensions={{\n\t\t\t\t\theight: height,\n\t\t\t\t\twidth: width,\n\t\t\t\t}}\n\t\t\t\tcenter={[0, 0]}\n\t\t\t\tlegend={showLegend && }\n\t\t\t/>\n\t\t
\n\t);\n}\n\nWorldMap.propTypes = {\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.any,\n\tshowLegend: PropTypes.bool,\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { Button, Checkbox, Classes } from '@blueprintjs/core';\nimport { PropTypes } from 'prop-types';\n\nexport function PropertyCheckBox({ text, onChange, checked, ...rest }) {\n\tconst propertyStyle = css`\n\t\tmargin-bottom: 0;\n\t`;\n\n\treturn (\n\t\t\n\t);\n}\n\nPropertyCheckBox.propTypes = {\n\ttext: PropTypes.string,\n\tchecked: PropTypes.bool,\n\tonChange: PropTypes.func,\n};\n\nexport const textItemStyles = css`\n\tjustify-content: flex-start;\n\tpadding: 5px 10px 5px 0;\n\n\t.bp3-icon.bp3-icon-select:first-of-type {\n\t\tmargin: 0;\n\t}\n`;\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport { useContext } from 'react';\nimport { WorkspaceActionCreator } from '/hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { PropertyCheckBox } from 'components/dropdowns/propertyCheckBox';\n\nexport const BooleanSelector = ({\n\tcardIndex,\n\twidgetConfiguration,\n\tpropertyName,\n\tlabel,\n\t...rest\n}) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\tconst value = !!widgetConfiguration?.[propertyName];\n\n\tconst toggleProperty = () => {\n\t\tconst configuration = JSON.parse(JSON.stringify(widgetConfiguration));\n\t\tconfiguration[propertyName] = !value;\n\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, configuration));\n\t};\n\n\treturn (\n\t\t\n\t);\n};\n","import { USMapWrapper } from './wrapper';\nimport { USMapKnobs } from './knobs';\nimport { facets } from 'widgets/endpoints';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport {filterProperties} from \"utilities/srsUtils\";\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n key: \"US_MAP\",\n label: 'US Map',\n icon: 'globe',\n wrapper: USMapWrapper,\n endpoint: facets,\n Knobs: USMapKnobs,\n flags: flags,\n createDefaultOptions: (filteredProperties) => {\n return {\n options: {\n propertyList: [\n filteredProperties[0].name,\n ],\n parameters: {},\n },\n };\n },\n createDefaultConfiguration: (_filteredProperties) => {\n return {\n showLegend: true,\n };\n },\n isValid: (selectedDefinitionName) => {\n return filterProperties(selectedDefinitionName, flags).length >= 1;\n },\n};\n","import React, { useMemo } from 'react';\nimport { USMap } from '../map/index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { formatDataAsMap } from '../map/helpers';\nimport { selectDilDefinitionByName } from 'srs-middleware';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the US Map.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param selectedDefinitionName\n * @returns {*}\n * @constructor\n */\nexport function USMapWrapper({ widgetConfiguration, dimensions, data, selectedDefinitionName, noDataMessage=NO_DATA_MESSAGE }) {\n\t// get the actual definition\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst convertedData = useMemo(() => {\n\t\tif (!data || !selectedDefinition || !data[selectedDefinition.systemDefinitionId]) return;\n\n\t\tconst returnValue = Object.entries(data[selectedDefinition.systemDefinitionId]).map(entry => {\n\t\t\treturn {\n\t\t\t\tkey: entry[0],\n\t\t\t\t...entry[1],\n\t\t\t\tentries: entry[1].entries.map(e => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...e,\n\t\t\t\t\t\tkey: e.key,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\n\t\treturn formatDataAsMap(returnValue[0]);\n\t}, [data, selectedDefinition]);\n\n\t// If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\r\nimport { jsx } from '@emotion/react';\r\n// eslint-disable-next-line no-unused-vars\r\nimport React from 'react';\r\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\r\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\r\nimport { BooleanSelector } from 'components/selectors/booleanSelector';\r\n\r\n/**\r\n * Custom renderer for the controls available to change the chart settings.\r\n *\r\n * Data Properties for this Widget:\r\n * -- propertyList\r\n * -- limit\r\n *\r\n * Chart Properties for this Widget:\r\n *\r\n * @param chartConfiguration\r\n * @param updateConfiguration\r\n * @returns {*}\r\n * @constructor\r\n */\r\nexport const USMapKnobs = ({\r\n\tcardIndex,\r\n\tendpointQuery,\r\n\twidgetConfiguration = {},\r\n}) => {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { BooleanSelector } from 'components/selectors/booleanSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const WorldMapKnobs = ({\n\tcardIndex,\n\tendpointQuery,\n\twidgetConfiguration = {},\n}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} />\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} />\n\t\t\n\t);\n};\n","import { WorldMapWrapper } from './wrapper';\nimport { WorldMapKnobs } from './knobs';\nimport { facets } from 'widgets/endpoints';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport {filterProperties} from \"utilities/srsUtils\";\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n key: \"WORLD_MAP\",\n label: 'World Map',\n icon: 'globe',\n wrapper: WorldMapWrapper,\n endpoint: facets,\n Knobs: WorldMapKnobs,\n flags: flags,\n createDefaultOptions: (filteredProperties) => {\n return {\n options: {\n propertyList: [\n filteredProperties[0].name,\n ],\n parameters: {},\n },\n };\n },\n createDefaultConfiguration: (_filteredProperties) => {\n return {\n showLegend: true,\n };\n },\n isValid: (selectedDefinitionName) => {\n return filterProperties(selectedDefinitionName, flags).length >= 1;\n },\n};\n","import React, { useMemo } from 'react';\nimport { WorldMap } from '../map/index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { formatDataAsMap } from '../map/helpers';\nimport { selectDilDefinitionByName } from 'srs-middleware';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the World Map.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param selectedDefinitionName\n * @returns {*}\n * @constructor\n */\nexport function WorldMapWrapper({ widgetConfiguration, dimensions, data, selectedDefinitionName, noDataMessage=NO_DATA_MESSAGE }) {\n\t// get the actual definition\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst convertedData = useMemo(() => {\n\t\tif (!data || !selectedDefinition || !data[selectedDefinition.systemDefinitionId]) return;\n\n\t\tconst returnValue = Object.entries(data[selectedDefinition.systemDefinitionId]).map((entry) => {\n\t\t\treturn {\n\t\t\t\tkey: entry[0],\n\t\t\t\t...entry[1],\n\t\t\t\tentries: entry[1].entries.map((e) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...e,\n\t\t\t\t\t\tkey: e.key,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\n\t\treturn formatDataAsMap(returnValue[0]);\n\t}, [data, selectedDefinition]);\n\n\t//If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","export interface NameValue {\n\tname: string;\n\tvalue: number;\n\tcolorValue?: string | number;\n}\n\n/**\n * Reducer to sum up all values from an array of NameValue objects\n * @param runningTotal\n * @param nameValue\n */\nexport const sumValuesReducer = (runningTotal: number, nameValue: NameValue) => runningTotal + nameValue.value;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport * as d3 from 'd3';\nimport { useEffect, useMemo, useRef } from 'react';\nimport React from 'react';\nimport { PieArcDatum } from 'd3';\nimport { formatValue, Rectangle, intersectsAny } from 'utilities/utils';\nimport { NameValue, sumValuesReducer, Dimensions } from './../../interfaces';\nimport { GenericObject } from 'interfaces/GenericObject';\nimport { readableColor } from 'polished';\nimport { useHistory } from 'react-router';\nimport { fitLabelWidth } from 'widgets/chartUtils';\n\n/**\n * A pie graph with innerRadius > 0\n */\nconst DonutGraph: React.FC = ({\n\tcontainerDimensions: dimensions,\n\tdata,\n\tgetColor,\n\tcenterLabel = null,\n\trecordCountLabel: centerText = 'Total',\n\tinnerRadiusPercent = 0.4,\n\twidgetConfiguration = {},\n}) => {\n\tconst radius = Math.min(dimensions.height, dimensions.width) / 2; \n\tconst { colorByValue = false, hideLabels, hyperLink } = widgetConfiguration;\n\n\t//Only show the labels if we have enough extra space on the sides, and the donut is big enough\n\tconst diameter = radius * 2;\n\tconst showLabels: boolean = (dimensions.width - diameter) > 100;\n\tconst sliceLabelWidth = ((dimensions.width - diameter) / 2) - 12; //Find the available width on either side of the pie, then substract out a little more for padding\n\n\tconst svgRef = useRef(null);\n\tconst donutRef = useRef(null);\n\t//Used in mouse interactions. Otherwise the closure has the original value of colorByValue, which may have been updated\n\tconst colorByValueRef = useRef(colorByValue);\n\tcolorByValueRef.current = colorByValue;\n\tconst getColorRef = useRef(getColor);\n\tgetColorRef.current = getColor;\n\n\t//dataCache is needed for the slice animation.\n\tconst dataCache = useRef([]);\n\n\tconst mapColor = useMemo(() => {\n\t\treturn data.map((d) => d.name);\n\t}, [data]);\n\n\t// use history to create links to pages within the chart\n\tconst history = useHistory();\n\n\tconst navigateTo = (link) => {\n\t\thistory.push(link);\n\t};\n\n\tuseEffect(() => {\n\t\t// Filter out 0 value data so that wedges aren't shown.\n\t\tconst filteredData = data.filter(d => d.value !== 0);\n\n\t\tconst totalRecords = filteredData.reduce(sumValuesReducer, 0);\n\n\t\t//The arc used to draw the pie slices\n\t\tconst createSliceArc = createArc(radius * innerRadiusPercent, radius * (hideLabels ? 1.0 : 0.8));\n\t\t//The arc used to center the labels outside of the pie slice\n\t\tconst createLabelArc = createArc(radius * 0.9); //label base should be just outside the outer radius\n\t\t//The arc used to center the % labels, just inside the pie\n\t\tconst createPercentLabelArc = createArc(radius * 0.7); //percent label is just inside the outer radius\n\t\t//The arc that defines where the label line starts\n\t\tconst createLineInsertionArc = createArc(radius * 0.75);\n\n\t\t//pieData is an array of coordinates used to draw a pie\n\t\tconst pieData = createPie(filteredData);\n\t\tconst prevPieData = createPie(dataCache.current);\n\n\t\t//interpolator used to animate the pie slices (grow from previous size to new size)\n\t\tconst arcTween = (d: PieArcDatum, index: number) => {\n\t\t\t//default datum to use, if no previous pie slice exists.\n\t\t\tconst initialDatum: PieArcDatum = {\n\t\t\t\tstartAngle: 0,\n\t\t\t\tendAngle: 0,\n\t\t\t\tpadAngle: 0,\n\t\t\t\tvalue: 0,\n\t\t\t\tindex: index,\n\t\t\t\tdata: { name: '', value: 0 },\n\t\t\t};\n\t\t\tconst interpolator = d3.interpolate(prevPieData[index] ?? initialDatum, d);\n\t\t\treturn (t: number) => createSliceArc(interpolator(t));\n\t\t};\n\n\t\t/*** draw the pie slices ****/\n\t\td3.select(donutRef.current)\n\t\t\t.selectAll('path')\n\t\t\t.data(pieData)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('path')\n\t\t\t\t\t\t.attr('d', createSliceArc)\n\t\t\t\t\t\t.attr('fill', (d: PieArcDatum) => getColorRef.current(d.data.colorValue))\n\t\t\t\t\t\t.attr('stroke', 'white')\n\t\t\t\t\t\t.attr('cy-test', 'donut-data-slice'),\n\t\t\t\t(update) =>\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.attr('d', createSliceArc)\n\t\t\t\t\t\t.attr('fill', (d: PieArcDatum) => getColorRef.current(d.data.colorValue)),\n\t\t\t\t(exit) => exit.remove()\n\t\t\t)\n\t\t\t//on mouseover:\n\t\t\t//\t apply opacity to all non-hovered slices\n\t\t\t//\t put a thick black border on the hovered slice\n\t\t\t// display additional details within the label of the hovered slice\n\t\t\t.on('mouseover', function () {\n\t\t\t\t// (d,i) no longer supported in v6, have to get the index this janky way.\n\t\t\t\tconst index = d3.select(donutRef.current).selectAll('path').nodes().indexOf(this);\n\n\t\t\t\td3.select(donutRef.current)\n\t\t\t\t\t.selectAll('path')\n\t\t\t\t\t.transition('hoverTransition')\n\t\t\t\t\t.duration(250)\n\t\t\t\t\t.attr('opacity', () => '0.8');\n\t\t\t\td3.select(this)\n\t\t\t\t\t.transition('hoverTransition')\n\t\t\t\t\t.duration(250)\n\t\t\t\t\t.attr('opacity', () => '1')\n\t\t\t\t\t.attr('fill', (d: PieArcDatum) => {\n\t\t\t\t\t\tconst color = d3.color(getColorRef.current(d.data.colorValue));\n\t\t\t\t\t\tif (color) {\n\t\t\t\t\t\t\treturn color.darker().toString();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\td3.select(donutRef.current)\n\t\t\t\t\t.selectAll('.centerGroup .center-hover-text')\n\t\t\t\t\t.text(pieData.filter((d: PieArcDatum) => d.index === index)[0]?.data?.name);\n\n\t\t\t\td3.select(donutRef.current)\n\t\t\t\t\t.selectAll('.percentageText')\n\t\t\t\t\t.text((d: PieArcDatum) => getDataPercentageText(totalRecords, d, d.index === index));\n\n\t\t\t\t\t\n\t\t\t\td3.select(donutRef.current)\n\t\t\t\t\t.selectAll('.sliceLabelGroup')\n\t\t\t\t\t.classed('isHovered', (d: PieArcDatum) => (d.index === index))\n\t\t\t\t\t.style(\"opacity\", (d: PieArcDatum) => d.index === index ? \"1\" : null)\n\t\t\t\t\t.filter(\":not(.hideLabels)\")\n\t\t\t\t\t.classed('deemphasized', (d: PieArcDatum) => (d.index !== index))\n\n\t\t\t\tconst hoveredData: PieArcDatum = pieData.filter((d: PieArcDatum) => d.index === index)[0];\n\t\t\t\tconst detailText = `${hoveredData.data.value}, ${(\n\t\t\t\t\t((hoveredData?.data.value || 0) / totalRecords) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1)}%`;\n\n\t\t\t\td3.select(donutRef.current).selectAll('.centerGroup .center-hover-text-details').text(detailText);\n\t\t\t})\n\t\t\t// on mouseout, put all the slices back to normal\n\t\t\t.on('mouseout', () => {\n\t\t\t\tconst vizRef = d3.select(donutRef.current);\n\t\t\t\tvizRef\n\t\t\t\t\t.selectAll('path')\n\t\t\t\t\t.data(pieData)\n\t\t\t\t\t.transition('hoverTransition')\n\t\t\t\t\t.duration(250)\n\t\t\t\t\t.attr('opacity', '1')\n\t\t\t\t\t.attr('fill', (d: PieArcDatum) => getColorRef.current(d.data.colorValue));\n\n\t\t\t\tvizRef\n\t\t\t\t\t.selectAll('.percentageText')\n\t\t\t\t\t.text((d: PieArcDatum) => getDataPercentageText(totalRecords, d));\n\n\t\t\t\tvizRef\n\t\t\t\t\t.selectAll('.sliceLabelText')\n\t\t\t\t\t.attr('opacity', '1');\n\n\t\t\t\tvizRef\n\t\t\t\t\t.selectAll('.sliceLabelGroup')\n\t\t\t\t\t.classed('isHovered', false)\n\t\t\t\t\t.classed('deemphasized', false)\n\t\t\t\t\t.style(\"opacity\", null);\n\n\t\t\t\tvizRef\n\t\t\t\t\t.selectAll('.centerGroup')\n\t\t\t\t\t.selectAll('.center-hover-text, .center-hover-text-details')\n\t\t\t\t\t.text('');\n\t\t\t})\n\t\t\t.transition()\n\t\t\t.duration(1000)\n\t\t\t.attrTween('d', arcTween);\n\n\t\t//center text and labels need to be removed on updates, then we'll fade them in\n\t\td3.select(donutRef.current).selectAll('.sliceLabelText, .percentageText, .centerGroup, polyline').remove();\n\n\t\t//showLabels is based on widget container dimensions, hideLabels is based on switch in curated views and is set by user\n\t\tif (showLabels && !hideLabels) {\n\n\t\t\td3.select(donutRef.current)\n\t\t\t\t.selectAll('sliceLabelGroup')\n\t\t\t\t.data(pieData)\n\t\t\t\t.join((enter) => {\n\n\t\t\t\t\tconst group = enter.append('g').classed('sliceLabelGroup', true);\n\n\t\t\t\t\t\n\t\t\t\t\t//Add the Name property to the outside of the pie slice\n\t\t\t\t\tconst labelPositionList = {};\n\t\t\t\t\t// add lines to connect labels to slices\n\t\t\t\t\tgroup\n\t\t\t\t\t\t.append('polyline')\n\t\t\t\t\t\t.attr('stroke', 'gray')\n\t\t\t\t\t\t.style('fill', 'none')\n\t\t\t\t\t\t.attr('stroke-width', 1)\n\t\t\t\t\t\t.attr('points', (d: PieArcDatum): any => {\n\t\t\t\t\t\t\tvar posA = createLineInsertionArc.centroid(d); // line insertion in the slice\n\t\t\t\t\t\t\tvar posB = createLabelArc.centroid(d);\n\t\t\t\t\t\t\tvar posC = createLabelArc.centroid(d);\n\t\t\t\t\t\t\tvar midangle = getPieSliceMidangle(d); // we need the angle to see if the X position will be at the extreme right or extreme left\n\t\t\t\t\t\t\tposC[0] = radius * 0.95 * (midangle < Math.PI ? 1 : -1); // multiply by 1 or -1 to put it on the right or on the left\n\t\t\t\t\t\t\treturn [posA, posB, posC];\n\t\t\t\t\t\t});\n\n\t\t\t\t\tgroup\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.classed('sliceLabelText', true)\n\t\t\t\t\t\t.text((d: PieArcDatum) => d.data.name )\n\t\t\t\t\t\t.style('text-anchor', (d: PieArcDatum) => {\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn getPieSliceMidangle(d) < Math.PI ? 'start' : 'end';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('font-size', '.9em')\n\t\t\t\t\t\t.style('alignment-baseline', 'middle')\n\t\t\t\t\t\t.attr('transform', (d: PieArcDatum) => {\n\t\t\t\t\t\t\tvar pos = createLabelArc.centroid(d);\n\t\t\t\t\t\t\tpos[0] = radius * (getPieSliceMidangle(d) < Math.PI ? 1 : -1);\n\t\t\t\t\t\t\treturn `translate(${pos})`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'donut-data-slice-label')\n\t\t\t\t\t\t.style(\"cursor\", () => hyperLink ? \"pointer\" : null)\n\t\t\t\t\t\t.on(\"click\", (event,d) => {\n\t\t\t\t\t\t\tif(d?.data?.name && hyperLink) {\n\t\t\t\t\t\t\t\tif(hyperLink.includes(\"/curated_views/Organization\")){\n\t\t\t\t\t\t\t\t\t//HACK for now. May want to include the orgs key? Or make hyperLink a func? (dont love that idea bc it comes\n\t\t\t\t\t\t\t\t\t// thru widgetConfig, which should be hydratable\n\t\t\t\t\t\t\t\t\t// https://stackoverflow.com/a/47864833\n\t\t\t\t\t\t\t\t\tconst parsedKey = (d?.data?.name).match(/\\((.*)\\)/);\n\t\t\t\t\t\t\t\t\tconst key = parsedKey ? parsedKey.pop() : d?.data?.name;\n\t\t\t\t\t\t\t\t\tif (key)\n\t\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", key)}`, '_blank');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", d?.data?.name)}`, '_blank');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}})\n\t\t\t\t\t\t.each(function(d) {\n\t\t\t\t\t\t\tvar pos = createLabelArc.centroid(d);\n\t\t\t\t\t\t\tpos[0] = radius * (getPieSliceMidangle(d) < Math.PI ? 1 : -1);\n\n\t\t\t\t\t\t\tvar self = d3.select(this);\n\t\t\t\t\t\t\tconst bbox = self.node().getBBox();\n\n\t\t\t\t\t\t\tconst rectangle: Rectangle = { height: bbox.height, width: bbox.width , x: pos[0], y: pos[1] };\n\n\t\t\t\t\t\t\tfitLabelWidth(12.6, \"'Libre_Franklin',ArialMT,sans-serif\",\n\t\t\t\t\t\t\t\t\ttextLength => textLength > (sliceLabelWidth)).apply(this, arguments);\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (!intersectsAny(rectangle, Object.values(labelPositionList))) {\n\t\t\t\t\t\t\t\tlabelPositionList[d.data.name] = rectangle;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t// add the % on the inside the outer edge of the pie slice\n\t\t\t\t\tgroup\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.classed('percentageText', true)\n\t\t\t\t\t\t.text((d: PieArcDatum) => getDataPercentageText(totalRecords, d))\n\t\t\t\t\t\t.attr('font-size', '10px')\n\t\t\t\t\t\t.attr('pointer-events', 'none') // disable pointer events so that the % doesn't steal the hover event from the slice\n\t\t\t\t\t\t.style('text-anchor', 'middle')\n\t\t\t\t\t\t.style('fill', (d: PieArcDatum) => {\n\t\t\t\t\t\t\tconst color = getColorRef.current(d.data.colorValue);\n\t\t\t\t\t\t\treturn color ? readableColor(color) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.style('dominant-baseline', 'middle')\n\t\t\t\t\t\t.attr('transform', (d: PieArcDatum) => 'translate(' + createPercentLabelArc.centroid(d) + ')')\n\t\t\t\t\t\t.attr('cy-test', 'donut-data-slice-text');\n\n\t\t\t\t\t\t\n\t\t\t\t\tgroup.classed('hidden', (d) => !!centerLabel || !labelPositionList[d.data.name]);\n\n\t\t\t\t\treturn group;\n\t\t\t\t});\n\t\t}\n\t\t\n\t\t// don't use em or rem for font-size in svg\n\t\tconst centerTextFontSize = Math.round(Math.min(24, Math.max(radius / 10, 14))); //px\n\t\tconst detailsTextFontSize = 12; //px\n\t\tconst textLineSpacing = 8; //px\n\n\t\td3.select(donutRef.current).selectAll('.centerGroup').remove();\n\t\tlet centerGroup = d3\n\t\t\t.select(donutRef.current)\n\t\t\t.append('g')\n\t\t\t.classed('centerGroup', true)\n\t\t\t.style('font-size', centerLabel ? `${centerTextFontSize}px` : `${centerTextFontSize}px`)\n\t\t\t.style('text-anchor', 'middle');\n\t\tif (!centerLabel) {\n\t\t\tcenterGroup\n\t\t\t\t.append('text')\n\t\t\t\t.text(formatValue(totalRecords))\n\t\t\t\t.attr('y', `-${(centerTextFontSize)}px`)\n\t\t\t\t.style('font-weight', 'bold')\n\t\t\t\t.attr('cy-test', 'donut-data-center-total-records');\n\t\t\tcenterGroup\n\t\t\t\t.append('text')\n\t\t\t\t.text(centerText)\n\t\t\t\t.attr('y', `${(centerTextFontSize*0)}px`);\n\t\t\tcenterGroup\n\t\t\t\t.append('text')\n\t\t\t\t.classed('center-hover-text', true)\n\t\t\t\t.text('')\n\t\t\t\t.style('font-size', `${detailsTextFontSize}px`)\n\t\t\t\t.attr('y', `${(detailsTextFontSize + textLineSpacing)}px`);\n\t\t\tcenterGroup\n\t\t\t\t.append('text')\n\t\t\t\t.classed('center-hover-text-details', true)\n\t\t\t\t.text('')\n\t\t\t\t.style('font-size', `${detailsTextFontSize}px`)\n\t\t\t\t.attr('y', `${(detailsTextFontSize * 2 + textLineSpacing)}px`);\n\t\t} else {\n\t\t\tcenterGroup\n\t\t\t\t.append('text')\n\t\t\t\t.text(centerLabel)\n\t\t\t\t// Center the labels for multichart\n\t\t\t\t.style('dominant-baseline', 'central');\n\t\t}\n\n\t\t//animate the labels\n\t\td3.select(donutRef.current)\n\t\t\t.selectAll('.sliceLabelText, .percentageText, .centerGroup, polyline')\n\t\t\t.transition()\n\t\t\t.duration(1500)\n\t\t\t.ease(d3.easeExp)\n\t\t\t.styleTween('opacity', () => d3.interpolate('0', '1'));\n\n\t\t//dataCache is needed for the slice animation. Set the cache to the current data so we have it for the next render\n\t\tdataCache.current = data;\n\t}, [data, radius, centerText, dimensions, innerRadiusPercent, mapColor, centerLabel, showLabels, sliceLabelWidth]);\n\n\tuseEffect(() => {\n\t\t//draw the pie slices\n\t\td3.select(donutRef.current)\n\t\t\t.selectAll('path')\n\t\t\t.attr('fill', (d: PieArcDatum) => getColorRef.current(d.data.colorValue));\n\t}, [colorByValue]);\n\n\tuseEffect(() => {\n\t\tconst refSelection = d3.select(donutRef.current);\n\t\trefSelection\n\t\t\t.selectAll('.sliceLabelGroup, .centerGroup')\n\t\t\t.classed('hideLabels', hideLabels);\n\t\trefSelection //the opacity it set in style for this comp (to tween it i guess) so need to specifically set it here\n\t\t\t.selectAll('.centerGroup')\n\t\t\t.style(\"opacity\", hideLabels ? \"0\" : \"1\");\n\n\t\tconst createSliceArc = createArc(radius * innerRadiusPercent, radius * (hideLabels ? 1.0 : 0.8));\n\t\trefSelection\n\t\t\t.selectAll('path')\n\t\t\t.transition()\n\t\t\t.attr('d', createSliceArc)\n\t}, [hideLabels]);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nexport { DonutGraph };\n\nconst donutCss = css`\n\t.hideLabels {\n\t\topacity: 0;\n\t}\n\t\n\t.sliceLabelGroup:not(.isHovered){\n\t\t&.hidden{\n\t\t\tdisplay: none;\n\t\t}\n\t\t&.deemphasized{\n\t\t\topacity: .3;\n\t\t\tfont-size: .9em;\n\t\t}\n\t}\n\n\t.sliceLabelGroup.isHovered{\t\t\n\t\tfont-weight: 800;\n\t\tfont-size: 1.1em;\n\t}\n\n\t.centerGroup /*, text, tspan */ {\n\t\t/* outline text for overlap with bars (this may be a performance hit?) */\n\t\ttext-shadow: 0 0 2px white, 0 0 2px white, 0 0 2px white;\n\t}\n`;\n\n\n/**\n * A function to generate coordiates that can be used to generate a pie\n */\nconst createPie = d3\n\t.pie()\n\t.value((nameValuePair) => nameValuePair.value)\n\t.sort(null);\n\n/**\n * base function to create the arcs for the pice slices and labels\n * @param innerRadius\n * @param outerRadius\n */\nconst createArc = (innerRadius: number, outerRadius?: number) => {\n\treturn d3\n\t\t.arc>()\n\t\t.innerRadius(innerRadius)\n\t\t.outerRadius(outerRadius || innerRadius);\n};\n\n/**\n * Function to get a midangle of a slice\n * @param d\n */\nconst getPieSliceMidangle = (d: PieArcDatum) => d.startAngle + (d.endAngle - d.startAngle) / 2;\n\n/**\n * get the percentage with that \"%\" character appended. Optional parameter to specify rounding\n * @param totalRecords\n * @param d\n * @param fractionDigits\n */\nconst getDataPercentageText = (totalRecords: number, d: PieArcDatum, isHovered?: boolean): string => {\n\tconst percentageText = `${(((d.data.value || 0) / totalRecords) * 100).toFixed(isHovered ? 1 : 0)}%`;\n\n\tif (isHovered) {\n\t\treturn `${d.data.value}, ${percentageText}`;\n\t} else {\n\t\treturn percentageText;\n\t}\n};\n\ninterface DonutGraphProps {\n\t/**\n\t * The dimensions of the element that contains the donut\n\t */\n\tcontainerDimensions: Dimensions;\n\n\t/**\n\t * Array of NameValue objects representing the data to display in the donut\n\t */\n\tdata: NameValue[];\n\n\t/**\n\t * function that when passed a value will return the color to use\n\t */\n\tgetColor: (value: number | string) => string;\n\n\t/**\n\t * Function to call when a pie slice is clicked (selected)\n\t */\n\tonSelect: SelectFunc;\n\n\t/**\n\t * The widget config object\n\t */\n\twidgetConfiguration: GenericObject;\n\n\t/**\n\t * If this is set show this directly instead of the record count\n\t * Default: null\n\t */\n\tcenterLabel: string;\n\n\t/**\n\t * The text to append the to the sum of total records, display in the center of the donut\n\t * Default: \"Total\"\n\t */\n\trecordCountLabel: string;\n\n\t/**\n\t * The size of the inner radius, as a percentage of the smallest dimension\n\t * E.g. 20 will render a donut with an inner radius is 20% of min(height, width)\n\t */\n\tinnerRadiusPercent: number;\n}\n\ninterface SelectFunc {\n\t(args);\n}\n\n","/** @jsx jsx */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport React, { forwardRef } from 'react'\nimport { css, jsx } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { MouseEventHandler } from 'react';\n\n/**\n * One item in the legend\n * @param text the string to be displayed\n * @param color where color is the color to be displayed\n * @param mouseOver (key) => any\n * @param mouseOut () => any \n * @returns \n */\nexport const LegendItem = forwardRef(({\n text,color,mouseOver,mouseOut, enabled, onClick\n},ref) => {\n\tconst _onClick = (e) => {\n\t\tif(enabled && mouseOut) { //clicking to disable it, so if mouseOut exists should call that too\n\t\t\tmouseOut();\n\t\t}\n\t\tonClick(e);\n\t}\n return (\n enabled ?
mouseOver(text):null}\n onMouseOut={mouseOut ? () => mouseOut():null}\n onClick={_onClick}>\n
\n {text}\n
\n :
mouseOut():null}\n onClick={_onClick}>\n \n {text}\n
\n )\n})\n\nexport interface LegendItemProps {\n text;\n color;\n enabled:boolean;\n mouseOver;\n mouseOut;\n onClick:MouseEventHandler\n}\n\nconst colorBoxStyle = (color) => css`\n background-color: ${color};\n`\nconst legendItemStyle = css`\n padding-right: 6px;\n padding-top: 3px;\n padding-bottom: 3px;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n background-color: white;\n cursor:pointer;\n\n .label {\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t}\n .colorBox {\n width:20px;\n height:20px;\n border-radius: 3px;\n margin-right: 5px;\n flex-shrink: 0;\n }\n`\n","import { useRef, useState, useEffect, RefObject } from \"react\";\nimport ResizeObserver from \"resize-observer-polyfill\";\n\nconst initialState = { width: 0, height: 0 };\n\n/**\n * A hook for having up to date dimensions. These dimensions\n * always include padding and edge size and include margin by\n * default. The included margin is divided by 2 because margins\n * are shared between neighboring elements. This gives us a more\n * accurate picture or how much space an element takes up.\n */\nconst useDimensions = (ref:RefObject,includeMargin=true) => {\n const [dimensions, setDimensions] = useState(initialState);\n const resizeObserverRef = useRef(null);\n\n useEffect(() => {\n // Use ResizeObserver to know when something changed\n // but then use bounding box to get the full size\n // because the resize observer only gives us the\n // content size\n resizeObserverRef.current = new ResizeObserver((entries = []) => {\n entries.forEach((_) => {\n if (ref.current) {\n const width = ref.current.getBoundingClientRect().width\n const height = ref.current.getBoundingClientRect().height\n \n if (includeMargin) {\n const computedStyles = window.getComputedStyle(ref.current)\n const marginWidth = (pxStrToNum(computedStyles.marginLeft) + \n pxStrToNum(computedStyles.marginRight))/2\n const marginHeight = (pxStrToNum(computedStyles.marginTop) + \n pxStrToNum(computedStyles.marginBottom))/2\n setDimensions({\n width:width+marginWidth,\n height:height+marginHeight,\n })\n } else {\n setDimensions({ width, height });\n }\n }\n\n });\n });\n // If the ref is there, set the observer\n if (ref.current) resizeObserverRef.current.observe(ref.current);\n // Make sure to unsubscribe when the element is gone to avoid mem leaks\n return () => {\n if (resizeObserverRef.current) resizeObserverRef.current.disconnect();\n };\n }, [ref,includeMargin]);\n return dimensions;\n};\n\nconst pxStrToNum = (pxStr:string) => {\n try {\n return Number(pxStr.replace(\"px\",\"\"))\n } catch {\n throw Error(`Expected pixel string. Got ${pxStr}`)\n }\n}\n\nexport default useDimensions;","/** @jsx jsx */\n\nimport { RefObject, useRef } from \"react\";\nimport { css, jsx } from \"@emotion/react\";\nimport useDimensions from \"hooks/useDimensions\";\nimport { useEffect } from \"react\";\n\n/**\n * You give me a list of elements, of the same fixed height,\n * and I tell you how many of them I can fit.\n */\nexport default function FittingBox({children,\n firstChildRef,\n numFitCallback:iCanFit,\n lowerHeightBy = 0, \n ...props}:FittingBoxProps) {\n const {height:childHeight} = useDimensions(firstChildRef)\n\n const myRef = useRef()\n const {height:myHeight} = useDimensions(myRef)\n\n useEffect(()=> {\n if(childHeight && myHeight) {\n const thisManyChildren = Math.floor((myHeight-lowerHeightBy)/childHeight)\n iCanFit(thisManyChildren)\n }\n },[myHeight,childHeight,iCanFit,lowerHeightBy])\n\n return (\n
\n {children}\n
\n )\n}\ninterface FittingBoxProps {\n firstChildRef: RefObject;\n children:Array;\n numFitCallback: (numFit:number)=>void;\n /** \n * Pretend like the total height is this much lower than it is\n */\n lowerHeightBy?:number;\n [key:string]:unknown\n}\n\nconst fittingBoxCss = css`\n height:100%\n`\n","/** @jsx jsx */\nimport { Icon } from \"@blueprintjs/core\";\nimport { css, jsx } from \"@emotion/react\";\nimport { useCallback, useRef, forwardRef } from \"react\";\nimport { useEffect, useState } from \"react\"\nimport FittingBox from \"./FittingBox\"\n/**\n * Give me all your children, and I will use pagination\n * to display as many as will fit at once and prev/next \n * buttons to allow navigation to the rest.\n * \n * Assumes all children are the same size\n */\nexport default function Paginator({childrenProps,\n childRenderFunc: ChildRenderFunc,\n ...props}:PaginatorProps){\n const [[pageStart, pageEnd],setPageIndices] = useState([0,1])\n // The number of elements that will fit on a page.\n const [maxNumPerPage,setMaxNumPerPage] = useState(3)\n // Centralizing these numbers because they require a boundary check\n const [[numPerEdgePage,numPerMiddlePage],setNumsPerPage] = useState([2,1])\n const [pageNum,setPageNum] = useState(0)\n const [numPages, setNumPages] = useState(1)\n const firstChildRef = useRef()\n\n useEffect(()=>{\n setNumsPerPage([\n Math.max(maxNumPerPage-1,0),\n Math.max(maxNumPerPage-2,0)\n ])\n },[maxNumPerPage])\n\n // Keep page indices up to date\n\tuseEffect(()=>{\n // Only one page\n if (childrenProps.length <= maxNumPerPage) {\n setPageIndices([\n 0,\n maxNumPerPage\n ])\n return\n }\n // First page\n if (pageNum === 0) {\n setPageIndices([\n 0,\n numPerEdgePage\n ])\n return\n }\n // Last page\n if (pageNum === numPages-1) {\n setPageIndices([\n childrenProps.length-numPerEdgePage,\n childrenProps.length\n ])\n return\n }\n // Middle page\n\t\tsetPageIndices([\n // Num items per middle page * pageNum + extra item on first page\n\t\t\tnumPerMiddlePage*pageNum+1,\n\t\t\tnumPerMiddlePage*(pageNum+1)+1\n\t\t])\n\t},[maxNumPerPage,pageNum,numPages,childrenProps.length,numPerMiddlePage,numPerEdgePage])\n\n // Keep numPages up to date while guaranteeing there is at least 1 page\n useEffect(()=>{\n setNumPages(Math.max(\n // The first/last page show an extra element so subtract 2\n Math.ceil((childrenProps.length-2)/(numPerMiddlePage)),\n 1\n ))\n },[numPerMiddlePage,maxNumPerPage,childrenProps.length])\n\n // Create some booleans that will guide what buttons to show\n const onlyOnePage = maxNumPerPage >= childrenProps.length\n const firstPage = !onlyOnePage && pageNum===0\n const lastPage = pageEnd >=childrenProps.length && !onlyOnePage\n const middlePage = !lastPage && !firstPage && !onlyOnePage\n\n // Set page num while guaranteeing pageNum is valid\n const nextPage = useCallback(()=>{ \n setPageNum(Math.min(pageNum+1,numPages-1))\n },[pageNum,numPages])\n const prevPage = useCallback(()=>{\n setPageNum(Math.max(pageNum-1,0))\n },[pageNum])\n\n const moreIcon = \n\n const nextPageButton =
\n {moreIcon}\n {\" NEXT\"}\n
\n const prevPageButton =
\n {moreIcon}\n {\" PREVIOUS\"}\n
\n\n const childrenPropsToShow = childrenProps.slice(pageStart,pageEnd)\n const childrenToShow = childrenPropsToShow.map((childProps,i)=>{\n return \n })\n\n return (\n \n {/* This is a little messy but it makes the typescript \n happy and the cleaner solution didn't so its staying */}\n {[(lastPage || middlePage) && prevPageButton]\n .concat(childrenToShow)\n .concat([(firstPage || middlePage) && nextPageButton])}\n \n )\n}\n\ninterface PaginatorProps {\n childrenProps: unknown[];\n childRenderFunc: ReturnType;\n [key:string]:unknown\n}\n\nconst ICON_SIZE = 14\nconst ICON_COLOR = '#6699CC'\n\nconst IconCss = css`\n border: 2px solid ${ICON_COLOR};\n color: ${ICON_COLOR};\n border-radius: 15px;\n padding: 1px;\n margin-right:4px;\n`\nconst buttonCss = css `\n display: flex;\n align-content: space-around;\n align-items: center;\n cursor: pointer;\n`","/** @jsx jsx */\nimport { Menu, MenuItem } from '@blueprintjs/core';\nimport { jsx } from '@emotion/react';\nimport { WidgetControlsDispatchType } from 'views/common/WidgetControls/types';\n\nexport default function LegendRightClickMenu (\n {dispatch}:LegendRightClickMenuProps\n ) {\n return (\n \n dispatch({type:\"enableAllKeys\"})}\n text=\"Enable All\"/>\n dispatch({type:\"disableAllKeys\"})}\n text=\"Disable All\"/>\n \n )\n}\n\ninterface LegendRightClickMenuProps {\n dispatch: WidgetControlsDispatchType\n}\n\n","/** @jsx jsx */\nimport { useMemo} from 'react';\nimport { css, jsx } from '@emotion/react';\nimport { LegendItem, LegendItemProps } from './LegendItem';\nimport { forwardRef } from 'react';\nimport Paginator from './Paginator';\nimport LegendTitle from './LegendTitle';\nimport { ContextMenu2 } from '@blueprintjs/popover2';\nimport LegendRightClickMenu from './LegendRightClickMenu';\nimport { WidgetControlsDispatchType } from 'views/common/WidgetControls/types';\nimport { useEffect } from 'react';\n\n/**\n * A horizontal legend. Only displays when the data contains labels.\n * \"\" is not a label.\n * @param data [{key:string} | string] where key is what will be\n * displayed in the legend\n * @param colorScale (key) => color\n * @param mouseOver (key) => any\n * @param mouseOut () => any\n * @param sm use small width\n * @param lg use large width\n */\nexport const Legend = forwardRef(({data, \n\t\t\t\t\t\tcolorScale, \n\t\t\t\t\t\tkeyValues,\n\t\t\t\t\t\tmouseOver, \n\t\t\t\t\t\tmouseOut,\n\t\t\t\t\t\tonClick,\n\t\t\t\t\t\tsm = false, \n\t\t\t\t\t\tlg = false,\n\t\t\t\t\t\tdispatch },ref) => {\n\tconst sizeStyle = sm ? smallStyle : lg ? largeStyle : mediumStyle;\n\tlet dataTyped: ({ key: string } | string)[] = data;\n\n\t// True if the data included any label info\n\tconst hasLabels:boolean = useMemo(()=> {\n\t\tconst combinedLabels = dataTyped?.reduce((p,n)=>{\n\t\t\tif (typeof n == \"string\") return n + p\n\t\t\tif (typeof n == \"object\") return p+n.key\n\t\t\treturn \"\"\n\t\t},\"\")\n\t\treturn combinedLabels ? true : false\n\t},[dataTyped])\n\n\tconst legendItemsProps: LegendItemProps[] = useMemo(()=>{\n\t\treturn dataTyped.map((d) => {\n\t\t\tconst key = typeof d === 'string' \n\t\t\t\t? d \n\t\t\t\t: (d as { key: string }).key;\n\t\t\treturn {\n\t\t\t\tkey:key,\n\t\t\t\ttext:key,\n\t\t\t\tenabled:keyValues ? keyValues[key] : true,\n\t\t\t\tcolor:colorScale(key),\n\t\t\t\tmouseOver:mouseOver,\n\t\t\t\tmouseOut:mouseOut,\n\t\t\t\tonClick:()=>onClick(key)\n\t\t\t}\n\t\t})\n\t},[dataTyped,mouseOver,mouseOut,colorScale,keyValues,onClick])\n\tuseEffect(()=>{\n\t\tdispatch({type:\"setLegendItemProps\",payload:legendItemsProps})\n\t},[legendItemsProps,dispatch])\n\n\tconst rightClickMenu = \n\n\treturn (\n\t\t// Only return a legend if labels were given\n\t\thasLabels && \n\t\t\t\n\t\t\n\t);\n});\n\ninterface LegendProps {\n\tdata: { key: string }[] | string[];\n\t/**\n\t * These values indicate whether or not a given\n\t * key is enabled. Disabled keys will appear\n\t * greyed out.\n\t */\n\tkeyValues?: {[key:string]:boolean};\n\tcolorScale;\n\tshowTitle?:boolean;\n\tref?;\n\tmouseOver?;\n\t/** \n\t * The function that will be called by a legend item\n\t * when it is clicked\n\t */\n\tonClick?: (string)=>unknown;\n\tmouseOut?;\n\tsm?;\n\tmd?;\n\tlg?;\n\tdispatch:WidgetControlsDispatchType;\n}\n\nconst legendContainerStyle = css`\n\tdisplay: flex;\n flex-direction: column;\n\theight:100%\n`\n\nconst legendStyle = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-wrap: nowrap;\n\tjustify-content: flex-start;\n\tcolor: #666666\n`;\n\nconst interactiveStyle = css`\n\t.legendItem:hover {\n\t\tbackground-color: #e4e4e4;\n\t}\n`;\n\nconst legendWidthStyle = (legendRemWidth) => css`\n\twidth: ${legendRemWidth}px;\n`;\nexport const SMALL_STYLE_WIDTH = 112;\nconst smallStyle = legendWidthStyle(SMALL_STYLE_WIDTH);\nexport const MEDIUM_STYLE_WIDTH = 144;\nconst mediumStyle = legendWidthStyle(MEDIUM_STYLE_WIDTH);\nexport const LARGE_STYLE_WIDTH = 192;\nconst largeStyle = legendWidthStyle(LARGE_STYLE_WIDTH);\n","import { createContext } from \"react\";\nimport { WidgetControlsContextType } from \"./types\";\n\nconst defaultContextValue = {\n state: undefined,\n dispatch: undefined\n}\nexport const WidgetControlsContext = \n createContext(defaultContextValue);","/** @jsx jsx */\nimport React from \"react\";\nimport { css, jsx } from '@emotion/react';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Icon, Menu, MenuItem } from '@blueprintjs/core';\nimport { Popover2 } from '@blueprintjs/popover2';\n\nimport \"@blueprintjs/popover2/lib/css/blueprint-popover2.css\";\nimport { GenericObject } from 'interfaces/GenericObject';\n\n/**\n *\n * @description Wrapper for ObjectDropdown that provides a dropdown name\n */\nexport const Filter = ({ options, selectedItem, onSelectionChanged }) => {\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\t{\n\t\t\t\t\t\toptions?.map(k => \n\t\t
\n\t);\n};\n\nfunction Option({onClick, active, item}) {\n\tconst _onClick= () => {\n\t\tonClick(item);\n\t}\n\treturn \n}\n\n\nexport interface FilterProps {\n\toptions: Array,\n\tonSelectionChanged: (arg: FilterOption) => void;\n\tselectedItem: FilterOption;\n}\n\nexport interface FilterOption extends GenericObject {\n\tkey: string;\n}\n\nconst filterStyle = css`\n\talign-items: center;\n\tmargin: auto 0 auto auto;\n\tjustify-content: center;\n\tposition: relative;\n\n\t& .filter-title {\n\t\tmargin-right: 5px;\n\t}\n\t\n\t& .bp3-icon-caret-down {\n\t\t//margin-top did nothing and margin-bottom worked but cause time icon to also move down\n\t\tposition: relative;\n\t\ttop: -6px;\n\t}\n`;\n","/** @jsx jsx */\nimport { Popover2 } from \"@blueprintjs/popover2\";\nimport { css, jsx } from \"@emotion/react\";\nimport { LegendItem } from \"./LegendItem\";\n\nexport default function LegendPopOver({children,legendItemProps}) {\n const popOverContent = \n
\n {legendItemProps.map((itemProps)=>)}\n
\n return (\n \n {children}\n \n )\n}\n\nconst popoverCss = css`\n padding: 1em;\n background: white;\n border-radius: 4px;\n overflow-y: auto;\n max-height: 100vh;\n max-width: 50vw;\n`","/** @jsx jsx */\nimport { Icon } from \"@blueprintjs/core\";\nimport { css, jsx } from \"@emotion/react\";\nimport LegendPopOver from \"./LegendPopOver\";\n\n/**\n * A title for the legend that displays a popup of all the\n * items when it's icon is hovered over\n */\nexport default function LegendTitle({legendItemProps}) {\n return (\n
\n \n \n \n
\n )\n}\n\nconst ICON_COLOR = \"#6699CC\"\n\nconst legendTitleCss = css`\n .bp3-icon {\n color:${ICON_COLOR}\n }\n flex-direction: row;\n display: flex;\n`\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Filter } from 'views/curatedViews/Filter';\nimport LegendTitle from 'components/legendV2/LegendTitle';\n\nexport function ControlsContainer({hideLabels, \n toggleLabels, \n filterOptions,\n enableLabelsToggle,\n\t\t\t\t\t\t\t\t legendItemProps\n }) {\n\n\treturn (\n\t\t
\n\t\t\t{enableLabelsToggle ? : null}\n\t\t\t{filterOptions ? : null}\n\t\t\t{legendItemProps ? : null}\n\t\t
\n\t)\n}\n\nconst controlsContainerCss = css`\n\tjustify-content: center;\n\talign-items: center;\n\n\t& .bp3-icon {\n\t\tcolor: #6699CC;\n\t}\n\t\n\t& > * {\n\t\tpadding: 1px 9px;\n\t\tcursor: pointer;\n\t\t\n\t\t&:not(:last-child) {\n\t\t\tborder-right: 1px solid #d0d0d0;\n\t\t}\n\t}\n`","import { kMaxLength } from \"buffer\";\nimport { LegendItemProps } from \"components/legendV2/LegendItem\";\nimport { FilterProps } from \"views/curatedViews/Filter\";\nimport { InputLegendData, LegendData, WidgetControlsAction, WidgetControlsContextState } from \"./types\";\n\nexport const widgetControlsReducer = (\n state: WidgetControlsContextState,\n action: WidgetControlsAction\n):WidgetControlsContextState => {\n switch (action.type) {\n case \"disableAllKeys\":\n return disableAllKeys(state);\n case \"enableAllKeys\":\n return enableAllKeys(state);\n case \"toggleKey\":\n return toggleKey(state,action.payload)\n case \"hideLabels\":\n return hideLabels(state);\n case \"showLabels\":\n return showLabels(state)\n case \"toggleLabels\":\n return toggleLabels(state);\n case \"setLabelsToggleBtnStatus\":\n return setLabelsToggleBtnStatus(state, action.payload);\n case \"setLegend\":\n return setLegend(state,action.payload);\n case \"setFilterProps\":\n return setFilterProps(state,action.payload)\n case \"setLegendItemProps\":\n return setLegendItemProps(state,action.payload)\n }\n}\n\nfunction hideLabels(state: WidgetControlsContextState): WidgetControlsContextState {\n return {...state,hideLabels:true}\n}\n\nfunction showLabels(state: WidgetControlsContextState): WidgetControlsContextState {\n return {...state,hideLabels:true}\n}\n\nfunction toggleLabels(state: WidgetControlsContextState): WidgetControlsContextState {\n\treturn {...state, hideLabels: !state.hideLabels};\n}\n\nfunction setLabelsToggleBtnStatus(state: WidgetControlsContextState, status: boolean): WidgetControlsContextState {\n\t\treturn {...state,enableLabelsToggle: status};\n}\n\nfunction setLegend(state: WidgetControlsContextState, payload: InputLegendData): WidgetControlsContextState {\n let keyValues = {}\n let allKeys = \"\"\n // init keyValues and check to make sure labels were sent\n payload.keys.forEach((k)=>{\n allKeys += k;\n keyValues[k]=true\n })\n // If all the keys are empty don't update\n if(allKeys===\"\") return state\n const newPayload:LegendData = {\n ...payload,\n keyValues:keyValues\n }\n return {...state,legend:newPayload}\n}\n\nfunction setFilterProps(state: WidgetControlsContextState, payload: FilterProps): WidgetControlsContextState {\n return {...state,filterOptions:payload}\n}\n\n/**\n * Get a reducer that modifies all keys to the setTo\n * value\n */\n const getKeySetter = (setTo:boolean) => (\n state: WidgetControlsContextState\n): WidgetControlsContextState => {\n let keyValues = {}\n // init keyValues and check to make sure labels were sent\n state.legend.keys.forEach((k)=>{\n keyValues[k]=setTo\n })\n \n return {...state, legend:{...state.legend,keyValues:keyValues}}\n}\n\nconst disableAllKeys = getKeySetter(false)\nconst enableAllKeys = getKeySetter(true)\n\nfunction toggleKey(state: WidgetControlsContextState, payload: string): WidgetControlsContextState {\n let keyValues = {...state.legend.keyValues}\n keyValues[payload] = !keyValues[payload]\n return {...state, legend:{...state.legend,keyValues:keyValues}}\n}\n\nfunction setLegendItemProps(state: WidgetControlsContextState, payload: LegendItemProps[]): WidgetControlsContextState {\n return {...state, legend:{...state.legend,legendItemProps:payload}}\n}\n\n","/** @jsx jsx */\nimport {css, jsx } from \"@emotion/react\";\nimport {Legend} from \"components/legendV2\"\nimport { useEffect, useReducer } from 'react';\nimport {Fragment, useCallback } from \"react\";\nimport { useContext } from \"react\";\nimport { WidgetControlsContext } from \"./context\";\nimport { ControlsContainer } from \"./ControlsContainer\";\nimport { widgetControlsReducer } from \"./reducer\";\nimport { WidgetControlsContextState } from \"./types\";\n\n/**\n * This component allows children to hook into the\n * widget controls context. It also uses the state\n * of that context to display the following widget\n * controls: legend, label toggle, and time adjustment\n */\nexport function WidgetControls({title = undefined,\n children,\n filterOptions = undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t curatedViewMode}) {\n const initContext:WidgetControlsContextState = {\n hideLabels:false,\n\t\tenableLabelsToggle: false,\n filterOptions: filterOptions\n }\n const [contextState, dispatch] = useReducer(\n widgetControlsReducer,\n initContext\n );\n //Since the filter is changed up above the SimpleCard, and these Controls, we need to update the reducer to match\n useEffect(() => {\n \tdispatch({type: \"setFilterProps\", payload: filterOptions});\n\t\t}, [filterOptions])\n\n const onLegendItemClick = useCallback((key)=>{\n dispatch({type:\"toggleKey\",payload:key})\n },[dispatch]);\n\n return (\n \n
\n\t\t\t\t\t\t\t{curatedViewMode ?\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t dispatch({ type: 'toggleLabels' })}\n\t\t\t\t\t\t\t\t\t\t\tfilterOptions={contextState.filterOptions}\n\t\t\t\t\t\t\t\t\t\t\tenableLabelsToggle={contextState.enableLabelsToggle}\n legendItemProps={\n contextState?.legend?.legendItemProps\n }/>\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
: null\n\t\t\t\t\t\t\t}\n
\n {contextState.legend \n ? \n : null}\n \n
\n
\n {children}\n
\n
\n
\n )\n}\n\nconst widgetControlsCss = curatedViewMode => css`\n display: grid;\n grid-template-areas: ${curatedViewMode ? \n '\"title controls controls\" \"body body legend\"' : '\"body body legend\"'\n };\n grid-template-columns: 1fr auto auto;\n justify-content: center;\n align-items: stretch;\n width:100%;\n height:100%;\n\n .WC-Title {\n grid-area: title;\n }\n .WC-Controls {\n grid-area: controls;\n justify-self: end;\n }\n .WC-Legend {\n grid-area: legend;\n }\n .WC-Body {\n grid-area: body;\n display: flex;\n width: 100%;\n }\t\n`\n\n/**\n * This context uses the reducer pattern to provide the state of the\n * context as well as a dispatch function which can be used to update\n * that state.\n * \n * Note: If this is used outside of a WidgetControls context dispatch will\n * have no effect and state will be undefined.\n */\nexport const useWidgetControlsContext = () => {\n const {dispatch, state} = useContext(WidgetControlsContext)\n if (dispatch === undefined) return {dispatch:(_)=>undefined,state}\n return {dispatch, state}\n}\n\n\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { Select } from '@blueprintjs/select';\nimport { Button, Classes, MenuItem } from '@blueprintjs/core';\nimport React from 'react';\nimport { PropTypes } from 'prop-types';\nimport { ColorAliases, Variables as VARIABLES } from 'styles/variables';\n\nfunction getValue(item = {}) {\n\treturn item.value;\n}\n\nfunction getLabel(item = {}) {\n\treturn item.label;\n}\n\nexport const LIMIT_TYPES = {\n\tNO_LIMIT: 'NO_LIMIT',\n\tAUTO: 'AUTO',\n};\n\nconst ItemRenderer = (item, { handleClick, modifiers, index }) => {\n\tif (!modifiers.matchesPredicate) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t\n\t);\n};\n\nconst _options = [\n\t// ...insertIf(canRenderNoLimit, {\n\t// \tlabel: 'No Limit',\n\t// \tvalue: LIMIT_TYPES.NO_LIMIT,\n\t// }),\n\t// ...insertIf(canRenderAuto, {\n\t// \tlabel: 'Auto',\n\t// \tvalue: LIMIT_TYPES.AUTO,\n\t// }),\n\t{\n\t\tlabel: '1,000,000',\n\t\tvalue: 1000000,\n\t},\n\t{\n\t\tlabel: '100,000',\n\t\tvalue: 100000,\n\t},\n\t{\n\t\tlabel: '10,000',\n\t\tvalue: 10000,\n\t},\n\t{\n\t\tlabel: '5,000',\n\t\tvalue: 5000,\n\t},\n\t{\n\t\tlabel: '1,000',\n\t\tvalue: 1000,\n\t},\n\t{\n\t\tlabel: '100',\n\t\tvalue: 100,\n\t},\n\t{\n\t\tlabel: '50',\n\t\tvalue: 50,\n\t},\n\t{\n\t\tlabel: '20',\n\t\tvalue: 20,\n\t},\n\t{\n\t\tlabel: '10',\n\t\tvalue: 10,\n\t},\n];\nexport const LimitDropdown = ({\n\tactiveLimit,\n\tonLimitChanged,\n\tcardIndex,\n\tendpointQuery,\n\toptions = _options,\n\t...rest\n}) => {\n\tconst activeItem = options.find((option) => option.value === activeLimit);\n\tif(activeItem === undefined && activeLimit !== LIMIT_TYPES.AUTO) //can be AUTO on init render, but then set a moment later\n\t\tconsole.error(`Limit Drop Down: Active Item not found in options for ${rest.label}. Check Widgets default config`);\n\treturn (\n\t\t {\n\t\t\t\tonLimitChanged(cardIndex, endpointQuery, getValue(option));\n\t\t\t}}\n\t\t\tactiveItem={activeItem}\n\t\t\tpopoverProps={{ minimal: true }}\n\t\t\t{...rest}\n\t\t>\n\t\t\t\n\t\t\n\t);\n};\n\nLimitDropdown.propTypes = {\n\tactiveLimit: PropTypes.any,\n\tcanRenderAuto: PropTypes.any,\n\tcanRenderNoLimit: PropTypes.any,\n\tlabel: PropTypes.string,\n\tonLimitChanged: PropTypes.any,\n};\n\nexport function getLimitValue(limitTo, autoLimitVal, noLimitVal) {\n\tlet limitToUse = limitTo;\n\tif (limitTo === LIMIT_TYPES.AUTO) {\n\t\tlimitToUse = autoLimitVal;\n\t} else if (limitTo === LIMIT_TYPES.NO_LIMIT) {\n\t\tlimitToUse = noLimitVal;\n\t}\n\treturn limitToUse;\n}\n\nconst limitDropdownStyles = css`\n\tborder: 1px solid #CED9E0;\n\tborder-radius: 3px;\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\t& .bp3-button-text {\n\t\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\t\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\t\tcolor: ${ColorAliases.PT_ICON_COLOR};\n\t\tline-height: 18px;\n\t}\n`;\n\nexport function generateLimitDropdownOptionsFromList(listOfStrings) {\n\treturn listOfStrings.map(label => ({label, value: parseInt(label.replace(/,/g, ''), 10)}))\n}\n","/** @jsx jsx */\nimport {css, jsx} from '@emotion/react';\nimport { LimitDropdown, LIMIT_TYPES, getLimitValue } from 'components/dropdowns/limitDropdown';\nimport { useContext, useEffect, useState } from 'react';\nimport { ColorAliases, Variables as VARIABLES } from 'styles/variables';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\n\nexport const LimitSelector = ({\n\tcardIndex,\n\tinitialLimit = LIMIT_TYPES.AUTO,\n\tautoLimit = null,\n\tendpointQuery,\n\tcanRenderAuto = true,\n\tcanRenderNoLimit = true,\n\tlimitProperty = 'MaxValues',\n\tlabel = 'Item Limit',\n widgetConfiguration,\n\t...rest\n}) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\tconst [limitTo, setLimitTo] = useState(initialLimit);\n\n\t// If endpointQuery has a value for the limitProperty use that. Don't need to call handleSetLimit\n\t// because that would update endpointQuery...to what it is already. Just update the local state\n\tuseEffect(() => {\n\t\tif (endpointQuery?.options?.parameters) {\n\t\t\tsetLimitTo(endpointQuery?.options?.parameters?.[limitProperty])\n\t\t}\n\t}, [endpointQuery]);\n\n\tconst handleSetLimit = (cardIndex, endpointQuery, value) => {\n\t\tsetLimitTo(value);\n\t\tconst options = JSON.parse(JSON.stringify(endpointQuery?.options));\n\t\toptions.parameters[limitProperty] = getLimitValue(value, autoLimit, null);\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, { options }));\n\t};\n\n\n\tconst dropdownProps = {\n\t\tactiveLimit: limitTo,\n\t\tonLimitChanged: handleSetLimit\n\t}\n\t//NOTE: in widget config, widgetConfiguration the name of the options field must follow this convention.\n\tconst options = widgetConfiguration && widgetConfiguration[`${limitProperty}_options`];\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t{label}\n\t\t\t\n\n\t\t\t\n\t\t
\n\t);\n};\n\n//To target the .popover-target would require popoverProps={{targetProps: {css : dropDownCss}}}. That doesn't work\n//because it \"stringifies\" the dropDownCss prop. This way gets us around that.\nconst dropDownCss = css`\n\t& > span {\n\t\twidth: 100%;\n\t}\n`;\n\nconst labelCss = css`\n\tmargin-bottom: 0;\n\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\tcolor: ${ColorAliases.PT_HEADING_COLOR};\n\tfont-weight: normal;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { Select } from '@blueprintjs/select';\nimport { Button, Classes, MenuItem } from '@blueprintjs/core';\nimport { PropTypes } from 'prop-types';\nimport { filterItem, textItemRenderer, textItemStyles } from \"./utils\";\nimport { ColorAliases, Variables as VARIABLES } from 'styles/variables';\n\nexport const Dropdown = ({ activeItem, onSelectionChanged, options = [], label, buttonWidth=\"100%\", ...rest }) => {\n\tconst selectBtnCss = css`\n\t\tborder: 1px solid #CED9E0;\n\t\tborder-radius: 3px;\n\t\tdisplay: flex;\n\t\twidth: ${buttonWidth};\n\t\tjustify-content: space-between;\n\t\t& .bp3-button-text {\n\t\t\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\t\t\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\t\t\tcolor: ${ColorAliases.PT_ICON_COLOR};\n\t\t\tline-height: 18px;\n\t\t}\n\t`;\n\n\treturn item)}\n\t\tnoResults={}\n\t\tonItemSelect={onSelectionChanged}\n\t\tactiveItem={activeItem}\n\t\tpopoverProps={{ minimal: true }}\n\t\t{...rest}\n\t>\n\t\t\n\t\n};\n\nDropdown.propTypes = {\n\tactiveItem: PropTypes.string,\n\tlabel: PropTypes.any,\n\tonSelectionChanged: PropTypes.any,\n\toptions: PropTypes.array,\n};\n\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { useContext } from 'react';\nimport { WorkspaceActionCreator } from '/hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { Dropdown } from 'components/dropdowns/dropdown';\nimport { ColorAliases, Variables as VARIABLES } from 'styles/variables';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst colorOptions = Object.values(DefaultChartColorScales);\n\nexport const ColorSelector = ({ cardIndex, widgetConfiguration, activeItem, label, ...rest }) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\tconst selectProperty = (value) => {\n\t\tconst configuration = JSON.parse(JSON.stringify(widgetConfiguration));\n\t\tconfiguration.colorScale = value;\n\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, configuration));\n\t};\n\n\treturn (\n\t\t
\n\t\t\tColor Using\n\t\t\t selectProperty(value)}\n\t\t\t\toptions={widgetConfiguration?.availableColorScales || colorOptions}\n\t\t\t\tlabel=\"Color Using\"\n\t\t\t\tcss={dropDownCss}\n\t\t\t\t{...rest}\n\t\t\t/>\n\t\t
\n\t);\n};\n\n//To target the .popover-target would require popoverProps={{targetProps: {css : dropDownCss}}}. That doesn't work\n//because it \"stringifies\" the dropDownCss prop. This way gets us around that.\nconst dropDownCss = css`\n\t& > span {\n\t\twidth: 100%;\n\t}\n`;\n\nconst labelCss = css`\n\tmargin-bottom: 0;\n\tfont-family: ${VARIABLES.PT_FONT_FAMILY};\n\tfont-size: ${VARIABLES.PT_FONT_SIZE};\n\tcolor: ${ColorAliases.PT_HEADING_COLOR};\n\tfont-weight: normal;\n`;\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useCallback, useContext, useMemo } from 'react';\nimport { PropertyDropdown } from 'components/dropdowns/propertyDropdown';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { selectDilDefinitionByName, selectPropertyListFromDilByNames } from 'srs-middleware';\n\n/**\n * Selects a property from a list of filtered properties.\n *\n * @param cardIndex\n * @param propertyName\n * @param label\n * @param flags\n * @param types\n * @param endpointQuery\n * @param limitProperty\n * @param rest\n * @returns {JSX.Element}\n * @constructor\n */\nexport const EndpointPropertySelector = ({ cardIndex, propertyName, label, flags, types, endpointQuery, ...rest }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\n\tconst handleSelectionChange = useCallback(\n\t\t(newVal) => {\n\t\t\tconst configuration = JSON.parse(JSON.stringify(endpointQuery));\n\t\t\tif (newVal === null) {\n\t\t\t\tdelete configuration.options.parameters[propertyName];\n\t\t\t} else {\n\t\t\t\tconfiguration.options.parameters[propertyName] = newVal.name;\n\t\t\t}\n\t\t\tdispatch(WorkspaceActionCreator.options(cardIndex, configuration));\n\t\t},\n\t\t[cardIndex, dispatch, endpointQuery, propertyName]\n\t);\n\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst activeItem = useMemo(() => {\n\t\tconst existingName = endpointQuery?.options?.parameters?.[propertyName];\n\t\tif (!existingName) return null;\n\n\t\t// TODO: SRS-MIDDLEWARE should add a singular call\n\t\treturn selectPropertyListFromDilByNames(selectedDefinitionName, [existingName])?.[0];\n\t}, [endpointQuery, propertyName, selectedDefinitionName]);\n\n\treturn (\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useContext } from 'react';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport {CommonDropdownWithLabel} from '../dropdowns/common-dropdown-with-label';\n\n/**\n * Allows for the selection of a parameter with the given property name chosen from the given set of values\n *\n * @param cardIndex\n * @param propertyName\n * @param label\n * @param values\n * @param defaultValue\n * @param endpointQuery\n * @param optionToString\n * @param optionToValue\n * @param rest\n * @returns {JSX.Element}\n * @constructor\n */\nexport const EndpointParameterSelector = ({\n\tcardIndex,\n\tpropertyName,\n\tvalues,\n\tdefaultValue,\n\tendpointQuery,\n\toptionToString = (item) => item?.label,\n\toptionToValue = (item) => item?.value,\n\t...rest\n}) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\tconst handleSelectionChange = (newVal) => {\n\t\tconst configuration = JSON.parse(JSON.stringify(endpointQuery));\n\t\tif (newVal === null || optionToValue(newVal) === 'default' || optionToValue(newVal) === 'none') {\n\t\t\tdelete configuration.options.parameters[propertyName];\n\t\t} else {\n\t\t\tconfiguration.options.parameters[propertyName] = optionToValue(newVal);\n\t\t}\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, configuration));\n\t};\n\n\tconst activeName = endpointQuery?.options?.parameters?.[propertyName];\n\tconst activeItem = activeName ? values.find((item) => optionToValue(item) === activeName) : defaultValue;\n\n\n\treturn (\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react'\nimport React from \"react\";\nimport {css} from \"@emotion/react\";\n\n\nexport default function CommonKnobsContainer({children}) {\n\n\treturn (\n\t\t
\n\t\t\t{children}\n\t\t
\n\t)\n}\n\nconst knobsContainer = css`\n\tdisplay: grid;\n grid-template-columns: 1fr 1fr;\n grid-column-gap: 16px;\n grid-row-gap: 12px;\n margin-bottom: 24px;\n`;\n","import React, { useContext, useEffect, useState } from 'react';\nimport { BooleanSelector } from 'components/selectors/booleanSelector';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\n\nexport default function ColorByValuesSelector(props) {\n\tconst colorChain = useContext(ColorScalesContext);\n\n\tconst {widgetConfiguration, cardIndex, type } = props;\n\n\tconst { dispatch } = useContext(WorkspaceContext);\n\tconst [disableBoolean, setBooleanDisabled] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst c = colorChain.execute(type, widgetConfiguration.colorScale);\n\t\tswitch (c.scaleType) {\n\t\t\tcase \"quantile\":\n\t\t\t\tconst configuration = JSON.parse(JSON.stringify(widgetConfiguration));\n\t\t\t\tconfiguration[\"colorByValue\"] = true;\n\t\t\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, configuration));\n\t\t\t\tsetBooleanDisabled(true);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tsetBooleanDisabled(false);\n\t\t}\n\t}, [widgetConfiguration.colorScale, type]);\n\n\n\n\treturn \n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\nimport { EndpointPropertySelector } from 'components/selectors/endpointPropertySelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { AGGREGATION_METHOD_VALUES } from 'widgets/chartUtils';\nimport { PropertyFlag as SrsPropertyFlag, PropertyType as SrsPropertyType } from 'srs-middleware';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport ColorByValuesSelector from 'components/selectors/colorByValuesSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param flags\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport const DonutGraphKnobs = ({ cardIndex, endpointQuery, flags, widgetConfiguration }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/**/}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","import { DonutGraphWrapper } from './wrapper';\nimport { DonutGraphKnobs } from './knobs';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'DONUT_GRAPH',\n\tlabel: 'Donut Graph',\n\ticon: 'doughnut-chart',\n\twrapper: DonutGraphWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: DonutGraphKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { DonutGraph } from './DonutGraph';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { selectDilDefinitionByName } from 'srs-middleware';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\n/**\n * ChartWrapper for the Donut Graph.\n *\n * @param dimensions\n * @param data\n * @param selectedDefinitionName\n * @param endpointQuery\n * @param widgetConfiguration\n * @param getColorScale\n * @returns {*}\n * @constructor\n */\nexport function DonutGraphWrapper({\n\tgetColorScale,\n\tdimensions,\n\tdata,\n\tnoDataMessage=NO_DATA_MESSAGE,\n\tselectedDefinitionName,\n\tendpointQuery,\n\twidgetConfiguration,\n}) {\n\t// get the actual definition\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\tconst {dispatch, state} = useWidgetControlsContext();\n\tconst hideLabels = state?.hideLabels;\n\tconst convertedData = useMemo(() => {\n\t\tif (!data?.entries || !selectedDefinition || !endpointQuery?.options?.propertyList)\n\t\t\treturn;\n\n\t\tconst items = data.entries || [];\n\n\t\t// empty data is \"valid\"\n\t\tif (items.length === 0)\n\t\t\treturn [];\n\n\t\tconst converted = items.map(({ key, count, value }) => {\n\t\t\treturn {\n\t\t\t\tname: key,\n\t\t\t\tvalue: value,\n\t\t\t\treference: count,\n\t\t\t};\n\t\t});\n\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, converted.length || 0]);\n\t\t\tconverted.forEach((d, index) => {\n\t\t\t\td.colorValue = index;\n\t\t\t});\n\t\t} else {\n\t\t\tgetColorScale.domain(converted.map((d) => d.name));\n\t\t\tconverted.forEach((d) => {\n\t\t\t\td.colorValue = d.name;\n\t\t\t});\n\t\t}\n\n\t\treturn converted;\n\t}, [data.entries, selectedDefinition, endpointQuery, widgetConfiguration, getColorScale]);\n\n\t//has to be in a 'useEffect' as opposed to the useMemo above bc of the way react is.\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data?.entries || !selectedDefinition || !endpointQuery?.options?.propertyList || data?.entries?.length === 0) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\treturn;\n\t\t}\n\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: true });\n\n\t}, [data]);\n\n\tconst _widgetConfig = useMemo(() => {\n\t\treturn {...widgetConfiguration, hideLabels};\n\t}, [widgetConfiguration, hideLabels]);\n\n\t// If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData?.length > 0 && getColorScale ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useRef, useMemo, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { hierarchy, pack } from 'd3';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useTooltip } from 'components/chartTooltip/useTooltip';\nimport ChartTooltip from 'components/chartTooltip';\nimport debounce from 'lodash-es/debounce';\nimport { primaryColor } from 'styles/colors';\nimport { rgba } from 'polished';\n\nexport const CirclePack = ({ getColorScale, dimensions, data, showTopLabelsOnly = true }) => {\n\tconst { height, width } = dimensions;\n\n\tconst [toolTip, setupTrigger] = useTooltip();\n\n\tconst [visibleTextNodes, setVisibleTextNodes] = useState(new Set());\n\n\tconst textRefs = useRef({});\n\n\tfunction getChildren(d) {\n\t\treturn d.children;\n\t}\n\n\tfunction getValue(d) {\n\t\tif (!d.hasOwnProperty(\"value\")) {\n\t\t\t//calculate it and set it once. Since this function gets called a lot do some form of caching.\n\t\t\tif (d.hasOwnProperty(\"children\")) {\n\t\t\t\td.value = d.children?.reduce((sum, { value }) => sum + value, 0);\n\t\t\t}\n\t\t\telse d.value = 0;\n\t\t}\n\t\treturn d.value;\n\t}\n\n\tfunction getName(d) {\n\t\treturn d.key;\n\t}\n\n\tconst { nodes, root } = useMemo(() => {\n\t\tconst root = hierarchy(data, getChildren)\n\t\t\t.sum(getValue)\n\t\t\t.sort((a, b) => getValue(b) - getValue(a));\n\n\t\t// Create packer & pack circles. Ensure dimensions are not 0\n\t\tconst circlePacker = pack().size([width||1, height||1]).padding(10);\n\t\tcirclePacker(root);\n\n\t\treturn { nodes: root.descendants(), root };\n\t}, [data, width, height]);\n\n\tfunction getKeyFromNode(node) {\n\t\tconst nodePath = node.path(root);\n\t\tif (nodePath.length === 0) {\n\t\t\treturn 'root';\n\t\t} else {\n\t\t\treturn nodePath.reduce((accumulator, node) => {\n\t\t\t\taccumulator += '/' + getName(node.data);\n\t\t\t\treturn accumulator;\n\t\t\t}, '');\n\t\t}\n\t}\n\n\tconst topLevelKeys = root.children?.reduce(\n\t\t(keys, child) => ({\n\t\t\t...keys,\n\t\t\t[getKeyFromNode(child)]: true,\n\t\t}),\n\t\t{}\n\t);\n\n\tconst checkIntersections = debounce(function () {\n\t\tfunction doesIntersect(n1, n2) {\n\t\t\tconst aLeftOfB = n1.right < n2.left;\n\t\t\tconst aRightOfB = n1.left > n2.right;\n\t\t\tconst aAboveB = n1.top > n2.bottom;\n\t\t\tconst aBelowB = n1.bottom < n2.top;\n\n\t\t\treturn !(aLeftOfB || aRightOfB || aAboveB || aBelowB);\n\t\t}\n\n\t\tconst _visibleNodes = new Set(\n\t\t\tObject.entries(textRefs.current)\n\t\t\t\t.map(([key, el]) => {\n\t\t\t\t\tconst { top, right, bottom, left } = el.getBoundingClientRect();\n\t\t\t\t\t//getBoundingClientRect doesn't return a true Obj, so create a true object and include key\n\t\t\t\t\treturn { key, top, right, bottom, left };\n\t\t\t\t})\n\t\t\t\t.filter((n, i, arr) => {\n\t\t\t\t\tif (n.hidden) return false; //if hidden, return false so its not visible\n\n\t\t\t\t\tarr.slice(i + 1).forEach((_n) => {\n\t\t\t\t\t\tif (doesIntersect(n, _n)) {\n\t\t\t\t\t\t\t_n.hidden = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn true; //not hidden, so return true to include in visible nodes\n\t\t\t\t})\n\t\t\t\t.map(({ key }) => key)\n\t\t);\n\n\t\t//Set state so future rerenders correctly set visibility.\n\t\tsetVisibleTextNodes(_visibleNodes);\n\t}, 100);\n\n\tconst _setTextRef = (key) => (r) => {\n\t\tif (r) textRefs.current[key] = r;\n\t\telse delete textRefs.current[key];\n\t};\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t{/* Circles */}\n\t\t\t\t\t\n\t\t\t\t\t\t{nodes.map((node) => {\n\t\t\t\t\t\t\tconst startEndState = {\n\t\t\t\t\t\t\t\tcx: width / 2,\n\t\t\t\t\t\t\t\tcy: height / 2,\n\t\t\t\t\t\t\t\tr: 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\n\t\t\t\t\t{/* Labels */}\n\t\t\t\t\t\n\t\t\t\t\t\t{nodes.map((node) => {\n\t\t\t\t\t\t\tconst nodeIsParent = !!node.children;\n\t\t\t\t\t\t\t// Make the label appear above nodes with children\n\t\t\t\t\t\t\tconst yOffset = 10;\n\t\t\t\t\t\t\tconst y = nodeIsParent ? node.y - makeSafeForSVG(node.r) + yOffset : node.y;\n\t\t\t\t\t\t\tconst x = node.x;\n\t\t\t\t\t\t\tconst startEndState = {\n\t\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst key = getKeyFromNode(node);\n\t\t\t\t\t\t\tif (typeof topLevelKeys === 'undefined' || (!topLevelKeys[key] && showTopLabelsOnly)) {\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{node.data.key}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\n\t\t\t\t\t{/*Tooltips*/}\n\t\t\t\t\t{nodes.map((node) => {\n\t\t\t\t\t\tif(!node.data.key) return null; \n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\n\t\t\t\t{toolTip}\n\t\t\t
\n\t\t
\n\t);\n};\n\nfunction makeSafeForSVG(anyTypeOfNumber) {\n\treturn anyTypeOfNumber || 0;\n}\n\nCirclePack.propTypes = {\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.object,\n\tshowTopLabelsOnly: PropTypes.bool,\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param flags\n * @param types\n * @returns {*}\n * @constructor\n */\nexport const CirclePackKnobs = ({ cardIndex, endpointQuery, flags, types }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} />\n\t\t\t\n\t\t\t\t\t
Some style stuff goes here
\n\t\t\t\t\n\t\t\t} />\n\t\t
\n\t);\n};\n","import { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { path } from '../endpoints';\n\nimport { CirclePackWrapper } from './wrapper';\nimport { CirclePackKnobs } from './knobs';\nimport { filterProperties } from 'utilities/srsUtils';\n\nconst flags = [SrsPropertyFlag.Hierarchical];\n\nexport const config = {\n\tkey: 'CIRCLE_PACK',\n\tlabel: 'Circle Pack',\n\ticon: 'circle-pack',\n\twrapper: CirclePackWrapper,\n\tendpoint: path,\n\tKnobs: CirclePackKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: filteredProperties => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tMaxChildren: null,\n\t\t\t\t\tpathDepth: 3,\n\t\t\t\t\tparentPath: [],\n\t\t\t\t\tpathDelimiter: '/',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: _filteredProperties => {\n\t\treturn {\n\t\t\tshowAllLabels: false,\n\t\t};\n\t},\n\tisValid: selectedDefinitionName => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useState, useEffect } from 'react';\nimport { CirclePack } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the Circle Pack widget.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @returns {*}\n * @constructor\n */\nexport function CirclePackWrapper({ getColorScale, widgetConfiguration, dimensions, data, noDataMessage=NO_DATA_MESSAGE }) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data?.entries)) return;\n\n\t\t// empty data is \"valid\"\n\t\tif (data.entries?.length === 0) {\n\t\t\tsetConvertedData([]);\n\t\t}\n\n\t\tconst converted = {\n\t\t\tchildren: data.entries,\n\t\t};\n\n\t\tsetConvertedData(converted);\n\t}, [data]);\n\n\treturn convertedData ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport {jsx} from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport {PropertyFlag as SrsPropertyFlag, PropertyType as SrsPropertyType} from 'srs-middleware';\nimport {PropertyListSelector} from 'components/selectors/propertyListSelector';\nimport {BooleanSelector} from 'components/selectors/booleanSelector';\nimport {LimitSelector} from 'components/selectors/limitSelector';\nimport {EndpointPropertySelector} from 'components/selectors/endpointPropertySelector';\nimport {EndpointParameterSelector} from 'components/selectors/endpointParameterSelector';\nimport {AGGREGATION_METHOD_VALUES} from 'widgets/chartUtils';\nimport CommonKnobsContainer from \"views/common/commonKnobsContainer\";\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const CustomPackKnobs = ({cardIndex, endpointQuery, widgetConfiguration}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\n\t);\n};\n","import { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from '../endpoints';\n\nimport { CustomPackWrapper } from './customPackWrapper';\nimport { CustomPackKnobs } from './customPackKnobs';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { generateLimitDropdownOptionsFromList } from 'components/dropdowns/limitDropdown';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'CUSTOM_CIRCLE_PACK',\n\tlabel: 'Custom Circle Pack',\n\ticon: 'circle-pack',\n\twrapper: CustomPackWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: CustomPackKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: filteredProperties => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, null, null],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t\tmaxChildren: 500,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: _filteredProperties => {\n\t\treturn {\n\t\t\tshowAllLabels: false,\n\t\t\t//see limitSelector.jsx. In essence the \"maxChildren\" part must match one of the fields in the above 'parameters' obj\n\t\t\t// and the \"_options\" is hardcoded.\n\t\t\tmaxChildren_options: generateLimitDropdownOptionsFromList([\n\t\t\t\t'1,000', '750', '500', '250', '100', '50', '20', '10'\n\t\t\t])\n\t\t};\n\t},\n\tisValid: selectedDefinitionName => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useState, useEffect } from 'react';\nimport { CirclePack } from '../circlePack/index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { extent } from 'd3';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the Custom Circle Pack widget.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @returns {*}\n * @constructor\n */\nexport function CustomPackWrapper({ getColorScale, widgetConfiguration, dimensions, data, noDataMessage=NO_DATA_MESSAGE }) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data?.entries)) return;\n\n\t\t// empty data is \"valid\"\n\t\tif (data.entries?.length === 0) {\n\t\t\tsetConvertedData([]);\n\t\t}\n\n\t\tconst converted = {\n\t\t\tchildren: data.entries,\n\t\t};\n\n\t\tsetConvertedData(converted);\n\t}, [data]);\n\n\tgetColorScale.domain(extent(data.entries.map(d => d.count)));\n\n\treturn convertedData ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","import * as d3 from 'd3';\nimport { primaryColor } from 'styles/colors';\n//TODO look over this. A lot of it will not be unnecessary (or at least it won't be once all apps and widgets are updated)\n// Do need to grab scale definitions\nconst COLOR_SCALE_OPTIONS = {\n\tAUTO: 'Auto',\n\tSPECTRAL: 'Spectral',\n\tTURBO: 'Turbo',\n\tCATEGORICAL: 'Categorical',\n\tCLASSIFICATION: 'Classification',\n\tSEVERITY: 'Severity',\n\tPRIMARY: 'Primary',\n\tBOOLEAN: 'Boolean',\n\tNONE: 'None',\n};\nconst CATEGORICAL_LIMIT = 10;\n\n// Severity helpers\nconst lowRegex = /\\bl|low|lo\\b/gi;\nconst midRegex = /\\bm|med|medium\\b/gi;\nconst highRegex = /\\bh|hi|high\\b/gi;\nconst criticalRegex = /\\bc|crit|critical\\b/gi;\n\nconst severityScale = d3.interpolateYlOrRd;\nconst SEVERITY_COLORS = {\n\t[lowRegex]: severityScale(0.25),\n\t[midRegex]: severityScale(0.5),\n\t[highRegex]: severityScale(0.75),\n\t[criticalRegex]: severityScale(1),\n};\n\nconst regexes = [lowRegex, midRegex, highRegex, criticalRegex];\n\n// Determines if the given values can be colored with a severity color scale\nexport const isSeverityScale = (values) => {\n\tconst matches = values.map((value) => {\n\t\treturn regexes.some((regex) => {\n\t\t\tconst match = value.match(regex);\n\t\t\treturn match ? match.length > 0 : false;\n\t\t});\n\t});\n\tconst matchCount = matches.reduce((a, b) => {\n\t\treturn a + b;\n\t}, 0);\n\treturn matchCount >= 3;\n};\n\n// Classification Helpers\nconst unclassRegex = /\\bun.?class(ified)?\\b/gi;\nconst secretRegex = /\\bsecret\\b/gi;\nconst topSecretRegex = /\\btop.?secret\\b/gi;\nconst CLASSIFICATION_COLORS = {\n\t[unclassRegex]: '#00a728',\n\t[secretRegex]: '#f23521',\n\t[topSecretRegex]: '#fd8d10',\n};\nconst classificationRegexes = [unclassRegex, secretRegex, topSecretRegex];\n\n// Determines if the given values can be colored with a classification color scale\nexport const isClassificationScale = (values) => {\n\tconst matches = values.map((value) => {\n\t\treturn classificationRegexes.some((regex) => {\n\t\t\tconst match = value.match(regex);\n\t\t\treturn match ? match.length > 0 : false;\n\t\t});\n\t});\n\tconst matchCount = matches.reduce((a, b) => {\n\t\treturn a + b;\n\t}, 0);\n\treturn matchCount >= 3;\n};\n\n// Boolean helpers\nconst trueRegex = /\\bt|true|1\\b/gi;\nconst falseRegex = /\\bf|false|0\\b/gi;\nconst booleanRegexes = [trueRegex, falseRegex];\n\n// Determines if the given values can be colored with a boolean color scale\nexport const isBooleanScale = (values) => {\n\tconst matches = values.map((value) => {\n\t\treturn booleanRegexes.some((regex) => {\n\t\t\tconst match = value.match(regex);\n\t\t\treturn match ? match.length > 0 : false;\n\t\t});\n\t});\n\tconst matchCount = matches.reduce((a, b) => {\n\t\treturn a + b;\n\t}, 0);\n\treturn matchCount === 2 && values.length === 2;\n};\n\nexport const SERBERUS_COLORS = [\n\t'#00AFAD',\n\t'#FBB034',\n\t'#3D387A',\n\t'#C5168D',\n\t'#33647A',\n\t'#F7931D',\n\t'#3589AA',\n\t'#940064',\n\t'#CB7317',\n\t'#B3D234',\n\t'#00A76D',\n\t'#CA5868',\n\t'#65C4BE',\n\t'#585FAA',\n\t'#B34B14',\n\t'#688766',\n\t'#504971',\n\t'#950F43',\n\t'#754098',\n\t'#3A96AA',\n\t'#615489',\n\t'#7AB3BE',\n\t'#61335D',\n\t'#B33F97',\n\t'#396353',\n\t'#45812B',\n\t'#8C3754',\n\t'#EF4156',\n\t'#005BAB',\n\t'#F15A22',\n\t'#934D11',\n\t'#799A28',\n\t'#ED0677',\n\t'#E07E27',\n\t'#44C7F4',\n\t'#A22D3F',\n\t'#CD822A',\n\t'#815017',\n\t'#2A457A',\n\t'#D4B004',\n\t'#009EDB',\n\t'#0DB14B',\n\t'#AA8B15',\n\t'#0088B2',\n\t'#5B8292',\n\t'#882972',\n\t'#00AE9C',\n];\n\n// Returns a color scale based on values and the passed in scale type\nexport function getColorScale(colorScaleType, values) {\n\tconst valueLength = values.length;\n\tswitch (colorScaleType) {\n\t\tdefault:\n\t\tcase COLOR_SCALE_OPTIONS.AUTO:\n\t\t\tif (valueLength > SERBERUS_COLORS.length) {\n\t\t\t\treturn getColorScale(COLOR_SCALE_OPTIONS.SPECTRAL, values);\n\t\t\t} else {\n\t\t\t\tif (isSeverityScale(values)) {\n\t\t\t\t\treturn getColorScale(COLOR_SCALE_OPTIONS.SEVERITY, values);\n\t\t\t\t} else if (isClassificationScale(values)) {\n\t\t\t\t\treturn getColorScale(COLOR_SCALE_OPTIONS.CLASSIFICATION, values);\n\t\t\t\t} else if (isBooleanScale(values)) {\n\t\t\t\t\treturn getColorScale(COLOR_SCALE_OPTIONS.BOOLEAN, values);\n\t\t\t\t} else {\n\t\t\t\t\treturn getColorScale(COLOR_SCALE_OPTIONS.CATEGORICAL, values);\n\t\t\t\t}\n\t\t\t}\n\t\tcase COLOR_SCALE_OPTIONS.SEVERITY: {\n\t\t\tconst colors = values.reduce((coll, value) => {\n\t\t\t\tconst regex = regexes.find((regex) => {\n\t\t\t\t\tconst matches = value.match(regex);\n\t\t\t\t\treturn matches && matches.length > 0;\n\t\t\t\t});\n\n\t\t\t\tcoll[value] = SEVERITY_COLORS[regex] || primaryColor;\n\t\t\t\treturn coll;\n\t\t\t}, {});\n\n\t\t\treturn (value) => colors[value];\n\t\t}\n\t\tcase COLOR_SCALE_OPTIONS.CLASSIFICATION: {\n\t\t\tconst colors = values.map((value) => {\n\t\t\t\tconst regex = regexes.find((regex) => {\n\t\t\t\t\tconst matches = value.match(regex);\n\t\t\t\t\treturn matches && matches.length > 0;\n\t\t\t\t});\n\n\t\t\t\treturn CLASSIFICATION_COLORS[regex] || primaryColor;\n\t\t\t});\n\n\t\t\treturn (valueIdx) => colors[valueIdx];\n\t\t}\n\t\tcase COLOR_SCALE_OPTIONS.BOOLEAN:\n\t\t\t// Truthy values return the primary color, falsy return a disabled grey color\n\t\t\treturn (valueIdx) => (trueRegex.test(values[valueIdx]) ? primaryColor : '#e8e5e3');\n\t\tcase COLOR_SCALE_OPTIONS.PRIMARY:\n\t\t\treturn d3\n\t\t\t\t.scaleLinear()\n\t\t\t\t.domain([0, valueLength * 1.25])\n\t\t\t\t.range([primaryColor, '#FFFFFF']);\n\t\tcase COLOR_SCALE_OPTIONS.SPECTRAL:\n\t\t\treturn d3.scaleSequential(d3.interpolateSpectral).domain([0, valueLength]);\n\t\tcase COLOR_SCALE_OPTIONS.TURBO:\n\t\t\treturn d3.scaleSequential(d3.interpolateTurbo).domain([0, valueLength]);\n\t\tcase COLOR_SCALE_OPTIONS.CATEGORICAL:\n\t\t\treturn (valueIdx) => SERBERUS_COLORS[valueIdx % SERBERUS_COLORS.length];\n\t\tcase COLOR_SCALE_OPTIONS.NONE:\n\t\t\treturn () => primaryColor;\n\t}\n}\n\nexport function invertColor(color, bw = true) {\n\tif (!color) return '#000';\n\n\tlet hex = d3.color(color).formatHex();\n\n\tif (hex.indexOf('#') === 0) {\n\t\thex = hex.slice(1);\n\t}\n\n\t// convert 3-digit hex to 6-digits.\n\tif (hex.length === 3) {\n\t\thex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n\t}\n\n\tif (hex.length !== 6) {\n\t\tthrow new Error('Invalid HEX color.' + hex);\n\t}\n\n\tlet r = parseInt(hex.slice(0, 2), 16);\n\tlet g = parseInt(hex.slice(2, 4), 16);\n\tlet b = parseInt(hex.slice(4, 6), 16);\n\n\tif (bw) {\n\t\t// http://stackoverflow.com/a/3943023/112731\n\t\treturn r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';\n\t}\n\n\t// invert color components\n\tr = (255 - r).toString(16);\n\tg = (255 - g).toString(16);\n\tb = (255 - b).toString(16);\n\n\t// pad each with zeros and return\n\treturn '#' + padZero(r) + padZero(g) + padZero(b);\n}\n\nexport function adjustHexOpacity(color, opacity) {\n\tif (isHex(color)) {\n\t\tconst r = parseInt(color.slice(1, 3), 16);\n\t\tconst g = parseInt(color.slice(3, 5), 16);\n\t\tconst b = parseInt(color.slice(5, 7), 16);\n\n\t\treturn `rgba(${r},${g},${b},${opacity})`;\n\t} else {\n\t\tconsole.warn(`The value ${color} is not a valid hex color`);\n\t\treturn color;\n\t}\n}\n\nfunction isHex(h) {\n\tconst hexColorRegEx = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i;\n\treturn hexColorRegEx.test(h);\n}\n\nfunction padZero(str, len) {\n\tlen = len || 2;\n\tconst zeros = new Array(len).join('0');\n\treturn (zeros + str).slice(-len);\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport styled from '@emotion/styled/macro';\nimport React from 'react';\nimport { Column, Table as VirtualTable, TableHeaderProps } from 'react-virtualized';\nimport 'react-virtualized/styles.css';\nimport { FaSort, FaSortDown, FaSortUp } from 'react-icons/fa';\nimport { primaryColor } from 'styles/colors';\nimport { adjustHexOpacity } from 'components/colorUtils';\nimport { TableProps } from './TableProps';\n\n/**\n * A table widget\n * See documentation in TableProps for configuration details\n */\nconst Table: React.FC = ({\n\tdata = [],\n\tcolumnNames: columns = [],\n\treadOnly = false,\n\twidth,\n\tonSort,\n\tloadAdditionalRecords,\n\tsortBy,\n\tsortIsDescending,\n\tbaseColor = primaryColor,\n\tminColumnWidth = 90,\n\tcolumnOverrides = {},\n\t...tableProps\n}) => {\n\tconst columnMargin: number = 10; //defined in react-virtualized ReactVirtualized__Table__headerColumn\n\n\tconst minTableWidth = React.useMemo(() => {\n\t\treturn (\n\t\t\tcolumnMargin + //the first column has margin on both sides.\n\t\t\t16 + //give some extra room for the y scrollbar\n\t\t\t(minColumnWidth + columnMargin) * columns?.length\n\t\t); //the sum of the widths of all the columns\n\t}, [columns, minColumnWidth]);\n\n\t//The onScroll event on the table fires on the initial render, which causes loadAdditionalRecords to fire unncessarily.\n\t// This const tracks whether this is the initial render so we don't call loadAdditionalRecords on the first render.\n\tconst [isInitialRender, setIsInitialRender] = React.useState(true);\n\tReact.useEffect(() => setIsInitialRender(false), []);\n\n\t/* \n\t\treact-virtualized's Table component doesn't support horizontal scrolling out-of-the-box\n\t\tsource: https://nicedoc.io/bvaughn/react-virtualized/blob/master/docs/Table.md\n\n\t\tRather than re-implement this whole module with a different library to support\n\t\thorizontal scrolling, we'll just do a little DOM manipulation.\n\t*/ \n\tconst [didAddScrollListener, setDidAddScrollListener] = React.useState(false);\n\tconst tableRef = React.useRef(null);\n\tReact.useEffect(() => {\n\t\tif (tableRef && tableRef.current) {\n\t\t\tvar headerEls = tableRef.current.getElementsByClassName('ReactVirtualized__Table__headerRow');\n\t\t\tvar containerEls = tableRef.current.getElementsByClassName('ReactVirtualized__Grid__innerScrollContainer');\n\t\t\tif (headerEls.length == 0 || containerEls.length == 0) return;\n\n\t\t\t// set inner container (overflows beyond the container with the scrollbar) width to header width\n\t\t\tcontainerEls[0].style.width = headerEls[0].clientWidth + 'px';\n\n\t\t\tif (!didAddScrollListener) {\n\t\t\t\tvar gridEls = tableRef.current.getElementsByClassName('ReactVirtualized__Table__Grid');\n\t\t\t\tif (gridEls.length == 0) return;\n\n\t\t\t\tgridEls[0].addEventListener('scroll', (e) => {\n\t\t\t\t\theaderEls[0].style.marginLeft = -e.target.scrollLeft + 'px';\n\t\t\t\t});\n\t\n\t\t\t\tsetDidAddScrollListener(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tconst headerRenderer = React.useCallback(\n\t\t({ dataKey, label }: TableHeaderProps): React.ReactNode => {\n\t\t\tconst isSorted: boolean = sortBy === dataKey;\n\t\t\treturn (\n\t\t\t\t {\n\t\t\t\t\t\tonSort && onSort(dataKey, isSorted && !sortIsDescending);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t\t{!readOnly && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{isSorted ? sortIsDescending ? : : }\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t);\n\t\t},\n\t\t[sortBy, sortIsDescending, onSort, readOnly]\n\t);\n\n\t// Render your table\n\treturn (\n\t\t\n\t\t\t minTableWidth ? width : minTableWidth}\n\t\t\t\trowGetter={({ index }) => data[index]}\n\t\t\t\trowStyle={({ index }) => {\n\t\t\t\t\treturn index % 2 === 1 ? { backgroundColor: adjustHexOpacity(baseColor, 0.2) } : {};\n\t\t\t\t}}\n\t\t\t\tonScroll={({ clientHeight, scrollHeight, scrollTop }) => {\n\t\t\t\t\t//this number will be 0 when scrolling is all the way down\n\t\t\t\t\tconst distanceToBottom = scrollHeight - clientHeight - scrollTop;\n\t\t\t\t\tif (!isInitialRender && distanceToBottom < 100) {\n\t\t\t\t\t\tloadAdditionalRecords && loadAdditionalRecords(); //fetch additional records\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{...tableProps}\n\t\t\t>\n\t\t\t\t{columns.map((columnName, i) => {\n\t\t\t\t\tconst columnOverride = columnOverrides[columnName] || {};\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\n\t\t\n\t);\n};\n\nexport { Table };\n\nconst TableContainer = styled.div<{ baseColor: string }>`\n\toverflow: hidden;\n\theight: 100%;\n\tfont-size: 12px;\n\n\t.ReactVirtualized__Table__headerRow {\n\t\tbackground-color: ${({baseColor}) => adjustHexOpacity(baseColor, 0.9)};\n\t\tcolor: white;\n\n\t\t.header-content {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tcursor: pointer;\n\n\t\t\t.ReactVirtualized__Table__headerTruncatedText {\n\t\t\t\tmax-width: calc(100% - 0.75em);\n\t\t\t\tmargin-right: 4px;\n\t\t\t}\n\t\t\t.sort-icon {\n\t\t\t\tfont-size: 0.75em;\n\t\t\t\tpadding-top: 0.25em;\n\t\t\t\t&.unsorted {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t\t:hover {\n\t\t\t\t.sort-icon {\n\t\t\t\t\tdisplay: initial;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.ReactVirtualized__Table__row {\n\t\tbox-sizing: border-box;\n\t\tborder: 1px solid transparent;\n\n\t\t&:hover {\n\t\t\tborder: 1px solid ${(p) => p.baseColor};\n\t\t}\n\t}\n\n\t.ReactVirtualized__Table__Grid {\n\t\twidth: 100% !important;\n\t\toverflow: auto !important;\n\t}\n`;\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport { useContext, useState } from 'react';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport MultiSelect from 'components/multiselect';\nimport { TODO } from 'types';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { Checkbox, H6 } from '@blueprintjs/core';\nimport { GenericObject } from 'interfaces/GenericObject';\n\n\ninterface Props {\n\tcardIndex: number;\n\tpropertyName: string;\n\tlabel: string;\n\tendpointQuery: TODO;\n\tflags: TODO; \n\ttypes: TODO; \n\tminimumItems: any;\n}\n\nexport function MultiPropertyCheckboxSelector({\n\tcardIndex,\n\tpropertyName = 'columns',\n\tlabel,\n\tendpointQuery,\n\tflags = [],\n\ttypes = [],\n\tminimumItems=1\n}: Props) {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\n\t// only allows a subset of properties to be filtered (based on flags and types)\n\tconst filteredProperties = filterProperties(selectedDefinitionName, flags, types).map(property => property.name);\n\n\t//Use selectedColumnNames to update endpoint with correct values.\n\tconst [selectedColumnNames, setSelectedColumns] = useState>(endpointQuery?.options?.[propertyName].reduce((coll,d)=>(coll[d]=true,coll),{}));\n\n\tconst _toggleAll = e => {\n\t\tconst isChecked = e.target.checked;\n\t\t// create copy of options object\n\t\tconst newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n\n\t\tif(isChecked) {\n\t\t\t//grab all filteredProperties and use them\n\t\t\tnewEndpointQuery.options[propertyName] = [...filteredProperties];\n\t\t}\n\t\telse {\n\t\t\t//use the first entries that are marked true. In theory selectedColumnNames will always have, at a minimum, minimumItems\n\t\t\t//\tmarked as true. So the .slice() will always return an array with length === minimumItems\n\t\t\tnewEndpointQuery.options[propertyName] = Object.entries(selectedColumnNames)\n\t\t\t\t.filter(([,v]) => v)\n\t\t\t\t.map(([k,_]) => k)\n\t\t\t\t.slice(0, minimumItems);\n\t\t}\n\n\t\tnewEndpointQuery.options[propertyName].sort();\n\n\t\t//newEndpointQuery has the most upto date and more correct version of data. Set our local state to match.\n\t\t//(case when the two won't already match: when setting all boxes to false, the newEndpointQuery will still have at\n\t\t// least one entry, where as selectedColumnNames will have all entries set to false)\n\t\tsetSelectedColumns(newEndpointQuery.options?.[propertyName].reduce((coll,d)=>(coll[d]=true,coll),{}));\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n\t}\n\n\tconst _onChange = p => {\n\t\tconst value = p.target.checked;\n\t\tconst key = p.target.getAttribute(\"data-value\");\n\t\tselectedColumnNames[key] = value;\n\n\t\t// create copy of options object\n\t\tconst newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n\t\tnewEndpointQuery.options[propertyName] = Object.entries(selectedColumnNames)\n\t\t\t.filter(([,v]) => v)\n\t\t\t.map(([k,_]) => k);\n\t\t//If less than minimumItems don't allow it to be turned off\n\t\tif(newEndpointQuery.options[propertyName].length < minimumItems)\n\t\t\tnewEndpointQuery.options[propertyName].push(key);\n\t\tnewEndpointQuery.options[propertyName].sort();\n\n\t\t//newEndpointQuery has the most upto date and more correct version of data. Set our local state to match.\n\t\t//(case when the two won't already match: when setting all boxes to false, the newEndpointQuery will still have at\n\t\t// least one entry, where as selectedColumnNames will have all entries set to false)\n\t\tsetSelectedColumns(newEndpointQuery.options?.[propertyName].reduce((coll,d)=>(coll[d]=true,coll),{}));\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n\t}\n\n\tconst numberOfSelectedColumns = Object.values(selectedColumnNames).filter(d => d).length;\n\treturn (\n\t\t
\n\t\t\t
{label}
\n\t\t\t
\n\t\t\t\t 0}\n\t\t\t\t/>\n\t\t\t\t
\n\t\t\t\t{\n\t\t\t\t\tfilteredProperties.map(d => (\n\t\t\t\t\t\t\n\t\t\t\t\t))\n\t\t\t\t}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t)\n}\n\n\nconst rootCss = css`\n\tdisplay: flex;\n\tflex-direction: column;\t\n\t/*max-height: 100%;*/\n\toverflow: hidden;\n\t& .contents-wrapper \n\t\t{\n\t\t\toverflow: auto;\n\t\t}\n`;\n\n","import { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { values } from '../endpoints';\n\nimport { TableWrapper } from './wrapper';\nimport { TableWidgetKnobs } from './knobs';\n\nexport const config = {\n\tkey: 'TABLE',\n\tlabel: 'Table',\n\ticon: 'th',\n\twrapper: TableWrapper,\n\tendpoint: async (...args) => {\n\t\tconst columns = args[2].columns;\n\t\tconst data = await values(...args);\n\t\treturn { data, columns };\n\t},\n\tKnobs: TableWidgetKnobs,\n\tflags: [SrsPropertyFlag.Document],\n\ttypes: [SrsPropertyType.Numeric, SrsPropertyType.String, SrsPropertyType.Temporal],\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tcolumns: filteredProperties.map((x) => x.name),\n\t\t\t\tparameters: {\n\t\t\t\t\tMaxValues: 100,\n\t\t\t\t\tdescending: false,\n\t\t\t\t\tsortProperty: filteredProperties[0]?.name,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tisValid: () => {\n\t\t// any data can be shown in the table?\n\t\treturn true;\n\t},\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { MultiPropertyCheckboxSelector } from 'components/selectors/multiPropertyCheckboxSelector';\nimport { Tab, Tabs } from '@blueprintjs/core';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\n\nexport const TableWidgetKnobs = ({\n\tcardIndex,\n\tendpointQuery,\n\tflags\n}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t} />\n\t\t\n\t);\n};\n\n//If we use css={<>} it wipes out Tab(s) own classes. But Tab(s) don't pass thru styles prop.\n//Suggested fix is something like this: https://github.com/emotion-js/emotion/issues/1196#issuecomment-475047419\n// (spoiler alert, its ugly)\nconst tabsCss = css`\n\tmax-height: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n`;\n\nconst tabCss = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n`;\n","import React, { useContext } from 'react';\nimport { Table } from './Table';\nimport { useIsWorkspaceAvailable, WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { SRSValuesResult } from 'srs-middleware';\n\n/**\n * ChartWrapper for the Table Widget.\n * This wrapper handles complexity associated with workspace context and data from srs\n * in order to pass clean data to the table widget.\n */\nexport function TableWrapper({ dimensions, data: allData, cardIndex, loading }) {\n\t/** The number of records to fetch for infinite scrolling */\n\tconst additionalRecordsToFetch: number = 100;\n\n\tconst { dispatch, state } = useContext(WorkspaceContext) ?? {};\n\tconst isInWorkspace = useIsWorkspaceAvailable();\n\n\t// data represents that data that is returned from the SRS Values call\n\tconst { columns = [], data } = allData ?? {};\n\n\t// tableData is the data that is rendered into the \n\tconst [tableData, setTableData] = React.useState([]);\n\n\t// Track whether the data is new to prevent an infinite loop when setting tableData in the effect hook below\n\tconst [dataIsNew, setDataIsNew] = React.useState(true);\n\tReact.useEffect(() => {\n\t\tsetDataIsNew(true);\n\t}, [data]);\n\n\t//pull the parameters from state\n\tconst parameters = state?.explorer?.layout?.cards?.[0]?.endpointQuery?.options?.parameters || {};\n\n\t//data should be appended to the dataset if new data was triggerd by a scroll event\n\tconst [shouldAppendData, setShouldAppendData] = React.useState(false);\n\n\t//when data changes, update table data\n\tReact.useEffect(() => {\n\t\tif(dataIsNew){\n\t\t\tlet newTableData: any[] = [];\n\t\t\t//If we have new data or columns have changed, set the table data using the data from the server\n\t\t\tif (!shouldAppendData) {\n\t\t\t\t//prevColumnValue.current = columns;\n\t\t\t\tnewTableData = data?.map((dataObject) => ({ documentId: dataObject.documentId, ...dataObject.propertyValues }));\n\t\t\t} else {\n\t\t\t\tnewTableData = tableData.slice(); //create a copy of the current data\n\t\t\t\tsetShouldAppendData(false);\n\t\t\t\tconst currentIds = tableData.map((dataObject) => dataObject.documentId);\n\t\t\t\tdata.forEach((dataObject: SRSValuesResult) => {\n\t\t\t\t\tif (!currentIds.includes(dataObject.documentId)) {\n\t\t\t\t\t\tnewTableData.push({ documentId: dataObject.documentId, ...dataObject.propertyValues });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\t\n\t\t\tsetTableData(newTableData);\n\t\t\tsetDataIsNew(false);\n\n\t\t}\n\t}, [data, shouldAppendData, setTableData, dataIsNew, tableData]);\n\n\t/** On the sort event, request new data from the server (sorting is done server side) */\n\tconst handleSort = (columnName: string, isDescending: boolean) => {\n\t\tsetTableData([]);\n\t\tdispatch &&\n\t\t\tdispatch(\n\t\t\t\tWorkspaceActionCreator.patchParameters(cardIndex, {\n\t\t\t\t\tdescending: isDescending,\n\t\t\t\t\tsortProperty: columnName,\n\t\t\t\t})\n\t\t\t);\n\t};\n\n\t/** Get more data */\n\tconst loadAdditionalRecords = () => {\n\t\tif(!loading){\n\t\t\tsetShouldAppendData(true);\n\t\t\tdispatch &&\n\t\t\t\tdispatch(\n\t\t\t\t\tWorkspaceActionCreator.patchParameters(cardIndex, {\n\t\t\t\t\t\tstartIndex: tableData.length,\n\t\t\t\t\t\tendIndex: tableData.length + additionalRecordsToFetch,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t);\n}\n","import * as d3 from 'd3';\n\nexport function rectCollision() {\n let nodes, sizes, masses;\n let size = constant([0, 0]);\n let strength = 1;\n let iterations = 1;\n\n function force() {\n let node, size, mass, xi, yi;\n let i = -1;\n while (++i < iterations) { iterate(); }\n\n function iterate() {\n let j = -1;\n let tree = d3.quadtree(nodes, xCenter, yCenter).visitAfter(prepare);\n\n while (++j < nodes.length) {\n node = nodes[j];\n size = sizes[j];\n mass = masses[j];\n xi = xCenter(node);\n yi = yCenter(node);\n\n tree.visit(apply);\n }\n }\n\n function apply(quad, x0, y0, x1, y1) {\n let data = quad.data;\n let xSize = (size[0] + quad.size[0]) / 2;\n let ySize = (size[1] + quad.size[1]) / 2;\n if (data) {\n if (data.index <= node.index) { return; }\n\n let x = xi - xCenter(data);\n let y = yi - yCenter(data);\n let xd = Math.abs(x) - xSize;\n let yd = Math.abs(y) - ySize;\n\n if (xd < 0 && yd < 0) {\n let l = Math.sqrt(x * x + y * y);\n let m = masses[data.index] / (mass + masses[data.index]);\n\n if (Math.abs(xd) < Math.abs(yd)) {\n node.vx -= (x *= xd / l * strength) * m;\n data.vx += x * (1 - m);\n } else {\n node.vy -= (y *= yd / l * strength) * m;\n data.vy += y * (1 - m);\n }\n }\n }\n\n return x0 > xi + xSize || y0 > yi + ySize ||\n x1 < xi - xSize || y1 < yi - ySize;\n }\n\n function prepare(quad) {\n if (quad.data) {\n quad.size = sizes[quad.data.index];\n } else {\n quad.size = [0, 0];\n let i = -1;\n while (++i < 4) {\n if (quad[i] && quad[i].size) {\n quad.size[0] = Math.max(quad.size[0], quad[i].size[0]);\n quad.size[1] = Math.max(quad.size[1], quad[i].size[1]);\n }\n }\n }\n }\n }\n\n function xCenter(d) { return d.x + d.vx + sizes[d.index][0] / 2; }\n\n function yCenter(d) { return d.y + d.vy + sizes[d.index][1] / 2; }\n\n force.initialize = function(_) {\n sizes = (nodes = _).map(size);\n masses = sizes.map(function(d) { return d[0] * d[1]; });\n };\n\n force.size = function(_) {\n return (arguments.length\n ? (size = typeof _ === 'function' ? _ : constant(_), force)\n : size);\n };\n\n force.strength = function(_) {\n return (arguments.length ? (strength = +_, force) : strength);\n };\n\n force.iterations = function(_) {\n return (arguments.length ? (iterations = +_, force) : iterations);\n };\n\n return force;\n}\n\nexport function boundedBox() {\n let nodes, sizes;\n let bounds;\n let size = constant([0, 0]);\n\n function force() {\n let node, size;\n let xi, x0, x1, yi, y0, y1;\n let i = -1;\n while (++i < nodes.length) {\n node = nodes[i];\n size = sizes[i];\n xi = node.x + node.vx;\n x0 = bounds[0][0] - xi;\n x1 = bounds[1][0] - (xi + size[0]);\n yi = node.y + node.vy;\n y0 = bounds[0][1] - yi;\n y1 = bounds[1][1] - (yi + size[1]);\n if (x0 > 0 || x1 < 0) {\n node.x += node.vx;\n node.vx = -node.vx;\n if (node.vx < x0) { node.x += x0 - node.vx; }\n if (node.vx > x1) { node.x += x1 - node.vx; }\n }\n if (y0 > 0 || y1 < 0) {\n node.y += node.vy;\n node.vy = -node.vy;\n if (node.vy < y0) { node.vy += y0 - node.vy; }\n if (node.vy > y1) { node.vy += y1 - node.vy; }\n }\n }\n }\n\n force.initialize = function(_) {\n sizes = (nodes = _).map(size);\n };\n\n force.bounds = function(_) {\n return (arguments.length ? (bounds = _, force) : bounds);\n };\n\n force.size = function(_) {\n return (arguments.length\n ? (size = typeof _ === 'function' ? _ : constant(_), force)\n : size);\n };\n\n return force;\n}\n\nfunction constant(_) {\n return function() { return _; };\n}\n\n\n\n","import * as d3 from 'd3';\n\nimport { useEffect, useState } from 'react';\n\n/**\n * Sets up a common d3 force-layout\n *\n * @param data\n * @param forces\n * @param dimensions\n * @returns {{simulation: unknown, tick: number}}\n */\nexport const useForceSimulation = ({ data, forces, dimensions }) => {\n\tconst [tick, setTick] = useState(Date.now());\n\tconst [simulation, setSimulation] = useState(null);\n\n\tuseEffect(() => {\n\t\tconst simulation = d3\n\t\t\t.forceSimulation(data)\n\t\t\t.on('tick', () => setTick(Date.now()))\n\t\t\t.on('end', () => setTick(Date.now()));\n\n\t\tforces.forEach(f => {\n\t\t\tsimulation.force(f.name, f.force);\n\t\t});\n\n\t\tsetSimulation(simulation);\n\t\treturn () => simulation.stop();\n\t}, [data, forces, dimensions]);\n\n\treturn { simulation, tick };\n};\n\n/**\n * Helper hook to set up zoom functionality.\n *\n * @param svgRef\n * @param containerRef\n * @param zoomMin\n * @param zoomMax\n */\nexport const useZoom = ({ svgRef, containerRef, zoomMin = 0.1, zoomMax = 4.0 }) => {\n\tuseEffect(() => {\n\t\tif (!svgRef || !containerRef) return;\n\n\t\t// set up the zoom, which is on the SVG\n\t\td3.select(svgRef.current).call(\n\t\t\td3\n\t\t\t\t.zoom()\n\t\t\t\t.scaleExtent([zoomMin, zoomMax])\n\t\t\t\t.on('zoom', event => {\n\t\t\t\t\td3.select(containerRef.current).attr('transform', event.transform);\n\t\t\t\t})\n\t\t);\n\t}, [svgRef, containerRef, zoomMin, zoomMax]);\n};\n\nexport const dragHook = simulation =>\n\td3\n\t\t.drag()\n\t\t.on('start', function(event, d) {\n\t\t\tevent.sourceEvent.stopPropagation();\n\t\t\tif (!event.active) simulation.alphaTarget(0.3).restart();\n\t\t\td.fx = d.x;\n\t\t\td.fy = d.y;\n\t\t\td.cursor = d3.select(this).style('cursor');\n\t\t\td3.select(this).style('cursor', 'grab');\n\t\t})\n\t\t.on('drag', function(event, d) {\n\t\t\td.fx = event.x;\n\t\t\td.fy = event.y;\n\t\t})\n\t\t.on('end', function(event, d) {\n\t\t\tif (!event.active) simulation.alphaTarget(0);\n\t\t\td.fx = null;\n\t\t\td.fy = null;\n\t\t\td3.select(this).style('cursor', d => {\n\t\t\t\tlet c = d.cursor;\n\t\t\t\tdelete d.cursor;\n\t\t\t\treturn c;\n\t\t\t});\n\t\t});\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as d3 from 'd3';\nimport { rectCollision } from './forces';\nimport { dragHook, useForceSimulation, useZoom } from './forceUtils';\nimport pick from 'lodash-es/pick';\n\n/**\n * Renders a simple node-link diagram.\n *\n * Expects: {\n * nodes: [],\n * links: [],\n * }\n *\n * @param data\n * @param dimensions\n * @param onSelect\n * @param multiselect\n * @param selected\n * @returns {*}\n * @constructor\n */\nexport const TypographWidget = ({ data, dimensions, onSelect, multiselect = false, selected = [] }) => {\n\tconst opacity = { stroke: 0.4, fill: 0.3 };\n\n\tconst { nodes, links } = data;\n\tconst svgRef = useRef(null);\n\tconst centroidGroupRef = useRef(null);\n\tconst termGroupRef = useRef(null);\n\tconst containerRef = useRef(null);\n\n\tconst selectionRef = useRef({ selection: [] });\n\n\tconst centroids = useMemo(() => {\n\t\treturn nodes.filter((node) => node.type === 'centroid');\n\t}, [nodes]);\n\n\tconst [forces, setForces] = useState([]);\n\n\tconst colorScale = d3.interpolateTurbo;\n\n\tconst centroidScale = useMemo(() => {\n\t\tconst extent = d3.extent(nodes, (node) => node.count);\n\t\treturn d3.scaleLinear().domain(extent).range([5, 40]);\n\t}, [nodes]);\n\n\tconst { simulation, tick } = useForceSimulation({\n\t\tforces,\n\t\tdata: nodes,\n\t\tdimensions,\n\t});\n\tuseZoom({ svgRef, containerRef });\n\n\tuseEffect(() => {\n\t\tconst forces = [\n\t\t\t{\n\t\t\t\tname: 'center',\n\t\t\t\tforce: d3.forceCenter(dimensions.width / 2, dimensions.height / 2),\n\t\t\t},\n\t\t\t{ name: 'charge', force: d3.forceManyBody().strength(-50) },\n\t\t\t{ name: 'x', force: d3.forceX(dimensions.width / 2).strength(0.05) },\n\t\t\t{ name: 'y', force: d3.forceY(dimensions.height / 2).strength(0.075) },\n\t\t\t{\n\t\t\t\tname: 'collision',\n\t\t\t\tforce: rectCollision()\n\t\t\t\t\t.size(function (d) {\n\t\t\t\t\t\treturn d.bbox ? [d.bbox.width + 8, d.bbox.height + 4] : [0, 0];\n\t\t\t\t\t})\n\t\t\t\t\t.strength(2),\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'links',\n\t\t\t\tforce: d3\n\t\t\t\t\t.forceLink(links)\n\t\t\t\t\t.id((d) => d.id)\n\t\t\t\t\t.strength(2)\n\t\t\t\t\t.distance(50),\n\t\t\t},\n\t\t];\n\n\t\tsetForces(forces);\n\t}, [links, dimensions, centroidScale]);\n\n\tuseEffect(() => {\n\t\t// TODO: Make this a util\n\t\tconst handleNodeClick = (node) => {\n\t\t\tconst n = pick(node, ['id']);\n\n\t\t\tif (multiselect) {\n\t\t\t\tlet tempNodes = [];\n\t\t\t\tconst index = selected.findIndex((test) => test.id === n.id);\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tselected.splice(index, 1);\n\t\t\t\t\ttempNodes = selected;\n\t\t\t\t} else {\n\t\t\t\t\tselected.push(n);\n\t\t\t\t\ttempNodes = selected;\n\t\t\t\t}\n\n\t\t\t\tonSelect([...tempNodes]);\n\t\t\t} else {\n\t\t\t\tonSelect([n]);\n\t\t\t}\n\t\t};\n\n\t\tselectionRef.current.selection = [...selected];\n\n\t\t// test if two nodes are equivalent\n\t\tconst nodeTest = (node1, node2) => {\n\t\t\treturn node1.id === node2.id;\n\t\t};\n\n\t\t// test if the node is in the selection\n\t\tconst nodeInSelection = (node) => {\n\t\t\treturn selectionRef.current.selection.some((n) => nodeTest(node, n));\n\t\t};\n\n\t\t// render centroids\n\t\tconst centroid = d3\n\t\t\t.select(centroidGroupRef.current)\n\t\t\t.selectAll('.centroid')\n\t\t\t.data(centroids, (d) => d.id)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst g = enter\n\t\t\t\t\t\t.append('g')\n\t\t\t\t\t\t.classed('centroid', true)\n\t\t\t\t\t\t.on('click', (event, d) => handleNodeClick(d))\n\t\t\t\t\t\t.style('cursor', 'pointer');\n\n\t\t\t\t\t// the border to draw: none, black (selected), blue (hovered)\n\t\t\t\t\tg.append('circle')\n\t\t\t\t\t\t.classed('border', true)\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count) + 5)\n\t\t\t\t\t\t.attr('fill', 'transparent')\n\t\t\t\t\t\t.attr('stroke-width', 3)\n\t\t\t\t\t\t.attr('stroke', (d) => (nodeInSelection(d) ? 'black' : 'transparent'))\n\t\t\t\t\t\t.attr('opacity', (d) => (nodeInSelection(d) ? 1.0 : 0));\n\n\t\t\t\t\t// main body of the node\n\t\t\t\t\tg.append('circle')\n\t\t\t\t\t\t.classed('body', true)\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count))\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorIndex / centroids.length))\n\t\t\t\t\t\t.attr('fill-opacity', opacity.fill)\n\t\t\t\t\t\t.attr('stroke', 'transparent');\n\n\t\t\t\t\t// stroke to draw around the body (adding a stroke to the body looked wrong)\n\t\t\t\t\tg.append('circle')\n\t\t\t\t\t\t.classed('stroke', true)\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count) + 1)\n\t\t\t\t\t\t.attr('fill', 'transparent')\n\t\t\t\t\t\t.attr('stroke', (d) => colorScale(d.colorIndex / centroids.length))\n\t\t\t\t\t\t.attr('stroke-width', 2)\n\t\t\t\t\t\t.attr('stroke-opacity', opacity.stroke);\n\n\t\t\t\t\t// text to show on hover\n\t\t\t\t\tg.append('text')\n\t\t\t\t\t\t.text((d) => d.count)\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('dy', '.35em')\n\t\t\t\t\t\t.attr('fill', 'black')\n\t\t\t\t\t\t.attr('fill-opacity', 0)\n\t\t\t\t\t\t.style('font-size', function (d) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tMath.min(centroidScale(d.count), ((2 * centroidScale(d.count)) / this.getComputedTextLength()) * 12) +\n\t\t\t\t\t\t\t\t'px'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.style('pointer-events', 'none');\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate.attr('transform', (d) => `translate(${d.x} ${d.y})`);\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('circle.body')\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count))\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorIndex / centroids.length));\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('circle.stroke')\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count) + 1)\n\t\t\t\t\t\t.attr('stroke', (d) => colorScale(d.colorIndex / centroids.length));\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('circle.border')\n\t\t\t\t\t\t.attr('r', (d) => centroidScale(d.count) + 5)\n\t\t\t\t\t\t.attr('stroke', (d) => (nodeInSelection(d) ? 'black' : 'transparent'));\n\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\tconst term = d3\n\t\t\t.select(termGroupRef.current)\n\t\t\t.selectAll('text')\n\t\t\t.data(\n\t\t\t\tnodes.filter((node) => node.type === 'child'),\n\t\t\t\t(d) => d.parentId + d.label\n\t\t\t)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.attr('x', (d) => d.x)\n\t\t\t\t\t\t.attr('y', (d) => d.y)\n\t\t\t\t\t\t.attr('dominant-baseline', 'middle')\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorIndex / centroids.length))\n\t\t\t\t\t\t.text((d) => d.label),\n\t\t\t\t(update) =>\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.attr('y', function (d) {\n\t\t\t\t\t\t\treturn d.y + d3.select(this).node().getBBox().height / 2;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('x', (d) => d.x),\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\t// record the bounding box for each term\n\t\tterm.each(function (d) {\n\t\t\td.bbox = d3.select(this).node().getBBox();\n\t\t});\n\n\t\t// set up dragging\n\t\tcentroid.call(dragHook(simulation));\n\t\tterm.call(dragHook(simulation));\n\n\t\t// set up hover effects\n\t\tcentroid.on('mouseover', function (event, d) {\n\t\t\tcentroid\n\t\t\t\t.selectAll('circle.body')\n\t\t\t\t.transition()\n\t\t\t\t.attr('fill-opacity', (e) => (e === d ? 0.7 : 0.05));\n\t\t\tcentroid\n\t\t\t\t.selectAll('text')\n\t\t\t\t.transition()\n\t\t\t\t.attr('fill-opacity', (e) => (e === d ? 0.7 : 0));\n\t\t\tterm.transition().attr('fill-opacity', (e) => (e.parentId === d.id ? 1.0 : 0.2));\n\n\t\t\td3.select(this).select('circle.border').transition().attr('stroke', 'blue').attr('opacity', 1);\n\t\t});\n\n\t\tcentroid.on('mouseout', function () {\n\t\t\tcentroid.selectAll('circle.body').transition().attr('fill-opacity', opacity.fill);\n\t\t\tcentroid.selectAll('text').transition().attr('fill-opacity', 0);\n\t\t\tterm.transition().attr('fill-opacity', 1.0);\n\n\t\t\td3.select(this)\n\t\t\t\t.select('circle.border')\n\t\t\t\t.transition()\n\t\t\t\t.attr('stroke', (d) => (nodeInSelection(d) ? 'black' : 'transparent'))\n\t\t\t\t.attr('opacity', (d) => (nodeInSelection(d) ? 1.0 : 0));\n\t\t});\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [centroidGroupRef, termGroupRef, data, tick, simulation, selected]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useCallback, useContext, useState } from 'react';\n//import { MultiPropertySelector } from 'components/selectors/multiPropertySelector';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { Checkbox, H6, Tab, Tabs } from '@blueprintjs/core';\nimport { DILProperty } from 'srs-middleware';\nimport { GenericObject } from 'interfaces/GenericObject';\nimport debounce from 'lodash-es/debounce';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const TypographWidgetKnobs = ({\n cardIndex,\n endpointQuery,\n types\n }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst propertyName = 'propertyList';\n\n\tconst selectedColumnNames = endpointQuery?.options?.[propertyName];\n\tconst [filteredProperties, updateProperties] =\n\t\tuseState>(\n\t\t\tfilterProperties(selectedDefinitionName, [], types)\n\t\t\t\t.reduce((coll: GenericObject, property: DILProperty) =>\n\t\t\t\t\t\t(coll[property.name] = selectedColumnNames.includes(property.name), coll),\n\t\t\t\t\t{})\n\t\t);\n\n\tconst _updateServer = useCallback(debounce((newSelectedColumns) => {\n\t\t// create copy of options object\n\t\tconst newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n\t\tnewEndpointQuery.options[propertyName] =\n\t\t\tObject.entries(newSelectedColumns)\n\t\t\t\t.filter(([,v]) => v)\n\t\t\t\t.map(([k]) => k);\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n\t}, 700),[]);\n\n\tconst _updateOption = (property: string, value: boolean=!filteredProperties[property]) => {\n\t\tconst newSelectedColumns = {...filteredProperties, [property]: value};\n\t\tif (Object.values(newSelectedColumns).filter((value) => value === true).length >= 1) {\n\t\t\tupdateProperties(newSelectedColumns);\n\t\t\t_updateServer(newSelectedColumns);\n\t\t} else {\n\t\t\tconsole.warn('Trying to unselect all properties...preventing action')\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t
Select Properties
\n\t\t\t\t\t{\n\t\t\t\t\t\tObject.entries(filteredProperties).map(([k,v]) =>\n\t\t\t\t\t\t\t
\n );\n};\n\n\nfunction Option({entry, value, update}: {entry: string, value: boolean, update: (arg: string) => void}) {\n\tconst _onChange = () => update(entry)\n\n\treturn \n}\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useContext, useEffect } from 'react';\nimport { Breadcrumb, Breadcrumbs, Button, Intent, Tag } from '@blueprintjs/core';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\n\nconst {updateTransientFilter} = WorkspaceActionCreator;\n\n/**\n * Custom renderer for the actions available to change the chart settings.\n *\n * This is a Filter Provider for the ParaCord chart.\n *\n * @param chartConfiguration\n * @param actions\n * @returns {*}\n * @constructor\n */\nexport const TypographActions = ({actions}) => {\n const {dispatch} = useContext(WorkspaceContext);\n\n const onFilter = () => {\n if (actions?.selected.length) {\n dispatch(updateTransientFilter('cluster', actions.selected));\n } else {\n dispatch(updateTransientFilter('cluster', null));\n }\n };\n\n return (\n \n \n {actions?.selected?.length ?\n \n : null\n }\n \n );\n};\n\nconst renderFilter = ({key, value}) => {\n return (\n \n {`${key} (${value.count})`}\n \n );\n};\n\n","import { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { textClusters } from '../endpoints';\n\nimport { TypographWidgetWrapper } from './wrapper.jsx';\nimport { TypographWidgetKnobs } from './knobs.tsx';\nimport { TypographActions } from 'widgets/typograph/actions.jsx';\nimport { filterProperties } from 'utilities/srsUtils';\n\nconst types = [SrsPropertyType.Text];\n\nexport const config = {\n\tkey: 'TYPOGRAPH',\n\tlabel: 'Text Cluster (beta)', // is \"beta\" okay @shawn?\n\ticon: 'heatmap',\n\twrapper: TypographWidgetWrapper,\n\tendpoint: textClusters,\n\tKnobs: TypographWidgetKnobs,\n\tActions: TypographActions,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {},\n\t\t\t},\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, [], types).length >= 1;\n\t},\n};\n","import React, { useContext, useEffect, useState } from 'react';\nimport { TypographWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { WorkspaceActionCreator } from \"hooks/useWorkspaceState\";\nimport { WorkspaceContext } from \"views/workspace/workspaceContext\";\n\n/**\n * ChartWrapper for the physics based clustering diagram.\n *\n * Expects: [{count, labels:['term'...]}]\n * Converts: [nodes: [], links: [{source, target}]]\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param cardIndex\n * @param data\n * @param actions\n * @returns {*}\n * @constructor\n */\nexport function TypographWidgetWrapper({dimensions, cardIndex, data, actions}) {\n const { dispatch } = useContext(WorkspaceContext) ?? {};\n const [convertedData, setConvertedData] = useState({nodes: [], links: []});\n\n const onSelect = (selected) => {\n dispatch && dispatch(WorkspaceActionCreator.updateExplorerCardActions(cardIndex, {selected: selected}));\n }\n\n useEffect(() => {\n const nodes = [];\n const links = [];\n\n // empty data is \"valid\" and different than null.\n if (data?.length === 0) {\n setConvertedData({nodes: [], links: []});\n }\n\n // the data is null, or in the wrong shape...so we exit\n if (!data || !data?.[0]?.labels)\n return;\n\n // for each cluster, create a parent node\n data.forEach(({id, count, labels: summaryTerms}, i) => {\n const parent = {id, count, type: \"centroid\", colorIndex: i};\n nodes.push(parent);\n\n // create a child node for each term in the cluster and link to parent\n summaryTerms.forEach(term => {\n const child = {label: term, type: \"child\", parentId: id, colorIndex: i};\n nodes.push(child);\n links.push({source: parent, target: child});\n });\n });\n\n // anytime the data would change, we need to clear the selection\n dispatch && dispatch(WorkspaceActionCreator.updateExplorerCardActions(cardIndex, {selected: []}));\n\n // update the chart data\n setConvertedData({nodes, links});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n return (\n (convertedData?.nodes?.length > 0)\n ? \n : \n );\n}\n","import * as d3 from 'd3';\n\nexport function onMouseOver(svg, event, item) {\n\td3.select(svg)\n\t\t.selectAll('g.band')\n\t\t.transition()\n\t\t.duration(250)\n\t\t.attr('opacity', function (d) {\n\t\t\t// @ts-ignore:next-line\n\t\t\tconst current = d3.select(this).datum().key;\n\t\t\treturn current === item.key ? 1.0 : 0.5;\n\t\t});\n}\n\nexport function onMouseOut(svg) {\n\td3.select(svg).selectAll('g.band').transition().duration(250).attr('opacity', 1.0);\n}\n\nexport function onClear(svg) {\n\td3.select(svg).selectAll('g').remove();\n}","import { scaleBand, ScaleBand } from \"d3-scale\";\n\n// These numbers are from the specs here:\n// https://confluence.pnnl.gov/confluence/pages/viewpage.action?pageId=227386967\nconst MAX_SINGLE_BAR_WIDTH = 200;\nconst BAR_BORDER = 50;\n\n// Enum to indicate behavior of band\nenum SizingBehavior {\n paddingExpands,\n bandShrinks,\n allShrink\n}\n\n\n/**\n * This function wraps d3's scaleBand to add special functionality\n * to the case where the domain's length is 1.\n * \n * When the domain's length is 1:\n * - Ideally, the band point spans from 50px from the start to 250px\n * and has at least 50px of space after it\n * - If there isn't enough room for that (range<300px), \n * the span of the bar decreases as needed, down to 50px.\n * - If the range<150px, the span and padding decrease proportionally together.\n */ \nexport const wrappedBand = function wrappedBand(singleBandAtEnd=false, band?:ScaleBand):ScaleBand {\n //// Set up wrapping of scaleBand\n const normalBand = band ? band : scaleBand()\n\n //// Make some helpers\n // getter for singleDomain\n const hasSingleDomain = () => {\n return normalBand.domain().length === 1;\n }\n\n // Total space in band\n const getBandSize = () =>{\n const [start, end] = normalBand.range()\n return Math.abs(end-start);\n }\n\n // get enum indicating how the band sizing should behave\n const getSizeBehavior = () => {\n const bandSize = getBandSize()\n if (bandSize>=MAX_SINGLE_BAR_WIDTH+BAR_BORDER*2){\n return SizingBehavior.paddingExpands\n }\n if (bandSize>=BAR_BORDER*3){\n return SizingBehavior.bandShrinks\n }\n return SizingBehavior.allShrink\n }\n\n //// Create wrapped function\n /**\n * Make initial newBand\n * \n * This function takes in an element of the domain (category),\n * and returns an element of the range (start of band). Normally we just use\n * the normalBand's function for this, but if there is only one\n * item in the domain, we override to make sure we center the bands\n * according to specs.\n */\n const untypedNewBand = (x) => {\n if (hasSingleDomain()) {\n const [rangeStart,rangeEnd] = normalBand.range()\n switch(getSizeBehavior()) {\n case SizingBehavior.paddingExpands:\n // Position band relative to start or end of range\n return singleBandAtEnd ?\n rangeEnd - BAR_BORDER - MAX_SINGLE_BAR_WIDTH: \n rangeStart + BAR_BORDER;\n case SizingBehavior.allShrink:\n // When all shrinking, band starts at \n // one third of total width\n return rangeStart + getBandSize()/3;\n case SizingBehavior.bandShrinks:\n return rangeStart + BAR_BORDER;\n }\n }\n else return normalBand(x)\n }\n\n /**\n * Function wrapper that makes sure to return the wrapped\n * band if a ScaleBand is being returned\n */\n const makeReturnWrapped = (func:Function) => {\n return function (...args) {\n // @ts-ignore - no ts, the spread array is included\n const ret = func(...args)\n // If we were going to return normalBand,\n // return wrapped band instead\n if(ret===normalBand) {\n return untypedNewBand\n }\n return ret\n }\n }\n\n // copy all props\n for(var prop in normalBand) {\n if (normalBand.hasOwnProperty(prop)) {\n untypedNewBand[prop] = makeReturnWrapped(normalBand[prop]);\n }\n }\n // it has ScaleBand's props so we can type cast in good faith now\n const newBand = untypedNewBand as ScaleBand\n\n //// Overrides\n /**\n * If hasSingleDomain then we need to\n * figure out the correct size for our single band\n * and override normal functionality\n */\n newBand.bandwidth = () => {\n if (hasSingleDomain()) {\n const bandSize = getBandSize()\n switch(getSizeBehavior()) {\n case SizingBehavior.paddingExpands:\n return MAX_SINGLE_BAR_WIDTH;\n case SizingBehavior.bandShrinks:\n return (bandSize - BAR_BORDER*2)\n case SizingBehavior.allShrink:\n return (bandSize/3)\n }\n }\n else return normalBand.bandwidth()\n } \n\n /**\n * Make sure copies are still wrapped\n */\n newBand.copy = () => {\n return wrappedBand(singleBandAtEnd,normalBand.copy())\n }\n\n return newBand\n}\n","import * as d3 from 'd3';\nimport { readableColor } from 'polished';\nimport { isValid, formatValueScientificNotation, fitLabelWidth } from '../chartUtils';\nimport { onClear, onMouseOut, onMouseOver } from 'widgets/stackedBarChart/utils';\nimport { wrappedBand } from './wrappedBand';\nconst axisLabelFontSize = 10;\nconst axisLabelRotation = -65;\n\n// the max length to allow for the labels\nconst maxLength = 100;\n\nconst labelPadding = {\n\txAxis: 0,\n\tyAxis: 10,\n};\n\n// overall margins for the main chart\nconst margin = {\n\ttop: 17,\n\tright: 30,\n\tbottom: maxLength + labelPadding.xAxis,\n\tleft: 40 + labelPadding.yAxis,\n};\n\nconst measureAxisText = (svg) => {\n\tlet max = 0;\n\td3.select(svg)\n\t\t.select('.xAxis')\n\t\t.selectAll('.tick')\n\t\t.each(function () {\n\t\t\tmax = Math.max(max, this.getBBox().height);\n\t\t});\n\treturn Math.ceil(max);\n};\n\nconst getMarginBottom = (maxText, limitLength) => {\n\treturn limitLength ? Math.min(margin.bottom, maxText) : maxText;\n};\n\n/**\n * Creates a vertical bar chart (bars are columns).\n *\n * @param {*} svg\n * @param updateTooltip\n * @returns {{update: update}}\n * @constructor\n */\nexport const VerticalBarChart = ({ svg, updateTooltip, navigateTo }) => {\n\tlet initialized = false;\n\n\t// y scale for main chart\n\tconst yScale = d3.scaleLinear();\n\tconst yAxis = d3.axisLeft(yScale).ticks(10, '~s');\n\t// use an exponent format instead of the easy to read format '~s' for values like .01 or .1\n\tconst yAxisForTinyValues = d3.axisLeft(yScale).ticks(10, 'e');\n\n\t// x scale for main chart\n\tconst xScale = wrappedBand()\n\t\t.paddingInner(0.1)\n\t\t.paddingOuter(0.2);\n\tconst xAxis = d3.axisBottom(xScale);\n\n\tfunction getYAxis(chartHasTinyValuesOnly) {\n\t\tif (chartHasTinyValuesOnly) return yAxisForTinyValues;\n\t\treturn yAxis;\n\t}\n\n\tfunction init({ properties, extent }, { height, width }) {\n\t\tconst chartHasTinyValuesOnly = extent[1] < 1;\n\n\t\t// create group for grid lines first\n\t\td3.select(svg).append('g').classed('gridGroup', true);\n\n\t\t// create group for grid lines first\n\t\td3.select(svg).append('g').classed('labelGroup', true);\n\n\t\t// create xAxis\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('xAxis', true)\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`)\n\t\t\t.attr('font-size', 11)\n\t\t\t.call(xAxis);\n\n\t\t// measures the longest text label on the xAxis\n\t\tconst maxText = measureAxisText(svg);\n\n\t\t// create yAxis\n\t\tyScale\n\t\t\t.domain([0, extent[1]])\n\t\t\t.range([height - getMarginBottom(maxText, true), margin.top])\n\t\t\t.nice()\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('yAxis', true)\n\t\t\t.attr('transform', `translate(${margin.left},0)`)\n\t\t\t.call(getYAxis(chartHasTinyValuesOnly));\n\n\t\t// create yAxis Label\n\t\txScale.domain(properties).range([margin.left, width - margin.right]);\n\t\td3.select(svg)\n\t\t\t.select('.yAxis')\n\t\t\t.append('text')\n\t\t\t.classed('yAxisLabel', true)\n\t\t\t.attr('transform', 'rotate(-90)')\n\t\t\t.attr('y', chartHasTinyValuesOnly ? '-48' : '-36')\n\t\t\t.attr('x', -yScale(extent[1] / 2))\n\t\t\t.style('text-anchor', 'middle')\n\t\t\t.style('text-anchor', 'middle')\n\t\t\t.attr('fill', 'black')\n\t\t\t.attr('font-size', '1rem')\n\t\t\t.text('Count');\n\n\t\t// re-set the xAxis transform\n\t\td3.select(svg)\n\t\t\t.select('g.xAxis')\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`);\n\n\t\t// create main chart bar group\n\t\td3.select(svg).append('g').classed('barGroup', true);\n\t}\n\n\tfunction update(\n\t\t{ data, properties, keys, extent, colorPropertyMap, dataHasLinks = false, alternateDataFormatter, hasLabelTooltips },\n\t\t{ height, width },\n\t\t{ hyperLink, colorScale, showBarLabels = true, yAxisLabel = 'Count', limitAxisLabels = true, maxLabelCharacters = 18 },\n\t\thideLabels\n\t) {\n\t\tconst chartHasTinyValuesOnly = extent[1] < 1;\n\t\tlet _margin = margin;\n\t\tif (chartHasTinyValuesOnly) {\n\t\t\t_margin = {\n\t\t\t\t..._margin,\n\t\t\t\tleft: _margin.left + 10,\n\t\t\t}\n\t\t}\n\t\tif(hideLabels) {\n\t\t\t_margin = {\n\t\t\t\tleft: 0, right: 0, top: 0, bottom: 0\n\t\t\t};\n\t\t}\n\t\tconst _maxText = measureAxisText(svg);\n\t\tyScale\n\t\t\t.domain([0, extent[1]])\n\t\t\t.range([height - (hideLabels ? 0 : getMarginBottom(_maxText, true)), _margin.top])\n\t\t\t.nice();\n\n\t\tconst getHeight = (d) => (isValid(d) ? yScale(d[0]) - yScale(d[1]) : 0);\n\n\t\t// update x axis\n\t\txScale.domain(properties).range([_margin.left, width - _margin.right]);\n\n\t\tproperties = properties.slice();\n\t\twhile(xScale.bandwidth() < 12) {\n\t\t\tproperties.splice(-1,1);\n\t\t\txScale.domain(properties);\n\t\t}\n\t\tdata = data.slice(0,properties.length); //Make the data match the number of items in properties array\n\n\t\txAxis.tickValues(xScale.domain());\n\n\t\tconst xAxisTextLabels = d3.select(svg)\n\t\t\t.select('g.xAxis')\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`)\n\t\t\t.call(xAxis)\n\t\t\t.selectAll('text')\n\t\t\t.text((currentText) => currentText)\n\t\t\t.attr('transform', `rotate(${axisLabelRotation})`)\n\t\t\t.attr('cy-test', 'stackbar-data-vbar-x-label')\n\t\t\t.style('text-anchor', 'end')\n\t\t\t.attr('dx', '-.8em')\n\t\t\t.attr('dy', '-.15em')\n\t\t\t.attr('font-size', axisLabelFontSize)\n\t\t\t.each(fitLabelWidth(10, \"'Libre_Franklin',ArialMT,sans-serif\", (textLength) => textLength > (getMarginBottom(100000, limitAxisLabels) - 5)));\n\n\t\tif (dataHasLinks || hyperLink) {\n\t\t\txAxisTextLabels\n\t\t\t\t.data(data)\n\t\t\t\t.attr('cursor', 'pointer')\n\t\t\t\t.on('mouseover', function(_, d) {\n\t\t\t\t\tif (hasLabelTooltips){\t\n\t\t\t\t\t\tconst x = xScale(d.label) + xScale.bandwidth() / 2;\n\t\t\t\t\t\tconst y = yScale(d.value) - 5;\n\t\t\t\t\t\tconst { title, subtitle, count } = d.labelTooltip;\n\n\t\t\t\t\t\tconst data = { title, subtitle, count};\n\n\t\t\t\t\t\td3.select(svg).selectAll('.bar').transition().duration(100).style('opacity', 0.5);\n\n\t\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t.style('opacity', 1.0)\n\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null, null);\n\t\t\t\t\t\t\t\tupdateTooltip &&\n\t\t\t\t\t\t\t\t\tupdateTooltip(\n\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\t\t\t\ty: y - 10,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\tif (hasLabelTooltips){\t\n\t\t\t\t\t\td3.select(svg)\n\t\t\t\t\t\t\t.selectAll('.bar')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on('click', function (event, {href, label}) {\n\t\t\t\t\tif (href) navigateTo('/' + href);\n\t\t\t\t\t//Following used in CyHy Curated Views Single Vul\n\t\t\t\t\telse if(hyperLink) {\n\t\t\t\t\t\tif(hyperLink.includes(\"/curated_views/Organization\")){\n\t\t\t\t\t\t\t// Linking to an org is involves different steps than linking to a vuln.,\n\t\t\t\t\t\t\t// so we split the logic into two branches\n\t\t\t\t\t\t\t//HACK for now. May want to include the orgs key? Or make hyperLink a func? (dont love that idea bc it comes\n\t\t\t\t\t\t\t// thru widgetConfig, which should be hydratable\n\t\t\t\t\t\t\t// https://stackoverflow.com/a/47864833\n\t\t\t\t\t\t\tconst key = (label).match(/\\((.*)\\)/).pop();\n\t\t\t\t\t\t\tif(key)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", key)}`, '_blank');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", label)}`, '_blank');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tconst maxText = measureAxisText(svg);\n\n\t\t// update y axis\n\t\tyScale\n\t\t\t.domain([0, extent[1]])\n\t\t\t.range([height - (hideLabels ? 0 : getMarginBottom(maxText, limitAxisLabels)), _margin.top])\n\t\t\t.nice();\n\n\t\td3.select(svg)\n\t\t\t.select('g.yAxis')\n\t\t\t.attr('transform', `translate(${_margin.left},0)`)\n\t\t\t.call(getYAxis(chartHasTinyValuesOnly))\n\t\t\t.selectAll('text')\n\t\t\t.attr('cy-test', 'stackbar-data-vbar-y-label');\n\n\t\t// update the yAxis label\n\t\t// managed by *yAxisLabel*\n\t\td3.select(svg)\n\t\t\t.select('.yAxisLabel')\n\t\t\t.text(yAxisLabel)\n\t\t\t//in case yScale updated\n\t\t\t.attr('x', -yScale(extent[1] / 2));\n\n\t\t// reset the xAxis transform\n\t\td3.select(svg)\n\t\t\t.select('g.xAxis')\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`);\n\n\t\t// add the Y gridlines\n\t\td3.select(svg).selectAll('.grid').remove();\n\n\t\td3.select(svg)\n\t\t\t.select('.gridGroup')\n\t\t\t.append('g')\n\t\t\t.attr('class', 'grid y-grid')\n\t\t\t.attr('transform', `translate(${_margin.left}, 0)`)\n\t\t\t.call(\n\t\t\t\td3\n\t\t\t\t\t.axisLeft(yScale)\n\t\t\t\t\t.tickSize(-width + _margin.right + _margin.left)\n\t\t\t\t\t.tickFormat('')\n\t\t\t);\n\n\t\t// create the top labels\n\t\td3.select(svg)\n\t\t\t.select('.labelGroup')\n\t\t\t.selectAll('.topLabel')\n\t\t\t.data(data)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\treturn enter\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.classed('topLabel', true)\n\t\t\t\t\t\t.attr('x', (d) => xScale(d.label) + xScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('y', (d) => yScale(d.value) - 5)\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('font-size', 10)\n\t\t\t\t\t\t.text((d) =>\n\t\t\t\t\t\t\talternateDataFormatter ? alternateDataFormatter(d.value) : formatValueScientificNotation(d.value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr('opacity', function () {\n\t\t\t\t\t\t\tconst noFit = this.getComputedTextLength() + 8 > xScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : 1;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-vbar-toptext');\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\treturn update\n\t\t\t\t\t\t.attr('x', (d) => xScale(d.label) + xScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('y', (d) => yScale(d.value) - 5)\n\t\t\t\t\t\t.text((d) =>\n\t\t\t\t\t\t\talternateDataFormatter ? alternateDataFormatter(d.value) : formatValueScientificNotation(d.value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr('opacity', function () {\n\t\t\t\t\t\t\tif(hideLabels)\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\tconst noFit = this.getComputedTextLength() + 8 > xScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : 1;\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\t// The stack call produces a dense matrix of values (n rows by m colums)\n\t\t// in the case where there are many unique values amongst the rows this\n\t\t// is extremely poorly performing for no real reason. So we filter out invalid\n\t\t// values and move on.\n\t\tconst stacked = d3.stack().keys(keys)(data);\n\t\tconst filtered = stacked.map((bar) => {\n\t\t\tconst retVal = bar.filter((segment) => {\n\t\t\t\treturn !isNaN(segment[1]);\n\t\t\t});\n\t\t\tretVal.key = bar.key;\n\t\t\tretVal.index = bar.index;\n\t\t\treturn retVal;\n\t\t});\n\n\t\t// primary bands\n\t\td3.select(svg)\n\t\t\t.select('.barGroup')\n\t\t\t.selectAll('g.band')\n\t\t\t.data(filtered, (d) => d.key)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('g').classed('band', true).attr('opacity', 1),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t)\n\t\t\t.selectAll('g.bar')\n\t\t\t.data((d) => d)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst g = enter\n\t\t\t\t\t\t.append('g')\n\t\t\t\t\t\t.classed('bar', true)\n\t\t\t\t\t\t.attr('transform', (d) => `translate(${xScale(d.data.label)} 0)`)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-vbar')\n\t\t\t\t\t\t.on('mouseover', function (_, d) {\n\t\t\t\t\t\t\tconst x = xScale(d.data.label) + xScale.bandwidth() / 2;\n\t\t\t\t\t\t\tconst y = yScale(d.data.value) - 5;\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\n\t\t\t\t\t\t\tconst data = {\n\t\t\t\t\t\t\t\ttitle: d.data.label,\n\t\t\t\t\t\t\t\tsubtitle: key,\n\t\t\t\t\t\t\t\tcount: alternateDataFormatter ? alternateDataFormatter(d.data[key]) : d.data[key],\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\td3.select(svg).selectAll('.bar').transition().duration(100).style('opacity', 0.5);\n\n\t\t\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t\t.style('opacity', 1.0)\n\t\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null, null);\n\n\t\t\t\t\t\t\t\t\tupdateTooltip &&\n\t\t\t\t\t\t\t\t\t\tupdateTooltip(\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\t\t\t\t\ty: y - 10,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\t\t\td3.select(svg)\n\t\t\t\t\t\t\t\t.selectAll('.bar')\n\t\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('click', function (event, {data: {href, label}}) {\n\t\t\t\t\t\t\tif (href) navigateTo('/' + href);\n\t\t\t\t\t\t\t//Following used in CyHy Curated Views Single Vul\n\t\t\t\t\t\t\telse if(hyperLink) {\n\t\t\t\t\t\t\t\tif(hyperLink.includes(\"/curated_views/Organization\")){\n\t\t\t\t\t\t\t\t\t// Linking to an org is involves different steps than linking to a vuln.,\n\t\t\t\t\t\t\t\t\t// so we split the logic into two branches\n\t\t\t\t\t\t\t\t\t//HACK for now. May want to include the orgs key? Or make hyperLink a func? (dont love that idea bc it comes\n\t\t\t\t\t\t\t\t\t// thru widgetConfig, which should be hydratable\n\t\t\t\t\t\t\t\t\t// https://stackoverflow.com/a/47864833\n\t\t\t\t\t\t\t\t\tconst key = (label).match(/\\((.*)\\)/).pop();\n\t\t\t\t\t\t\t\t\tif(key)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", key)}`, '_blank');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", label)}`, '_blank');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}});\n\n\t\t\t\t\tif (dataHasLinks) {\n\t\t\t\t\t\tg.append('svg:a')\n\t\t\t\t\t\t\t.attr('xlink:href', function (d) {\n\t\t\t\t\t\t\t\treturn d.data.publicURL + d.data.href;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\t\tconst parentBar = this.parentNode;\n\t\t\t\t\t\t\t\tconst fill = d3.select(parentBar).attr('fill');\n\t\t\t\t\t\t\t\treturn fill;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.append('rect')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(150)\n\t\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t\t.attr('x', 0)\n\t\t\t\t\t\t\t.attr('y', (d) => yScale(d[1]))\n\t\t\t\t\t\t\t.attr('width', xScale.bandwidth())\n\t\t\t\t\t\t\t.attr('height', (d) => getHeight(d));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tg.append('rect')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(150)\n\t\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t\t.attr('x', 0)\n\t\t\t\t\t\t\t.attr('y', (d) => yScale(d[1]))\n\t\t\t\t\t\t\t.attr('width', xScale.bandwidth())\n\t\t\t\t\t\t\t.attr('height', (d) => getHeight(d));\n\t\t\t\t\t}\n\n\t\t\t\t\t// display labels inside of the bars\n\t\t\t\t\t// visibility controlled by *showBarLabels*\n\t\t\t\t\t/*g.append('text')\n\t\t\t\t\t\t.classed('barLabel', true)\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('dominant-baseline', 'middle')\n\t\t\t\t\t\t.attr('x', () => xScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('y', (d) => (isValid(d) ? yScale(d[1]) + getHeight(d) / 2 : 0))\n\t\t\t\t\t\t.attr('font-size', 10)\n\t\t\t\t\t\t.attr('pointer-events', dataHasLinks ? 'none' : 'visiblePainted')\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst fill = d3.select(bar).attr('fill');\n\t\t\t\t\t\t\treturn fill ? readableColor(fill) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst group = bar.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\n\t\t\t\t\t\t\treturn alternateDataFormatter\n\t\t\t\t\t\t\t\t? alternateDataFormatter(d.data[key])\n\t\t\t\t\t\t\t\t: formatValueScientificNotation(d.data[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tconst noFit =\n\t\t\t\t\t\t\t\tthis.getBBox().height + 8 > getHeight(d) || this.getComputedTextLength() + 8 > xScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : showBarLabels ? 1 : 0;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-vbar-text');*/\n\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('transform', (d) => `translate(${xScale(d.data.label)} 0)`)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[key]);\n\t\t\t\t\t\t});\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('rect')\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t.attr('y', (d) => yScale(d[1]))\n\t\t\t\t\t\t.attr('width', xScale.bandwidth())\n\t\t\t\t\t\t.attr('height', (d) => getHeight(d));\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('.barLabel')\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('x', () => xScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('y', (d) => (isValid(d) ? yScale(d[1]) + getHeight(d) / 2 : 0))\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst fill = d3.select(bar).attr('fill');\n\t\t\t\t\t\t\treturn fill ? readableColor(fill) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst group = bar.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn alternateDataFormatter\n\t\t\t\t\t\t\t\t? alternateDataFormatter(d.data[key])\n\t\t\t\t\t\t\t\t: formatValueScientificNotation(d.data[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tif(hideLabels)\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\tconst noFit =\n\t\t\t\t\t\t\t\tthis.getBBox().height + 8 > getHeight(d) || this.getComputedTextLength() + 8 > xScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : showBarLabels ? 1 : 0;\n\t\t\t\t\t\t});\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\t}\n\n\tfunction mouseOver(event, item) {\n\t\tonMouseOver(svg, event, item);\n\t}\n\n\tfunction mouseOut() {\n\t\tonMouseOut(svg);\n\t}\n\n\tfunction clear() {\n\t\tonClear(svg);\n\t}\n\n\tfunction externalUpdate({ data, dimensions, options, hideLabels }) {\n\t\tif (!initialized) {\n\t\t\tinit(data, dimensions);\n\t\t\tinitialized = true;\n\t\t}\n\n\t\tupdate(data, dimensions, options, hideLabels);\n\t}\n\n\treturn {\n\t\tupdate: externalUpdate,\n\t\tclear: clear,\n\t\tmouseOver: mouseOver,\n\t\tmouseOut: mouseOut,\n\t};\n};\n","import * as d3 from 'd3';\nimport { isValid } from '../chartUtils';\nimport { Position } from '@blueprintjs/core';\nimport { formatValueScientificNotation, fitLabelWidth } from 'widgets/chartUtils';\nimport { readableColor } from 'polished';\nimport { onClear, onMouseOut, onMouseOver } from 'widgets/stackedBarChart/utils';\nimport { wrappedBand } from './wrappedBand';\n\n// the max length to allow for the labels\nconst maxLength = 110;\n\n// overall margins for the main chart\nconst margin = {\n\ttop: 7,\n\tright: 30,\n\tbottom: 25,\n\tleft: maxLength,\n};\n\nconst measureAxisText = (svg) => {\n\tlet width = 0;\n\tlet height = 0;\n\n\td3.select(svg)\n\t\t.select('.yAxis')\n\t\t.selectAll('.tick')\n\t\t.each(function () {\n\t\t\twidth = Math.ceil(Math.max(width, this.getBBox().width));\n\t\t\theight = this.getBBox().height;\n\t\t});\n\treturn {width, height};\n};\n\nconst getMarginLeft = (widgetWidth, maxText, limitLength) => {\n\treturn limitLength ? Math.min(/*margin.left*/widgetWidth * .333, maxText) : maxText;\n};\n\n/**\n * Creates a horizontal bar chart (bars are wide).\n *\n * @param {*} svg\n * @param updateTooltip\n * @returns {{update: update}}\n * @constructor\n */\nexport const HorizontalBarChart = ({ svg, updateTooltip, navigateTo }) => {\n\tlet initialized = false;\n\n\t// x scale for main chart\n\tconst xScale = d3.scaleLinear();\n\tconst xAxis = d3.axisBottom(xScale);\n\t// use an exponent format for values like .01 or .1\n\tconst xAxisForTinyValues = d3.axisBottom(xScale).ticks(10, 'e');\n\n\t// y scale for main chart\n\tconst yScale = wrappedBand(true).paddingInner(0.1).paddingOuter(0.2);\n\tconst yAxis = d3.axisLeft(yScale);\n\n\tfunction getXAxis(chartHasTinyValuesOnly) {\n\t\tif (chartHasTinyValuesOnly) return xAxisForTinyValues;\n\t\treturn xAxis;\n\t}\n\n\tfunction init({ properties, extent }, { height, width }) {\n\t\tconst chartHasTinyValuesOnly = extent[1] < 1;\n\n\t\t// create group for grid lines\n\t\td3.select(svg).append('g').classed('gridGroup', true);\n\n\t\t// create group for bar labels\n\t\td3.select(svg).append('g').classed('labelGroup', true);\n\n\t\t// create main chart bar group\n\t\td3.select(svg).append('g').classed('barGroup', true);\n\n\t\t// create yAxis\n\t\tyScale.domain(properties).range([margin.top, height - margin.bottom]);\n\t\td3.select(svg).append('g').classed('yAxis', true).attr('transform', `translate(${margin.left},0)`).call(yAxis);\n\n\t\tconst maxText = measureAxisText(svg);\n\n\t\t// create xAxis\n\t\txScale\n\t\t\t.domain([0, extent[1]])\n\t\t\t.range([getMarginLeft(width, maxText.width, true), width - margin.right])\n\t\t\t.nice();\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('xAxis', true)\n\t\t\t.attr('transform', `translate(0,${height - margin.bottom})`)\n\t\t\t.call(getXAxis(chartHasTinyValuesOnly));\n\n\t\t// re-set the yAxis transform\n\t\td3.select(svg)\n\t\t\t.select('.yAxis')\n\t\t\t.attr('transform', `translate(${getMarginLeft(width, maxText.width, true)},0)`);\n\t}\n\n\tfunction update(\n\t\t{ data, properties, keys, extent, colorPropertyMap, dataHasLinks = false, alternateDataFormatter, hasLabelTooltips },\n\t\t{ height, width },\n\t\t{\n\t\t\tcolorScale,\n\t\t\tshowBarLabels = true,\n\t\t\tlimitAxisLabels = true,\n\t\t\tmaxLabelCharacters = 18,\n\t\t\thyperLink\n\t\t},\n\t\thideLabels\n\t) {\n\t\tlet _margin = margin;\n\t\tif(hideLabels) {\n\t\t\t_margin = {\n\t\t\t\tleft: 0, right: 0, top: 0, bottom: 0\n\t\t\t};\n\t\t}\n\n\t\tconst getWidth = (d) => (isValid(d) ? xScale(d[1]) - xScale(d[0]) : 0);\n\t\tconst chartHasTinyValuesOnly = extent[1] < 1;\n\n\t\t// update y axis\n\t\tyScale.domain(properties).range([_margin.top, height - _margin.bottom]);\n\n\t\tif (yScale.bandwidth() < 5) yAxis.tickValues(yScale.domain().filter((_, i) => !(i % 10)));\n\t\telse yAxis.tickValues(yScale.domain());\n\n\t\tconst yAxisTextLabels = d3.select(svg)\n\t\t\t.select('g.yAxis')\n\t\t\t.attr('transform', `translate(${_margin.left},0)`)\n\t\t\t.call(yAxis)\n\t\t\t.selectAll('text')\n\t\t\t.text((currentText) => currentText\n\t\t\t\t/*!limitAxisLabels || currentText.length <= maxLabelCharacters\n\t\t\t\t\t? currentText\n\t\t\t\t\t: currentText.substring(0, maxLabelCharacters) + '...'*/\n\t\t\t)\n\t\t\t.attr('cy-test', 'stackbar-data-hbar-y-label')\n\t\t\t.each(fitLabelWidth(10, \"'Libre_Franklin',ArialMT,sans-serif\", (textLength) => textLength + 10 > (getMarginLeft(width - 30, 100000, limitAxisLabels))));\n\n\t\tif (dataHasLinks || hyperLink) {\n\t\t\tyAxisTextLabels\n\t\t\t\t.data(data)\n\t\t\t\t.attr('cursor', 'pointer')\n\t\t\t\t.on('mouseover', function(_, d) {\n\t\t\t\t\tif (hasLabelTooltips){\t\n\t\t\t\t\t\tconst x = xScale(d.value);\n\t\t\t\t\t\tconst y = yScale(d.label) + _margin.top / 2;\n\t\t\t\t\t\tconst { title, subtitle, count } = d.labelTooltip;\n\n\t\t\t\t\t\tconst data = { title, subtitle, count};\n\n\t\t\t\t\t\td3.select(svg).selectAll('.bar').transition().duration(100).style('opacity', 0.5);\n\n\t\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t.style('opacity', 1.0)\n\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(\n\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{ position: Position.TOP_RIGHT }\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\tif (hasLabelTooltips){\t\n\t\t\t\t\t\td3.select(svg)\n\t\t\t\t\t\t\t.selectAll('.bar')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on('click', function (event, {href, label}) {\n\t\t\t\t\tif (href) navigateTo('/' + href);\n\t\t\t\t\t//Following used in CyHy Curated Views Single Vul\n\t\t\t\t\telse if(hyperLink) {\n\t\t\t\t\t\tif(hyperLink.includes(\"/curated_views/Organization\")){\n\t\t\t\t\t\t\t// Linking to an org is involves different steps than linking to a vuln.,\n\t\t\t\t\t\t\t// so we split the logic into two branches\n\t\t\t\t\t\t\t//HACK for now. May want to include the orgs key? Or make hyperLink a func? (dont love that idea bc it comes\n\t\t\t\t\t\t\t// thru widgetConfig, which should be hydratable\n\t\t\t\t\t\t\t// https://stackoverflow.com/a/47864833\n\t\t\t\t\t\t\tconst key = (label).match(/\\((.*)\\)/).pop();\n\t\t\t\t\t\t\tif(key)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", key)}`, '_blank');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", label)}`, '_blank');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tconst maxText = measureAxisText(svg);\n\n\t\t// update x axis\n\t\txScale\n\t\t\t.domain([0, extent[1]])\n\t\t\t.range([hideLabels ? 0 : getMarginLeft(width, maxText.width, limitAxisLabels), width - _margin.right])\n\t\t\t.nice();\n\t\td3.select(svg)\n\t\t\t.select('g.xAxis')\n\t\t\t.attr('transform', `translate(0,${height - _margin.bottom})`)\n\t\t\t.call(getXAxis(chartHasTinyValuesOnly))\n\t\t\t.selectAll('text')\n\t\t\t.attr('cy-test', 'stackbar-data-hbar-x-label');\n\n\t\t// re-set axis\n\t\td3.select(svg)\n\t\t\t.select('g.yAxis')\n\t\t\t.attr('transform', `translate(${hideLabels ? 0 : getMarginLeft(width, maxText.width, limitAxisLabels)},0)`);\n\n\t\t// add the X gridlines\n\t\td3.select(svg).selectAll('.grid').remove();\n\n\t\td3.select(svg)\n\t\t\t.select('.gridGroup')\n\t\t\t.append('g')\n\t\t\t.attr('class', 'grid y-grid')\n\t\t\t.attr('transform', `translate(0 ${height - _margin.bottom})`)\n\t\t\t.call(\n\t\t\t\td3\n\t\t\t\t\t.axisTop(xScale)\n\t\t\t\t\t.tickSize(height - _margin.bottom - _margin.top)\n\t\t\t\t\t.tickFormat('')\n\t\t\t);\n\n\t\t// create the top labels\n\t\td3.select(svg)\n\t\t\t.select('.labelGroup')\n\t\t\t.selectAll('.topLabel')\n\t\t\t.data(data)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\treturn enter\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.classed('topLabel', true)\n\t\t\t\t\t\t.attr('x', (d) => xScale(d.value) + 5)\n\t\t\t\t\t\t.attr('y', (d) => yScale(d.label) + yScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('font-size', 10)\n\t\t\t\t\t\t.attr('text-anchor', 'beginning')\n\t\t\t\t\t\t.attr('dominant-baseline', 'middle')\n\t\t\t\t\t\t.text((d) =>\n\t\t\t\t\t\t\talternateDataFormatter ? alternateDataFormatter(d.value) : formatValueScientificNotation(d.value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr('opacity', function () {\n\t\t\t\t\t\t\tconst noFit = this.getBBox().height > yScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : 1;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-hbar-toptext');\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\treturn update\n\t\t\t\t\t\t.attr('x', (d) => xScale(d.value) + 5)\n\t\t\t\t\t\t.attr('y', (d) => yScale(d.label) + yScale.bandwidth() / 2)\n\t\t\t\t\t\t.text((d) =>\n\t\t\t\t\t\t\talternateDataFormatter ? alternateDataFormatter(d.value) : formatValueScientificNotation(d.value)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr('opacity', function () {\n\t\t\t\t\t\t\tif(hideLabels)\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\tconst noFit = this.getBBox().height > yScale.bandwidth();\n\t\t\t\t\t\t\treturn noFit ? 0 : 1;\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\t// The stack call produces a dense matrix of values (n rows by m colums)\n\t\t// in the case where there are many unique values amongst the rows this\n\t\t// is extremely poorly performing for no real reason. So we filter out invalid\n\t\t// values and move on.\n\t\tconst stacked = d3.stack().keys(keys)(data);\n\t\tconst filtered = stacked.map((bar) => {\n\t\t\tconst retVal = bar.filter((segment) => {\n\t\t\t\treturn !isNaN(segment[1]);\n\t\t\t});\n\t\t\tretVal.key = bar.key;\n\t\t\tretVal.index = bar.index;\n\t\t\treturn retVal;\n\t\t});\n\n\t\t// primary bands\n\t\td3.select(svg)\n\t\t\t.select('.barGroup')\n\t\t\t.selectAll('g.band')\n\t\t\t.data(filtered, (d) => d.key)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('g').classed('band', true).attr('opacity', 1),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t)\n\t\t\t.selectAll('g.bar')\n\t\t\t.data((d) => d)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst g = enter\n\t\t\t\t\t\t.append('g')\n\t\t\t\t\t\t.classed('bar', true)\n\t\t\t\t\t\t.attr('transform', (d) => `translate(0 ${yScale(d.data.label)})`)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-hbar')\n\t\t\t\t\t\t.on('mouseover', function (_, d) {\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\t\t\t\t\t\t\tconst x = xScale(d.data[key]);\n\t\t\t\t\t\t\tconst y = yScale(d.data.label) + _margin.top / 2;\n\n\t\t\t\t\t\t\tconst data = {\n\t\t\t\t\t\t\t\ttitle: d.data.label,\n\t\t\t\t\t\t\t\tsubtitle: key,\n\t\t\t\t\t\t\t\tcount: alternateDataFormatter ? alternateDataFormatter(d.data[key]) : d.data[key],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\td3.select(svg).selectAll('.bar').transition().duration(100).style('opacity', 0.5);\n\n\t\t\t\t\t\t\td3.select(this)\n\t\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t\t.style('opacity', 1.0)\n\t\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\n\t\t\t\t\t\t\t\t\tupdateTooltip &&\n\t\t\t\t\t\t\t\t\t\tupdateTooltip(\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{ position: Position.TOP_RIGHT }\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\t\t\td3.select(svg)\n\t\t\t\t\t\t\t\t.selectAll('.bar')\n\t\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t\t\t.on('end', () => {\n\t\t\t\t\t\t\t\t\tupdateTooltip && updateTooltip(null, null);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('click', function (event, {data: {href, label}}) {\n\t\t\t\t\t\t\tif (href) navigateTo('/' + href);\n\t\t\t\t\t\t\t//Following used in CyHy Curated Views Single Vul\n\t\t\t\t\t\t\telse if(hyperLink) {\n\t\t\t\t\t\t\t\tif(hyperLink.includes(\"/curated_views/Organization\")){\n\t\t\t\t\t\t\t\t\t// Linking to an org is involves different steps than linking to a vuln.,\n\t\t\t\t\t\t\t\t\t// so we split the logic into two branches\n\t\t\t\t\t\t\t\t\t//HACK for now. May want to include the orgs key? Or make hyperLink a func? (dont love that idea bc it comes\n\t\t\t\t\t\t\t\t\t// thru widgetConfig, which should be hydratable\n\t\t\t\t\t\t\t\t\t// https://stackoverflow.com/a/47864833\n\t\t\t\t\t\t\t\t\tconst key = (label).match(/\\((.*)\\)/).pop();\n\t\t\t\t\t\t\t\t\tif(key)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", key)}`, '_blank');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\twindow.open(`${hyperLink.replace(\"${}\", label)}`, '_blank');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (dataHasLinks) {\n\t\t\t\t\t\tg.append('svg:a')\n\t\t\t\t\t\t\t.attr('xlink:href', function (d) {\n\t\t\t\t\t\t\t\treturn d.data.publicURL + d.data.href;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\t\tconst parentBar = this.parentNode;\n\t\t\t\t\t\t\t\tconst fill = d3.select(parentBar).attr('fill');\n\t\t\t\t\t\t\t\treturn fill;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.append('rect')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(150)\n\t\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t\t.attr('x', (d) => xScale(d[0]))\n\t\t\t\t\t\t\t.attr('y', 0)\n\t\t\t\t\t\t\t.attr('width', (d) => getWidth(d))\n\t\t\t\t\t\t\t.attr('height', yScale.bandwidth());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tg.append('rect')\n\t\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t\t.duration(150)\n\t\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t\t.attr('x', (d) => xScale(d[0]))\n\t\t\t\t\t\t\t.attr('y', 0)\n\t\t\t\t\t\t\t.attr('width', (d) => getWidth(d))\n\t\t\t\t\t\t\t.attr('height', yScale.bandwidth());\n\t\t\t\t\t}\n\n\t\t\t\t\t// display labels inside of the bars\n\t\t\t\t\t// visibility controlled by *showBarLabels*\n\t\t\t\t\t/*g.append('text')\n\t\t\t\t\t\t.classed('barLabel', true)\n\t\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('dominant-baseline', 'middle')\n\t\t\t\t\t\t.attr('font-size', 10)\n\t\t\t\t\t\t.attr('pointer-events', dataHasLinks ? 'none' : 'visiblePainted')\n\t\t\t\t\t\t.attr('y', () => yScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('x', (d) => (isValid(d) ? xScale(d[0]) + getWidth(d) / 2 : 0))\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst fill = d3.select(bar).attr('fill');\n\t\t\t\t\t\t\treturn fill ? readableColor(fill) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst group = bar.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn alternateDataFormatter\n\t\t\t\t\t\t\t\t? alternateDataFormatter(d.data[key])\n\t\t\t\t\t\t\t\t: formatValueScientificNotation(d.data[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tconst noFit =\n\t\t\t\t\t\t\t\tthis.getBBox().height > yScale.bandwidth() || this.getComputedTextLength() + 8 > getWidth(d);\n\t\t\t\t\t\t\treturn noFit ? 0 : showBarLabels ? 1 : 0;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'stackbar-data-hbar-text');*/\n\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('transform', (d) => `translate(0 ${yScale(d.data.label)})`)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst key = d3.select(this.parentNode).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[key]);\n\t\t\t\t\t\t});\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('rect')\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('opacity', 1)\n\t\t\t\t\t\t.attr('x', (d) => xScale(d[0]))\n\t\t\t\t\t\t.attr('y', 0)\n\t\t\t\t\t\t.attr('width', (d) => getWidth(d))\n\t\t\t\t\t\t.attr('height', yScale.bandwidth());\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('.barLabel')\n\t\t\t\t\t\t.transition()\n\t\t\t\t\t\t.duration(100)\n\t\t\t\t\t\t.attr('y', () => yScale.bandwidth() / 2)\n\t\t\t\t\t\t.attr('x', (d) => (isValid(d) ? xScale(d[0]) + getWidth(d) / 2 : 0))\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst fill = d3.select(bar).attr('fill');\n\t\t\t\t\t\t\treturn fill ? readableColor(fill) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst bar = this.parentNode;\n\t\t\t\t\t\t\tconst group = bar.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn alternateDataFormatter\n\t\t\t\t\t\t\t\t? alternateDataFormatter(d.data[key])\n\t\t\t\t\t\t\t\t: formatValueScientificNotation(d.data[key]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tif(hideLabels)\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\tconst noFit =\n\t\t\t\t\t\t\t\tthis.getBBox().height > yScale.bandwidth() || this.getComputedTextLength() + 8 > getWidth(d);\n\t\t\t\t\t\t\treturn noFit ? 0 : showBarLabels ? 1 : 0;\n\t\t\t\t\t\t});\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\t}\n\n\tfunction mouseOver(event, item) {\n\t\tonMouseOver(svg, event, item);\n\t}\n\n\tfunction mouseOut() {\n\t\tonMouseOut(svg);\n\t}\n\n\tfunction clear() {\n\t\tonClear(svg);\n\t}\n\n\tfunction externalUpdate({ data, dimensions, options, hideLabels }) {\n\t\tif (!initialized) {\n\t\t\tinit(data, dimensions);\n\t\t\tinitialized = true;\n\t\t}\n\t\tupdate(data, dimensions, options, hideLabels);\n\t}\n\n\treturn {\n\t\tupdate: externalUpdate,\n\t\tclear: clear,\n\t\tmouseOver: mouseOver,\n\t\tmouseOut: mouseOut,\n\t};\n};\n","/** @jsx jsx */\n// eslint-disable-next-line no-unused-vars\nimport React, { useCallback, useMemo, useReducer } from 'react';\nimport { jsx } from '@emotion/react';\nimport { Tooltip } from '@blueprintjs/core';\nimport { directionalProperty } from 'polished';\n\ninterface Location {\n\tx: number;\n\ty: number;\n}\n\nexport interface State {\n\tdata;\n\tlocation: Location;\n\toptions;\n}\n\nexport interface TooltipReturn {\n\tTooltipElement: JSX.Element;\n\tupdateTooltip: (data: any, location: Location, options: any) => void;\n}\n\ntype Action = { location; data; options };\n\n// use a reducer to reduce the number of renders\nfunction reducer(state: State, action: Action): State {\n\tif (action === null) {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tlocation: null,\n\t\t\toptions: null,\n\t\t};\n\t}\n\n\treturn {\n\t\t...state,\n\t\tdata: action.data,\n\t\tlocation: action.location,\n\t\toptions: action.options,\n\t};\n}\n\n/**\n * Common tooltip framework for \"virtual\" element. For example, an SVG based chart that has a bunch of elements that\n * need individual tooltips.\n *\n * @param renderer\n * @returns {{setTooltipData: React.Dispatch>, setTooltipOptions: React.Dispatch>, TooltipElement: unknown, setTooltipLocation: React.Dispatch>}}\n */\nexport function useVirtualTooltip(renderer: (args: any) => JSX.Element): TooltipReturn {\n\tconst [state, dispatch] = useReducer(reducer, { location: null, data: null, options: null });\n\n\tconst updateTooltip = useCallback(\n\t\t(data: any, location: Location, options: any) => {\n\t\t\tdispatch({ data, location, options });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst TooltipElement = useMemo(() => {\n\t\tif (!state.location) return null;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t 0} {...state.options} targetTagName={\"div\"}>\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t);\n\t}, [renderer, state.data, state.location, state.options]);\n\n\treturn {\n\t\tTooltipElement,\n\t\tupdateTooltip,\n\t};\n}\n","// eslint-disable-next-line no-unused-vars\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useVirtualTooltip } from 'components/virtualTooltip/useVirtualTooltip';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { useHistory } from 'react-router';\n\nconst { updateSelection } = WorkspaceActionCreator;\n\ninterface IArgs {\n\tsvgRef: React.MutableRefObject;\n\tcontainerRef: React.MutableRefObject;\n\tdata: any;\n\tdimensions: { height: number; width: number };\n\toptions: any;\n\tVerticalChart;\n\tHorizontalChart;\n\trenderer;\n}\n\n/**\n *\n * @param svgRef\n * @param data\n * @param orientation\n * @param dimensions\n * @param options\n * @param updateTooltip\n * @param VerticalChart\n * @param HorizontalChart\n * @param renderer\n */\nexport const useOrientedChart = ({\n\tsvgRef,\n\tdata,\n\torientation,\n\tdimensions,\n\toptions,\n\tVerticalChart,\n\tHorizontalChart,\n\trenderer,\n hideLabels\n}) => {\n\t// context can be null in a dashboard, so disable selection\n\tconst context = useContext(WorkspaceContext);\n\tlet selection = context?.state.transient.selection;\n\tlet dispatch = context?.dispatch;\n\n\t// store the chart for use between runs\n\tconst [Chart, setChart] = useState();\n\n\t// store the current direction\n\tconst [currentDirection, setCurrentDirection] = useState('horizontal');\n\n\t// keep track of selection locally so we use a consistent object for d3's sake\n\tconst localSelection = useRef([]);\n\n\t// use history to create links to pages within the chart\n\tconst history = useHistory();\n\n\tconst navigateTo = (link) => {\n\t\thistory.push(link);\n\t};\n\n\t// determine the optimal orientation\n\tconst autoOrientation = useMemo(() => {\n\t\t//return dimensions.height > dimensions.width ? 'horizontal' : 'vertical';\n\t\treturn data.properties.reduce((p, s) => Math.max(p,s.length), 1) > 12 ? 'horizontal' : 'vertical';\n\t}, [data.properties]);\n\n\tconst { TooltipElement, updateTooltip } = useVirtualTooltip(renderer);\n\n\tuseEffect(() => {\n\t\tconst local = orientation === 'auto' ? autoOrientation : orientation;\n\n\t\tconst createChart = () => {\n\t\t\treturn local === 'vertical'\n\t\t\t\t? VerticalChart({\n\t\t\t\t\t\tsvg: svgRef.current,\n\t\t\t\t\t\tupdateTooltip,\n\t\t\t\t\t\tnavigateTo,\n\t\t\t\t\t\tupdateSelection: dispatch ? (selection) => dispatch(updateSelection(selection)) : () => {},\n\t\t\t\t })\n\t\t\t\t: HorizontalChart({\n\t\t\t\t\t\tsvg: svgRef.current,\n\t\t\t\t\t\tupdateTooltip,\n\t\t\t\t\t\tnavigateTo,\n\t\t\t\t\t\tupdateSelection: dispatch ? (selection) => dispatch(updateSelection(selection)) : () => {},\n\t\t\t\t });\n\t\t};\n\n\t\tif (data && dimensions) {\n\t\t\tlet ch = Chart;\n\n\t\t\t// update selection\n\t\t\tif (selection === null) {\n\t\t\t\tlocalSelection.current.length = 0;\n\t\t\t} else {\n\t\t\t\tlocalSelection.current.push(selection);\n\t\t\t}\n\n\t\t\t// the orientation has changed, need to clear out existing svg if we have a chart already\n\t\t\tif (ch && local !== currentDirection) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tch.clear();\n\n\t\t\t\tch = createChart();\n\t\t\t\tsetChart(ch);\n\t\t\t\tsetCurrentDirection(local);\n\t\t\t}\n\n\t\t\t// if we don't have an existing chart, create one\n\t\t\tif (!ch) {\n\t\t\t\tch = createChart();\n\t\t\t\tsetChart(ch);\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tch.update({ data, dimensions, options, selection: localSelection.current, hideLabels });\n\t\t}\n\t}, [\n\t\tChart,\n\t\tHorizontalChart,\n\t\tVerticalChart,\n\t\tautoOrientation,\n\t\tcurrentDirection,\n\t\tdata,\n\t\tdimensions,\n\t\tdispatch,\n\t\toptions,\n\t\torientation,\n\t\tselection,\n\t\tsvgRef,\n\t\tupdateTooltip,\n\t\thideLabels\n\t]);\n\n\treturn { TooltipElement, chartMethods: Chart };\n};\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport { number } from 'prop-types';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { formatDigitLength } from '../../utilities/utils';\n\nexport interface HierarchicalArgs {\n\tlabel: string;\n\tcount: number;\n\treference: number;\n}\n\n/**\n * Renders simple count for the hierarchy based endpoints\n * @param data\n * @returns {JSX.Element}\n * @constructor\n */\nexport function HierarchicalCountRenderer(data: HierarchicalArgs): JSX.Element {\n\tif (!data) return
;\n\n\tconst { label, count, reference } = data;\n\n\treturn (\n\t\t
\n\t\t\t
{label}
\n\t\t\t
{count}
\n\t\t\t{reference && (\n\t\t\t\t
\n\t\t\t\t\tout of {reference}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n}\n\nexport interface SubtitleArgs {\n\ttitle: string;\n\tcount: number;\n\tsubtitle: string;\n}\n\n/**\n * Renders simple count for things with title/subtitle\n * @param data\n * @returns {JSX.Element}\n * @constructor\n */\nexport function SubtitleCountRenderer(data: SubtitleArgs): JSX.Element {\n\tif (!data) return
;\n\n\tconst { title, count, subtitle } = data;\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t{title}\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{subtitle}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{formatDigitLength(count, 3)}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst hierachicalStyle = css`\n\tdisplay: flex;\n\tfont-size: 1.25rem;\n\n\tdiv:first-of-type {\n\t\tmargin-right: 8px;\n\t\tfont-weight: lighter;\n\t}\n\n\tdiv:nth-of-type(2) {\n\t\tfont-weight: normal;\n\t\tmargin-right: 8px;\n\t}\n\n\tdiv:last-of-type {\n\t\tspan:first-of-type {\n\t\t\tfont-weight: lighter;\n\t\t\tmargin-right: 4px;\n\t\t}\n\t}\n`;\n\nconst subtitleStyle = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\tfont-size: 1.25rem;\n\tpointer-events: none;\n\n\t.title {\n\t\tfont-weight: lighter;\n\t}\n\n\t.container {\n\t\tfont-size: 1rem;\n\t\tdisplay: flex;\n\n\t\t.subtitle {\n\t\t\tfont-weight: lighter;\n\t\t\tmargin-right: 12px;\n\t\t}\n\t}\n`;\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { VerticalBarChart } from './vChart';\nimport { HorizontalBarChart } from './hChart';\nimport { useOrientedChart } from 'hooks/useOrientedChart';\nimport { SubtitleCountRenderer } from 'components/virtualTooltip/renderers';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\n/**\n * Renders the bar chart, or stacked bar chart.\n *\n * @param {object} data\n * @param {object} dimensions\n * @param {object} widgetConfiguration\n * @param {object} endpointQuery\n * @param {function} getColor\n * @returns {JSX.Element}\n * @constructor\n */\nexport const StackedBarChartWidget = ({ getColor, data, dimensions, widgetConfiguration, endpointQuery, hideLabels }) => {\n\tconst svgRef = useRef();\n\n\tconst options = useMemo(() => {\n\t\tif (!getColor) return;\n\n\t\tconst o = { ...widgetConfiguration, colorScale: getColor };\n\n\t\t// if we have a label set in the widget configuration use that, else if we are aggregating on a property use that\n\t\tif (!widgetConfiguration?.yAxisLabel && endpointQuery?.options?.parameters?.aggregationProperty) {\n\t\t\to.yAxisLabel = endpointQuery.options.parameters.aggregationProperty;\n\t\t}\n\n\t\treturn o;\n\t}, [getColor, widgetConfiguration, endpointQuery]);\n\n\tconst {dispatch:controlsDispatch, state:controlsState} = useWidgetControlsContext()\n\t// Filter data to match legend controls\n\tconst [filteredData,setFilteredData] = useState(data)\n\tuseEffect(()=>{\n\t\tif(controlsState?.legend) {\n\t\t\tlet filteredLines = {...data.lines}\n\t\t\tObject.entries(controlsState.legend.keyValues).forEach(([key,isEnabled])=>{\n\t\t\t\tif(!isEnabled) filteredLines[key] = []\n\t\t\t})\n\n\t\t\t// Reconstruct data without disabled data\n\t\t\tconst newFilteredData = {\n\t\t\t\t...data,\n\t\t\t\tdata: data.data.map(o => {\n\t\t\t\t\tconst toReturn = {...o};\n\t\t\t\t\tdata.keys.forEach(k => {\n\t\t\t\t\t\tif(!controlsState.legend.keyValues[k] && toReturn.hasOwnProperty(k)) {\n\t\t\t\t\t\t\ttoReturn.value -= toReturn[k];\n\t\t\t\t\t\t\tdelete toReturn[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\treturn toReturn;\n\t\t\t\t}),\n\t\t\t\trolled:data.rolled.filter(\n\t\t\t\t\t(k)=>controlsState.legend.keyValues[k.key]\n\t\t\t\t),\n\n\t\t\t}\n\t\t\tif (newFilteredData.extent[1] <= 0) newFilteredData.extent[1] = 1\n\t\t\tsetFilteredData(newFilteredData)\n\t\t}\n\t\telse {\n\t\t\tif (data.extent[1] <= 0) data.extent[1] = 1\n\t\t\tsetFilteredData(data);\n\t\t}\n\t},[controlsState?.legend,data]);\n\n\n\tconst { TooltipElement, chartMethods } = useOrientedChart({\n\t\tsvgRef,\n\t\tdata: filteredData,\n\t\tdimensions,\n\t\toptions,\n\t\torientation: widgetConfiguration?.direction ?? 'auto',\n\t\thideLabels,\n\t\tVerticalChart: VerticalBarChart,\n\t\tHorizontalChart: HorizontalBarChart,\n\t\trenderer: SubtitleCountRenderer,\n\t});\n\n\t// Keep legend up to date\n\tuseEffect(()=>{\n\t\t//This may not be the best way to determine if the chart is stacked or not??\n\t\tif(data.keys.length !== data.properties.length && chartMethods) {\n\t\t\tcontrolsDispatch({\n\t\t\t\ttype: \"setLegend\",\n\t\t\t\tpayload: {\n\t\t\t\t\tkeys: data.keys,\n\t\t\t\t\tcolorScale: getColor,\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tmouseOver: text => chartMethods?.mouseOver(null,{key:text}),\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tmouseOut: text => chartMethods?.mouseOut(null,{key:text}),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},[data.rolled,getColor,controlsDispatch, chartMethods])\n\n\treturn (\n\t\t
\n\t\t\t{TooltipElement}\n\t\t\t\n\t\t
\n\t);\n};\n\nconst chartStyle = css`\n\t.gridGroup {\n\t\tline,\n\t\tpath {\n\t\t\tstroke: lightgrey;\n\t\t\tstroke-dasharray: 2;\n\t\t}\n\t}\n`;\n","import React, { useCallback, useContext } from 'react';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\nconst identity = x => x;\n\nexport const useWidgetParameter = ({ propertyName, cardIndex, widgetConfiguration, valueFunction = identity }) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\treturn useCallback(\n\t\t(value) => {\n\t\t\tconst newValue = valueFunction(value);\n\n\t\t\tconst configuration = JSON.parse(JSON.stringify(widgetConfiguration));\n\t\t\tif (newValue === null || newValue === 'default' || newValue === 'none') {\n\t\t\t\tdelete configuration[propertyName];\n\t\t\t} else {\n\t\t\t\tconfiguration[propertyName] = newValue;\n\t\t\t}\n\t\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, configuration));\n\t\t},\n\t\t[cardIndex, dispatch, propertyName, widgetConfiguration]\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useMemo } from 'react';\nimport { useWidgetParameter } from 'components/selectors/useWidgetParameter';\nimport { CommonDropdownWithLabel } from 'components/dropdowns/common-dropdown-with-label';\n\nconst valueFunction = (value) => value.value;\n\n/**\n * Allows for the selection of a parameter with the given property name chosen from the given set of values\n *\n * @param cardIndex\n * @param propertyName\n * @param label\n * @param values\n * @param defaultValue\n * @param widgetConfiguration\n * @returns {JSX.Element}\n * @constructor\n */\nexport const WidgetParameterSelector = ({\n\tcardIndex,\n\tpropertyName,\n\tlabel,\n\tvalues,\n\tdefaultValue,\n\twidgetConfiguration,\n\t...rest\n}) => {\n\tconst handleSelectionChange = useWidgetParameter({ propertyName, cardIndex, widgetConfiguration, valueFunction });\n\n\tconst activeItem = useMemo(() => {\n\t\tconst activeName = widgetConfiguration?.[propertyName];\n\t\treturn !(activeName===null||activeName===undefined) ? values.find((item) => item.value === activeName) : defaultValue;\n\t}, [defaultValue, propertyName, values, widgetConfiguration]);\n\n\tconst optionToString = item => item.label;\n\n\treturn (\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useMemo } from 'react';\nimport { PropertyCheckBox } from 'components/dropdowns/propertyCheckBox';\nimport { useWidgetParameter } from 'components/selectors/useWidgetParameter';\n\nconst valueFunction = (value) => !value;\n\n/**\n * Allows for a true/false value with the given property name to be set in the widget configuration\n *\n * @param cardIndex\n * @param widgetConfiguration\n * @param propertyName\n * @param label\n * @returns {JSX.Element}\n * @constructor\n */\nexport const WidgetBooleanSelector = ({ cardIndex, widgetConfiguration, propertyName, label }) => {\n\tconst currentValue = useMemo(() => {\n\t\treturn !!widgetConfiguration?.[propertyName];\n\t}, [propertyName, widgetConfiguration]);\n\n\tconst toggleProperty = useWidgetParameter({ propertyName, cardIndex, widgetConfiguration, valueFunction });\n\n\treturn toggleProperty(currentValue)} checked={currentValue} />;\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useCallback, useContext, useMemo } from 'react';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { SORT_VALUES, SORT_DIRECTIONS } from 'widgets/chartUtils';\nimport { CommonDropdownWithLabel } from 'components/dropdowns/common-dropdown-with-label';\n\n/**\n * Selects a sort option which get set into a list.\n *\n * @param cardIndex\n * @param propertyName\n * @param label\n * @param endpointQuery\n * @param sortIndex\n * @param rest\n * @returns {JSX.Element}\n * @constructor\n */\nexport const EndpointSortListSelector = ({\n\tcardIndex,\n\tendpointQuery,\n\tpropertyName = 'sortList',\n\tlabel = 'Sort By',\n\tsortIndex = 0,\n\t...rest\n}) => {\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\tconst valueMap = useMemo(() => {\n\t\tconst map = [];\n\t\tSORT_VALUES\n\t\t\t.filter(value => value.label !== 'Default')\n\t\t\t.forEach((value) => {\n\t\t\t\t// create a pairing of each value/direction\n\t\t\t\tSORT_DIRECTIONS.forEach((direction) => {\n\t\t\t\t\tconst label = `${value.label} ${direction.label}`;\n\t\t\t\t\tmap.push({\n\t\t\t\t\t\tsort: value.value,\n\t\t\t\t\t\tdirection: direction.value,\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t});\n\t\treturn map;\n\t}, []);\n\n\tconst handleSelectionChange = useCallback(\n\t\t(newVal) => {\n\t\t\tconst configuration = JSON.parse(JSON.stringify(endpointQuery));\n\t\t\tif (newVal === null || newVal?.value === 'default' || newVal?.value === 'none') {\n\t\t\t\tif (sortIndex === 0) {\n\t\t\t\t\tdelete configuration.options.parameters[propertyName];\n\t\t\t\t} else {\n\t\t\t\t\tdelete configuration.options.parameters[propertyName]?.[sortIndex];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!configuration.options.parameters[propertyName]) {\n\t\t\t\t\tconfiguration.options.parameters[propertyName] = [];\n\t\t\t\t}\n\t\t\t\tconfiguration.options.parameters[propertyName][sortIndex] = newVal;\n\t\t\t}\n\t\t\tdispatch(WorkspaceActionCreator.options(cardIndex, configuration));\n\t\t},\n\t\t[cardIndex, dispatch, endpointQuery, propertyName, sortIndex]\n\t);\n\n\tconst activeValue = endpointQuery?.options?.parameters?.[propertyName]?.[sortIndex];\n\tconst activeItem = activeValue ?? valueMap[0];\n\tconst optionToString = (item) => item.label;\n\n\treturn (\n\t\t\n\t);\n};\n","import { StackedBarGraphWrapper } from './wrapper';\nimport { StackedBarGraphKnobs } from './knobs';\nimport { StackedBarChartWidget } from './index';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'STACKED_BAR_GRAPH',\n\tlabel: 'Stacked Bar',\n\ticon: 'full-stacked-chart',\n\twrapper: StackedBarGraphWrapper,\n\twidget: StackedBarChartWidget,\n\tendpoint: propertyHierarchy,\n\tKnobs: StackedBarGraphKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tJoinMethod: 'InnerJoin',\n\t\t\t\t\tmaxRoot: 20,\n\t\t\t\t\tmaxNodes: 1000,\n\t\t\t\t\tmetadata: [filteredProperties[1].name],\n\t\t\t\t\tsortList: [\n\t\t\t\t\t\t{sort: \"count\", direction: \"descending\", label: \"Count Descending\"},\n\t\t\t\t\t\t{sort: \"count\", direction: \"descending\", label: \"Count Descending\"}\n\t\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\t// we default to settings that make sense for a simple bar graph\n\t\treturn {\n\t\t\tshowXAxis: true,\n\t\t\tshowYAxis: true,\n\t\t\tshowTotals: true,\n\t\t\tshowValuesInBarStacks: false,\n\t\t\tcolorScale: DefaultChartColorScales['Single Color'],\n\t\t\tdirection: 'auto',\n\t\t\tshowLegend: false,\n\t\t\tshowBarLabels: false,\n\t\t\tlimitAxisLabels: true,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useEffect, useState } from 'react';\nimport { StackedBarChartWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { convertToStacks, Stacks } from '../chartUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport {NO_DATA_MESSAGE} from '../chartUtils'\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\n/**\n * ChartWrapper for the Stacked Bar Graph.\n *\n * @param getColorScale\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param endpointQuery\n * @returns {*}\n * @constructor\n */\nexport function StackedBarGraphWrapper({ getColorScale, widgetConfiguration, dimensions, data, endpointQuery, noDataMessage=NO_DATA_MESSAGE}) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\tconst {dispatch, state} = useWidgetControlsContext();\n\tconst hideLabels = state?.hideLabels;\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\treturn;\n\t\t}\n\n\n\t\t// empty data is \"valid\"\n\t\tif (!data.entries || data.entries?.length === 0) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\tsetConvertedData({ data: [], properties: [], keys: [], rolled: [], extent: [0, 0] });\n\t\t\treturn;\n\t\t}\n\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: true })\n\n\t\t// data comes in as {key, value, children:[{key1, value}, {key2, value}...]}\n\t\t// need as {label:value, key1: value, key2: value}\n\t\tconst converted = convertToStacks(data);\n\n\t\t// update the color scale and update the data's color property\n\t\t// we need to do 2 things:\n\t\t// a) set the domain for the colorScale\n\t\t// b) set the color property on the individual items\n\t\t// there are a few choices here:\n\t\t// Sequential: uses the index to determine a color\n\t\t// colorByValue: uses the value obviously\n\t\t// colorByProperty: uses the value of a given property in metadata\n\t\t// else we default to using the key\n\t\tconverted.colorPropertyMap = {};\n\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, converted?.keys?.length || 0]);\n\t\t\tconverted.keys.forEach((d, index) => {\n\t\t\t\tconverted.colorPropertyMap[d] = index;\n\t\t\t});\n\t\t} else if (widgetConfiguration?.colorProperty) {\n\t\t\tgetColorScale.domain(converted?.keys);\n\t\t\tconverted.data.forEach((d) => {\n\t\t\t\t//widgetConfiguration.colorProperty is array of keys to get to the property that will be used to determine color.\n\t\t\t\tconverted.colorPropertyMap[d.label] = widgetConfiguration.colorProperty.reduce((p, key) => p[key], d);\n\t\t\t});\n\t\t} else {\n\t\t\tgetColorScale.domain(converted?.keys);\n\t\t\tconverted.keys.forEach((d) => {\n\t\t\t\tconverted.colorPropertyMap[d] = d;\n\t\t\t});\n\t\t}\n\n\t\tsetConvertedData(converted);\n\t}, [data, getColorScale, widgetConfiguration]);\n\n\n\t//If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData?.data?.length > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { ORIENTATION_VALUES, SORT_VALUES, AGGREGATION_METHOD_VALUES } from '../chartUtils';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { WidgetParameterSelector } from 'components/selectors/widgetParameterSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport { EndpointPropertySelector } from 'components/selectors/endpointPropertySelector';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { WidgetBooleanSelector } from 'components/selectors/widgetBooleanSelector';\nimport { EndpointSortListSelector } from 'components/selectors/endpointSortListSelector';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport ColorByValuesSelector from 'components/selectors/colorByValuesSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n * @param cardIndex\n * @param endpointQuery\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport const StackedBarGraphKnobs = ({ cardIndex, endpointQuery, widgetConfiguration }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n\nimport { createContext, ReactNode, useMemo } from 'react';\nimport {\n\taxisBottom,\n\taxisLeft,\n\tmax,\n\tscaleLinear,\n\tScaleLinear,\n\tScaleOrdinal,\n\tscaleOrdinal,\n\tScaleTime,\n\tscaleUtc,\n\tselect,\n\tstackOrderNone,\n\tsum,\n} from 'd3';\nimport { HistogramEndpointMinorBin, HistogramEndpointResponse } from 'srs-middleware';\nimport { StackedHistogramEndpointResponse, StackedHistogramEndpointMinorBin } from '../../widgets/endpoints';\nimport { useRef } from 'react';\nimport { MutableRefObject } from 'react';\nimport { ColorAliases } from 'styles/variables';\nimport { StackOrder } from 'widgets/timeline';\nimport { useEffect } from 'react';\nimport { SMALL_STYLE_WIDTH } from 'components/legendV2';\n\nconst _axisPadding = {\n\ty: 30,\n\tx: 25,\n};\n\nexport type SRSTimeScale = ScaleTime;\n\nexport interface ChartContext {\n\tdataHeight: number;\n\tdataWidth: number;\n\tmargin: { top: number; left: number; bottom: number; right: number };\n\tdata: FormattedChildBin[];\n\tsvgRef: MutableRefObject;\n\tkeys: string[];\n\txScale: SRSTimeScale;\n\tyScale: ScaleLinear;\n\tcolorScale: ScaleOrdinal;\n\tstackOrder?: StackOrder;\n}\n\ninterface TimelineChartProps {\n\tsrsHistogramData: HistogramEndpointResponse | StackedHistogramEndpointResponse;\n\tdimensions: {\n\t\theight: number;\n\t\twidth: number;\n\t};\n\tchildren: ReactNode;\n\tmargin?: {\n\t\ttop?: number;\n\t\tleft?: number;\n\t\tright?: number;\n\t\tbottom?: number;\n\t};\n\tyDomain?: [number, number];\n\tcropEmptyExtents?: boolean;\n\tstacked?: boolean;\n\tcolorScale?: any;\n\tstackOrder?: StackOrder;\n\ttickSpacing?: number;\n\thideLabels?: boolean;\n\txAxisLabel?: string;\n\tyAxisLabel?: string;\n\tlegend?: boolean;\n}\n\nexport const TimelineContext = createContext(null);\n\nexport function TimelineChart({\n\tsrsHistogramData,\n\tdimensions,\n\tchildren,\n\tmargin: marginProp = {},\n\tyDomain: yDomainOverride,\n\tcropEmptyExtents = false,\n\tstacked,\n\tcolorScale,\n\tstackOrder = stackOrderNone,\n\thideLabels,\n\txAxisLabel,\n\tyAxisLabel,\n\tlegend\n}: TimelineChartProps) {\n\tconst { height, width } = dimensions;\n\tconst axisPadding = useMemo(() => {\n\t\tconst axisPadding = {..._axisPadding};\n\t\tif(hideLabels) {\n\t\t\taxisPadding.y = 0;\n\t\t\taxisPadding.x = 0;\n\t\t}\n\t\treturn axisPadding;\n\t}, [hideLabels]);\n\n\tconst { margin, dataWidth, dataHeight } = useMemo(() => {\n\t\tconst defaultMargin = {\n\t\t\ttop: 15,\n\t\t\tleft: 0,\n\t\t\tbottom: 0,\n\t\t\tright: 20,\n\t\t};\n\n\t\tconst margin = { ...defaultMargin, ...marginProp };\n\t\tconst dataWidth = width - axisPadding.y - margin.right;\n\t\tconst dataHeight = height - axisPadding.x - margin.top;\n\n\t\tconst chartDimensions = { margin, dataWidth, dataHeight };\n\n\t\treturn chartDimensions;\n\t}, [height, width, marginProp]);\n\n\t// Create chart container\n\tconst svgRef = useRef(null);\n\n\t// Convert SRS timeline-library data into separate pieces\n\tconst data = useMemo(() => formatSRSTimeline(srsHistogramData, stacked), [srsHistogramData, stacked]);\n\n\t// Scales\n\tconst { xScale, yScale } = useMemo(() => {\n\t\tlet legendOffset = legend ? SMALL_STYLE_WIDTH: 0;\n\t\tconst scales = {\n\t\t\t//Since dataWidth has axisPadding.y subtracted, we need to offset it here since this scale starts at axisPadding.y.\n\t\t\t//Otherwise: \n\t\t\t//vizWidth = dataWidth - axisPadding.y;\n\t\t\t// dataWidth = widgetWidth - axisPadding.y - marginRight\n\t\t\t// SOOOOO we substitute and we get\n\t\t\t//vizWidth = (widgetWidth - axisPadding.y - marginRight) - axisPadding.y\n\t\t\t//vizWidth = widgetWith - 2*axisPadding.y - marginRight. Which is less than what we want\n\t\t\t//So add axisPadding.y to the range and its all right. DataWidth used other places so we can't just edit that\n\t\t\txScale: scaleUtc().domain([]).range([axisPadding.y, dataWidth + axisPadding.y - legendOffset]),\n\t\t\tyScale: scaleLinear()\n\t\t\t\t.domain(yDomainOverride ?? [])\n\t\t\t\t.range([dataHeight, 0]),\n\t\t};\n\n\t\t// Scales\n\t\tif (data.length >= 1) {\n\t\t\tlet first, last;\n\n\t\t\t// X-domain\n\t\t\tif (cropEmptyExtents) {\n\t\t\t\tconst predicate = (d: FormattedChildBin) => sum(Object.values(d.values)) > 0;\n\t\t\t\tfirst = data.find(predicate) ?? data[0];\n\t\t\t\tlast = Array.from(data).reverse().find(predicate) ?? data[data.length - 1];\n\t\t\t} else {\n\t\t\t\tfirst = data[0];\n\t\t\t\tlast = data[data.length - 1];\n\t\t\t}\n\n\t\t\t// Y domain\n\t\t\tconst maxY = max(data, (d) => sum(Object.values(d.values)));\n\n\t\t\tscales.xScale.domain([first.start, last.end]);\n\t\t\tscales.yScale.domain(yDomainOverride ?? [0, maxY === 0 ? 1 : maxY]);\n\t\t}\n\n\t\treturn scales;\n\t}, [axisPadding, data, dataHeight, dataWidth, yDomainOverride, cropEmptyExtents]);\n\n\t// Create chart axis'\n\tuseEffect(() => {\n\t\t// We can be smarter about how many ticks to show, but this will work\n\t\tconst xAxis = axisBottom(xScale).ticks(dataWidth / 150);\n\t\tconst yAxis = axisLeft(yScale).ticks(dataHeight / 50, '~s');\n\n\t\tselect(svgRef.current).selectAll('g.xAxis,g.xAxis-label').remove();\n\t\tif(!hideLabels) {\n\t\t\tselect(svgRef.current)\n\t\t\t\t.append('g')\n\t\t\t\t.classed('xAxis', true)\n\t\t\t\t.attr('transform', `translate(0, ${dataHeight + margin.top})`)\n\t\t\t\t.call(xAxis);\n\t\t\tif(xAxisLabel) {\n\t\t\t\tselect(svgRef.current)\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.classed('xAxis-label', true)\n\t\t\t\t\t.attr('transform', `translate(${axisPadding.y + dataWidth / 2}, ${dataHeight + margin.top + 35})`)\n\t\t\t\t\t.append(\"text\")\n\t\t\t\t\t.text(xAxisLabel);\n\t\t\t}\n\t\t}\n\n\t\tselect(svgRef.current).selectAll('g.yAxis,g.yAxis-label').remove();\n\t\tif(!hideLabels) {\n\t\t\tselect(svgRef.current)\n\t\t\t\t.append('g')\n\t\t\t\t.classed('yAxis', true)\n\t\t\t\t.attr('transform', `translate(${axisPadding.y}, ${margin.top})`)\n\t\t\t\t.call(yAxis);\n\t\t\tif(yAxisLabel) {\n\t\t\t\tselect(svgRef.current)\n\t\t\t\t\t.append('g')\n\t\t\t\t\t.classed('yAxis-label', true)\n\t\t\t\t\t.attr('transform', `rotate(-90) translate(-${dataHeight/2 + axisPadding.y + 5}, 0)`)\n\t\t\t\t\t.append(\"text\")\n\t\t\t\t\t.style(\"text-anchor\", \"middle\")\n\t\t\t\t\t.text(yAxisLabel);\n\t\t\t}\n\t\t}\n\t}, [dataHeight, dataWidth, margin.top, xScale, yScale, hideLabels]);\n\n\tconst chartColorScale = useMemo(\n\t\t() =>\n\t\t\tstacked\n\t\t\t\t? colorScale\n\t\t\t\t: scaleOrdinal().domain(['Count']).range([ColorAliases.PT_INTENT_PRIMARY]),\n\t\t[stacked, colorScale]\n\t);\n\n\tconst keys = useMemo(\n\t\t() => (stacked ? (srsHistogramData as StackedHistogramEndpointResponse).keys : ['Count']),\n\t\t[stacked, srsHistogramData]\n\t);\n\n\tconst chartContext: ChartContext = {\n\t\tdataHeight,\n\t\tdataWidth,\n\t\tmargin,\n\t\tdata,\n\t\tsvgRef,\n\t\tkeys, // This could be changed in the endpoint request so that the data is transformed to match a stacked call\n\t\txScale,\n\t\tyScale,\n\t\tcolorScale: chartColorScale,\n\t\tstackOrder,\n\t};\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n}\n\nexport interface FormattedParentBin {\n\tstart: Date;\n\tend: Date;\n\tlabel: string;\n}\n\nexport interface FormattedChildBin extends FormattedParentBin {\n\tvalues: Record;\n}\n\nexport const formatSRSTimeline = (\n\ttimeline: HistogramEndpointResponse | StackedHistogramEndpointResponse,\n\tstacked = false\n): FormattedChildBin[] => {\n\tconst timelineBins = timeline?.bins;\n\n\tconst rootData = (timelineBins as any[])?.flatMap((bin) => bin.binData) ?? [];\n\n\t/* Is this still neccessary? */\n\tif ((timelineBins as any[])?.filter((bin) => !!bin).length === 0) {\n\t\tconsole.error('!!! SRS deployment out of date. Redeploy SRS to fix binning by YEAR bug!');\n\t}\n\n\tif (stacked) {\n\t\treturn (rootData as StackedHistogramEndpointMinorBin[])\n\t\t\t.filter((data) => !!data)\n\t\t\t.map(({ counts, label, end, start }) => {\n\t\t\t\tconst zeroedValues: [string, number][] = (timeline as StackedHistogramEndpointResponse).keys.map((d) => [\n\t\t\t\t\td,\n\t\t\t\t\tcounts[d] || 0,\n\t\t\t\t]);\n\n\t\t\t\tconst topTenNonZeroValues = zeroedValues\n\t\t\t\t\t.sort((a, b) => b[1] - a[1])\n\t\t\t\t\t.slice(0, 10)\n\t\t\t\t\t.reduce((acc, cur) => {\n\t\t\t\t\t\tif (cur[1] > 0) {\n\t\t\t\t\t\t\tacc.push(cur);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}, []);\n\n\t\t\t\treturn {\n\t\t\t\t\tvalues: Object.fromEntries(topTenNonZeroValues),\n\t\t\t\t\tlabel,\n\t\t\t\t\tend: new Date(end),\n\t\t\t\t\tstart: new Date(start),\n\t\t\t\t};\n\t\t\t});\n\t} else {\n\t\treturn (rootData as HistogramEndpointMinorBin[])\n\t\t\t.filter((data) => !!data)\n\t\t\t.map(({ count, label, end, start }) => ({\n\t\t\t\tvalues: { Count: count },\n\t\t\t\tlabel,\n\t\t\t\tend: new Date(end),\n\t\t\t\tstart: new Date(start),\n\t\t\t}));\n\t}\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n\nimport React, { memo, SVGProps, useCallback, useContext, useEffect } from 'react';\nimport { FormattedChildBin, TimelineContext } from './timeline';\nimport { easeBounceOut, scaleLog, select, Series, stack, transition } from 'd3';\nimport { Colors } from '@blueprintjs/core';\n\nconst _Bars: React.FC = ({ activeData = [] }) => {\n\tconst {\n\t\tmargin,\n\t\tdata: rootData,\n\t\tdataHeight,\n\t\txScale,\n\t\tyScale,\n\t\tsvgRef,\n\t\tkeys,\n\t\tcolorScale,\n\t\tstackOrder,\n\t} = useContext(TimelineContext);\n\n\tconst createBars = useCallback(\n\t\t(seriesName, series: Series[], colors) => {\n\t\t\t// Create a g element for each series (category)\n\t\t\tconst category = select(svgRef.current)\n\t\t\t\t.select(`g.series-${seriesName}`)\n\t\t\t\t.selectAll('g.series')\n\t\t\t\t.data(series)\n\t\t\t\t.join('g')\n\t\t\t\t.classed('series', true)\n\t\t\t\t.style('fill', colors)\n\t\t\t\t.attr('height', dataHeight);\n\n\t\t\t// Create bars in each series (category) with the data for that category\n\t\t\t// Start y at bottom of graph and height to 0 for transitions\n\t\t\tconst widthScale = scaleLog()\n\t\t\t\t.domain([5 / 0.75, 100])\n\t\t\t\t.range([0.75, 0.99])\n\t\t\t\t.clamp(true);\n\n\t\t\tlet bars = category\n\t\t\t\t.selectAll('rect')\n\t\t\t\t.data((d: Series) => d)\n\t\t\t\t.join('rect')\n\t\t\t\t/* removed until transitions are fixed\n\t\t.attr('y', (d) => yScale(d[0]) || 0)\n\t\t.attr('height', 0) \n\t\t*/\n\t\t\t\t.attr('y', (d) => {\n\t\t\t\t\treturn yScale(d[1]) > 0 ? yScale(d[1]) : 0;\n\t\t\t\t})\n\t\t\t\t.attr('height', (d) => {\n\t\t\t\t\tlet height = yScale(d[0]) - yScale(d[1]);\n\t\t\t\t\treturn height && height > 0 ? height : 0;\n\t\t\t\t})\n\t\t\t\t.attr('x', (d) => xScale(d.data.start))\n\t\t\t\t// Shrink the width by logarithmically to give a reasonable bar width and gap\n\t\t\t\t.attr('width', (d) => {\n\t\t\t\t\tconst width = xScale(d.data.end) - xScale(d.data.start);\n\t\t\t\t\treturn width * widthScale(width);\n\t\t\t\t});\n\n\t\t\t// Add some bar bounce -- Will add this later\n\t\t\t//const trns = transition().duration(1000).delay(200).ease(easeBounceOut);\n\t\t\t//bars.transition(trns);\n\n\t\t\treturn bars;\n\t\t\t/* removed until transistions fixed\n\t\t\t\t.attr('y', (d) => {\n\t\t\t\t\treturn yScale(d[1]) > 0 ? yScale(d[1]) : 0;\n\t\t\t\t})\n\t\t\t\t.attr('height', (d) => {\n\t\t\t\t\tlet height = yScale(d[0]) - yScale(d[1]);\n\t\t\t\t\treturn height && height > 0 ? height : 0;\n\t\t\t\t}); */\n\t\t},\n\t\t[svgRef, xScale, yScale, dataHeight]\n\t);\n\n\tconst getColor = useCallback((d: Series) => colorScale(d.key), [colorScale]);\n\n\t/* Data Data */\n\tuseEffect(() => {\n\t\t// Stole this from StackedBarChart widget\n\t\t// The stack call produces a dense matrix of values (n rows by m colums)\n\t\t// in the case where there are many unique values amongst the rows this\n\t\t// is extremely poorly performing for no real reason. So we filter out invalid\n\t\t// values and move on.\n\t\tconst stackGen = stack()\n\t\t\t.keys(keys)\n\t\t\t.value((obj, key) => obj.values[key])\n\t\t\t.order(stackOrder);\n\n\t\tconst rootStackedSeries = stackGen(rootData);\n\t\tconst filteredRoot = filterStack(rootStackedSeries);\n\t\tcreateBars('root', filteredRoot, activeData?.length ? Colors.GRAY5 : getColor);\n\n\t\tconst activeStackedSeries = stackGen(activeData);\n\t\tconst filteredActive = filterStack(activeStackedSeries);\n\t\tcreateBars('active', filteredActive, getColor);\n\t}, [activeData, createBars, getColor, keys, rootData, stackOrder]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst filterStack = (stack) =>\n\tstack.map((bar) => {\n\t\tconst retVal = bar.filter((segment) => {\n\t\t\treturn !isNaN(segment[1]);\n\t\t});\n\t\tretVal.key = bar.key;\n\t\tretVal.index = bar.index;\n\t\treturn retVal;\n\t});\n\nexport const Bars = memo(_Bars, (prevProps, nextProps) => {\n\treturn prevProps.activeData === nextProps.activeData;\n});\n\ninterface IProps extends SVGProps {\n\tactiveData?: FormattedChildBin[];\n}\n","import { useTooltip } from 'components/chartTooltip/useTooltip';\nimport d3 from \"d3\";\nimport { useCallback, FunctionComponent, useEffect } from 'react';\n\n\n/**\n * A d3 function that selects the items to add tooltips to\n */\ntype ItemSelector = () => d3.Selection\n/**\n * A React functional component that creates a tooltip from \n * the data attached to a given selected item\n */\ntype ToolTipMaker = FunctionComponent\n\n/**\n * A function for adding react based tooltips to a d3 svg\n */\nexport default function useReactTooltipsOnD3(\n itemSelector:ItemSelector,\n toolTipMaker:ToolTipMaker,\n toolTipOptions?\n ):JSX.Element {\n const [toolTip, setupTrigger] = useTooltip(toolTipOptions);\n const getMouseEvents = useCallback(\n (d:Datum) => {\n return setupTrigger(toolTipMaker(d))\n },[setupTrigger,toolTipMaker]\n\t);\n useEffect(()=>{\n if(itemSelector) itemSelector()\n .on('mouseover', (e, d) => getMouseEvents(d).onMouseOver(e))\n .on('mouseout', (_, d) => getMouseEvents(d).onMouseOut());\n },[getMouseEvents,itemSelector])\n\n return toolTip\n}","import ChartTooltip from 'components/chartTooltip';\nimport { scaleLog, select, sum } from 'd3';\nimport { formatDistance } from 'date-fns';\nimport useReactTooltipsOnD3 from 'hooks/useReactTooltipsOnD3';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { FormattedChildBin, TimelineContext } from 'utilities/srs-timeline-library/timeline';\n\nexport const TimelineTooltips: React.FC<{units?:string}> = ({units}) => {\n\tconst { xScale, dataHeight, margin, yScale, data, svgRef, dataWidth } = useContext(TimelineContext);\n\n\tconst toolTipOptions = {\n\t\tplacement: 'top',\n\t\t modifiers: [\n\t\t\t{\n\t\t\t\tname: 'offset',\n\t\t\t\toptions: {\n\t\t\t\t\toffset: [0, 3],\n\t\t\t\t},\n\t\t\t},\n\t\t], \n\t} \n\t\n\tconst toolTipMaker = ({start, end, label, values}:FormattedChildBin) => {\n\t\tconst dateFormatter = 'MM/DD/YYYY';\n\t\tif(units) {\n\t\t\tvalues = {...values}\n\t\t\tconst count = values.Count\n\t\t\tdelete values.Count\n\t\t\tvalues[units] = count\n\t\t}\n\t\t\n\t\treturn \n\t\t\n\t}\n\n\tconst [itemSelector,setItemSelector] = useState<()=>\n\t\td3.Selection>()\n\tuseEffect(() => {\n\t\tsetItemSelector(()=> ()=>{ // setItemSelector calls this function once so I needed to wrap in a second function\n\t\t\treturn select(svgRef.current)\n\t\t\t\t.select('#timeline-tooltips')\n\t\t\t\t.selectAll('rect')\n\t\t\t\t.data(data)\n\t\t\t\t.join('rect')\n\t\t\t\t.style('stroke', 'transparent')\n\t\t\t\t.style('fill', 'transparent')\n\t\t\t\t.attr('x', (d) => xScale(d.start))\n\t\t\t\t.attr('y', (d) => yScale(sum(Object.values(d.values))) || 0)\n\t\t\t\t.attr('height', (d) => {\n\t\t\t\t\tconst height = dataHeight - yScale(sum(Object.values(d.values)));\n\t\t\t\t\treturn height && height > 0 ? height : 0;\n\t\t\t\t})\n\t\t\t\t// Shrink the width by logarithmically to give a reasonable bar width and gap\n\t\t\t\t.attr('width', (d) => {\n\t\t\t\t\tconst width = xScale(d.end) - xScale(d.start);\n\t\t\t\t\treturn width * scaleLog().domain([5 / .75, 100]).range([0.75, 0.99]).clamp(true)(width);\n\t\t\t\t})\n\t\t\t\t.attr('cy-test', 'timeline-data-rect')\n\t\t})\n\t},[svgRef, data, xScale, yScale, dataHeight])\n\n\tconst toolTip = useReactTooltipsOnD3(\n\t\titemSelector,\n\t\ttoolTipMaker,\n\t\ttoolTipOptions\n\t)\n\n\treturn (\n\t\t\n\t\t\t{toolTip}\n\t\t\t\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\n\nimport { ColorAliases } from 'styles/variables';\nimport { TimelineChart } from 'utilities/srs-timeline-library/timeline';\nimport { Bars } from 'utilities/srs-timeline-library/bar';\nimport { HistogramEndpointResponse } from 'srs-middleware';\nimport { isStacked, StackedHistogramEndpointResponse } from 'widgets/endpoints';\nimport { Dimensions } from 'interfaces';\nimport { Series } from 'd3';\nimport React, { useEffect, useState } from 'react';\nimport { TimelineTooltips } from './timelineTooltips';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\nexport const Timeline: React.FC = ({\n\tdimensions,\n\tdata,\n\tstacked,\n\tgetColorScale,\n\tstackOrder,\n\tcropEmptyExtents,\n\tunits,\n\thideLabels,\n xAxisLabel,\n\tyAxisLabel\n}) => {\n\tconst {dispatch:controlsDispatch,state:controlsState} = useWidgetControlsContext()\n\t// Keep legend up to date\n\tuseEffect(()=>{\n\t\tif(stacked && controlsDispatch) {\n\t\t\tcontrolsDispatch({\n\t\t\t\ttype:\"setLegend\",\n\t\t\t\tpayload: {\n\t\t\t\t\tkeys:(data as StackedHistogramEndpointResponse).keys,\n\t\t\t\t\tcolorScale:getColorScale,\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},[data,getColorScale,controlsDispatch,stacked])\n\n\t// Filter data based on legend\n\tconst [filteredData, setFilteredData] = useState(data)\n\tuseEffect(()=>{\n\t\tif(isStacked(data) && controlsState?.legend){\n\t\t\t// Reconstruct data without disabled data\n\t\t\tconst newFilteredData = {\n\t\t\t\t...data,\n\t\t\t\tkeys:data.keys.filter((k)=>controlsState.legend.keyValues[k])\n\t\t\t}\n\t\t\tsetFilteredData(newFilteredData)\n\t\t}\n\t},[controlsState,data])\n\t\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\ninterface TimelineProps {\n\tdata: HistogramEndpointResponse | StackedHistogramEndpointResponse;\n\tdimensions: Dimensions;\n\tstacked?: boolean;\n\tgetColorScale?: any;\n\tstackOrder?: StackOrder;\n\tcropEmptyExtents?: boolean;\n\tunits?: string;\n\thideLabels?: boolean;\n\txAxisLabel?: string;\n\tyAxisLabel?: string;\n}\n\nexport type StackOrder = (stack: Series) => Iterable;\n\nconst styles = {\n\twrapper: css`\n\t\t//background-image: radial-gradient(circle, ${ColorAliases.PT_DIVIDER_BLACK} 1px, transparent 1px);\n\t\t//background-size: 5px 50px; // TODO: shouldn't these be spaced relative to the labels?\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t`,\n\tlabels: css`\n\t\tfont-family: LibreFranklin, sans-serif;\n\t\tfont-size: 12px;\n\t\tfill: ${ColorAliases.PT_TEXT_COLOR_MUTED};\n\t\tdominant-baseline: hanging;\n\t`,\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { Timeline } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\nimport { sum } from 'd3-array';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\n/**\n * ChartWrapper for the Timeline Graph.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @returns {*}\n * @constructor\n */\nexport function TimelineGraphWrapper({\n\tdimensions,\n\tdata,\n\tnoDataMessage = NO_DATA_MESSAGE,\n\twidgetConfiguration = { stacked: false, cropEmptyExtents: false, xAxisLabel: \"\", yAxisLabel: \"\" },\n\tgetColorScale,\n}) {\n\tconst stacked = !!widgetConfiguration?.stacked;\n\tconst {dispatch, state} = useWidgetControlsContext();\n\tconst hideLabels = state?.hideLabels;\n\tconst convertedData = useMemo(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data.bins))\n\t\t\treturn;\n\n\t\t// empty data is \"valid\"\n\t\tif (data.bins?.length === 0)\n\t\t\treturn [];\n\n\t\t// If there is no data, return nothing so that the\n\t\t// no data display will show\n\t\tlet totalCount = 0;\n\t\tfor (const bin in data.bins) {\n\t\t\tfor (const binData in data.bins[bin]['binData']) {\n\t\t\t\ttotalCount += stacked\n\t\t\t\t\t? sum(Object.values(data.bins[bin]['binData'][binData].counts))\n\t\t\t\t\t: data.bins[bin]['binData'][binData].count;\n\t\t\t}\n\t\t}\n\t\tif (totalCount === 0) return;\n\n\t\tif (stacked) {\n\t\t\tgetColorScale.domain(data.keys);\n\t\t}\n\t\treturn data;\n\t}, [data, stacked, getColorScale]);\n\n\t//has to be in a 'useEffect' as opposed to the useMemo above bc of the way react is.\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data.bins) || data.bins?.length === 0) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\treturn;\n\t\t}\n\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: true });\n\n\t}, [data]);\n\n\t//If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const TimelineGraphKnobs = ({ cardIndex, endpointQuery }) => {\n return (\n \n \n \n \n } />\n \n );\n};\n","import { TimelineGraphWrapper } from './wrapper';\nimport { TimelineGraphKnobs } from './knobs';\nimport { timeline, stackedTimeline } from 'widgets/endpoints';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst types = [SrsPropertyType.Temporal];\n\nexport const config = {\n\tkey: 'TIMELINE',\n\tlabel: 'Timeline',\n\ticon: 'timeline-area-chart',\n\twrapper: TimelineGraphWrapper,\n\tendpoint: timeline,\n\tKnobs: TimelineGraphKnobs,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxBinResolution: 'Day',\n\t\t\t\t\tmaxMajorBinCount: 1,\n\t\t\t\t\tmaxMinorBinCount: 32,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tstacked: false,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, [], types).length >= 1;\n\t},\n};\n\nexport const stackedConfig = {\n\tkey: 'STACKED_TIMELINE',\n\tlabel: 'Stacked Timeline',\n\ticon: 'timeline-area-chart',\n\twrapper: TimelineGraphWrapper,\n\tendpoint: stackedTimeline,\n\tKnobs: TimelineGraphKnobs,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties.find((property) => property.type === SrsPropertyType.Temporal).name],\n\t\t\t\tparameters: {\n\t\t\t\t\tstackProperty: [\n\t\t\t\t\t\tfilteredProperties.find(\n\t\t\t\t\t\t\t(property) =>\n\t\t\t\t\t\t\t\t(property.flags.includes('Ordinal') || property.flags.includes(SrsPropertyFlag.Categorical)) &&\n\t\t\t\t\t\t\t\t!property.flags.includes(SrsPropertyFlag.Multivalued)\n\t\t\t\t\t\t).name,\n\t\t\t\t\t],\n\t\t\t\t\tmaxBinResolution: 'Day',\n\t\t\t\t\tmaxMajorBinCount: 1,\n\t\t\t\t\tmaxMinorBinCount: 32,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t\tstacked: true,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, [], types).length >= 1;\n\t},\n};\n","import * as d3 from 'd3';\nimport { isValid, makeAbsoluteContext, determinePositionForAngle } from '../chartUtils';\nimport { readableColor } from 'polished';\nimport { intersectsAny } from 'utilities/utils';\n\nconst TEXT_SIZE = 10;\n\n/**\n * @param svg\n * @param updateTooltip\n * @returns {{clear: clear, update: externalUpdate}}\n * @constructor\n */\nexport const PolarAreaChart = ({ container: svg, updateTooltip }) => {\n\tlet initialized = false;\n\n\t// define x -> around the circle\n\tconst xScale = d3\n\t\t.scaleBand()\n\t\t.range([0, 2 * Math.PI])\n\t\t.align(0);\n\n\t// define y -> out from the center\n\tconst yScale = d3.scaleRadial();\n\n\t// define the arc renderer\n\tconst arc = d3\n\t\t.arc()\n\t\t.innerRadius((d) => yScale(d[0]))\n\t\t.outerRadius((d) => yScale(d[1]))\n\t\t.startAngle((d) => xScale(d.data.label))\n\t\t.endAngle((d) => xScale(d.data.label) + xScale.bandwidth())\n\t\t.padAngle(0.01);\n\n\t// define the arc renderer\n\tconst fullArc = d3\n\t\t.arc()\n\t\t.startAngle((d) => xScale(d))\n\t\t.endAngle((d) => xScale(d) + xScale.bandwidth())\n\t\t.padAngle(0.01);\n\n\t// define the arc renderer\n\tconst labelArc = d3\n\t\t.arc()\n\t\t.startAngle((d) => xScale(d))\n\t\t.endAngle((d) => xScale(d) + xScale.bandwidth())\n\t\t.padAngle(0.01);\n\n\t// define the arc renderer\n\tconst tooltipArc = d3\n\t\t.arc()\n\t\t.startAngle((d) => xScale(d))\n\t\t.endAngle((d) => xScale(d) + xScale.bandwidth())\n\t\t.padAngle(0.01);\n\n\t// manage the initialization of the chart, should only be called once\n\tfunction init() {\n\t\td3.select(svg).style('width', '100%').style('height', 'auto');\n\n\t\td3.select(svg).append('g').classed('back', true);\n\t}\n\n\tfunction update({ data, properties, keys, extent, colorPropertyMap }, { height, width }, { colorScale }) {\n\t\tconst outerRadiusMax = Math.floor(Math.min(width, height)) / 2 - 4 * TEXT_SIZE;\n\t\tconst innerRadiusMin = Math.min(50, Math.floor(outerRadiusMax / 3));\n\n\t\txScale.domain(properties);\n\t\tyScale.domain([0, extent[1]]).range([innerRadiusMin, outerRadiusMax]);\n\n\t\tarc\n\t\t\t.padRadius(innerRadiusMin)\n\t\t\t.innerRadius((d) => yScale(d[0]))\n\t\t\t.outerRadius((d) => yScale(d[1]))\n\t\t\t.startAngle((d) => xScale(d.data.label))\n\t\t\t.endAngle((d) => xScale(d.data.label) + xScale.bandwidth());\n\t\tfullArc\n\t\t\t.padRadius(innerRadiusMin)\n\t\t\t.innerRadius(() => yScale(0))\n\t\t\t.outerRadius(() => yScale(extent[1]))\n\t\t\t.startAngle((d) => xScale(d))\n\t\t\t.endAngle((d) => xScale(d) + xScale.bandwidth());\n\t\tlabelArc\n\t\t\t.padRadius(innerRadiusMin)\n\t\t\t.innerRadius(() => yScale(extent[1]))\n\t\t\t.outerRadius(() => yScale(extent[1]))\n\t\t\t.startAngle((d) => xScale(d))\n\t\t\t.endAngle((d) => xScale(d) + xScale.bandwidth());\n\t\ttooltipArc\n\t\t\t.padRadius(innerRadiusMin)\n\t\t\t.innerRadius((d) => yScale(d[1]))\n\t\t\t.outerRadius((d) => yScale(d[1]))\n\t\t\t.startAngle((d) => xScale(d.data.label))\n\t\t\t.endAngle((d) => xScale(d.data.label) + xScale.bandwidth());\n\n\t\t// greyed out backgrounds arc to help with scale\n\t\td3.select(svg)\n\t\t\t.select('.back')\n\t\t\t.selectAll('g.full')\n\t\t\t.data(properties, (d) => d)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst g = enter.append('g').classed('full', true);\n\n\t\t\t\t\tg.append('path').attr('d', fullArc).attr('fill', 'lightgrey').attr('opacity', 0.3);\n\n\t\t\t\t\tg.append('text')\n\t\t\t\t\t\t.style('text-anchor', (d) => (xScale(d) < Math.PI ? 'start' : 'end'))\n\t\t\t\t\t\t.style('alignment-baseline', (d) => {\n\t\t\t\t\t\t\tlet midAngle = xScale(d);\n\t\t\t\t\t\t\treturn midAngle > Math.PI / 2 && midAngle <= (3 * Math.PI) / 2 ? 'hanging' : 'ideographic';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('transform', (d) => {\n\t\t\t\t\t\t\tlet coordinates = labelArc.centroid(d);\n\t\t\t\t\t\t\t// add spacing between the text labels\n\t\t\t\t\t\t\tcoordinates[0] += coordinates[0] > 0 ? 10 : -10;\n\t\t\t\t\t\t\tcoordinates[1] += coordinates[1] > 0 ? 10 : -10;\n\t\t\t\t\t\t\treturn 'translate(' + coordinates + ')';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'polar-data-arc-label')\n\t\t\t\t\t\t.text((d) => d);\n\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate.selectAll('path').attr('d', (d) => fullArc(d));\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('text')\n\t\t\t\t\t\t.style('text-anchor', (d) => (xScale(d) < Math.PI ? 'start' : 'end'))\n\t\t\t\t\t\t.style('alignment-baseline', (d) => {\n\t\t\t\t\t\t\tlet midAngle = xScale(d);\n\t\t\t\t\t\t\treturn midAngle > Math.PI / 2 && midAngle <= (3 * Math.PI) / 2 ? 'hanging' : 'ideographic';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('transform', (d) => {\n\t\t\t\t\t\t\tlet coordinates = labelArc.centroid(d);\n\t\t\t\t\t\t\t// add spacing between the text labels and graph\n\t\t\t\t\t\t\tcoordinates[0] += coordinates[0] > 0 ? 10 : -10;\n\t\t\t\t\t\t\tcoordinates[1] += coordinates[1] > 0 ? 10 : -10;\n\t\t\t\t\t\t\treturn 'translate(' + coordinates + ')';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.text((d) => d);\n\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\tconst labelPositionList = [];\n\t\td3.select(svg)\n\t\t\t.select('.back')\n\t\t\t.selectAll('g.full text')\n\t\t\t.attr('font-size', TEXT_SIZE)\n\t\t\t.each(function (d) {\n\t\t\t\tvar pos = labelArc.centroid(d);\n\n\t\t\t\tvar self = d3.select(this);\n\t\t\t\tconst bbox = self.node().getBBox();\n\n\t\t\t\tconst rectangle = { height: bbox.height, width: bbox.width, x: pos[0], y: pos[1] };\n\n\t\t\t\tif (intersectsAny(rectangle, labelPositionList)) {\n\t\t\t\t\td3.select(this).attr('hidden', true);\n\t\t\t\t} else {\n\t\t\t\t\tlabelPositionList.push(rectangle);\n\t\t\t\t}\n\t\t\t});\n\n\t\t// primary bands\n\t\td3.select(svg)\n\t\t\t.selectAll('g.band')\n\t\t\t.data(d3.stack().keys(keys)(data), (d) => d)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('g').classed('band', true).attr('opacity', 1).attr('cy-test', 'polar-data-band'),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t)\n\t\t\t.selectAll('g.arc')\n\t\t\t.data((d) => d)\n\t\t\t.join(\n\t\t\t\t(enter) => {\n\t\t\t\t\tconst g = enter.append('g').classed('arc', true).attr('cy-test', 'polar-data-arc');\n\n\t\t\t\t\tg.append('path')\n\t\t\t\t\t\t.attr('d', arc)\n\t\t\t\t\t\t.attr('opacity', 1.0)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst group = this.parentNode.parentNode;\n\t\t\t\t\t\t\tconst parentKey = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[parentKey]);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'polar-data-path')\n\t\t\t\t\t\t.on('mouseover', function (event, d) {\n\t\t\t\t\t\t\td3.select(svg).selectAll('.arc path').transition().duration(150).attr('opacity', 0.5);\n\n\t\t\t\t\t\t\td3.select(this).transition().duration(150).attr('opacity', 1.0);\n\n\t\t\t\t\t\t\t// clear the tooltip first just in case\n\t\t\t\t\t\t\t// if we move from arc to arc is wasn't resetting in between\n\t\t\t\t\t\t\tupdateTooltip(null, null, null);\n\n\t\t\t\t\t\t\thandleTooltip(event, d, updateTooltip, tooltipArc, xScale, svg, this.parentNode);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\t\t\td3.select(svg).selectAll('.arc path').transition().duration(150).attr('opacity', 1.0);\n\t\t\t\t\t\t\tupdateTooltip(null, null, null);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t// label of count internal to the arcs\n\t\t\t\t\tg.append('text')\n\t\t\t\t\t\t.attr('font-size', TEXT_SIZE)\n\t\t\t\t\t\t.attr('pointer-events', 'none')\n\t\t\t\t\t\t.style('text-anchor', 'middle')\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst arc = this.parentNode;\n\t\t\t\t\t\t\tconst group = arc.parentNode;\n\t\t\t\t\t\t\tconst color = colorScale(colorPropertyMap[d3.select(group).datum().key]);\n\t\t\t\t\t\t\treturn color ? readableColor(color) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.style('dominant-baseline', 'middle')\n\t\t\t\t\t\t.attr('transform', (d) => (isValid(arc.centroid(d)) ? `translate(${arc.centroid(d)})` : null))\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst arc = this.parentNode;\n\t\t\t\t\t\t\tconst group = arc.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn d.data[key];\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tconst deltaY = yScale(d[1]) - yScale(d[0]);\n\t\t\t\t\t\t\tconst textBox = d3.select(this).node().getBBox();\n\t\t\t\t\t\t\treturn deltaY > textBox.width && deltaY > textBox.height ? 1 : 0;\n\t\t\t\t\t\t});\n\n\t\t\t\t\treturn g;\n\t\t\t\t},\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('path')\n\t\t\t\t\t\t.attr('d', arc)\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst group = this.parentNode.parentNode;\n\t\t\t\t\t\t\tconst parentKey = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn colorScale(colorPropertyMap[parentKey]);\n\t\t\t\t\t\t});\n\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.select('text')\n\t\t\t\t\t\t.attr('fill', function () {\n\t\t\t\t\t\t\tconst arc = this.parentNode;\n\t\t\t\t\t\t\tconst group = arc.parentNode;\n\t\t\t\t\t\t\tconst color = colorScale(colorPropertyMap[d3.select(group).datum().key]);\n\t\t\t\t\t\t\treturn color ? readableColor(color) : 'black';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('transform', (d) => (isValid(arc.centroid(d)) ? `translate(${arc.centroid(d)})` : null))\n\t\t\t\t\t\t.text(function (d) {\n\t\t\t\t\t\t\tconst arc = this.parentNode;\n\t\t\t\t\t\t\tconst group = arc.parentNode;\n\t\t\t\t\t\t\tconst key = d3.select(group).datum().key;\n\t\t\t\t\t\t\treturn d.data[key];\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('opacity', function (d) {\n\t\t\t\t\t\t\tconst deltaY = yScale(d[1]) - yScale(d[0]);\n\t\t\t\t\t\t\tconst textBox = d3.select(this).node().getBBox();\n\t\t\t\t\t\t\treturn deltaY > textBox.width && deltaY > textBox.height ? 1 : 0;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('cy-test', 'polar-data-arc-value');\n\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\t}\n\n\tfunction mouseOver(event, item) {\n\t\td3.select(svg)\n\t\t\t.selectAll('g.band')\n\t\t\t.transition()\n\t\t\t.duration(250)\n\t\t\t.attr('opacity', function () {\n\t\t\t\tconst current = d3.select(this).datum().key;\n\t\t\t\treturn current === item.key ? 1.0 : 0.5;\n\t\t\t});\n\t}\n\n\tfunction mouseOut() {\n\t\td3.select(svg).selectAll('g.band').transition().duration(250).attr('opacity', 1.0);\n\t}\n\n\tfunction externalUpdate({ data, dimensions, options }) {\n\t\tif (!initialized) {\n\t\t\tinit(data, dimensions);\n\t\t\tinitialized = true;\n\t\t}\n\n\t\t// bring back hidden labels before checking for overlap\n\t\td3.select(svg).select('.back').selectAll('g.full text').attr('hidden', null);\n\n\t\tupdate(data, dimensions, options);\n\t}\n\n\tfunction clear() {\n\t\td3.select(svg).selectAll('g').remove();\n\t}\n\n\treturn {\n\t\tupdate: externalUpdate,\n\t\tclear: clear,\n\t\tmouseOver: mouseOver,\n\t\tmouseOut: mouseOut,\n\t};\n};\n\nfunction handleTooltip(event, d, updateTooltip, tooltipArc, xScale, svg, _arc) {\n\tconst group = _arc.parentNode;\n\tconst parentKey = d3.select(group).datum().key;\n\tconst centroid = tooltipArc.centroid(d);\n\n\tconst angle = (2 * xScale(d.data.label) + xScale.bandwidth()) / 2;\n\tconst position = determinePositionForAngle(angle);\n\n\t// since the parent group has a translate, we need to transform to global\n\tconst transform = makeAbsoluteContext(d3.select(_arc).node(), d3.select(svg).node().parentNode);\n\n\tconst transformed = transform(centroid[0], centroid[1]);\n\n\tconst data = {\n\t\ttitle: d.data.label,\n\t\tsubtitle: parentKey,\n\t\tcount: d.data[parentKey],\n\t};\n\n\tupdateTooltip(\n\t\tdata,\n\t\t{\n\t\t\tx: transformed.x,\n\t\t\ty: transformed.y - 15,\n\t\t},\n\t\t{ position: position }\n\t);\n}\n","// eslint-disable-next-line no-unused-vars\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useVirtualTooltip } from 'components/virtualTooltip/useVirtualTooltip';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\nconst { updateSelection } = WorkspaceActionCreator;\n\ninterface IArgs {\n\tsvgRef: React.MutableRefObject;\n\tcontainerRef: React.MutableRefObject;\n\tdata: any;\n\tdimensions: { height: number; width: number };\n\toptions: any;\n\tChart;\n\trenderer;\n\tsupportSelection?: boolean;\n}\n\nexport interface IReturnVal {\n\tTooltipElement: JSX.Element;\n\tchartMethods: ChartReturn;\n}\n\ninterface IUpdateArgs {\n\tdata: any;\n\tdimensions: { height: number; width: number };\n\toptions: any;\n\tselection: any;\n}\n\ninterface ChartReturn {\n\tupdate: (args: IUpdateArgs) => void;\n\tclear: () => void;\n}\n\n/**\n * @param svgRef\n * @param containerRef\n * @param data\n * @param dimensions\n * @param options\n * @param Chart\n * @param renderer\n * @param supportSelection\n */\nexport function useChart({\n\tsvgRef,\n\tcontainerRef,\n\tdata,\n\tdimensions,\n\toptions,\n\tChart,\n\trenderer,\n\tsupportSelection = false,\n}: IArgs): IReturnVal {\n\t// context can be null in a dashboard, so disable selection\n\tconst context = useContext(WorkspaceContext);\n\tlet selection = context?.state.transient.selection;\n\tlet dispatch = context?.dispatch;\n\n\t// store the chart for use between runs\n\tconst [localChart, setLocalChart] = useState();\n\n\t// keep track of selection locally so we use a consistent object for d3's sake\n\tconst selectionRef = useRef([]);\n\n\t// manage the selection\n\tconst localSelection = useMemo(() => {\n\t\t// update selection\n\t\tif (supportSelection) {\n\t\t\tif (selection === null) {\n\t\t\t\tselectionRef.current.length = 0;\n\t\t\t} else {\n\t\t\t\tselectionRef.current.push(selection);\n\t\t\t}\n\t\t}\n\n\t\treturn selectionRef.current;\n\t}, [selection, supportSelection]);\n\n\t// create the tooltip element and the function to update the tooltip\n\tconst { TooltipElement, updateTooltip } = useVirtualTooltip(renderer);\n\n\tuseEffect(() => {\n\t\tif (data && dimensions) {\n\t\t\tlet ch = localChart;\n\n\t\t\t// if we don't have an existing chart, create one\n\t\t\tif (!ch) {\n\t\t\t\tch = Chart({\n\t\t\t\t\tsvg: svgRef.current,\n\t\t\t\t\tcontainer: containerRef?.current,\n\t\t\t\t\tupdateTooltip,\n\t\t\t\t\tupdateSelection: dispatch ? (selection) => dispatch(updateSelection(selection)) : () => {},\n\t\t\t\t});\n\t\t\t\tsetLocalChart(ch);\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tch.update({ data, dimensions, options, selection: localSelection });\n\t\t}\n\t}, [\n\t\tChart,\n\t\tdata,\n\t\tdimensions,\n\t\tlocalChart,\n\t\toptions,\n\t\tupdateTooltip,\n\t\tsvgRef,\n\t\tcontainerRef,\n\t\trenderer,\n\t\tselection,\n\t\tdispatch,\n\t\tlocalSelection,\n\t\tsupportSelection,\n\t]);\n\n\treturn { TooltipElement, chartMethods: localChart };\n}\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useMemo, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { PolarAreaChart } from './chart';\nimport { SubtitleCountRenderer } from 'components/virtualTooltip/renderers';\nimport { useChart } from 'hooks/useChart';\n\n/**\n * PolarArea widget\n *\n * @param getColor\n * @param dimensions {{height: height, width: width}} to define value of chart\n * @param data Array of {key: key, value: value}\n */\nexport const PolarArea = ({ getColor, dimensions, data }) => {\n\tconst svgRef = useRef();\n\tconst containerRef = useRef();\n\n\tconst options = useMemo(() => {\n\t\treturn { colorScale: getColor };\n\t}, [getColor]);\n\n\tconst { TooltipElement } = useChart({\n\t\tsvgRef,\n\t\tcontainerRef,\n\t\tdata,\n\t\tdimensions,\n\t\toptions,\n\t\tChart: PolarAreaChart,\n\t\trenderer: SubtitleCountRenderer,\n\t});\n\n\treturn (\n\t\t\n\t\t\t{TooltipElement}\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nPolarArea.propTypes = {\n\tcolorScale: PropTypes.any,\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.object,\n};\n\nconst chartStyle = css`\n\t.gridGroup {\n\t\tline,\n\t\tpath {\n\t\t\tstroke: lightgrey;\n\t\t\tstroke-dasharray: 2;\n\t\t}\n\t}\n`;\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport { EndpointPropertySelector } from 'components/selectors/endpointPropertySelector';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { AGGREGATION_METHOD_VALUES } from 'widgets/chartUtils';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param {int} cardIndex\n * @param {object} endpointQuery\n * @param {object} widgetConfiguration\n * @param flags\n * @param types\n * @returns {*}\n * @constructor\n */\n// eslint-disable-next-line no-unused-vars\nexport const PolarAreaKnobs = ({ cardIndex, endpointQuery, widgetConfiguration, flags, types }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\n\t);\n}\n","import { PolarAreaWrapper } from './wrapper';\nimport { PolarAreaKnobs } from './knobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\nconst types = [SrsPropertyType.String, SrsPropertyType.Boolean];\n\nexport const config = {\n\tkey: 'POLAR_AREA',\n\tlabel: 'Polar Area',\n\ticon: 'polar-area',\n\twrapper: PolarAreaWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: PolarAreaKnobs,\n\tflags: flags,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tJoinMethod: 'InnerJoin',\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t\tmaxChildren: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 2;\n\t},\n};\n","import React, { useEffect, useState } from 'react';\nimport { PolarArea } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { convertToStacks, NO_DATA_MESSAGE, Stacks } from '../chartUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\n/**\n * ChartWrapper for the Polar Area Graph.\n *\n * @param getColorScale\n * @param dimensions\n * @param data\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport function PolarAreaWrapper({ getColorScale, dimensions, data, noDataMessage=NO_DATA_MESSAGE, widgetConfiguration }) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data?.entries)) return;\n\n\t\t// empty data is \"valid\"\n\t\tif (data.entries?.length === 0) {\n\t\t\tsetConvertedData({ data: [], properties: [], keys: [], rolled: [], extent: [0, 0] });\n\t\t\treturn;\n\t\t}\n\n\t\t// data comes in as {key, value, children:[{key1, value}, {key2, value}...]}\n\t\t// need as {label:value, key1: value, key2: value}\n\t\tconst converted = convertToStacks(data);\n\n\t\tconverted.colorPropertyMap = {};\n\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, converted?.keys?.length || 0]);\n\t\t\tconverted.keys.forEach((d, index) => {\n\t\t\t\tconverted.colorPropertyMap[d] = index;\n\t\t\t});\n\t\t} else {\n\t\t\tgetColorScale.domain(converted?.keys);\n\t\t\tconverted.keys.forEach((d) => {\n\t\t\t\tconverted.colorPropertyMap[d] = d;\n\t\t\t});\n\t\t}\n\n\t\tsetConvertedData(converted);\n\t}, [data, getColorScale, widgetConfiguration]);\n\n\t// If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData?.data?.length > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { css, jsx } from '@emotion/react';\n\n/**\n * Widget for rendering showing a big number and label\n *\n * @param data\n * @param widgetConfiguration\n * @returns react stuff\n * @constructor\n */\nexport function Metrics({ data, widgetConfiguration = {} }) {\n\tconst { showFull = false } = widgetConfiguration;\n\n\t// currently hacked just to use the results of the facets call\n\treturn (\n\t\t
\n\t\t\t{data.map((entry) => {\n\t\t\t\tconst fullCount = entry[1].fullSize;\n\t\t\t\tconst nonZeroCount = entry[1].entries.filter((e) => e.count > 0).length;\n\t\t\t\tif (showFull && fullCount !== nonZeroCount) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{nonZeroCount}\n\t\t\t\t\t\t\t\t{`/${fullCount}`}\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
{entry[0]} Count
\n\t\t\t\t\t\t
\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\t
\n\t\t\t\t\t\t
{nonZeroCount}
\n\t\t\t\t\t\t
{entry[0]} Count
\n\t\t\t\t\t
\n\t\t\t\t);\n\t\t\t})}\n\t\t
\n\t);\n}\n\nconst mainStyle = css`\n\tdisplay: flex;\n\tflex-flow: row wrap;\n\tjustify-content: space-around;\n\twidth: 100%;\n\theight: 100%;\n`;\n\nconst entryStyle = css`\n\tflex: 0 0 auto;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n\tpadding: 2rem;\n\n\t.value {\n\t\tfont-size: 4rem;\n\t\tline-height: 1.2;\n\t\tfont-family: 'Georgia', serif;\n\n\t\t.full {\n\t\t\tfont-size: 1rem;\n\t\t\tfont-weight: 100;\n\t\t}\n\t}\n\n\t.label {\n\t\tfont-size: 1rem;\n\t}\n`;\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n// eslint-disable-next-line no-unused-vars\nimport React, { useContext } from 'react';\nimport { WidgetBooleanSelector } from 'components/selectors/widgetBooleanSelector';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport CustomMultiSelect from 'components/custom-multiselect/custom-multiselect';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param flags\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\n\nexport const MetricsKnobs = ({ cardIndex, endpointQuery, flags, types, widgetConfiguration }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch\n\t} = useContext(WorkspaceContext);\n\tconst propertyName = 'propertyList';\n\n\tconst items = filterProperties(selectedDefinitionName, flags, types).map(property => property.name);\n\n\tconst handleSortingOfColumns = ({selected: sortedSelected/*, unselected: sortedUnselected */}) => {\n\t\tconst selected = sortedSelected;\n\t\tconst newColumns = selected.filter(selection =>\n\t\t\titems.includes(selection)\n\t\t);\n\n\t\t// create copy of options object\n\t\tconst newEndpointQuery = JSON.parse(JSON.stringify(endpointQuery));\n\t\tnewEndpointQuery.options[propertyName] = newColumns;\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, newEndpointQuery));\n\t};\n\n\tconst initialSelected = endpointQuery?.options?.[propertyName];\n\t\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n \t\t\t} />\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} />\n\t\t\n\t);\n};\n","import { MetricsWrapper } from './wrapper';\nimport { MetricsKnobs } from './knobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { facets } from 'widgets/endpoints';\n\nexport const config = {\n\tkey: 'METRICS',\n\tlabel: 'Metrics',\n\ticon: 'th',\n\twrapper: MetricsWrapper,\n\tendpoint: facets,\n\tKnobs: MetricsKnobs,\n\tflags: [SrsPropertyFlag.Categorical],\n\ttypes: [SrsPropertyType.String],\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxValues: 1000000,\n\t\t\t\t\tdescending: false,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: () => {\n\t\treturn {\n\t\t\tshowFull: true,\n\t\t};\n\t},\n\tisValid: (filteredProperties) => {\n\t\treturn filteredProperties?.length > 0;\n\t},\n};\n","import React, { useMemo, useState } from 'react';\nimport { Metrics } from './index';\nimport { selectDilDefinitionByName } from 'srs-middleware';\n\n/**\n * ChartWrapper for the Bar Graph.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param selectedDefinitionName\n * @returns {*}\n * @constructor\n */\nexport function MetricsWrapper({ widgetConfiguration, dimensions, data, selectedDefinitionName }) {\n\tconst [previous, setPrevious] = useState();\n\n\t// get the actual definition\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst convertedData = useMemo(() => {\n\t\tif (!data || !selectedDefinition || !data[selectedDefinition.systemDefinitionId]) return previous;\n\n\t\tconst returnValue = Object.entries(data[selectedDefinition.systemDefinitionId]);\n\n\t\tsetPrevious(returnValue);\n\t\treturn returnValue;\n\t}, [data, selectedDefinition]);\n\n\treturn ;\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport React, { useMemo } from 'react';\nimport { DonutGraph } from './DonutGraph';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { selectDilDefinitionByName } from 'srs-middleware';\nimport styled from '@emotion/styled';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n//import { getColorScale } from 'components/colorUtils';\n\n/**\n * ChartWrapper for the Donut Graph.\n *\n * @param getColorScale\n * @param dimensions\n * @param data\n * @param selectedDefinitionName\n * @param endpointQuery\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport function DonutGraphWrapper({\n\tgetColorScale,\n\tdimensions,\n\tdata,\n\tnoDataMessage=NO_DATA_MESSAGE,\n\tselectedDefinitionName,\n\tendpointQuery,\n\twidgetConfiguration,\n}) {\n\t// get the actual definition\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst convertedData = useMemo(() => {\n\t\tif (!data?.entries || !selectedDefinition || !endpointQuery?.options?.propertyList) return;\n\n\t\tconst items = data.entries || [];\n\n\t\t// empty data is \"valid\"\n\t\tif (items.length === 0) return [];\n\n\t\tconst converted = items.map((entry) => {\n\t\t\treturn {\n\t\t\t\tkey: entry.key,\n\t\t\t\tentries: entry.children.map(({ key, count, value }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\treference: count,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, data.keys[1].length || 0]);\n\t\t\tconverted.forEach((entry) => {\n\t\t\t\tentry.entries.forEach((d) => {\n\t\t\t\t\td.colorValue = data.keys[1].indexOf(d.name);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tgetColorScale.domain(data.keys[1]);\n\t\t\tconverted.forEach((entry) => {\n\t\t\t\tentry.entries.forEach((d) => {\n\t\t\t\t\td.colorValue = d.name;\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// top level will turn into an array of charts to show\n\t\treturn converted;\n\t}, [data.entries, data.keys, selectedDefinition, endpointQuery, widgetConfiguration, getColorScale]);\n\n\t// If the state is not ideal (the data is null or empty) render the nonIdealState message\n\tif (!convertedData || convertedData.length <= 0)\n\t\treturn (\n\t\t\t\n\t\t);\n\n\treturn (\n\t\t\n\t\t\t{convertedData.map((entry) => {\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t\n\t);\n}\n\nconst roughDimensions = (dimensions, count) => {\n\tswitch (count) {\n\t\tcase 1:\n\t\t\treturn dimensions;\n\t\tcase 2:\n\t\t\treturn { height: dimensions.height / 2, width: dimensions.width };\n\t\tcase 3:\n\t\t\treturn { height: dimensions.height / 3, width: dimensions.width };\n\t\tcase 4:\n\t\t\treturn { height: dimensions.height / 2, width: dimensions.width / 2 };\n\t\tcase 5:\n\t\tcase 6:\n\t\t\treturn { height: dimensions.height / 3, width: dimensions.width / 2 };\n\t\tdefault:\n\t\t\treturn dimensions;\n\t}\n};\n\nconst StyledContainer = styled.div(({ count }) => ({\n\tflex: '1 1 auto',\n\tdisplay: 'grid',\n\tgridTemplateColumns: `repeat(${sizes(count)[0]}, 1fr)`,\n\tgridTemplateRows: `repeat(${sizes(count)[1]}, 1fr)`,\n\tgridColumnGap: '20px',\n\tgridRowGap: '20px',\n\toverflow: 'hidden',\n\tpadding: '20px',\n}));\n\nconst sizes = (count) => {\n\tswitch (count) {\n\t\tcase 1:\n\t\t\treturn [1, 1];\n\t\tcase 2:\n\t\t\treturn [1, 2];\n\t\tcase 3:\n\t\t\treturn [1, 3];\n\t\tcase 4:\n\t\t\treturn [2, 2];\n\t\tcase 5:\n\t\tcase 6:\n\t\t\treturn [2, 3];\n\t\tdefault:\n\t\t\treturn [1, 1];\n\t}\n};\n","import { DonutGraphWrapper } from './multiWrapper';\nimport { DonutGraphKnobs } from './multiKnobs';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'MULTI_DONUT',\n\tlabel: 'Multi Donut',\n\ticon: 'doughnut-chart',\n\twrapper: DonutGraphWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: DonutGraphKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxRoot: 6,\n\t\t\t\t\tmaxNodes: 50,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 2;\n\t},\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\nimport { EndpointPropertySelector } from 'components/selectors/endpointPropertySelector';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { AGGREGATION_METHOD_VALUES } from 'widgets/chartUtils';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param flags\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport const DonutGraphKnobs = ({ cardIndex, endpointQuery, flags, widgetConfiguration }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} />\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{/**/}\n\t\t\t\t\n\t\t\t} />\n\t\t\n\t);\n};\n","import * as d3 from 'd3';\nimport ceil from 'lodash-es/ceil';\n\n// the max number of characters to allow for the labels\nconst maxLength = 15;\nconst labelPadding = {\n\txAxis: 20,\n\tyAxis: 10,\n};\n\n// overall margins for the main chart\nconst margin = {\n\ttop: 7,\n\tright: 30,\n\tbottom: 0, // gets set during init and update\n\tleft: 50 + labelPadding.yAxis,\n};\n\n/**\n * @param svg\n * @returns {{clear: clear, update: externalUpdate}}\n * @constructor\n */\nexport const LineChart = (svg) => {\n\tlet initialized = false;\n\n\t// y scale for main chart\n\tconst yScale = d3.scaleLinear();\n\tconst yAxis = d3.axisLeft(yScale).ticks(10, '~s');\n\n\t// x scale for main chart\n\tconst xScale = d3.scalePoint().padding(0.25);\n\tconst xAxis = d3.axisBottom(xScale);\n\n\tconst lineRenderer = d3\n\t\t.line()\n\t\t.curve(d3.curveCardinal.tension(0.5))\n\t\t.x((d) => xScale(d.x))\n\t\t.y((d) => yScale(d.y));\n\n\tconst getLongestValue = (entries) => {\n\t\tlet max = 0;\n\t\tentries.forEach((entry) => {\n\t\t\tif (entry.length > max) {\n\t\t\t\tif (entry.length > maxLength) max = maxLength;\n\t\t\t\telse max = entry.length;\n\t\t\t}\n\t\t});\n\t\tlet adjustment = max * 6.5 + labelPadding.xAxis;\n\t\tmargin.bottom = adjustment > maxLength * 6.5 ? maxLength * 6.5 : adjustment;\n\t};\n\n\t// manage the initialization of the chart, should only be called once\n\tfunction init({ extent, lineValues }, { height, width }, {yAxisLabel=\"Count\"}) {\n\t\tgetLongestValue(lineValues);\n\n\t\t// create group for grid lines first\n\t\td3.select(svg).append('g').classed('gridGroup', true);\n\n\t\t// update the scales\n\t\tyScale.domain([0, nextIncrement(extent[1])]).range([height - margin.bottom, margin.top]);\n\t\txScale.domain(lineValues).range([margin.left, width - margin.right]);\n\n\t\t// create yAxis\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('yAxis', true)\n\t\t\t.attr('transform', `translate(${margin.left},0)`)\n\t\t\t.attr('x', 0 - margin.bottom)\n\t\t\t.call(yAxis);\n\n\t\t// create yAxis Label\n\t\td3.select(svg)\n\t\t\t.append('text')\n\t\t\t.classed('yAxisLabel', true)\n\t\t\t.attr('transform', 'rotate(-90)')\n\t\t\t.attr('y', 10)\n\t\t\t.attr('x', 0 - height / 2 + 15)\n\t\t\t.attr('dy', '1em')\n\t\t\t.attr('dx', '1em')\n\t\t\t.style('text-anchor', 'middle')\n\t\t\t.text(yAxisLabel);\n\n\t\t// create xAxis\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('xAxis', true)\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`)\n\t\t\t.call(xAxis);\n\n\t\t// create main chart bar group\n\t\td3.select(svg)\n\t\t\t.append('g')\n\t\t\t.classed('lineGroup', true)\n\t\t\t.attr('fill', 'none')\n\t\t\t.attr('stroke-width', 1.5)\n\t\t\t.attr('stroke-linejoin', 'round')\n\t\t\t.attr('stroke-linecap', 'round');\n\n\t\t// create main point group\n\t\td3.select(svg).append('g').classed('pointGroup', true);\n\t}\n\n\tfunction update({ lineValues, lines, extent, colorPropertyMap }, { height, width, hideLabels }, { colorScale }) {\n\t\tgetLongestValue(lineValues);\n\t\tconst _margin = {...margin};\n\n\n\t\tif(hideLabels) {\n\t\t\t_margin.left = 5;\n\t\t\t_margin.bottom = 5; //reset on rerender so don't need to cache it\n\t\t}\n\t\telse {\n\t\t\t_margin.left = margin.left;\n\t\t}\n\n\n\t\t// update the scales\n\t\tyScale.domain([0, nextIncrement(extent[1])]).range([height - _margin.bottom, _margin.top]);\n\t\txScale.domain(lineValues).range([_margin.left, width - _margin.right]);\n\n\t\txAxis.tickFormat((_, i) => truncString(xScale.domain()[i], _margin.bottom));\n\n\t\t// update y axis\n\t\td3.select(svg)\n\t\t\t.select('g.yAxis')\n\t\t\t.attr('transform', `translate(${_margin.left},0)`)\n\t\t\t.transition('yAxis')\n\t\t\t.duration(150)\n\t\t\t.call(yAxis);\n\n\t\t// update x axis\n\t\td3.select(svg)\n\t\t\t.select('g.xAxis')\n\t\t\t.attr('transform', `translate(0,${yScale(0)})`)\n\t\t\t.transition('xAxis')\n\t\t\t.duration(150)\n\t\t\t.call(xAxis)\n\t\t\t.selectAll('text')\n\t\t\t.attr('transform', 'rotate(-65)')\n\t\t\t.style('text-anchor', 'end')\n\t\t\t.attr('dx', '-.8em')\n\t\t\t.attr('dy', '-.15em');\n\n\t\td3.select(svg)\n\t\t\t.select('.yAxisLabel')\n\t\t\t.attr('x', 0 - height / 2 + 15);\n\n\t\t// add the Y gridlines\n\t\td3.select(svg).selectAll('.grid').remove();\n\t\td3.select(svg)\n\t\t\t.select('.gridGroup')\n\t\t\t.append('g')\n\t\t\t.attr('class', 'grid y-grid')\n\t\t\t.attr('transform', `translate(${_margin.left}, 0)`)\n\t\t\t.call(\n\t\t\t\td3\n\t\t\t\t\t.axisLeft(yScale)\n\t\t\t\t\t.tickSize(-width + _margin.right + _margin.left)\n\t\t\t\t\t.tickFormat('')\n\t\t\t);\n\n\t\t// add all the lines\n\t\td3.select(svg)\n\t\t\t.select('.lineGroup')\n\t\t\t.selectAll('path')\n\t\t\t.data(Object.entries(lines), (d) => d[0])\n\t\t\t.join('path')\n\t\t\t.style('mix-blend-mode', 'multiply')\n\t\t\t.style('opacity', 1)\n\t\t\t.style('stroke', (d) => colorScale(colorPropertyMap[d[0]]))\n\t\t\t.attr('d', (d) => {\n\t\t\t\treturn lineRenderer(d[1]);\n\t\t\t});\n\n\t\t// add all the points\n\t\td3.select(svg)\n\t\t\t.select('.pointGroup')\n\t\t\t.selectAll('.points')\n\t\t\t.data(Object.entries(lines), (d) => d[0])\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('g').classed('points', true),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t)\n\t\t\t.selectAll('.point')\n\t\t\t.data((d) => {\n\t\t\t\treturn d[1].map((item) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tlabel: d[0],\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('circle')\n\t\t\t\t\t\t.classed('point', true)\n\t\t\t\t\t\t.attr('r', 4)\n\t\t\t\t\t\t.attr('stroke', 'white')\n\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(colorPropertyMap[d.label]))\n\t\t\t\t\t\t.attr('cx', (d) => xScale(d.x))\n\t\t\t\t\t\t.attr('cy', (d) => yScale(d.y)),\n\t\t\t\t(update) =>\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(colorPropertyMap[d.label]))\n\t\t\t\t\t\t.attr('cx', (d) => xScale(d.x))\n\t\t\t\t\t\t.style('opacity', 1)\n\t\t\t\t\t\t.attr('cy', (d) => yScale(d.y)),\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\td3.select(svg)\n\t\t\t.selectAll(\".yAxis,.yAxisLabel,.xAxis\")\n\t\t\t.style(\"display\", hideLabels ? \"none\" : null);\n\t}\n\tconst unfocusedLineOpacity = .15\n\tfunction mouseOver(key) {\n\t\td3.select(svg)\n\t\t\t.select('.lineGroup')\n\t\t\t.selectAll('path')\n\t\t\t.transition()\n\t\t\t.style('opacity', (d)=> {\n\t\t\t\treturn d[0]===key?1.0:unfocusedLineOpacity\n\t\t\t})\n\t\td3.select(svg)\n\t\t\t.select('.pointGroup')\n\t\t\t.selectAll('.points')\n\t\t\t.selectAll('.point')\n\t\t\t.transition()\n\t\t\t.style('opacity', (d)=> {\n\t\t\t\treturn d[\"label\"]===key?1.0:unfocusedLineOpacity\n\t\t\t})\n\t}\n\n\tfunction mouseOut() {\n\t\td3.select(svg)\n\t\t\t.select('.lineGroup')\n\t\t\t.selectAll('path')\n\t\t\t.transition()\n\t\t\t.style('opacity', 1)\n\t\td3.select(svg)\n\t\t\t.select('.pointGroup')\n\t\t\t.selectAll('.points')\n\t\t\t.selectAll('.point')\n\t\t\t.transition()\n\t\t\t.style('opacity', 1)\n\t}\n\n\tfunction externalUpdate(data, dimensions, options) {\n\t\tif (!initialized) {\n\t\t\tinit(data, dimensions, options);\n\t\t\tinitialized = true;\n\t\t}\n\t\tupdate(data, dimensions, options);\n\t}\n\n\tfunction clear() {\n\t\td3.select(svg).selectAll('g').remove();\n\t}\n\n\treturn {\n\t\tupdate: externalUpdate,\n\t\tclear: clear,\n\t\tmouseOver: mouseOver,\n\t\tmouseOut: mouseOut,\n\t};\n};\n\n/**\n * Determines a reasonable choice for the next increment to show.\n *\n * This helps when you want to have some padding on the max extent of chart values.\n *\n * @param i\n * @returns {number}\n */\nexport function nextIncrement(i) {\n\tconst increment = order(i);\n\n\tif (increment === 1) {\n\t\treturn 10;\n\t} else if (i < 50) {\n\t\treturn i % 2 === 0 ? i + 2 : i + 3;\n\t} else if (increment === 10 || increment === 100) {\n\t\treturn ceil(i, -1);\n\t}\n\n\tconst digits = increment.toString().length;\n\treturn ceil(i, -(digits - 2));\n}\n\n/**\n * Determines the order of magnitude of the given value.\n *\n * @param n\n * @returns {number}\n */\nexport function order(n) {\n\tconst order = Math.floor(Math.log(n) / Math.LN10 + 0.000000001); // because float math sucks like that\n\treturn Math.pow(10, order);\n}\n\n/**\n * Hard truncates a string adding '...' or the given add\n * @param str\n * @param max\n * @param add\n * @returns {string|*}\n */\nexport function truncString(str, max, add) {\n\tadd = add || '...';\n\treturn typeof str === 'string' && str.length > max + add.length ? str.substring(0, max) + add : str;\n}\n","\n\nimport ChartTooltip from \"components/chartTooltip\"\nimport { format, select } from \"d3\"\nimport useReactTooltipsOnD3 from \"hooks/useReactTooltipsOnD3\"\nimport React, { useEffect, useState } from \"react\"\nimport { LineChartDataType } from \"./types\"\n\n\n\nexport const LineChartToolTips = ({svgRef}) =>{\n\n const [itemSelector,setItemSelector] = useState<()=>\n d3.Selection>()\n useEffect(()=>{\n setItemSelector(()=>()=>{\n return select(svgRef.current)\n .select('.pointGroup')\n .selectAll('.points')\n .selectAll('.point') as any // it is the correct type but the data isn't added here so ts is grumpy\n })\n },[svgRef])\n\n const toolTipMaker = (d:LineChartDataType) => {\n // Make precise numbers less unwieldy \n const digitFormatter = format(\".4\")\n\n if(typeof d.x === \"number\") d.x = digitFormatter(d.x)\n if(typeof d.y === \"number\") d.y = digitFormatter(d.y)\n\n return \n }\n\n const toolTipOptions = {\n\t\tplacement: 'top',\n\t\t modifiers: [\n\t\t\t{\n\t\t\t\tname: 'offset',\n\t\t\t\toptions: {\n\t\t\t\t\toffset: [0, 3],\n\t\t\t\t},\n\t\t\t},\n\t\t], \n\t} \n\n\n return useReactTooltipsOnD3(\n itemSelector,\n toolTipMaker,\n toolTipOptions\n )\n}","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { LineChart } from './chart';\nimport { SubtitleCountRenderer } from 'components/virtualTooltip/renderers';\nimport { useVirtualTooltip } from 'components/virtualTooltip/useVirtualTooltip';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\nimport { LineChartToolTips } from './lineChartTooltips';\n\n/**\n * Line Chart widget\n * @param getColor\n * @param dimensions {{height: height, width: width}} to define value of chart\n * @param data Array of {key: key, value: value}\n */\nexport const LineChartWidget = ({ getColor, dimensions, data, yAxisLabel, hideLabels, legendKeys }) => {\n\tconst svgRef = useRef();\n\tconst [chart, setChart] = useState();\n\n\tconst {dispatch:controlsDispatch, state:controlsState} = useWidgetControlsContext()\n\n\t// Filter data to match legend controls\n\tconst [filteredData,setFilteredData] = useState(data)\n\tuseEffect(()=>{\n\t\tif(controlsState?.legend) {\n\t\t\tlet filteredLines = {...data.lines}\n\t\t\tObject.entries(controlsState.legend.keyValues).forEach(([key,isEnabled])=>{\n\t\t\t\tif(!isEnabled) filteredLines[key] = []\n\t\t\t})\n\n\t\t\t// Reconstruct data without disabled data\n\t\t\tconst newFilteredData = {\n\t\t\t\t...data,\n\t\t\t\tlineKeys:data.lineKeys.filter(\n\t\t\t\t\t(k)=>controlsState.legend.keyValues[k]\n\t\t\t\t),\n\t\t\t\trolled:data.rolled.filter(\n\t\t\t\t\t(k)=>controlsState.legend.keyValues[k.key]\n\t\t\t\t),\n\t\t\t\tlines: filteredLines\n\t\t\t}\n\t\t\tsetFilteredData(newFilteredData)\n\t\t}\n\t},[controlsState?.legend,data])\n\n\tuseEffect(() => {\n\n\n\t\tconst createChart = () => {\n\t\t\tconst updateTooltip = (filteredData, location, options) => {}\n\t\t\treturn LineChart(svgRef.current, updateTooltip);\n\t\t};\n\n\t\tif (filteredData && dimensions && getColor) {\n\t\t\tlet ch = chart;\n\n\t\t\t// if we don't have an existing chart, create one\n\t\t\tif (!ch) {\n\t\t\t\tch = createChart();\n\t\t\t\tsetChart(ch);\n\t\t\t}\n\n\t\t\tch.update(filteredData, { width: dimensions.width , height: dimensions.height, hideLabels},\n\t\t\t\t\t { colorScale: getColor, yAxisLabel:yAxisLabel });\n\t\t}\n\t}, [chart, filteredData, dimensions, getColor, hideLabels, yAxisLabel]);\n\n\t// Keep legend up to date\n\tuseEffect(()=>{\n\t\tif(chart) {\n\t\t\tcontrolsDispatch({\n\t\t\t\ttype:\"setLegend\",\n\t\t\t\tpayload: {\n\t\t\t\t\tkeys:legendKeys ? legendKeys : data.rolled.map(k=>k.key),\n\t\t\t\t\tcolorScale:getColor,\n\t\t\t\t\tmouseOver:chart.mouseOver,\n\t\t\t\t\tmouseOut:chart.mouseOut,\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},[data.rolled,getColor,controlsDispatch,chart])\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nLineChartWidget.propTypes = {\n\tcolorScale: PropTypes.any,\n\tdata: PropTypes.any,\n\tdimensions: PropTypes.object,\n};\n\nconst chartContainerStyle = css`\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: stretch;\n\t`\n\nconst chartStyle = css`\n\t.gridGroup {\n\t\tline,\n\t\tpath {\n\t\t\tstroke: lightgrey;\n\t\t\tstroke-dasharray: 2;\n\t\t}\n\t}\n`;\n","/** @jsx jsx */\nimport {jsx} from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport {PropertyFlag as SrsPropertyFlag, PropertyType as SrsPropertyType} from 'srs-middleware';\nimport {PropertyListSelector} from 'components/selectors/propertyListSelector';\nimport {ColorSelector} from 'components/selectors/colorSelector';\nimport {LimitSelector} from 'components/selectors/limitSelector';\nimport {EndpointPropertySelector} from 'components/selectors/endpointPropertySelector';\nimport {EndpointParameterSelector} from 'components/selectors/endpointParameterSelector';\nimport {AGGREGATION_METHOD_VALUES} from 'widgets/chartUtils';\nimport {Tab, Tabs} from \"@blueprintjs/core\";\nimport CommonKnobsContainer from \"views/common/commonKnobsContainer\";\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param {int} cardIndex\n * @param {object} endpointQuery\n * @param {object} widgetConfiguration\n * @param flags\n * @param types\n * @returns {*}\n * @constructor\n */\n// eslint-disable-next-line no-unused-vars\nexport const LineChartKnobs = ({cardIndex, endpointQuery, widgetConfiguration, flags, types}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}/>\n\t\t\n\t);\n};\n","import { LineChartWrapper } from './wrapper';\nimport { LineChartKnobs } from './knobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\nconst types = [SrsPropertyType.String, SrsPropertyType.Boolean];\n\nexport const config = {\n\tkey: 'LINE_CHART',\n\tlabel: '(alpha) Line Chart',\n\ticon: 'timeline-line-chart',\n\twrapper: LineChartWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: LineChartKnobs,\n\tflags: flags,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tJoinMethod: 'InnerJoin',\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t\tmaxChildren: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 2;\n\t},\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { LineChartWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport uniq from 'lodash-es/uniq';\nimport * as d3 from 'd3';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\n/**\n * ChartWrapper for the Line Chart Graph.\n *\n * @param getColorScale\n * @param dimensions\n * @param data\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport function LineChartWrapper({ getColorScale, dimensions, data, widgetConfiguration, noDataMessage=NO_DATA_MESSAGE }:LineChartWrapperProps) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\tconst {dispatch, state} = useWidgetControlsContext();\n\tconst hideLabels = state?.hideLabels;\n\tuseEffect(() => {\n\t\t// the data is null or in the wrong shape and we exit\n\t\tif (!data || !Array.isArray(data?.entries)) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\treturn;\n\t\t}\n\n\t\t// empty data is \"valid\"\n\t\tif (data.entries?.length === 0) {\n\t\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: false });\n\t\t\tsetConvertedData({ data: [], properties: [] });\n\t\t\treturn;\n\t\t}\n\n\t\tdispatch && dispatch({ type: \"setLabelsToggleBtnStatus\", payload: true });\n\n\t\t// need to determine if there is more than 1 group\n\t\tconst singleGroup = !data.entries[0].children;\n\n\t\tconst converted = {\n\t\t\tlineKeys: [],\n\t\t\tlineValues: [],\n\t\t\tlines: {},\n\t\t\textent: [0, 0],\n\t\t\trolled: null,\n\t\t\tcolorPropertyMap: {}\n\t\t};\n\n\t\tif (singleGroup) {\n\t\t\t// at this point we don't know what the label of the line should be, since we don't have that information\n\t\t\t// TODO: pull this from the endpointQuery\n\t\t\tconverted.lineKeys.push(['default']);\n\t\t\tconverted.lines['default'] = data.entries.map((e) => {\n\t\t\t\tconverted.lineValues.push(e.key);\n\t\t\t\tconverted.extent[1] = Math.max(converted.extent[1], e.value);\n\t\t\t\treturn { x: e.key, y: e.value };\n\t\t\t});\n\t\t\tconverted.lines['default'] = converted.lines['default'].sort((a, b) => d3.ascending(a.x, b.x));\n\t\t} else {\n\t\t\t// TODO: this should eventually be given to us at the top level, by the server\n\t\t\tconverted.lineKeys = data.entries.map((e) => e.key);\n\t\t\tdata.entries.forEach((entry) => {\n\t\t\t\tconverted.lines[entry.key] = entry.children.map((e) => {\n\t\t\t\t\tconverted.extent[1] = Math.max(converted.extent[1], e.value);\n\t\t\t\t\tconverted.lineValues.push(e.key);\n\t\t\t\t\treturn { x: e.key, y: e.value };\n\t\t\t\t});\n\t\t\t\tif(!data.sorted){\n\t\t\t\t\tconverted.lines[entry.key] = converted.lines[entry.key].sort((a, b) => d3.ascending(a.x, b.x));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconverted.lineValues = data.sorted? uniq(converted.lineValues) : uniq(converted.lineValues).sort();\n\t\tconverted.rolled = converted.lineKeys.map((k) => {\n\t\t\treturn { key: k };\n\t\t});\n\n\t\tconverted.colorPropertyMap = {};\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, converted?.lineKeys?.length || 0]);\n\t\t\tconverted.lineKeys.forEach((d, index) => {\n\t\t\t\tconverted.colorPropertyMap[d] = index;\n\t\t\t});\n\t\t} else {\n\t\t\tgetColorScale.domain(converted?.lineKeys);\n\t\t\tconverted.lineKeys.forEach((d) => {\n\t\t\t\tconverted.colorPropertyMap[d] = d;\n\t\t\t});\n\t\t}\n\n\t\tsetConvertedData(converted);\n\t}, [data, getColorScale, widgetConfiguration]);\n\n\t// If the state is not ideal (the data is null or empty) render the nonIdealState message\n\treturn convertedData?.lineKeys?.length > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n\nexport interface LineChartWrapperProps { \n\tgetColorScale, \n\tdimensions, \n\tdata: MultiLineChartData | any, \n\twidgetConfiguration, \n\tnoDataMessage,\n}\n\ninterface MultiLineChartData {\n\tentries: {\n\t\tchildren:{\n\t\t\tcount,\n\t\t\tkey,\n\t\t\tvalue\n\t\t}[],\n\t\tkey\n\t}[]\n}\n","export const MAP_SOURCE_NAME = 'map_source';\nexport const SEPARATED_SOURCE_NAME = 'map_source_seperated';\nexport const SELECTED_FEATURE_PROPERTY = 'SELECTED_FEATURE_PROPERTY';\nexport const CLUSTERED_SELECTED_FEATURE_PROPERTY = 'CLUSTERED_SELECTED_FEATURE_PROPERTY';\nexport const CIRCLE_OPACITY = 1;\n","export const CIRCLE_COLORS = ['#1F4B99', '#578FA1', '#BACBA1', '#F2BE75', '#CD7534', '#9E2B0E'];\nexport const DEFAULT_CIRCLE_COLOR = '#006699';\n","import React, { ReactNode, createContext, useContext, useState, useRef, useEffect } from 'react';\nimport useMin from '../hooks/useMin';\nimport useMax from '../hooks/useMax';\nimport { SELECTED_FEATURE_PROPERTY } from '../constants/mapConstants';\nimport IColorInfo from '../interfaces/IColorInfo';\nimport { CIRCLE_COLORS } from '../constants/circleColors';\n\ninterface IVariables {\n\tmap?: any;\n\tmapRef?: any;\n\trawData?: any;\n\tisClustered?: boolean;\n\tselectedFeatureProperty?: any;\n\tmin?: number;\n\tmax?: number;\n\thoveredFeature?: any;\n\thoveredCluster?: any;\n\tcolorInfo?: IColorInfo[];\n\tclusterColorInfo?: IColorInfo[];\n\tdata?: any;\n}\n\ninterface IFunctions {\n\tsetMap?: any;\n\tsetRawData?: any;\n\tsetIsClustered?: any;\n\tsetSelectedFeatureProperty?: any;\n\tsetMin?: any;\n\tsetMax?: any;\n\tsetHoveredFeature?: any;\n\tsetHoveredCluster?: any;\n\tsetColorInfo?: any;\n\tsetClusterColorInfo?: any;\n\tsetData?: any;\n}\n\nconst MapContext = createContext<[IVariables, IFunctions]>([{}, {}]);\n\ninterface IProvider {\n\tchildren: ReactNode;\n}\nexport const MapProvider = (props: IProvider) => {\n\tconst [map, setMap] = useState();\n\tconst mapRef = useRef();\n\tconst [data, setData] = useState();\n\tconst [rawData, setRawData] = useState();\n\tconst [isClustered, setIsClustered] = useState(true);\n\tconst [selectedFeatureProperty, setSelectedFeatureProperty] = useState('Demo Property');\n\tconst [{ min }, { setMin }] = useMin({ data: rawData, property: SELECTED_FEATURE_PROPERTY });\n\tconst [{ max }, { setMax }] = useMax({ data: rawData, property: SELECTED_FEATURE_PROPERTY });\n\tconst [hoveredFeature, setHoveredFeature] = useState(undefined);\n\tconst [hoveredCluster, setHoveredCluster] = useState(undefined);\n\tconst [colorInfo, setColorInfo] = useState([]);\n\tconst [clusterColorInfo, setClusterColorInfo] = useState([]);\n\n\tuseEffect(() => {\n\t\tlet difference = max - min;\n\t\tif (difference < 6 || isNaN(min) || isNaN(max)) difference = 6;\n\t\tconst step = Math.ceil(difference / 6);\n\t\tlet rtn: IColorInfo[] = [];\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst value = step * i + min;\n\t\t\tconst maxValue = value + step - 1;\n\t\t\trtn.push({ maxValue: maxValue, minValue: value, color: CIRCLE_COLORS[i] });\n\t\t}\n\t\trtn = rtn.sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return 1;\n\t\t\telse if (a.maxValue > b.maxValue) return -1;\n\t\t\telse return 0;\n\t\t});\n\t\tsetColorInfo(rtn);\n\t}, [min, max]);\n\n\tuseEffect(() => {\n\t\tlet rtn: IColorInfo[] = [\n\t\t\t{ minValue: min, maxValue: max, color: CIRCLE_COLORS[0] },\n\t\t\t{ minValue: max + 1, maxValue: max * 2, color: CIRCLE_COLORS[1] },\n\t\t\t{ minValue: max * 2 + 1, maxValue: max * 4, color: CIRCLE_COLORS[2] },\n\t\t\t{ minValue: max * 4 + 1, maxValue: max * 8, color: CIRCLE_COLORS[3] },\n\t\t\t{ minValue: max * 8 + 1, maxValue: max * 16, color: CIRCLE_COLORS[4] },\n\t\t\t{ minValue: max * 16 + 1, maxValue: Infinity, color: CIRCLE_COLORS[5] },\n\t\t];\n\t\tsetClusterColorInfo(rtn);\n\t}, [min, max]);\n\n\tconst value: [IVariables, IFunctions] = [\n\t\t{\n\t\t\tmap,\n\t\t\tmapRef,\n\t\t\trawData,\n\t\t\tisClustered,\n\t\t\tselectedFeatureProperty,\n\t\t\tmin,\n\t\t\tmax,\n\t\t\thoveredFeature,\n\t\t\thoveredCluster,\n\t\t\tcolorInfo,\n\t\t\tclusterColorInfo,\n\t\t\tdata,\n\t\t},\n\t\t{\n\t\t\tsetMap,\n\t\t\tsetRawData,\n\t\t\tsetIsClustered,\n\t\t\tsetSelectedFeatureProperty,\n\t\t\tsetMin,\n\t\t\tsetMax,\n\t\t\tsetHoveredFeature,\n\t\t\tsetHoveredCluster,\n\t\t\tsetColorInfo,\n\t\t\tsetClusterColorInfo,\n\t\t\tsetData,\n\t\t},\n\t];\n\n\treturn ;\n};\n\nexport const useMapContext = () => {\n\tconst context = useContext(MapContext);\n\tif (!context) {\n\t\tthrow new Error('useMapContext must be used within a MapProvider');\n\t}\n\treturn context;\n};\n","import { useEffect, useState } from 'react';\n\nexport default function useMin({ data, property }: { data: any; property: string }) {\n\tconst [min, setMin] = useState(undefined);\n\n\tuseEffect(() => {\n\t\tif (!property) {\n\t\t\tsetMin(0);\n\t\t}\n\t\tlet rtn = undefined;\n\t\tdata?.features?.forEach((feature: any) => {\n\t\t\tconst value = feature.properties[property];\n\t\t\tif (rtn === undefined) rtn = value;\n\t\t\telse if (value < rtn) rtn = value;\n\t\t});\n\t\tsetMin(rtn);\n\t}, [data, property]);\n\n\treturn [{ min }, { setMin }];\n}\n","import { useEffect, useState } from 'react';\n\nexport default function useMax({ data, property }: { data: any; property: string }) {\n\tconst [max, setMax] = useState(undefined);\n\n\tuseEffect(() => {\n\t\tif (!property) {\n\t\t\tsetMax(1);\n\t\t}\n\t\tlet rtn = undefined;\n\t\tdata?.features?.forEach((feature: any) => {\n\t\t\tconst value = feature.properties[property];\n\t\t\tif (rtn === undefined) rtn = value;\n\t\t\telse if (value > rtn) rtn = value;\n\t\t});\n\t\tif (isNaN(rtn) || rtn <= 0) rtn = 1;\n\t\tsetMax(rtn);\n\t}, [data, property]);\n\n\treturn [{ max }, { setMax }];\n}\n","export const EMPTY_FEATURE_COLLECTION = {\n\ttype: 'FeatureCollection',\n\tfeatures: [],\n};\n","export const LAYER_NAMES = {\n\t//CLUSTER POINTS\n\tPOINT_LAYER: 'POINT_LAYER',\n\tHOVERED_POINTS: 'HOVERED_POINTS',\n\tHOVERED_POINTS_TEXT: 'HOVERED_POINTS_TEXT',\n\t//CLUSTERS\n\tCLUSTER_LAYER: 'CLUSTER_LAYER',\n\tHOVERED_CLUSTERS: 'HOVERED_CLUSTERS',\n\tCLUSTER_TEXT: 'CLUSTER_TEXT',\n\t//SEPARATED POINTS\n\tSEPARATED_POINTS_LAYER: 'SEPARATED_POINTS_LAYER',\n\tSEPARATED_HOVERED_POINTS: 'SEPARATED_HOVERED_POINTS',\n\tSEPARATED_HOVERED_POINTS_TEXT: 'SEPARATED_HOVERED_POINTS_TEXT',\n};\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\n\nexport default function useIsVisible({ layerName }: { layerName: string }) {\n\tconst [{ map, isClustered }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst visibility = isClustered ? 'visible' : 'none';\n\t\tmap.setLayoutProperty(layerName, 'visibility', visibility);\n\t}, [isClustered, map, layerName]);\n}\n","import { LAYER_NAMES } from './layerNames';\n\n//put clusters above points\nexport const CLUSTERED_POINTS_LAYER_ORDER = [\n\t//BOTTOM LAYER\n\tLAYER_NAMES.POINT_LAYER,\n\tLAYER_NAMES.CLUSTER_LAYER,\n\t//HOVER\n\tLAYER_NAMES.HOVERED_POINTS,\n\t//LAYER_NAMES.HOVERED_POINTS_TEXT,\n\tLAYER_NAMES.HOVERED_CLUSTERS,\n\t//LAYER_NAMES.CLUSTER_TEXT,\n\t//TOP LAYER\n];\n","import { CLUSTERED_POINTS_LAYER_ORDER } from '../constants/clusteredPointsLayerOrder';\n\nexport default function getClusteredPointsParentLayer({ layerName }: { layerName: string }) {\n\tconst index = CLUSTERED_POINTS_LAYER_ORDER.indexOf(layerName);\n\treturn CLUSTERED_POINTS_LAYER_ORDER[index + 1];\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect } from 'react';\nimport { CIRCLE_OPACITY } from 'widgets/earthMap/constants/mapConstants';\n\nexport default function useCircleOpacity({ layerName, sourceName }) {\n\tconst [{ map, hoveredFeature, hoveredCluster }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tif (hoveredFeature || hoveredCluster) {\n\t\t\tmap.setPaintProperty(layerName, 'circle-opacity', 0.25);\n\t\t\tmap.setPaintProperty(layerName, 'circle-stroke-opacity', 0.25);\n\t\t} else {\n\t\t\tmap.setPaintProperty(layerName, 'circle-opacity', CIRCLE_OPACITY);\n\t\t\tmap.setPaintProperty(layerName, 'circle-stroke-opacity', 1);\n\t\t}\n\t}, [map, hoveredFeature, hoveredCluster, layerName, sourceName]);\n}\n","export const MIN_CIRCLE_RADIUS = 8;\nexport const DEFAULT_CIRCLE_RADIUS = MIN_CIRCLE_RADIUS;\nexport const MAX_CIRCLE_RADIUS = MIN_CIRCLE_RADIUS + 15;\n","import { useEffect } from 'react';\nimport { LAYER_NAMES } from '../../constants/layerNames';\nimport { useMapContext } from '../../contexts/mapContext';\nimport { MAP_SOURCE_NAME, CIRCLE_OPACITY } from '../../constants/mapConstants';\nimport { Colors } from '@blueprintjs/core';\nimport useIsVisible from './useIsVisible';\nimport getClusteredPointsParentLayer from 'widgets/earthMap/helpers/getClusteredPointsParentLayer';\nimport useCircleOpacity from '../circles/useCircleOpacity';\nimport { DEFAULT_CIRCLE_COLOR } from 'widgets/earthMap/constants/circleColors';\nimport { DEFAULT_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\n\nconst LAYER_NAME = LAYER_NAMES.POINT_LAYER;\n\nexport default function usePoints() {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(MAP_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: MAP_SOURCE_NAME,\n\t\t\t\tfilter: ['!', ['has', 'point_count']],\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-opacity': CIRCLE_OPACITY,\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t\t'circle-color': DEFAULT_CIRCLE_COLOR,\n\t\t\t\t\t'circle-radius': DEFAULT_CIRCLE_RADIUS,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgetClusteredPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\t//useCircleRadius({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseIsVisible({ layerName: LAYER_NAME });\n\tuseCircleOpacity({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect, useMemo } from 'react';\nimport { CLUSTERED_SELECTED_FEATURE_PROPERTY } from 'widgets/earthMap/constants/mapConstants';\nimport { MIN_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\nimport IColorInfo from 'widgets/earthMap/interfaces/IColorInfo';\n\nexport default function useClusterRadius({ layerName, sourceName }) {\n\tconst [{ map, clusterColorInfo }] = useMapContext();\n\n\tconst sortedColorInfo = useMemo(() => {\n\t\tconst rtn = [...clusterColorInfo].sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return -1;\n\t\t\telse if (a.maxValue > b.maxValue) return 1;\n\t\t\telse return 0;\n\t\t});\n\t\treturn rtn;\n\t}, [clusterColorInfo]);\n\n\t//CIRCLE RADIUS\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tmap.setPaintProperty(layerName, 'circle-radius', [\n\t\t\t'step',\n\t\t\t['get', CLUSTERED_SELECTED_FEATURE_PROPERTY],\n\t\t\tMIN_CIRCLE_RADIUS, //1\n\t\t\tsortedColorInfo[1].minValue,\n\t\t\tMIN_CIRCLE_RADIUS + 3, //2\n\t\t\tsortedColorInfo[2].minValue,\n\t\t\tMIN_CIRCLE_RADIUS + 6, //3\n\t\t\tsortedColorInfo[3].minValue,\n\t\t\tMIN_CIRCLE_RADIUS + 9, //4\n\t\t\tsortedColorInfo[4].minValue,\n\t\t\tMIN_CIRCLE_RADIUS + 12, //5\n\t\t\tsortedColorInfo[5].minValue,\n\t\t\tMIN_CIRCLE_RADIUS + 15, //6\n\t\t]);\n\t}, [map, sourceName, layerName, sortedColorInfo]);\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect, useMemo } from 'react';\nimport { CLUSTERED_SELECTED_FEATURE_PROPERTY } from 'widgets/earthMap/constants/mapConstants';\nimport IColorInfo from 'widgets/earthMap/interfaces/IColorInfo';\n\nexport default function useClusterColor({ layerName, sourceName }) {\n\tconst [{ map, min, max, isClustered, clusterColorInfo }] = useMapContext();\n\n\tconst sortedColorInfo = useMemo(() => {\n\t\tconst rtn = [...clusterColorInfo].sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return -1;\n\t\t\telse if (a.maxValue > b.maxValue) return 1;\n\t\t\telse return 0;\n\t\t});\n\t\treturn rtn;\n\t}, [clusterColorInfo]);\n\n\t//CIRCLE color\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tmap.setPaintProperty(layerName, 'circle-color', [\n\t\t\t'step',\n\t\t\t['get', CLUSTERED_SELECTED_FEATURE_PROPERTY],\n\t\t\tsortedColorInfo[0].color ?? 'blue', //info[0].color if less than info[1].min\n\t\t\tsortedColorInfo[1].minValue,\n\t\t\tsortedColorInfo[1].color ?? 'blue', //info[1].color if less than info[2].min\n\t\t\tsortedColorInfo[2].minValue,\n\t\t\tsortedColorInfo[2].color ?? 'blue', //info[2].color if less than info[3].min\n\t\t\tsortedColorInfo[3].minValue,\n\t\t\tsortedColorInfo[3].color ?? 'blue', //info[3].color if less than info[4].min\n\t\t\tsortedColorInfo[4].minValue,\n\t\t\tsortedColorInfo[4].color ?? 'blue', //info[4].color if less than info[5].min\n\t\t\tsortedColorInfo[5].minValue,\n\t\t\tsortedColorInfo[5].color ?? 'blue', //info[5].color\n\t\t]);\n\t}, [map, min, max, sourceName, layerName, isClustered, sortedColorInfo]);\n}\n","import { useEffect } from 'react';\nimport { LAYER_NAMES } from '../../constants/layerNames';\nimport { useMapContext } from '../../contexts/mapContext';\nimport { MAP_SOURCE_NAME, CIRCLE_OPACITY } from '../../constants/mapConstants';\nimport { Colors } from '@blueprintjs/core';\nimport useIsVisible from './useIsVisible';\nimport useClusterRadius from './useClusterRadius';\nimport useClusterColor from './useClusterColor';\nimport getClusteredPointsParentLayer from 'widgets/earthMap/helpers/getClusteredPointsParentLayer';\nimport useCircleOpacity from '../circles/useCircleOpacity';\n\nconst LAYER_NAME = LAYER_NAMES.CLUSTER_LAYER;\n\nexport default function useClusters() {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(MAP_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: MAP_SOURCE_NAME,\n\t\t\t\tfilter: ['has', 'point_count'],\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-opacity': CIRCLE_OPACITY,\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgetClusteredPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\tuseClusterRadius({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseClusterColor({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseCircleOpacity({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseIsVisible({ layerName: LAYER_NAME });\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\n\nexport default function useIsVisible({ layerName }: { layerName: string }) {\n\tconst [{ map, isClustered }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst visibility = isClustered ? 'none' : 'visible';\n\t\tmap.setLayoutProperty(layerName, 'visibility', visibility);\n\t}, [isClustered, map, layerName]);\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect, useMemo } from 'react';\nimport { SELECTED_FEATURE_PROPERTY } from 'widgets/earthMap/constants/mapConstants';\nimport IColorInfo from 'widgets/earthMap/interfaces/IColorInfo';\nimport { DEFAULT_CIRCLE_COLOR } from 'widgets/earthMap/constants/circleColors';\n\nexport default function useCircleColor({ layerName, sourceName }) {\n\tconst [{ map, colorInfo, selectedFeatureProperty }] = useMapContext();\n\n\tconst sortedColorInfo = useMemo(() => {\n\t\tconst rtn = [...colorInfo].sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return -1;\n\t\t\telse if (a.maxValue > b.maxValue) return 1;\n\t\t\telse return 0;\n\t\t});\n\t\treturn rtn;\n\t}, [colorInfo]);\n\n\t//CIRCLE COLOR\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tif (!selectedFeatureProperty) {\n\t\t\tmap.setPaintProperty(layerName, 'circle-color', DEFAULT_CIRCLE_COLOR);\n\t\t\treturn;\n\t\t}\n\t\tmap.setPaintProperty(layerName, 'circle-color', [\n\t\t\t'step',\n\t\t\t['get', SELECTED_FEATURE_PROPERTY],\n\t\t\tsortedColorInfo[0].color ?? 'white', //info[0].color if less than info[1].min\n\t\t\tsortedColorInfo[1].minValue,\n\t\t\tsortedColorInfo[1].color ?? 'white', //info[1].color if less than info[2].min\n\t\t\tsortedColorInfo[2].minValue,\n\t\t\tsortedColorInfo[2].color ?? 'white', //info[2].color if less than info[3].min\n\t\t\tsortedColorInfo[3].minValue,\n\t\t\tsortedColorInfo[3].color ?? 'white', //info[3].color if less than info[4].min\n\t\t\tsortedColorInfo[4].minValue,\n\t\t\tsortedColorInfo[4].color ?? 'white', //info[4].color if less than info[5].min\n\t\t\tsortedColorInfo[5].minValue,\n\t\t\tsortedColorInfo[5].color ?? 'white', //info[5].color\n\t\t]);\n\t}, [map, sortedColorInfo, layerName, sourceName, selectedFeatureProperty]);\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect } from 'react';\nimport { SELECTED_FEATURE_PROPERTY } from 'widgets/earthMap/constants/mapConstants';\nimport { DEFAULT_CIRCLE_RADIUS, MIN_CIRCLE_RADIUS, MAX_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\n\nexport default function useCircleRadius({ layerName, sourceName }) {\n\tconst [{ map, min, max, selectedFeatureProperty }] = useMapContext();\n\n\t//CIRCLE RADIUS\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tif (isNaN(min) || isNaN(max) || min >= max || selectedFeatureProperty === undefined) {\n\t\t\tmap.setPaintProperty(layerName, 'circle-radius', DEFAULT_CIRCLE_RADIUS);\n\t\t\treturn;\n\t\t}\n\t\tmap.setPaintProperty(layerName, 'circle-radius', [\n\t\t\t'interpolate',\n\t\t\t['linear'],\n\t\t\t['get', SELECTED_FEATURE_PROPERTY],\n\t\t\tmin,\n\t\t\tMIN_CIRCLE_RADIUS,\n\t\t\tmax,\n\t\t\tMAX_CIRCLE_RADIUS,\n\t\t]);\n\t}, [map, min, max, layerName, sourceName, selectedFeatureProperty]);\n}\n","import { LAYER_NAMES } from './layerNames';\n\nexport const SEPARATED_POINTS_LAYER_ORDER = [\n\t//BOTTOM LAYER\n\tLAYER_NAMES.SEPARATED_POINTS_LAYER,\n\tLAYER_NAMES.SEPARATED_HOVERED_POINTS,\n\t//LAYER_NAMES.SEPARATED_HOVERED_POINTS_TEXT,\n\t//TOP LAYER\n];\n","import { SEPARATED_POINTS_LAYER_ORDER } from '../constants/separatedPointsLayerOrder';\n\nexport default function getSeparatedPointsParentLayer({ layerName }: { layerName: string }) {\n\tconst index = SEPARATED_POINTS_LAYER_ORDER.indexOf(layerName);\n\treturn SEPARATED_POINTS_LAYER_ORDER[index + 1];\n}\n","import { useEffect } from 'react';\nimport { Colors } from '@blueprintjs/core';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { LAYER_NAMES } from 'widgets/earthMap/constants/layerNames';\nimport { SEPARATED_SOURCE_NAME, MAP_SOURCE_NAME, CIRCLE_OPACITY } from 'widgets/earthMap/constants/mapConstants';\nimport useIsVisible from './useIsVisible';\nimport useCircleColor from '../circles/useCircleColor';\nimport useCircleRadius from '../circles/useCircleRadius';\nimport getSeparatedPointsParentLayer from 'widgets/earthMap/helpers/getSeparatedPointsParentLayer';\nimport useCircleOpacity from '../circles/useCircleOpacity';\nimport { DEFAULT_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\nimport { DEFAULT_CIRCLE_COLOR } from 'widgets/earthMap/constants/circleColors';\n\nconst LAYER_NAME = LAYER_NAMES.SEPARATED_POINTS_LAYER;\n\nexport default function useSeparatedPoints() {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(SEPARATED_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: SEPARATED_SOURCE_NAME,\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-opacity': CIRCLE_OPACITY,\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t\t'circle-radius': DEFAULT_CIRCLE_RADIUS,\n\t\t\t\t\t'circle-color': DEFAULT_CIRCLE_COLOR,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgetSeparatedPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\tuseCircleColor({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseCircleRadius({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseCircleOpacity({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\n\tuseIsVisible({ layerName: LAYER_NAME });\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport * as turf from 'turf';\nimport { MAP_SOURCE_NAME, SEPARATED_SOURCE_NAME } from 'widgets/earthMap/constants/mapConstants';\n\nexport default function useHoverEvent({ layerName, sourceName }: { layerName: string; sourceName: string }) {\n\tconst [{ map, isClustered }, { setHoveredFeature }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst onMouseMove = (e: any) => {\n\t\t\tconst features = map.queryRenderedFeatures(e.point, { layers: [layerName] });\n\t\t\tlet minDistance = undefined;\n\t\t\tlet minFeature = undefined;\n\t\t\tconst cursorPoint = turf.point([e.lngLat.lng, e.lngLat.lat]);\n\t\t\tfeatures.forEach((feature: any) => {\n\t\t\t\tconst point = turf.point(feature.geometry.coordinates);\n\t\t\t\tconst distance = turf.distance(cursorPoint, point);\n\t\t\t\tif (minDistance === undefined || distance < minDistance) {\n\t\t\t\t\tminDistance = distance;\n\t\t\t\t\tminFeature = feature;\n\t\t\t\t}\n\t\t\t});\n\t\t\tsetHoveredFeature(minFeature);\n\t\t};\n\t\tif (sourceName === MAP_SOURCE_NAME && isClustered) map.on('mousemove', onMouseMove);\n\t\tif (sourceName === SEPARATED_SOURCE_NAME && !isClustered) map.on('mousemove', onMouseMove);\n\t\treturn () => {\n\t\t\tmap.off('mousemove', onMouseMove);\n\t\t};\n\t}, [map, isClustered, layerName, setHoveredFeature, sourceName]);\n}\n","import { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect } from 'react';\n\nexport default function useHoverOpacity({ layerName, sourceName }) {\n\tconst [{ map, hoveredFeature }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tmap.setPaintProperty(layerName, 'circle-opacity', ['match', ['id'], hoveredFeature?.id ?? -1, 1, 0]);\n\t\tmap.setPaintProperty(layerName, 'circle-stroke-opacity', ['match', ['id'], hoveredFeature?.id ?? -1, 1, 0]);\n\t}, [map, hoveredFeature, layerName, sourceName]);\n}\n","import { useEffect } from 'react';\nimport { Colors } from '@blueprintjs/core';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { LAYER_NAMES } from 'widgets/earthMap/constants/layerNames';\nimport { SEPARATED_SOURCE_NAME } from 'widgets/earthMap/constants/mapConstants';\nimport useIsVisible from '../useIsVisible';\nimport useCircleRadius from '../../circles/useCircleRadius';\nimport useCircleColor from '../../circles/useCircleColor';\nimport useHoverEvent from './useHoverEvent';\nimport useHoverOpacity from './useHoverOpacity';\nimport getSeparatedPointsParentLayer from 'widgets/earthMap/helpers/getSeparatedPointsParentLayer';\nimport { DEFAULT_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\nimport { DEFAULT_CIRCLE_COLOR } from 'widgets/earthMap/constants/circleColors';\n\nconst LAYER_NAME = LAYER_NAMES.SEPARATED_HOVERED_POINTS;\n\nexport default function useSeparatedHoverPoints() {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(SEPARATED_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\tgenerateId: true,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: SEPARATED_SOURCE_NAME,\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t\t'circle-radius': DEFAULT_CIRCLE_RADIUS,\n\t\t\t\t\t'circle-color': DEFAULT_CIRCLE_COLOR,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgetSeparatedPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\tuseCircleColor({ layerName: LAYER_NAME, sourceName: SEPARATED_SOURCE_NAME });\n\tuseCircleRadius({ layerName: LAYER_NAME, sourceName: SEPARATED_SOURCE_NAME });\n\tuseHoverEvent({ layerName: LAYER_NAME, sourceName: SEPARATED_SOURCE_NAME });\n\tuseHoverOpacity({ layerName: LAYER_NAME, sourceName: SEPARATED_SOURCE_NAME });\n\n\tuseIsVisible({ layerName: LAYER_NAME });\n}\n","import React from 'react';\nimport styled from '@emotion/styled';\n\ninterface IProps {\n\tspace: string;\n\tisVertical: boolean;\n}\n\nexport default function Space({ space, isVertical }: IProps) {\n\treturn ;\n}\n\nconst Wrapper = styled.div`\n\tpadding-top: ${(props: IProps) => (props.isVertical ? props.space : 0)};\n\tpadding-left: ${(props: IProps) => (props.isVertical ? 0 : props.space)};\n`;\n","import React from 'react';\nimport styled from '@emotion/styled';\nimport { Colors } from '@blueprintjs/core';\ninterface IProps {\n\tisVertical: boolean;\n}\n\nexport default function Line({ isVertical }) {\n\treturn ;\n}\n\nconst Wrapper = styled.div`\n\tbackground: ${Colors.BLACK};\n\theight: ${(props: IProps) => (props.isVertical ? '100%' : '1px')};\n\twidth: ${(props: IProps) => (props.isVertical ? '1px' : '100%')};\n`;\n","import React from 'react';\nimport styled from '@emotion/styled';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { Colors } from '@blueprintjs/core';\nimport Space from '../../Space';\nimport Line from '../../Line';\n\nexport default function EarthMapModal() {\n\tconst [{ hoveredFeature, selectedFeatureProperty }] = useMapContext();\n\n\tif (!hoveredFeature) return null;\n\treturn (\n\t\t\n\t\t\tPoint\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t{selectedFeatureProperty && (\n\t\t\t\t\n\t\t\t\t\t{selectedFeatureProperty}:\n\t\t\t\t\t{hoveredFeature?.properties?.[selectedFeatureProperty]}\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t\tLatitude:\n\t\t\t\t{hoveredFeature?.geometry?.coordinates?.[1]}\n\t\t\t\n\t\t\t\n\t\t\t\tLongitude:\n\t\t\t\t{hoveredFeature?.geometry?.coordinates?.[0]}\n\t\t\t\n\t\t\n\t);\n}\n\nconst Wrapper = styled.div`\n\tposition: absolute;\n\tright: 12px;\n\ttop: 12px;\n\tpadding: 12px;\n\twidth: 300px;\n\tbackground: ${Colors.WHITE};\n`;\n\nconst Row = styled.div`\n\tdisplay: flex;\n`;\n\nconst Title = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twidth: 100%;\n\tfont-size: 14px;\n`;\nconst SubTitle = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n\nconst Value = styled.div`\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n","import { useEffect } from 'react';\nimport { Colors } from '@blueprintjs/core';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { LAYER_NAMES } from 'widgets/earthMap/constants/layerNames';\nimport { MAP_SOURCE_NAME, CIRCLE_OPACITY } from 'widgets/earthMap/constants/mapConstants';\nimport getClusteredPointsParentLayer from 'widgets/earthMap/helpers/getClusteredPointsParentLayer';\nimport useHoverEvent from 'widgets/earthMap/hooks/separated/hover/useHoverEvent';\nimport useHoverOpacity from 'widgets/earthMap/hooks/separated/hover/useHoverOpacity';\nimport useIsVisible from '../../useIsVisible';\nimport { DEFAULT_CIRCLE_COLOR } from 'widgets/earthMap/constants/circleColors';\nimport { DEFAULT_CIRCLE_RADIUS } from 'widgets/earthMap/constants/circleSizes';\n\nconst LAYER_NAME = LAYER_NAMES.HOVERED_POINTS;\nconst SOURCE_NAME = MAP_SOURCE_NAME;\n\nexport default function useHoveredClusterPoints() {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: SOURCE_NAME,\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-opacity': CIRCLE_OPACITY,\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t\t'circle-color': DEFAULT_CIRCLE_COLOR,\n\t\t\t\t\t'circle-radius': DEFAULT_CIRCLE_RADIUS,\n\t\t\t\t},\n\t\t\t\tfilter: ['!', ['has', 'point_count']],\n\t\t\t},\n\t\t\tgetClusteredPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\t// useCircleColor({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\t// useCircleRadius({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseHoverEvent({ layerName: LAYER_NAME, sourceName: SOURCE_NAME });\n\tuseHoverOpacity({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\n\t//VISIBILITY\n\tuseIsVisible({ layerName: LAYER_NAME });\n}\n","import { useEffect } from 'react';\nimport getClusteredPointsParentLayer from 'widgets/earthMap/helpers/getClusteredPointsParentLayer';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { LAYER_NAMES } from 'widgets/earthMap/constants/layerNames';\nimport { MAP_SOURCE_NAME, CIRCLE_OPACITY } from 'widgets/earthMap/constants/mapConstants';\nimport useClusterRadius from '../../useClusterRadius';\nimport useClusterColor from '../../useClusterColor';\nimport useHoverEvent from './useHoverEvent';\nimport { Colors } from '@blueprintjs/core';\n\nconst LAYER_NAME = LAYER_NAMES.HOVERED_CLUSTERS;\n\nexport default function useHoveredClusters() {\n\tconst [{ map, isClustered, hoveredCluster }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(MAP_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: LAYER_NAME,\n\t\t\t\ttype: 'circle',\n\t\t\t\tsource: MAP_SOURCE_NAME,\n\t\t\t\tfilter: ['has', 'point_count'],\n\t\t\t\tpaint: {\n\t\t\t\t\t'circle-opacity': CIRCLE_OPACITY,\n\t\t\t\t\t'circle-stroke-color': Colors.BLACK,\n\t\t\t\t\t'circle-stroke-width': 2,\n\t\t\t\t},\n\t\t\t},\n\t\t\tgetClusteredPointsParentLayer({ layerName: LAYER_NAME })\n\t\t);\n\t\treturn () => {\n\t\t\tmap.removeLayer(LAYER_NAME);\n\t\t};\n\t}, [map]);\n\n\tuseClusterRadius({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseClusterColor({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\tuseHoverEvent({ layerName: LAYER_NAME, sourceName: MAP_SOURCE_NAME });\n\n\t//OPACITY\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(MAP_SOURCE_NAME);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(LAYER_NAME);\n\t\tif (!layer) return;\n\t\tmap.setPaintProperty(LAYER_NAME, 'circle-opacity', ['match', ['id'], hoveredCluster?.id ?? -1, 1, 0]);\n\t\tmap.setPaintProperty(LAYER_NAME, 'circle-stroke-opacity', ['match', ['id'], hoveredCluster?.id ?? -1, 1, 0]);\n\t}, [map, hoveredCluster]);\n\n\t//VISIBILITY\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst layer = map.getLayer(LAYER_NAME);\n\t\tif (!layer) return;\n\t\tconst visibility = isClustered ? 'visible' : 'none';\n\t\tmap.setLayoutProperty(LAYER_NAME, 'visibility', visibility);\n\t}, [isClustered, map]);\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport * as turf from 'turf';\nimport { MAP_SOURCE_NAME, SEPARATED_SOURCE_NAME } from 'widgets/earthMap/constants/mapConstants';\n\nexport default function useHoverEvent({ layerName, sourceName }: { layerName: string; sourceName: string }) {\n\tconst [{ map, isClustered }, { setHoveredCluster }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst onMouseMove = (e: any) => {\n\t\t\tconst features = map.queryRenderedFeatures(e.point, { layers: [layerName] });\n\t\t\tlet minDistance = undefined;\n\t\t\tlet minFeature = undefined;\n\t\t\tconst cursorPoint = turf.point([e.lngLat.lng, e.lngLat.lat]);\n\t\t\tfeatures.forEach((feature: any) => {\n\t\t\t\tconst point = turf.point(feature.geometry.coordinates);\n\t\t\t\tconst distance = turf.distance(cursorPoint, point);\n\t\t\t\tif (minDistance === undefined || distance < minDistance) {\n\t\t\t\t\tminDistance = distance;\n\t\t\t\t\tminFeature = feature;\n\t\t\t\t}\n\t\t\t});\n\t\t\tsetHoveredCluster(minFeature);\n\t\t};\n\t\tif (sourceName === MAP_SOURCE_NAME && isClustered) map.on('mousemove', onMouseMove);\n\t\tif (sourceName === SEPARATED_SOURCE_NAME && !isClustered) map.on('mousemove', onMouseMove);\n\t\treturn () => {\n\t\t\tmap.off('mousemove', onMouseMove);\n\t\t};\n\t}, [map, isClustered, layerName, setHoveredCluster, sourceName]);\n}\n","import React, { useMemo } from 'react';\nimport styled from '@emotion/styled';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { Colors } from '@blueprintjs/core';\nimport IColorInfo from 'widgets/earthMap/interfaces/IColorInfo';\nimport numeral from 'numeral';\n\nconst tickFormatter = (value: number) => {\n\tif (isNaN(value)) return 'NaN';\n\telse if (value === Infinity) return 'Inf';\n\treturn numeral(value).format('0.[00]a');\n};\n\nexport default function EarthMapLegend() {\n\tconst [{ colorInfo, clusterColorInfo, isClustered, selectedFeatureProperty }] = useMapContext();\n\n\tconst sortedColorInfo = useMemo(() => {\n\t\tconst a = isClustered ? clusterColorInfo : colorInfo;\n\t\treturn [...a].sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return 1;\n\t\t\telse if (a.maxValue > b.maxValue) return -1;\n\t\t\telse return 0;\n\t\t});\n\t}, [colorInfo, clusterColorInfo, isClustered]);\n\n\tif (!isClustered && !selectedFeatureProperty) return null;\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t{sortedColorInfo.slice(0, 6).map((info: IColorInfo, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{sortedColorInfo.map((info: IColorInfo, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{tickFormatter(info.maxValue)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t{tickFormatter(sortedColorInfo?.[sortedColorInfo?.length - 1]?.minValue)}\n\t\t\t\n\t\t\n\t);\n}\nconst TickLabel = styled.div`\n\theight: 13px;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 8px;\n`;\n\nconst InnerWrapper = styled.div`\n\tposition: relative;\n`;\n\ninterface ISpace {\n\tspace: string;\n}\nconst VerticalSpace = styled.div`\n\tpadding-top: ${(props: ISpace) => props.space};\n`;\nconst HorizontalSpace = styled.div`\n\tpadding-left: ${(props: ISpace) => props.space};\n`;\n\nconst Wrapper = styled.div`\n\tposition: absolute;\n\tright: 12px;\n\tbottom: 12px;\n\tpadding: 12px;\n\tbackground: ${Colors.WHITE};\n\tdisplay: flex;\n`;\n\nconst Tick = styled.div`\n\twidth: 15px;\n\theight: 1px;\n\tbackground: ${Colors.BLACK};\n`;\n\ninterface IColorBlock {\n\tblockColor: string;\n}\nconst ColorBlock = styled.div`\n\tbackground: ${(props: IColorBlock) => props.blockColor};\n\theight: 20px;\n\twidth: 10px;\n`;\n","import React, { useState, useEffect } from 'react';\nimport styled from '@emotion/styled';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { Colors } from '@blueprintjs/core';\nimport { CLUSTERED_SELECTED_FEATURE_PROPERTY } from 'widgets/earthMap/constants/mapConstants';\nimport Space from '../../Space';\nimport Line from '../../Line';\n\nexport default function ClusterModal() {\n\tconst [{ hoveredCluster, selectedFeatureProperty }] = useMapContext();\n\tconst [pointCount, setPointCount] = useState(0);\n\tconst [value, setValue] = useState(0);\n\n\tuseEffect(() => {\n\t\tconst count = hoveredCluster?.properties?.point_count;\n\t\tsetPointCount(count);\n\t}, [hoveredCluster]);\n\n\tuseEffect(() => {\n\t\tconst value = hoveredCluster?.properties?.[CLUSTERED_SELECTED_FEATURE_PROPERTY];\n\t\tsetValue(value);\n\t}, [hoveredCluster]);\n\n\tif (!hoveredCluster) return null;\n\treturn (\n\t\t\n\t\t\tCluster\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\tPoint Count:\n\t\t\t\t{pointCount}\n\t\t\t\n\t\t\t{selectedFeatureProperty && (\n\t\t\t\t\n\t\t\t\t\t{selectedFeatureProperty}:\n\t\t\t\t\t{value}\n\t\t\t\t\n\t\t\t)}\n\t\t\t\n\t\t\t\tLatitude:\n\t\t\t\t{hoveredCluster?.geometry?.coordinates?.[1]}\n\t\t\t\n\t\t\t\n\t\t\t\tLongitude:\n\t\t\t\t{hoveredCluster?.geometry?.coordinates?.[0]}\n\t\t\t\n\t\t\n\t);\n}\n\nconst Wrapper = styled.div`\n\tposition: absolute;\n\tright: 12px;\n\ttop: 12px;\n\tpadding: 12px;\n\twidth: 300px;\n\tbackground: ${Colors.WHITE};\n`;\nconst Row = styled.div`\n\tdisplay: flex;\n`;\nconst Title = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twidth: 100%;\n\tfont-size: 14px;\n`;\nconst SubTitle = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n\nconst Value = styled.div`\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n","import React, { useCallback, useState } from 'react';\nimport styled from '@emotion/styled';\nimport { Colors, Button } from '@blueprintjs/core';\nimport { useMapContext } from 'widgets/earthMap/contexts/mapContext';\nimport { useEffect } from 'react';\nimport * as turf from 'turf';\n\nexport default function FitToBoundsButton() {\n\tconst [{ rawData, map }] = useMapContext();\n\tconst [bounds, setBounds] = useState([]);\n\n\tuseEffect(() => {\n\t\tif (!rawData || !map) return;\n\t\ttry {\n\t\t\tconst bbox = turf.bbox(rawData);\n\t\t\tconst nw = [bbox[0], bbox[1]];\n\t\t\tconst se = [bbox[2], bbox[3]];\n\t\t\tconst bounds: number[][] = [nw, se];\n\t\t\tsetBounds(bounds);\n\t\t\tmap.fitBounds(bounds);\n\t\t} catch {\n\t\t\t//error\n\t\t}\n\t}, [map, rawData]);\n\n\tconst onClick = useCallback(() => {\n\t\tif (!map || !bounds) return;\n\t\tmap.fitBounds(bounds);\n\t}, [map, bounds]);\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t) : (\n\t\t\t\t\t// Primary node\n\t\t\t\t\t {\n\t\t\t\t\t\t\tsetFocusedNode(key);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ ...(isPrimary && { height, width }) }}\n\t\t\t\t\t\ttitle={`${key} (${formatNumber(value)})`}\n\t\t\t\t\t\tcy-test=\"treemap-primary-node\"\n\t\t\t\t\t>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t({formatNumber(value)})\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t))}\n\t\t\n\t);\n}\n\nconst leafStyles = (lightenNode, color) => css`\n\tbackground-color: ${lightenNode ? transparentize(0.3, color) : color};\n\ttransition: background-color 200ms ease-in-out;\n\t${lightenNode &&\n\tcss`\n\t\t&:hover {\n\t\t\tbackground-color: ${transparentize(0.7, color)};\n\t\t}\n\n\t\t/* &:active{\n\t\t\tbackground-color: ${transparentize(0.9, color)};\n\t\t} */\n\t`}\n\n\tborder: ${Colors.LIGHT_GRAY4} solid ${lightenNode ? 2 : 1}px;\n\toverflow: hidden;\n\tborder-radius: 6px;\n\tposition: absolute;\n\tcolor: white;\n`;\n\nconst textPadding = 5;\nconst transitionTime = 200;\nconst animatedTextSTyles = css`\n\ttransition: font-size ${transitionTime}ms ease-in-out, opacity ${transitionTime}ms ease-in-out;\n`;\nconst textStyles = css`\n\tfill: white;\n\tcursor: pointer;\n\toverflow: hidden;\n\n\tfont-family: ${Variables.PT_FONT_FAMILY};\n\tpadding: ${textPadding}px;\n\n\t// Used for overflow detection\n\tmax-height: 100%;\n\tmax-width: 100%;\n`;\nconst secondaryNodeStyles = css`\n\t${animatedTextSTyles};\n\tfont-size: 10px;\n\tbottom: 0;\n\tright: 0;\n\ttext-align: right;\n\tposition: absolute;\n`;\nconst primaryNodeStyles = css`\n\tdisplay: block;\n`;\n\nconst fontSizeOptions = [{ label: 20, count: 14 }, { label: 14, count: 10 }, { label: 12 }, { label: 10 }, {}];\n\nconst labelStyle = css`\n\t${animatedTextSTyles};\n\tfont-size: ${fontSizeOptions[0].label}px;\n\tdisplay: inline-block;\n`;\nconst countStyle = css`\n\t${animatedTextSTyles};\n\tfont-size: ${fontSizeOptions[0].count}px;\n\tdisplay: inline-block;\n\topacity: 0.7;\n`;\n\nconst statsWrapper = css`\n\tposition: absolute;\n\toverflow: hidden;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n`;\n\n// Utilities\nconst sleep = (time = 1000) => new Promise((r) => setTimeout(r, time));\nconst animationWait = () =>\n\tnew Promise((resolve) => {\n\t\twindow.requestAnimationFrame(resolve);\n\t});\n\n// Scales font down till it fits or is gone\nfunction useScalingFont(textContainerRef) {\n\tconst labelRef = useRef(null);\n\tconst countRef = useRef(null);\n\t// const [effectTrigger, setEffectTrigger] = useState(0);\n\n\tconst scaleFont = useCallback(() => {\n\t\t// setEffectTrigger((t) => t + 1);\n\t\tconst labelEl = labelRef.current;\n\t\tconst countEl = countRef.current;\n\n\t\tif (labelEl && countEl) {\n\t\t\t(async function () {\n\t\t\t\tlet fontIndex = 0;\n\t\t\t\tlet isOverflow = true; // blindly try the first option (important for window re-size events)\n\t\t\t\twhile (isOverflow && fontIndex <= fontSizeOptions.length - 1) {\n\t\t\t\t\t// apply fontIndex styles\n\t\t\t\t\tconst labelEl = labelRef.current;\n\t\t\t\t\tconst countEl = countRef.current;\n\n\t\t\t\t\tif (labelEl && countEl) {\n\t\t\t\t\t\tconst fontSizes = fontSizeOptions[fontIndex];\n\t\t\t\t\t\tapplyStyles(labelEl, fontSizes.label);\n\t\t\t\t\t\tapplyStyles(countEl, fontSizes.count);\n\n\t\t\t\t\t\tawait sleep(transitionTime);\n\t\t\t\t\t\tawait animationWait();\n\n\t\t\t\t\t\t// Check if we overflow\n\t\t\t\t\t\tisOverflow = getOverflow(textContainerRef);\n\t\t\t\t\t}\n\t\t\t\t\tfontIndex++;\n\t\t\t\t}\n\t\t\t})();\n\t\t}\n\t}, [textContainerRef]);\n\n\treturn { labelRef, countRef, scaleFont };\n}\n\nfunction applyStyles(el, fontSize) {\n\tlet styles = fontSize ? { fontSize: `${fontSize}px` } : { opacity: 0, fontSize: 0 };\n\tif (styles.opacity == null) {\n\t\tel.style.opacity = styles.opacity;\n\t}\n\tel.style.fontSize = styles.fontSize;\n}\n\n// Determines if stuff is overflowing from a div\nfunction useOverflowDetector() {\n\tconst textContainerRef = useRef(null);\n\t// Set to true initially so words are not shown until it is known that there\n\t// is enough space.\n\tconst [isOverflowing, setIsOverflowing] = useState(true);\n\n\tconst detectOverflow = useCallback(() => {\n\t\t(async () => {\n\t\t\tawait animationWait();\n\t\t\tconst isOverflow = getOverflow(textContainerRef);\n\t\t\tsetIsOverflowing(isOverflow);\n\t\t})();\n\t}, []);\n\n\treturn { isOverflowing, textContainerRef, detectOverflow };\n}\n\nfunction getOverflow(ref) {\n\treturn (\n\t\t!!ref.current &&\n\t\t(ref.current.scrollHeight > ref.current.offsetHeight || ref.current.scrollWidth > ref.current.offsetWidth)\n\t);\n}\n","import { HierarchyNode } from 'd3';\nimport { darken } from 'polished';\nimport { useEffect, useState } from 'react';\nimport { cloneDeep } from 'lodash';\n\ntype SRSHierarchyNode = {\n\t// TODO: add other properties\n\tkey: string;\n};\n\ntype ColorsByKey = { [key in string]: string };\n\n// create color map\nconst rootColors = [\n\t'#a11aa1',\n\t'#6e3af2',\n\t'#0b53e3',\n\t'#006aff',\n\t'#00a68d',\n\t'#009c12',\n\t'#79b500',\n\t'#d48a00',\n\t'#d96900',\n\t'#8a4c19',\n];\n\n// These were randomly generated in range [0, -.2]\nconst brightnessModifiers = [\n\t-0.19,\n\t-0.06,\n\t-0.24,\n\t-0.09,\n\t-0.18,\n\t-0.25,\n\t-0.07,\n\t-0.02,\n\t-0.12,\n\t-0.13,\n\t-0.09,\n\t-0.13,\n];\n\n// Recursively generates colors for the tree that slowly\nfunction generateChildrenColors(\n\tcolors: ColorsByKey,\n\tcolor: string,\n\tnode: HierarchyNode,\n) {\n\tnode.children?.forEach((child, j) => {\n\t\tconst rawModifier = brightnessModifiers[j % brightnessModifiers.length];\n\t\tconst modifier = Math.abs(rawModifier);\n\n\t\t// only generate a color if one isn't defined\n\t\tif (!colors[child.data.key]) {\n\t\t\tcolors[child.data.key] = darken(modifier, color);\n\t\t}\n\n\t\tif (child.children) {\n\t\t\t// pass a less darkened value down so that the overall color darkens more slowly\n\t\t\tgenerateChildrenColors(colors, darken(modifier * 0.3, color), child);\n\t\t}\n\t});\n}\n\n// Keep rotating through colors so that colors are not repeated\n// NOTE: might want to track this in react so that it persists in the component\n// instead of in the webpage.\nlet rootColorOffset = -1;\n\nfunction getRootNodeColor() {\n\trootColorOffset = (rootColorOffset + 1) % rootColors.length;\n\treturn rootColors[rootColorOffset];\n}\n\n// Creates a color map that aims to consistently color nodes even if they've\n// been filtered out and back in again.\nexport function useColorHierarchy(\n\thierarchy: HierarchyNode[],\n): ColorsByKey {\n\tconst [colorsByKey, setColorsByKey] = useState({});\n\n\t// Update the color list when initially or when new nodes are added\n\tuseEffect(() => {\n\t\tsetColorsByKey((stateColors) => {\n\t\t\tconst colors: ColorsByKey = cloneDeep(stateColors);\n\n\t\t\thierarchy.forEach((node) => {\n\t\t\t\tconst color = colors[node.data.key] ?? getRootNodeColor();\n\t\t\t\tcolors[node.data.key] = color;\n\t\t\t\tif (node.children) {\n\t\t\t\t\tgenerateChildrenColors(colors, color, node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn colors;\n\t\t});\n\t}, [hierarchy]);\n\n\treturn colorsByKey;\n}\n","import { ColorAliases, Colors } from './variables'\n\nexport const Sizes = {\n\txxsm: '0.25rem', // 4px\n\txsm: '0.33rem', // 6px\n\tsm: '0.5rem', // 8px\n\t// smd: '0.75rem', // 12px\n\tmd: '1rem', // 16px\n\t// xmd: '1.25rem', // 20px\n\tlg: '1.5rem', // 24px\n\txlg: '2rem', // 32px\n\txxlg: '2.5rem', // 40px\n\txxxlg: '3rem', // 40px\n}\n\nexport const AppColors = {\n\t...ColorAliases,\n\tBg1: Colors.WHITE, // ColorAliases.PT_APP_BACKGROUND_COLOR,\n\tBg2: Colors.LIGHT_GRAY5,\n\tBg3: Colors.LIGHT_GRAY4,\n\tinteractiveBg: `rgba(0,0,0,0)`,\n\tinteractiveBgHover: `rgba(0,0,0,0.03)`,\n\tinteractiveBgActive: `rgba(0,0,0,0.08)`,\n\tinteractiveBgSelected: `rgba(0,0,0,0.06)`,\n\tshadowGradient: `rgba(0,0,0,0.04), rgba(0,0,0,0)`,\n}\n","import { post } from 'srs-middleware';\n\n// Usage Stat handlers\n\ntype ActionNames = 'PageLoaded' | 'DocumentOpened' | 'SearchTermEntered' | \"FacetAdded\" | \"HierarchicalFacetAdded\" | 'TreeMapZoomed' | \"TimelineFilterAdded\";\ntype PayloadFunction = () => string;\ntype UsagePayload = string | PayloadFunction | null;\n\nlet isUsageEndpointAvailable = false;\n\n/**\n * Send a usage stat message to the server, if the feature is available. Pass a function as the payload to get error\n * handling for that function.\n */\nexport function sendUsageAction(actionName: ActionNames, payload: UsagePayload) {\n\tif (isUsageEndpointAvailable) {\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tawait post('/SRS/Application/SlyKit/Usage', {\n\t\t\t\t\taction: actionName,\n\t\t\t\t\tpayload: typeof payload === 'function' ? payload() : payload,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\t// We want to fail gracefully. We can safely ignore an error for this\n\t\t\t}\n\t\t})();\n\t}\n}\n\nlet hasPageLoadHappened = false;\n\n/**\n * Send the page load event and also detects if the Usage endpoint is available\n */\nexport function sendPageLoad() {\n\tif (!hasPageLoadHappened) {\n\t\thasPageLoadHappened = true;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst name: ActionNames = 'PageLoaded';\n\t\t\t\tawait post('/SRS/Application/SlyKit/Usage', {\n\t\t\t\t\taction: name,\n\t\t\t\t});\n\t\t\t\tisUsageEndpointAvailable = true;\n\t\t\t} catch (e) {\n\t\t\t\t// This is redundant but we'll just have it here in case\n\t\t\t\tisUsageEndpointAvailable = false;\n\t\t\t}\n\t\t})();\n\t}\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport * as d3 from 'd3';\nimport { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { Breadcrumbs } from '@blueprintjs/core';\nimport { Node } from './treeNode';\nimport { useColorHierarchy } from './useColorHeirarchy';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { Sizes } from 'styles/variables-slykit';\nimport { sendUsageAction } from 'utilities/usageStats';\n\nfunction getValue(d) {\n\t// d3.sum() uses the node's value plus the value of it's children\n\t// Return 0 for any parent node and 'value' for leaf nodes\n\t// Sqrt the value so that smaller things show up better\n\t// Also, sometimes the server has (d.children = []) which should be have a value of a leaf node\n\treturn d.children && d.children.length > 0 ? 0 : Math.sqrt(d.value) ?? 0;\n}\n\nexport const TREE_MAP_FILTER_KEY = 'tree map';\n\nconst leafRatio = 1.2; // higher means wider\n\nfunction getPathFromNode(node) {\n\tconst path = node\n\t\t.ancestors()\n\t\t.reverse()\n\t\t.map((d) => d.data.key)\n\t\t.filter((x) => !!x)\n\t\t.join('.');\n\treturn path;\n}\n\n/**\n * Treemap widget\n *\n * @param dimensions\n * @param data\n * @param backgroundColor\n * @returns {*}\n * @constructor\n */\nexport function TreemapWidget({\n\tdimensions,\n\tdata,\n\ttreemapProperty,\n\tfocusedNodeKey,\n\tsetFocusedNode: setFocusedNodeReact,\n}) {\n\tconst treemapWrapperRef = useRef(null);\n\n\t// Create d3 tree\n\tconst { root, treeMapDimensions, leaves, tree } = useMemo(() => {\n\t\tconst root = d3.hierarchy({ children: data.entries }).sum(getValue);\n\n\t\t// @ryan: is this okay?\n\t\tconst treeMapDimensions =\n\t\t\ttreemapWrapperRef.current != null\n\t\t\t\t? {\n\t\t\t\t\t\theight: treemapWrapperRef.current.clientHeight,\n\t\t\t\t\t\twidth: treemapWrapperRef.current.clientWidth,\n\t\t\t\t }\n\t\t\t\t: dimensions;\n\n\t\tconst tree = d3\n\t\t\t.treemap()\n\t\t\t.size([treeMapDimensions.width / leafRatio, treeMapDimensions.height])\n\t\t\t// Secondary treemap needs to have no padding\n\t\t\t// NOTE: it might be worth-while to recalculate at each level. Doing so will likely make animations very difficult to maintain\n\t\t\t.padding(0)\n\t\t\t// .padding((d) => d.depth <= 1 ? Math.pow(1 / 3, d.depth) * 5 : 0)\n\t\t\t// .paddingOuter((d) => (d.depth > 2 ? 0 : 5))\n\t\t\t.round(true)\n\t\t\t.tile(d3.treemapResquarify.ratio(1))(root);\n\n\t\tconst leaves = tree.descendants().reverse();\n\t\treturn {\n\t\t\troot,\n\t\t\ttreeMapDimensions,\n\t\t\tleaves,\n\t\t\ttree,\n\t\t};\n\t}, [data.entries, dimensions, treemapWrapperRef.current?.clientHeight]);\n\n\t// Full data for the node in focus\n\tconst focusedNode = leaves.find((x) => x.data.key === focusedNodeKey);\n\n\t// Create a filter based on the focused node\n\tconst { dispatch } = useContext(WorkspaceContext);\n\tconst setFocusedNode = useCallback(\n\t\t(key) => {\n\t\t\tif (key !== root.data.key) {\n\t\t\t\tconst newNode = leaves.find((x) => x.data.key === key);\n\t\t\t\tconst path = getPathFromNode(newNode);\n\t\t\t\t// Safety if\n\t\t\t\tif (path) {\n\t\t\t\t\tdispatch(\n\t\t\t\t\t\tWorkspaceActionCreator.updateQueryString(TREE_MAP_FILTER_KEY, {\n\t\t\t\t\t\t\t[treemapProperty]: {\n\t\t\t\t\t\t\t\t$sw: path,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t\tsendUsageAction('TreeMapZoomed', path);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatch(WorkspaceActionCreator.updateQueryString(TREE_MAP_FILTER_KEY, null));\n\t\t\t}\n\t\t\tsetFocusedNodeReact(key);\n\t\t},\n\t\t[dispatch, leaves, root.data.key, setFocusedNodeReact, treemapProperty]\n\t);\n\n\t// Clear Treemap filter if the component un-mounts\n\tuseEffect(() => {\n\t\treturn () => dispatch(WorkspaceActionCreator.updateQueryString(TREE_MAP_FILTER_KEY, null));\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\t// Set focusedNode on load or reset it if the focused node cannot be found.\n\tuseEffect(() => {\n\t\tif (!focusedNodeKey || !focusedNode) {\n\t\t\t// default to root\n\t\t\tsetFocusedNode(tree.data.key);\n\t\t}\n\t}, [focusedNode, focusedNodeKey, setFocusedNode, setFocusedNodeReact, tree]);\n\n\t// Only update the topNode after we get the new data back.\n\t// (it makes animations better). This also causes a problem when reloading\n\t// Dimensions are there for fix an error for breaking the rules of hooks\n\tconst [topNode, setTopNode] = useState(null);\n\tuseEffect(() => {\n\t\tsetTopNode(focusedNode);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [data, dimensions.width, dimensions.height]);\n\n\t// Reset topNode (like if the widget is reset)\n\tuseEffect(() => {\n\t\tif (!focusedNode?.data?.key) {\n\t\t\tsetTopNode(null);\n\t\t}\n\t}, [focusedNode]);\n\n\t// Calculate scales for zooming into the focusedNode\n\tlet x0 = 0;\n\tlet x1 = treeMapDimensions.width / leafRatio; // dividing by ratio prevents un-necessary animation\n\tlet y0 = 0;\n\tlet y1 = treeMapDimensions.height;\n\tif (topNode) {\n\t\tx0 = topNode.x0;\n\t\tx1 = topNode.x1;\n\t\ty0 = topNode.y0;\n\t\ty1 = topNode.y1;\n\t}\n\tconst xScale = d3.scaleLinear().domain([x0, x1]).range([0, treeMapDimensions.width]);\n\tconst yScale = d3.scaleLinear().domain([y0, y1]).range([0, treeMapDimensions.height]);\n\tconst focusedDepth = topNode?.depth ?? 0;\n\n\t// Deterministically generate colors\n\tconst colorsByKey = useColorHierarchy(root.children ?? []);\n\n\t// Hide un-needed leaves\n\tconst filteredLeaves = leaves.filter(\n\t\t(n) => n.depth === focusedDepth || n.depth === focusedDepth + 1 || n.depth === focusedDepth + 2\n\t);\n\n\t// Generate breadcrumb data\n\tconst breadcrumbItems =\n\t\tfocusedNode\n\t\t\t?.ancestors()\n\t\t\t.reverse()\n\t\t\t.map((node) => {\n\t\t\t\treturn {\n\t\t\t\t\ttext: node.depth === 0 ? 'All' : node.data.key,\n\t\t\t\t\tonClick: () => setFocusedNode(node.data.key),\n\t\t\t\t};\n\t\t\t}) ?? [];\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t
Zoom:
\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t{filteredLeaves.map((node) => {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tdata: { key },\n\t\t\t\t\t\t\tdepth,\n\t\t\t\t\t\t} = node;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst treemapRootStyles = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 auto;\n\twidth: 100%;\n`;\n\nconst treemapOutsideWrapperStyles = css`\n\tposition: relative;\n\tflex: 1 1 auto;\n`;\nconst treemapInsideWrapperStyles = css`\n\tposition: absolute;\n\toverflow: hidden;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n`;\nconst breadcrumbWrapperStyles = css`\n\tdisplay: flex;\n\talign-items: center;\n\tflex: 0 0 auto;\n\tmargin: 0 ${Sizes.sm} ${Sizes.sm};\n`;\n\nconst breadcrumbLabel = css`\n\tcolor: #696969;\n\tpadding-right: 5px;\n\tfont-size: 16px;\n`;\n","import { PropertyFlag } from 'srs-middleware';\nimport { path } from '../endpoints';\n\nimport { TreemapWrapper } from './wrapper';\nimport { TreemapWidgetKnobs } from './knobs';\nimport { filterProperties } from 'utilities/srsUtils';\n\nconst flags = [PropertyFlag.Hierarchical];\n\nexport const config = {\n\tkey: 'TREE_MAP',\n\tlabel: 'Treemap',\n\ticon: 'partition-graph',\n\twrapper: TreemapWrapper,\n\tendpoint: path,\n\tKnobs: TreemapWidgetKnobs,\n\tflags: [PropertyFlag.Hierarchical],\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tpathDepth: 10000, // Get the whole tree for now\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tshowAllLabels: false,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useCallback, useContext } from 'react';\nimport { TreemapWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { TREE_MAP_GROUP_BY_KEY } from 'widgets/treemap/knobs';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\n\n/**\n * ChartWrapper for the Test Widget.\n *\n * FIXME: Currently does that thing where it won't allow the parent to shrink.\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @param noDataMessage\n * @returns {*}\n * @constructor\n */\nexport function TreemapWrapper({ widgetConfiguration = {}, dimensions, data, noDataMessage=NO_DATA_MESSAGE, endpointQuery, cardIndex }) {\n\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\tconst treemapProperty = endpointQuery?.options?.propertyList?.[TREE_MAP_GROUP_BY_KEY];\n\tconst { focusedNodeKey } = widgetConfiguration;\n\n\n\tconst setFocusedNode = useCallback((focusedNodeKey) => {\n\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, { focusedNodeKey }));\n\t}, [cardIndex, dispatch]);\n\n\treturn data?.count > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\n// import { } from '/components/selectors/propertyListSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\n\nexport const TREE_MAP_GROUP_BY_KEY = 0;\nexport const TreemapWidgetKnobs = ({ cardIndex, endpointQuery, _widgetConfiguration }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n","import * as d3 from 'd3';\n\n/**\n * @param svg\n * @param updateSelection\n * @returns {{clear: clear, update}}\n * @constructor\n */\nexport function NodeLinkChart({ svg, updateSelection }) {\n\tlet initialized = false;\n\tlet zoomEvent = null;\n\tlet constantSize = false;\n\tconst defaultSize = 7;\n\tlet colorScale = null;\n\tlet savedDimensions = { height: 0, width: 0 };\n\n\t// radius scale (probably should be configurable min/max)\n\tconst radiusScale = d3.scaleSqrt().range([3, 30]);\n\n\t// the force simulation\n\tconst simulation = d3\n\t\t.forceSimulation()\n\t\t.alphaDecay(0.007)\n\t\t.force('charge', d3.forceManyBody().strength(-80))\n\t\t.force('x', d3.forceX())\n\t\t.force('y', d3.forceY());\n\n\tconst zoom = d3.zoom().scaleExtent([0.1, 10]).on('start', zoomStart).on('zoom', zoomed).on('end', zoomEnd);\n\n\tfunction ticked() {\n\t\t// update node positions\n\t\td3.select(svg)\n\t\t\t.select('.nodes')\n\t\t\t.selectAll('.node')\n\t\t\t.attr('transform', (d) => `translate(${transformX(d.x)}, ${transformY(d.y)})`);\n\n\t\t// update link positions\n\t\td3.select(svg)\n\t\t\t.select('.links')\n\t\t\t.selectAll('line')\n\t\t\t.attr('x1', (d) => transformX(d.source.x))\n\t\t\t.attr('y1', (d) => transformY(d.source.y))\n\t\t\t.attr('x2', (d) => transformX(d.target.x))\n\t\t\t.attr('y2', (d) => transformY(d.target.y));\n\n\t\t// update label positions and hide overlapping labels\n\t\tconst nodeList = {};\n\t\td3.select(svg)\n\t\t\t.select('.labels')\n\t\t\t.selectAll('.label')\n\t\t\t.attr('x', (d) => transformX(d.x))\n\t\t\t.attr('y', (d) => transformY(d.y))\n\t\t\t.attr('dy', (d) => (constantSize ? -defaultSize - 2 : -radiusScale(d.sizeValue) - 2))\n\t\t\t.classed('visible', true)\n\t\t\t.each(function (d) {\n\t\t\t\tconst bbox = d3.select(this).node().getBBox();\n\t\t\t\tif (!intersectsAny(bbox, Object.values(nodeList))) {\n\t\t\t\t\tnodeList[d.label] = bbox;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.classed('visible', (d) => !!nodeList[d.label]);\n\t}\n\n\tfunction transformX(x) {\n\t\tif (zoomEvent == null) return x;\n\t\treturn zoomEvent.transform.applyX(x);\n\t}\n\n\tfunction transformY(y) {\n\t\tif (zoomEvent == null) return y;\n\t\treturn zoomEvent.transform.applyY(y);\n\t}\n\n\tfunction inverseTransformX(x) {\n\t\tif (zoomEvent == null) return x;\n\t\treturn zoomEvent.transform.invertX(x);\n\t}\n\n\tfunction inverseTransformY(y) {\n\t\tif (zoomEvent == null) return y;\n\t\treturn zoomEvent.transform.invertY(y);\n\t}\n\n\t// ******* ZOOM HANDLERS **************\n\tfunction zoomStart() {\n\t\td3.select(svg).selectAll('.label').classed('visible', false);\n\t}\n\n\tfunction zoomed(event) {\n\t\tzoomEvent = event;\n\t\tsimulation.restart().tick();\n\t}\n\n\tfunction zoomEnd() {\n\t\tticked();\n\t}\n\n\t// ********* DRAG HANDLERS ***********\n\tfunction dragStart(event, d) {\n\t\tevent.sourceEvent.stopPropagation();\n\t\tif (!event.active) simulation.alphaTarget(0.3).restart();\n\t\td.fx = d.x;\n\t\td.fy = d.y;\n\t\td.cursor = d3.select(this).style('cursor');\n\t\td3.select(this).style('cursor', 'grab');\n\t}\n\n\tfunction dragged(event, d) {\n\t\td.fx = inverseTransformX(event.sourceEvent.offsetX);\n\t\td.fy = inverseTransformY(event.sourceEvent.offsetY);\n\t}\n\n\tfunction dragEnd(event) {\n\t\tif (!event.active) simulation.alphaTarget(0);\n\t}\n\n\t/**\n\t * Init method\n\t *\n\t * Manage the initialization of the chart, should only be called once\n\t * things which need the data, dimensions, options, or don't need to be in scope\n\t */\n\tfunction init(data, { height, width }) {\n\t\td3.select(svg).call(zoom);\n\t\td3.select(svg).append('g').classed('links', true);\n\t\td3.select(svg).append('g').classed('nodes', true);\n\t\td3.select(svg).append('g').classed('labels', true);\n\n\t\tzoomEvent = null;\n\t\tsimulation.on('tick', ticked);\n\n\t\tsavedDimensions = { height, width };\n\t\td3.select(svg).call(zoom.transform, d3.zoomIdentity.translate(width / 2, height / 2));\n\t}\n\n\t/**\n\t * Update method\n\t *\n\t * @param nodes\n\t * @param links\n\t * @param height\n\t * @param width\n\t * @param localColorScale\n\t * @param selection\n\t */\n\tfunction update({ nodes, links }, { height, width }, { colorScale: localColorScale }, selection) {\n\t\tcolorScale = localColorScale;\n\t\tconstantSize = false;\n\t\tconst extent = d3.extent(nodes, (d) => Number(d.count));\n\t\tif (extent[0] === extent[1]) constantSize = true;\n\t\tradiusScale.domain(extent);\n\n\t\t// recenter only when the size changes\n\t\tif (height !== savedDimensions.height || width !== savedDimensions.width)\n\t\t\td3.select(svg).call(\n\t\t\t\tzoom.transform,\n\t\t\t\td3.zoomIdentity.translate(width / 2, height / 2).scale(zoomEvent.transform.k)\n\t\t\t);\n\n\t\td3.select(svg)\n\t\t\t.select('.nodes')\n\t\t\t.selectAll('.node')\n\t\t\t.data(nodes, (d) => d.label)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('g')\n\t\t\t\t\t\t.classed('node', true)\n\t\t\t\t\t\t.on('click', (_, d) => {\n\t\t\t\t\t\t\tconst newValue = {\n\t\t\t\t\t\t\t\t...d,\n\t\t\t\t\t\t\t\tfx: null,\n\t\t\t\t\t\t\t\tfy: null,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (selection.includes(newValue)) {\n\t\t\t\t\t\t\t\tupdateSelection(null);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tupdateSelection(newValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseover', (event, d) => {\n\t\t\t\t\t\t\tmouseOverNode(event, d);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.on('mouseout', (event, d) => {\n\t\t\t\t\t\t\tmouseOutNode(event, d);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.call(d3.drag().on('start', dragStart).on('drag', dragged).on('end', dragEnd))\n\t\t\t\t\t\t// add the node markers\n\t\t\t\t\t\t.call((enter) => {\n\t\t\t\t\t\t\tenter\n\t\t\t\t\t\t\t\t.append('circle')\n\t\t\t\t\t\t\t\t.classed('node-circle', true)\n\t\t\t\t\t\t\t\t.attr('cy-test', 'nodeLink-data-node')\n\t\t\t\t\t\t\t\t.attr('r', (d) => (constantSize ? defaultSize : radiusScale(d.sizeValue)))\n\t\t\t\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorValue))\n\t\t\t\t\t\t\t\t.attr('stroke', (d) => (selection.includes(d) ? 'black' : 'white'))\n\t\t\t\t\t\t\t\t.attr('stroke-width', (d) => (selection.includes(d) ? 3 : 1));\n\n\t\t\t\t\t\t\treturn enter;\n\t\t\t\t\t\t}),\n\t\t\t\t(update) => {\n\t\t\t\t\tupdate\n\t\t\t\t\t\t.selectAll('.node-circle')\n\t\t\t\t\t\t.attr('r', (d) => {\n\t\t\t\t\t\t\treturn constantSize ? defaultSize : radiusScale(d.sizeValue);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorValue))\n\t\t\t\t\t\t.attr('stroke', (d) => (selection.includes(d) ? 'black' : 'white'))\n\t\t\t\t\t\t.attr('stroke-width', (d) => (selection.includes(d) ? 3 : 1));\n\n\t\t\t\t\treturn update;\n\t\t\t\t},\n\t\t\t\t(exit) => {\n\t\t\t\t\treturn exit.remove();\n\t\t\t\t}\n\t\t\t);\n\n\t\td3.select(svg)\n\t\t\t.select('.labels')\n\t\t\t.selectAll('.label')\n\t\t\t.data(nodes, (d) => d.label)\n\t\t\t.join(\n\t\t\t\t(enter) =>\n\t\t\t\t\tenter\n\t\t\t\t\t\t.append('text')\n\t\t\t\t\t\t.classed('label', true)\n\t\t\t\t\t\t.text((d) => d.label)\n\t\t\t\t\t\t.attr('fill', 'black')\n\t\t\t\t\t\t.attr('font-size', 10)\n\t\t\t\t\t\t.attr('text-anchor', 'middle'),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\t// add links\n\t\td3.select(svg)\n\t\t\t.select('.links')\n\t\t\t.attr('stroke', 'grey')\n\t\t\t.attr('opacity', 0.5)\n\t\t\t.selectAll('line')\n\t\t\t.data(links, (d) => d.key)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('line'),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\t// update the forces, data and restart the simulation\n\t\tsimulation.force(\n\t\t\t'links',\n\t\t\td3.forceLink(links).id((d) => d.id)\n\t\t);\n\n\t\tsimulation.force(\n\t\t\t'collide',\n\t\t\td3.forceCollide().radius((d) => (constantSize ? defaultSize : radiusScale(d.sizeValue)))\n\t\t);\n\n\t\tsimulation.nodes(nodes);\n\t\tsimulation.alpha(1).restart();\n\t}\n\n\t// *******************************************************************************************************************\n\n\t/**\n\t * Called the the user mouses over a node in the graph\n\t * @param event\n\t * @param d\n\t */\n\tfunction mouseOverNode(event, d) {\n\t\t// on mouse over make OTHER nodes less visible\n\t\td3.select(svg)\n\t\t\t.selectAll('.node')\n\t\t\t.filter(function (f) {\n\t\t\t\treturn d !== f;\n\t\t\t})\n\t\t\t.call(async function (s) {\n\t\t\t\ttry {\n\t\t\t\t\tconst _ = await s.select('circle').transition().duration(250).attr('fill', 'lightgrey').end();\n\t\t\t\t\tconst labels = {};\n\n\t\t\t\t\t// for each neighbor make it more visible\n\t\t\t\t\tgetNeighboringNodes(d)\n\t\t\t\t\t\t.raise()\n\t\t\t\t\t\t.call((s) => s.select('circle').attr('fill', (d) => colorScale(d.colorValue)))\n\t\t\t\t\t\t.each((d) => (labels[d.label] = ''));\n\n\t\t\t\t\td3.select(svg)\n\t\t\t\t\t\t.selectAll('.label')\n\t\t\t\t\t\t.classed('visible', (d) => labels[d.label] !== null)\n\t\t\t\t\t\t.classed('nonneighbor', (d) => labels[d.label] == null);\n\n\t\t\t\t\tconst links = getConnectedLinks(d);\n\n\t\t\t\t\t// update neighboring links to be more visible\n\t\t\t\t\tlinks.raise().attr('opacity', 1).attr('stroke-width', 2).attr('stroke', colorScale(d.colorValue));\n\n\t\t\t\t\tticked();\n\t\t\t\t\tsimulation.stop();\n\t\t\t\t} catch (e) {}\n\t\t\t});\n\t}\n\n\t/**\n\t * Called when the user mouse outs a node\n\t * @param event\n\t * @param d\n\t */\n\tfunction mouseOutNode(event, d) {\n\t\t// return everything to original state\n\t\td3.select(svg)\n\t\t\t.selectAll('.node')\n\t\t\t.call((s) => {\n\t\t\t\ts.select('circle')\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(100)\n\t\t\t\t\t.attr('fill', (d) => colorScale(d.colorValue));\n\t\t\t});\n\n\t\td3.select(svg).selectAll('.label').classed('nonneighbor', false);\n\t\tconst links = getConnectedLinks(d);\n\t\tlinks.transition().duration(100).attr('opacity', 0.5).attr('stroke-width', 1).attr('stroke', 'grey');\n\t\tticked();\n\t\tsimulation.restart();\n\t}\n\n\t/**\n\t * Returns a list of nodes which are connected to the given node\n\t * @param d\n\t * @returns {*}\n\t */\n\tconst getNeighboringNodes = (d) => {\n\t\tconst links = getConnectedLinks(d);\n\t\tconst nodeSet = new Set();\n\n\t\tnodeSet.add(d);\n\n\t\tlinks.each((link) => {\n\t\t\tnodeSet.add(link.source);\n\t\t\tnodeSet.add(link.target);\n\t\t});\n\n\t\treturn d3\n\t\t\t.select(svg)\n\t\t\t.select('.nodes')\n\t\t\t.selectAll('g')\n\t\t\t.filter(function (node) {\n\t\t\t\treturn nodeSet.has(node);\n\t\t\t});\n\t};\n\n\t/**\n\t * Returns a list of links which are connected to the given node\n\t *\n\t * @param d\n\t * @returns {*}\n\t */\n\tconst getConnectedLinks = (d) => {\n\t\treturn d3\n\t\t\t.select(svg)\n\t\t\t.select('.links')\n\t\t\t.selectAll('line')\n\t\t\t.filter(function (l) {\n\t\t\t\treturn l.source === d || l.target === d;\n\t\t\t});\n\t};\n\n\t/**\n\t * Return function, calls init the first time through and update all others\n\t * @param data\n\t * @param dimensions\n\t * @param options\n\t * @param selection\n\t */\n\tfunction externalUpdate({ data, dimensions, options, selection }) {\n\t\tif (!initialized) {\n\t\t\tinit(data, dimensions);\n\t\t\tinitialized = true;\n\t\t}\n\t\tupdate(data, dimensions, options, selection);\n\t}\n\n\t/**\n\t * Clears the state when necessary\n\t */\n\tfunction clear() {\n\t\td3.select(svg).selectAll('g').remove();\n\t\tsimulation.stop();\n\t}\n\n\treturn {\n\t\tupdate: externalUpdate,\n\t\tclear: clear,\n\t};\n}\n\n/**\n * Returns true if the given rect intersects with any in the given list of rects\n * @param test\n * @param list\n * @returns {boolean|*}\n */\nfunction intersectsAny(test, list) {\n\tif (list.length === 0) return false;\n\n\treturn list.some((l) => {\n\t\treturn intersectRect(test, l);\n\t});\n}\n\n/**\n * Tests if the two given rects intersect\n * @param r1\n * @param r2\n */\nfunction intersectRect(r1, r2) {\n\treturn !(r2.x > r1.x + r1.width || r2.x + r2.width < r1.x || r2.y > r1.y + r1.height || r2.y + r2.height < r1.y);\n}\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useMemo, useRef } from 'react';\nimport { NodeLinkChart } from './chart';\nimport { SubtitleCountRenderer } from 'components/virtualTooltip/renderers';\nimport { useChart } from 'hooks/useChart';\n\n/**\n * Renders a simple node-link diagram.\n *\n * Expects: {\n * nodes: [],\n * links: [],\n * }\n * @param {function} getColor\n * @param {object} dimensions\n * @param {object} data\n * @param widgetConfiguration\n */\nexport const NodeLink = ({ getColor, dimensions, data, widgetConfiguration }) => {\n\tconst svgRef = useRef();\n\tconst containerRef = useRef();\n\n\tconst options = useMemo(() => {\n\t\treturn { colorScale: getColor };\n\t}, [getColor]);\n\n\tconst { TooltipElement } = useChart({\n\t\tsvgRef,\n\t\tcontainerRef,\n\t\tdata,\n\t\tdimensions,\n\t\toptions,\n\t\tChart: NodeLinkChart,\n\t\trenderer: SubtitleCountRenderer,\n\t\tsupportSelection: widgetConfiguration?.supportSelection || false,\n\t});\n\n\treturn (\n\t\t\n\t\t\t{TooltipElement}\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst graphCss = css`\n\t.label {\n\t\tdisplay: none;\n\t\tpointer-events: none;\n\n\t\t&.visible {\n\t\t\tdisplay: initial;\n\t\t}\n\n\t\t&.nonneighbor {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n`;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { NodeLink } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport * as d3 from 'd3';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\ninterface Node {\n\tlabel: string;\n}\n\ninterface Link {\n\tkey: string;\n}\n\n/**\n * ChartWrapper for the physics based clustering diagram.\n *\n * Expects: [{count, labels:['term'...]}]\n * Converts: [nodes: [], links: [{source, target}]]\n *\n * @param getColorScale\n * @param dimensions\n * @param data\n * @param endpointQuery\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport function NodeLinkWrapper({ getColorScale, dimensions, data, endpointQuery, widgetConfiguration }) {\n\tconst [convertedData, setConvertedData] = useState({ nodes: [], links: [] });\n\tconst nodeDom = useRef(d3.create('div'));\n\tconst linkDom = useRef(d3.create('div'));\n\n\tuseEffect(() => {\n\t\t// empty data is \"valid\" and different than null.\n\t\tif (data?.length === 0) {\n\t\t\tsetConvertedData({ nodes: [], links: [] });\n\t\t}\n\n\t\t// the data is null, or in the wrong shape...so we exit\n\t\tif (!data || !data?.nodes) return;\n\n\t\tconst existingNodes = {};\n\t\tnodeDom.current\n\t\t\t.selectAll('div')\n\t\t\t.data()\n\t\t\t.forEach((d: Node) => (existingNodes[d.label] = d));\n\n\t\tconst nodes = {};\n\t\tconst links = {};\n\n\t\t// for each entry, create a node, keys are the labels\n\t\tdata.nodes.forEach(({ label, connections, metadata }) => {\n\t\t\tlet sizeValue;\n\t\t\tconst mdSizeKey = endpointQuery?.meta?.['Size Nodes By'];\n\t\t\tconst mdSizeValue = metadata?.[mdSizeKey];\n\n\t\t\t// there are three choices for sizing: none, size by connections, or by property\n\t\t\tif (widgetConfiguration?.sizeByConnection) {\n\t\t\t\tsizeValue = connections;\n\t\t\t} else if (!widgetConfiguration?.sizeByConnection && mdSizeKey && mdSizeValue) {\n\t\t\t\tsizeValue = mdSizeValue || 0;\n\t\t\t} else {\n\t\t\t\tsizeValue = 0;\n\t\t\t}\n\n\t\t\t// here we need to support changing what value is used for the size property\n\t\t\tconst existing = existingNodes[label];\n\t\t\tif (existing) {\n\t\t\t\texisting.sizeValue = sizeValue;\n\t\t\t\tnodes[label] = existing;\n\t\t\t} else {\n\t\t\t\tnodes[label] = { label, sizeValue: sizeValue };\n\t\t\t}\n\t\t});\n\n\t\t// handle color value settings\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\t// sequential scale uses only the index\n\t\t\tgetColorScale.domain([0, data.nodes.length || 0]);\n\t\t\tdata.nodes.forEach((d, index) => {\n\t\t\t\tnodes[d.label].colorValue = index;\n\t\t\t});\n\t\t} else {\n\t\t\t// need to acquire the keys and there are two choices, either the key itself or a metadata value\n\t\t\tgetColorScale.domain(data.nodes.map((d) => d.label));\n\t\t\tdata.nodes.forEach((d) => {\n\t\t\t\tnodes[d.label].colorValue = d.label;\n\t\t\t});\n\t\t}\n\n\t\t// for each edge, create a link to the nodes\n\t\tdata.edges.forEach(({ node1, node2 }) => {\n\t\t\tconst key = `${node1}^${node2}`;\n\t\t\tif (nodes[node1] && nodes[node2]) {\n\t\t\t\tlinks[key] = { source: nodes[node1], target: nodes[node2], key: key };\n\t\t\t}\n\t\t});\n\n\t\t// poorly done implementation to update what exists and remove what doesn't\n\t\tnodeDom.current\n\t\t\t.selectAll('div')\n\t\t\t.data(Object.values(nodes), (d: Node) => d.label)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('div').text((d: Node) => d.label),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\tlinkDom.current\n\t\t\t.selectAll('div')\n\t\t\t.data(Object.values(links), (d: Link) => d.key)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('div').text((d: Link) => d.key),\n\t\t\t\t(update) => update,\n\t\t\t\t(exit) => exit.remove()\n\t\t\t);\n\n\t\tsetConvertedData({\n\t\t\tnodes: nodeDom.current.selectAll('div').data(),\n\t\t\tlinks: linkDom.current.selectAll('div').data(),\n\t\t});\n\t}, [data, widgetConfiguration, endpointQuery, getColorScale]);\n\n\treturn convertedData?.nodes?.length > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport { WidgetBooleanSelector } from 'components/selectors/widgetBooleanSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param widgetConfiguration\n * @param types\n * @returns {*}\n * @constructor\n */\nexport const BipartiteGraphKnobs = ({ cardIndex, endpointQuery, widgetConfiguration, types }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'minConnections'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'maxNodes'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","import { NodeLinkWrapper } from './wrapper';\nimport { BipartiteGraphKnobs } from './edgeGraphKnobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { graph } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\nconst types = [SrsPropertyType.String];\n\nexport const config = {\n\tkey: 'BIPARTITE_GRAPH',\n\tlabel: 'Edge-based Graph',\n\ticon: 'graph',\n\twrapper: NodeLinkWrapper,\n\tendpoint: graph,\n\tKnobs: BipartiteGraphKnobs,\n\tflags: flags,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxNodes: 1000,\n\t\t\t\t\tminConnections: 1,\n\t\t\t\t\tmetadata: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: () => {\n\t\treturn {\n\t\t\tsizeByConnection: false,\n\t\t\tcolorScale: DefaultChartColorScales['Single Color'],\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags, types).length >= 2;\n\t},\n};\n","import { NodeLinkWrapper } from './wrapper';\nimport { ClusterGraphKnobs } from './clusterGraphKnobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { clusterGraph } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Multivalued];\nconst types = [SrsPropertyType.String];\n\nexport const config = {\n\tkey: 'CLUSTER_GRAPH',\n\tlabel: 'Cluster Graph',\n\ticon: 'graph',\n\twrapper: NodeLinkWrapper,\n\tendpoint: clusterGraph,\n\tKnobs: ClusterGraphKnobs,\n\tflags: flags,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxNodes: 1000,\n\t\t\t\t\tminConnections: 1,\n\t\t\t\t\tmetadata: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: () => {\n\t\treturn {\n\t\t\tsizeByConnection: false,\n\t\t\tcolorScale: DefaultChartColorScales['Single Color'],\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags, types).length >= 1;\n\t},\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport { WidgetBooleanSelector } from 'components/selectors/widgetBooleanSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param widgetConfiguration\n * @param types\n * @returns {*}\n * @constructor\n */\nexport const ClusterGraphKnobs = ({ cardIndex, endpointQuery, widgetConfiguration, types }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'minConnections'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'maxNodes'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","import { NodeLinkWrapper } from './wrapper';\nimport { NetworkGraphKnobs } from './nodeGraphKnobs';\nimport { PropertyType as SrsPropertyType, PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { nodeGraph } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\n\nconst flags = [SrsPropertyFlag.Categorical];\nconst types = [SrsPropertyType.String];\n\nexport const config = {\n\tkey: 'NETWORK_GRAPH',\n\tlabel: 'Node-based Graph',\n\ticon: 'graph',\n\twrapper: NodeLinkWrapper,\n\tendpoint: nodeGraph,\n\tKnobs: NetworkGraphKnobs,\n\tflags: flags,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name, filteredProperties[1].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxNodes: 1000,\n\t\t\t\t\tminConnections: 1,\n\t\t\t\t\tmetadata: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: () => {\n\t\treturn {\n\t\t\tsizeByConnection: false,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags, types).length >= 2;\n\t},\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyFlag as SrsPropertyFlag, PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { EndpointPropertyArraySelector } from 'components/selectors/endpointPropertyArraySelector';\nimport { WidgetBooleanSelector } from 'components/selectors/widgetBooleanSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param widgetConfiguration\n * @param types\n * @returns {*}\n * @constructor\n */\nexport const NetworkGraphKnobs = ({ cardIndex, endpointQuery, widgetConfiguration, types }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'minConnections'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t String(item)}\n\t\t\t\t\t\t\t\toptionToValue={(item) => item}\n\t\t\t\t\t\t\t\tendpointQuery={endpointQuery}\n\t\t\t\t\t\t\t\tpropertyName={'maxNodes'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","const MAP_MODES = {\n\tCHOROPLETH: 'CHOROPLETH',\n};\n\nexport const DEFAULT_MODE = MAP_MODES.CHOROPLETH;\n\nexport default MAP_MODES;\n","import React, { ReactNode, createContext, useContext, useState, useRef } from 'react';\nimport { DEFAULT_MODE } from '../constants/mapModes';\n\ninterface IVariables {\n\tmap?: any;\n\tmapRef?: any;\n\tselectedFeatureProperty?: any;\n\thoveredFeature?: any;\n\tmapMode?: string;\n}\n\ninterface IFunctions {\n\tsetMap?: any;\n\tsetSelectedFeatureProperty?: any;\n\tsetHoveredFeature?: any;\n\tsetMapMode?: any;\n}\n\nconst MapContext = createContext<[IVariables, IFunctions]>([{}, {}]);\n\ninterface IProvider {\n\tchildren: ReactNode;\n}\nexport const MapProvider = (props: IProvider) => {\n\tconst [map, setMap] = useState();\n\tconst mapRef = useRef();\n\tconst [selectedFeatureProperty, setSelectedFeatureProperty] = useState('Demo Property');\n\tconst [hoveredFeature, setHoveredFeature] = useState(undefined);\n\tconst [mapMode, setMapMode] = useState(DEFAULT_MODE);\n\n\tconst value: [IVariables, IFunctions] = [\n\t\t{\n\t\t\tmap,\n\t\t\tmapRef,\n\t\t\tselectedFeatureProperty,\n\t\t\thoveredFeature,\n\t\t\tmapMode,\n\t\t},\n\t\t{\n\t\t\tsetMap,\n\t\t\tsetSelectedFeatureProperty,\n\t\t\tsetHoveredFeature,\n\t\t\tsetMapMode,\n\t\t},\n\t];\n\n\treturn ;\n};\n\nexport const useMapContext = () => {\n\tconst context = useContext(MapContext);\n\tif (!context) {\n\t\tthrow new Error('useMapContext must be used within a MapProvider');\n\t}\n\treturn context;\n};\n","import { Colors } from '@blueprintjs/core';\n\nconst COLORS = ['#1F4B99', '#578FA1', '#BACBA1', '#F2BE75', '#CD7534', '#9E2B0E'];\nexport default COLORS;\n\nexport const NO_VALUE_COLOR = Colors.GRAY1;\nexport const LINE_COLOR = Colors.WHITE;\n","import React, { ReactNode, createContext, useContext, useState, useEffect } from 'react';\nimport IColorInfo from '../interfaces/IColorInfo';\nimport * as d3 from 'd3';\nimport IChoroplethColors from '../interfaces/IChoroplethColors';\nimport COLORS, { NO_VALUE_COLOR } from '../constants/colors';\n\ninterface IVariables {\n\tchoroplethData?: any;\n\tmin?: number;\n\tmax?: number;\n\thoveredPolygon?: any;\n\tchoroplethColorInfo?: IColorInfo[];\n\tchoroplethColors?: any;\n\tchoroplethOpacityValues?: any;\n}\n\ninterface IFunctions {\n\tsetHoveredPolygon?: any;\n\tsetChoroplethColorInfo?: any;\n\tsetChoroplethData?: any;\n}\n\nconst ChoroplethContext = createContext<[IVariables, IFunctions]>([{}, {}]);\n\ninterface IProvider {\n\tchildren: ReactNode;\n}\nexport const ChoroplethProvider = (props: IProvider) => {\n\tconst [choroplethData, setChoroplethData] = useState();\n\tconst [hoveredPolygon, setHoveredPolygon] = useState();\n\tconst [choroplethColorInfo, setChoroplethColorInfo] = useState();\n\tconst [min, setMin] = useState(0);\n\tconst [max, setMax] = useState(0);\n\tconst [choroplethColors, setChoroplethColors] = useState({});\n\tconst [choroplethOpacityValues, setChoroplethOpacityValues] = useState();\n\n\tuseEffect(() => {\n\t\tconst values: number[] = Object.values(choroplethData ?? {}) ?? [];\n\t\tconst extent = d3.extent(values);\n\t\tconst min = extent?.[0];\n\t\tconst max = extent?.[1];\n\t\tsetMin(min);\n\t\tsetMax(max);\n\t}, [choroplethData]);\n\n\tuseEffect(() => {\n\t\tconst rtn: any = ['match', ['get', 'TagId'], hoveredPolygon?.properties?.TagId ?? -1, 0.7];\n\t\tObject.keys(choroplethData ?? {}).forEach((key: string) => {\n\t\t\tconst value = choroplethData[key];\n\t\t\tif ((value !== 0 && Number(key) !== hoveredPolygon?.properties?.TagId) ?? -1) {\n\t\t\t\trtn.push(Number(key));\n\t\t\t\trtn.push(0.3);\n\t\t\t}\n\t\t});\n\t\trtn.push(0.3);\n\t\tsetChoroplethOpacityValues(rtn);\n\t}, [choroplethData, hoveredPolygon]);\n\n\tuseEffect(() => {\n\t\tlet difference = max - min;\n\t\tif (difference < 6 || isNaN(min) || isNaN(max)) difference = 6;\n\t\tconst step = Math.ceil(difference / 6);\n\t\tlet rtn: IColorInfo[] = [];\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst value = step * i + min;\n\t\t\tconst maxValue = value + step - 1;\n\t\t\trtn.push({ maxValue: maxValue, minValue: value, color: COLORS[i] });\n\t\t}\n\t\trtn = rtn.sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return 1;\n\t\t\telse if (a.maxValue > b.maxValue) return -1;\n\t\t\telse return 0;\n\t\t});\n\t\tsetChoroplethColorInfo(rtn);\n\t}, [min, max]);\n\n\tuseEffect(() => {}, []);\n\n\tuseEffect(() => {\n\t\tconst rtn: any = ['match', ['get', 'TagId']];\n\t\tObject.keys(choroplethData ?? {}).forEach((tagId: string) => {\n\t\t\tconst value = Number(choroplethData[tagId]);\n\t\t\tlet index = 0;\n\t\t\tfor (index = 0; index < choroplethColorInfo.length; index++) {\n\t\t\t\tif (value <= choroplethColorInfo[index].maxValue && value >= choroplethColorInfo[index].minValue) {\n\t\t\t\t\trtn.push(Number(tagId));\n\t\t\t\t\trtn.push(choroplethColorInfo[index].color);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\trtn.push(NO_VALUE_COLOR);\n\t\tsetChoroplethColors(rtn);\n\t}, [min, max, choroplethData, choroplethColorInfo]);\n\n\tconst value: [IVariables, IFunctions] = [\n\t\t{\n\t\t\tchoroplethData,\n\t\t\tmin,\n\t\t\tmax,\n\t\t\thoveredPolygon,\n\t\t\tchoroplethColorInfo,\n\t\t\tchoroplethColors,\n\t\t\tchoroplethOpacityValues,\n\t\t},\n\t\t{\n\t\t\tsetHoveredPolygon,\n\t\t\tsetChoroplethColorInfo,\n\t\t\tsetChoroplethData,\n\t\t},\n\t];\n\n\treturn ;\n};\n\nexport const useChoroplethContext = () => {\n\tconst context = useContext(ChoroplethContext);\n\tif (!context) {\n\t\tthrow new Error('useChorplethContext must be used within a ChoroplethProvider');\n\t}\n\treturn context;\n};\n","export const CHOROPLETH_COUNTRY_SOURCE = 'CHOROPLETH_COUNTRY_SOURCE';\nexport const CHOROPLETH_STATE_SOURCE = 'CHOROPLETH_STATE_SOURCE';\n\nexport const SELECTED_FEATURE_PROPERTY = 'SELECTED_FEATURE_PROPERTY';\n\nexport const SOURCE_LAYERS = {\n\tCOUNTRIES: 'countries',\n\tSTATES: 'admin1',\n};\n","const CHOROPLETH_STYLES = {\n\tOPACITY: {\n\t\tDEFAULT: 0.5,\n\t\tHOVERED: 0.7,\n\t\tUNHOVERED: 0.5,\n\t},\n};\n\nexport default CHOROPLETH_STYLES;\n","export const LAYER_NAMES = {\n\t//CHOROPLETH LAYERS\n\t//TOP\n\tCOUNTRY_OUTLINE_LAYER: 'COUNTRY_OUTLINE_LAYER',\n\tSTATE_OUTLINE_LAYER: 'STATE_OUTLINE_LAYER',\n\tCHOROPLETH_COUNTRY_LAYER: 'CHOROPLETH_COUNTRY_LAYER',\n\tCHOROPLETH_STATE_LAYER: 'CHOROPLETH_STATE_LAYER',\n\t//BOTTOM\n};\n","import { LAYER_NAMES } from './layerNames';\n\nconst LAYER_ORDER = [\n\t//BOTTOM\n\tLAYER_NAMES.CHOROPLETH_STATE_LAYER,\n\tLAYER_NAMES.CHOROPLETH_COUNTRY_LAYER,\n\tLAYER_NAMES.STATE_OUTLINE_LAYER,\n\tLAYER_NAMES.COUNTRY_OUTLINE_LAYER,\n\t'country-label',\n\t//TOP\n];\n\nexport default LAYER_ORDER;\n","import LAYER_ORDER from '../constants/layerOrder';\n\nexport default function getChoroplethParentLayer({ layerName }: { layerName: string }) {\n\tconst index = LAYER_ORDER.indexOf(layerName);\n\treturn LAYER_ORDER[index + 1];\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport CHOROPLETH_STYLES from 'widgets/choroplethMap/constants/choroplethConstants';\nimport usePolygonHover from './usePolygonHover';\nimport useIsVisible from './useIsVisible';\nimport useChoroplethFillColor from './useChoroplethFillColor';\nimport getChoroplethParentLayer from 'widgets/choroplethMap/helpers/getChoroplethParentLayer';\n\n// source-layers: countries, admin1\n\nexport default function usePolygonLayer({\n\tsourceName,\n\tlayerName,\n\tsourceLayer,\n\tminzoom,\n\tmaxzoom,\n}: {\n\tsourceName: string;\n\tlayerName: string;\n\tsourceLayer: string;\n\tminzoom: number;\n\tmaxzoom: number;\n}) {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: layerName,\n\t\t\t\ttype: 'fill',\n\t\t\t\tsource: sourceName,\n\t\t\t\t'source-layer': sourceLayer,\n\t\t\t\tlayout: {},\n\t\t\t\tpaint: {\n\t\t\t\t\t'fill-color': 'blue',\n\t\t\t\t\t'fill-opacity': CHOROPLETH_STYLES.OPACITY.DEFAULT,\n\t\t\t\t},\n\t\t\t\tminzoom,\n\t\t\t\tmaxzoom,\n\t\t\t},\n\t\t\tgetChoroplethParentLayer({ layerName })\n\t\t);\n\t}, [map, sourceName, layerName, maxzoom, minzoom, sourceLayer]);\n\n\tusePolygonHover({ layerName: layerName, sourceName: sourceName, minzoom, maxzoom });\n\tuseIsVisible({ layerName });\n\tuseChoroplethFillColor({ sourceName, layerName });\n}\n","import { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport { useEffect, useCallback } from 'react';\nimport { useChoroplethContext } from 'widgets/choroplethMap/contexts/choroplethContext';\n\nexport default function usePolygonHover({\n\tsourceName,\n\tlayerName,\n\tminzoom,\n\tmaxzoom,\n}: {\n\tsourceName: string;\n\tlayerName: string;\n\tminzoom: number;\n\tmaxzoom: number;\n}) {\n\tconst [{ map }] = useMapContext();\n\tconst [{ hoveredPolygon, choroplethOpacityValues }, { setHoveredPolygon }] = useChoroplethContext();\n\n\tconst isListening = useCallback(() => {\n\t\tconst zoom = map.getZoom();\n\t\tif (zoom <= maxzoom && zoom >= minzoom) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}, [map, minzoom, maxzoom]);\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst onMouseMove = (e: any) => {\n\t\t\tif (!isListening()) return;\n\t\t\tconst features = map.queryRenderedFeatures(e.point, { layers: [layerName] });\n\t\t\tconst feature = features[0];\n\t\t\tsetHoveredPolygon(feature);\n\t\t};\n\t\tmap.on('mousemove', onMouseMove);\n\t\treturn () => {\n\t\t\tmap.off('mousemove', onMouseMove);\n\t\t};\n\t}, [map, isListening, layerName, setHoveredPolygon, sourceName]);\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tmap.setPaintProperty(layerName, 'fill-opacity', choroplethOpacityValues ?? 0.5);\n\t}, [hoveredPolygon, map, choroplethOpacityValues, layerName]);\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport MAP_MODES from 'widgets/choroplethMap/constants/mapModes';\n\nexport default function useIsVisible({ layerName }: { layerName: string }) {\n\tconst [{ map, mapMode }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\tconst visibility = mapMode === MAP_MODES.CHOROPLETH ? 'visible' : 'none';\n\t\tmap.setLayoutProperty(layerName, 'visibility', visibility);\n\t}, [mapMode, map, layerName]);\n}\n","import { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport { useEffect } from 'react';\nimport { useChoroplethContext } from 'widgets/choroplethMap/contexts/choroplethContext';\n\nexport default function useChoroplethFillColor({ sourceName, layerName }: { sourceName: string; layerName: string }) {\n\tconst [{ map }] = useMapContext();\n\tconst [{ choroplethColors }] = useChoroplethContext();\n\n\t//fill color\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst source = map.getSource(sourceName);\n\t\tif (!source) return;\n\t\tconst layer = map.getLayer(layerName);\n\t\tif (!layer) return;\n\t\ttry {\n\t\t\tmap.setPaintProperty(layerName, 'fill-color', choroplethColors);\n\t\t} catch {\n\t\t\t//error\n\t\t}\n\t}, [map, sourceName, layerName, choroplethColors]);\n}\n","import { useEffect } from 'react';\nimport { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport getChoroplethParentLayer from 'widgets/choroplethMap/helpers/getChoroplethParentLayer';\nimport { Colors } from '@blueprintjs/core';\n\n// source-layers: countries, admin1\n\nexport default function useOutlineLayer({\n\tsourceName,\n\tlayerName,\n\tsourceLayer,\n\tminzoom,\n\tmaxzoom,\n}: {\n\tsourceName: string;\n\tlayerName: string;\n\tsourceLayer: string;\n\tminzoom: number;\n\tmaxzoom: number;\n}) {\n\tconst [{ map }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tmap.addLayer(\n\t\t\t{\n\t\t\t\tid: layerName,\n\t\t\t\ttype: 'line',\n\t\t\t\tsource: sourceName,\n\t\t\t\t'source-layer': sourceLayer,\n\t\t\t\tlayout: {},\n\t\t\t\tpaint: {\n\t\t\t\t\t'line-color': Colors.BLACK,\n\t\t\t\t\t'line-opacity': 0.7,\n\t\t\t\t\t'line-width': 1,\n\t\t\t\t},\n\t\t\t\tminzoom,\n\t\t\t\tmaxzoom,\n\t\t\t},\n\t\t\tgetChoroplethParentLayer({ layerName })\n\t\t);\n\t}, [map, sourceName, layerName, maxzoom, minzoom, sourceLayer]);\n\n\t// usePolygonHover({ layerName: layerName, sourceName: sourceName, minzoom, maxzoom });\n\t// useIsVisible({ layerName });\n\t// useChoroplethFillColor({ sourceName, layerName });\n}\n","import useChoroplethSource from './useChoroplethSource';\nimport usePolygonLayer from './usePolygonLayer';\nimport {\n\tCHOROPLETH_COUNTRY_SOURCE,\n\tCHOROPLETH_STATE_SOURCE,\n\tSOURCE_LAYERS,\n} from 'widgets/choroplethMap/constants/mapConstants';\nimport { LAYER_NAMES } from 'widgets/choroplethMap/constants/layerNames';\nimport useOutlineLayer from './useOutlineLayer';\n\nexport default function useChoroplethHooks() {\n\tuseChoroplethSource();\n\tuseOutlineLayer({\n\t\tsourceName: CHOROPLETH_COUNTRY_SOURCE,\n\t\tlayerName: LAYER_NAMES.COUNTRY_OUTLINE_LAYER,\n\t\tsourceLayer: SOURCE_LAYERS.COUNTRIES,\n\t\tminzoom: 0,\n\t\tmaxzoom: 4,\n\t});\n\tuseOutlineLayer({\n\t\tsourceName: CHOROPLETH_STATE_SOURCE,\n\t\tlayerName: LAYER_NAMES.STATE_OUTLINE_LAYER,\n\t\tsourceLayer: SOURCE_LAYERS.STATES,\n\t\tminzoom: 4,\n\t\tmaxzoom: 22,\n\t});\n\tusePolygonLayer({\n\t\tsourceName: CHOROPLETH_COUNTRY_SOURCE,\n\t\tlayerName: LAYER_NAMES.CHOROPLETH_COUNTRY_LAYER,\n\t\tsourceLayer: SOURCE_LAYERS.COUNTRIES,\n\t\tminzoom: 0,\n\t\tmaxzoom: 4,\n\t});\n\tusePolygonLayer({\n\t\tsourceName: CHOROPLETH_STATE_SOURCE,\n\t\tlayerName: LAYER_NAMES.CHOROPLETH_STATE_LAYER,\n\t\tsourceLayer: SOURCE_LAYERS.STATES,\n\t\tminzoom: 4,\n\t\tmaxzoom: 22,\n\t});\n\t// usePolygonHover();\n}\n","import { useMapContext } from '../../contexts/mapContext';\nimport { useEffect } from 'react';\nimport { CHOROPLETH_COUNTRY_SOURCE, CHOROPLETH_STATE_SOURCE } from '../../constants/mapConstants';\n\nexport default function useChoroplethSource() {\n\tconst [{ map }] = useMapContext();\n\n\t//country source\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst oldSource = map.getSource(CHOROPLETH_COUNTRY_SOURCE);\n\t\tif (oldSource) map.removeSource(CHOROPLETH_COUNTRY_SOURCE);\n\t\tmap.addSource(CHOROPLETH_COUNTRY_SOURCE, {\n\t\t\ttype: 'vector',\n\t\t\ttiles: ['https://hagar.pnl.gov/VectorTiles/Country/{z}/{x}/{y}.pbf'],\n\t\t\tgenerateId: true,\n\t\t});\n\t\treturn () => {};\n\t}, [map]);\n\n\t//state source\n\tuseEffect(() => {\n\t\tif (!map) return;\n\t\tconst oldSource = map.getSource(CHOROPLETH_STATE_SOURCE);\n\t\tif (oldSource) map.removeSource(CHOROPLETH_STATE_SOURCE);\n\t\tmap.addSource(CHOROPLETH_STATE_SOURCE, {\n\t\t\ttype: 'vector',\n\t\t\ttiles: ['https://hagar.pnl.gov/VectorTiles/Admin1/{z}/{x}/{y}.pbf'],\n\t\t\tgenerateId: true,\n\t\t});\n\t\treturn () => {};\n\t}, [map]);\n}\n","import React from 'react';\nimport styled from '@emotion/styled';\n\ninterface IProps {\n\tspace: string;\n\tisVertical: boolean;\n}\n\nexport default function Space({ space, isVertical }: IProps) {\n\treturn ;\n}\n\nconst Wrapper = styled.div`\n\tpadding-top: ${(props: IProps) => (props.isVertical ? props.space : 0)};\n\tpadding-left: ${(props: IProps) => (props.isVertical ? 0 : props.space)};\n`;\n","import React from 'react';\nimport styled from '@emotion/styled';\nimport { Colors } from '@blueprintjs/core';\ninterface IProps {\n\tisVertical: boolean;\n}\n\nexport default function Line({ isVertical }) {\n\treturn ;\n}\n\nconst Wrapper = styled.div`\n\tbackground: ${Colors.BLACK};\n\theight: ${(props: IProps) => (props.isVertical ? '100%' : '1px')};\n\twidth: ${(props: IProps) => (props.isVertical ? '1px' : '100%')};\n`;\n","import React, { useState, useEffect } from 'react';\nimport styled from '@emotion/styled';\nimport { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport { Colors } from '@blueprintjs/core';\nimport { SELECTED_FEATURE_PROPERTY } from 'widgets/choroplethMap/constants/mapConstants';\nimport Space from '../../Space';\nimport Line from '../../Line';\nimport * as turf from '@turf/turf';\nimport commaSeparate from 'widgets/choroplethMap/helpers/numberFormatters/commaSeperate';\nimport { useChoroplethContext } from 'widgets/choroplethMap/contexts/choroplethContext';\n\nexport default function Modal() {\n\tconst [{ selectedFeatureProperty }] = useMapContext();\n\tconst [{ hoveredPolygon, choroplethData }] = useChoroplethContext();\n\tconst [pointCount, setPointCount] = useState(0);\n\tconst [value, setValue] = useState(0);\n\tconst [latitude, setLatitude] = useState();\n\tconst [longitude, setLongitude] = useState();\n\n\tuseEffect(() => {\n\t\tif (!hoveredPolygon) return;\n\t\tconst center = turf.center(hoveredPolygon);\n\t\tconst latitude = center?.geometry?.coordinates?.[1];\n\t\tconst longitude = center?.geometry?.coordinates?.[0];\n\t\tsetLongitude(longitude);\n\t\tsetLatitude(latitude);\n\t}, [hoveredPolygon]);\n\n\tuseEffect(() => {\n\t\tconst tagId = hoveredPolygon?.properties?.['TagId'];\n\t\tsetPointCount(Number(choroplethData?.[tagId] ?? 0));\n\t}, [hoveredPolygon, choroplethData]);\n\n\tuseEffect(() => {\n\t\tconst value = hoveredPolygon?.properties?.[SELECTED_FEATURE_PROPERTY];\n\t\tsetValue(value);\n\t}, [hoveredPolygon]);\n\n\tif (!hoveredPolygon) return null;\n\treturn (\n\t\t\n\t\t\tChoropleth\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{selectedFeatureProperty ? selectedFeatureProperty + ':' : 'Point Count:'}\n\t\t\t\t{commaSeparate(pointCount)}\n\t\t\t\n\t\t\t\n\t\t\t\tLatitude:\n\t\t\t\t{latitude}\n\t\t\t\n\t\t\t\n\t\t\t\tLongitude:\n\t\t\t\t{longitude}\n\t\t\t\n\t\t\n\t);\n}\n\nconst Wrapper = styled.div`\n\tposition: absolute;\n\tright: 12px;\n\ttop: 12px;\n\tpadding: 12px;\n\twidth: 300px;\n\tbackground: ${Colors.WHITE};\n`;\nconst Row = styled.div`\n\tdisplay: flex;\n`;\nconst Title = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twidth: 100%;\n\tfont-size: 14px;\n`;\nconst SubTitle = styled.div`\n\tfont-weight: bold;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n\nconst Value = styled.div`\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tflex: 1;\n\tfont-size: 12px;\n`;\n","import numeral from 'numeral';\n\nexport default function commaSeparate(num: number) {\n\ttry {\n\t\treturn numeral(num).format('0,0');\n\t} catch {\n\t\treturn 0;\n\t}\n}\n","import React, { useMemo, useState, useEffect } from 'react';\nimport styled from '@emotion/styled';\nimport { useMapContext } from 'widgets/choroplethMap/contexts/mapContext';\nimport { Colors } from '@blueprintjs/core';\nimport IColorInfo from 'widgets/choroplethMap/interfaces/IColorInfo';\nimport numeral from 'numeral';\nimport MAP_MODES from 'widgets/choroplethMap/constants/mapModes';\nimport { useChoroplethContext } from 'widgets/choroplethMap/contexts/choroplethContext';\n\nconst tickFormatter = (value: number) => {\n\tif (isNaN(value)) return 'NaN';\n\telse if (value === Infinity) return 'Inf';\n\treturn numeral(value).format('0.[00]a');\n};\n\nexport default function Legend() {\n\tconst [{ mapMode }] = useMapContext();\n\tconst [{ choroplethColorInfo }] = useChoroplethContext();\n\tconst [legendData, setLegendData] = useState([]);\n\n\tuseEffect(() => {\n\t\tsetLegendData(choroplethColorInfo ?? []);\n\t}, [mapMode, choroplethColorInfo]);\n\n\tconst sortedColorInfo = useMemo(() => {\n\t\treturn [...legendData].sort((a: IColorInfo, b: IColorInfo) => {\n\t\t\tif (a.maxValue < b.maxValue) return 1;\n\t\t\telse if (a.maxValue > b.maxValue) return -1;\n\t\t\telse return 0;\n\t\t});\n\t}, [legendData]);\n\n\tif (mapMode !== MAP_MODES.CHOROPLETH) return null;\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t{sortedColorInfo?.map((info: IColorInfo, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{sortedColorInfo.map((info: IColorInfo, index: number) => (\n\t\t\t\t\t\n\t\t\t\t\t\t{tickFormatter(info.maxValue)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t{tickFormatter(sortedColorInfo?.[sortedColorInfo?.length - 1]?.minValue)}\n\t\t\t\n\t\t\n\t);\n}\nconst TickLabel = styled.div`\n\theight: 13px;\n\tdisplay: flex;\n\talign-items: center;\n\tfont-size: 8px;\n`;\n\nconst InnerWrapper = styled.div`\n\tposition: relative;\n`;\n\ninterface ISpace {\n\tspace: string;\n}\nconst VerticalSpace = styled.div`\n\tpadding-top: ${(props: ISpace) => props.space};\n`;\nconst HorizontalSpace = styled.div`\n\tpadding-left: ${(props: ISpace) => props.space};\n`;\n\nconst Wrapper = styled.div`\n\tposition: absolute;\n\tright: 12px;\n\tbottom: 12px;\n\tpadding: 12px;\n\tbackground: ${Colors.WHITE};\n\tdisplay: flex;\n`;\n\nconst Tick = styled.div`\n\twidth: 15px;\n\theight: 1px;\n\tbackground: ${Colors.BLACK};\n`;\n\ninterface IColorBlock {\n\tblockColor: string;\n}\nconst ColorBlock = styled.div`\n\tbackground: ${(props: IColorBlock) => props.blockColor};\n\theight: 20px;\n\twidth: 10px;\n`;\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport { useEffect } from 'react';\n\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport useMap from '../../hooks/useMap';\nimport { useMapContext } from '../../contexts/mapContext';\nimport useSizeProperty from 'widgets/choroplethMap/hooks/useSizeProperty';\nimport useChoroplethHooks from 'widgets/choroplethMap/hooks/choropleth/useChoroplethHooks';\nimport Modal from './Modal';\nimport Legend from './Legend';\nimport { useChoroplethContext } from 'widgets/choroplethMap/contexts/choroplethContext';\n\nexport const ChoroplethMapWidget = ({\n\tdata, // geojson object\n\tendpointQuery,\n}) => {\n\tconst [{ mapRef }] = useMapContext();\n\tconst { setChoroplethData } = useChoroplethContext()[1];\n\n\tuseEffect(() => {\n\t\tsetChoroplethData(Object.assign({}, data));\n\t}, [setChoroplethData, data]);\n\n\tuseSizeProperty({ endpointQuery });\n\tuseMap();\n\n\t//CHOROPLETH\n\tuseChoroplethHooks();\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t);\n};\n\nconst mapStyle = css`\n\tflex: 1;\n\theight: 100%;\n`;\n\nconst wrapperStyle = css`\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n`;\n","import { useMapContext } from '../contexts/mapContext';\nimport { useEffect } from 'react';\n\nexport default function useSizeProperty({ endpointQuery }: { endpointQuery: any }) {\n\tconst { setSelectedFeatureProperty } = useMapContext()[1];\n\n\tuseEffect(() => {\n\t\tconst property = endpointQuery?.options?.parameters?.metadataPropertyNames?.[0];\n\t\tsetSelectedFeatureProperty(property);\n\t}, [endpointQuery, setSelectedFeatureProperty]);\n}\n","import { useEffect } from 'react';\nimport mapboxgl, { Map } from 'mapbox-gl';\nimport { useMapContext } from '../contexts/mapContext';\n\nconst MAPBOX_GL_ACCESS_TOKEN =\n\t'pk.eyJ1IjoibWNkbzYxNSIsImEiOiJjazNwMmE3N28yN2RmM2JwaHBwa2tmcXd4In0.ON4OyuWKVBOHqwlWEiE_jw';\n\nexport default function useMap() {\n\tconst [{ mapRef }, { setMap }] = useMapContext();\n\n\tuseEffect(() => {\n\t\tif (!mapRef) return;\n\t\tmapboxgl.accessToken = MAPBOX_GL_ACCESS_TOKEN;\n\n\t\tconst options = {\n\t\t\tcenter: {\n\t\t\t\tlng: -98.5795,\n\t\t\t\tlat: 39.8283,\n\t\t\t},\n\t\t\tcontainer: mapRef?.current ?? 'unknown',\n\t\t\tstyle: `mapbox://styles/mapbox/light-v10`,\n\t\t\tlogoPosition: 'bottom-left',\n\t\t\tzoom: 3,\n\t\t\tattributionControl: false,\n\t\t\tsources: {},\n\t\t};\n\t\tconst m = new Map(options);\n\t\tm.on('load', () => {\n\t\t\tsetMap(m);\n\t\t});\n\t}, [setMap, mapRef]);\n}\n","import React from 'react';\nimport { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { EndpointPropertyArraySelector } from 'components/selectors/endpointPropertyArraySelector';\n\nexport const ChoroplethMapKnobs = ({ cardIndex, endpointQuery }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n","import { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { choropleth } from 'widgets/endpoints';\nimport { ChoroplethMapWrapper } from './components/ChoroplethMapWrapper';\nimport { ChoroplethMapWidget } from './components/ChoroplethMapWidget';\nimport { ChoroplethMapKnobs } from './components/ChoroplethMapKnobs';\n\nconst types = [SrsPropertyType.GeoPoint];\n\nexport const config = {\n\tkey: 'CHOROPLETH_MAP',\n\tlabel: 'Choropleth Map',\n\ticon: 'globe',\n\twidget: ChoroplethMapWidget,\n\twrapper: ChoroplethMapWrapper,\n\tendpoint: choropleth,\n\tKnobs: ChoroplethMapKnobs,\n\ttypes: types,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\tconst rtn = {\n\t\t\toptions: {\n\t\t\t\tparameters: {\n\t\t\t\t\tMaxValues: 10000,\n\t\t\t\t},\n\t\t\t\tpropertyList: filteredProperties?.map((prop) => prop.name),\n\t\t\t},\n\t\t};\n\t\treturn rtn;\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tmapStyle: 'light-v10',\n\t\t\tmarkerColor: '#003467',\n\t\t\tfitToPoints: false,\n\t\t\tcolorScale: 'Auto',\n\t\t\ttileServer: 'mapbox://styles/mapbox/',\n\t\t\tmapboxAPIKey: 'pk.eyJ1IjoiYWRkeW1vcmFuIiwiYSI6ImNrZGkweG9vZDAwaDgyem51OGYwMm15cTYifQ.C0GhL0ddaZtJD6Z3RIEh7Q',\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, [], types).length >= 1;\n\t},\n};\n","import React from 'react';\nimport { MapProvider } from '../../contexts/mapContext';\nimport { ChoroplethProvider } from 'widgets/choroplethMap/contexts/choroplethContext';\nimport { ChoroplethMapWidget } from '../ChoroplethMapWidget';\n\nexport function ChoroplethMapWrapper({ data, endpointQuery }) {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","import {StringSizeInfo} from './types'\nvar {createCanvas} = require(\"canvas\");\n\nconst fontSizingCanvas = createCanvas(1,1);\n\n/**\n * Use a virtual canvas to get the size of text\n * @param text \n * @param rotation in degrees\n * @param font name of font\n * @param fontSize \n * @returns stringSizeInfo\n */\nexport function getTextSizing(text:string,\n\t rotation:number,\n\t\t\t\t\t font:string,\n\t\t\t\t\t fontSize:number):StringSizeInfo {\n if(fontSize===0) return {width:0,height:0,area:0} // Protec\n \n const canvas = fontSizingCanvas; // Global var for performance\n const context = canvas.getContext(\"2d\");\n context.font = fontSize + \"px \" + font;\n const metrics = context.measureText(text);\n\n const height = textHeight(metrics);\n const width = textWidth(metrics);\n\n return {\n width:rotatedRectangleWidth(height, width, rotation),\n height:rotatedRectangleHeight(height, width, rotation),\n area:height*width,\n };\n}\n\n/**\n * Finds the width of a rectangle after rotation\n * @param height\n * @param width \n * @param rotation in degrees\n */\nfunction rotatedRectangleWidth(height:number, width:number, rotation:number):number {\n const diagonalLength = Math.sqrt(height**2+width**2)\n\n const radialRotation = (rotation/180)*Math.PI\n\n // In the triangle made from height, width, diagonal\n // find the angle: diagonal, height\n const innerAngle = Math.atan(width/height)\n\n // Use that angle to create a new triangle\n // With sides and [angles]: rotWidth, [90-cTA], \n // diagonal, [cTA], _,[90]\n const constructedTriangleAngle = innerAngle + radialRotation\n\n return Math.abs(Math.sin(constructedTriangleAngle)*diagonalLength)\n}\n\n/**\n * Finds the height of a rectangle after rotation\n * @param height\n * @param width \n * @param rotation in degrees\n */\nfunction rotatedRectangleHeight(height:number, width:number, rotation:number) {\n return rotatedRectangleWidth(width,height,rotation)\n}\n\nfunction textHeight(metrics) {\n return Math.abs(metrics.actualBoundingBoxDescent) +\n Math.abs(metrics.actualBoundingBoxAscent);\n}\n\nfunction textWidth(metrics) {\n return Math.abs(metrics.actualBoundingBoxLeft) +\n\t\t Math.abs(metrics.actualBoundingBoxRight);\n}","import * as d3 from 'd3';\nimport { SCALING_FUNCTIONS } from 'widgets/chartUtils';\nimport { WCWord, LayedOutWCWord, WCFunction, WCUpdateFunc, ConfigType} from './types'\nimport {getTextSizing} from './util'\nvar cloud = require('d3-cloud');\nvar {createCanvas} = require(\"canvas\");\n\n/**\n * A word cloud based on the original Wordle visualization.\n * @param svg\n * @returns {{clear: clear, update: externalUpdate}}\n * @constructor\n */\nexport const WordCloud = (svg, updateTooltip) => {\n\tlet configOptions:ConfigType\n\n\t/**\n\t * uses d3-cloud to compute and return the layout of the cloud\n\t */\n\tlet _makeLayout: WCFunction\n\t_makeLayout = function (words:readonly WCWord[], height, width, sizeRatio) {\n\t\tconst myWords:WCWord[] = JSON.parse(JSON.stringify(words))\n\t\tconst rotationScale = d3.scaleLinear()\n\t\t\t\t\t\t\t.domain([0,configOptions.numOrientations])\n\t\t\t\t\t\t\t.range([configOptions.minRotate,configOptions.maxRotate])\n\t\tconst rotationFunction = () => rotationScale(\n\t\t\t~~(Math.random()*configOptions.numOrientations)\n\t\t)\n\t\tmyWords.forEach((w)=>{\n\t\t\tw.r=rotationFunction()\n\t\t\tconst scalingFunc = SCALING_FUNCTIONS.find(\n\t\t\t\t(i)=>i.value===configOptions.sizeScale\n\t\t\t).f\n\t\t\tw.relSize = scalingFunc(w.relSize)\n\t\t})\n\n\t\tconst sizeScale=_findScale(myWords,height,width,sizeRatio)\n\n\t\tmyWords.forEach((w)=>{\n\t\t\tw.relSize = sizeScale(w.relSize)\n\t\t})\n\n\t\treturn (\n\t\t\tcloud().size([width, height])\n\t\t\t\t.canvas(function() { return createCanvas(1, 1); })\n\t\t\t\t.words(myWords)\n\t\t\t\t.rotate((w:LayedOutWCWord)=>w.r)\n\t\t\t\t.font(configOptions.font)\n\t\t\t\t.fontSize(function(w:LayedOutWCWord) { return w.relSize; })\n\t\t\t\t.timeInterval(100)\n\t\t)\n\t}\n\n\t/**\n\t * This function calculates an \n\t * appropriate font scale for the words. It will return\n\t * a d3 scale function\n\t */\n\tlet _findScale:WCFunction\n\t_findScale = function (words:readonly WCWord[], height, width, sizeRatio) {\n\t\t// Make new object to not edit original objects\n\t\tconst myWords:WCWord[] = JSON.parse(JSON.stringify(words))\n\n\t\t// get max value\n\t\tlet maxSize = 0;\n\t\tmyWords.forEach((w) => {\n\t\t\tmaxSize = Math.max(maxSize,w.relSize)\n\t\t})\n\n\t\t// Standardize values\n\t\tconst standardRangeMax = 100\n\t\tconst standardScale = d3.scaleLinear()\n\t\t\t\t\t\t\t\t\t.domain([0,maxSize])\n\t\t\t\t\t\t\t\t\t.range([configOptions.minFontSize,standardRangeMax])\n\t\tmyWords.forEach((w) => {\n\t\t\tw.relSize = standardScale(w.relSize)\n\t\t})\n\t\t\n\t\t// find total area and max width/height of any word\n\t\tlet totalArea = 0\n\t\tlet maxWidth = 0\n\t\tlet maxHeight = 0\n\t\tfor (let word of myWords) {\n\t\t\tconst textSizing = getTextSizing(word.text,word.r,configOptions.font,word.relSize)\n\t\t\ttotalArea += textSizing.area\n\t\t\tmaxWidth = Math.max(maxWidth,textSizing.width)\n\t\t\tmaxHeight = Math.max(maxHeight,textSizing.height)\n\t\t}\n\n\t\t// Find dimensions of correct proportions that equal total area needed\n\t\tconst dimensionRatio = width/height\n\t\tconst neededWidthByArea = Math.sqrt(dimensionRatio*totalArea)\n\t\tconst neededWidth = Math.max(neededWidthByArea,maxWidth)\n\t\tconst neededHeight = Math.max(totalArea/neededWidthByArea,maxHeight)\n\n\t\t// Create adjusted scale\n\t\tconst heightRatio = height/neededHeight\n\t\tconst widthRatio = width/neededWidth\n\t\tconst sizeAdjustRatio = Math.max(heightRatio,widthRatio)\n\t\treturn d3.scaleLinear()\n\t\t\t\t\t.domain([0,maxSize])\n\t\t\t\t\t.range([configOptions.minFontSize\n\t\t\t\t\t\t\t,standardRangeMax*sizeAdjustRatio*sizeRatio])\n\t}\n\n\t/**\n\t * renders the words after d3-cloud has defined their layout\n\t */\n\tfunction _draw(words:LayedOutWCWord[],layout) {\n\t\tvar wordCloud = d3.select(svg)\n\t\t\t.attr(\"transform\", \"translate(\" + layout.size()[0] / 2 + \",\" + layout.size()[1] / 2 + \")\")\n\t\t\t.selectAll(\"g text\")\n\t\t\t.data(words, function(d:LayedOutWCWord) { return d.text; })\n\n\t\t//Entering words\n\t\twordCloud.enter()\n\t\t\t.append(\"text\")\n\t\t\t.style(\"font-family\", configOptions.font)\n\t\t\t.style(\"fill\", (d:LayedOutWCWord)=>d.color)\n\t\t\t.attr(\"text-anchor\", \"middle\")\n\t\t\t.attr('font-size', 1)\n\t\t\t.text(function(d) { return d.text; })\n\t\t\t.transition()\n\t\t\t\t.duration(600)\n\t\t\t\t.style(\"font-size\", function(d:LayedOutWCWord) { return d.size + \"px\"; })\n\t\t\t\t.attr(\"transform\", function(d:LayedOutWCWord) {\n\t\t\t\t\treturn \"translate(\" + [d.x, d.y] + \")rotate(\" + d.r + \")\";\n\t\t\t\t})\n\t\t\t\t.style(\"fill-opacity\", 1);\n\n\t\t//Entering and existing words\n\t\twordCloud\n\t\t\t.transition()\n\t\t\t\t.duration(600)\n\t\t\t\t.style(\"font-size\", function(d:LayedOutWCWord) { return d.size + \"px\"; })\n\t\t\t\t.attr(\"transform\", function(d:LayedOutWCWord) {\n\t\t\t\t\treturn \"translate(\" + [d.x, d.y] + \")rotate(\" + d.r + \")\";\n\t\t\t\t})\n\t\t\t\t.style(\"fill-opacity\", 1)\n\t\t\t\t.style(\"font-family\", configOptions.font)\n\t\t\t\t.style(\"fill\", (d:LayedOutWCWord)=>d.color)\n\n\t\t//Exiting words\n\t\twordCloud.exit()\n\t\t\t.transition()\n\t\t\t\t.duration(200)\n\t\t\t\t.style('fill-opacity', 1e-6)\n\t\t\t\t.attr('font-size', 1)\n\t\t\t\t.remove();\n\t\treturn words.length\n\t}\n\n\t/**\n\t * Will display the WCWords in words in the svg this function was\n\t * initialized to in a box bounded by height and width.\n\t */\n\tlet update: WCUpdateFunc\n\tupdate = function (config,words, height, width) {\n\t\tif(config) configOptions=config;\n\n\t\t// Keep trying to display all the words, decreasing their size a little\n\t\t// every time until maxTries is reached.\n\t\tconst expectedWords = words.length\n\t\tlet renderedWords = 0;\n\t\tlet numTries = 0;\n\t\tlet sizeRatio = 1;\n\t\tconst maxTries = 100;\n\t\tconst decreaseOnRetry = .9;\n\n\t\t// Only draw if all the words were successfully placed\n\t\tconst endFunc = (d,l) => {\n\t\t\tif (d.length === expectedWords) {\n\t\t\t\t_draw(d,l)\n\t\t\t}\n\t\t\trenderedWords = d.length\n\t\t}\n\n\t\twhile (renderedWords !== expectedWords && numTries <= maxTries) {\n\t\t\t// Create layout and then use it to draw the cloud\n\t\t\tconst layout = _makeLayout(words,height,width,sizeRatio)\n\t\t\tlayout.on(\"end\", d => endFunc(d,layout))\n\t\t\t\t .start();\n\t\t\tnumTries++;\n\t\t\tsizeRatio = sizeRatio*decreaseOnRetry;\n\t\t}\n\t}\n\n\t/**\n\t * removes everything from the svg\n\t */\n\tfunction clear() {\n\t\td3.select(svg).selectAll('g').remove();\n\t}\n\n\treturn {\n\t\tupdate: update,\n\t\tclear: clear,\n\t};\n};","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useEffect, useRef, useState } from 'react';\nimport { WordCloud } from './chart';\nimport { WordCloudWidgetProps } from './types'\nimport { SubtitleCountRenderer } from 'components/virtualTooltip/renderers';\nimport { useVirtualTooltip } from 'components/virtualTooltip/useVirtualTooltip';\n\n/**\n * WordCloud widget. See types.ts for more info about props.\n * @param dimensions {{height: height, width: width}} to define value of chart\n * @param data\n * @param widgetConfiguration\n */\nexport const WordCloudWidget = ({ dimensions, \n\t\t\t\t\t\t\t\t data,\n\t\t\t\t\t\t\t\t widgetConfiguration }:WordCloudWidgetProps) => {\n\tconst svgRef = useRef();\n\tconst [cloud, setCloud]:\n\t\t [ReturnType,any] = useState();\n\n\t// TODO: implement tooltip\n\t// const { TooltipElement, setTooltipData, setTooltipLocation, setTooltipOptions } = useVirtualTooltip(\n\t// \tSubtitleCountRenderer\n\t// );\n\n\tuseEffect(() => {\n\t\t// const updateTooltip = (data, location, options) => {\n\t\t// \tsetTooltipLocation(location);\n\t\t// \tsetTooltipData(data);\n\t\t// \tsetTooltipOptions(options);\n\t\t// };\n\n\t\tconst createChart = () => {\n\t\t\treturn WordCloud(svgRef.current, {});\n\t\t};\n\n\t\tif (data && dimensions && widgetConfiguration) {\n\t\t\tlet ch = cloud;\n\n\t\t\t// if we don't have an existing chart, create one\n\t\t\tif (!ch) {\n\t\t\t\tch = createChart();\n\t\t\t\tsetCloud(ch);\n\t\t\t}\n\n\t\t\tch.update(\twidgetConfiguration,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tdimensions.height,\n\t\t\t\t\t\tdimensions.width);\n\t\t}\n\t}, [cloud, data, dimensions, widgetConfiguration]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { PropertyListSelector } from 'components/selectors/propertyListSelector';\nimport { LimitSelector } from 'components/selectors/limitSelector';\nimport { ColorSelector } from 'components/selectors/colorSelector';\nimport { EndpointPropertySelector } from 'components/selectors/endpointPropertySelector';\nimport { EndpointParameterSelector } from 'components/selectors/endpointParameterSelector';\nimport { AGGREGATION_METHOD_VALUES, FONT_FAMILIES, SCALING_FUNCTIONS } from 'widgets/chartUtils';\nimport { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport CommonKnobsContainer from 'views/common/commonKnobsContainer';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport {WidgetParameterSelector} from 'components/selectors/widgetParameterSelector'\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param cardIndex\n * @param endpointQuery\n * @param flags\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport const WordCloudKnobs = ({ cardIndex, endpointQuery, flags, widgetConfiguration }) => {\n\tconst toValues = (n)=>{return{label:String(n),value:n}}\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* Font */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* min font size */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* Num rotation orientations */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* min angle */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* max angle */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/* Size scaling function */}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n","import uniq from 'lodash-es/uniq';\nimport { config as TestWidgetConfig } from './testWidget/config';\nimport { config as ParaCordConfig } from './paraCord/config';\nimport { config as UsMapConfig } from './usMap/config';\nimport { config as WorldMapConfig } from './worldMap/config';\nimport { config as DonutGraphConfig } from './donutGraph/config';\nimport { config as CirclePackConfig } from './circlePack/config';\nimport { config as CustomPackConfig } from './customCirclePack/customPackConfig';\nimport { config as TableConfig } from './table/config';\nimport { config as TypographConfig } from './typograph/config';\nimport { config as StackedBarConfig } from './stackedBarChart/config';\nimport { stackedConfig as StackedTimelineConfig} from \"./timeline/config\";\nimport { config as TimelineConfig } from './timeline/config';\nimport { config as PolarAreaConfig } from './polarArea/config';\nimport { config as MetricsConfig } from './metrics/config';\nimport { config as MultiDonutConfig } from './donutGraph/multiConfig';\nimport { config as LineChartConfig } from './lineChart/config';\nimport { config as EarthMapConfig } from './earthMap/config';\nimport { config as MatrixConfig } from './matrix/config';\nimport { config as TreeMapConfig } from './treemap/config';\nimport { config as BipartiteGraphConfig } from './nodeLink/edgeGraphConfig';\nimport { config as ClusterGraphConfig } from './nodeLink/clusterGraphConfig';\nimport { config as NetworkGraphConfig } from './nodeLink/nodeGraphConfig';\nimport { config as ChoroplethMapConfig } from './choroplethMap/config';\nimport { config as WordCloudConfig } from './wordCloud/config'\nimport { config as MeterConfig} from './meter/config';\n\n/**\n * Types of widgets\n * Remarks: Ideally, enums should named singular (i.e. WidgetType) but\n * this was an existing const and is referenced in many places\n */\nexport enum WIDGET_TYPES {\n\tBIPARTITE_GRAPH = 'BIPARTITE_GRAPH',\n\tCIRCLE_PACK = 'CIRCLE_PACK',\n\tCLUSTER_GRAPH = 'CLUSTER_GRAPH',\n\tCUSTOM_CIRCLE_PACK = 'CUSTOM_CIRCLE_PACK',\n\tDONUT_GRAPH = 'DONUT_GRAPH',\n\tEARTH_MAP = 'EARTH_MAP',\n\tCHOROPLETH_MAP = 'CHOROPLETH_MAP',\n\tLINE_CHART = 'LINE_CHART',\n\tMAP = 'MAP',\n\tMATRIX = 'MATRIX',\n\tMETER = 'METER',\n\tMETRICS = 'METRICS',\n\tMULTI_DONUT = 'MULTI_DONUT',\n\tNETWORK_GRAPH = 'NETWORK_GRAPH',\n\tPARACORD = 'PARACORD',\n\tPOLAR_AREA = 'POLAR_AREA',\n\tSTACKED_BAR_GRAPH = 'STACKED_BAR_GRAPH',\n\tSTACKED_TIMELINE = 'STACKED_TIMELINE',\n\tTABLE = 'TABLE',\n\tTEST_WIDGET = 'TEST_WIDGET',\n\tTIMELINE = 'TIMELINE',\n\tTREE_MAP = 'TREE_MAP',\n\tTYPOGRAPH = 'TYPOGRAPH',\n\tUS_MAP = 'US_MAP',\n\tWORLD_MAP = 'WORLD_MAP',\n\tWORD_CLOUD = 'WORD_CLOUD',\n}\n\nexport const WIDGETS = {\n\t[WIDGET_TYPES.BIPARTITE_GRAPH]: BipartiteGraphConfig,\n\t[WIDGET_TYPES.CIRCLE_PACK]: CirclePackConfig,\n\t[WIDGET_TYPES.CLUSTER_GRAPH]: ClusterGraphConfig,\n\t[WIDGET_TYPES.CUSTOM_CIRCLE_PACK]: CustomPackConfig,\n\t[WIDGET_TYPES.DONUT_GRAPH]: DonutGraphConfig,\n\t[WIDGET_TYPES.EARTH_MAP]: EarthMapConfig,\n\t[WIDGET_TYPES.CHOROPLETH_MAP]: ChoroplethMapConfig,\n\t[WIDGET_TYPES.LINE_CHART]: LineChartConfig,\n\t[WIDGET_TYPES.MATRIX]: MatrixConfig,\n\t[WIDGET_TYPES.METER]: MeterConfig,\n\t[WIDGET_TYPES.METRICS]: MetricsConfig,\n\t[WIDGET_TYPES.MULTI_DONUT]: MultiDonutConfig,\n\t[WIDGET_TYPES.NETWORK_GRAPH]: NetworkGraphConfig,\n\t[WIDGET_TYPES.PARACORD]: ParaCordConfig,\n\t[WIDGET_TYPES.POLAR_AREA]: PolarAreaConfig,\n\t[WIDGET_TYPES.STACKED_BAR_GRAPH]: StackedBarConfig,\n\t[WIDGET_TYPES.STACKED_TIMELINE]: StackedTimelineConfig,\n\t[WIDGET_TYPES.TEST_WIDGET]: TestWidgetConfig,\n\t[WIDGET_TYPES.TABLE]: TableConfig,\n\t[WIDGET_TYPES.TIMELINE]: TimelineConfig,\n\t[WIDGET_TYPES.TREE_MAP]: TreeMapConfig,\n\t[WIDGET_TYPES.TYPOGRAPH]: TypographConfig,\n\t[WIDGET_TYPES.US_MAP]: UsMapConfig,\n\t[WIDGET_TYPES.WORLD_MAP]: WorldMapConfig,\n\t[WIDGET_TYPES.WORD_CLOUD]: WordCloudConfig,\n};\n\n/**\n * Returns all of the widgets.\n * @param configurations possibly null or empty set of configurations as overrides\n * @param order the order in which the widgets should show up, unlisted charts will be added to the end.\n */\nexport const allWidgets = (configurations, order = []) => {\n\tlet names = uniq(order.concat(Object.keys(WIDGETS)));\n\n\tlet widgets = names.map((name) => ({\n\t\tkey: name,\n\t\tconfigurations: [],\n\t}));\n\n\twidgets.forEach((widget) => {\n\t\tconst config = configurations[widget.key];\n\t\tif (config) {\n\t\t\twidget.configurations = config.configurations;\n\t\t}\n\t});\n\treturn widgets;\n};\n\n/**\n * Returns all the widgets except for those in the given list of keys.\n * @param keys\n * @param configurations\n * @param order\n */\nexport const filterOutWidgets = (keys, configurations, order) => {\n\treturn allWidgets(configurations, order).filter((widget) => {\n\t\treturn keys.indexOf(widget.key) < 0;\n\t});\n};\n\n/**\n * Returns only the widgets that match the given list of keys.\n * @param keys\n * @param configurations\n * @param order\n */\nexport const filterInWidgets = (keys, configurations, order) => {\n\treturn allWidgets(configurations, order).filter((widget) => {\n\t\treturn keys.indexOf(widget.key) >= 0;\n\t});\n};\n","import { WordCloudWrapper } from './wrapper';\nimport { WordCloudKnobs } from './knobs'\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { FONT_FAMILIES, SCALING_FUNCTIONS } from 'widgets/chartUtils';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'WORD_CLOUD',\n\tlabel: '(alpha) Word Cloud',\n\ticon: 'cloud',\n\twrapper: WordCloudWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: WordCloudKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t\tmaxChildren: 100,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Categorical,\n\t\t\tnumOrientations:2,\n\t\t\tminRotate:-90,\n\t\t\tmaxRotate:90,\n\t\t\tfont:FONT_FAMILIES[0].value,\n\t\t\tsizeScale:SCALING_FUNCTIONS[0].value,\n\t\t\tminFontSize:4,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};\n","import React, { useEffect, useState } from 'react';\nimport { WordCloudWidget } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { NO_DATA_MESSAGE } from 'widgets/chartUtils';\nimport { WCWord } from './types'\n\n/**\n * ChartWrapper for the Word Cloud Chart.\n * \n * Displays no data message if there isn't any data,\n * otherwise displays WordCloudWidget\n *\n * @param getColorScale\n * @param dimensions\n * @param data\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport function WordCloudWrapper({ getColorScale, dimensions, data, widgetConfiguration, noDataMessage=NO_DATA_MESSAGE }) {\n\tconst [convertedData, setConvertedData] = useState(null);\n\n\t// Set up/refresh color scale and data\n\tuseEffect(()=> {\n\t\tconst keys=data?.entries.map(d=>d.key)\n\t\tconst converted:WCWord[] = []\n\t\tif(!data.entries) return;\n\t\t\n\t\t\n\t\t// Set colors depending on type of data\n\t\tlet getColor: (d,i)=>any\n\t\tif (widgetConfiguration?.colorScale === DefaultChartColorScales.Sequential) {\n\t\t\tgetColorScale.domain([0, keys.length || 0]);\n\t\t\tgetColor = (_, i) => getColorScale(i)\n\t\t} else {\n\t\t\tgetColorScale.domain(keys);\n\t\t\tgetColor = (d, _) => getColorScale(d.key)\n\t\t}\n\n\t\t// Correctly format data\n\t\tdata.entries.forEach((d,i) => {\n\t\t\tconverted.push({\n\t\t\t\ttext:d.key,\n\t\t\t\tcolor:getColor(d,i),\n\t\t\t\trelSize:d.count,\n\t\t\t})\n\t\t});\n\t\tsetConvertedData(converted)\n\t},[data, getColorScale, widgetConfiguration])\n\n\treturn convertedData?.length > 0 ? (\n\t\t\n\t) : (\n\t\t\n\t);\n}\n","/**\n * \n * @param deg The amount of degrees to be converted.\n * @returns Returns supplied degree amount converted to radians.\n */\nexport const degreesToRadians = (deg) => (deg * Math.PI) / 180;\n\n/**\n * \n * @param rad The amount of radians to be converted.\n * @returns Returns supplied radian amount converted to degrees.\n */\n export const radiansToDegrees = (rad) => (rad * 180) / Math.PI;\n\n/**\n * \n * @param perc A percentage value (0.00 - 1.00) of 360 degrees to be converted. \n * @returns Returns the percentage of a circle's circumference converted to degrees.\n */\nexport const percentToDegrees = (perc) => perc * 360;\n\n/**\n * \n * @param perc A percentage value (0.00 - 1.00) of 360 degrees to be converted.\n * @returns Returns the number of radians converted from a given percentage of 360 degrees\n */\nexport const percentToRadians = (perc) => degreesToRadians(percentToDegrees(perc));\n","import React, { useEffect, useRef } from 'react';\nimport * as d3 from 'd3';\nimport { degreesToRadians } from './../helpers/getAngleConversions';\nimport { Colors } from '@blueprintjs/core';\n\n/**\n * @param arcRadii The radii of the inner and outer portions of the arc.\n * @param [colors] An object containing information for coloring the meter.\n * @param [colors.fullFill] Indicates if colors will fill from start angle up to needle or to end angle (true).\n * @param [colors.interpolator] A function which returns a color string value to be used at a given segment (see D3).\n * @param [colors.reverse] Indicates if color scheme should be the reverse of the normal interpolator\n * @param [colors.segments] A number indicating how many segments of the color scale to show. More segments will result in a smoother gradient.\n * @param [colors.score] A number representing the percentage of the arc where the gradient stops. Ignored if fullFull is true.\n * @param position The relative position of this SVG g element\n * @param segments An array of value color pairs indicating the ratio of a given color to other colors in the arc.\n *\n * @returns A SVG G element representing an arc with colored segments corresponding to the supplied data\n */\nexport const MeterArc = (\n\t(\n\t\t{\n\t\t\tarcRadii: { inner, outer },\n\t\t\tcolors: { fullFill, interpolator, reverse, score, segments },\n\t\t\tposition,\n\t\t}: MeterArcProps,\n\t) => {\n\t\t\n\tconst ref = useRef(null);\n\t\n\t\tuseEffect(() => {\n\t\t\t/*\n\t\t\t * Gernerate the path angles needed by arc() from data\n\t\t\t * This will give an appropriate portion (based on value) of the full arc to each color\n\t\t\t */\n\t\t\tconst angleGen = d3\n\t\t\t\t.pie()\n\t\t\t\t.startAngle(degreesToRadians(270))\n\t\t\t\t// Allow for clockwise wrapping of angles when start angle is greater than end angle\n\t\t\t\t.endAngle(degreesToRadians(450))\n\t\t\t\t//.value((d) => d.value)\n\t\t\t\t.sort(null);\n\n\t\t\tconst ary = Array(segments).fill(1);\n\t\t\tconst angles = angleGen(ary);\n\t\t\tconst arcGen = d3.arc().innerRadius(inner).outerRadius(outer);\n\n\t\t\t/* For use later with app colors? \n\t\t\tconst colorMap = segments.map((cv) => cv.color);\n\t\t\tconst interpolater = d3.piecewise(colorMap); \n\t\t\t*/\n\n\t\t\tconst getColor = (i) => interpolator((reverse ? segments - 1 - i : i) / ary.length);\n\t\t\tconst color = (_d, i) => (!fullFill && i / segments > score ? Colors.GRAY3 : getColor(i));\n\n\t\t\t/* Draw the arc */\n\t\t\td3.select(ref.current)\n\t\t\t\t.selectAll('path')\n\t\t\t\t.data(angles)\n\t\t\t\t.join('path')\n\t\t\t\t.attr('d', arcGen)\n\t\t\t\t.attr('stroke', color)\n\t\t\t\t.attr('fill', color);\n\t\t}, [fullFill, inner, interpolator, outer, ref, reverse, score, segments]);\n\n\t\treturn ;\n\t}\n);\n\nexport interface ArcColorProps {\n\tfullFill?: boolean;\n\tinterpolator?: (t: number) => string;\n\treverse?: boolean;\n\tscore?: number;\n\tsegments?: number;\n}\n\nexport interface MeterArcProps {\n\tarcRadii: { inner: number; outer: number };\n\tcolors?: ArcColorProps;\n\tposition: { x: number; y: number };\n}\n","import React, { useEffect, useRef } from 'react';\nimport * as d3 from 'd3';\n\nimport { degreesToRadians, percentToRadians } from './../helpers/getAngleConversions';\n\nexport interface MeterNeedleProps {\n\tmeterPercent: number;\n\tneedleHeight: number;\n\tneedleRadius: number;\n\tposition: { x: number; y: number };\n}\n\n/**\n * @param {number} meterPercent Percentage of meter from start that needle should point to.\n * @param {number} needleHeight Height of the needle.\n * @param {number} needleRadius How large the needle 'base' is. Also used to calculate size of the needle.\n * @param {{x: number, y: number}} position The relative position of this SVG g element\n *\n * @returns A SVG G element representing a needle pointing to a specified percentage of an arc.\n */\nexport const MeterNeedle = ({ meterPercent, needleHeight, needleRadius, position }: MeterNeedleProps) => {\n\tconst ref = useRef(null);\n\n\tuseEffect(() => {\n\t\tconst needleOpacity = 0.85;\n\n\t\t/* Get spread of radians to get percentage of */\n\t\tconst startRadians = degreesToRadians(270);\n\t\tconst endRadians = degreesToRadians(450);\n\t\tconst radianSpread = endRadians - startRadians;\n\t\tconst spreadPercent = radianSpread / (2 * Math.PI);\n\n\t\t// - Math.PI / 2 will normalize thetaRad to d3 angle system where degree 0 is at top\n\t\tconst thetaRad = percentToRadians(meterPercent * spreadPercent) + startRadians - Math.PI / 2;\n\n\t\tconst needleTopX = needleHeight * Math.cos(thetaRad);\n\t\tconst needleTopY = needleHeight * Math.sin(thetaRad);\n\t\tconst needleLeftX = -needleRadius * Math.cos(thetaRad - Math.PI / 2);\n\t\tconst needleLeftY = -needleRadius * Math.sin(thetaRad - Math.PI / 2);\n\t\tconst needleRightX = needleRadius * Math.cos(thetaRad - Math.PI / 2);\n\t\tconst needleRightY = needleRadius * Math.sin(thetaRad - Math.PI / 2);\n\t\tconst path = [`M${needleLeftX},${needleLeftY}L${needleTopX},${needleTopY}L${needleRightX},${needleRightY}`];\n\n\t\t/* Needle Pointer */\n\t\td3.select(ref.current)\n\t\t\t.selectAll('path')\n\t\t\t.data(path)\n\t\t\t.join(\n\t\t\t\t(enter) => enter.append('path').attr('d', path[0]).attr('opacity', needleOpacity),\n\t\t\t\t(update) => update.attr('d', path[0])\n\t\t\t);\n\t}, [meterPercent, needleHeight, needleRadius]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useEffect, useRef } from 'react';\n\n/* Shapes */\nimport * as d3 from 'd3';\nimport { MeterArc, MeterArcProps, ArcColorProps } from './components/MeterArc';\nimport { MeterNeedle, MeterNeedleProps } from './components/MeterNeedle';\nimport { Dimensions } from 'interfaces';\nimport { useState } from 'react';\nimport { Colors } from '@blueprintjs/core';\nimport { useWidgetControlsContext } from 'views/common/WidgetControls';\n\nconst defaultArcConfig = {\n\tarcRadii: { inner: 0, outer: 0 },\n\tcolors: { fullFill: false, interpolator: undefined, reverse: false, score: 0, segments: 0 },\n\tdelimitingDegreeAngles: { start: 0, end: 0 },\n\tposition: { x: 0, y: 0 },\n};\n\nconst defaultNeedleConfig = {\n\tdelimitingDegreeAngles: { start: 0, end: 0 },\n\tmeterPercent: 0,\n\tneedleHeight: 0,\n\tneedleRadius: 0,\n\tposition: { x: 0, y: 0 },\n};\n\n/**\n *\n * @param dimensions Dimensions of the SVG element container.\n * \tThe lower value of width/height will be used to determine arc radius.\n * \tValues may be modified to accommodate start/end angles\n * @param dimensions.width The width of the SVG container element.\n * @param dimensions.height The height of the SVG container element.\n * @param widgetConfiguration Configuration values for the meter\n * @param widgetConfiguration.data Rating object that contains a percentile score and the denominator score was derived from.\n * @param [widgetConfiguration.colors] Color data to use for coloring/shading meter\n * @param [widgetConfiguration.needlePosition='center'] String value indicating which radius level the needle points to on the arc.\n * @param [widgetConfiguration.arcWidth] The desired width of the arc.\n * @returns\n */\nexport const Meter: React.FC = ({\n\tdimensions: { width, height },\n\twidgetConfiguration: { data, colors, needlePosition = 'center', arcWidth = 50, labels },\n}) => {\n\tconst svgRef = useRef(null);\n\tconst [arcConfig, setArcConfig] = useState(defaultArcConfig);\n\tconst [needleConfig, setNeedleConfig] = useState(defaultNeedleConfig);\n\n\tconst {dispatch} = useWidgetControlsContext();\n\tuseEffect(() => {\n\t\t//use widget controls context to hide the labels toggle switch\n\t\tdispatch && dispatch({type: \"setLabelsToggleBtnStatus\", payload: false});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst newArcConfig = defaultArcConfig;\n\t\tconst newNeedleConfig = defaultNeedleConfig;\n\n\t\tconst svgWidth = svgRef.current.clientWidth;\n\t\tconst svgHeight = svgRef.current.clientHeight;\n\t\tconst minDimension = Math.min(svgWidth / 2, svgHeight);\n\t\tconst padding = 25;\n\n\t\tconst outer = minDimension - padding;\n\t\tconst inner = outer - arcWidth;\n\t\tconst midArc = (outer + inner) / 2;\n\t\t/* Arc */\n\t\tnewArcConfig.arcRadii = { inner, outer };\n\t\tnewArcConfig.colors = {\n\t\t\tfullFill: true,\n\t\t\tinterpolator: d3.interpolateRdYlGn,\n\t\t\treverse: false,\n\t\t\tscore: data.score,\n\t\t\tsegments: 5,\n\t\t\t...colors,\n\t\t};\n\t\tnewArcConfig.position = { x: svgWidth / 2, y: svgHeight - padding / 2 };\n\t\tsetArcConfig((prevConfig) => ({ ...prevConfig, ...newArcConfig }));\n\n\t\t/* Needle */\n\t\tnewNeedleConfig.delimitingDegreeAngles = newArcConfig.delimitingDegreeAngles;\n\t\tnewNeedleConfig.meterPercent = data.score;\n\t\tnewNeedleConfig.needleHeight = needlePosition === 'center' ? midArc : newArcConfig.arcRadii[needlePosition];\n\t\tnewNeedleConfig.needleRadius = Math.min(10, inner - 10);\n\t\tnewNeedleConfig.position = newArcConfig.position;\n\t\tsetNeedleConfig((prevConfig) => ({ ...prevConfig, ...newNeedleConfig }));\n\t}, [arcWidth, colors, data, needlePosition, width, height, setArcConfig]);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t\t
{labels.left}
\n\t\t\t\t
\n\t\t\t\t\t
{Number(data.score * data.denominator).toFixed(0)}
\n\t\t\t\t\t
{labels.data}
\n\t\t\t\t
\n\t\t\t\t
{labels.right}
\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst meterContainer = css`\n\theight: 100%;\n\tdisplay: grid;\n\tgrid-template-rows: 1fr auto;\n`;\n\nconst labelContainer = css`\n\tdisplay: flex;\n\tjustify-content: center;\n\ttext-align: center;\n\tcolor: ${Colors.GRAY3};\n\tfont-weight: 600;\n`;\n\nconst rangeLabel = css``;\n\nconst dataLabel = css`\n\tdisplay: flex;\n\tflex-direction: column;\n`;\n\nconst dataNumber = css`\n\tcolor: ${Colors.DARK_GRAY5};\n\tfont-size: 3.5em;\n\tfont-weight: 900;\n`;\n\nexport interface Rating {\n\tscore: number;\n\tdenominator: number;\n}\n\nexport interface MeterProps {\n\tdimensions: Dimensions;\n\twidgetConfiguration: {\n\t\tdata: Rating;\n\t\tcolors?: ArcColorProps;\n\t\tneedlePosition?: 'inner' | 'center' | 'outer';\n\t\tarcWidth?: number;\n\t\tlabels: { left: string; data: string; right: string };\n\t};\n}\n","import { MeterWrapper } from './wrapper';\nimport { MeterKnobs } from './knobs';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { propertyHierarchy } from 'widgets/endpoints';\nimport { filterProperties } from 'utilities/srsUtils';\nimport { DefaultChartColorScales } from 'styles/chartColors';\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n\tkey: 'METER',\n\tlabel: 'Meter',\n\ticon: 'dashboard',\n\twrapper: MeterWrapper,\n\tendpoint: propertyHierarchy,\n\tKnobs: MeterKnobs,\n\tflags: flags,\n\tcreateDefaultOptions: (filteredProperties) => {\n\t\treturn {\n\t\t\toptions: {\n\t\t\t\tpropertyList: [filteredProperties[0].name],\n\t\t\t\tparameters: {\n\t\t\t\t\tmaxRoot: 50,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t},\n\tcreateDefaultConfiguration: (_filteredProperties) => {\n\t\treturn {\n\t\t\tcolorScale: DefaultChartColorScales.Sequential,\n\t\t};\n\t},\n\tisValid: (selectedDefinitionName) => {\n\t\treturn filterProperties(selectedDefinitionName, flags).length >= 1;\n\t},\n};","import React, { useMemo, useRef } from 'react';\nimport { Meter, MeterProps, Rating } from './Meter';\nimport { NonIdealState } from '@blueprintjs/core';\nimport { selectDilDefinitionByName } from 'srs-middleware';\nimport { DefaultChartColorScales } from 'styles/chartColors';\nimport { Dimensions } from 'interfaces';\nimport d3 from 'd3';\n\n/* const width = 475;\nconst height = 200;\nconst startAngle = 270;\nconst endAngle = 90;\nconst needleRadius = 15;\nconst arcWidth = 50;\nconst outerRadius = height - needleRadius * 4;\nconst innerRadius = outerRadius - arcWidth;\nconst needleHeight = (outerRadius + innerRadius) / 2;\nconst meterPercent = 0.82;\nconst meterMax = 10;\nconst meterX = width / 2;\nconst meterY = height - needleRadius * 3; */\n\n/**\n * Wrapper for Meter.\n *\n * @param dimensions\n * @param widgetConfiguration\n * @returns {*}\n * @constructor\n */\nexport const MeterWrapper: React.FC = ({ dimensions, widgetConfiguration: config, data }) => (\n\t\n);\ninterface MeterWrapperProps extends MeterProps {\n\tdata: {\n\t\tscore: number;\n\t\tdenominator: number;\n\t};\n}\n","import React from 'react';\n\nexport const MeterKnobs: React.FC = () =>
Knobs to come
;\n","import { useEffect, useRef, DependencyList, useReducer, useCallback } from 'react';\nimport isEqual from 'lodash/isEqual';\n\n// This hook is a bit experimental.\n\ninterface UseAsyncCallbackResponse {\n\tdata: R | null;\n\tloading: boolean;\n\terror: any;\n}\n\nenum actionTypes {\n\trequest,\n\tsuccess,\n\tfailure,\n}\n\ntype Action =\n\t| { type: actionTypes.request }\n\t| { type: actionTypes.success; results: R }\n\t| { type: actionTypes.failure; error: any };\n\nexport function useAsyncCallback(\n\tcallback: () => Promise,\n\tdependencies: DependencyList\n): UseAsyncCallbackResponse {\n\tconst reducer = useCallback((state: UseAsyncCallbackResponse, action: Action) => {\n\t\tswitch (action.type) {\n\t\t\tcase actionTypes.request:\n\t\t\t\treturn state.loading ? state : { data: null, loading: true, error: null };\n\t\t\tcase actionTypes.success:\n\t\t\t\treturn { data: action.results, loading: false, error: null };\n\t\t\tcase actionTypes.failure:\n\t\t\t\treturn { data: null, loading: false, error: action.error };\n\t\t}\n\t}, []);\n\n\tconst [state, dispatch] = useReducer(reducer, { data: null, loading: true, error: null });\n\tconst ref = useRef();\n\tref.current = dependencies;\n\n\tuseEffect(\n\t\t() => {\n\t\t\tdispatch({ type: actionTypes.request });\n\t\t\tlet _canceled = false;\n\t\t\tPromise.resolve(callback())\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (!_canceled && isEqual(dependencies, ref.current)) {\n\t\t\t\t\t\tdispatch({ type: actionTypes.success, results: response });\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\t!_canceled && dispatch({ type: actionTypes.failure, error });\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t});\n\t\t\treturn () => {\n\t\t\t\t_canceled = true;\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[...dependencies]\n\t);\n\n\treturn state;\n}\n","import { useCallback, useContext, useMemo } from 'react';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { omit } from 'lodash';\nimport { sendUsageAction } from 'utilities/usageStats';\n\nconst { updateFilter, updateFilterCallback, updateQueryString } = WorkspaceActionCreator;\n\nexport enum FACET_STATE {\n\tON = 'on',\n\tOFF = 'off',\n\tUNSELECTED = 'unselected',\n}\n\nfunction getNullSafeFacets(facetsRaw) {\n\treturn (\n\t\tfacetsRaw ?? {\n\t\t\tactiveFacets: {},\n\t\t\tactiveHierarchicalFacets: {},\n\t\t\ttextFilter: '',\n\t\t}\n\t);\n}\n\n/**\n * useFacetsState handles saving and fetching facet-related information from the WorkspaceContext\n * Adding and Removing facets is as easy as passing in the a property name and a facet name into toggleFacet()\n * Also keeps track of editable facet related parameters, such as textFilter\n */\nexport const useFacetsState = () => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tfilters: { facets: facetsRaw },\n\t\t\t},\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst facets = useMemo(() => {\n\t\treturn getNullSafeFacets(facetsRaw);\n\t}, [facetsRaw]);\n\tconst { activeFacets, activeHierarchicalFacets, textFilter } = facets;\n\n\t// returns an object representation of all of the active facets\n\tconst getActiveFacets = () => {\n\t\treturn activeFacets;\n\t};\n\n\t// returns an object representation of all of the active hierarchicalFacets\n\tconst getActiveHierarchicalFacets = () => {\n\t\treturn activeHierarchicalFacets;\n\t};\n\n\t// returns the current searchfilter\n\tconst getTextFilter = () => {\n\t\treturn textFilter || '';\n\t};\n\n\t/**\n\t * updates the current search filter\n\t * @param newFilter\n\t */\n\tconst updateTextFilter = useCallback(\n\t\t(newFilter: string) => {\n\t\t\tdispatch(updateFilter('facets', { ...facets, textFilter: newFilter }));\n\t\t},\n\t\t[dispatch, facets]\n\t);\n\n\t/**\n\t * Determines automatically whether to add or remove a facet.\n\t * @param property\n\t * @param facet\n\t */\n\tconst toggleFacet = (property: string, facet: string) => {\n\t\tconst state = getFacetState(property, facet);\n\t\tif (state === FACET_STATE.ON || state === FACET_STATE.OFF) removeFacet(property, facet);\n\t\telse addFacet(property, facet, FACET_STATE.ON);\n\t};\n\n\t/**\n\t * Turn on multiple facets from one property.\n\t * @param property\n\t * @param facets\n\t */\n\tconst loadFacets = (property: string, facets: string[]) => {\n\t\tfacets.forEach((facet) => {\n\t\t\taddFacet(property, facet, FACET_STATE.ON)\n\t\t})\n\t};\n\n\t/**\n\t * Determines automatically whether to add or remove a facet.\n\t * @param property\n\t * @param facet\n\t * @param isAncestorSelected\n\t */\n\tconst toggleHierarchicalFacet = (property: string, facet: string, isAncestorSelected: boolean) => {\n\t\tconst state = getHierarchicalFacetState(property, facet);\n\t\tif (isAncestorSelected) {\n\t\t\tif (state === FACET_STATE.OFF) removeHierarchicalFacet(property, facet);\n\t\t\telse addHierarchicalFacet(property, facet, FACET_STATE.OFF);\n\t\t} else {\n\t\t\tif (state === FACET_STATE.ON || state === FACET_STATE.OFF) removeHierarchicalFacet(property, facet);\n\t\t\telse addHierarchicalFacet(property, facet, FACET_STATE.ON);\n\t\t}\n\t};\n\n\t/**\n\t * exclude a singular facet\n\t * @param property\n\t * @param facetToExclude\n\t */\n\tconst toggleExcludeFacet = (property: string, facetToExclude: string) => {\n\t\tconst state = getFacetState(property, facetToExclude);\n\t\tif (state === FACET_STATE.OFF) removeFacet(property, facetToExclude);\n\t\telse addFacet(property, facetToExclude, FACET_STATE.OFF);\n\t};\n\n\t/**\n\t * exclude a singular Hierarchicalfacet\n\t * excluding will remove results that contain this facet\n\t * @param property\n\t * @param facetToExclude\n\t */\n\tconst toggleExcludeHierarchicalFacet = (property: string, facetToExclude: string) => {\n\t\tconst state = getHierarchicalFacetState(property, facetToExclude);\n\t\tif (state === FACET_STATE.OFF) removeHierarchicalFacet(property, facetToExclude);\n\t\telse addHierarchicalFacet(property, facetToExclude, FACET_STATE.OFF);\n\t};\n\n\t/**\n\t * pass in a facet and the property it belongs to and it gets added\n\t * @param property\n\t * @param facetToAdd\n\t * @param newState\n\t */\n\tconst addFacet = (property: string, facetToAdd: string, newState: FACET_STATE) => {\n\n\n\t\tdispatch(updateFilterCallback('facets', (facetsRaw) => {\n\t\t\tconst facets = getNullSafeFacets(facetsRaw);\n\t\t\tconst { activeFacets } = facets;\n\n\t\t\tlet newActiveFacets = {};\n\t\t\t// if the property doesn't exist yet in the active facets, add it\n\t\t\t// otherwise, append the facet being added to that property\n\t\t\tif (activeFacets === null) {\n\t\t\t\tnewActiveFacets = {\n\t\t\t\t\t[property]: {\n\t\t\t\t\t\t[facetToAdd]: newState,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst propertyState = activeFacets.hasOwnProperty(property) ? activeFacets[property] : {};\n\t\t\t\tnewActiveFacets = {\n\t\t\t\t\t...activeFacets,\n\t\t\t\t\t[property]: {\n\t\t\t\t\t\t...propertyState,\n\t\t\t\t\t\t[facetToAdd]: newState,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { ...facets, activeFacets: newActiveFacets };\n\t\t}));\n\t\tif (newState === FACET_STATE.ON) {\n\t\t\tsendUsageAction('FacetAdded', `${property}:${facetToAdd}`);\n\t\t}\n\t};\n\n\t/**\n\t * pass in a facet and the property it belongs to and it gets added\n\t * @param property\n\t * @param facetToAdd\n\t * @param newState\n\t */\n\tconst addHierarchicalFacet = (property: string, facetToAdd: string, newState: FACET_STATE) => {\n\t\tlet newActiveHierarchicalFacets = {};\n\t\t// if the property doesn't exist yet in the active hierarchicalFacets, add it\n\t\t// otherwise, append the facet being added to that property\n\t\tif (activeHierarchicalFacets === null) {\n\t\t\tnewActiveHierarchicalFacets = {\n\t\t\t\t[property]: {\n\t\t\t\t\t[facetToAdd]: newState,\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tconst propertyState = activeHierarchicalFacets.hasOwnProperty(property) ? activeHierarchicalFacets[property] : {};\n\t\t\tnewActiveHierarchicalFacets = {\n\t\t\t\t...activeHierarchicalFacets,\n\t\t\t\t[property]: {\n\t\t\t\t\t...propertyState,\n\t\t\t\t\t[facetToAdd]: newState,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// remove child facets if parent is selected\n\t\tif (activeHierarchicalFacets[property]) {\n\t\t\tObject.keys(activeHierarchicalFacets?.[property]).forEach((facet) => {\n\t\t\t\tif (facet.includes(facetToAdd) && facet !== facetToAdd) {\n\t\t\t\t\tdelete newActiveHierarchicalFacets[property][facet];\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tdispatch(updateFilter('facets', { ...facets, activeHierarchicalFacets: newActiveHierarchicalFacets }));\n\t\tif (newState === FACET_STATE.ON) {\n\t\t\tsendUsageAction('HierarchicalFacetAdded', `${property}:${facetToAdd}`);\n\t\t}\n\t};\n\n\t/**\n\t * pass in a facet and the property it belongs to and it gets removed\n\t * @param property\n\t * @param facetToRemove\n\t */\n\tconst removeFacet = (property: string, facetToRemove: string) => {\n\t\tconst facetsItems = activeFacets[property];\n\t\tconst newFacets = omit(facetsItems, facetToRemove);\n\n\t\tlet newActiveFacets = {\n\t\t\t...activeFacets,\n\t\t\t[property]: newFacets,\n\t\t};\n\n\t\t// remove property if there are no more items inside\n\t\tif (Object.keys(newActiveFacets[property]).length < 1) {\n\t\t\tdelete newActiveFacets[property];\n\t\t}\n\n\t\t// reset facets if there are no more properties left inside\n\t\tif (Object.keys(newActiveFacets).length < 1) {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeFacets: {} }));\n\t\t\tdispatch(updateQueryString('facets', null));\n\t\t} else {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeFacets: newActiveFacets }));\n\t\t}\n\t};\n\n\t/**\n\t * pass in a facet and the property it belongs to and it gets removed\n\t * @param property\n\t * @param facetToRemove\n\t */\n\tconst removeHierarchicalFacet = (property: string, facetToRemove: string) => {\n\t\tconst facetsItems = activeHierarchicalFacets[property];\n\t\tconst newFacets = omit(facetsItems, facetToRemove);\n\n\t\tlet newActiveHierarchicalFacets = {\n\t\t\t...activeHierarchicalFacets,\n\t\t\t[property]: newFacets,\n\t\t};\n\n\t\t// remove property if there are no more items inside\n\t\tif (Object.keys(newActiveHierarchicalFacets[property]).length < 1) {\n\t\t\tdelete newActiveHierarchicalFacets[property];\n\t\t}\n\n\t\t// reset hierarchicalFacets if there are no more properties left inside\n\t\tif (Object.keys(newActiveHierarchicalFacets).length < 1) {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeHierarchicalFacets: {} }));\n\t\t\tdispatch(updateQueryString('facets', null));\n\t\t} else {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeHierarchicalFacets: newActiveHierarchicalFacets }));\n\t\t}\n\t};\n\n\t/**\n\t *\n\t * @param property\n\t * @param facetsToUpdate\n\t */\n\tconst updateFacets = (property: string, facetsToUpdate: string[]) => {\n\t\t// convert the array into an object\n\t\tlet facetsToAdd = {};\n\t\tfacetsToUpdate.forEach((facet) => {\n\t\t\t// TODO: Should these default to ON? This is only ever called with an empty array so far.\n\t\t\tfacetsToAdd[facet] = FACET_STATE.ON;\n\t\t});\n\n\t\tlet newActiveFacets = {\n\t\t\t...activeFacets,\n\t\t\t[property]: facetsToAdd,\n\t\t};\n\t\t// remove property if the facetsToUpdate was empty\n\t\tif (Object.keys(facetsToUpdate).length < 1) {\n\t\t\tdelete newActiveFacets[property];\n\t\t}\n\t\t// reset the facets if there are no more properties left inside\n\t\tif (Object.keys(newActiveFacets).length < 1) {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeFacets: {} }));\n\t\t\tdispatch(updateQueryString('facets', null));\n\t\t} else {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeFacets: newActiveFacets }));\n\t\t}\n\t};\n\n\t/**\n\t * update an entire property's set of hierarchicalFacets\n\t * passing an empty array of hierarchicalFacets will clear out a single property's hierarchicalFacets\n\t * @param property\n\t * @param facetsToUpdate\n\t */\n\tconst updateHierarchicalFacets = (property: string, facetsToUpdate: string[]) => {\n\t\t// convert the array into an object\n\t\tlet facetsToAdd = {};\n\t\tfacetsToUpdate.forEach((facet) => {\n\t\t\t// TODO: Should these default to ON? This is only ever called with an empty array so far.\n\t\t\tfacetsToAdd[facet] = FACET_STATE.ON;\n\t\t});\n\n\t\tlet newActiveHierarchicalFacets = {\n\t\t\t...activeHierarchicalFacets,\n\t\t\t[property]: facetsToAdd,\n\t\t};\n\t\t// remove property if the facetsToUpdate was empty\n\t\tif (Object.keys(facetsToUpdate).length < 1) {\n\t\t\tdelete newActiveHierarchicalFacets[property];\n\t\t}\n\t\t// reset the hierarchicalFacets if there are no more properties left inside\n\t\tif (Object.keys(newActiveHierarchicalFacets).length < 1) {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeHierarchicalFacets: {} }));\n\t\t\tdispatch(updateQueryString('facets', null));\n\t\t} else {\n\t\t\tdispatch(updateFilter('facets', { ...facets, activeHierarchicalFacets: newActiveHierarchicalFacets }));\n\t\t}\n\t};\n\n\t/**\n\t * Tri-state response to whether the facet is currently selected or not\n\t * \"off\", \"on\" or \"unselected\"\n\t * @param property\n\t * @param facet\n\t */\n\tconst getFacetState = (property: string, facet: string) => {\n\t\treturn activeFacets?.[property]?.[facet] || FACET_STATE.UNSELECTED;\n\t};\n\n\t/**\n\t * Tri-state response to whether the facet is currently selected or not\n\t * \"off\", \"on\" or \"unselected\"\n\t * @param property\n\t * @param facet\n\t */\n\tconst getHierarchicalFacetState = (property: string, facet: string) => {\n\t\treturn activeHierarchicalFacets?.[property]?.[facet] || FACET_STATE.UNSELECTED;\n\t};\n\n\t/** removes all properties and items. clean start */\n\tconst resetAllFacets = useCallback(() => {\n\t\tdispatch(updateFilter('facets', { textFilter: '', activeFacets: {}, activeHierarchicalFacets: {} }));\n\t\tdispatch(updateQueryString('facets', null));\n\t}, [dispatch]);\n\n\t/**\n\t *\n\t * @param property\n\t * @param parent\n\t */\n\tconst hasSelectedChild = (property: string, parent: string) => {\n\t\tconst state = getActiveHierarchicalFacets();\n\t\tif (state.hasOwnProperty(property)) {\n\t\t\treturn Object.keys(state[property]).some((child) => {\n\t\t\t\tif (child.includes(parent) && child !== parent) {\n\t\t\t\t\tif (state[property][child] === FACET_STATE.ON) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t *\n\t * @param property\n\t * @param parent\n\t */\n\tconst hasExcludedChild = (property: string, parent: string) => {\n\t\tconst state = getActiveHierarchicalFacets();\n\t\tif (state.hasOwnProperty(property)) {\n\t\t\treturn Object.keys(state[property]).some((child) => {\n\t\t\t\tif (child.includes(parent) && child !== parent) {\n\t\t\t\t\tif (state[property][child] === FACET_STATE.OFF) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t};\n\n\treturn {\n\t\tgetActiveFacets,\n\t\tgetActiveHierarchicalFacets,\n\t\tgetTextFilter,\n\t\tupdateTextFilter,\n\t\tloadFacets,\n\t\ttoggleFacet,\n\t\ttoggleHierarchicalFacet,\n\t\ttoggleExcludeFacet,\n\t\ttoggleExcludeHierarchicalFacet,\n\t\tgetFacetState,\n\t\tgetHierarchicalFacetState,\n\t\tupdateFacets,\n\t\tupdateHierarchicalFacets,\n\t\tresetAllFacets,\n\t\thasSelectedChild,\n\t\thasExcludedChild,\n\t};\n};\n","export const CHARTS = {\n\tMATRIX: 'MATRIX',\n\tDONUT: 'DONUT',\n\tUS_MAP: 'US_MAP',\n\tWORLD_MAP: 'WORLD_MAP',\n\tEARTH_MAP: 'EARTH_MAP',\n\tCHOROPLETH_MAP: 'CHOROPLETH_MAP',\n\tSTACKED_BAR: 'STACKED_BAR',\n\tBAR: 'BAR',\n\tPOLAR_AREA: 'POLAR_AREA',\n\tCIRCLE_PACK: 'CIRCLE_PACK',\n\tCUSTOM_CIRCLE_PACK: 'CUSTOM_CIRCLE_PACK',\n\tHEAT_MAP: 'HEAT_MAP',\n\tTABLE: 'TABLE',\n\tTIMELINE: 'TIMELINE',\n};\n\nexport const LOGO_TYPES = {\n\tIMAGE: 'IMAGE',\n\tTEXT: 'TEXT',\n};\n\nexport type TODO = any;\n\n//TODO move this to middleware\nexport enum FilterComparatorType {\n\tEquals = '$eq',\n\tNotEquals = '$ne',\n\tLessThan = '$lt',\n\tLessThanEquals = '$lte',\n\tGreaterThan = '$gt',\n\tGreaterThanEquals = '$gte',\n\tStartsWith = '$sw',\n\tNotStartsWith = '$nsw',\n\tEndsWith = '$ew',\n\tContains = '$c',\n\tNotContains = '$nc',\n\tToken = '$token',\n\tTokenStartsWith = '$tsw',\n\tTokenEndsWith = '$tew',\n\tYoungerThan = '$yt',\n\tExists = '$exists',\n\tInside = '$inside',\n\tElementsMatch = '$elemMatch',\n}\n\n//TODO move this to middleware\nexport enum OperatorType {\n\t/** Combines all the child operations and condition results with a logical AND */\n\tAnd = '$and',\n\t/** Combines all the child operations and condition results with a logical OR */\n\tOr = '$or',\n\t/** Combines all the child operations and condition results with a logical ANDNOT */\n\tNand = '$nand',\n}\n","import { FACET_STATE } from 'hooks/useFacetsState';\nimport { isEmpty } from 'lodash';\nimport { FilterComparatorType, OperatorType } from 'types';\n\nexport const mergeQueryStrings = (queryStrings) => {\n\n\tconst orValues = [].concat.apply([], queryStrings.map(queryString => queryString[OperatorType.Or] || []));\n\tconst andValues = [].concat.apply([], queryStrings.map(queryString => queryString[OperatorType.And] || []));\n\n\tconst returnValue = {};\n\tif (orValues.length) returnValue[OperatorType.Or] = orValues;\n\tif (andValues.length) returnValue[OperatorType.And] = andValues;\n\n\treturn returnValue;\n}\n\n// converts items in the filters into the query syntax that gets passed back to the SRS filter api.\nexport const getQueryString = (key, filter) => {\n\tif (key === null || isEmpty(filter)) return {};\n\t// generate query string for facets\n\telse if (key === 'activeFacets') {\n\t\tlet queryString = Object.entries(filter || {}).map(([key, values]) => {\n\t\t\tconst onValues = Object.entries(values)\n\t\t\t\t.filter(([, state]) => {\n\t\t\t\t\treturn state === FACET_STATE.ON;\n\t\t\t\t})\n\t\t\t\t.map(([value]) => {\n\t\t\t\t\treturn { [key]: value };\n\t\t\t\t});\n\n\t\t\tconst offValues = Object.entries(values)\n\t\t\t\t.filter(([, state]) => {\n\t\t\t\t\treturn state === FACET_STATE.OFF;\n\t\t\t\t})\n\t\t\t\t.map(([value]) => {\n\t\t\t\t\treturn { [key]: { [FilterComparatorType.NotEquals]: value } };\n\t\t\t\t});\n\n\t\t\tconst returnValue = {};\n\t\t\tif (onValues.length) returnValue[OperatorType.Or] = onValues;\n\t\t\tif (offValues.length) returnValue[OperatorType.And] = offValues;\n\n\t\t\treturn returnValue;\n\t\t});\n\t\treturn { $and: queryString };\n\t}\n\t// generate query string for hierarchical facets\n\telse if (key === 'activeHierarchicalFacets') {\n\t\tlet queryString = Object.entries(filter || {}).map(([key, values]) => {\n\t\t\tconst onValues = Object.entries(values)\n\t\t\t\t.filter(([, state]) => {\n\t\t\t\t\treturn state === FACET_STATE.ON;\n\t\t\t\t})\n\t\t\t\t.map(([value]) => {\n\t\t\t\t\treturn { [key]: { [FilterComparatorType.StartsWith]: value } };\n\t\t\t\t});\n\n\t\t\tconst offValues = Object.entries(values)\n\t\t\t\t.filter(([, state]) => {\n\t\t\t\t\treturn state === FACET_STATE.OFF;\n\t\t\t\t})\n\t\t\t\t.map(([value]) => {\n\t\t\t\t\treturn { [key]: { [FilterComparatorType.NotStartsWith]: value } };\n\t\t\t\t});\n\n\t\t\tconst returnValue = {};\n\t\t\tif (onValues.length) returnValue[OperatorType.Or] = onValues;\n\t\t\tif (offValues.length) returnValue[OperatorType.And] = offValues;\n\n\t\t\treturn returnValue;\n\t\t});\n\t\treturn { $and: queryString }\n\t}\n\t// generate query string for timeline\n\telse if (key === 'timeline') {\n\t\tconst { timeProperty, timeExtents } = filter;\n\t\tif (!timeProperty || !timeExtents)\n\t\t\treturn;\n\n\t\tconst queryString = {\n\t\t\t$and: [\n\t\t\t\t{ [timeProperty.name]: { [FilterComparatorType.GreaterThanEquals]: timeExtents[0] } },\n\t\t\t\t{ [timeProperty.name]: { [FilterComparatorType.LessThan]: timeExtents[1] } }\n\t\t\t]\n\t\t}\n\t\treturn queryString;\n\t}\n\telse {\n\t\treturn {};\n\t}\n}\n","import { Classes, Divider, H3, H4, H5 } from '@blueprintjs/core';\nimport { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Colors } from './variables';\nimport { AppColors } from './variables-slykit';\n\n/**\n * flexbox shorthands\n */\nexport const flexChildrenV = css`\n display: flex;\n flex-direction: column;\n`;\nexport const flexChildrenH = css`\n display: flex;\n flex-direction: row;\n`;\nexport const flexStay = css`\n\tflex: 0 0 auto;\n`;\nexport const flexAdapt = css`\n flex: 1 1 auto;\n overflow: hidden;\n`;\n\n/**\n * Center things\n * OR: https://css-tricks.com/centering-css-complete-guide/\n */\nexport const centerSelf = css`\n transform: translate(-50%, -50%);\n top: 50%;\n left: 50%;\n position: relative;\n`;\nexport const centerContent = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\nexport const centerContentVertically = css`\n display: flex;\n align-items: center;\n`;\n\n/**\n * Aligns a \n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\nimport { Prompt } from 'react-router-dom';\nimport { Dialog as BlueprintDialog, Button, Classes } from '@blueprintjs/core';\n\nexport const Dialog = ({ body, footer, style, ...props }) => { // Why does this exist?\n\t// export const Dialog = ({ title, icon, body, onClose, style, footer }) => { \n\treturn (\n\t\t\n\t\t\t{body}\n\t\t\t{footer}\n\t\t\t{/* body and footer could just be children? */}\n\t\t\n\t);\n}\n\nexport const RouteLeavingGuard = ({ when, shouldBlockNavigation, navigate, title, text, icon }) => {\n\tconst [isModalVisible, setModalVisible] = useState(false);\n\tconst [lastLocation, setLastLocation] = useState(null);\n\tconst [isNavigationConfirmed, setIsNavigationConfirmed] = useState(false);\n\n\tconst showModal = (location) => {\n\t\tsetModalVisible(true);\n\t\tsetLastLocation(location);\n\t}\n\n\tconst closeModal = () => {\n\t\tsetModalVisible(false);\n\t}\n\n\tconst handleBlockedNavigation = useCallback((nextLocation) => {\n\t\tif (!isNavigationConfirmed && shouldBlockNavigation(nextLocation)) {\n\t\t\tshowModal(nextLocation);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}, [isNavigationConfirmed, shouldBlockNavigation]);\n\n\tconst handleConfirmNavigationClick = useCallback(() => {\n\t\tsetModalVisible(false);\n\t\tif (lastLocation) {\n\t\t\tsetIsNavigationConfirmed(true);\n\t\t}\n\t}, [lastLocation]);\n\n\tuseEffect(() => {\n\t\tif (isNavigationConfirmed) {\n\t\t\tnavigate(lastLocation.pathname);\n\t\t}\n\t}, [isNavigationConfirmed, lastLocation, navigate]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{/* {isModalVisible && */}\n\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t

{text}

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{/* } */}\n\t\t\n\t)\n}\n\nconst styles = {\n\tDialog: css`\n\t.${Classes.BUTTON}{ \n\t\tmargin-left: 5px; \n\t}\n\t.${Classes.DIALOG_FOOTER}{ \n\t\ttext-align: right; \n\t}\n`,\n}\n","import {\n\tExplorerCard,\n\tIDashboardConfig,\n\tIExplorerView,\n\tISavedDashboard,\n\tSavedViewTypes,\n\tSavedWidget,\n} from 'hooks/savedViews/types';\nimport { LAYOUT_OPTIONS } from '/views/explorer/layoutOptions';\n\nexport function transformExplorerViewToDashboard(explorer: IExplorerView, name: string): ISavedDashboard;\nexport function transformExplorerViewToDashboard(explorer: IExplorerView, name: undefined): IDashboardConfig;\nexport function transformExplorerViewToDashboard(explorer, name) {\n\tconst selectedDefinition = explorer.selectedDefinitionName;\n\tconst filters = explorer.filters;\n\tconst cardConfigs = explorer.layout.cards.map((card) =>\n\t\ttransformExplorerCardToDashboard(card, selectedDefinition, filters)\n\t);\n\n\tlet meta;\n\tif (name) {\n\t\tmeta = {\n\t\t\tmetaData: {\n\t\t\t\ttype: SavedViewTypes.Dashboard,\n\t\t\t\tname,\n\t\t\t\tisFavorite: false\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\tcards: cardConfigs,\n\t\t...meta,\n\t};\n}\n\nexport function transformExplorerCardToDashboard(\n\tcard: ExplorerCard,\n\tselectedDefinition,\n\tfilters: { facets: {activeFacets, activeHierarchicalFacets}; timeline },\n\tname = ''\n): SavedWidget {\n\treturn {\n\t\ttype: card.type,\n\t\tdataConfiguration: {\n\t\t\tselectedDefinition: selectedDefinition,\n\t\t\tfilters: {\n\t\t\t\tactiveFacets: filters.facets?.activeFacets || {},\n\t\t\t\tactiveHierarchicalFacets: filters.facets?.activeHierarchicalFacets || {},\n\t\t\t\ttimeline: filters.timeline,\n\t\t\t},\n\t\t\tendpointQuery: {\n\t\t\t\tendpointKey: card.type,\n\t\t\t\tselectedDefinition,\n\t\t\t\toptions: card.endpointQuery.options,\n\t\t\t\tparameters: card.endpointQuery.parameters,\n\t\t\t},\n\t\t},\n\t\twidgetConfiguration: card.widgetConfiguration ?? {},\n\t\tmetaData: {\n\t\t\tname,\n\t\t\ttype: SavedViewTypes.Widget,\n\t\t\tid: '',\n\t\t\tisFavorite: false\n\t\t},\n\t};\n}\n\nexport function transformExplorerCardToExplorer(card: SavedWidget): IExplorerView {\n\treturn {\n\t\tlayout: {\n\t\t\tlayoutStyle: LAYOUT_OPTIONS['ONE'],\n\t\t\tcards: [\n\t\t\t\t{\n\t\t\t\t\ttype: card.type,\n\t\t\t\t\tendpointQuery: card.dataConfiguration.endpointQuery,\n\t\t\t\t\twidgetConfiguration: card.widgetConfiguration,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tfilters: {\n\t\t\ttimeline: card.dataConfiguration.filters.timeline,\n\t\t\tfacets: {\n\t\t\t\tactiveFacets: card.dataConfiguration.filters?.activeFacets || {},\n\t\t\t\tactiveHierarchicalFacets: card.dataConfiguration.filters?.activeHierarchicalFacets || {},\n\t\t\t\ttextFilter: ''\n\t\t\t}\n\t\t},\n\t\tselectedDefinitionName: card.dataConfiguration.selectedDefinition\n\t};\n}\n","import { ExplorerCard, SavedViewTypes, SavedWidget } from 'hooks/savedViews/types';\nimport { transformExplorerCardToDashboard } from 'hooks/savedViews/helpers';\nimport { LAYOUT_OPTIONS } from 'views/explorer/layoutOptions';\n\nexport const SavedStatesActions = {\n\tSAVE_DASHBOARD: 'SAVE_DASHBOARD',\n\tSAVE_EXPLORER: 'SAVE_EXPLORER',\n\tSAVE_WIDGET: 'SAVE_WIDGET',\n\tDELETE_VIEW: 'DELETE_VIEW',\n\tNEW_DASHBOARD: 'NEW_DASHBOARD',\n\tSET_ACTIVE_ITEM: 'SET_ACTIVE_ITEM',\n\tUPDATE_VIEW: 'UPDATE_VIEW',\n\tLOAD_VIEWS: 'LOAD_VIEWS',\n\tSET_ERROR: 'SET_ERROR'\n};\n\nexport const SavedStatesActionCreator = {\n\tloadViews: (views) => ({\n\t\ttype: SavedStatesActions.LOAD_VIEWS,\n\t\tpayload: views\n\t}),\n\tsaveExplorer: (id, explorer, name = '') => ({\n\t\ttype: SavedStatesActions.SAVE_EXPLORER,\n\t\tpayload: {\n\t\t\tid,\n\t\t\tview: {\n\t\t\t\t...explorer,\n\t\t\t\tmetaData: {\n\t\t\t\t\ttype: SavedViewTypes.Explorer,\n\t\t\t\t\tname,\n\t\t\t\t\tid,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}),\n\tnewDashboard: (id, name) => ({\n\t\ttype: SavedStatesActions.NEW_DASHBOARD,\n\t\tpayload: {\n\t\t\tid,\n\t\t\tview: {\n\t\t\t\tcards: [],\n\t\t\t\tlayout: {\n\t\t\t\t\tlayoutStyle: {\n\t\t\t\t\t\tkey: LAYOUT_OPTIONS.ONE,\n\t\t\t\t\t\tcardCount: 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmetaData: {\n\t\t\t\t\ttype: SavedViewTypes.Dashboard,\n\t\t\t\t\tname,\n\t\t\t\t\tisFavorite: false,\n\t\t\t\t\tid\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}),\n\tsaveWidget: (\n\t\tid,\n\t\twidget: ExplorerCard,\n\t\tselectedDefinitionName,\n\t\tfilters,\n\t\tname = ''\n\t): { type: string; payload: { id; view: SavedWidget } } => {\n\t\tconst transformedWidget = transformExplorerCardToDashboard(widget, selectedDefinitionName, filters, name);\n\t\ttransformedWidget.metaData.id = id;\n\t\treturn {\n\t\t\ttype: SavedStatesActions.SAVE_WIDGET,\n\t\t\tpayload: {\n\t\t\t\tid,\n\t\t\t\tview: transformedWidget,\n\t\t\t},\n\t\t};\n\t},\n\tdeleteView: (viewType, id) => ({\n\t\ttype: SavedStatesActions.DELETE_VIEW,\n\t\tpayload: {\n\t\t\tid,\n\t\t\tviewType,\n\t\t},\n\t}),\n\tsetActiveItem: (id) => ({\n\t\ttype: SavedStatesActions.SET_ACTIVE_ITEM,\n\t\tpayload: id,\n\t}),\n\tupdateView: (view) => {\n\t\tconst viewType = view?.metaData?.type;\n\n\t\tif (viewType === SavedViewTypes.Widget) {\n\t\t\treturn {\n\t\t\t\ttype: SavedStatesActions.UPDATE_VIEW,\n\t\t\t\tpayload: {\n\t\t\t\t\tid: view.metaData.id,\n\t\t\t\t\tview\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (viewType === SavedViewTypes.Explorer) {\n\t\t\treturn {\n\t\t\t\ttype: SavedStatesActions.UPDATE_VIEW,\n\t\t\t\tpayload: {\n\t\t\t\t\tid: view.metaData.id,\n\t\t\t\t\tview\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (viewType === SavedViewTypes.Dashboard) {\n\t\t\treturn {\n\t\t\t\ttype: SavedStatesActions.UPDATE_VIEW,\n\t\t\t\tpayload: {\n\t\t\t\t\tid: view.metaData.id,\n\t\t\t\t\tview\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\ttype: 'NULL',\n\t\t\t\tpayload: {},\n\t\t\t};\n\t\t}\n\t},\n\tsetError: (error) => {\n\t\treturn {\n\t\t\ttype: SavedStatesActions.SET_ERROR,\n\t\t\tpayload: error\n\t\t}\n\t}\n};\n","import { createContext, useCallback, useContext, useEffect, useMemo, useReducer } from 'react';\nimport { initialState, ISavedStates, reducer } from 'hooks/savedViews/reducer';\nimport { SavedStatesActions, SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { SlykitContext } from '../../slykitContext';\nimport { del, get, post, put } from 'srs-middleware';\n\ntype TODO = any;\n\nexport const SavedStatesContext = createContext<{ state: ISavedStates; dispatch: TODO }>(null);\n\nconst getSavedViews = async () => {\n\treturn await get(`/SRS/Application/Slykit/SavedViews`);\n};\n\nconst postSavedView = async (id: string, view: Object) => {\n\treturn await post(`/SRS/Application/Slykit/SavedViews/${id}`, JSON.stringify(view));\n};\n\nconst putSavedView = async (id: string, view: Object) => {\n\treturn await put(`/SRS/Application/Slykit/SavedViews/${id}`, JSON.stringify(view));\n};\n\nconst deleteSavedView = async (id: string) => {\n\treturn await del(`/SRS/Application/Slykit/SavedViews/${id}`);\n};\n\nexport function useSavedStatesState(isReady) {\n\tconst [state, dispatch] = useReducer(reducer, initialState);\n\n\t// load any saved views from the backend\n\tuseEffect(() => {\n\t\tif (isReady) {\n\t\t\tgetSavedViews()\n\t\t\t\t.then((views: string[]) => {\n\t\t\t\t\tconst payload = {\n\t\t\t\t\t\tisSavedStateAvailable: true,\n\t\t\t\t\t\tdashboards: {},\n\t\t\t\t\t\texplorers: {},\n\t\t\t\t\t\twidgets: {},\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t};\n\t\t\t\t\tif (views.length > 0) {\n\t\t\t\t\t\tconst formattedViews = views\n\t\t\t\t\t\t\t.map((view) => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\treturn JSON.parse(view);\n\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\tconsole.warn(`ERROR PARSING VIEW: ${view}`);\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter((view) => view !== null);\n\t\t\t\t\t\tformattedViews.forEach((view) => {\n\t\t\t\t\t\t\tconst type = view.metaData.type;\n\t\t\t\t\t\t\tpayload[`${type}s`][view.metaData.id] = view;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tdispatch(SavedStatesActionCreator.loadViews(payload));\n\t\t\t\t})\n\t\t\t\t.catch((e) => {\n\t\t\t\t\tconst payload = {\n\t\t\t\t\t\tisSavedStateAvailable: false,\n\t\t\t\t\t\tdashboards: {},\n\t\t\t\t\t\texplorers: {},\n\t\t\t\t\t\twidgets: {},\n\t\t\t\t\t\terror: e,\n\t\t\t\t\t};\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'SERBERUS: The server does not have saved views ' +\n\t\t\t\t\t\t\t'enabled. `useSavedStatesState` expects it to be available.'\n\t\t\t\t\t);\n\t\t\t\t\tdispatch(SavedStatesActionCreator.loadViews(payload));\n\t\t\t\t});\n\t\t}\n\t}, [isReady]);\n\n\t// fire off api actions before updating state\n\tconst customDispatch = useCallback(\n\t\t(action) => {\n\t\t\tif (action.type === SavedStatesActions.SAVE_EXPLORER || action.type === SavedStatesActions.SAVE_WIDGET) {\n\t\t\t\tpostSavedView(action.payload.id, action.payload.view).catch((e) => {\n\t\t\t\t\tdispatch(SavedStatesActionCreator.setError(e));\n\t\t\t\t});\n\t\t\t} else if (action.type === SavedStatesActions.NEW_DASHBOARD) {\n\t\t\t} else if (action.type === SavedStatesActions.UPDATE_VIEW) {\n\t\t\t\tputSavedView(action.payload.id, action.payload.view).catch((e) => {\n\t\t\t\t\tdispatch(SavedStatesActionCreator.setError(e));\n\t\t\t\t});\n\t\t\t} else if (action.type === SavedStatesActions.DELETE_VIEW) {\n\t\t\t\tdeleteSavedView(action.payload.id).catch((e) => {\n\t\t\t\t\tdispatch(SavedStatesActionCreator.setError(e));\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn dispatch(action);\n\t\t},\n\t\t[dispatch]\n\t);\n\n\treturn useMemo(() => {\n\t\treturn { state, dispatch: customDispatch };\n\t}, [state, customDispatch]);\n}\n\nexport function useSavedStateSelectors() {\n\tconst { state } = useContext(SlykitContext);\n\tif (!state.features.isSaveViewsEnabled) return {};\n\tconst {\n\t\tstate: { isSavedStateAvailable, explorers: ogExplorers, widgets: ogWidgets, dashboards: ogDashboards },\n\t\tdispatch,\n\t} = useContext(SavedStatesContext);\n\n\t// Attach ids to dashboards\n\tconst dashboards = useMemo(() => {\n\t\treturn Object.entries(ogDashboards).map(([id, dashboard]) => ({\n\t\t\t...dashboard,\n\t\t\tmetaData: {\n\t\t\t\tid,\n\t\t\t\t...dashboard.metaData,\n\t\t\t},\n\t\t}));\n\t}, [ogDashboards]);\n\n\t// Attach ids to widgets\n\tconst widgets = useMemo(() => {\n\t\treturn Object.entries(ogWidgets).map(([id, widget]) => ({\n\t\t\t...widget,\n\t\t\tmetaData: {\n\t\t\t\tid,\n\t\t\t\t...widget.metaData,\n\t\t\t},\n\t\t}));\n\t}, [ogWidgets]);\n\n\t// Attach ids to explorers\n\tconst explorers = useMemo(() => {\n\t\treturn Object.entries(ogExplorers).map(([id, explorer]) => ({\n\t\t\t...explorer,\n\t\t\tmetaData: {\n\t\t\t\tid,\n\t\t\t\t...explorer.metaData,\n\t\t\t},\n\t\t}));\n\t}, [ogExplorers]);\n\n\treturn { isSavedStateAvailable, dashboards, explorers, widgets, dispatch };\n}","import { useCallback, useReducer, useContext } from 'react';\nimport { SlykitContext } from '../slykitContext';\nimport produce, { Draft } from 'immer';\n\nexport function useApplicationState(toCheck = {} as TODO) {\n\tconst init = useCallback(\n\t\t(passedInState) => {\n\t\t\tif (toCheck && toCheck.savedStates) {\n\t\t\t\tif (toCheck.savedStates.dashboards) {\n\t\t\t\t\tpassedInState.savedStates.dashboards = toCheck.savedStates.dashboards;\n\t\t\t\t}\n\n\t\t\t\tif (toCheck.savedStates.widgets) {\n\t\t\t\t\tpassedInState.savedStates.widgets = toCheck.savedStates.widgets;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (toCheck && toCheck.features) {\n\t\t\t\tfor (const [key, value] of Object.entries(toCheck.features)) {\n\t\t\t\t\tif (Object.keys(passedInState.features).includes(key)) {\n\t\t\t\t\t\tpassedInState.features[key] = value;\n\t\t\t\t\t} else { \n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t'SERBERUS: There is no feature ' + key + ' expected in the IApplication Interface. Change or remove this feature or add it to the interface.'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpassedInState.features = toCheck.features;\n\t\t\t}\n\t\t\treturn passedInState;\n\t\t},\n\t\t[toCheck]\n\t);\n\n\tconst [state, dispatch] = useReducer(reducer, initialState, init);\n\treturn [state, dispatch];\n}\n\nconst reducer = produce((draft: Draft, action) => {\n\tswitch (action.type) {\n\t\tcase ApplicationStateActions.UPDATE_DASHBOARD: {\n\t\t\tconst { key, dashboard } = action.payload;\n\t\t\tdraft.savedStates.dashboards[key] = dashboard;\n\t\t\tbreak;\n\t\t}\n\t\tcase ApplicationStateActions.UPDATE_WIDGET: {\n\t\t\tconst { key, widget } = action.payload;\n\t\t\tdraft.savedStates.widgets[key] = widget;\n\t\t\tbreak;\n\t\t}\n\t\tcase ApplicationStateActions.UPDATE_WIDGETS: {\n\t\t\tdraft.savedStates.widgets = action.payload\n\t\t\tbreak;\n\t\t }\n\t\tcase ApplicationStateActions.UPDATE_APP_STATE: {\n\t\t\tdraft.savedStates = action.payload.savedStates;\n\t\t\tbreak;\n\t\t}\n\t\tcase ApplicationStateActions.UPDATE_FEATURES: {\n\t\t\tfor (const [key, value] of Object.entries(action.payload)) {\n\t\t\t\tif (Object.keys(draft.features).includes(key)) {\n\t\t\t\t\tdraft.features[key] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n});\ntype TODO = any;\n\nexport interface IApplicationState {\n\tsavedStates: {\n\t\tdashboards: TODO;\n\t\twidgets: TODO;\n\t};\n\tfeatures: IFeatures;\n}\nexport interface IFeatures {\n\tisSaveViewsEnabled: boolean;\n}\n\nlet initialState: IApplicationState = {\n\tsavedStates: {\n\t\tdashboards: {},\n\t\twidgets: {},\n\t},\n\tfeatures: {\n\t\tisSaveViewsEnabled: false,\n\t},\n};\n\nexport const ApplicationStateActions = {\n\tUPDATE_DASHBOARD: 'UPDATE_DASHBOARD',\n\tUPDATE_WIDGET: 'UPDATE_WIDGET',\n\tUPDATE_WIDGETS: 'UPDATE_WIDGETS',\n\tUPDATE_APP_STATE: 'UPDATE_APP_STATE',\n\tUPDATE_FEATURES: 'UPDATE_FEATURES',\n};\n\nexport const ApplicationStateActionCreator = {\n\tupdateDashboard: (key, dashboard) => ({\n\t\ttype: ApplicationStateActions.UPDATE_DASHBOARD,\n\t\tpayload: {\n\t\t\tkey,\n\t\t\tdashboard,\n\t\t},\n\t}),\n\tupdateAppState: (payload) => ({\n\t\ttype: ApplicationStateActions.UPDATE_APP_STATE,\n\t\tpayload: payload,\n\t}),\n\tupdateFeatures: (payload) => ({\n\t\ttype: ApplicationStateActions.UPDATE_FEATURES,\n\t\tpayload: payload,\n\t}),\n\tupdateWidgets: (payload) => ({\n\t\ttype: ApplicationStateActions.UPDATE_WIDGETS,\n\t\tpayload: payload\n\t })\n};\n\n// Boolean to see if Saved States is enabled\nexport function useIsSavedStateAvailable(): boolean {\n\tconst context = useContext(SlykitContext);\n\treturn context?.state?.features.isSaveViewsEnabled;\n}\n","/** @jsx jsx */\nimport React, { Fragment, useCallback, useContext, useEffect, useState } from 'react';\nimport { Button, Classes, InputGroup, Tooltip } from '@blueprintjs/core';\nimport { Dialog } from 'components/dialogs';\nimport { jsx, css } from '@emotion/react';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { useIsSavedStateAvailable } from 'hooks/useApplicationState';\nimport { SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * Component responsible for causing the current active explorer to be saved.\n * This should open the SaveCurrentView View modal.\n *\n * @returns {*}\n * @constructor\n */\nexport const SaveCurrentView = () => {\n\tconst {\n\t\tstate: { explorer },\n\t\tdispatch: workspaceDispatch,\n\t} = useContext(WorkspaceContext);\n\n\tconst { explorers, dispatch } = useSavedStateSelectors();\n\tconst isSavable = useIsSavedStateAvailable();\n\n\tconst [name, setName] = useState('');\n\tconst [isDialogOpen, setDialogState] = useState(false);\n\tconst [fetchSavedExplorer, setFetchSavedExplorer] = useState(false);\n\tconst [id, setId] = useState(null);\n\n\tconst openSaveModal = () => {\n\t\tsetName(randName());\n\t\tsetDialogState(true);\n\t};\n\n\tconst closeSaveModal = () => {\n\t\tsetDialogState(false);\n\t};\n\n\tconst saveState = () => {\n\t\tif (name !== '') {\n\t\t\tconst id = uuid();\n\t\t\tsetId(id);\n\t\t\tdispatch(SavedStatesActionCreator.saveExplorer(id, explorer, name));\n\t\t\tsetFetchSavedExplorer(true);\n\t\t}\n\t};\n\n\t// load the saved meta data into the explorer before closing the dialog\n\tuseEffect(() => {\n\t\tif (fetchSavedExplorer) {\n\t\t\tconst savedExplorer = explorers.filter((x) => x.metaData.id === id)[0];\n\t\t\tworkspaceDispatch(WorkspaceActionCreator.updateMetaData(savedExplorer.metaData));\n\t\t\tcloseSaveModal();\n\t\t}\n\t}, [id, fetchSavedExplorer, explorers, workspaceDispatch]);\n\n\tif (!isSavable) return null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t

To save this view, enter a title.

\n\t\t\t\t\t\t setName(e.target.value)} fill />\n\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n\nexport const SaveExistingView = () => {\n\tconst [isSaveModalOpen, setSaveModalOpen] = useState(false);\n\n\tconst openSaveModal = () => {\n\t\tsetSaveModalOpen(true);\n\t};\n\n\tconst closeSaveModal = () => {\n\t\tsetSaveModalOpen(false);\n\t};\n\n\tconst {\n\t\tstate: { explorer, explorer: workspaceExplorer },\n\t} = useContext(WorkspaceContext);\n\n\tconst { dispatch } = useSavedStateSelectors();\n\tconst isSavable = useIsSavedStateAvailable();\n\n\tconst saveState = () => {\n\t\tcloseSaveModal();\n\t\tdispatch(SavedStatesActionCreator.updateView(explorer));\n\t};\n\n\tif (!isSavable) return null;\n\n\tif (!workspaceExplorer.metaData) return null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t

Saving this will update and overwrite any previously saved filter settings.

\n\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t/>\n\t\t\n\t);\n};\n\nexport function SaveWidget({ card }) {\n\tconst { dispatch } = useSavedStateSelectors();\n\n\tconst [isDialogOpen, setDialogState] = useState(false);\n\tconst [name, setName] = useState('');\n\n\tconst openSaveModal = () => {\n\t\tsetName(randName());\n\t\tsetDialogState(true);\n\t};\n\n\tconst closeSaveModal = () => {\n\t\tsetDialogState(false);\n\t};\n\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName, filters },\n\t\t},\n\t} = useContext(WorkspaceContext);\n\n\tconst saveWidget = useCallback(() => {\n\t\tif (name) {\n\t\t\tconst id = uuid();\n\t\t\tdispatch(SavedStatesActionCreator.saveWidget(id, card, selectedDefinitionName, filters, name));\n\t\t}\n\t\tcloseSaveModal();\n\t}, [dispatch, card, selectedDefinitionName, filters, name]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\t

To save this widget view, enter a title.

\n\t\t\t\t\t\t setName(e.target.value)} fill />\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tfooter={\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t/>\n\t\t
\n\t);\n}\n\nfunction randName() {\n\tconst adjectives = ['Happy', 'Snappy', 'Quick', 'Quirky'];\n\tconst nouns = ['apple', 'walrus', 'whale', 'robot'];\n\tconst firstIndex = Math.floor(Math.random() * adjectives.length);\n\tconst secondIndex = Math.floor(Math.random() * nouns.length);\n\treturn `${adjectives[firstIndex]} ${nouns[secondIndex]}`;\n}\n","import { WIDGETS, WIDGET_TYPES } from '/widgets';\nimport { useAsyncCallback } from 'hooks/useAsyncCallback';\nimport { useEffect, useState } from 'react';\nimport { Result } from 'srs-middleware';\nimport { EndpointRequest, EndpointQuery } from \"interfaces\";\nimport { EmptyResultError, returnEmptyResultError } from 'widgets/endpointDecorators';\n\n/**\n * Hook to fetch data from the given endpoint\n *\n * @param result\n * @param selectedDefinitionName\n * @param type\n * @param endpointQuery\n * @returns {{data: null, loading: boolean, error: null}}\n */\nexport const useFetchEndpointData = returnEmptyResultError(\n\t(\n\t\tresult: Result,\n\t\tselectedDefinitionName: string,\n\t\ttype: WIDGET_TYPES,\n\t\tendpointQuery: EndpointQuery //TODO create a type for this.\n\t)=>{\n\t// fires when the filteredResult changes or the endpoint query changes\n\tconst { data, loading, error } = useAsyncCallback(async () => {\n\t\tif (!result?.resultId || !endpointQuery?.options) return; // data: null, loading: false, error: null\n\n\t\t// retrieve the correct endpoint based on the type\n\t\tconst endpoint: EndpointRequest = WIDGETS[type].endpoint;\n\n\t\t// use filtered Result (which may not be filtered) to retrieve the data for the given endpoint\n\t\treturn await endpoint(\n\t\t\tresult,\n\t\t\tselectedDefinitionName,\n\t\t\tendpointQuery.options\n\t\t);\n\t}, [endpointQuery, selectedDefinitionName, result, type]);\n\n\t// Trigger a react error if the network request fails\n\tconst [, setTriggerError] = useState(null);\n\tuseEffect(() => {\n\t\tif (error) {\n\t\t\tsetTriggerError(() => {\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t}\n\t}, [error]);\n\n\treturn { data, loading, error };\n})\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { ResizeSensor } from '@blueprintjs/core';\nimport React, { useEffect, useState } from 'react';\nimport { useFetchEndpointData } from 'hooks/useFetchEndpointData';\nimport { WidgetContainer } from '/views/common/widgetContainer';\nimport { WIDGETS } from '/widgets';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { useFilteredProperties } from 'utilities/srsUtils';\nimport { ErrorBoundary } from 'components/errorBoundary';\nimport { WidgetControls } from 'views/common/WidgetControls';\n\n/**\n * A ExplorerCard provides a generalized method for rendering a chart onto a\n * Explorer. The Card is responsible for rendering a ChartContainer,\n * which in turn will instantiate and render the specific Chart.\n *\n * @returns {*}\n * @constructor\n */\nexport const ExplorerCard = ({ result, selectedDefinitionName, dispatch, card, cardIndex, stopResize = false }) => {\n\t// Store dimensions of things\n\tconst [dimensions, setDimensions] = useState({ width: 300, height: 400 });\n\n\t// properties based on type\n\t// These values are read/pulled from the widget config.ts file\n\tconst { Actions, flags, types, createDefaultOptions, createDefaultConfiguration, allowedProperties = [] } = WIDGETS[\n\t\tcard.type\n\t];\n\n\t// filter the properties based on flags, types, and/or allowedProperties\n\tconst filteredProperties = useFilteredProperties(selectedDefinitionName, flags, types, allowedProperties);\n\n\t// provide set of default endpoint options if none given\n\tuseEffect(() => {\n\t\tif (!card?.endpointQuery?.options) {\n\t\t\tconst options = createDefaultOptions(filteredProperties);\n\t\t\tdispatch(WorkspaceActionCreator.options(cardIndex, options));\n\t\t}\n\t}, [card, selectedDefinitionName, dispatch, filteredProperties, cardIndex, createDefaultOptions]);\n\n\t// provide a default widget configuration if none given\n\tuseEffect(() => {\n\t\t// Where dynamic configurations come in (i.e. cyhy/src/configurations/widgetConfigurations.json\n\t\t// TODO make createDefaultConfiguration required for all charts\n\t\tif (!card?.widgetConfiguration && createDefaultConfiguration) {\n\t\t\tconst widgetConfig = createDefaultConfiguration(filteredProperties);\n\t\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, widgetConfig));\n\t\t}\n\t}, [card, cardIndex, createDefaultConfiguration, dispatch, filteredProperties]);\n\n\t// resize the widgets appropriately\n\tfunction onResize(entries) {\n\t\tif (!stopResize) {\n\t\t\tconst entry = entries[0].contentRect;\n\t\t\tsetDimensions({ width: entry.width, height: entry.height });\n\t\t}\n\t}\n\n\treturn (\n\t\t
\n\n\t\t\t{Actions && (\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t)}\n\n\t\t\t{/* used for catching endpoint errors */}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\n\t\t
\n\t);\n};\n\nfunction ExplorerData({ cardIndex, dimensions, card, result, selectedDefinitionName }) {\n\t// fetch the filtered data\n\tconst { data, loading } = useFetchEndpointData(result, selectedDefinitionName, card.type, card.endpointQuery);\n\n\t// Choose when data refreshes\n\tconst [validData, setValidData] = useState(null);\n\tuseEffect(() => {\n\t\tif (data || result?.resultId === 0) {\n\t\t\tsetValidData(data);\n\t\t}\n\t}, [data, result]);\n\n\treturn (\n\t\t\n\t);\n}\n\nconst headerCss = css`\n\tflex: 0 0 auto;\n\tdisplay: flex;\n`;\n\nconst cardCss = css`\n\tflex: 1 1 auto;\n\tdisplay: flex;\n\tflex-flow: column;\n\toverflow: hidden;\n`;\n\nconst containerCss = css`\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tposition: relative;\n\tdisplay: flex;\n`;\n","/** @jsx jsx */\nimport React, { useState, useContext, useRef, useEffect, useMemo } from 'react';\nimport { Button, Card, Classes, Dialog, H4, H6, Icon, Intent } from '@blueprintjs/core';\nimport { css, jsx } from '@emotion/react';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WIDGETS } from 'widgets';\nimport { ExplorerCard } from 'views/explorer/explorerCard';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport isEqual from 'lodash-es/isEqual';\nimport { ColorAliases } from 'styles/variables';\nimport CardContext from './cardContext';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\n\nconst DIALOG_VIEWS = {\n\tSETTINGS: 'SETTINGS',\n\tCANCEL: 'CANCEL',\n};\n\nexport default function ({ isOpen, close, card, cardIndex }) {\n\tconst [viewState, setViewState] = useState(DIALOG_VIEWS.SETTINGS);\n\tconst [closeFlag, setCloseFlag] = useState(false);\n\tconst originalEndpointRef = useRef();\n\tconst originalConfigRef = useRef();\n\tconst { dispatch } = useContext(WorkspaceContext);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\t//cache original state in case user clicks \"cancel\"\n\t\t\toriginalEndpointRef.current = JSON.parse(JSON.stringify(card.endpointQuery));\n\t\t\t//if widgetConfig defined then make a 'deep' copy; if not defined just use it as is (thus all equality checks will pass)\n\t\t\toriginalConfigRef.current = card.widgetConfiguration\n\t\t\t\t? JSON.parse(JSON.stringify(card.widgetConfiguration))\n\t\t\t\t: card.widgetConfiguration;\n\t\t} else {\n\t\t\t//set things back up for when button is pressed again\n\t\t\tsetViewState(DIALOG_VIEWS.SETTINGS);\n\t\t}\n\t}, [isOpen]);\n\n\tconst _prepCancel = () => {\n\t\tif (\n\t\t\t!isEqual(originalEndpointRef.current, card.endpointQuery) ||\n\t\t\t!isEqual(originalConfigRef.current, card.widgetConfiguration)\n\t\t) {\n\t\t\tsetViewState(DIALOG_VIEWS.CANCEL);\n\t\t} else {\n\t\t\tclose();\n\t\t}\n\t};\n\n\t//In the cancel dialog there are two things that can happen. 1. Go back to setting done with setViewState, or cancel settings. Which is handled here\n\tconst _cancelSettings = () => {\n\t\tdispatch(WorkspaceActionCreator.options(cardIndex, originalEndpointRef.current));\n\t\tdispatch(WorkspaceActionCreator.configuration(cardIndex, originalConfigRef.current));\n\t\t//Need to wait till original data is put in place, then we can close (other wise widget does a quick render of altered data then again with original data)\n\t\tsetCloseFlag(true);\n\t};\n\tuseEffect(() => {\n\t\tif (closeFlag) {\n\t\t\tclose();\n\t\t\tsetCloseFlag(false);\n\t\t}\n\t\t// Don't listen on closeFlag, otherwise it will fire too soon. Wait for the card updates and know closeFlag will be what it should be\n\t}, [card.endpointQuery, card.widgetConfiguration /*, closeFlag*/]);\n\n\tconst value = useMemo(\n\t\t() => ({\n\t\t\tisSettingsDialogOpen: !isOpen, //fake out the widget in the dialog to update only when dialog is open\n\t\t}),\n\t\t[isOpen]\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n\nfunction Settings({ isOpen, onSave, onCancel, card, cardIndex }) {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t\ttransient: { activeResult },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tlet { widgetConfiguration, endpointQuery, type } = card;\n\tconst { Knobs, flags, types, label } = WIDGETS[type];\n\n\tconst colorScaleFunction = useContext(ColorScalesContext);\n\tif (widgetConfiguration) {\n\t\t//if this app specifies this widgets colors use those, otherwise widget specific scales (if not set then later on will use default)\n\t\tlet availableColorScales =\n\t\t\tcolorScaleFunction?.getAvailableScales(type) || widgetConfiguration?.availableColorScales;\n\t\twidgetConfiguration = { availableColorScales, ...widgetConfiguration };\n\t}\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t

{label} Settings

\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t
Preview
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\nconst dialogRoot = css`\n\tpadding-bottom: 0;\n\tmin-width: 70%;\n\toverflow: hidden;\n\theight: 60vh; //min-height causes window to infinitely grow\n`;\n\nconst dialogBody = css`\n\tdisplay: grid;\n\tgrid-template-columns: 0.55fr 0.45fr;\n\tgrid-column-gap: 8px;\n\tmargin: 8px 8px 9px 7px;\n\toverflow: hidden;\n`;\nconst knobCard = css`\n\toverflow: auto;\n`;\nconst widgetCard = css`\n\tpadding: 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n`;\nconst cancelButton = css`\n\tmargin-right: 5px;\n`;\n\nfunction CancelConfirm({ isOpen, setViewState, close }) {\n\tconst _return = () => {\n\t\tsetViewState(DIALOG_VIEWS.SETTINGS);\n\t};\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

Cancel Changes

\n\t\t\t
\n\t\t\t
\n\t\t\t\tChanges have been made to the widget settings. Closing will revert settings to their most recent state.\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst cancelDialogCss = css`\n\tbackground: ${ColorAliases.PT_APP_BACKGROUND_COLOR};\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useCallback, useContext, useMemo } from 'react';\nimport { Button, Classes, Divider, MenuItem } from '@blueprintjs/core';\nimport { Select } from '@blueprintjs/select';\nimport { Icon } from '/components/icon';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WIDGETS } from 'widgets';\n\n/**\n * Shows the view that available.\n *\n * input: [['key', 'view'], ...]\n *\n * @param views\n * @param onSelect\n * @returns {*}\n * @constructor\n */\nexport const SavedViewSelector = ({ views, onSelect }) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\tLoad View\n\t\t\t\n\t\t\n\t);\n};\n\nconst ItemRenderer = (view, { handleClick, modifiers, index }) => {\n\tif (!modifiers.matchesPredicate) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t\n\t);\n};\n\n// Dropdown for selecting a saved widget\nexport const SavedWidgetSelector = ({ cardIndex, showAllSavedWidgets }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\n\tconst { widgets } = useSavedStateSelectors();\n\n\tconst savedWidgets = useMemo(() => {\n\t\tconst savedWidgets = widgets\n\t\t\t.map((widget) => ({\n\t\t\t\tkey: widget.metaData.id,\n\t\t\t\tlabel: widget.metaData.name,\n\t\t\t\ttype: widget.type,\n\t\t\t\ticon: WIDGETS[widget.type].icon,\n\t\t\t\tsavedWidget: widget,\n\t\t\t\tdisabled: widget.dataConfiguration.selectedDefinition !== selectedDefinitionName,\n\t\t\t}))\n\t\t\t.sort((a, b) => (a.disabled === b.disabled ? 0 : b.disabled ? -1 : 1)); // sort disabled widgets to the bottom of the list\n\n\t\treturn showAllSavedWidgets\n\t\t\t? savedWidgets.map((widget, index) => {\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\twidget.separated = true;\n\t\t\t\t\t\treturn widget;\n\t\t\t\t\t}\n\t\t\t\t\tconst prev = savedWidgets[index - 1];\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...widget,\n\t\t\t\t\t\tseparated:\n\t\t\t\t\t\t\tprev.savedWidget.dataConfiguration.selectedDefinition !==\n\t\t\t\t\t\t\twidget.savedWidget.dataConfiguration.selectedDefinition,\n\t\t\t\t\t};\n\t\t\t })\n\t\t\t: savedWidgets.filter(\n\t\t\t\t\t(widget) => widget?.savedWidget?.dataConfiguration?.selectedDefinition === selectedDefinitionName\n\t\t\t );\n\t}, [selectedDefinitionName, widgets, showAllSavedWidgets]);\n\n\tconst noSavedViews = savedWidgets.length === 0;\n\n\tconst handleChangeWidget = useCallback(\n\t\t(widget) => {\n\t\t\tconst newCard = {\n\t\t\t\tendpointQuery: {\n\t\t\t\t\toptions: widget.savedWidget.dataConfiguration.endpointQuery.options,\n\t\t\t\t},\n\t\t\t\ttype: widget.savedWidget.type,\n\t\t\t\twidgetConfiguration: widget.savedWidget.widgetConfiguration,\n\t\t\t};\n\t\t\tdispatch(WorkspaceActionCreator.updateExplorerCard(newCard, cardIndex));\n\t\t},\n\t\t[cardIndex, dispatch]\n\t);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst WidgetItemRenderer = (item, { handleClick, modifiers, index }) => {\n\tif (!modifiers.matchesPredicate) {\n\t\treturn null;\n\t}\n\n\tconst selectedDefinition = item.savedWidget.dataConfiguration.selectedDefinition;\n\treturn (\n\t\t
\n\t\t\t{item.separated && (\n\t\t\t\t\n\t\t\t\t\t{index !== 0 && }\n\t\t\t\t\t
{selectedDefinition}
\n\t\t\t\t
\n\t\t\t)}\n\t\t\t}\n\t\t\t/>\n\t\t
\n\t);\n};\n\nconst dilTitle = css`\n\ttext-align: center;\n\tfont-weight: bold;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useContext, useMemo, useState } from 'react';\nimport { Button, Card, Divider } from '@blueprintjs/core';\nimport { ChartDropdown } from 'components/dropdowns/chartDropdown';\nimport { WIDGETS } from 'widgets';\nimport { SaveWidget } from 'views/save/saveCurrentView';\nimport { ErrorBoundary } from 'components/errorBoundary';\nimport { ExplorerCard } from 'views/explorer/explorerCard';\nimport SettingsDialog from 'views/explorer/settingsDialog';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { useIsSavedStateAvailable } from 'hooks/useApplicationState';\nimport { LAYOUT_OPTIONS } from 'views/explorer/layoutOptions';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport CardContext from './cardContext';\nimport { SavedWidgetSelector } from 'components/selectors/savedViewSelector';\nimport { FlexSplitter } from 'styles/styledComponentUtils';\n\nconst { updateExplorerCardWidget, maximizeWidget } = WorkspaceActionCreator;\n\nexport default function AppCard({ card, cardIndex, availableWidgets, layoutOptions = undefined, showAllSavedWidgets = false, hideSave = false, hideHeader = false }) {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { layout, selectedDefinitionName },\n\t\t\ttransient: { activeResult },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst isSavable = useIsSavedStateAvailable();\n\n\tconst isSettingsAvailable = card?.widgetConfiguration?.showSettings ?? true;\n\tconst [isSettingsOpen, setSettingsOpenStatus] = useState(false);\n\n\tconst handleReset = () => dispatch(updateExplorerCardWidget(cardIndex, card.type));\n\tconst layoutStyle = layoutOptions ? layoutOptions[layout.layoutStyle.key] : LAYOUT_OPTIONS[layout.layoutStyle.key];\n\n\tconst toggleSettingsDialog = () => {\n\t\tsetSettingsOpenStatus((d) => !d);\n\t};\n\n\tconst value = useMemo(\n\t\t() => ({\n\t\t\tisSettingsDialogOpen: isSettingsOpen,\n\t\t}),\n\t\t[isSettingsOpen]\n\t);\n\n\tconst widgetUnavailable = useMemo(() => {\n\t\treturn !availableWidgets.filter(x => x.key === card.type).length > 0;\n\t}, [card, availableWidgets]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{!hideHeader && \n\t\t\t\t\t
\n\t\t\t\t\t\t dispatch(updateExplorerCardWidget(cardIndex, widget.key))}\n\t\t\t\t\t\t\tavailableWidgets={availableWidgets}\n\t\t\t\t\t\t\tvalue={WIDGETS[card.type]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{isSettingsAvailable && (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t
\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t{/* Property selector Error states are handled by this boundary */}\n\t\t\t\t\n\t\t\t\t\t{widgetUnavailable ? (\n\t\t\t\t\t\tWidget Unavailable\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst controlsStyle = css`\n\tflex: 0 0 auto;\n\tdisplay: flex;\n\tmargin: 0 -7px;\n\tpadding: 0.25rem;\n`;\n\nconst dividerStyle = css`\n\tmargin: 0 -2rem 0.5rem;\n`;\n\nexport const cardStyle = css`\n\tpadding: 0 0.75rem 0.75rem 0.75rem;\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport * as PropTypes from 'prop-types';\nimport React, { useContext, useEffect, useMemo } from 'react';\nimport { WIDGETS } from '/widgets';\nimport { LAYOUT_OPTIONS } from './layoutOptions';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport isEmpty from 'lodash-es/isEmpty';\nimport AppCard, { cardStyle } from 'views/explorer/cardWrapper';\nimport { useIsSavedStateAvailable } from 'hooks/useApplicationState';\nimport { Card } from '@blueprintjs/core';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\nimport { useDefaultColors } from 'utilities/setUpColorScale';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n\n/**\n * Support the layout of multiple ExplorerCards. This manager class accesses\n * the context and acts upon the following pieces of state:\n *\n * {\n * activeState: {\n * explorer: {\n * layoutStyleKey: \"..\",\n * currentCards:[..]\n * }\n * },\n * savedStates: {\n * widgets:[..]\n * }\n * }\n *\n * @returns {*}\n * @constructor\n */\nexport const ExplorerLayoutManager = ({ layoutOptions = undefined, showAllSavedWidgets = false }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { layout, selectedDefinitionName },\n\t\t\ttransient: { widgets },\n\t\t},\n\t\tdispatch\n\t} = useContext(WorkspaceContext);\n\n\tconst isSavable = useIsSavedStateAvailable();\n\n\tconst layoutStyle = layoutOptions ? layoutOptions[layout.layoutStyle.key] : LAYOUT_OPTIONS[layout.layoutStyle.key];\n\tconst styles = layoutStyle?.styles;\n\n\t// Only render widgets that are used by this application\n\t// This needs to update the transient widgets, which should be used to create the correct\n\t// cards. This is needed to support the project specific widget ordering.\n\tconst availableWidgets = useMemo(() => {\n\t\treturn widgets\n\t\t\t.map((widget) => WIDGETS[widget.key])\n\t\t\t.filter((widget) => typeof widget.isValid === 'function' && widget.isValid(selectedDefinitionName));\n\t}, [widgets, selectedDefinitionName]);\n\n\t//Pick up any app specific colors from up the tree, if they exist use them, if not set up slykit default colors\n\tconst appSpecificColors = useContext(ColorScalesContext);\n\tconst getColorScale = useDefaultColors(appSpecificColors);\n\n\t// reset the layout if there's an invalid widget selected \n\t// helps refresh the explorer when swapping between different dil definitions with different widgets available\n\tuseEffect(() => {\n\t\tif (layout.cards.filter(card => !availableWidgets.some(x => x.key === card.type)).length > 0) {\n\t\t\tdispatch(WorkspaceActionCreator.createNewExplorer());\n\t\t}\n\t}, [availableWidgets, dispatch, layout.cards]);\n\n\tif (isEmpty(availableWidgets)) {\n\t\treturn
;\n\t}\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{layout.cards.map((card, i) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t\t{layout.cards.length < 1 && isSavable && (\n\t\t\t\t\t\n\t\t\t\t\t\tSelect a Saved View\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst wrapperBaseStyle = css`\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: grid;\n\tgrid-column-gap: 8px;\n\tgrid-row-gap: 8px;\n\t// Ensure Layout Wrapper resizes\n\tpadding: 1px; // So the box shadows still look good.\n\t& > * {\n\t\toverflow: hidden; // required to make things shrink properly.\n\t}\n`;\n\nconst emptyWidget = css`\n\t${cardStyle};\n\tjustify-content: center;\n\ttext-align: center;\n\tfont-weight: bold;\n`;\n\nExplorerLayoutManager.propTypes = { result: PropTypes.any };\n","import {\n\tChartContext,\n\tTimelineContext,\n} from './timeline';\nimport { useContext } from 'react';\n\ninterface IProps {\n\tchildren: (chartContext: ChartContext) => any;\n}\n\nexport function TimelineUseContext({ children }: IProps) {\n\tconst chartContext = useContext(TimelineContext);\n\treturn children(chartContext);\n}\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport * as d3 from 'd3';\n\nexport class KeyframeCreator extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\n\t\tthis.state = {};\n\t\tthis.selection = React.createRef();\n\t}\n\n\tclearBrush() {\n\t\t// Removes the rect selection\n\t\tlet selection = d3.select(this.selection.current);\n\t\tselection\n\t\t\t.transition()\n\t\t\t.duration(250)\n\t\t\t.style('opacity', 0.0)\n\t\t\t.on(\n\t\t\t\t'end',\n\t\t\t\tfunction () {\n\t\t\t\t\tselection.call(this.state.brush.move, null);\n\t\t\t\t\tselection.style('opacity', null);\n\t\t\t\t}.bind(this)\n\t\t\t);\n\t}\n\n\tcomponentDidMount() {\n\t\t// So that the brush is also created on mount.\n\t\tthis.componentDidUpdate();\n\t}\n\n\tcomponentDidUpdate() {\n\t\tconst { chartContext } = this.props;\n\t\tconst { margin, dataHeight, dataWidth } = chartContext;\n\t\tconst selectionExtents = [\n\t\t\t[margin.left, margin.top],\n\t\t\t[dataWidth + margin.left, dataHeight + margin.top],\n\t\t];\n\t\tlet brushToUse = this.state.brush;\n\n\t\tif (brushToUse == null) {\n\t\t\t// TOOD: Allow the timeline to be accessed normally from the bottom portion\n\t\t\t// https://github.com/d3/d3-drag#drag_container might help.\n\t\t\tlet aNewBrush = d3.brushX().on('end', this.onBrush);\n\n\t\t\tthis.setState({ brush: aNewBrush });\n\t\t\tbrushToUse = aNewBrush;\n\t\t}\n\n\t\td3.select(this.selection.current).call(brushToUse.extent(selectionExtents));\n\t}\n\n\tonBrush = (event) => {\n\t\tconst { chartContext, newKeyframe } = this.props;\n\t\tconst { xScale } = chartContext;\n\t\tconst extent = event.selection;\n\n\t\tif (extent) {\n\t\t\tconst keyframeInterval = extent.map(xScale.invert);\n\t\t\tnewKeyframe(keyframeInterval);\n\t\t\tthis.clearBrush();\n\t\t}\n\t};\n\n\trender() {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { buildHistogramTimeline, HistogramEndpointResponse } from 'srs-middleware';\nimport { NonIdealState, ResizeSensor } from '@blueprintjs/core';\nimport { formatSRSTimeline, TimelineChart } from 'utilities/srs-timeline-library/timeline';\nimport { Bars } from 'utilities/srs-timeline-library/bar';\nimport { TimelineUseContext } from 'utilities/srs-timeline-library/timelineUseContext';\nimport { Keyframe } from 'utilities/srs-timeline-library/keyframe';\nimport ChartTooltip from 'components/chartTooltip';\nimport { formatDistance } from 'date-fns';\nimport { useTooltip } from 'components/chartTooltip/useTooltip';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { ColorAliases, Colors } from 'styles/variables';\nimport LoadingIcon from 'components/loadingIcon';\nimport { useAsyncCallback } from 'hooks/useAsyncCallback';\nimport { sendUsageAction } from 'utilities/usageStats';\nimport { scaleLog, sum } from 'd3';\n\n/**\n * BUG with hover and dragging interaction\n * see comments on https://jira.pnnl.gov/jira/browse/SERBERUS-513 for context\n */\ninterface Props extends React.ComponentProps<'div'> {\n\tmaxBinResolution?: TimelineBinResolution;\n}\n\n/**\n * Enum to mirror MaxBinResolution values in SRS\n * Note: Only a few values are uncommented right now.\n * \tIn the future, we may want to consider a more advanced UI that gives the user more granular control over this.\n * */\nexport enum TimelineBinResolution {\n\tAutomatic = 'Unspecified',\n\t// Second = Second,\n\t// FiveSecond = FiveSecond,\n\t// FifteenSecond = FifteenSecond,\n\t// ThirtySecond = ThirtySecond,\n\t// Minute = Minute,\n\t// FiveMinutes = FiveMinutes,\n\t// TenMinutes = TenMinutes,\n\t// FifteenMinutes = FifteenMinutes,\n\t// ThirtyMinutes = ThirtyMinutes,\n\t// Hour = Hour,\n\t// TwoHour = TwoHour,\n\t// ThreeHour = ThreeHour,\n\t// SixHour = 13,\n\t// TwelveHour = TwelveHour,\n\t// Day = Day,\n\t// TwoDay = TwoDay,\n\t// Week = Week,\n\t// TwoWeek = TwoWeek,\n\tMonth = 'Month',\n\t// TwoMonth = TwoMonth,\n\tQuarter = 'ThreeMonth',\n\t// SixMonth = SixMonth,\n\tYear = 'Year',\n\t// TwoYear = TwoYear,\n\t// FiveYear = FiveYear,\n\t// Decade = Decade,\n\t// Century = Century\n}\n\nexport const Timeline: React.FC = ({ maxBinResolution, ...props }) => {\n\tconst [toolTip, setupTrigger] = useTooltip({\n\t\tplacement: 'bottom-start',\n\t\tmodifiers: [\n\t\t\t{\n\t\t\t\tname: 'offset',\n\t\t\t\toptions: {\n\t\t\t\t\toffset: [0, 8],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t});\n\n\t// Get state from context\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tfilters: {\n\t\t\t\t\ttimeline = {\n\t\t\t\t\t\ttimeExtents: null,\n\t\t\t\t\t\ttimeProperty: null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttransient: { activeResult, rootResult },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst { timeExtents, timeProperty } = timeline;\n\n\t// Update the time filter\n\tconst addTimeFilter = useCallback(\n\t\t(timeExtents) => {\n\t\t\tdispatch(\n\t\t\t\tWorkspaceActionCreator.updateFilter('timeline', {\n\t\t\t\t\t...timeline,\n\t\t\t\t\ttimeExtents,\n\t\t\t\t})\n\t\t\t);\n\t\t\tsendUsageAction('TimelineFilterAdded', () => {\n\t\t\t\treturn `${timeExtents[0].toISOString()} to ${timeExtents[1].toISOString()}`;\n\t\t\t});\n\t\t},\n\t\t[timeline, dispatch]\n\t);\n\n\tuseEffect(() => {\n\t\tif (!timeProperty || !timeExtents) return;\n\n\t\tconst queryString = {\n\t\t\t$and: [{ [timeProperty.name]: { $gte: timeExtents[0] } }, { [timeProperty.name]: { $lt: timeExtents[1] } }],\n\t\t};\n\t\tdispatch(WorkspaceActionCreator.updateQueryString('timeline', queryString));\n\t}, [dispatch, timeExtents, timeProperty]);\n\n\t// handle resizing\n\tconst [dimensions, setDimensions] = useState({ height: null, width: null });\n\tconst handleTimelineResize = useCallback(\n\t\t(elements) => {\n\t\t\tconst dim = elements[0].contentRect;\n\t\t\tsetDimensions({\n\t\t\t\theight: dim.height,\n\t\t\t\twidth: dim.width,\n\t\t\t});\n\t\t},\n\t\t[setDimensions]\n\t);\n\n\t// NOTE: Comparing results doesn't seem to work well for detecting the presence\n\t// of a filter. Using the presence of facets/timeExtents causes intermediate\n\t// results to \"jerk\".\n\tconst isTimelineFiltered =\n\t\t!!(activeResult?.resultId && rootResult?.resultId) && activeResult.resultId !== rootResult.resultId;\n\n\t// fetch the root bars.\n\tconst { data: rootData, error: rootError } = useAsyncCallback(async () => {\n\t\tif (rootResult && timeProperty) {\n\t\t\t// prevent timeline and explorer from being out of sync when the dil definition changes\n\t\t\tif (rootResult?.sources[0].systemDefinitionId !== timeProperty.systemDefinitionId) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Remove the focused bars so they don't animate poorly.\n\t\t\t// setActiveData(null);\n\t\t\tif (rootResult.count > 0) {\n\t\t\t\treturn await buildHistogramTimeline(rootResult, [timeProperty], {\n\t\t\t\t\tMaxBinResolution: maxBinResolution,\n\t\t\t\t\t...getBinCountsFromSize(dimensions.width, maxBinResolution),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}, [rootResult, timeProperty, maxBinResolution, dimensions.width]);\n\n\t// Fetch the filtered bars\n\tconst { data: activeData, error: activeError } = useAsyncCallback(async () => {\n\t\tif (activeResult && rootData && timeProperty) {\n\t\t\tif (isTimelineFiltered && activeResult.count > 0) {\n\t\t\t\tconst responseData = await buildHistogramTimeline(activeResult, [timeProperty], {\n\t\t\t\t\tStartTime: rootData.startTime,\n\t\t\t\t\tEndTime: rootData.endTime,\n\t\t\t\t\tMaxBinResolution: maxBinResolution,\n\t\t\t\t\t...getBinCountsFromSize(dimensions.width, maxBinResolution),\n\t\t\t\t});\n\t\t\t\treturn responseData;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}, [rootData, activeResult, timeProperty, isTimelineFiltered, maxBinResolution, dimensions.width]);\n\n\t// trigger error boundary\n\tconst [, setError] = useState();\n\tuseEffect(() => {\n\t\tif (rootError || activeError) {\n\t\t\t// @ts-ignore\n\t\t\tsetError(() => {\n\t\t\t\tthrow new Error('Timeline could not fetch data.');\n\t\t\t});\n\t\t}\n\t}, [activeError, rootError]);\n\n\t// Format second result to a form data the timeline library can use\n\tconst formattedActiveData = useMemo(() => formatSRSTimeline(activeData), [activeData]);\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t{/* Loaders */}\n\t\t\t\t{!activeResult ? : activeResult.count === 0 ? No Data : null}\n\n\t\t\t\t{/* Chart */}\n\t\t\t\t{rootData && rootResult ? (\n\t\t\t\t\trootData?.bins ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{toolTip}\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t{/* Render a tooltip hitbox. */}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{({ xScale, dataHeight, margin, yScale, data }) => {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{data.map((d, i) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// If check here to prevent adding tooltips for empty extents.\n\t\t\t\t\t\t\t\t\t\t\t\t\t// This should probably be refactored out to check if we doing empty extents in TimelineChart above\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (sum(Object.values(d.values)) > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst selectedBinValue =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformattedActiveData &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformattedActiveData[i] &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformattedActiveData &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformattedActiveData[i].values.Count;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst xCord = xScale(d.start);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst MIN_BAR_HEIGHT = 8;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet yCord = yScale(d.values.Count);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet height = dataHeight - yCord;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If the bar is too small make it bigger\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (MIN_BAR_HEIGHT > height) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tyCord = dataHeight - MIN_BAR_HEIGHT;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight = MIN_BAR_HEIGHT;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Shrink the width by logarithmically to give a reasonable bar width and gap\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlet width = xScale(d.end) - xScale(d.start);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth *\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tscaleLog()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.domain([5 / 0.75, 100])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.range([0.75, 0.99])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.clamp(true)(width);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// TODO: make this a dynamic format based on: const duration = d.end - d.start\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst dateFormatter = 'MM/DD/YYYY';\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Creating a unique cypress test tag that effectively should append - to the end\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst cypressDataTag = `rect-bar-data-${d?.label?.split(' ')[0]?.toLowerCase()}-${d?.end?.getFullYear()}`;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else return null;\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\t'No rootData. Reset to view everything.'\n\t\t\t\t\t)\n\t\t\t\t) : null}\n\t\t\t
\n\t\t
\n\t);\n};\n\nfunction getBinCountsFromSize(width: number, binSizing: TimelineBinResolution) {\n\tif (binSizing === TimelineBinResolution.Automatic) {\n\t\treturn {\n\t\t\tMaxMajorBinCount: Math.max(Math.round(width / 120), 1), // 120 pixel/bar\n\t\t\tMaxMinorBinCount: Math.max(Math.round(width / 10), 1),\n\t\t};\n\t} else {\n\t\treturn {};\n\t}\n}\n\nconst styles = {\n\trootBar: css`\n\t\tfill: ${Colors.LIGHT_GRAY2};\n\t\tstroke: ${Colors.WHITE};\n\t`,\n\tactiveBar: css`\n\t\tfill: ${ColorAliases.PT_INTENT_PRIMARY};\n\t`,\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport * as d3 from 'd3';\nimport { KeyframeCreator } from './KeyframeCreator';\nimport { SRSTimeScale, TimelineContext } from 'utilities/srs-timeline-library/timeline';\n\nconst MIN_WIDTH = 16;\nexport const GRABBER = {\n\tWIDTH: 3,\n\tHIT_WIDTH: 6,\n};\nconst styles = {\n\tkeyframe: css`\n\t\t.keyframe {\n\t\t\tfill: transparent;\n\t\t\tcursor: grab;\n\n\t\t\t&:active {\n\t\t\t\tcursor: grabbing;\n\t\t\t}\n\n\t\t\ttransition: opacity 0.5s linear;\n\t\t\tanimation: fade-in 250ms;\n\t\t}\n\n\t\t.grabber {\n\t\t\tcursor: ew-resize;\n\t\t\tfill: transparent;\n\n\t\t\t.visible {\n\t\t\t\tfill: black;\n\t\t\t}\n\t\t}\n\t`,\n\tgraphOverlay: css`\n\t\tfill: rgba(255, 255, 255, 0.7);\n\t`,\n};\n\nexport function Keyframe({ keyframe, updateKeyframe }) {\n\n\tconst chartContext = useContext(TimelineContext);\n\tconst { xScale, dataHeight, dataWidth, margin } = chartContext;\n\n\tconst [x, setX] = useState();\n\tconst [keyframeWidth, setKeyframeWidth] = useState();\n\tconst [isKeyframeStale, setIsKeyframeStale] = useState(false);\n\tconst keyframeRef = useRef(null);\n\n\t// When the keyframe changes update localState\n\tuseLayoutEffect(() => {\n\t\tif (keyframe && xScale) {\n\t\t\tconst { x, keyframeWidth } = calculateKeyframeAttributes(keyframe, xScale);\n\t\t\tsetX(x);\n\t\t\tsetKeyframeWidth(keyframeWidth);\n\t\t}\n\t}, [keyframe, xScale]);\n\n\t// Update when keyframe data becomes stale.\n\tuseEffect(() => {\n\t\tif (isKeyframeStale) {\n\t\t\tconst keyframeExtents = [xScale.invert(x), xScale.invert(x + keyframeWidth)];\n\t\t\tsetIsKeyframeStale(false);\n\t\t\tupdateKeyframe(keyframeExtents);\n\t\t}\n\t}, [xScale, updateKeyframe, isKeyframeStale, x, keyframeWidth]);\n\n\t// Don't render anything if a keyframe doesn't exist or if the dimensions haven't been calculated yet.\n\tconst isKeyframeValid = !!keyframe && x && keyframeWidth;\n\n\tfunction onDragEnd() {\n\t\tsetIsKeyframeStale(true);\n\t}\n\n\tif (isKeyframeValid) {\n\t\t// const [minX, maxX] = originalScale.range();\n\t\t// Validate & set the x, y values of the keyframe.\n\t\t// @ts-ignore\n\t\tfunction updateKeyframeState(x, width) {\n\t\t\tconst [minX, maxX] = xScale.domain().map(xScale);\n\t\t\tconst isKeyframeInView = validateKeyframe(minX, maxX, width, x);\n\t\t\tif (isKeyframeInView) {\n\t\t\t\tsetX(x);\n\t\t\t\tsetKeyframeWidth(width);\n\t\t\t}\n\t\t}\n\n\t\tcreateKeyframeInteractions(keyframeRef, updateKeyframeState, onDragEnd, x, keyframeWidth);\n\t}\n\n\treturn (\n\t\t\n\n\t\t\t\n\t\t\t\t{isKeyframeValid ? (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\n\t\t\t\n\n\t\t\t\n\t\t\t\t{isKeyframeValid ? (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t) : null}\n\t\t\t\n\n\t\t\n\t);\n}\n\n// Active Keyframe helpers.\nfunction createKeyframeInteractions(\n\tkeyframeRef: React.MutableRefObject,\n\tupdateKeyframe: (x: any, width: any) => void,\n\tonDragEnd,\n\tx: number,\n\tkeyframeWidth: number\n) {\n\tconst d3Keyframe = d3.select(keyframeRef.current);\n\n\t// Drag for right bar.\n\tconst rightBar = d3Keyframe.select('.grabber.right');\n\tconst rightBarResize = d3\n\t\t.drag()\n\t\t.on('drag', function (event) {\n\t\t\t// @ts-ignore\n\t\t\tlet offset = d3.pointer(event /*this.parentNode*/)[0];\n\n\t\t\tconst newWidth = offset - x;\n\t\t\tupdateKeyframe(x, newWidth);\n\t\t})\n\t\t.on('end', onDragEnd);\n\n\trightBar.call(rightBarResize);\n\n\t// Drag for left bar\n\tconst leftBar = d3Keyframe.select('.left');\n\tconst leftBarResize = d3\n\t\t.drag()\n\t\t.on('drag', function (event) {\n\t\t\t// @ts-ignore\n\t\t\tlet offset = d3.pointer(event /*this.parentNode*/)[0];\n\t\t\tconst newWidth = keyframeWidth - (offset - x) - GRABBER.WIDTH;\n\t\t\tconst newX = offset + GRABBER.WIDTH;\n\t\t\tupdateKeyframe(newX, newWidth);\n\t\t})\n\t\t.on('end', onDragEnd);\n\n\tleftBar.call(leftBarResize);\n\n\t// Drag for keyframe\n\tconst activeKeyframe = d3.select('.keyframe');\n\tconst positionData = { x };\n\tactiveKeyframe.data([positionData]);\n\t// activeKeyframe.attr('x', d => d.x);\n\tconst keyframeDrag = d3\n\t\t.drag()\n\t\t.on('drag', function (event, d) {\n\t\t\t// @ts-ignore\n\t\t\tlet offset = d.x + event.dx;\n\t\t\t// @ts-ignore\n\t\t\td.x = offset;\n\t\t\tupdateKeyframe(offset, keyframeWidth);\n\t\t})\n\t\t.on('end', onDragEnd);\n\n\tactiveKeyframe.call(keyframeDrag);\n}\n\nfunction calculateKeyframeAttributes(keyframe: [Date, Date], xScale: SRSTimeScale) {\n\tconst scaledExtent = keyframe.map(xScale);\n\tconst x = scaledExtent[0];\n\tconst width = scaledExtent[1] - scaledExtent[0];\n\treturn { x, keyframeWidth: width };\n}\n\nfunction validateKeyframe(minX, maxX, width, x) {\n\tconst MAX_WIDTH = maxX - minX;\n\n\t// Rules for valid x, width values.\n\tconst isTooBig = width > MAX_WIDTH;\n\tconst isTooSmall = width < MIN_WIDTH;\n\tconst isTooRight = x < minX - 1; // For extra padding\n\tconst isTooLeft = x + width > maxX;\n\n\tconst isKeyframeInView = !(isTooBig || isTooSmall || isTooRight || isTooLeft);\n\treturn isKeyframeInView;\n}\n","import { FACET_SORT_ENUM } from 'components/sortSelect';\n\n/**\n * Helper utilities for getting application specific read only data to specific places in slykit\n *\n * MOTIVATION: I didn't want to prop drill a static string from the application to the timeline selector so I made this.\n *\n * MAINTENANCE: If we're wanting to have properties like this that need to be updated during runtime we should switch to\n * using a context and using selector hooks.\n *\n * EXAMPLE USAGE\n * // In application app.tsx\n * setReadOnlyOverride('defaultTemporalProperty', \"Patent Status\");\n * // In slykit\n * const test = getReadOnlyOverride('defaultTemporalProperty');\n */\n\n// All properties should be optional and should only be set at initialization time. They can be read whenever\ninterface ReadOnlyOverrides {\n\tdefaultTemporalProperty?: string;\n\tdefaultFacetSortOrder?: {\n\t\t[propertyName in string]: FACET_SORT_ENUM;\n\t};\n}\n\n// This variable should be private\nconst overrides: ReadOnlyOverrides = {};\n\n// Getter\nexport function getReadOnlyOverride(key: K) {\n\treturn overrides[key];\n}\n\n// Setter\nexport function setReadOnlyOverride(\n\tkey: K,\n\tvalue: V\n) {\n\toverrides[key] = value;\n}\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport { getPropertiesOfType } from 'utilities/srsUtils';\nimport React, { useContext, useEffect, useMemo } from 'react';\nimport { ObjectDropdown } from 'components/dropdowns/objectDropdown';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport {\n\tselectDilDefinitionByName,\n\tPropertyType as SrsPropertyType,\n\tselectPropertyListFromDilByNames,\n} from 'srs-middleware';\nimport { getReadOnlyOverride } from 'utilities/readOnlyOverrides';\n\ninterface Props {}\n\nexport const TemporalSelector: React.FunctionComponent = () => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tselectedDefinitionName,\n\t\t\t\tfilters: {\n\t\t\t\t\ttimeline = {\n\t\t\t\t\t\ttimeExtents: null,\n\t\t\t\t\t\ttimeProperty: null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst { timeProperty } = timeline;\n\n\tconst selectedDefinition = useMemo(() => {\n\t\treturn selectDilDefinitionByName(selectedDefinitionName);\n\t}, [selectedDefinitionName]);\n\n\tconst temporalProperties = useMemo(() => {\n\t\treturn getPropertiesOfType(selectedDefinition, SrsPropertyType.Temporal);\n\t}, [selectedDefinition]);\n\n\tuseEffect(() => {\n\t\tif (timeProperty || !temporalProperties) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst defaultPropertyName = getReadOnlyOverride('defaultTemporalProperty');\n\t\tconst defaultProperty = defaultPropertyName\n\t\t\t? selectPropertyListFromDilByNames(selectedDefinitionName, [defaultPropertyName])[0]\n\t\t\t: null;\n\n\t\tdispatch(\n\t\t\tWorkspaceActionCreator.updateFilter('timeline', {\n\t\t\t\t...timeline,\n\t\t\t\ttimeProperty: defaultProperty ?? temporalProperties[0],\n\t\t\t})\n\t\t);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [selectedDefinitionName, temporalProperties]);\n\n\tfunction setActiveTemporalProperty(property) {\n\t\tdispatch(\n\t\t\tWorkspaceActionCreator.updateFilter('timeline', {\n\t\t\t\t...timeline,\n\t\t\t\ttimeProperty: property,\n\t\t\t})\n\t\t);\n\t}\n\n\tconst optionToString = (x) => (x ? x.name : '');\n\n\treturn (\n\t\t// @ts-ignore\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { Button, Menu, MenuItem, Intent, Popover, Position } from '@blueprintjs/core';\nimport { Timeline, TimelineBinResolution } from './timeline';\nimport { TemporalSelector } from './temporalSelector';\nimport { useContext } from 'react';\nimport { ErrorBoundary } from 'components/errorBoundary';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { Sizes } from 'styles/variables-slykit';\n\ninterface Props extends React.ComponentProps<'div'> {}\n\nexport function clearTimelineFilter(dispatch, timeline) {\n\tdispatch(\n\t\tWorkspaceActionCreator.updateFilter('timeline', {\n\t\t\t...timeline,\n\t\t\ttimeExtents: null,\n\t\t})\n\t);\n\tdispatch(WorkspaceActionCreator.updateQueryString('timeline', null));\n}\n\nexport const TimelineWrapper: React.FC = (props) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tfilters: { timeline },\n\t\t\t},\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\n\tfunction clearTimeFilter() {\n\t\tclearTimelineFilter(dispatch, timeline);\n\t}\n\n\tconst [binningResolution, setBinningResolution] = React.useState(\n\t\tTimelineBinResolution.Automatic\n\t);\n\n\t//Future: Right now, this is just binning options. We'll need a better design if this menue needs to include more options.\n\tconst CreateSettingsDropdownContent = React.useCallback(() => {\n\t\treturn (\n\t\t\t\n\t\t\t\t{Object.keys(TimelineBinResolution).map((keyName) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t setBinningResolution(TimelineBinResolution[keyName])}\n\t\t\t\t\t\t\tintent={TimelineBinResolution[keyName] === binningResolution ? Intent.PRIMARY : Intent.NONE}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\n\t\t);\n\t}, [binningResolution]);\n\n\treturn (\n\t\t
\n\t\t\t\n\n\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tTime Filter:\n\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\n\t\t\t\t
\n\n\t\t\t\t\n\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst wrapperStyle = css`\n\twidth: 100%;\n\theight: 100%;\n\t/* overflow: hidden; */ // necessary only in some cases?\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: ${Sizes.xxsm} ${Sizes.md};\n`;\nconst headerStyle = css`\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n`;\nconst temporalSelectorWrapperStyle = css`\n\tdisplay: flex;\n\talign-items: center;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n`;\nconst temporalSelectorLabelStyle = css`\n\tmargin-right: 12px; // space from temporalSelectorMarginsStyle{margin-left: -8px;}\n`\nconst temporalSelectorMarginsStyle = css`\n\tmargin-left: -8px; // visually left-align button content when wrapped\n`\nconst buttonWrapperStyle = css`\n\tmargin-right: -7px; // visually right-align button content\n\tdisplay: flex;\n\talign-items: center;\n`;\n","/** @jsx jsx */\nimport React, { useContext, useState } from 'react';\nimport { Button, Dialog, Classes, Intent, InputGroup, Spinner } from '@blueprintjs/core';\nimport { jsx, css } from '@emotion/react';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { get, post, RESULT_END_POINTS } from 'srs-middleware';\n\n// Reference: https://flaviocopes.com/javascript-sleep/\nconst sleep = (milliseconds) => {\n\treturn new Promise((resolve) => setTimeout(resolve, milliseconds));\n};\n\n/**\n * Component responsible for causing the current active explorer to be exported.\n *\n * @returns {*}\n * @constructor\n */\nexport const Export = ({ ...props }) => {\n\tconst {\n\t\tstate: {\n\t\t\ttransient: { activeResult },\n\t\t},\n\t} = useContext(WorkspaceContext);\n\tconst [fileName, setFileName] = useState('');\n\tconst [showDialog, setShowDialog] = useState(false);\n\tconst [exportingStatus, setExportingStatus] = useState(false);\n\n\tconst exportResult = async () => {\n\t\tsetFileName('');\n\t\tsetExportingStatus(true);\n\n\t\tlet export_result = await post(RESULT_END_POINTS.Export(activeResult.resultId), {\n\t\t\tpluginId: '53738BFE-25A3-4ec2-996C-9AD36903DA75',\n\t\t\texportName: fileName || 'serberus-export',\n\t\t});\n\n\t\twhile (!export_result.isAvailable) {\n\t\t\tawait sleep(1000);\n\t\t\texport_result = await get(`/SRS/Export/${export_result.exportId}/Status`, {});\n\t\t}\n\n\t\t// Open the download link in a new tab.\n\t\twindow.open(export_result.url, '_blank');\n\t\tsetExportingStatus(false);\n\t\tsetShowDialog(false);\n\t};\n\n\tconst handleCancel = () => {\n\t\tsetShowDialog(false);\n\t\tsetFileName('');\n\t\tsetExportingStatus(false);\n\t};\n\n\treturn (\n\t\t\n\t\t\t setShowDialog(true)}\n\t\t\t\tchildren={'Export'}\n\t\t\t\t// css={alignedMinimalButtonRight}\n\t\t\t\tminimal\n\t\t\t\tcy-test=\"export-button\"\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t{!exportingStatus ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\tThis will export a CSV with a total of {activeResult?.count} rows.\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t (e.key === 'Enter' ? exportResult() : null)}\n\t\t\t\t\t\t\t\tonChange={(e) => setFileName(e.target.value)}\n\t\t\t\t\t\t\t\tleftIcon={'export'}\n\t\t\t\t\t\t\t\tcy-test=\"export-textbox\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst container = css`\n\tdisplay: grid;\n\tgrid-template-columns: 1fr;\n\tgrid-row-gap: 12px;\n\tpadding: 20px;\n`;\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport { Button, Classes, MenuItem } from '@blueprintjs/core';\nimport { Select } from '@blueprintjs/select';\nimport { useContext } from 'react';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { SlykitContext } from '/slykitContext';\n\nexport const LayoutSelector = ({ layoutOptions }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tlayout: { layoutStyle },\n\t\t\t},\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst {\n\t\tstate: { savedStates },\n\t} = useContext(SlykitContext);\n\n\tfunction onSelectionChanged(layout) {\n\t\tdispatch(\n\t\t\tWorkspaceActionCreator.updateExplorerLayout({ key: layout.key, cardCount: layout.cardCount }, savedStates)\n\t\t);\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t{layoutOptions[layoutStyle.key].label}\n\t\t\t\t{/* firefox bug? */}\n\t\t\t\n\t\t\n\t);\n};\n\nconst ItemRenderer = (layout, { handleClick, modifiers, index }) => {\n\tif (!modifiers.matchesPredicate) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t\n\t);\n};\n","import { css } from '@emotion/react';\n\nexport const dialogStyle = css`\n\t.bp3-button {\n\t\tmargin-left: 5px;\n\t}\n\n\t.bp3-dialog-footer {\n\t\ttext-align: right;\n\t}\n\n\tbackground: white;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useCallback, useContext, useMemo, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { RouteLeavingGuard, Dialog } from 'components/dialogs';\nimport { dialogStyle } from 'views/savedViews/styles';\nimport { isEqual } from 'lodash';\nimport { SavedViewTypes } from 'hooks/savedViews/types';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { Button, Icon, MenuItem, Classes, MenuDivider } from '@blueprintjs/core';\nimport { Select } from '@blueprintjs/select';\nimport { IconNames } from '@blueprintjs/icons';\n\n/**\n * ViewSettingsDropDown contains the view selection dropdown\n * as well as the dialogs for navigation away from an unsaved view\n *\n * @param {boolean} showAllViews show views from all datasets?\n * @returns {*}\n * @constructor\n */\nexport const ViewSettingsDropDown = ({ showAllViews }) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: workspaceExplorer,\n\t\t\texplorer: { selectedDefinitionName },\n\t\t},\n\t\tdispatch: workspaceDispatch,\n\t} = useContext(WorkspaceContext);\n\tlet { explorers } = useSavedStateSelectors();\n\n\tconst history = useHistory();\n\n\tconst [changeView, setChangeView] = useState(null);\n\tconst [isUnsavedChangesDialogOpen, setUnsavedChangesWarning] = useState(false);\n\tconst [isUnableToSaveDialog, setIsUnableToSaveDialog] = useState(false);\n\n\tconst openUnsavedChangesWarning = () => setUnsavedChangesWarning(true);\n\tconst closeUnsavedChangesWarning = () => setUnsavedChangesWarning(false);\n\n\tconst openUnableToSaveDialog = () => setIsUnableToSaveDialog(true);\n\tconst closeUnableToSaveDialog = () => setIsUnableToSaveDialog(false);\n\n\tconst loadExplorer = useCallback(\n\t\t(view) => {\n\t\t\tconst formattedView = view;\n\t\t\tworkspaceDispatch(WorkspaceActionCreator.loadSavedView('explorer', formattedView));\n\t\t},\n\t\t[workspaceDispatch]\n\t);\n\n\tconst handleViewChange = useCallback(\n\t\t(view) => {\n\t\t\tconst fullView = [...explorers].filter((x) => x.metaData.id === view.key)[0];\n\t\t\tloadExplorer(fullView);\n\t\t},\n\t\t[explorers, loadExplorer]\n\t);\n\n\tconst handleContinue = useCallback(() => {\n\t\thandleViewChange(changeView);\n\t\tcloseUnsavedChangesWarning();\n\t}, [changeView, handleViewChange]);\n\n\tconst selectedViewId = useMemo(() => {\n\t\treturn workspaceExplorer?.metaData?.id;\n\t}, [workspaceExplorer]);\n\n\tconst getIcon = (viewType) => {\n\t\treturn viewType === SavedViewTypes.Explorer\n\t\t\t? IconNames.GEOSEARCH\n\t\t\t: viewType === SavedViewTypes.Widget\n\t\t\t? IconNames.WIDGET\n\t\t\t: '';\n\t};\n\n\tconst clearSavedExplorer = useCallback(() => {\n\t\tworkspaceDispatch(WorkspaceActionCreator.updateMetaData(undefined));\n\t}, [workspaceDispatch]);\n\n\tconst views = useMemo(() => {\n\t\tconst savedExplorers = explorers\n\t\t\t.map((explorer) => ({\n\t\t\t\tkey: explorer.metaData.id,\n\t\t\t\tlabel: explorer.metaData.name,\n\t\t\t\ttype: explorer.metaData.type,\n\t\t\t\ticon: getIcon(explorer.metaData.type),\n\t\t\t\tsavedExplorer: explorer,\n\t\t\t\tclearSelection: clearSavedExplorer,\n\t\t\t}))\n\t\t\t.sort((x, y) => {\n\t\t\t\t// sort by this views matching the current dil, then by dil name, then by view name\n\t\t\t\tconst compareMatchesCurrentDil = (a, b) =>\n\t\t\t\t\t(b.savedExplorer.selectedDefinitionName === selectedDefinitionName ? 1 : 0) -\n\t\t\t\t\t(a.savedExplorer.selectedDefinitionName === selectedDefinitionName ? 1 : 0);\n\t\t\t\tconst compareDil = (a, b) =>\n\t\t\t\t\ta.savedExplorer.selectedDefinitionName.localeCompare(b.savedExplorer.selectedDefinitionName);\n\t\t\t\tconst compareName = (a, b) => a.label.localeCompare(b.label);\n\n\t\t\t\treturn compareMatchesCurrentDil(x, y) || compareDil(x, y) || compareName(x, y);\n\t\t\t});\n\t\treturn showAllViews\n\t\t\t? savedExplorers.map((view, index) => {\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tview.separated = true;\n\t\t\t\t\t\treturn view;\n\t\t\t\t\t}\n\t\t\t\t\tconst prev = savedExplorers[index - 1];\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...view,\n\t\t\t\t\t\tseparated: prev.savedExplorer.selectedDefinitionName !== view.savedExplorer.selectedDefinitionName,\n\t\t\t\t\t};\n\t\t\t })\n\t\t\t: savedExplorers.filter((explorer) => explorer.savedExplorer.selectedDefinitionName === selectedDefinitionName);\n\t}, [clearSavedExplorer, explorers, selectedDefinitionName, showAllViews]);\n\n\tconst checkUnsavedChanges = (view) => {\n\t\tif (hasUnsavedChanges()) {\n\t\t\tsetChangeView(view);\n\t\t\topenUnsavedChangesWarning();\n\t\t} else {\n\t\t\thandleViewChange(view);\n\t\t}\n\t};\n\n\tconst hasUnsavedChanges = () => {\n\t\tif (selectedViewId === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\tconst savedExplorer = explorers.filter((x) => x.metaData.id === selectedViewId)[0];\n\t\tif (\n\t\t\tisEqual(savedExplorer.filters, workspaceExplorer.filters) &&\n\t\t\tisEqual(savedExplorer.layout, workspaceExplorer.layout)\n\t\t) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t};\n\n\treturn (\n\t\t\n\t\t\t}\n\t\t\t\ttext={'You are leaving this view. Any unsaved changes will be lost.'}\n\t\t\t\twhen={hasUnsavedChanges()}\n\t\t\t\tnavigate={(path) => history.push(path)}\n\t\t\t\tshouldBlockNavigation={() => {\n\t\t\t\t\tif (hasUnsavedChanges()) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{isUnsavedChangesDialogOpen && (\n\t\t\t\t\n\t\t\t)}\n\t\t\t{isUnableToSaveDialog && }\n\t\t\t\n\t\t\n\t);\n};\n\n// Dropdown for selecting a saved explorer or widget\nconst SelectView = ({ views, selectedViewId, onSelectionChanged }) => {\n\tconst noSavedViews = views.length === 0;\n\tconst selectedView = views.find((x) => x.key === selectedViewId) || null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\n\t);\n};\n\n// Each explorer/widget rendered in the SelectView dropdown\n// Separate views by selectedDefinitionName\nconst ItemRenderer = (item, { handleClick, modifiers, index }) => {\n\tconst handleClearSelection = (e) => {\n\t\te.preventDefault();\n\t\titem.clearSelection();\n\t};\n\n\treturn (\n\t\t
\n\t\t\t{item.separated && (\n\t\t\t\t\n\t\t\t\t\t{index !== 0 && }\n\t\t\t\t\t
{item.savedExplorer.selectedDefinitionName}
\n\t\t\t\t
\n\t\t\t)}\n\t\t\t
\n\t\t\t\t\n\t\t\t\t{modifiers.active &&
\n\t\t
\n\t);\n};\n\nconst UnsavedChangedDialog = ({ onClose, onClick }) => {\n\treturn (\n\t\t\n\t\t\t\t\t

You are leaving this view. Any unsaved changes will be lost.

\n\t\t\t\t
\n\t\t\t}\n\t\t\ticon={}\n\t\t\tonClose={onClose}\n\t\t\tfooter={\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\tCancel\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t}\n\t\t/>\n\t);\n};\n\nconst UnableToSaveDialog = ({ onClose }) => {\n\treturn (\n\t\t\n\t\t\t\t\t

Select a view in order to save.

\n\t\t\t\t\n\t\t\t}\n\t\t\ticon={}\n\t\t\tonClose={onClose}\n\t\t\tfooter={\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\tCancel\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t}\n\t\t/>\n\t);\n};\n\nconst selectViewTitle = css`\n\ttext-align: center;\n\tfont-weight: bold;\n`;\n\nconst menuItemGroup = css`\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\n\t> li {\n\t\twidth: 100%;\n\t}\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport React, { useState } from 'react';\nimport { Export } from '/views/export';\nimport { LAYOUT_OPTIONS } from '/views/explorer/layoutOptions';\nimport { LayoutSelector } from 'components/selectors/layoutSelector';\nimport { FlexSplitter, overflowEllipsis } from 'styles/styledComponentUtils';\nimport { SaveCurrentView, SaveExistingView } from '/views/save/saveCurrentView';\nimport { useIsSavedStateAvailable } from 'hooks/useApplicationState';\nimport { Button, ButtonGroup, Classes, Collapse, ControlGroup, Icon } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { ViewSettingsDropDown } from './viewSettingsDropDown';\nimport { Sizes } from 'styles/variables-slykit';\n\n/**\n * ViewSettings is responsible for providing a place to\n * save and load explorers and widgets.\n *\n * @param {boolean} showAllViews show views from all datasets?\n * @returns {*}\n * @constructor\n */\nexport const ViewSettings = ({ showAllViews = false }) => {\n\tconst isSavable = useIsSavedStateAvailable();\n\n\treturn (\n\t\t
\n\n\t\t\t
\n\t\t\t\tView Settings:\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\n\t\t\t{isSavable && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\n\t\t
\n\t);\n};\n\nconst containerStyles = css`\n\tpadding: ${Sizes.sm} ${Sizes.lg};\n\n\t.${Classes.BUTTON_TEXT}{\n\t\t${overflowEllipsis}\n\t}\n\n\t.${Classes.POPOVER_TARGET} > div {\n\t\tborder-radius: inherit; // bp oversight?\n\t}\n`;\n\nconst headerStyles = css`\n\tdisplay: flex;\n\talign-items: center;\n`\n\nconst actionButtonsStyles = css`\n\tmargin: ${Sizes.sm} 0;\n`;\n\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { useContext, useEffect, useState } from 'react';\nimport { Breadcrumbs, Breadcrumb, Intent, Tag } from '@blueprintjs/core';\nimport { filter, selectDilDefinitionByName, get } from 'srs-middleware';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { useAsyncCallback } from 'hooks/useAsyncCallback';\nimport LoadingIcon from 'components/loadingIcon';\n\nconst { updateTransientFilter, updateResult } = WorkspaceActionCreator;\n\n/**\n * Filters is a \"result provider\". It is responsible for:\n * 1) monitoring for changes in the queryString\n * 2) keeping the results in order based on those changes\n * @returns {*}updateTransientFilter\n * @constructor\n */\nexport const Filters = () => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: { selectedDefinitionName },\n\t\t\ttransient: { filters: transientFilters = [], queryStrings, rootResult },\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\n\tconst [results, setResults] = useState([]);\n\tconst [transientResult, setTransientResult] = useState(null);\n\n\tconst renderFilter = ({ key, value }) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t{`${key} (${value.count})`}\n\t\t\t\n\t\t);\n\t};\n\n\t// in here, we watch for changes to the query strings\n\t// then create a series of results, finally dispatching the changes\n\tconst { data, loading } = useAsyncCallback(async () => {\n\t\tif (!rootResult) return;\n\n\t\t// two possible paths:\n\t\t// 1) transient filter exists, apply it and be done\n\t\t// 2) transient filter does not exist, process the query strings, apply it and be done\n\t\tlet results = [{ key: 'all', value: rootResult }];\n\t\tlet previous = rootResult;\n\t\tconst entries = Object.entries(queryStrings);\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst [key, filterString] = entries[i];\n\t\t\tif (filterString !== null) {\n\t\t\t\tconst result = await filter(previous, selectDilDefinitionByName(selectedDefinitionName), filterString);\n\t\t\t\tresults.push({ key: key, value: result });\n\t\t\t\tprevious = result;\n\t\t\t}\n\t\t}\n\n\t\treturn { results, previous, rootResult };\n\t}, [rootResult, selectedDefinitionName, queryStrings, dispatch]);\n\n\tuseEffect(() => {\n\t\tconst { results: rawResults, previous, rootResult: rawRootResult } = data ?? {};\n\t\tif (rawResults && rawRootResult) {\n\t\t\tdispatch(updateResult(previous, rawRootResult));\n\t\t\tsetResults(rawResults);\n\n\t\t\t// clear the transient result, if any\n\t\t\tif (transientResult) {\n\t\t\t\tdispatch(updateTransientFilter(transientResult.key, null));\n\t\t\t\tsetTransientResult(null);\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [data, dispatch]);\n\n\t// here we currently assume that we get a \"result\" filter in, which just\n\t// replaces the currently active result with this new one\n\t// whenever anything else changes, this result is stale and should be removed\n\t// it can't be saved, as the method by which it was created (e.g. text clustering)\n\t// is not deterministically reproducible.\n\tconst { data: transientData } = useAsyncCallback(async () => {\n\t\tconst entries = Object.entries(transientFilters);\n\t\tlet result = null;\n\t\tif (entries.length === 0) {\n\t\t\tsetTransientResult(null);\n\t\t\treturn;\n\t\t}\n\t\tconst [key, value] = entries[0];\n\t\tresult = await get(`/SRS/Results/${value[0].id}`);\n\n\t\treturn { key: key, result: result };\n\t}, [transientFilters]);\n\n\t// only update the result when we have a filter, we assume that the stale result\n\t// will be replace by some other means.\n\tuseEffect(() => {\n\t\tif (transientData) {\n\t\t\tdispatch(updateResult(transientData.result, rootResult));\n\t\t\tsetTransientResult(transientData);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [transientData, dispatch]);\n\n\t// trigger the removal of the transient filter\n\tconst onRemove = key => {\n\t\tdispatch(updateResult(results.length ? results[results.length - 1].value : rootResult, rootResult));\n\t\tdispatch(updateTransientFilter(key, null));\n\t\tsetTransientResult(null);\n\t};\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t{transientResult && (\n\t\t\t\t\n\t\t\t\t\t {\n\t\t\t\t\t\t\tonRemove(transientResult.key);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{`${transientResult.key} (${transientResult.result.count})`}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t)}\n\t\t\t{loading && }\n\t\t
\n\t);\n};\n\nconst filterStyle = css`\n\tflex: 1 1 auto;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: stretch;\n\t//padding: 2px;\n`;\n\nconst loadingStyles = css`\n\tflex: 0 0;\n\tmargin-left: 5px;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { useCallback, useContext, useEffect, useState } from 'react';\nimport { Button, Classes, ControlGroup, TagInput } from '@blueprintjs/core';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { useFilteredProperties } from 'utilities/srsUtils';\nimport { PropertyType as SrsPropertyType } from 'srs-middleware';\nimport { Variables } from 'styles/variables';\nimport { sendUsageAction } from 'utilities/usageStats';\n\nconst { updateFilter, updateQueryString } = WorkspaceActionCreator;\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n\tbuttonText?: string;\n\tlarge?: boolean;\n\tpropertiesToSearch?: string[];\n\t// searchField: ??? // what is this supposed to be?\n}\n\n/**\n * Search is a \"filter provider\". It is responsible for:\n * 1) updating state with a human readable Search-based filter\n * 2) responding to changes in the Search filter and updating state with the proper query syntax\n *\n * @returns {*}\n * @constructor\n */\nexport const Search: React.FunctionComponent = ({\n\tbuttonText = 'Search',\n\tlarge = false,\n\tplaceholder = 'Enter search terms...',\n\tpropertiesToSearch = [],\n\t...props\n}) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tfilters: {\n\t\t\t\t\tsearch: searchTerms = {\n\t\t\t\t\t\tterms: [],\n\t\t\t\t\t\tfields: [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tselectedDefinitionName,\n\t\t\t},\n\t\t},\n\t\tdispatch,\n\t} = useContext(WorkspaceContext);\n\tconst { terms } = searchTerms;\n\n\tconst [text, setText] = useState('');\n\n\tconst allSearchable = useTextSearchableProperties(selectedDefinitionName, propertiesToSearch);\n\n\tconst updateSearchFilter = (newTerms: string[]) => {\n\t\tsetText('');\n\n\t\tif (newTerms.length === 0) {\n\t\t\tresetTextFilters(dispatch, allSearchable);\n\t\t} else {\n\t\t\tdispatch(\n\t\t\t\tupdateFilter('search', {\n\t\t\t\t\tterms: newTerms,\n\t\t\t\t\tfields: allSearchable,\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleUsageStat = useCallback((terms: string[]) => {\n\t\tsendUsageAction('SearchTermEntered', terms[0]);\n\t}, []);\n\n\tconst clearSearch = () => {\n\t\tsetText('');\n\t\tif (terms.length > 0) updateSearchFilter([]);\n\t};\n\n\tconst addTextToTerms = () => {\n\t\tif (text === '') return;\n\t\tupdateSearchFilter([...terms, text]);\n\t};\n\n\tuseEffect(() => {\n\t\tif (searchTerms.terms.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\t// input is {terms: ['term1', 'term2'], fields: ['Title', 'Abstract']}\n\n\t\t// $or for each field per term\n\t\tconst perField = searchTerms.terms.map((term) => {\n\t\t\treturn searchTerms.fields.map((field) => {\n\t\t\t\treturn { [field]: { $c: term } };\n\t\t\t});\n\t\t});\n\n\t\t// this works for all cases where we still have a term left, but fails\n\t\t// when we have cleared the last term.\n\t\tdispatch(\n\t\t\tupdateQueryString('search', {\n\t\t\t\t$and: perField.map((fieldArray) => {\n\t\t\t\t\treturn { $or: fieldArray };\n\t\t\t\t}),\n\t\t\t})\n\t\t);\n\t}, [searchTerms, dispatch]);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t\t setText((e.target as HTMLInputElement).value)}\n\t\t\t\t\tvalues={terms}\n\t\t\t\t\tonAdd={handleUsageStat}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\trightElement={\n\t\t\t\t\t\t
\n\t);\n};\n\n// handler for resetting filters in Workspace state\nexport function resetTextFilters(dispatch, allSearchable: string[]) {\n\tdispatch(\n\t\tupdateFilter('search', {\n\t\t\tterms: [],\n\t\t\tfields: allSearchable,\n\t\t})\n\t);\n\n\t// if we've deleted the last term, force a queryString update to null\n\tdispatch(updateQueryString('search', null));\n}\n\n// selects text searchable properties based on selectedDefinitionName\nexport function useTextSearchableProperties(selectedDefinitionName, propertiesToSearch) {\n\tconst allSearchable = useFilteredProperties(\n\t\tselectedDefinitionName,\n\t\t[],\n\t\t[SrsPropertyType.Text, SrsPropertyType.String],\n\t\tpropertiesToSearch\n\t).map((p) => p.name);\n\treturn allSearchable;\n}\n\nconst searchWrapperStyle = ({ large }) => css`\n\t// this will let the expand outside its container when its focused and tags overflow\n\theight: ${large ? Variables.PT_INPUT_HEIGHT_LARGE : Variables.PT_INPUT_HEIGHT};\n\tdisplay: flex;\n\tz-index: 11;\n\tflex-direction: row;\n\n\t&:focus-within {\n\t\tflex-direction: column;\n\t}\n\n\t.${Classes.TAG_INPUT_VALUES} {\n\t\toverflow-y: auto; // scroll vertically when overflowing (not focused)\n\t\twidth: 1px; // this tricks flexbox into not indefinitely expanding horizontally\n\t}\n\n\t.${Classes.LARGE} .${Classes.TAG_REMOVE} {\n\t\tpadding: 0 5px 0 0; // blueprint bug? fixed in updated version?\n\t}\n\n\t${Bp3ControlGroupFix}\n`;\n\nconst submitButtonStyle = css`\n\talign-self: flex-start;\n`;\n\nconst Bp3ControlGroupFix = css`\n\t// this is just fixing blueprint TagInput as part of a ControlGroup\n\t.${Classes.CONTROL_GROUP} {\n\t\t.${Classes.TAG_INPUT} {\n\t\t\t&.${Classes.ACTIVE} {\n\t\t\t\tborder-radius: ${Variables.PT_BORDER_RADIUS};\n\t\t\t\tz-index: 14;\n\t\t\t}\n\n\t\t\t.${Classes.BUTTON} {\n\t\t\t\t// this is also a blueprint oversight?\n\t\t\t\tborder-radius: ${Variables.PT_BORDER_RADIUS};\n\t\t\t}\n\t\t}\n\t}\n`;\n","import { isArray } from 'lodash';\nimport moment from 'moment';\nimport { isObject, objectMap, isIsoDate, isURL } from './utils';\n\nexport enum InferredType {\n\tUndefined = 'Undefined',\n\tArray = 'Array',\n\tObject = 'Object',\n\tString = 'String',\n\tNumber = 'Number',\n\tDate = 'Date',\n\tURL = 'URL',\n\tBoolean = 'Boolean',\n}\n\n/**\n * Duck typing at its finest 🦆 🦆 🦢\n * Pass in a string (or strings) and get back a parsed value\n * supports strings, numbers, dates, and urls\n * TODO: export this from ./index.tsx\n * TODO: this function could maybe run faster\n * TODO: this would be unnecessary if the info was just included in SRS data...\n */\nexport function parseInferredType(\n\tthing?: string | string[] | Record\n): InferredTypeValue {\n\tif (thing == null || thing == '') { // should '' return undefined?\n\t\treturn {\n\t\t\ttype: InferredType.Undefined,\n\t\t\tvalue: undefined\n\t\t}\n\t}\n\tif (typeof thing === 'boolean') {\n\t\treturn {\n\t\t\ttype: InferredType.Boolean,\n\t\t\tvalue: thing\n\t\t}\n\t}\n\tif (isArray(thing)) {\n\t\treturn {\n\t\t\ttype: InferredType.Array,\n\t\t\tvalue: thing.map(aDeeperThing => parseInferredType(aDeeperThing))\n\t\t}\n\t}\n\tif (isObject(thing)) {\n\t\treturn {\n\t\t\ttype: InferredType.Object,\n\t\t\tvalue: objectMap(thing as Record, (aDeeperThing) => parseInferredType(aDeeperThing))\n\t\t}\n\t}\n\tthing = thing as string; // the rest is string parsing\n\tif (isIsoDate(thing)) // SRS returns ISO formatted dates in a string\n\t\treturn {\n\t\t\ttype: InferredType.Date,\n\t\t\tvalue: moment.utc(thing) // new Date(thing)\n\t\t}\n\tif (isURL(thing))\n\t\treturn {\n\t\t\ttype: InferredType.URL,\n\t\t\tvalue: new URL(thing)\n\t\t}\n\t// if (isNumber(thing)) // disable number for now. It captures strings to frequently\n\t// \treturn {\n\t// \t\ttype: InferredType.Number,\n\t// \t\tvalue: parseFloat(preformatNumber(thing))\n\t// \t}\n\telse\n\t\treturn {\n\t\t\ttype: InferredType.String,\n\t\t\tvalue: thing\n\t\t}\n}\n\n\nexport type InferredTypeValue = {\n\ttype: InferredType.Undefined,\n\tvalue: undefined\n} | {\n\ttype: InferredType.Array,\n\tvalue: InferredTypeValue[]\n} | {\n\ttype: InferredType.Object,\n\tvalue: { [key: string]: InferredTypeValue }\n} | {\n\ttype: InferredType.String,\n\tvalue: string\n} | {\n\ttype: InferredType.Number,\n\tvalue: number\n} | {\n\ttype: InferredType.Date,\n\tvalue: moment.Moment // Date\n} | {\n\ttype: InferredType.URL,\n\tvalue: URL\n} | {\n\ttype: InferredType.Boolean,\n\tvalue: boolean\n}\n\n// export type InferrableValues = string | string[] | Record // darn\n\n/** Try to use a custom React renderer for the specific property interface rather than using this */\nexport function flattenInferredTypeValueToString(\n\tinferredTypeValue: InferredTypeValue\n\t// baseRenderer?: JSX.Element // TODO?\n): string {\n\tif (inferredTypeValue.type === InferredType.Array) {\n\t\treturn inferredTypeValue.value\n\t\t\t.map(aDeeperInferredTypeValue => flattenInferredTypeValueToString(aDeeperInferredTypeValue))\n\t\t\t.join(`\\n`)\n\t}\n\tif (inferredTypeValue.type === InferredType.Object) {\n\t\tlet objToString = '';\n\t\tfor (const key in inferredTypeValue.value) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(inferredTypeValue.value, key)) {\n\t\t\t\tconst aDeeperInferredTypeValue = inferredTypeValue.value[key];\n\t\t\t\tobjToString += `${key}: ${flattenInferredTypeValueToString(aDeeperInferredTypeValue)}\\n`\n\t\t\t}\n\t\t}\n\t\treturn objToString\n\t}\n\tif (inferredTypeValue.type === InferredType.Undefined) {\n\t\treturn '';\n\t} else {\n\t\t// TODO: baseRenderer(inferredTypeValue)\n\t\treturn inferredTypeValue.value.toString();\n\t}\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { useCallback, useState } from 'react';\nimport { Button, InputGroup, Tag } from '@blueprintjs/core';\nimport { useFacetsState } from 'hooks/useFacetsState';\nimport debounce from 'lodash/debounce';\nimport { alignedMinimalButton } from 'styles/styledComponentUtils';\n\n/**\n * Search is a parameter generator for facets/hierarchical facets\n * When the user clicks the button or presses 'Enter',\n * the optional textFilter parameter on GenerateFacets is set to the current input text\n *\n * @param {string} findIn what is this search bar looking in?\n * @returns {*}\n * @constructor\n */\nexport const FacetSearch = ({ findIn = 'filters', ...props }) => {\n\tconst { getTextFilter, updateTextFilter } = useFacetsState();\n\tconst textFilter = getTextFilter();\n\tconst [text, setText] = useState(textFilter);\n\tconst [showInput, setShowInput] = useState(false);\n\n\t// reset the local text in the case that another component updates the textFilter\n\t// useEffect(() => {\n\t// \tsetText(textFilter);\n\t// }, [textFilter]);\n\n\t// update the text filter state\n\tconst debouncedUpdateFilter = useCallback(\n\t\tdebounce((text) => {\n\t\t\tupdateTextFilter(text);\n\t\t}, 500),\n\t\t[updateTextFilter]\n\t);\n\n\t// clear input on blur\n\tconst handleBlur = (event) => {\n\t\tif (!event.currentTarget.contains(event.relatedTarget)) {\n\t\t\tsetShowInput(false);\n\t\t\tsetText(textFilter);\n\t\t}\n\t};\n\n\t// Clear input\n\tconst handleClearText = (e) => {\n\t\te.stopPropagation(); // for clicking on the tag \"X\" icon\n\t\tsetShowInput(false);\n\t\tsetText('');\n\t\tupdateTextFilter('');\n\t};\n\n\t// On enter\n\tconst handleSubmit = useCallback(\n\t\t(e) => {\n\t\t\te.preventDefault(); // Prevent form submit\n\t\t\tsetShowInput(false);\n\t\t\tupdateTextFilter(text);\n\t\t},\n\t\t[text, updateTextFilter]\n\t);\n\n\tconst handleOnChange = (e) => {\n\t\tconst text = e.target.value;\n\t\tsetText(text);\n\t\tdebouncedUpdateFilter(text);\n\t};\n\n\tconst handleShowInput = () => {\n\t\tsetText(textFilter); // do this so local text is always up-to-date with global textFilter\n\t\tsetShowInput(true);\n\t};\n\treturn (\n\t\t
\n\t\t\t{showInput ? (\n\t\t\t\t}\n\t\t\t\t\tautoFocus\n\t\t\t\t\tonFocus={(e) => e.target?.select()}\n\t\t\t\t\tsmall\n\t\t\t\t/>\n\t\t\t) : textFilter ? (\n\t\t\t\t\n\t\t\t\t\t{textFilter}\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t\n\t\t\t\t\tFind\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\nconst inputStyle = css`\n\tflex: 1 1 auto;\n\n\tanimation-duration: 200ms;\n\tanimation-name: slideopen;\n\tanimation-timing-function: ease-out;\n\n\tmax-width: 200px;\n\t@keyframes slideopen {\n\t\tfrom {\n\t\t\tmax-width: 70px; // approx button width\n\t\t}\n\n\t\tto {\n\t\t\tmax-width: 200px;\n\t\t}\n\t}\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Checkbox, Classes } from '@blueprintjs/core';\nimport smallCross from './small-cross.svg';\nimport { Colors } from 'styles/variables';\n\n/**\n *\n * @param {boolean} isSelected = false,\n * @param {boolean} isExcluded = false,\n * @param {boolean} isAncestorSelected = false,\n * @param {boolean} isAncestorExcluded = false,\n * @param {boolean} hasSelectedChild = false,\n * @param {boolean} hasExcludedChild = false,\n */\nexport const FacetCheckbox = ({\n\tisSelected = false,\n\tisExcluded = false,\n\tisAncestorSelected = false,\n\tisAncestorExcluded = false,\n\thasSelectedChild = false,\n\thasExcludedChild = false,\n\t...props\n}) => {\n\t// STATELESS //\n\n\tconst indeterminate = (!isSelected && !isExcluded) && (hasSelectedChild || hasExcludedChild);\n\tconst inferred = !indeterminate && (isAncestorSelected && !isExcluded) || isAncestorExcluded;\n\tconst selected = isSelected || isAncestorSelected;\n\tconst excluded = isExcluded || isAncestorExcluded || (!hasSelectedChild && hasExcludedChild);\n\n\treturn (\n\t\t\n\t);\n};\n\n// this exists to strip off the excluded and inferred props so react wont error\nconst CheckboxProxy = ({ excluded, inferred, ...props }) => ()\n\nconst CustomCheckbox = styled(CheckboxProxy)`\n\tmargin: 0;\n\t.${Classes.CONTROL_INDICATOR} {\n\t\t${p => { if (p.excluded) return excludedStyle; }}\n\t\t${p => { if (p.excluded && !p.disabled) return excludedInteractiveStyle; }}\n\t\t${p => { if (p.excluded && !p.inferred && !p.indeterminate) return excludedIconStyle; }}\n\t\t${p => { if (p.inferred) return inferredStyle; }}\n\t\t${p => { if (p.indeterminate) return indeterminateStyle; }}\n\t}\n`;\n\nconst inferredStyle = css`\n\topacity: 0.5;\n\t&::before{ // icon\n\t\tbackground-image: unset !important;\n\t}\n`;\n\nconst excludedStyle = css`\n\tbackground-image: unset;\n\tbackground-color: ${Colors.GRAY3} !important;\n`;\n\nconst excludedInteractiveStyle = css`\n\t&:hover{\n\t\tbackground-color: ${Colors.GRAY2} !important;\n\t}\n\t&:active{\n\t\tbackground-color: ${Colors.GRAY1} !important;\n\t}\n`;\n\nconst excludedIconStyle = css`\n\t&::before{ // icon\n\t\tbackground-image: url(\"${smallCross}\") !important;\n\t}\n`;\n\nconst indeterminateStyle = css`\n\topacity: 0.5;\n`;\n","var img = \"data:image/svg+xml,%3csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 16 16' enable-background='new 0 0 16 16' xml:space='preserve'%3e %3c!-- copied from blueprint: https://blueprintjs.com/docs/%23icons search 'Small cross' --%3e %3cpath fill-rule='evenodd' clip-rule='evenodd' fill='white' d='M9.41%2c8l2.29-2.29C11.89%2c5.53%2c12%2c5.28%2c12%2c5c0-0.55-0.45-1-1-1 c-0.28%2c0-0.53%2c0.11-0.71%2c0.29L8%2c6.59L5.71%2c4.29C5.53%2c4.11%2c5.28%2c4%2c5%2c4C4.45%2c4%2c4%2c4.45%2c4%2c5c0%2c0.28%2c0.11%2c0.53%2c0.29%2c0.71L6.59%2c8 l-2.29%2c2.29C4.11%2c10.47%2c4%2c10.72%2c4%2c11c0%2c0.55%2c0.45%2c1%2c1%2c1c0.28%2c0%2c0.53-0.11%2c0.71-0.29L8%2c9.41l2.29%2c2.29C10.47%2c11.89%2c10.72%2c12%2c11%2c12 c0.55%2c0%2c1-0.45%2c1-1c0-0.28-0.11-0.53-0.29-0.71L9.41%2c8z'/%3e%3c/svg%3e\";\n export default img;","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { ColorAliases } from 'styles/variables';\nimport numeral from 'numeral';\n\nconst format = n => numeral(n).format('0,0');\n\ninterface Props extends React.DetailedHTMLProps, HTMLDivElement> {\n\tset?: string | number,\n\ttotal?: string | number,\n\tdivider?: string\n}\n\n/**\n * Displays set of total like: 10/20\n */\nexport const SetOfTotal: React.FC = ({\n\tset,\n\ttotal,\n\tdivider = ' / ', // ' of ',\n\t...props\n}) => {\n\t// STATELESS //\n\tif (set == null || total == null) divider = null\n\treturn (\n\t\t\n\t\t\t{set != null && {format(set)}}\n\t\t\t{divider != null && {divider}}\n\t\t\t{total != null && {format(total)}}\n\t\t\n\t);\n};\n\nconst wrapperStyle = css`\n\tflex: 0 0 auto;\n`;\n\nconst setStyle = css`\n\tfont-weight: bold;\n\tcolor: ${ColorAliases.PT_TEXT_COLOR_MUTED};\n`;\n\nconst dividerStyle = css`\n\tcolor: ${ColorAliases.PT_TEXT_COLOR_DISABLED};\n`;\n\nconst totalStyle = css`\n\tcolor: ${ColorAliases.PT_TEXT_COLOR_MUTED};\n`;\n","// textMarkup\nimport React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * The TextMarkup component can be used for highlighting text and much more.\n * You use it out of the box for highlighting intervals of text. Otherwise you\n * can specify your own renderer and have some intervals change text color and\n * have others change text style.\n */\nexport default class TextMarkup extends PureComponent {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.textMarkup = React.createRef();\n\t}\n\n\trender() {\n\t\t/* eslint-disable no-unused-vars */\n\t\tconst {\n\t\t\tcomponentType,\n\t\t\tchildren,\n\t\t\ttext = '',\n\t\t\thighlights: highlightProps,\n\t\t\tonSelectionUpdate,\n\t\t\tdefaultHighlightColor = '#f5a5244d',\n\t\t\tstyle = {},\n\t\t\tclassName,\n\t\t\t...otherProps\n\t\t} = this.props;\n\t\t/* eslint-enable no-unused-vars */\n\n\t\tconst TextComponent = componentType || 'span'; // was 'article' \n\t\tconst intervals = this.generateIntervals();\n\n\t\tconst textFragments = intervals.map((interval, i) => {\n\t\t\tconst { highlights, text } = interval;\n\t\t\tconst highlightValues = highlights.map(x => highlightProps.find(h => h.id === x));\n\t\t\tif (typeof children === 'function') {\n\t\t\t\treturn children(text, highlightValues, i);\n\t\t\t}\n\t\t\treturn this.defaultRenderer(text, highlightValues, i);\n\t\t});\n\n\t\treturn (\n\t\t\t\n\t\t\t\t{textFragments}\n\t\t\t\t{/* This allows the last line of the document to be properly\n\t\t\t\tselected after a triple click. */}\n\t\t\t\t{/*
*/}\n\t\t\t\t{/* */}\n\t\t\t\n\t\t);\n\t}\n\n\t/**\n\t * The renderer that is used to display highlights out of the box.\n\t * @param text - The text of the current snippet.\n\t * @param highlightValues - The values of the highlights contained in the current snippet.\n\t * @param i - The index of the interval. (Used for specifying the key prop).\n\t * @returns {Element}\n\t */\n\tdefaultRenderer(text, highlightValues, i) {\n\t\tconst { defaultHighlightColor = '#f5a5244d' } = this.props;\n\t\treturn (\n\t\t\t (x && x.color) || defaultHighlightColor))}>\n\t\t\t\t{text}\n\t\t\t\n\t\t);\n\t}\n\n\t/**\n\t * Converts the highlights into intervals with lists of highlights.\n\t * @returns {[]}\n\t */\n\tgenerateIntervals = () => {\n\t\tconst { text, highlights } = this.props;\n\n\t\t// Create a list of start, end points.\n\t\tconst points = [];\n\t\thighlights.forEach(highlight => {\n\t\t\tpoints.push({\n\t\t\t\tstart: highlight.id,\n\t\t\t\tvalue: highlight.start,\n\t\t\t});\n\t\t\tpoints.push({\n\t\t\t\tend: highlight.id,\n\t\t\t\tvalue: highlight.end,\n\t\t\t});\n\t\t});\n\t\tpoints.sort((a, b) => {\n\t\t\treturn a.value - b.value;\n\t\t});\n\n\t\t// Merge points with the same value together.\n\t\t// [{start, end, value},...] => [{start[], end[], value}, ...]\n\t\tlet uniquePoints = points.reduce((uniquePoints, point) => {\n\t\t\tconst { start = [], end = [] } = uniquePoints[point.value] || {};\n\t\t\tif (point.start) {\n\t\t\t\tstart.push(point.start);\n\t\t\t}\n\t\t\tif (point.end) {\n\t\t\t\tend.push(point.end);\n\t\t\t}\n\t\t\tuniquePoints[point.value] = { start, end };\n\t\t\treturn uniquePoints;\n\t\t}, {});\n\t\tuniquePoints = Object.entries(uniquePoints).map(([value, { start, end }]) => ({ value, start, end }));\n\n\t\t// Covert points to intervals.\n\t\tlet currentStart = 0;\n\t\tlet currentHighlights = []; // array of highlight ids.\n\t\tlet intervals = []; // should look like [{highlights, text}, ...].\n\n\t\tObject.values(uniquePoints).forEach(point => {\n\t\t\tintervals.push({\n\t\t\t\thighlights: [...currentHighlights],\n\t\t\t\ttext: text.slice(currentStart, point.value),\n\t\t\t\tid: currentStart,\n\t\t\t});\n\n\t\t\tpoint.start.forEach(highlightStartId => {\n\t\t\t\tcurrentHighlights.push(highlightStartId);\n\t\t\t});\n\t\t\tpoint.end.forEach(highlightStartId => {\n\t\t\t\tcurrentHighlights.splice(currentHighlights.indexOf(highlightStartId), 1);\n\t\t\t});\n\n\t\t\tcurrentStart = point.value;\n\t\t});\n\n\t\t// Add the last interval.\n\t\tif (currentStart !== text.length - 1) {\n\t\t\tintervals.push({\n\t\t\t\thighlights: [],\n\t\t\t\ttext: text.slice(currentStart, text.length),\n\t\t\t});\n\t\t}\n\n\t\treturn intervals;\n\t};\n\n\t/**\n\t * A utility to get the start and end values from the selection object.\n\t * @returns {{start: *, end: *, sel: *}}\n\t */\n\tgetSelectionOffset() {\n\t\tlet element = this.textMarkup.current;\n\n\t\t// The below code was borrowed from https://stackoverflow.com/a/4812022/9041594\n\t\tlet start = 0;\n\t\tlet end = 0;\n\t\tconst doc = element.ownerDocument || element.document;\n\t\tconst win = doc.defaultView || doc.parentWindow;\n\t\tlet sel;\n\t\tif (typeof win.getSelection !== 'undefined') {\n\t\t\tsel = win.getSelection();\n\t\t\tif (sel.rangeCount > 0) {\n\t\t\t\tlet range = win.getSelection().getRangeAt(0);\n\t\t\t\tlet preCaretRange = range.cloneRange();\n\t\t\t\tpreCaretRange.selectNodeContents(element);\n\t\t\t\tpreCaretRange.setEnd(range.startContainer, range.startOffset);\n\t\t\t\tstart = preCaretRange.toString().length;\n\t\t\t\tpreCaretRange.setEnd(range.endContainer, range.endOffset);\n\t\t\t\tend = preCaretRange.toString().length;\n\t\t\t}\n\t\t} else if ((sel = doc.selection) && sel.type !== 'Control') {\n\t\t\tlet textRange = sel.createRange();\n\t\t\tlet preCaretTextRange = doc.body.createTextRange();\n\t\t\tpreCaretTextRange.moveToElementText(element);\n\t\t\tpreCaretTextRange.setEndPoint('EndToStart', textRange);\n\t\t\tstart = preCaretTextRange.text.length;\n\t\t\tpreCaretTextRange.setEndPoint('EndToEnd', textRange);\n\t\t\tend = preCaretTextRange.text.length;\n\t\t}\n\t\treturn { start, end, sel };\n\t}\n\n\t/**\n\t * Creates a vertical color gradient style object\n\t * @param colors[] - An array of CSS colors.\n\t * @returns {React style object}\n\t */\n\tgenerateGradient(colors) {\n\t\treturn {\n\t\t\tbackgroundColor: colors[0],\n\t\t\tbackgroundImage: colors.length > 1 ? `linear-gradient(${colors.join(', ')})` : undefined,\n\t\t};\n\t}\n}\n\nTextMarkup.propTypes = {\n\tchildren: PropTypes.func,\n\tcomponentType: PropTypes.elementType,\n\tdefaultHighlightColor: PropTypes.string,\n\thighlights: PropTypes.array.isRequired,\n\tstyle: PropTypes.object,\n\ttext: PropTypes.string,\n\tclassName: PropTypes.string,\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useContext } from 'react';\nimport TextMarkup from './textMarkup';\nimport { v4 as uuidv4 } from 'uuid';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { ColorAliases } from 'styles/variables';\n\nexport interface HighlightWorkspaceTermsProps extends HighlightTermsProps {\n\t/** maps to children for compatibility */\n\ttext?: string;\n}\nexport const HighlightWorkspaceTerms: React.FC = ({\n\ttext,\n\tchildren,\n\tnoTextMessage,\n\twrapperElement,\n\tclassName,\n}) => {\n\tconst {\n\t\tstate: {\n\t\t\texplorer: {\n\t\t\t\tfilters: {\n\t\t\t\t\tsearch: { terms } = {\n\t\t\t\t\t\tterms: [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} = useContext(WorkspaceContext);\n\n\treturn (\n\t\t\n\t);\n};\n\nexport interface HighlightTermsProps {\n\tterms?: string[];\n\twrapperElement?: keyof JSX.IntrinsicElements;\n\tnoTextMessage?: string;\n\tclassName?: string;\n\ttitle?: string;\n\tellipsize?: boolean;\n}\nexport const HighlightTerms: React.FC = ({\n\tchildren,\n\tterms = [],\n\twrapperElement: Element = 'span',\n\tnoTextMessage = 'No text',\n\tclassName,\n\t...rest\n}) => {\n\tif (!children) {\n\t\treturn (\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t);\n\t}\n\n\tif (terms.length === 0) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\tconst text = children.toString();\n\tconst highlights = searchWithOffsets(text, terms);\n\treturn ;\n};\n\n/** Find matches for `terms` in description*/\nfunction searchWithOffsets(description: string, terms: string[]) {\n\t// sanitize terms\n\tconst formattedTerms = terms.map((term) => term.replace(/[#-.]|[[-^]|[?|{}]/g, '\\\\$&'));\n\n\tconst token = new RegExp(`(${formattedTerms.join('|')})`, 'gi');\n\t// @Ryan: removed wordbreak \\b wrappers to match sub-word strings. Matches how search works on the server?\n\t// terms = ['magnetic'] matches in 'Electromagnetic' 👍\n\n\t// @James: That's right! Before, in the filter network request we we're using the SRS $token search (which matches\n\t// words). Now we're using $c (contains) which matches all sub-strings.\n\n\t// regex match all search terms in the description\n\tconst regexIterator = description.matchAll(token);\n\n\t// Format results\n\treturn Array.from(regexIterator).map((match) => ({\n\t\tid: uuidv4(),\n\t\tvalue: match[0],\n\t\tstart: match.index,\n\t\tend: match[0].length + match.index,\n\t}));\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { H6 } from '@blueprintjs/core';\nimport { GenericObject } from 'interfaces/GenericObject';\nimport { Sizes } from 'styles/variables-slykit';\nimport { InferredType, parseInferredType, flattenInferredTypeValueToString } from 'utilities/parseInferredType';\nimport { HighlightTerms } from './textHighlighter';\n\nexport interface DocumentContentProps {\n\t/** the SRS data item, could be anything? */\n\titem: GenericObject, // TODO: type this\n\t/** which body properties to show */\n\tbodyProperties?: string[],\n\t/** display property name: values in a single column instead of the default double */\n\tsingleColumn?: boolean,\n\t/** if an item.property has an empty value, hide it */\n\thideEmptyValues?: boolean,\n}\n\nexport interface DocumentContentSearchProps extends DocumentContentProps {\n\t/** the terms that have been searched for */\n\tterms?: string[],\n\t/** the names of the fields that the terms are searched for in */\n\tfields?: string[],\n}\n\n/** default component to display and format the DocumentViewer's Body/Content */\nexport const DefaultDocumentContent: React.FunctionComponent = ({\n\titem,\n\tbodyProperties,\n\tterms,\n\tfields,\n\tsingleColumn = false,\n\thideEmptyValues = false,\n\t...props\n}) => {\n\tconst properties = bodyProperties ?? Object.keys(item.propertyValues ?? []);\n\n\t// console.log(item.propertyValues);\n\n\tconst renderProperties = properties\n\t\t.map((property) => {\n\t\t\t// TODO: properties could include shortcut links to apply facet filters\n\n\t\t\tlet propertyValue = item.propertyValues[property];\n\t\t\tlet typeInferredPropertyValue = parseInferredType(propertyValue);\n\n\t\t\tif (hideEmptyValues && typeInferredPropertyValue.type === InferredType.Undefined) {\n\t\t\t\treturn null; // .filter() out below\n\t\t\t}\n\n\t\t\t// console.log(property, typeInferredPropertyValue, propertyValue);\n\n\t\t\t// prettifying how any array value is viewed (all on new lines)\n\t\t\tif (typeInferredPropertyValue.type === InferredType.Array) {\n\t\t\t\ttypeInferredPropertyValue = {\n\t\t\t\t\ttype: InferredType.String,\n\t\t\t\t\tvalue: flattenInferredTypeValueToString(typeInferredPropertyValue),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst isSearched = fields.includes(property);\n\t\t\tconst isLongString = propertyValue?.length > 140;\n\n\t\t\treturn {\n\t\t\t\tproperty,\n\t\t\t\tpropertyValue,\n\t\t\t\ttypeInferredPropertyValue,\n\t\t\t\tisSearched,\n\t\t\t\tisLongString,\n\t\t\t};\n\t\t})\n\t\t.filter((property) => property != null);\n\n\treturn (\n\t\t
\n\t\t\t{renderProperties.map(({ property, propertyValue, typeInferredPropertyValue, isSearched, isLongString }) => {\n\t\t\t\tconst propertyValueCss = [propertyValueStyle, isLongString ? twoColStyle : undefined];\n\t\t\t\tlet propertySlug = property\n\t\t\t\t\t.replace(/^\\s+|\\s+$/g, '') // Trim\n\t\t\t\t\t.toLowerCase() // Lowercase\n\t\t\t\t\t.replace(/\\s+/g, '-'); // Spaces to dashes\n\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t{typeInferredPropertyValue.type === InferredType.Date ? (\n\t\t\t\t\t\t\t// TODO: render the rest of the InferredTypes appropriately\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t);\n\t\t\t})}\n\t\t
\n\t);\n};\nconst propertyLabelStyle = css`\n\t/* margin: 0; */\n\tmargin: 1em 0 0.25em 0;\n`;\nconst propertyValueStyle = css`\n\tmargin: 0;\n\twhite-space: pre-wrap;\n`;\nconst twoColStyle = css`\n\tgrid-column: span 2;\n`;\nconst contentWrapperStyle = css`\n\tpadding: ${Sizes.sm} ${Sizes.lg} ${Sizes.xxxlg}; \n`;\nconst contentWrapperGridStyle = css`\n\tdisplay: grid;\n\tgrid-template-columns: // minmax(auto, 40%)\n\t\tauto\n\t\tminmax(1rem, 1fr);\n\talign-items: baseline;\n\tgrid-gap: 0 ${Sizes.md};\n`;\n","/** @jsx jsx */\nimport { Button, ButtonGroup, Classes, IButtonGroupProps, Menu, MenuItem, Popover } from '@blueprintjs/core';\nimport { css, jsx } from '@emotion/react';\nimport { Dispatch, SetStateAction } from 'react';\nimport { overflowEllipsis } from 'styles/styledComponentUtils';\n\nexport type FacetSortOption = {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport enum FACET_SORT_ENUM {\n\tNUMERIC = \"NUMERIC\",\n\tALPHABETICAL = \"ALPHABETICAL\",\n}\nexport const SORT_TYPES: {[key in string]: FacetSortOption } = {\n\t[FACET_SORT_ENUM.NUMERIC]: { value: 'count', label: 'Count' },\n\t[FACET_SORT_ENUM.ALPHABETICAL]: { value: 'alphabetical', label: 'Name' },\n};\n\ninterface Props<> extends IButtonGroupProps {\n\tsortOptions?: string[],\n\tselectedSortOption?: string,\n\tsetSelectedSortOption?: Dispatch>,\n\tisDescending?: boolean,\n\tsetIsDescending?: Dispatch>,\n\tlabel?: string,\n}\n\nexport const SortSelect: React.FC = ({\n\tsortOptions = [],\n\tselectedSortOption,\n\tsetSelectedSortOption,\n\tisDescending = true,\n\tsetIsDescending,\n\tlabel = 'Sort:',\n\t...props\n}) => {\n\n\t// STATELESS //\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\t\t{sortOptions.map((option, i) => (\n\t\t\t\t\t\t\t {\n\t\t\t\t\t\t\t\t\tsetSelectedSortOption(option)\n\t\t\t\t\t\t\t\t\tsetIsDescending && setIsDescending(true)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tactive={option == selectedSortOption}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t\n\t\t\t\t\t{label}{` `}\n\t\t\t\t\t{selectedSortOption || 'None'}\n\n\t\t\t\t\n\t\t\t\n\t\t\t{setIsDescending && (\n\t\t\t\t setIsDescending(!isDescending)}\n\t\t\t\t\tsmall\n\t\t\t\t/>\n\t\t\t)}\n\t\t\n\t);\n};\n\nconst buttonGroupStyle = css`\n\toverflow: hidden;\n`;\n\nconst sortButtonStyle = css`\n flex: 1 1 auto;\n .${Classes.BUTTON_TEXT}{\n\t ${overflowEllipsis}\n }\n`\n\nconst popoverStyle = css`\n\t&, & .${Classes.POPOVER_TARGET} {\n\t\toverflow:hidden;\n\t}\n`\n\n","/** @jsx jsx */\nimport React from 'react';\nimport { jsx, css } from '@emotion/react';\n\n/** Attributes for tags that will open a new tab. Usage: */\nexport const externalLinkAttributes = {\n\t// https://stackoverflow.com/a/15551842/5648839\n\ttarget: \"_blank\",\n\trel: \"noopener noreferrer\"\n}\n\n/** An tag that will open href in a new tab */\nexport interface ExternalLinkProps extends React.ComponentProps<'a'> { }\nexport const ExternalLink: React.FC = ({ ...props }) => {\n\treturn (\n\t\t\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport React from 'react';\nimport { AnchorButton, Intent, H3, } from '@blueprintjs/core';\nimport { ColorAliases } from 'styles/variables';\nimport { GenericObject } from 'interfaces/GenericObject';\nimport { Sizes } from 'styles/variables-slykit';\nimport { clampLineCount } from 'styles/styledComponentUtils';\nimport { HighlightTerms } from './textHighlighter';\nimport { externalLinkAttributes } from 'components/externalLink';\n\nexport interface DocumentHeaderProps {\n\t/** the SRS data item, could be anything? */\n\titem: GenericObject, // TODO: type this\n\t/** the property of item that is the title of the document */\n\ttitleProperty?: string,\n\t/** the property of item that that contains a primary URL */\n\tlinkProperty?: string,\n\t/** a that displays the subTitle */\n\tsubTitle?: JSX.Element\n}\n\nexport interface DocumentHeaderSearchProps extends DocumentHeaderProps {\n\t/** the terms that have been searched for */\n\tterms?: string[],\n}\n\n\n/** default component to display the DocumentViewer Header */\nexport const DefaultDocumentHeader: React.FunctionComponent = ({\n\titem,\n\ttitleProperty,\n\tlinkProperty,\n\tterms,\n\tsubTitle,\n\tchildren,\n\t...props\n}) => {\n\tconst title = item.propertyValues?.[titleProperty];\n\tconst linkHref = item.propertyValues?.[linkProperty];\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t<HighlightTerms terms={terms} noTextMessage={'No Title'} children={title} cy-test=\"document-header-title\" />\n\t\t\t\n\n\t\t\t{subTitle}\n\n\t\t\t\n\t\t\t\t{linkProperty && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t\t{/* {supportBookmarking && \n\t\t\t\t)}\n\t\t\t\t{onOpen && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{onDelete && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{onAddDescription && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{onCancel && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\t{onSave && (\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t\n\t);\n}\n\nconst FavoriteButton = ({ isFavorite, toggleFavorite }) => {\n\treturn (\n\t\t \n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst styles = { \n\tDialog: css`\n\t.bp3-button{ \n\t\tmargin-left: 5px; \n\t}\n\n\t.bp3-dialog-footer{ \n\t\ttext-align: right; \n\t}\n\tbackground: white;\n`,\t\n}","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport { Fragment, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { Dialog } from 'components/dialogs';\nimport { Button, Divider, Icon, Classes } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { transformExplorerCardToExplorer } from 'hooks/savedViews/helpers';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from 'views/workspace/workspaceContext';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\nimport { Header } from 'views/savedViews/header';\nimport { useHistory } from 'react-router-dom';\nimport { ManageViewsStateContext, ManageViewsActionCreator } from './useManageViewsState';\nimport { MetaDataSideBar } from 'views/savedViews/metaDataSideBar';\nimport { useDefaultColors } from 'utilities/setUpColorScale';\nimport { Filters } from 'views/filters';\nimport { Workspace } from 'views/workspace';\nimport { MiniExplorer } from 'views/savedViews/miniExplorer';\nimport { TimelineWrapper } from '/views/timeline/timelineWrapper';\nimport { FilterHub } from 'views/filterHub';\nimport { AddDescriptionDialog } from 'views/savedViews/dialogs/addDescriptionDialog';\n\nexport function RenderWidget({ widget: formattedWidget, toggleFavorite, updateUrlPathCallback = undefined }) {\n\tconst { state: { explorer: { layout }}, dispatch } = useContext(WorkspaceContext);\n\tconst { dispatch: savedStatesDispatch } = useSavedStateSelectors();\n\tconst { \n\t\tstate: { isEditing }, \n\t\tdispatch: manageViewsStateDispatch \n\t} = useContext(ManageViewsStateContext);\n\tconst history = useHistory();\n\tconst [isMetaDataOpen, setIsMetaDataOpen] = useState(true);\n\tconst [isDeleteWidgetModalOpen, setDeleteWidgetModalOpen] = useState(false);\n\tconst [isWarningDialogOpen, setIsWarningDialogOpen] = useState(false);\n\tconst [isAddDescriptionModalOpen, setIsAddDescriptionModalOpen] = useState(false);\n\n\tconst openDeleteModal = () => setDeleteWidgetModalOpen(true);\n\tconst closeDeleteModal = () => setDeleteWidgetModalOpen(false);\n\tconst openWarningDialog = () => setIsWarningDialogOpen(true);\n\tconst closeWarningDialog = () => setIsWarningDialogOpen(false);\n\tconst toggleDescriptionModal = () => setIsAddDescriptionModalOpen(state => !state);\n\t\n\t// Covert the saved widget object into a dashboard object\n\tconst widget = useMemo(() => {\n\t\tif (formattedWidget) {\n\t\t\treturn formattedWidget;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}, [formattedWidget]);\n\n\tconst [name, setName] = useState(widget.metaData.name);\n\tconst [description, setDescription] = useState(widget.metaData?.description || '');\n\n\tconst appSpecificColors = useContext(ColorScalesContext);\n\tconst getColorScale = useDefaultColors(appSpecificColors);\n\n\t// Open view in explorer\n\tconst loadExplorer = useCallback(() => {\n\t\tconst explorer = transformExplorerCardToExplorer(formattedWidget);\n\t\tdispatch(WorkspaceActionCreator.loadSavedView('explorer', explorer));\n\n\t\tconst path = updateUrlPathCallback\n\t\t\t? updateUrlPathCallback(explorer)\n\t\t\t: '/explorer';\n\n\t\thistory.push(path);\n\t\t\n\t}, [formattedWidget, dispatch, updateUrlPathCallback, history]);\n\n\t// Delete the view\n\tconst handleDelete = useCallback(() => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.setSelectedView(null));\n\t\tsavedStatesDispatch(\n\t\t\tSavedStatesActionCreator.deleteView(\n\t\t\t\t'widgets',\n\t\t\t\tformattedWidget.metaData.id\n\t\t\t)\n\t\t);\n\t}, [formattedWidget.metaData.id, savedStatesDispatch, manageViewsStateDispatch]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.stopEditing());\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.setSelectedView(null));\n\t\tsetName(widget?.metaData?.name);\n\t\tsetDescription(widget?.metaData?.description);\n\t}, [manageViewsStateDispatch, widget]);\n\n\tconst handleSave = useCallback(() => {\n\t\tif (name === '') {\n\t\t\topenWarningDialog();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst updatedView = {\n\t\t\t...widget,\n\t\t\tmetaData: {\n\t\t\t\t...widget.metaData,\n\t\t\t\tname: name,\n\t\t\t\tdescription: description\n\t\t\t},\n\t\t\tdataConfiguration: {\n\t\t\t\t...widget.dataConfiguration,\n\t\t\t\tendpointQuery: {\n\t\t\t\t\t...layout.cards[0].endpointQuery \n\t\t\t\t}\n\t\t\t},\n\t\t\twidgetConfiguration: {\n\t\t\t\t...layout.cards[0].widgetConfiguration\n\t\t\t},\n\t\t\ttype: layout.cards[0].type\n\t\t}\n\t\t\n\t\tsavedStatesDispatch(SavedStatesActionCreator.updateView(updatedView));\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.stopEditing());\n\t}, [name, widget, description, layout, savedStatesDispatch, manageViewsStateDispatch]);\n\n\tconst handleEdit = () => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.startEditing());\n\t}\n\n\tuseEffect(() => {\n\t\tconst explorer = transformExplorerCardToExplorer(formattedWidget);\n\t\tdispatch(WorkspaceActionCreator.loadSavedView('explorer', explorer));\n\t}, [dispatch, formattedWidget]);\n\n\tconst handleAddDescription = (newDescription) => {\n\t\tsetDescription(newDescription);\n\t\ttoggleDescriptionModal();\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t{isDeleteWidgetModalOpen &&\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Are you sure you want to delete this view? It cannot be undone.

\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t}\n\t\t\t\t\t\ticon={}\n\t\t\t\t\t\tonClose={closeDeleteModal} \n\t\t\t\t\t\tfooter = {\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t{isWarningDialogOpen && \n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t{isAddDescriptionModalOpen &&\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst SaveWarningDialog = ({ onClose }) => {\n\treturn (\n\t\t\n\t\t\t\t\t

Before we can save your view, add a title.

\n\t\t\t\t \n\t\t\t}\n\t\t\ticon={}\n\t\t\tonClose={onClose} \n\t\t\tfooter = {\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst metaDataCss = css`\n\tmargin-top: 20px;\n\tmargin-bottom: 20px;\n`;\n\nconst collapseButton = css`\n\tmargin-top: 20px;\n\tmargin-bottom: 20px;\n\tmin-width: 0;\n`;\n\nconst viewWrapper = css`\n\toverflow: hidden;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: stretch;\n\tpadding: 10px;\n\tbox-shadow: rgb(0 0 0 / 10%) 0 12px 48px 0;\n`;\n\nconst DashboardCardWrapper = css`\n flex: 1 1 auto;\n display: grid;\n grid-template-columns: repeat(1, 1fr);\n grid-template-rows: repeat(1, 1fr);\n grid-column-gap: 20px;\n grid-row-gap: 20px;\n overflow: hidden;\n padding: 20px;\n`;\n\nconst styles = { \n\tDialog: css`\n\t.bp3-button{ \n\t\tmargin-left: 5px; \n\t}\n\n\t.bp3-dialog-footer{ \n\t\ttext-align: right; \n\t}\n\n\tbackground: white; \n`,\t\n}\n\nconst explorerStyle = css`\n\tdisplay: flex;\n\toverflow: hidden;\n`;\n\nconst cards = css`\n\tdisplay: flex;\n\talign-items: center;\n`;\n\nconst tightCard = css`\n\t${cards};\n\tpadding: 0;\n\toverflow: hidden;\n`;\n\nconst headerCardStyle = css`\n\tvisibility: hidden;\n\theight: 0px;\n\twidth: 0px;\n`;\n\nconst layoutStyle = css`\n\t${tightCard};\n\tflex: 1 1 auto;\n`;","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport { Fragment, useCallback, useContext, useEffect, useState } from 'react';\nimport { Button, Classes, Divider, NonIdealState, Icon as BlueprintIcons } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons'; \nimport { SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WIDGETS } from 'widgets';\nimport { Icon } from 'components/icon';\nimport { Header } from 'views/savedViews/header';\nimport { ManageViewsActionCreator, ManageViewsStateContext } from './useManageViewsState';\nimport { Dialog } from 'components/dialogs';\nimport { AddDescriptionDialog } from 'views/savedViews/dialogs/addDescriptionDialog';\n\nexport function EditDashboard({\n\tdashboard: oldDashboard,\n\tonDashboardFinished,\n\ttoggleFavorite\n}) {\n\tconst { dispatch } = useSavedStateSelectors();\n\tconst { state: { isCreating, layout }, dispatch: manageViewsDispatch } = useContext(ManageViewsStateContext); \n\tconst [dashboard, setDashboard] = useState(oldDashboard);\n\tconst [isAddTitleModalOpen, setAddTitleModalOpen] = useState(false);\n\tconst [isLeaveDashboardModalOpen, setLeaveDashboardModalOpen] = useState(false); \n\tconst [isRemoveWidgetModalOpen, setRemoveWidgetModalOpen] = useState(false);\n\tconst [isEmptyWidgetModalOpen, setEmptyWidgetModalOpen] = useState(false); \n\tconst [isAddDescriptionModalOpen, setIsAddDescriptionModalOpen] = useState(false);\n\tconst [widgetKey, setWidgetKey] = useState(0); \n\n\tconst openSaveTitleWarning = () => { \n\t\tsetAddTitleModalOpen(true);\n\t}\n\n\tconst closeSaveTitleWarning = () => { \n\t\tsetAddTitleModalOpen(false); \n\t}\n\n\tconst openLeaveDashboardWarning = () => {\n\t\tsetLeaveDashboardModalOpen(true); \n\t}\n\n\tconst closeLeaveDashboardWarning = () => { \n\t\tsetLeaveDashboardModalOpen(false); \n\t}\n\n\tconst openRemoveWidgetWarning = (i) => {\n\t\tsetWidgetKey(i); \n\t\tsetRemoveWidgetModalOpen(true); \n\t}\n\n\tconst closeRemoveWidgetWarning = () => { \n\t\tsetRemoveWidgetModalOpen(false); \n\t}\n\n\tconst openEmptyWidgetWarning = () => { \n\t\tsetEmptyWidgetModalOpen(true); \n\t}\n\n\tconst closeEmptyWidgetWarning = () => { \n\t\tsetEmptyWidgetModalOpen(false); \n\t}\n\n\tconst toggleDescriptionDialog = () => {\n\t\tsetIsAddDescriptionModalOpen(state => !state);\n\t}\n\n\tconst handleAddDescription = (description) => {\n\t\tsetDashboard(dash => ({\n\t\t\t...dash,\n\t\t\tmetaData: {\n\t\t\t\t...dash.metaData,\n\t\t\t\tdescription: description\n\t\t\t}\n\t\t}));\n\t\ttoggleDescriptionDialog();\n\t}\n\n\t// Force Number of cards to be === to layout.cardCount\n\tuseEffect(() => {\n\t\tsetDashboard((oldDash) => {\n\t\t\tlet cards = [\n\t\t\t\t// Keep filled cards\n\t\t\t\t...oldDash.cards?.filter((x) => !!x),\n\t\t\t\t// NOTE: if we have a layout with more than 10 we'll have to generalize this code\n\t\t\t\t...Array.from(new Array(10)).map(() => null),\n\t\t\t];\n\t\t\tcards = cards.slice(0, layout.cardCount);\n\t\t\treturn {\n\t\t\t\t...oldDash,\n\t\t\t\tcards,\n\t\t\t};\n\t\t});\n\t}, [layout.cardCount]);\n\n\n\tconst onClose = useCallback(() => {\n\t\t// re-routes to manage views \"home\" page\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(null));\n\t\tonDashboardFinished();\n\t}, [onDashboardFinished]);\n\n\tconst checkWidgets = () => { \n\t\tdashboard.cards.some(card => card === null) ? openEmptyWidgetWarning() : onSave();\n\t}\n\n\t// Handle save\n\tconst onSave = useCallback(() => {\n\t\tif (dashboard.metaData.name === ''){ \n\t\t\topenSaveTitleWarning();\n\t\t\treturn;\n\t\t}\n\t\tconst updatedView = {\n\t\t\t...dashboard,\n\t\t\tcards: dashboard.cards?.filter((x) => !!x),\n\t\t\tlayout: {\n\t\t\t\tlayoutStyle: {\n\t\t\t\t\tkey: layout.key,\n\t\t\t\t\tcardCount: layout.cardCount\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t\tdispatch(SavedStatesActionCreator.updateView(updatedView));\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(updatedView));\n\t\tonDashboardFinished();\n\t}, [dashboard, dispatch, manageViewsDispatch, onDashboardFinished, layout]);\n\n\tconst onNameChange = (name) => {\n\t\tsetDashboard(prevDashboard => ({\n\t\t\t...prevDashboard,\n\t\t\tmetaData: {\n\t\t\t\t...prevDashboard.metaData,\n\t\t\t\tname: name\n\t\t\t}\n\t\t}));\n\t}\n\n\t// Puts a widget in a cell\n\tconst setWidget = useCallback((ev, i) => {\n\t\tev.preventDefault();\n\t\tconst view = ev.dataTransfer.getData('view');\n\t\tif (!view) return;\n\t\tsetDashboard((oldDash) => {\n\t\t\tlet newCards = [...oldDash.cards];\n\t\t\ttry {\n\t\t\t\tnewCards[i] = JSON.parse(view);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error(err);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...oldDash,\n\t\t\t\tcards: newCards,\n\t\t\t};\n\t\t});\n\t}, []);\n\n\t// Removes a widget from a cell\n\tconst clearWidget = useCallback((i) => {\n\t\tcloseRemoveWidgetWarning(); \n\t\tsetDashboard((oldDash) => {\n\t\t\tlet newCards = [...oldDash.cards];\n\t\t\tnewCards[i] = null;\n\t\t\treturn {\n\t\t\t\t...oldDash,\n\t\t\t\tcards: newCards,\n\t\t\t};\n\t\t});\n\t}, []);\n\n\tconst handleFavoriteToggle = useCallback(() => {\n\t\tsetDashboard(prevDashboard => ({\n\t\t\t...prevDashboard,\n\t\t\tmetaData: {\n\t\t\t\t...prevDashboard.metaData,\n\t\t\t\tisFavorite: !prevDashboard.metaData.isFavorite\n\t\t\t}\n\t\t}));\n\t\tif (!isCreating) {\n\t\t\ttoggleFavorite();\n\t\t}\n\t}, [isCreating, setDashboard, toggleFavorite]);\n\t\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{isAddTitleModalOpen && \n\t\t\t\t\n\t\t\t\t\t\t\t

Before we can save your dashboard, add a title.

\n\t\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t\ticon={}\n\t\t\t\t\tonClose={closeSaveTitleWarning} \n\t\t\t\t\tfooter = {\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t}\n\t\t\t{isLeaveDashboardModalOpen && \n\t\t\t\t\n\t\t\t\t\t\t\t

You are leaving the dashboard builder. Any unsaved changes will be lost.

\n\t\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t\ticon={}\n\t\t\t\t\tonClose={closeLeaveDashboardWarning} \n\t\t\t\t\tfooter={\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t}\n\t\t\t{isEmptyWidgetModalOpen && \n\t\t\t\t\t\t\t

There is an empty widget container. Do you wish to save it as is?

\n\t\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t\ticon={}\n\t\t\t\t\tonClose={closeEmptyWidgetWarning} \n\t\t\t\t\tfooter = {\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t}\n\t\t\t{isRemoveWidgetModalOpen && \n\t\t\t\t\n\t\t\t\t\t\t\t

Are you sure you want to remove this widget?

\n\t\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t\ticon={}\n\t\t\t\t\tonClose={closeRemoveWidgetWarning} \n\t\t\t\t\tfooter = {\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t}\n\t\t\t{isAddDescriptionModalOpen &&\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\t{dashboard.cards?.map((card, i) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t setWidget(e, i)}\n\t\t\t\t\t\t\tonDragOver={(e) => e.preventDefault()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{!card ? (\n\t\t\t\t\t\t\t\t
Drop Widget Here
\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttitle={card.metaData.name}\n\t\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t\t openRemoveWidgetWarning(i)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\n\t\t
\n\t);\n}\n\nconst styles = { \n\tDialog: css`\n\t.bp3-button{ \n\t\tmargin-left: 5px; \n\t}\n\n\t.bp3-dialog-footer{ \n\t\ttext-align: right; \n\t}\n\n\tbackground: white; \n`,\t\n}\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport { Fragment, useCallback, useContext, useMemo, useState } from 'react';\nimport { Header } from 'views/savedViews/header';\nimport { Divider, NonIdealState, Classes, Icon, Button } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Dashboard } from '/views/dashboard';\nimport { LAYOUT_OPTIONS } from '/views/explorer/layoutOptions';\nimport { SavedStatesActionCreator } from '/hooks/savedViews/actions';\nimport { useSavedStateSelectors } from '/hooks/savedViews/hooks';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { Dialog } from 'components/dialogs';\nimport { EditDashboard } from '/views/savedViews/editDashboard';\nimport { ManageViewsActionCreator, ManageViewsStateContext } from './useManageViewsState';\nimport { v4 as uuid } from \"uuid\";\n\nfunction cardCountToLayout(layoutKey, count) {\n\tconst targetCardCount = count === 0 ? 1 : count;\n\tif (layoutKey !== null) {\n\t\treturn LAYOUT_OPTIONS[layoutKey];\n\t}\n\treturn Object.values(LAYOUT_OPTIONS).find(\n\t\t({ cardCount }) => cardCount === targetCardCount\n\t);\n}\n\nexport function RenderDashboard({ toggleFavorite }) {\n\tconst { dispatch: savedStatesDispatch } = useSavedStateSelectors();\n\tconst { \n\t\tstate: {\n\t\t\tisCreating,\n\t\t\tisEditing,\n\t\t\tselectedView: dashboard,\n\t\t},\n\t\tdispatch: manageViewsDispatch\n\t} = useContext(ManageViewsStateContext);\n\n\t\n\tconst [isDeleteDashboardModalOpen, setDeleteDashboardModalOpen] = useState(false);\n\n\tconst openDeleteModal = () => { \n\t\tsetDeleteDashboardModalOpen(true);\n\t}\n\n\tconst closeDeleteModal = () => { \n\t\tsetDeleteDashboardModalOpen(false); \n\t}\n\n\t// Delete the view\n\tconst handleDelete = useCallback(() => {\n\t\tif(!dashboard?.metaData?.id) return;\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(null));\n\t\tsavedStatesDispatch(\n\t\t\tSavedStatesActionCreator.deleteView('dashboards', dashboard.metaData.id)\n\t\t);\n\t\tcloseDeleteModal(); \n\t}, [dashboard, savedStatesDispatch, manageViewsDispatch]);\n\n\tconst getNewDashboard = () => ({\n\t\tcards: [], \n\t\tlayout: {\n\t\t\tlayoutStyle: {\n\t\t\t\tkey: LAYOUT_OPTIONS.ONE.key,\n\t\t\t\tcardCount: 1\n\t\t\t}\n\t\t},\n\t\tmetaData: {\n\t\t\tid: uuid(),\n\t\t\tname: 'New Dashboard',\n\t\t\ttype: 'dashboard'\n\t\t}\n\t});\n\n\tconst handleEdit = () => {\n\t\tmanageViewsDispatch(ManageViewsActionCreator.startEditing());\n\t\tconst layoutKey = dashboard?.layout?.layoutStyle?.key || null;\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setLayout(cardCountToLayout(layoutKey, dashboard?.cards.length)));\n\t}\n\n\tconst style = useMemo(() => dashboard?.layout?.layoutStyle ? LAYOUT_OPTIONS[dashboard?.layout.layoutStyle.key].styles : {}, [dashboard]);\n\n\treturn (\n\t\t\n\t\t\t{isEditing ? (\n\t\t\t\t {\n\t\t\t\t\t\tmanageViewsDispatch(ManageViewsActionCreator.stopEditing());\n\t\t\t\t\t}}\n\t\t\t\t\tisCreating={isCreating}\n\t\t\t\t\ttoggleFavorite={toggleFavorite}\n\t\t\t\t/>\n\t\t\t) : isCreating ? (\n\t\t\t\t {\n\t\t\t\t\t\tmanageViewsDispatch(ManageViewsActionCreator.stopCreating());\n\t\t\t\t\t}}\n\t\t\t\t\tisCreating={isCreating}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{isDeleteDashboardModalOpen &&\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t

Are you sure you want to delete this dashboard? It cannot be undone.

\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ticon={}\n\t\t\t\t\t\t\tonClose={closeDeleteModal} \n\t\t\t\t\t\t\tfooter = {\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t{dashboard.cards && dashboard.cards.length === 0 ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n}\n\nconst styles = { \n\tDialog: css`\n\t.bp3-button{ \n\t\tmargin-left: 5px; \n\t}\n\n\t.bp3-dialog-footer{ \n\t\ttext-align: right; \n\t}\n\n\tbackground: white; \n`,\t\n}\n\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\nimport { Fragment, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { Header } from 'views/savedViews/header';\nimport { Button, Classes, Divider, Icon } from '@blueprintjs/core';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Dialog } from 'components/dialogs';\nimport { SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { transformExplorerViewToDashboard } from 'hooks/savedViews/helpers';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\nimport { WorkspaceContext } from '/views/workspace/workspaceContext';\nimport { useHistory } from 'react-router-dom';\nimport { ManageViewsActionCreator, ManageViewsStateContext } from './useManageViewsState';\nimport { MetaDataSideBar } from 'views/savedViews/metaDataSideBar';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\nimport { useDefaultColors } from 'utilities/setUpColorScale';\nimport { Workspace } from 'views/workspace';\nimport { MiniExplorer } from 'views/savedViews/miniExplorer';\nimport { Filters } from 'views/filters';\nimport { AddDescriptionDialog } from 'views/savedViews/dialogs/addDescriptionDialog';\n\nexport function SavedExplorer({ toggleFavorite, updateUrlPathCallback = undefined }) {\n\tconst { state: { explorer: { layout }}, dispatch } = useContext(WorkspaceContext);\n\tconst { dispatch: savedStatesDispatch } = useSavedStateSelectors();\n\tconst { \n\t\tstate: { \n\t\t\tselectedView: explorer,\n\t\t\tisEditing\n\t\t}, \n\t\tdispatch: manageViewsStateDispatch \n\t} = useContext(ManageViewsStateContext);\n\tconst history = useHistory();\n\tconst [name, setName] = useState(explorer.metaData.name);\n\tconst [description, setDescription] = useState(explorer.metaData?.description || '');\n\tconst [isMetaDataOpen, setIsMetaDataOpen] = useState(true);\n\n\tconst [isDeleteExplorerModalOpen, setDeleteExplorerModalOpen] = useState(false);\n\tconst [isAddTitleModalOpen, setAddTitleModalOpen] = useState(false);\n\tconst [isAddDescriptionModalOpen, setIsAddDescriptionModalOpen] = useState(false);\n\n\tconst appSpecificColors = useContext(ColorScalesContext);\n\tconst getColorScale = useDefaultColors(appSpecificColors);\n\n\tconst openSaveTitleWarning = () => { \n\t\tsetAddTitleModalOpen(true);\n\t}\n\n\tconst closeSaveTitleWarning = () => { \n\t\tsetAddTitleModalOpen(false); \n\t}\n\n\tconst openDeleteModal = () => { \n\t\tsetDeleteExplorerModalOpen(true);\n\t}\n\n\tconst closeDeleteModal = () => { \n\t\tsetDeleteExplorerModalOpen(false); \n\t}\n\t\n\tconst toggleDescriptionModal = () => setIsAddDescriptionModalOpen(state => !state);\n\t\n\t// Covert the saved explorer object into a dashboard object\n\tconst transformedConfiguration = useMemo(() => {\n\t\tif (explorer) {\n\t\t\treturn transformExplorerViewToDashboard(explorer);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}, [explorer]);\n\n\t// Open view in explorer\n\tconst loadExplorer = useCallback(() => {\n\t\tdispatch(WorkspaceActionCreator.loadSavedView('explorer', explorer));\n\t\tconst path = updateUrlPathCallback\n\t\t\t? updateUrlPathCallback(explorer)\n\t\t\t: '/explorer';\n\n\t\thistory.push(path);\n\t}, [dispatch, explorer, updateUrlPathCallback, history]);\n\n\tconst handleDelete = useCallback(() => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.setSelectedView(null));\n\t\tsavedStatesDispatch(\n\t\t\tSavedStatesActionCreator.deleteView('explorers', explorer.metaData.id)\n\t\t);\n\t\tcloseDeleteModal(); \n\t}, [explorer.metaData.id, savedStatesDispatch, manageViewsStateDispatch]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.stopEditing());\n\t\tsetName(explorer?.metaData?.name);\n\t\tsetDescription(explorer?.metaData?.description);\n\t}, [manageViewsStateDispatch, setName, explorer]);\n\n\tconst handleSave = useCallback(() => {\n\t\t//TODO: have a warning message here.\n\t\tif (name === ''){ \n\t\t\topenSaveTitleWarning();\n\t\t\treturn;\n\t\t}\n\n\t\tconst updatedView = {\n\t\t\t...explorer,\n\t\t\tmetaData: {\n\t\t\t\t...explorer.metaData,\n\t\t\t\tname: name,\n\t\t\t\tdescription: description\n\t\t\t}\n\t\t}\n\n\t\tsavedStatesDispatch(SavedStatesActionCreator.updateView(updatedView));\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.stopEditing());\n\t}, [name, explorer, description, savedStatesDispatch, manageViewsStateDispatch]);\n\n\tconst handleEdit = () => {\n\t\tmanageViewsStateDispatch(ManageViewsActionCreator.startEditing());\n\t}\n\n\tconst handleAddDescription = (newDescription) => {\n\t\tsetDescription(newDescription);\n\t\ttoggleDescriptionModal();\n\t};\n\n\tuseEffect(() => {\n\t\tdispatch(WorkspaceActionCreator.loadSavedView('explorer', explorer));\n\t}, [dispatch, explorer]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t{isDeleteExplorerModalOpen &&\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Are you sure you want to delete this view? It cannot be undone.

\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t}\n\t\t\t\t\t\ticon={}\n\t\t\t\t\t\tonClose={closeDeleteModal} \n\t\t\t\t\t\tfooter = {\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t{isAddTitleModalOpen && \n\t\t\t\t\t\n\t\t\t\t\t\t\t\t

Before we can save your view, add a title.

\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t}\n\t\t\t\t\t\ticon={}\n\t\t\t\t\t\tonClose={closeSaveTitleWarning} \n\t\t\t\t\t\tfooter = {\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t{isAddDescriptionModalOpen &&\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\t{transformedConfiguration && (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t)}\n\t\t\t\n\t\t\n\t);\n}\n\nconst metaDataCss = css`\n\tmargin-top: 20px;\n\tmargin-bottom: 20px;\n`;\n\nconst collapseButton = css`\n\tmargin-top: 20px;\n\tmargin-bottom: 20px;\n\tmin-width: 0;\n`;\n\nconst viewWrapper = css`\n\toverflow: hidden;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: stretch;\n\tpadding: 10px;\n\tbox-shadow: rgb(0 0 0 / 10%) 0 12px 48px 0;\n`;\n\nconst DashboardCardWrapper = css`\n flex: 1 1 auto;\n display: grid;\n grid-template-columns: repeat(1, 1fr);\n grid-template-rows: repeat(1, 1fr);\n grid-column-gap: 20px;\n grid-row-gap: 20px;\n overflow: hidden;\n padding: 20px;\n`;\n\nconst styles = { \n\tDialog: css`\n\t.bp3-button{ \n\t\tmargin-left: 5px; \n\t}\n\n\t.bp3-dialog-footer{ \n\t\ttext-align: right; \n\t}\n\n\tbackground: white; \n`,\t\n}\n\nconst explorerStyle = css`\n\tdisplay: flex;\n\toverflow: hidden;\n`;\n\nconst cards = css`\n\tdisplay: flex;\n\talign-items: center;\n`;\n\nconst tightCard = css`\n\t${cards};\n\tpadding: 0;\n\toverflow: hidden;\n`;\n\nconst headerCardStyle = css`\n\tvisibility: hidden;\n\theight: 0px;\n\twidth: 0px;\n`;\n\nconst layoutStyle = css`\n\t${tightCard};\n\tflex: 1 1 auto;\n`;","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { Button, H6, Icon, InputGroup, Menu, MenuItem, Popover, NonIdealState, Position, Tree } from '@blueprintjs/core';\nimport { IconNames } from \"@blueprintjs/icons\";\nimport { Icon as SlykitIcon } from 'components/icon';\nimport { useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { LAYOUT_OPTIONS } from '/views/explorer/layoutOptions';\nimport { ObjectDropdown } from 'components/dropdowns/objectDropdown';\nimport { SavedViewTypes } from 'hooks/savedViews/types';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { WIDGETS } from 'widgets';\n\nimport { ManageViewsActionCreator, ManageViewsStateContext } from 'views/savedViews/useManageViewsState';\n\nconst layouts = Object.values(LAYOUT_OPTIONS);\n\n// returns the views that should be displayed in the tree component\nconst getViews = (dashboards, explorers, widgets, activeItemId) => [\n\t...dashboards.map((dashboard) => {\n\t\tconst { metaData: { name, id, isFavorite } } = dashboard;\n\t\treturn {\n\t\t\ticon: IconNames.DASHBOARD,\n\t\t\tid,\n\t\t\tisFavorite,\n\t\t\tisSelected: id === activeItemId,\n\t\t\tlabel: name ?? id,\n\t\t\tname: name,\n\t\t\tsecondaryLabel: isFavorite && ,\n\t\t\ttype: SavedViewTypes.Dashboard,\n\t\t}\n\t}),\n\t...explorers.map((explorer) => {\n\t\tconst { metaData: { name, id, isFavorite } } = explorer;\n\t\treturn {\n\t\t\ticon: IconNames.GEOSEARCH,\n\t\t\tid,\n\t\t\tisFavorite,\n\t\t\tisSelected: id === activeItemId,\n\t\t\tlabel: name ?? id,\n\t\t\tname: name,\n\t\t\tsecondaryLabel: isFavorite && ,\n\t\t\ttype: SavedViewTypes.Explorer,\n\t\t}\n\t}),\n\t...widgets.map((widget) => {\n\t\tconst { type, metaData: { name, id, isFavorite }} = widget;\n\t\treturn {\n\t\t\ticon:
,\n\t\t\tid,\n\t\t\tisFavorite,\n\t\t\tisSelected: id === activeItemId,\n\t\t\tlabel: (\n\t\t\t\t\n\t\t\t\t\t\te.dataTransfer.setData('view', JSON.stringify(widget))\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{name ?? id}\n\t\t\t\t\n\t\t\t),\n\t\t\tname: name,\n\t\t\tsecondaryLabel: isFavorite && ,\n\t\t\ttype: SavedViewTypes.Widget,\n\t\t};\n\t}),\n];\n\nexport const ManageViewsPanel = ({ openPanel }) => {\n\tconst {\n\t\texplorers,\n\t\twidgets,\n\t\tdashboards,\n\t} = useSavedStateSelectors();\n\tconst {\n\t\tstate: {\n\t\t\tisEditing,\n\t\t\tselectedView\n\t\t},\n\t\tdispatch: manageViewsDispatch\n\t} = useContext(ManageViewsStateContext);\n\n\tconst views = useMemo(() => getViews(dashboards, explorers, widgets, selectedView?.metaData?.id), [dashboards, explorers, widgets, selectedView]);\n\tconst [viewFilter, setViewFilter] = useState(VIEW_FILTERS[0]);\n\tconst [viewSort, setViewSort] = useState(SORT_VIEWS_BY[0]);\n\tconst [sortedViews, setSortedViews] = useState(views);\n\tconst [searchFilter, setSearchFilter] = useState('');\n\tconst styles = panelStyles;\n\t\n\t// organize views based on filters and sort options\n\tuseEffect(() => {\n\t\tlet sortViews = [...views];\n\t\t// filter with search bar\n\t\tsortViews = sortViews.filter(x => x.name.toLowerCase().includes(searchFilter.toLowerCase()));\n\t\t// filter by view type\n\t\tif (viewFilter.name !== 'all') {\n\t\t\tsortViews = sortViews.filter(x => x.type === viewFilter.name);\n\t\t}\n\t\t// sort options\n\t\tif (viewSort === 'Alphabetical') {\n\t\t\tsortViews.sort((a, b) => {\n\t\t\t\tif (a.name.toLowerCase() < b.name.toLowerCase()) return -1;\n\t\t\t\telse if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\t\telse if (viewSort === 'Favorite') {\n\t\t\tsortViews.sort((a, b) => {\n\t\t\t\tif (a.isFavorite && !b.isFavorite) return -1;\n\t\t\t\tif (!a.isFavorite && b.isFavorite) return 1;\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\t\tsetSortedViews(sortViews);\n\t}, [views, viewFilter, viewSort, searchFilter]);\n\t\n\tconst openNewPanel = useCallback((viewType, component) => {\n\t\topenPanel({\n\t\t\tcomponent: component,\n\t\t\tprops: { viewType },\n\t\t\ttitle: viewType,\n\t\t});\n\t}, [openPanel]);\n\t\n\tconst panelToRender = useCallback((viewType) => {\n\t\tswitch (viewType) {\n\t\t\tcase SavedViewTypes.Dashboard:\n\t\t\t\treturn EditDashboardPanel;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (isEditing) {\n\t\t\tconst viewType = selectedView.metaData.type;\n\t\t\t// manageViewsDispatch(ManageViewsActionCreator.setLayout(layouts[0]));\n\t\t\t// manageViewsDispatch(ManageViewsActionCreator.setRenderComponent(viewType));\n\t\t\tconst component = panelToRender(viewType);\n\t\t\tcomponent && openNewPanel(viewType, component);\n\t\t}\n\t}, [isEditing, selectedView, manageViewsDispatch, openNewPanel, panelToRender]);\n\n\tconst handleNodeSelected = (selectedView) => {\n\t\tif (isEditing) return;\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setRenderComponent(selectedView.type));\n\t\tsetActiveItemId(selectedView);\n\t\tsetSortedViews(views => {\n\t\t\tconst updatedViews = [...views];\n\t\t\tupdatedViews.forEach(view => {\n\t\t\t\tif (view.id === selectedView.id) {\n\t\t\t\t\tview.isSelected = true;\n\t\t\t\t}\n\t\t\t\telse { view.isSelected = false; }\n\t\t\t})\n\t\t\treturn updatedViews;\n\t\t});\n\t}\n\n\t// this handles which side panel component will get rendered\n\tconst handleCreateView = (viewType) => {\n\t\tmanageViewsDispatch(ManageViewsActionCreator.startCreating());\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setLayout(layouts[0]));\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setRenderComponent(viewType));\n\t\t// deselect any views previously selected\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(null))\n\t\tconst component = panelToRender(viewType);\n\t\topenNewPanel(viewType, component);\n\t}\n\n\n\tconst setActiveItemId = useCallback((item) => {\n\t\tconst view = [\n\t\t\t...dashboards,\n\t\t\t...explorers,\n\t\t\t...widgets\n\t\t].filter(x => x.metaData.id === item.id)[0] || null;\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(view));\n\t}, [manageViewsDispatch, dashboards, explorers, widgets]);\n\n\t// TODO: Add onClick events for Story and Report.\n\t// TODO: Add Story and Report to SavedViewTypes\n\tconst CreateButtonDropdownContent = ({ onClick }) => {\n\t\treturn (\n\t\t\t\n\t\t\t\t onClick(SavedViewTypes.Dashboard)}/>\n\t\t\t\t{/* Commented out because they don't have designs yet */}\n\t\t\t\t{/* \n\t\t\t\t */}\n\t\t\t\n\t\t)\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tManage Views\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\tEdit, delete, and search your saved views.\n\t\t\t\t\t
\n\t\t\t\t\t
Create new dashboards and stories.
\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t} \n\t\t\t\t\tposition={Position.BOTTOM_LEFT} \n\t\t\t\t\tboundary={'viewport'}\n\t\t\t\t\tdisabled={isEditing}>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t setSearchFilter(e.target.value)}\n\t\t\t/>\n\t\t\t
\n\t\t\t\t{/* Filter By View */}\n\t\t\t\t filter.label}\n\t\t\t\t\tonSelectionChanged={setViewFilter}/>\n\t\t\t\t{/* Filter By Time */}\n\t\t\t\t filter}\n\t\t\t\t\tonSelectionChanged={setViewSort}/>\n\t\t\t
\n\t\t\t\n\t\t
\n\t)\n}\n\nconst EditDashboardPanel = ({ closePanel }) => {\n\tconst {\n\t\twidgets,\n\t} = useSavedStateSelectors();\n\tconst { \n\t\tstate: {\n\t\t\tisCreating,\n\t\t\tisEditing,\n\t\t\tselectedView,\n\t\t\tlayout\n\t\t},\n\t\tdispatch: manageViewsDispatch\n\t} = useContext(ManageViewsStateContext);\n\n\tconst views = useMemo(() => getViews([], [], widgets, selectedView?.metaData?.id), [widgets, selectedView]);\n\tconst [viewSort, setViewSort] = useState(SORT_VIEWS_BY[0]);\n\tconst [sortedViews, setSortedViews] = useState(views);\n\tconst [searchFilter, setSearchFilter] = useState('');\n\tconst styles = panelStyles;\n\n\t// organize views based on filters and sort options\n\tuseEffect(() => {\n\t\tlet sortViews = [...views];\n\t\t// filter with search bar\n\t\tsortViews = sortViews.filter(x => x.name.toLowerCase().includes(searchFilter.toLowerCase()));\n\t\t// sort options\n\t\tif (viewSort === 'Alphabetical') {\n\t\t\tsortViews.sort((a, b) => {\n\t\t\t\tif (a.name.toLowerCase() < b.name.toLowerCase()) return -1;\n\t\t\t\telse if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\t\telse if (viewSort === 'Favorite') {\n\t\t\tsortViews.sort((a, b) => {\n\t\t\t\tif (a.isFavorite && !b.isFavorite) return -1;\n\t\t\t\tif (!a.isFavorite && b.isFavorite) return 1;\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\t\tsetSortedViews(sortViews);\n\t}, [views, viewSort, searchFilter]);\n\n\tuseEffect(() => {\n\t\t!isCreating && !isEditing && closePanel();\n\t}, [isCreating, isEditing, closePanel]);\n\n\t// return to manage views page\n\tconst handleBack = useCallback(() => {\n\t\tmanageViewsDispatch(ManageViewsActionCreator.stopCreating());\n\t\tmanageViewsDispatch(ManageViewsActionCreator.stopEditing());\n\t\tif (selectedView !== null) {\n\t\t\tmanageViewsDispatch(ManageViewsActionCreator.setRenderComponent(selectedView.metaData.type));\n\t\t} \n\t\tclosePanel();\n\t}, [manageViewsDispatch, closePanel, selectedView]);\n\n\tconst handleLayoutChange = useCallback((changedLayout) => {\n\t\t// TODO: Delete views that aren't visible with the selected layout\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setLayout(changedLayout));\n\t}, [manageViewsDispatch]);\n\n\treturn (\n\t\t
\n\t\t
\n\t\t\t
\n\t\t layout?.label}\n\t\t\tonSelectionChanged={handleLayoutChange}\n\t\t/>\n\t\t
Saved Widgets
\n\t\t setSearchFilter(e.target.value)}\n\t\t/>\n\t\t
\n\t\t\t{/* Filter By Time */}\n\t\t\t filter}\n\t\t\t\tonSelectionChanged={setViewSort}/>\n\t\t
\n\t\t\n\t\t{!views.length > 0 && (\n\t\t\t
0 ? 'auto' : '100%',\n\t\t\t\tmarginTop: views.length > 0 ? '50px' : 0\n\t\t\t\t}}>\n\t\t\t\t\n\t\t\t
\n\t\t)}\n\t\t
\n\t)\n}\n\nconst VIEW_FILTERS = [\n\t{\n\t\tname: 'all',\n\t\tlabel: 'All'\n\t},\n\t{\n\t\tname: 'dashboard',\n\t\tlabel: 'Dashboard'\n\t},\n\t{\n\t\tname: 'explorer',\n\t\tlabel: 'Explorer'\n\t},\n\t// Commented out until you can create a story or a report\n\t// {\n\t// \tname: 'story',\n\t// \tlabel: 'Story'\n\t// },\n\t// {\n\t// \tname: 'report',\n\t// \tlabel: 'Report'\n\t// },\n\t{\n\t\tname: 'widget',\n\t\tlabel: 'Widget'\n\t},\n];\n\nconst SORT_VIEWS_BY = [\n\t'Most Recent',\n\t'Alphabetical',\n\t'Favorite'\n];\n\nconst panelStyles = {\n\tcontainer: css`\n\t\tborder-radius: 3px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\toverflow: hidden;\n\t`,\n\theader: css`\n\t\tpadding: 20px 0 10px;\n\t\tbackground-color: rgb(235,241,245);\n\t\tdisplay: flex;\n\t`,\n\tsettingsIcon: css`\n\t\tcolor: #5c7080;\n\t\tmargin-left: 20px;\n\t\tmargin-right: 10px;\n\t`,\n\theaderButton: css`\n\t\theight: min-content;\n\t\tmargin-top: -5px;\n\t`,\n\theaderText: css`\n\t\tmargin: 0 0 5px;\n\t`,\n\ttext: css`\n\t\tfont-size: 12px;\n\t`,\n\tbuttonRow: css`\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\tjustify-content: flex-end;\n\t`,\n\tbutton: css`\n\t\tcolor: #006699 !important;\n\t\t.bp3-icon:first-of-type {\n\t\t\tcolor: #006699 !important;\n\t\t}\n\t`,\n\tsearch: css`\n\t\tmargin-left: 10px;\n\t\tmargin-right: 10px;\n\t`,\n\tsavedWidgetText: css`\n\t\tmargin-left: 10px;\n\t\tpadding-top: 10px;\n\t`,\n\ttree: css`\n\t\toverflow: auto;\n\t\t.bp3-tree-node-selected > .bp3-tree-node-content {\n\t\t\tbackground-color: rgb(235,241,245);\n\t\t\tcolor: rgb(19,124,189);\n\t\t\t.bp3-tree-node-icon {\n\t\t\t\tcolor: rgb(19,124,189);\n\t\t\t}\n\t\t\t.bp3-tree-node-secondary-label > .bp3-icon {\n\t\t\t\tcolor: rgb(92,112,128);\n\t\t\t}\n\t\t\t.custom-icon svg{\n\t\t\t\tcolor: rgb(19,124,189);\n\t\t\t}\n\t\t}\n\t`,\n}","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { Card, NonIdealState, PanelStack } from '@blueprintjs/core';\nimport { Fragment, useCallback, useMemo } from 'react';\nimport { SavedStatesActionCreator } from 'hooks/savedViews/actions';\nimport { SavedViewTypes } from 'hooks/savedViews/types';\nimport { useSavedStateSelectors } from 'hooks/savedViews/hooks';\nimport { RenderWidget } from 'views/savedViews/renderWidget';\nimport { RenderDashboard } from 'views/savedViews/renderDashboard';\nimport { SavedExplorer } from 'views/savedViews/savedExplorer';\nimport {\n\tuseManageViewsState,\n\tManageViewsActionCreator,\n\tManageViewsStateContext,\n} from 'views/savedViews/useManageViewsState';\nimport { ManageViewsPanel } from 'views/savedViews/sidePanels';\n\n/**\n * Manages selecting and viewing a saved view\n * \n * @param updateUrlPathCallback function: (savedView) => string // optional function for allowing projects to load different url paths\n * Projects like CyHy have multiple explorers and opening the Saved widget will need to know which url path to navigate to.\n */\nexport function SavedViews({ updateUrlPathCallback }) {\n\tconst { dispatch: savedStatesDispatch } = useSavedStateSelectors();\n\tconst {\n\t\tstate: manageViewsState,\n\t\tstate: { selectedView, isEditing, isCreating, renderComponent },\n\t\tdispatch: manageViewsDispatch,\n\t} = useManageViewsState();\n\n\tconst manageViewContextValue = useMemo(() => {\n\t\treturn { state: manageViewsState, dispatch: manageViewsDispatch };\n\t}, [manageViewsState, manageViewsDispatch]);\n\n\tconst toggleFavorite = useCallback(() => {\n\t\tconst updatedView = {\n\t\t\t...selectedView,\n\t\t\tmetaData: {\n\t\t\t\t...selectedView.metaData,\n\t\t\t\tisFavorite: !selectedView.metaData.isFavorite,\n\t\t\t},\n\t\t};\n\t\t\n\t\tsavedStatesDispatch(SavedStatesActionCreator.updateView(updatedView));\n\t\tmanageViewsDispatch(ManageViewsActionCreator.setSelectedView(updatedView));\n\t}, [selectedView, savedStatesDispatch, manageViewsDispatch]);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{selectedView?.metaData?.id || isCreating || isEditing ? (\n\t\t\t\t\t\t\trenderComponent === SavedViewTypes.Explorer ? (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t) : renderComponent === SavedViewTypes.Widget ? (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t) : renderComponent === SavedViewTypes.Dashboard ? (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst container = css`\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tdisplay: grid;\n\tgrid-template-columns: 300px 1fr;\n\tgrid-template-rows: 1fr;\n\tgrid-gap: 6px;\n\tpadding: 6px;\n`;\n\nconst panelWrapper = css`\n\tpadding: 0;\n\t.bp3-panel-stack {\n\t\theight: 100%;\n\t\tborder-radius: 3px;\n\t}\n`;\n\nconst viewWrapper = css`\n\toverflow: hidden;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding: 10px;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { ResizeSensor } from '@blueprintjs/core';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useFetchEndpointData } from 'hooks/useFetchEndpointData';\nimport { WidgetContainer } from '/views/common/widgetContainer';\nimport { ErrorBoundary } from 'components/errorBoundary';\nimport { ColorScalesContext } from 'views/common/colorScalesContext';\nimport { useDefaultColors } from 'utilities/setUpColorScale';\n\n/**\n * A ScreenCard provides a generalized method for rendering a chart onto a\n * Screen. The Card is responsible for rendering a ChartContainer,\n * which in turn will instantiate and render the specific Chart.\n *\n * @param {string} widgetType\n * @param {object} endpointQuery\n * @param {object} widgetConfiguration\n * @param selectedDefinitionName\n * @param activeResult\n * @returns {*}\n * @constructor\n */\nexport const ScreenCard = ({\n\twidgetType,\n\tendpointQuery,\n\twidgetConfiguration,\n\tselectedDefinitionName,\n\tactiveResult,\n}) => {\n\t// Store dimensions of things\n\tconst [dimensions, setDimensions] = useState({ width: 300, height: 400 });\n\n\t// resize the widgets appropriately\n\tfunction onResize(entries) {\n\t\tconst entry = entries[0].contentRect;\n\t\tsetDimensions({ width: entry.width, height: entry.height });\n\t}\n\n\tconst appSpecificColors = useContext(ColorScalesContext);\n\tconst getColorScale = useDefaultColors(appSpecificColors);\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n};\n\nfunction ExplorerData({ dimensions, type, result, selectedDefinitionName, endpointQuery, widgetConfiguration }) {\n\t// fetch the filtered data\n\tconst { data, loading } = useFetchEndpointData(result, selectedDefinitionName, type, endpointQuery);\n\n\t// Choose when data refreshes\n\tconst [validData, setValidData] = useState(null);\n\n\tuseEffect(() => {\n\t\tif (data || result?.resultId === 0) {\n\t\t\tsetValidData(data);\n\t\t}\n\t}, [data, result]);\n\n\treturn (\n\t\t\n\t);\n}\n\nconst cardCss = css`\n\tflex: 1 1 auto;\n\tdisplay: flex;\n\tflex-flow: column;\n\toverflow: hidden;\n`;\n\nconst containerCss = css`\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tposition: relative;\n`;\n","/** @jsx jsx */\nimport { Colors } from '/styles/variables';\nimport { css, jsx } from '@emotion/react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { get } from 'srs-middleware';\nimport { Button, Card, Collapse, H5, Icon } from '@blueprintjs/core';\nimport { countBy, findIndex, groupBy } from 'lodash';\n\nexport interface SRSStatusProps {\n\tsortBy?(a : StatusGroup, b : StatusGroup): number;\n\tdilId: string;\n}\n\ninterface StatusItem {\n\ttitle: string;\n\tmessage?: string;\n\tstate: string;\n\tgroup?: string;\n}\n\ninterface StatusGroup {\n\tname: string;\n\titems: StatusItem[];\n\tstateCounts: Record;\n\tisUngroupedItem: boolean;\n}\n\nexport const SRSStatus : React.FunctionComponent = ({\n\tsortBy, dilId\n}) => {\n\tconst [statusGroups, setStatusGroups] = useState([]);\n\tconst [expandedGroups, setExpandedGroups] = useState([]);\n\n\tconst allGroupsExpanded = useMemo(\n\t\t() => expandedGroups.length === statusGroups.filter(g => !g.isUngroupedItem).length,\n\t\t[expandedGroups.length, statusGroups]\n\t);\n\n\tconst hasAnyExpandableGroups = useMemo(\n\t\t() => statusGroups.filter(g => !g.isUngroupedItem).length > 0,\n\t\t[statusGroups]\n\t);\n\t\n\tconst toggleOne = useCallback((groupName) => {\n\t\tsetExpandedGroups((expandState) => {\n\t\t\texpandState = expandState.slice(0);\n\t\t\tif (expandState.includes(groupName)) {\n\t\t\t\treturn expandState.filter((x) => x !== groupName);\n\t\t\t} else {\n\t\t\t\texpandState.push(groupName);\n\t\t\t\treturn expandState;\n\t\t\t}\n\t\t});\n\t}, [setExpandedGroups]);\n\n\tconst toggleAll = useCallback(() => {\n\t\tif (allGroupsExpanded) {\n\t\t\tsetExpandedGroups([]);\n\t\t} else {\n\t\t\tsetExpandedGroups(statusGroups.filter(g => !g.isUngroupedItem).map(g => g.name) || []);\n\t\t}\n\t}, [allGroupsExpanded, statusGroups])\n\n\tuseEffect(() => {\n\t\tget(`/SRS/Application/SlyKit/DataValidation/${dilId}`).then((response : StatusItem[]) => {\n\n\t\t\t// assign any items without a group to their own unique group\n\t\t\tresponse = response.map((o, i) => {\n\t\t\t\tif (!o.hasOwnProperty(\"group\"))\n\t\t\t\t\to.group = defaultGroupKey + i;\n\t\t\t\treturn o;\n\t\t\t});\n\n\t\t\t// group the validation results by group key, then count the number of results of each state in each group\n\t\t\tconst statusGroups : StatusGroup[] = Object.entries(\n\t\t\t\t\tgroupBy(response, o => o.group)\n\t\t\t\t)\n\t\t\t\t.map(group => ({\n\t\t\t\t\tname: group[0],\n\t\t\t\t\titems: group[1],\n\t\t\t\t\tisUngroupedItem: group[0].startsWith(defaultGroupKey),\n\t\t\t\t\tstateCounts: countBy(group[1], 'state')\n\t\t\t\t}))\n\t\t\t\t.sort(sortBy ??\n\t\t\t\t\t((a,b) => {\n\t\t\t\t\t\t// sort the groups according to their position in the original response\n\t\t\t\t\t\t// since sort order may have been lost during conversion to object in groupBy\n\t\t\t\t\t\treturn findIndex(response, o => o.group == a.name) - findIndex(response, o => o.group == b.name);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\tsetStatusGroups(statusGroups);\n\t\t})\n\t}, []);\n\n\treturn (\n\t\t
\n\t\t\t{hasAnyExpandableGroups &&\n\t\t\t\t\n\t\t\t}\n\t\t\t{statusGroups.map((group, i) =>\n\t\t\t\t
\n\t\t\t\t{\n\t\t\t\t\tgroup.isUngroupedItem ? (\n\t\t\t\t\t\t\n\t\t\t\t\t) : (\n\t\t\t\t\t\t toggleOne(group.name)}\n\t\t\t\t\t\t\tisOpen={expandedGroups.includes(group.name)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t)\n}\n\nconst StatusGroup = ({name, items, stateCounts, onClick, isOpen}) => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t
{name}
\n\t\t\t\t
\n\t\t\t\t\t{['Pass','Fail','Warn'].map((state, i) => {\n\t\t\t\t\t\tif (stateCounts[state]) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t{stateCounts[state]}\n\t\t\t\t\t\t\t\t\t css`color: ${statusStyleMap[state].iconColor}`} icon={statusStyleMap[state].iconName}/>\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t})}\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\t{items.map((item, j) =>\n\t\t\t\t\t\n\t\t\t\t)}\n\t\t\t\n\t\t
\n\t)\n}\n\nconst StatusItem = ({title, message, state}) => {\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t

{title}

\n\t\t\t\t{message &&

{message}

}\n\t\t\t
\n\t\t\t css`color: ${statusStyleMap[state].iconColor}`} icon={statusStyleMap[state].iconName}/>\n\t\t
\n\t)\n}\n\nconst defaultGroupKey = '__default__';\n// TODO: replace the hardcoded colors with refs to predefined colors\n// once the predefined colors have better background colors\nconst statusStyleMap = {\n\t'Pass': {\n\t\ticonName: 'tick-circle',\n\t\ticonColor: Colors.FOREST2,\n\t\tbackground: Colors.LIGHT_GRAY5\n\t},\n\t'Fail': {\n\t\ticonName: 'error',\n\t\ticonColor: Colors.RED3,\n\t\tbackground: 'rgb(255,240,240)'\n\t},\n\t'Warn': {\n\t\ticonName: 'warning-sign',\n\t\ticonColor: Colors.GOLD4,\n background: 'rgb(255,251,229)'\n\t}\n};\n\nconst wrapper = css`\n\tflex: 1 1;\n\theight: 100%;\n\tpadding: 8px;\n\tbackground-color: whitesmoke;\n\toverflow: auto;\n`;\n\nconst groupWrapper = css`\n\tmargin-bottom: 10px;\n`\n\nconst card = css`\n\tborder-radius: 0;\n\tpadding: 16px;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tborder: 4px solid transparent;\n\n\tp, h5 {\n\t\tpadding: 0 20px 0 0;\n\t\tmargin: 0;\n\t}\n`;\n\nconst iconList = css`\n\tdisplay: flex;\n\tflex-direction: row;\n\n\tdiv {\n\t\tmargin-left: 8px;\n\t\twhite-space: nowrap;\n\t}\n\n\t& span {\n\t\tmargin-left: 4px;\n\t}\n`;","/** @jsx jsx */\nimport {css, jsx} from '@emotion/react';\nimport React, {useEffect} from 'react'; \nimport { Dropdown } from '../../../components/dropdowns/dropdown';\n\nexport const ProgressBar = (({step: currentStep}) => {\n\tconst steps = [ {'index': 0, 'step': \"Upload File\", 'active': false}, \n\t\t\t\t\t{'index': 1, 'step': \"View/Edit Schema\", 'active': false}, \n\t\t\t\t\t{'index': 2, 'step': \"Done\", 'active': false} ]\n\n\tconst index: number = steps.findIndex(step => step['index'] === currentStep)\n\tif (index > -1) {\n\t\tfor (let i = 0; i < steps.length; i++) {\n\t\t\tif (i <= index) {\n\t\t\t\tsteps[i].active = true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
    \n\t\t\t\t{steps.map(({step, active}) => (\n\t\t\t\t\t
  • {step}
  • \n\t\t\t\t))}\n\t\t\t
\n\t\t
\n\t); \n});\n\n// Reference: https://codepen.io/brendansparrow/pen/QjRmKv\nconst progressBarCSS = css`\n\tcounter-reset: step;\n\toverflow: hidden;\n\tdisplay: flex;\n\twidth: 1000px; \n\tpadding:0; \n\tposition: relative; \n\tmargin: 0 auto;\n text-align: center; \n padding-top: 25px;\n height: 100px; \n`; \n\nconst progressBarElementCSS = css`\n\t\n\tlist-style-type: none;\n\tcolor: #A7B6C2;\n\tfont-size: 14px;\n\twidth: 100%;\t\n\n\t&:before {\n\t\tcontent: counter(step);\n\t\tcounter-increment: step;\n\t\twidth: 30px;\n\t\tdisplay: block;\n\t\tfont-size:14px;\n\t\tcolor: white;\n\t\tbackground: #A7B6C2;\n\t\tborder-radius: 30px;\n\t\tline-height: 30px; \n\t\tmargin: 0 auto 5px auto;\n\t}\n\n\t&:after {\n\t\ttop: 50%;\n\t\twidth: 216px;\n\t\theight: 2px; \n\t\tbackground: #A7B6C2; \n\t\tcontent: '';\n\t\tposition: absolute; \n\t\tborder-radius: 1px;\n\t}\n\n\t&:last-child:after {\n\t\tcontent:none; \n\t}\n\n\t&.active {\n\t\tcolor: #5C7080;\n\t\tfont-weight: bold; \n\t}\n\n\t&.active::before {\n\t\tbackground: #2B95D6;\n\t}\n\n\t&.active:after {\n\t\tbackground: #2B95D6;\n\t}\n`;","/** @jsx jsx */\nimport {css, jsx} from '@emotion/react';\nimport React, { useRef, useState, createRef, SetStateAction} from 'react'; \n\nimport { Button, Icon, Position, Toaster, Intent, ProgressBar, Overlay, Classes, Spinner} from '@blueprintjs/core'; \nimport { uploadFile, isFileValid, convertToMB } from '../utils';\nimport classNames from \"classnames\";\nimport { ProgressBar as FormProgressBar} from './ProgressBar.js'; \n\nimport { DefinitionProps, ColorProps, UploadConstraintProps } from \"../interfaces\"; \n\n// References: https://blog.logrocket.com/create-a-drag-and-drop-component-with-react-dropzone/ \nexport const Upload: React.FC = ({ \n uploadConstraints,\n colors,\n setDil,\n setStep\n }) => {\n\n const [ fileUploaded, setFileUploaded ] = useState(null); \n const [ uploading, setUploading ] = useState(false) \n const uploadButton = useRef(null); \n\n const showToast = (errorMessage) => {\n AppToaster.show({\n icon: \"warning-sign\",\n message: errorMessage, \n intent: Intent.DANGER\n });\n }\n\n const handleUpload = (userSelectedFile: File[]) => {\n const [_, errorMessage] = isFileValid(userSelectedFile[0], uploadConstraints);\n !errorMessage ? setFileUploaded(userSelectedFile[0]) : showToast(errorMessage);\n };\n\n const removeFile = () => {\n setFileUploaded(null);\n }\n\n const handleUploadButton = async () => {\n try {\n setUploading(true); \n setDil((await uploadFile(fileUploaded) as DefinitionProps))\n setStep(\"View/Edit Schema\")\n return\n } catch (err) {\n showToast('Server Error: ' + err.message); \n setUploading(false); \n }\n }\n\n return (\n
\n \n
\n
e.preventDefault()}\n onDragEnter={(e) => e.preventDefault()} \n onDragLeave={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n handleUpload(Array.from(e.dataTransfer.files)); \n }}\n >\n
\n \n

Drag and Drop Your File(s) Here

\n

or

\n {\n e.preventDefault(); \n handleUpload(Array.from(e.target.files)); \n }}/>\n \n
\n

\n Max File Size: {uploadConstraints.maxFileSize_mb }MB    \n Max File Amount: { uploadConstraints.maxNumberOfFiles }    \n File Type(s): { uploadConstraints.fileExtensionsAllowed.join(', ') }    \n Header Row Required: { uploadConstraints.headerRowRequired }\n

\n { fileUploaded && fileUploaded.name && fileUploaded.size &&\n
\n \n \n \n \n \n \n \n
\n   \n {fileUploaded.name}\n \n {convertToMB(fileUploaded, true)} MB\n
{\n e.preventDefault(); \n if (!uploading)\n removeFile()\n }}>\n \n
\n
\n
\n \n
\n }\n
\n
\n { uploading && }\n
\n
\n );\n}\n\n \ninterface UploadProps {\n uploadConstraints: UploadConstraintProps,\n colors: ColorProps,\n setDil: React.Dispatch>,\n setStep: React.Dispatch>\n} \n\nconst classes = classNames(\n Classes.CARD,\n Classes.ELEVATION_4,\n \"docs-overlay-example-transition\",\n \"docs-overlay-example-tall\",\n);\n\n/** Singleton toaster instance. Create separate instances for different options. */\nconst AppToaster = Toaster.create({\n className: \"recipe-toaster\",\n position: Position.TOP\n});\n\n\nconst progressBarCSS = css`\n width: 75%; \n height: 127px; \n padding-top: 40px;\n padding: 50px; \n top: 200px;\n left: 100px; \n`;\n\nconst uploadContainerCSS = css`\n width: 80%;\n text-align: center;\n align-items: center;\n padding-top: 25px;\n margin: auto;\n width: 80%; \n`;\n\nconst fileUploadContainerCSS = css`\n display: inline-block;\n align-items: center;\n justify-content: center;\n margin: 0;\n width: 100%;\n height: 200px;\n border: 1px dashed grey;\n text-align: center; \n border: 1px dashed #5C7080;\n border-radius: 4px;\n`;\n\nconst constraintTextCSS = css`\n font-size: 14px;\n letter-spacing: 1px;\n text-align: center;\n line-height: 26px;\n maxWidth: 762px; \n`; \n\nconst fileTableCSS = css`\n background: #F2F2F2;\n border-radius: 3px;\n width: 100%;\n`;\n\nconst fileTableRowCSS = css`\n height: 36px;\n\n .left {\n float: left; \n padding: 10px; \n }\n\n .right {\n float: right; \n text-align: right;\n display: inline;\n padding: 10px;\n }\n`; ","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useState, SetStateAction } from 'react';\nimport {\n\tAlignment,\n\tButton,\n\tIcon,\n\tInputGroup,\n\tIntent,\n\tPopover,\n\tPosition,\n\tTooltip,\n\tSpinner,\n\tCheckbox,\n\tMenuItem,\n\tPopoverInteractionKind,\n\tFormGroup,\n\tSwitch\n} from '@blueprintjs/core';\nimport { Dropdown } from '../../components/dropdowns/dropdown';\nimport { pushUpdatedDefinition } from './utils';\nimport { MultiSelect } from '@blueprintjs/select';\n\nimport { ColorProps, PropertyListProps, DefinitionProps, PropertyProps } from './interfaces';\nimport { PropertyFlag, PropertyType } from 'srs-middleware';\nimport { DatasetManagementContext } from \"./datasetManagementContext\"\n\nexport const SchemaEditor: React.FC = ({\n\tdil,\n\tsetDil,\n\tcolors,\n\tonComplete,\n\tadditionalfooterContent: footerElements,\n}) => {\n\tconst [definitionPropertyList, setDefinitionPropertyList] = useState([]);\n\tconst [definitionName, setDefinitionName] = useState();\n\tconst [isShared, setIsShared] = useState(false);\n\tconst [loading, setLoading] = useState(false);\n\n\tconst {toaster, setNeedUpdate, setUnsavedChanges} = React.useContext(DatasetManagementContext);\n\n\tconst setInitValues = () => {\n\t\tif (!dil) {\n\t\t\tconsole.error('No definition available.')\n\t\t}\n\t\tconst initialPropList: PropertyProps[] = Object.keys(dil.propertyList).map((prop) => { \n\t\t\treturn dil.propertyList[prop] as PropertyProps;\n\t\t}).sort((a: PropertyProps, b: PropertyProps) => a['index'] - b['index']);\n\t\tsetDefinitionPropertyList(initialPropList);\n setDefinitionName(dil.name);\n setIsShared(dil.shared)\n\t}\n\n\tReact.useEffect(() => {\n\t\tsetInitValues(); \n\t}, [dil]);\n\n\tconst cancel = () => {\n\t\twindow.location.reload(false); \n\t}\n\n\tconst updateDIL = React.useCallback(async () => {\n\t\t// convert definitionPropertyList back to object\n\t\tlet updatedPropertyList: PropertyListProps = {};\n\t\tdefinitionPropertyList.forEach((property) => {\n\t\t\tif (property.include == false) return; \n\t\t\tif (property.flags.includes(PropertyFlag.Hierarchical) && property.delimiter === undefined) {\n\t\t\t\tproperty.delimiter = '/';\n\t\t\t}\n\t\t\tif (property.flags.includes(PropertyFlag.Multivalued) && property.multivaluedDelimiter === undefined) {\n\t\t\t\tproperty.multivaluedDelimiter = ',';\n\t\t\t}\n\t\t\tupdatedPropertyList[property.name] = { ...property };\t\n\t\t});\n\n\t\t// Checks to see if there has been an update from original definition\n\t\tif (updatedPropertyList !== dil.propertyList || definitionName !== dil.name || isShared !== dil.shared) {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\t\t\t\tconst definition: DefinitionProps = {\n\t\t\t\t\t...(dil as DefinitionProps),\n\t\t\t\t\tname: definitionName,\n\t\t\t\t\tpropertyList: { ...updatedPropertyList },\n\t\t\t\t\tshared: isShared,\n\t\t\t\t};\n\t\t\t\tawait pushUpdatedDefinition(definition);\n\t\t\t\tsetDil(definition);\n\t\t\t\tonComplete();\n setLoading(false);\n\t\t\t} catch (err) {\n toaster.show({\n icon: 'warning-sign',\n message: 'Server Error: ' + err.message,\n intent: Intent.DANGER,\n });\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t}\n\t\tsetNeedUpdate(true);\n\t\tsetUnsavedChanges(false); \n\t}, [definitionName, definitionPropertyList, dil, onComplete, setDil, toaster, isShared]);\n\n\t// criteria to make a property name valid, returns true if valid\n\tconst verifyPropertyName = React.useCallback(\n\t\t(name: string) =>\n\t\t\tdefinitionPropertyList.filter((property) => property.name === name).length === 1 && name.length > 1,\n\t\t[definitionPropertyList]\n\t);\n\n\tconst updateProperty = React.useCallback(\n\t\t(property_index: number, key: string, change: any) => {\n\t\t\tlet properties = definitionPropertyList;\n\t\t\tproperties.find((property) => property.index === property_index)[key] = change;\n\t\t\tsetDefinitionPropertyList([...properties]);\n\t\t\tsetUnsavedChanges(true); \n\t}, [definitionPropertyList]);\n\n\tconst updateSharing = (e) => { \n\t\tsetIsShared(!isShared); \n\t\tsetUnsavedChanges(true); \n\t}\n\n\tconst updateDilName = (e: React.FormEvent) => {\n\t\tsetDefinitionName(e.currentTarget.value);\n\t\tsetUnsavedChanges(true); \n\t}\n\n\tconst headers: HeaderProps[] = [\n\t\t{ width: '7%', name: 'Sample', infoDetails: 'Sample values extracted from the data.' },\n\t\t{ width: '7%', name: 'Include', infoDetails: 'Indicates if this property should be included in the schema.' },\n\t\t{ width: '15%', name: 'Property', infoDetails: 'Name for this property. Initialized with the column header.' },\n\t\t{\n\t\t\twidth: '10%',\n\t\t\tname: 'Type',\n\t\t\tinfoDetails:\n\t\t\t\t\"The property type that these values represent. These affect how the system interprets the values and what analytics can be performed. \\n Text types represent a block of unstructured text; for example, the body of text from a news story where String types represent a block of structured text that is valid only in its entirety; 'New York Times'\",\n\t\t},\n\t\t{\n\t\t\twidth: '30%',\n\t\t\tname: 'Flags',\n\t\t\tinfoDetails:\n\t\t\t\t'Flag modifiers provide additional information as to how each property can be used or how the values should be parsed.',\n\t\t},\n\t\t{\n\t\t\twidth: '10%',\n\t\t\tname: 'Hierarchical Delimiter',\n\t\t\tinfoDetails: 'For values that represent a hierarchical path, this is the delimiter used to describe the path.',\n\t\t},\n\t\t{\n\t\t\twidth: '10%',\n\t\t\tname: 'Multivalued Delimiter',\n\t\t\tinfoDetails:\n\t\t\t\t'For values that represent multiple values joined together, this is the delimiter used to join the values.',\n\t\t},\n\t];\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t
\n \n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{headers.map((header: HeaderProps) => (\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{definitionPropertyList.map((property: PropertyProps) => {\n\t\t\t\t\t\t\treturn \n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\t\t\t\t{header.name} {popup(header.infoDetails, 'info', colors.text)}\n\t\t\t\t\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\tDone\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tCancel\n\t\t\t\t\n\t\t\t
\n\t\t\t
{loading && }
\n\t\t
\n\t);\n};\n\n/**\n * One row in the schema editor\n */\nconst EditorRow: React.FC = ({ property, verifyPropertyName, updateProperty, textColor }) => {\n\tconst { index, flags, name, samples, type, include=true } = property;\n\tconst setName = (e) => updateProperty(index, 'name', e.target.value);\n\tconst setHierarchicalDelimeter = (e) => updateProperty(index, 'delimeter', e.target.value);\n\tconst setMultivaluedDelimeter = (e) => updateProperty(index, 'multiValuedDelimiter', e.target.value);\n\n\tconst addFlag = (flag) => {\n\t\tif (!flags.includes(flag)) {\n\t\t\tupdateProperty(index, 'flags', [...flags, flag]);\n\t\t}\n\t};\n\tconst removeFlag = (flag: string) =>\n\t\tupdateProperty(\n\t\t\tindex,\n\t\t\t'flags',\n\t\t\tflags.filter((selected_flag) => selected_flag !== flag)\n\t\t);\n\n\tconst setType = (type: string) => updateProperty(index, 'type', type);\n const setInclude = () => updateProperty(index, 'include', !include ? include !== undefined : false); \t\n\n\treturn (\n\t\t\n\t\t\t{popup(samples?.join('\\n\\n'), 'table', textColor)}\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{include ? (\n\t\t\t\t\t item}\n\t\t\t\t\t\titemRenderer={(item, { handleClick, modifiers, query }) => {\n\t\t\t\t\t\t\tif (modifiers.matchesPredicate) {\n\t\t\t\t\t\t\t\treturn ;\n\t\t\t\t\t\t\t} else return null;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tselectedItems={flags}\n\t\t\t\t\t\titems={Object.values(PropertyFlag)}\n\t\t\t\t\t\tnoResults={}\n\t\t\t\t\t\tonItemSelect={addFlag}\n\t\t\t\t\t\tonRemove={removeFlag}\n\t\t\t\t\t\tpopoverProps={{ minimal: true }}\n\t\t\t\t\t\tfill={true}\n\t\t\t\t\t\tresetOnSelect={true}\n\t\t\t\t\t\tplaceholder={'Select Flags'}\n\t\t\t\t\t\titemPredicate={(query, item, _index) => {\n\t\t\t\t\t\t\tquery = query.toLowerCase();\n\t\t\t\t\t\t\titem = item.toLowerCase();\n\t\t\t\t\t\t\treturn query === item || item.indexOf(query) >= 0;\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t''\n\t\t\t\t)}\n\t\t\t\n\t\t\t{flags.includes(PropertyFlag.Hierarchical) ? (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t\n\t\t\t)}\n\t\t\t{flags.includes(PropertyFlag.Multivalued) ? (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t\n\t\t\t)}\n\t\t\n\t);\n};\n\ninterface SchemaEditorProps {\n\tcolors: ColorProps;\n\tdil: DefinitionProps;\n\tsetDil: React.Dispatch>;\n\tonComplete: () => any;\n\tadditionalfooterContent?: React.ReactElement;\n}\n\ninterface HeaderProps {\n\twidth: string;\n\tname: string;\n\tinfoDetails: string;\n}\n\ninterface EditorRowProps {\n\tproperty: PropertyProps;\n\tverifyPropertyName: (name: string) => boolean;\n\tupdateProperty: (property_index: number, key: string, change: any) => void;\n\ttextColor: string;\n}\n\nconst editorContainerStyle = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 0 1 auto;\n height: 100%;\n\tmin-height: 0;\n`;\n\nconst tableContainerStyle = css`\n\toverflow: auto;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: rgba(16, 22, 26, 0.15); \n`;\n\nconst tableStyle = css`\n\twidth: 100%;\n\tborder-collapse: separate;\n\tborder-spacing: 0px;\n\n\ttr {\n\t\theight: 40px;\n\t}\n\n\t.disabled {\n\t\tbackground-color: #b8b8b8;\n\t}\n\n\t.enabled {\n\t\ttr:nth-of-type(even) {\n\t\t\tbackground-color: rgba(191, 204, 214, 0.2);\n\t\t}\n\t}\n\n\ttd,\n\tth {\n\t\tborder: 1px solid rgba(16, 22, 26, 0.15);\n\t\tpadding: 5px;\n\t}\n\n\tth {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 2;\n\t\tbackground: rgba(245, 248, 250);\n\t\tcolor: black;\n\t}\n\n\ttd {\n\t\tmargin: 0 auto;\n\t\ttext-align: center;\n\t\theight: 30px;\n\t}\n`;\n/** Singleton toaster instance. Create separate instances for different options. */\nconst popup = (tooltipContent: string, icon: string, color: string) => (\n\t{tooltipContent}}\n\t\ttarget={\n\t\t\ticon === 'info' ? (\n\t\t\t\t\n\t\t\t) : (\n\t\t\t\t\n\t\t\t)\n\t\t}\n\t/>\n);\n\nconst dilNameInputCss = css`\n\tbackground: #ffffff;\n\tbox-shadow: inset 0 1px 1px 0 rgba(16, 22, 26, 0.2);\n\tborder-radius: 3px;\n\tborder-width: thin;\n\twidth: 277px;\n\theight: 30px;\n`;\n\nconst spinnerContainerCss = css`\n\twidth: '100%';\n\tmargin: 'auto';\n\talign-items: 'center';\n\tdisplay: 'inline-block';\n\tjustify-content: 'center';\n`;\n\nconst metadataContainerCss = css`\n\tdisplay: flex;\n\twidth: 100%;\n\tflex-direction: row-reverse;\n\tjustify-content: space-between;\n\tmargin-top: 8px;\n`;\n\nconst footerButtonCss = css`\n\tfloat: right;\n\tpadding-topop: 5px;\n\tmargin-bottom: 10px;\n`; \n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { SetStateAction } from 'react';\nimport { Icon } from '@blueprintjs/core';\nimport { ProgressBar as FormProgressBar } from './ProgressBar.js';\n\nimport { ColorProps, DefinitionProps } from '../interfaces';\nimport { SchemaEditor } from '/views/datasetManagement/schemaEditor.js';\n\nexport const Schema: React.FC = ({ dil, setDil, colors, setStep }) => {\n\n\tconst returnToFileUpload: React.ReactElement = (\n\t\t {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetStep('Upload File');\n\t\t\t\twindow.location.reload(false); \n }}\n key=\"return-to-upload\"\n\t\t>\n\t\t\t\n\t\t\tReturn to File Upload\n\t\t\n\t);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t

Schema Editor

\n\t\t\t\t\t

\n\t\t\t\t\t\tWe looked through your data and attached this schema. Edit anything that doesn’t look right and hit “Done”.{' '}\n\t\t\t\t\t

\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t setStep('Done')}\n\t\t\t\t\tadditionalfooterContent={returnToFileUpload}\n\t\t\t\t/>\n\t\t\t
\n\t\t
\n\t);\n};\n\ninterface SchemaProps {\n\tcolors: ColorProps;\n\tdil: DefinitionProps;\n\tsetDil: React.Dispatch>;\n\tsetStep: React.Dispatch>;\n}\n\nconst divCss = css`\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tdisplay: flex; \n\tflex-direction: column; \t\n`; \n\nconst containerCss = css`\n\tpadding: 25px 40px;\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tdisplay: flex;\n\tflex-direction: column;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { SetStateAction } from 'react';\nimport { Button, Icon } from '@blueprintjs/core';\nimport { ProgressBar as FormProgressBar } from './ProgressBar.js';\nimport { DatasetManagementContext } from '../datasetManagementContext';\n\nimport { ColorProps, DefinitionProps } from '../interfaces';\n\nexport const Complete: React.FC = ({ dil, colors, setStep }) => {\n\tconst goBack = () => {\n\t\tsetStep('Upload File');\n\t\twindow.location.reload(false);\n\t};\n\n\tconst { explorerCallback } = React.useContext(DatasetManagementContext);\n\n\treturn (\n\t\t
\n\t\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

File '{(dil as DefinitionProps).name}' has been saved and uploaded.

\n\t\t\t\t

\n\t\t\t\t\tYour file can be accessed from the dropdown menu for data source in the explorer.\n\t\t\t\t

\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn explorerCallback(dil);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tView & Explore Data\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t);\n};\n\nconst divCSS = css`\n\tmargin: 0 auto;\n\ttext-align: center;\n`;\n\nconst ContainerCSS = css`\n\tpadding-top: 25px;\n`;\n\ninterface CompleteProps {\n\tdil: DefinitionProps | {};\n\tcolors: ColorProps;\n\tsetStep: React.Dispatch>;\n}\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React from 'react';\nimport { Button, H3 } from '@blueprintjs/core';\nimport { Form } from \"./uploadForm/UploadForm\";\n\ninterface Props extends React.ComponentProps<'div'> { }\nexport const DataImport: React.FC = (props) => {\n\tconst goBack = () => {\n\t\twindow.history.back();\n\t}\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t

Upload Data

\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst headerStyle = css`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding: 1.5rem;\n`\n\nconst wrapperStyle = css`\n height: 100vh; // NO!\n display: flex;\n flex-flow: column; \n overflow: hidden; \n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport React, { useEffect, useCallback, useState, useContext } from 'react';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Button, H6, Icon, InputGroup, Tree, ITreeNode, Intent, Dialog, Classes } from '@blueprintjs/core';\nimport { DIL, selectUserName } from 'srs-middleware';\nimport { deleteDefinition, uploadDilId } from './utils';\n\nimport { DatasetManagementContext } from './datasetManagementContext';\n// import { WorkspaceActionCreator } from 'hooks/useWorkspaceState';\n// import { WorkspaceContext } from '/views/workspace/workspaceContext';\n\nexport const SidePanel = () => {\n\tconst styles = panelStyles;\n\n\tconst {dilList, setSelectedPanelDil, selectedPanelDil, \n\t\ttoaster, setNeedUpdate, isUpdating, unsavedChanges} = useContext(DatasetManagementContext);\n\tconst [sortedDils, setSortedDils] = useState();\n\tconst [searchFilter, setSearchFilter] = useState('');\n\tconst [dilDefinitionIdToDelete, setDilDefinitionIdToDelete] = useState();\n\n\tconst getDilName = useCallback((dilDefnitionId: number) => {\n\t\treturn sortedDils?.filter(d => d.dilDefinitionId === dilDefnitionId)[0]?.name || \"\";\n\t},[sortedDils]);\n\n\tconst onDeleteClick = useCallback(\n\t\t(e: React.MouseEvent, dilDefinitionId: number) => {\n\t\t\te.stopPropagation(); //stop propagation, so we don't select the dil\n\t\t\tsetDilDefinitionIdToDelete(dilDefinitionId);\n\t}, [setDilDefinitionIdToDelete]);\n\n\tconst deleteDil = useCallback(() => {\n\t\tif (dilDefinitionIdToDelete) {\n\t\t\tdeleteDefinition(dilDefinitionIdToDelete).then(() => {\n\t\t\t\tsetDilDefinitionIdToDelete(null);\n\t\t\t\ttoaster.show({\n\t\t\t\t\ticon: 'tick-circle',\n\t\t\t\t\tmessage: `Dataset ${getDilName(dilDefinitionIdToDelete) || \"\" } Deleted`,\n\t\t\t\t\tintent: Intent.SUCCESS,\n\t\t\t\t});\n\t\t\t\tsetNeedUpdate(true); \n\t\t\t\twindow.location.reload(false);\n\t\t\t});\n\t\t}\n\t}, [toaster, dilDefinitionIdToDelete, getDilName]); //dispatch, forceRefresh\n\n\tuseEffect(() => {\n\t\tlet dilValues: DilTreeNode[] = Object.values(dilList);\n\t\t\t\t\n\t\tsetSortedDils(\n\t\t\tdilValues\n\t\t\t\t// verifying it is a dataset uploaded by the user vs. through a pipeline\n\t\t\t\t.filter((dil: DIL) => dil.dilId === uploadDilId) \n\t\t\t\t// verifying it is a dataset that the current user owns (can't update a dataset not uploaded by you)\n\t\t\t\t.filter((dil: DIL) => Object.keys(dil).includes('owner') && dil['owner'] === selectUserName()) \n\t\t\t\t.filter((dil: DIL) => !searchFilter || dil.name.includes(searchFilter))\n\t\t\t\t.map((dil: DIL) => {\n\t\t\t\t\treturn ({\n\t\t\t\t\t...dil,\n\t\t\t\t\tid: dil.dilDefinitionId,\n\t\t\t\t\tlabel: dil.name,\n\t\t\t\t\tisSelected: dil.dilDefinitionId === selectedPanelDil?.dilDefinitionId,\n\t\t\t\t\tsecondaryLabel: (\n\t\t\t\t\t\t onDeleteClick(e, dil.dilDefinitionId)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t),\n\t\t\t\t})})\n\t\t);\n\t}, [dilList, searchFilter, onDeleteClick, selectedPanelDil]);\n\n\tconst handleNodeSelected = useCallback(\n\t\t(selectedDil: DilTreeNode) => {\n\t\t\tif (unsavedChanges) return;\n\t\t\tsetSelectedPanelDil(selectedDil);\n\t}, [setSelectedPanelDil, unsavedChanges]);\n\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
Manage Data
\n\t\t\t\t\t
Edit, delete, and search your uploaded data.
\n\t\t\t\t\t
Upload new data.
\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t{\n\t\t\t\t\tselectedPanelDil\n\t\t\t\t\t?\n\t\t\t\t\t:
\n\t\t\t\t}\n\t\t\t
\n\t\t\t setSearchFilter(e.target.value)}\n\t\t\t/>\n\t\t\t\n\t\t\t setDilDefinitionIdToDelete(null)}\n\t\t\t>\n\t\t\t\t
{`You're about to delete ${getDilName(dilDefinitionIdToDelete)}. Is that what you want?`}
\n\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t);\n};\n\ninterface DilTreeNode extends DIL, ITreeNode {}\n\nconst panelStyles = {\n\tcontainer: css`\n\t\tborder-radius: 3px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\toverflow: hidden;\n\t`,\n\theader: css`\n\t\tpadding: 20px 0 10px;\n\t\tbackground-color: rgb(235, 241, 245);\n\t\tdisplay: flex;\n\t`,\n\tsettingsIcon: css`\n\t\tcolor: #5c7080;\n\t\tmargin-left: 20px;\n\t\tmargin-right: 10px;\n\t`,\n\theaderText: css`\n\t\tmargin: 0 0 5px;\n\t`,\n\ttext: css`\n\t\tfont-size: 12px;\n\t`,\n\tbuttonRow: css`\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\tjustify-content: flex-end;\n\t\tmin-height: 30px;\n\t`,\n\tbutton: css`\n\t\tcolor: #006699 !important;\n\t\t.bp3-icon:first-of-type {\n\t\t\tcolor: #006699 !important;\n\t\t}\n\t`,\n\tsearch: css`\n\t\tmargin-left: 10px;\n\t\tmargin-right: 10px;\n\t`,\n\ttree: css`\n\t\toverflow: auto;\n\t\t.bp3-tree-node-selected > .bp3-tree-node-content {\n\t\t\tbackground-color: rgb(235, 241, 245);\n\t\t\tcolor: rgb(19, 124, 189);\n\t\t\t.bp3-tree-node-icon, :hover button > .bp3-icon {\n\t\t\t\tcolor: rgb(19, 124, 189);\n\t\t\t}\n\t\t\t.bp3-tree-node-secondary-label > .bp3-icon {\n\t\t\t\tcolor: rgb(92, 112, 128);\n\t\t\t}\n\t\t}\n\t\t.bp3-tree-node{\n\t\t\tbutton{\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t\t:hover button{\n\t\t\t\tdisplay: inline-flex;\n\t\t\t}\n\t\t}\n\n\t`,\n};\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport { useEffect, useState } from 'react';\nimport { Card, PanelStack, Toaster, Position, Intent } from '@blueprintjs/core';\nimport { DataImport } from './DataImport';\nimport { selectDIL, DILList, DIL } from 'srs-middleware';\nimport { SidePanel } from './sidePanel';\nimport { SchemaEditor } from './schemaEditor';\nimport { DefinitionProps } from './interfaces';\nimport { colors } from './styles';\nimport { DatasetManagementContext } from './datasetManagementContext';\n\nexport const DatasetManagement = ({ explorerCallback }) => {\n\tconst [dilList, setDilList] = useState(selectDIL());\n\n\t// need to update dillist deletion or addition\n\tconst [selectedPanelDil, setSelectedPanelDil] = useState();\n\n\tconst [needUpdate, setNeedUpdate] = useState(false);\n\tconst [unsavedChanges, setUnsavedChanges] = useState(false);\n\n\tconst onComplete = () => {\n\t\tAppToaster.show({\n\t\t\ticon: 'tick-circle',\n\t\t\tmessage: 'Saved',\n\t\t\tintent: Intent.SUCCESS,\n\t\t});\n\n\t\twindow.location.reload(false);\n\t};\n\n\tuseEffect(() => {\n\t\t//refreshDIL(); // uncomment when refreshDil gets pushed merged into srs-middleware master and is re-packaged\n\t\tsetDilList(selectDIL());\n\t}, [needUpdate]);\n\n\tconst providerValues = {\n\t\tdilList,\n\t\tselectedPanelDil,\n\t\tsetSelectedPanelDil,\n\t\ttoaster: AppToaster,\n\t\tsetNeedUpdate,\n\t\texplorerCallback,\n\t\tunsavedChanges,\n\t\tsetUnsavedChanges,\n\t};\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{selectedPanelDil ? (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst AppToaster = Toaster.create({\n\tclassName: 'recipe-toaster',\n\tposition: Position.TOP,\n});\n\nconst container = css`\n\tflex: 1 1 auto;\n\toverflow: hidden;\n\tdisplay: grid;\n\tgrid-template-columns: 300px 1fr;\n\tgrid-template-rows: 1fr;\n\tgrid-gap: 6px;\n\tpadding: 6px;\n`;\nconst schemaEditorStyle = css`\n\tpadding: 16px 40px 8px 40px;\n\theight: 100%;\n`;\nconst panelWrapper = css`\n\tpadding: 0;\n\t.bp3-panel-stack {\n\t\theight: 100%;\n\t\tborder-radius: 3px;\n\t}\n`;\nconst viewWrapper = css`\n\toverflow: hidden;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding: 10px;\n`;\n","/** @jsx jsx */\nimport React, { ReactChildren, useCallback, useEffect, useRef, useState } from 'react';\nimport { css, jsx } from '@emotion/react';\nimport { ReactJSXElement } from '@emotion/react/types/jsx-namespace';\nimport { useAsyncCallback } from 'hooks/useAsyncCallback';\nimport { logCuratedViewVisit, updateCuratedViewFavStatus } from 'widgets/endpoints';\nimport { useParams } from 'react-router-dom';\nimport { IsPageLoaded } from 'views/curatedViews/LoadingContext';\n\n/**\n * Each curated view should live inside this. This takes care of the scrolling and general layout.\n * Usage example: See /serberus/cyhy/src/curatedViews/singleOrg/index\n * @param props\n * @param props.loaded - A flag telling the container when the children have completed loading. Used to know when to do\n * \tsome measurements and set up page.\n * @param props.children - the main section of the page. What contents should be shown in this curated view\n * @param props.topSection - the top section, above the main contents, but below the page nav bar. This is the part that should shrink when scrolled\n * @param props.publicUrl\n * @constructor\n */\ninterface CuratedViewContainerProps {\n\tchildren: ReactChildren;\n\ttopSection: (arg1: boolean, arg2: () => void, arg3: React.MutableRefObject) => ReactJSXElement;\n\tpublicURL: string;\n\tmetaData: {\n\t\tkey: string;\n\t\tname: string;\n\t\tfullName: string;\n\t\tgroup: string;\n\t}\n\tsetTopSectionHeight: (arg1: number) => void;\n}\nexport function CuratedViewContainer(props: CuratedViewContainerProps) {\n\tconst rootRef = useRef();\n\tconst [shrink, setShrink] = useState(false);\n\tconst [scrollBarWidth, setScrollBarWidth] = useState(0);\n\n\tlet { id, group } = useParams<{id, group}>();\n\tid = decodeURIComponent(id);\n\n\tconst [isFavorite, setFavorite] = useState(false);\n\tconst toggleFavorite = useCallback(() => {\n\t\tsetFavorite(s => {\n\t\t\tconst newState = !s;\n\t\t\tupdateCuratedViewFavStatus({id, favorite: newState});\n\t\t\treturn newState;\n\t\t});\n\t},[]);\n\n\tconst pageLoaded = IsPageLoaded();\n\n\t//Even though this effect and the one below it both have a dep on props.loaded it was more work to make them live in the\n\t//same useAsyncCallback. So just split them up.\n\tuseAsyncCallback(async () => {\n\t\tif(pageLoaded) {\n\t\t\tconst {metaData: {name}} = props;\n\t\t\tif (!id || !name || !group) {\n\t\t\t\tthrow new Error(`Don't have all the pieces to log this visit!! Id: ${id}, Name: ${name}, Group: ${group}`);\n\t\t\t}\n\t\t\tconst { favorite } = await logCuratedViewVisit({ id, name, type: group });\n\t\t\tsetFavorite(favorite);\n\t\t}\n\t}, [pageLoaded]);\n\n\tuseEffect(() => {\n\t\tif(pageLoaded) {\n\t\t\tconst el = rootRef?.current;\n\t\t\tsetScrollBarWidth(el.offsetWidth - el.clientWidth);\n\n\t\t\t//Set the height to auto, so that it gets as big as it needs to (overwrite any previously set css height settings)\n\t\t\t//(Note that if the height was set, then the top section changed height we need this otherwise the first set height\n\t\t\t// always is returned)\n\t\t\t//@ts-ignore\n\t\t\ttopSectionRef?.current?.style.height = \"auto\";\n\t\t\t// @ts-ignore Get the height of the top section\n\t\t\tprops.setTopSectionHeight(topSectionRef?.current?.clientHeight || 1);\n\t\t\t//@ts-ignore Take away the height:auto style, and let the css take back over\n\t\t\ttopSectionRef?.current?.style.removeProperty(\"height\");\n\t\t}\n\t}, [pageLoaded]);\n\n\tconst _onScroll = (e) => {\n\t\tif (e.target.scrollTop > 50) {\n\t\t\tsetShrink(true);\n\t\t} else {\n\t\t\tsetShrink(false);\n\t\t}\n\t};\n\n\tconst topSectionRef = useRef();\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{props.topSection(isFavorite, toggleFavorite, topSectionRef)}\n\t\t\t\t
\n\t\t\t\t{props.children}\n\t\t\t
\n\t\t
\n\t);\n}\n\n\nconst cardsSection = loaded => css`\n\toverflow: ${loaded ? \"auto\" : \"hidden\"};\n\t\n\t& .overflow-container { //the container that \"overflows\" allowing scrolling at the cardsSection div level\n\t\tmin-width: 1150px;\n\t\toverflow: hidden;\n\t}\n\t\n\t& .bold-me {\n\t\tfont-weight: bold;\n\t}\n\n\t& .flex-1 {\n\t\tflex: 1;\n\t}\n\n\t& .flex-row {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t}\n\t& .flex-column {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t& .section-title {\n\t\tmargin: 18px 50px 10px 50px;\n\t\tfont-weight: bold;\n\t\tfont-size: 1.2em;\n\t\tcolor: #6699CC;\n\t}\n\t\n\t\n`;\n\nconst curatedViewCss = ({ publicURL }, scrollBarWidth) => css`\n\tcolor: white;\n\tcursor: default;\n\twidth: 100%;\n\tcontent: ' ';\n\tposition: absolute;\n\tright: ${scrollBarWidth}px;\n\n\toverflow: hidden;\n\n`;\n\n\nexport function Section({ children }) {\n\treturn
{children}
;\n}\n\nconst sectionCss = css`\n\tmargin: 10px 50px;\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;\n\tcolumn-gap: 10px;\n\trow-gap: 10px;\n`;\n","/** @jsx jsx */\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\nimport { ClassNames, css, jsx } from '@emotion/react';\nimport { Icon } from 'components/icon';\nimport { Tooltip2 } from '@blueprintjs/popover2';\n\n/**\n * A simple tooltip that displays infoText when you hover\n * over it\n * @param infoText Text to be displayed in tooltip\n * @returns JSX tooltip\n */\nexport const InfoTooltip: React.FC = ({ infoText }) => {\n\t//For some reason the popover had a black background and white text. which is diff than the rest of the app. Just doing a css on Tooltip2\n\t// doesn't work. It does offer the prop \"popoverClassName\" but that takes a class name, not a css prop. According to Emotion website\n\t// the component passes a css param that can be used as input to a classNames prop. As seen below. So way confuluted way\n\t// just to get the right styles...ugh.\n\treturn (\n\t\t\n\t\t\t{({css, cx}) => {\n\t\t\t\tconst styles = css`\n\t\t\t\t\t& .bp3-popover2-content {\n\t\t\t\t\t\tbackground-color: white;\n\t\t\t\t\t\tcolor: rgb(102, 102, 102);\n\t\t\t\t\t}\n\t\t\t\t`;\n\t\t\t\treturn (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t)\n\t\t\t}}\n\t\t\n\n\t);\n};\n\ninterface InfoTooltipProps {\n\tinfoText: string;\n}\n\nconst iconCss = css`\n\tcolor: #6699CC; \n`;\n","/**\n * @jsx jsx\n */\nimport React from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Colors, H3, Icon } from '@blueprintjs/core';\nimport { SimpleCard, SimpleCardProps } from './SimpleCard';\nimport { IconNames } from '@blueprintjs/icons';\n\nexport const UnderConstructionCard: React.FC = ({ ...rest }) => (\n\t\n\t\t
\n\t\t\t\n\t\t\t

Under Construction

\n\t\t
\n\t
\n);\n\nconst container = css`\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-contet: center;\n\tjustify-content: center;\n\ttext-align: center;\n`;\n","/** @jsx jsx */\nimport React, { ReactElement } from 'react';\nimport { css, jsx } from '@emotion/react';\nimport { NonIdealState } from '@blueprintjs/core';\n\n\n\nexport function SimpleList({data, children, includeTotal=false}: {data: Array<{count: number, key: string}>, children: (d) => ReactElement, includeTotal: boolean}) {\n\n\treturn data ? (\n\t\t
\n\t\t\t{\n\t\t\t\tdata?.map(children)\n\t\t\t}\n\t\t\t{includeTotal ?\n\t\t\t\t
\n\t\t\t\t\t
TOTAL
\n\t\t\t\t\t
{data?.reduce((t, e) => t + e.count, 0)}
\n\t\t\t\t
\n\t\t\t\t: null}\n\t\t
\n\t) :\n\t\t\n\n}\n\nconst simpleTable = css`\n\twidth: 100%;\n\t\n\t& > * {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: 10px 15px 10px 10px;\n\t\tflex: 1;\n\n\t\t&:nth-of-type(even) {\n\t\t\tbackground: #ebf4f7;\n\t\t}\n\t\t&:nth-of-type(odd) {\n\t\t\tbackground: #f9f9f9;\n\t\t}\n\n\t}\n`;\n","/** @jsx jsx */\nimport { useRef, useState } from 'react';\nimport { useHistory, useRouteMatch } from 'react-router-dom';\nimport { List } from 'react-virtualized';\n\nimport { css, jsx } from '@emotion/react';\nimport { Button, MenuItem } from '@blueprintjs/core';\nimport { ItemRenderer, Suggest } from '@blueprintjs/select';\n\ninterface Row {\n\tkey: string;\n\tdisplayText: string;\n\tfullName: string;\n\tgroup: string;\n}\ninterface CuratedViewLandingProps {\n\tsearchOptions: Array;\n\trunQuery: (arg1: string) => void;\n}\n\nconst OurSuggestions = Suggest.ofType();\n\n/**\n * The landing page for when the organization isn't set in the url. This gives a search box and drop down for possible\n * entries. Each entry will know what curated view to show (Org show Single org view, Vul show Single vul view etc)\n * Usage example: See /serberus/cyhy/src/curatedViews/index\n * @param p\n * @constructor\n */\nexport function CuratedViewLanding(p: CuratedViewLandingProps) {\n\tconst history = useHistory();\n\tconst { url } = useRouteMatch();\n\tconst _onClick = ({ key, group }) => {\n\t\tconst _url = url.slice(-1) === '/' ? url.slice(0, -1) : url;\n\t\thistory.push(`${_url}/${group}/${encodeURIComponent(key)}`);\n\t};\n\tconst _areEqual = (a, b) =>\n\t\ta.displayText.toLowerCase() === b.displayText.toLowerCase() && a.group.toLowerCase() === b.group.toLowerCase();\n\n\tconst suggestRef = useRef();\n\n\tconst [query, setQuery] = useState();\n\tconst _updateQuery = (e: string) => {\n\t\tsetQuery(e);\n\t};\n\tconst _clearQuery = () => {\n\t\tsetQuery('');\n\t};\n\n\n\treturn (\n\t\t
\n\t\t\t displayText}\n\t\t\t\titemRenderer={filterAndBuildSuggestRow}\n\t\t\t\tfill={true}\n\t\t\t\titemsEqual={_areEqual}\n\t\t\t\tonQueryChange={(e) => {_updateQuery(e); p.runQuery(e)}}\n\t\t\t\titemListRenderer={renderList(suggestRef)}\n\t\t\t\topenOnKeyDown={true}\n\t\t\t\tinputProps={{\n\t\t\t\t\tleftIcon: 'search',\n\t\t\t\t\tautoFocus: true,\n\t\t\t\t\trightElement:
\n\t);\n}\n\nconst renderList =\n\t(ref) =>\n\t({ items, renderItem }) => {\n\t\t//this renders the list item AND checks each item if it matches the predicate (it thru the chain call filterAndBuildSuggestRow)\n\t\tconst renderedItems = items.map(renderItem);\n\n\t\tconst width = ref.current?.inputElement?.clientWidth;\n\t\t//Ref has to be a string. Its never used in our code, but the lib uses it\n\t\treturn (\n\t\t\t (items.loading ?
Loading...
:
No rows
)}\n\t\t\t\trowCount={renderedItems.length}\n\t\t\t\trowHeight={35}\n\t\t\t\trowRenderer={(props) => {\n\t\t\t\t\tconst { key, style } = props;\n\t\t\t\t\t//The row in the list is this div, and the child of this div is result of filterAndBuildSuggestRow\n\t\t\t\t\treturn (\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{renderedItems[props.index]}\n\t\t\t\t\t\t
\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t\twidth={width - 10}\n\t\t\t/>\n\t\t);\n\t};\n\nconst filterAndBuildSuggestRow: ItemRenderer = (item, { handleClick, modifiers, query }) => {\n\treturn (\n\t\t\n\t);\n};\n\nfunction highlightText(text, query) {\n\treturn $&') }} />;\n}\n\nconst typeAheadCss = css`\n\tdisplay: flex;\n`;\n\nconst rowCss = css`\n\tlist-style: none;\n`;\n","/** @jsx jsx */\nimport React from 'react';\nimport { css, jsx } from '@emotion/react';\nimport { formatDateTime } from 'utilities/formatters';\nimport { useHistory, useRouteMatch } from 'react-router-dom';\nimport { IconNames } from '@blueprintjs/icons';\nimport { Icon } from '@blueprintjs/core';\n\nexport interface SearchPageListProps {\n\ttitle: string;\n\tdata: Array<{ name: string; date: string }>;\n}\n\nexport function SearchPageList({ title, data }: SearchPageListProps) {\n\treturn (\n\t\t
\n\t\t\t
{title}
\n\t\t\t
\n\t\t\t\t{data?.map((d, i) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t
\n\t\t
\n\t);\n}\n\nfunction Row({ d }) {\n\tconst history = useHistory();\n\tconst { url } = useRouteMatch();\n\tconst _onClick = () => {\n\t\tconst _url = url.slice(-1) === '/' ? url.slice(0, -1) : url;\n\t\thistory.push(`${_url}/${d.type}/${encodeURIComponent(d.id)}`);\n\t};\n\treturn (\n\t\t
\n\t\t\t
\n\t\t\t\t{d.name}\n\t\t\t\t\n\t\t\t
\n\t\t\t
{formatDateTime(d.lastOpened)}
\n\t\t
\n\t);\n}\n\nconst SearchPageListCss = css`\n\toverflow: hidden;\n\tmargin-right: 20px;\n\tmin-width: 320px; \n\n\t& .title {\n\t\tmargin-top: 20px;\n\t\tcolor: #68abda;\n\t\tfont-weight: bold;\n\t\tfont-size: 1.1rem;\n\t\ttext-transform: uppercase;\n\t}\n\n\t& .row {\n\t\tmargin: 20px 0;\n\t\twhite-space: nowrap;\n\t\tcursor: pointer;\n\n\t\t&:first-of-type(*) {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t& .row-name {\n\t\t\talign-items: center;\n\t\t\tfont-size: 1rem;\n\t\t\tdisplay: flex;\n\t\t\t\n\t\t\t& .row-name-span {\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t\n\t\t\t& .bp3-icon {\n\t\t\t\tpadding-left: 6px;\n\t\t\t}\n\t\t}\n\n\t\t& .row-date {\n\t\t\tcolor: #999999;\n\t\t\tfont-size: 0.8rem;\n\t\t}\n\t}\n`;\n","import { useSRS } from 'srs-middleware';\nimport { useEffect } from 'react';\nimport { sendPageLoad } from 'utilities/usageStats';\n\ntype UseSRSType = typeof useSRS;\n\n/**\n * A wrapper around the `useSRS` hook. It's usage is mostly the same the\n * difference is that it performs some extra slykit specific things.\n */\nexport const useSlykit: UseSRSType = (...args) => {\n\tconst srsProps = useSRS(...args);\n\n\t// Initiate page load usage stat\n\tuseEffect(() => {\n\t\tif (srsProps.isReady) {\n\t\t\tsendPageLoad();\n\t\t}\n\t}, [srsProps.isReady]);\n\n\treturn srsProps;\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\nimport { useAsyncCallback } from 'hooks/useAsyncCallback';\nimport { NonIdealState } from '@blueprintjs/core';\nimport React from 'react';\nimport { FullPageLoader } from 'components/loadingIcon/fullPageLoader';\n\nexport const NetworkConfigContext = React.createContext(null);\n\nexport function ConfigFetcher({ children }) {\n\tconst {\n\t\tdata: config,\n\t\tloading,\n\t\terror,\n\t} = useAsyncCallback(async () => {\n\t\tconst url = `${process.env.NODE_ENV === 'production' ? '.' : ''}/react_config.json`;\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: 'GET',\n\t\t\tcredentials: 'include',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t});\n\t\tif (response && response.status >= 200 && response.status < 300) {\n\t\t\treturn response.json();\n\t\t} else {\n\t\t\tthrow new Error('Server responded with invalid status code while fetching react_config.json');\n\t\t}\n\t}, []);\n\n\tif (loading) return ;\n\n\tif (error) {\n\t\treturn (\n\t\t\t\n\t\t);\n\t}\n\n\t// Render props for configuartion\n\treturn {children({ config })};\n}\n","/** @jsx jsx */\nimport { css, jsx } from \"@emotion/react\";\nimport React, { useMemo, useState } from 'react'\nimport { Icon } from \"@blueprintjs/core\";\nimport { Colors } from 'styles/variables';\n\n/**\n * Simple star rating component.\n *\n * @param starCount the total number of stars to show\n * @param starValue the current rating\n * @param clickStar if set, this will fire the given event, else this is not interactive\n * @param starColor color the stars // why not with css?\n * @returns {*}\n * @constructor\n */\nexport const Stars = ({ starCount = 5, starValue = 0, clickStar, starColor = Colors.BLUE1 }) => {\n\tconst selectable = useMemo(() => { return !!clickStar }, [clickStar]);\n\n\tconst [value, setValue] = useState(starValue);\n\tconst [hover, setHover] = useState(-1);\n\tconst stars = useMemo(() => Array.from({ length: starCount }, (v, i) => i), [starCount]);\n\n\treturn (\n\t\t
\n\t\t\t{[...stars].map((n, i) => {\n\t\t\t\tconst selected = hover > -1 ? hover >= i : i < value;\n\t\t\t\tconst vars = {\n\t\t\t\t\tclassName: selected ? \"star selected\" : \"star unselected\",\n\t\t\t\t\ticon: selected ? \"star\" : \"star-empty\"\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t {\n\t\t\t\t\t\t\tif (i + 1 !== value) {\n\t\t\t\t\t\t\t\tsetValue(i + 1);\n\t\t\t\t\t\t\t\tclickStar(i + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseOver={() => selectable && setHover(i)}\n\t\t\t\t\t\tonMouseOut={() => selectable && setHover(-1)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t
\n\t)\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\n// eslint-disable-next-line no-unused-vars\nimport { css, jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport * as d3 from 'd3';\nimport { D3Legend } from './D3Legend';\nimport { Colors } from 'styles/variables';\n\n/**\n * Responsible for rendering a Legend to support widgets.\n *\n * Expects data in the form:\n * [{key: key, value: value}, ...]\n * @param dimensions {{height: height, width: width}}\n * @param data Array of {key: key, value: value}\n * @param colorScale\n * @param minBarWidth\n * @param mouseOver\n * @param mouseOut\n * @returns {*}\n * @constructor\n */\nexport const Legend = ({ dimensions, data, colorScale, minBarWidth = 10, mouseOver, mouseOut }) => {\n\tconst svgRef = useRef();\n\tconst { height, width } = dimensions;\n\tconst [chart, setChart] = useState();\n\n\t// creates a series which has a range for each key\n\t// [0, value1], [value1: value1 + value2]...\n\tconst series = useMemo(() => {\n\t\t// convert to {key1: value1, key2: value2...}\n\t\tconst reduced = data.reduce((prev, current) => {\n\t\t\tprev[current.key] = current.value;\n\t\t\treturn prev;\n\t\t}, {});\n\n\t\t// gets all the keys [key1, key2...]\n\t\tconst keys = Object.keys(reduced);\n\t\tconst stack = d3.stack().keys(keys);\n\t\treturn stack([reduced]);\n\t}, [data]);\n\n\t// determine average bar width\n\tconst averageWidth = useMemo(() => {\n\t\treturn dimensions.width / data.length;\n\t}, [data, dimensions]);\n\n\tuseEffect(() => {\n\t\tconst createChart = () => {\n\t\t\treturn D3Legend(svgRef.current);\n\t\t};\n\n\t\tif (series && dimensions && colorScale) {\n\t\t\tlet ch = chart;\n\n\t\t\t// if we don't have an existing chart, create one\n\t\t\tif (!ch) {\n\t\t\t\tch = createChart();\n\t\t\t\tsetChart(ch);\n\t\t\t}\n\n\t\t\tch.update(series, dimensions, colorScale, mouseOver, mouseOut);\n\t\t}\n\t}, [dimensions, colorScale, series, mouseOver, mouseOut, chart]);\n\n\t// currently we don't render the bar if there are too many elements to show reasonably.\n\n\treturn (\n\t\t
\n\t\t\t\n\n\t\t\t{averageWidth <= minBarWidth && (\n\t\t\t\t\n\t\t\t\t\tLegend Not Available: Too Many Entries\n\t\t\t\t
\n\t\t\t)}\n\t\t\n\t);\n};\n\nconst containerStyle = css`\n\tposition: relative;\n`;\n\nconst svgStyle = css`\n\tposition: absolute;\n\ttop: 0;\n`;\n\nconst noLegend = css`\n\tbackground-color: ${Colors.LIGHT_GRAY2};\n\twidth: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tpadding: 10px;\n`;\n\nLegend.propTypes = {\n\tdata: PropTypes.any, // either a hierarchy or flat array.\n\tdimensions: PropTypes.object,\n\tcolorScale: PropTypes.any, //TODO: is this PropTypes.func ??\n};\n","/** @jsx jsx */\nimport React, { useCallback, useState } from 'react';\nimport { jsx } from '@emotion/react';\nimport parser from 'ua-parser-js';\nimport { Button, Classes, Dialog, Intent } from '@blueprintjs/core';\n\n// based on support for grid gap\n// https://caniuse.com/mdn-css_properties_gap_grid_context\nconst supportedBrowsers = {\n\tChrome: 66,\n\tFirefox: 61,\n\tEdge: 16,\n\tOpera: 53,\n\tSafari: 12,\n};\n\nfunction isSupportedBrowser(): boolean {\n\ttry {\n\t\tconst UAP = parser(navigator.userAgent);\n\t\tconst targetVersion = supportedBrowsers[UAP.browser.name];\n\t\tconst browserVersion = +UAP.browser.major;\n\t\tif (targetVersion && targetVersion <= browserVersion) {\n\t\t\treturn true;\n\t\t}\n\t} catch (e) {\n\t\tconsole.error('Slykit: Unable to determine browser version.', e);\n\t}\n\treturn false;\n}\n\n/**\n * Renders children only if browser supports slykit. Override option is available.\n */\nexport const BrowserChecker: React.FC = ({ children }) => {\n\tconst [isSupported, setIsSupported] = useState(() => {\n\t\treturn isSupportedBrowser();\n\t});\n\n\tconst dismiss = useCallback(() => {\n\t\tsetIsSupported(true);\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t{isSupported ? (\n\t\t\t\tchildren\n\t\t\t) : (\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\tFeatures might not work as expected on your browser. Please switch to one of the browsers below.\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t{Object.entries(supportedBrowsers).map(([browser, version]) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t\t\t{browser} v{version} or greater\n\t\t\t\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t)}\n\t\t
\n\t);\n};\n","/** @jsx jsx */\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useState, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { Dialog, Card, Button, Elevation } from '@blueprintjs/core';\nimport { DndProvider } from 'react-dnd';\nimport Backend from 'react-dnd-html5-backend';\nimport update from 'immutability-helper';\nimport { Icon } from '/components/icon';\nimport DraggableContainer from 'components/multiselect/draggable';\nimport { multiselectStyles } from './styles';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst convertToArrayOfObjects = (array) => {\n\tconst initialValue = [];\n\tarray.forEach((value) => {\n\t\tinitialValue.push({\n\t\t\tid: uuidv4(),\n\t\t\ttext: value,\n\t\t});\n\t});\n\treturn initialValue;\n};\n\n/**\n * Renders blueprint dialog for multi-select.\n */\nexport default function MultiSelectPopup({ closeModal, items, title, initialSelected = items, minimumItems = 1 }) {\n\tconst initialUnselected = items.filter((item) => !initialSelected.includes(item));\n\tconst itemsAsObjects = convertToArrayOfObjects(items);\n\tconst initialSelectedAsObjects = convertToArrayOfObjects(initialSelected);\n\tconst initialUnselectedAsObjects = convertToArrayOfObjects(initialUnselected);\n\n\tconst [selected, setSelected] = useState(initialSelectedAsObjects);\n\n\tconst [unselected, setUnselected] = useState(initialUnselectedAsObjects);\n\n\tconst moveSelected = useCallback(\n\t\t(draggingIndex, hoveringIndex) => {\n\t\t\tconst dragItem = selected[draggingIndex];\n\t\t\tsetSelected(\n\t\t\t\tupdate(selected, {\n\t\t\t\t\t$splice: [\n\t\t\t\t\t\t[draggingIndex, 1],\n\t\t\t\t\t\t[hoveringIndex, 0, dragItem],\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[selected]\n\t);\n\n\tconst moveUnselected = useCallback(\n\t\t(draggingIndex, hoveringIndex) => {\n\t\t\tconst dragItem = unselected[draggingIndex];\n\t\t\tsetUnselected(\n\t\t\t\tupdate(unselected, {\n\t\t\t\t\t$splice: [\n\t\t\t\t\t\t[draggingIndex, 1],\n\t\t\t\t\t\t[hoveringIndex, 0, dragItem],\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\t[unselected]\n\t);\n\n\tconst handleSelect = (newValue) => {\n\t\tsetSelected((selected) => [...selected, newValue]);\n\t\tsetUnselected(unselected.filter((item) => item !== newValue));\n\t};\n\n\tconst handleUnselect = (newValue) => {\n\t\tif (selected.length <= minimumItems) return;\n\t\tsetUnselected((selected) => [...selected, newValue]);\n\t\tsetSelected(selected.filter((item) => item !== newValue));\n\t};\n\n\tconst handleSelectAll = () => {\n\t\tif (itemsAsObjects !== selected) {\n\t\t\tsetSelected(itemsAsObjects);\n\t\t\tsetUnselected([]);\n\t\t}\n\t};\n\n\t// Don't want to allow the user to unselect all (causes system to crash),\n\t// this doesn't do anything if the items are at n (the minimium number)\n\t// if there are more than the minimum number, select the first n\n\tconst handleUnselectAll = () => {\n\t\tif (selected.length <= minimumItems) return;\n\t\tsetSelected(itemsAsObjects.slice(0, minimumItems));\n\t\tsetUnselected(itemsAsObjects.slice(minimumItems));\n\t};\n\n\tconst handleReset = () => {\n\t\tsetSelected(initialSelectedAsObjects);\n\t\tsetUnselected(initialUnselectedAsObjects);\n\t};\n\n\tconst handleClose = () => {\n\t\thandleSelectAll();\n\t\thandleSubmit();\n\t};\n\n\tconst handleSubmit = () => {\n\t\tconst selectedToReturn = selected.map((item) => item.text);\n\t\tconst unselectedToReturn = unselected.map((item) => item.text);\n\t\tconst returnObject = { selected: selectedToReturn, unselected: unselectedToReturn };\n\t\tcloseModal(returnObject);\n\t};\n\n\tconst { wrapper, cardWrapper, selectCard, centerSection, middleButton, itemTitle } = multiselectStyles;\n\n\treturn (\n\t\t\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t
Unselected
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t\t\t
Selected
\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nMultiSelectPopup.propTypes = {\n\t/**\n\t * Function to close modal on click. Returns selected and unselected values;\n\t */\n\tcloseModal: PropTypes.func,\n\t/**\n\t * Items to be selected.\n\t */\n\titems: PropTypes.array,\n\t/**\n\t * Items that start off as selected in the component.\n\t * Optional, default behavior is start off with all items selected.\n\t */\n\tinitialSelected: PropTypes.array,\n\t/**\n\t * This string is used as a title for the dialog.\n\t */\n\ttitle: PropTypes.string,\n};\n","/** @jsx jsx */\nimport { jsx, css } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button } from '@blueprintjs/core';\nimport { Icon } from '/components/icon';\nimport Popup from './popup';\nimport { ColorAliases } from 'styles/variables';\n\n/**\n * Icon and logic for creating multiselect popup.\n */\nexport const MultiSelect = ({ items = [], onClose, title, selected, minimumItems = 1 }) => {\n\tconst [isOpen, setIsOpen] = useState(false);\n\n\tconst handleClose = (sortedSelections) => {\n\t\tsetIsOpen(false);\n\t\tonClose(sortedSelections);\n\t};\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t{isOpen && (\n\t\t\t\t handleClose(sortedSelections)}\n\t\t\t\t\titems={items}\n\t\t\t\t\tinitialSelected={selected}\n\t\t\t\t\tminimumItems={minimumItems}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\n\t);\n}; \n\nMultiSelect.propTypes = {\n\t/**\n\t * Items for the multiselect modal.\n\t */\n\titems: PropTypes.array,\n\t/**\n\t * Items that start off as selected in the component.\n\t * Optional, default behavior is start off with all items selected.\n\t */\n\tselected: PropTypes.array,\n\t/**\n\t * Function called when the modal is closed. Returns an object with the selected and unselected properties.\n\t */\n\tonClose: PropTypes.func,\n\t/**\n\t * This string is used as a title for the dialog.\n\t */\n\ttitle: PropTypes.string,\n\n\tminimumItems: PropTypes.number,\n};\n\nconst facetDropdownStyles = css`\n\tfont-weight: bold;\n\tpadding-top: 3px;\n\n\t.bp3-icon.bp3-icon-select:first-of-type {\n\t\tmargin: 0;\n\t}\n`;\n\nexport default MultiSelect; \n","import * as d3 from 'd3';\n\nimport { useEffect, useState } from 'react';\n\n/**\n * Sets up a common d3 force-layout\n *\n * @param data\n * @param forces\n * @param dimensions\n * @returns {{simulation: unknown, tick: number}}\n */\nexport const useForceSimulation = ({ data, forces, dimensions }) => {\n const [tick, setTick] = useState(Date.now());\n const [simulation, setSimulation] = useState(null);\n\n useEffect(() => {\n const simulation = d3\n .forceSimulation(data)\n .on('tick', () => setTick(Date.now()))\n .on('end', () => setTick(Date.now()));\n\n forces.forEach(f => {\n simulation.force(f.name, f.force);\n });\n\n setSimulation(simulation);\n return () => simulation.stop();\n }, [data, forces, dimensions]);\n\n return {simulation, tick};\n};\n\n/**\n * Helper hook to set up zoom functionality.\n *\n * @param svgRef\n * @param containerRef\n * @param zoomMin\n * @param zoomMax\n */\nexport const useZoom = ({svgRef, containerRef, zoomMin = 0.1, zoomMax = 4.0}) => {\n useEffect(() => {\n if (!svgRef || !containerRef) return;\n\n // set up the zoom, which is on the SVG\n d3.select(svgRef.current)\n .call(d3.zoom()\n .scaleExtent([zoomMin, zoomMax])\n .on(\"zoom\", () => { d3.select(containerRef.current).attr(\"transform\", d3.event.transform); })\n )\n }, [svgRef, containerRef, zoomMin, zoomMax]);\n};\n\nexport const dragHook = simulation => d3.drag()\n .on(\"start\", (d) => {\n d3.event.sourceEvent.stopPropagation();\n if (!d3.event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n })\n .on(\"drag\", (d) => {\n d.fx = d3.event.x;\n d.fy = d3.event.y;\n })\n .on(\"end\", (d) => {\n if (!d3.event.active) simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n })\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as d3 from 'd3';\nimport { dragHook, useForceSimulation, useZoom } from './forceUtils';\n\n/**\n * Renders a simple node-link diagram.\n *\n * Expects: {\n * nodes: [],\n * links: [],\n * }\n *\n * @param data\n * @param dimensions\n * @returns {*}\n * @constructor\n */\nexport const InnovationGraph = ({ data, dimensions }) => {\n const { nodes, links } = data;\n const svgRef = useRef(null);\n const nodeGroupRef = useRef(null);\n const linkGroupRef = useRef(null);\n const containerRef = useRef(null);\n\n const [forces, setForces] = useState([]);\n\n const colorScale = d3.scaleSequential(d3.interpolateRainbow);\n\n const centroidScale = useMemo(() => {\n const extent = d3.extent(nodes, node => node.count);\n return d3.scaleLinear().domain(extent).range([10, 10]);\n }, [nodes]);\n\n const { simulation, tick } = useForceSimulation({ forces, data: nodes, dimensions });\n useZoom({ svgRef, containerRef });\n\n useEffect(() => {\n const forces = [\n { name: 'center', force: d3.forceCenter(dimensions.width / 2, dimensions.height / 2) },\n { name: 'charge', force: d3.forceManyBody().strength(-200) },\n { name: 'x', force: d3.forceX(dimensions.width / 2).strength(.5) },\n { name: 'y', force: d3.forceY(dimensions.height / 2).strength(1) },\n { name: 'links', force: d3.forceLink(links).id(d => d.id).strength(.5).distance(17) },\n ];\n\n setForces(forces);\n }, [links, dimensions, centroidScale]);\n\n useEffect(() => {\n // render proposal nodes\n const proposals = d3.select(nodeGroupRef.current)\n .selectAll('.proposal')\n .data(nodes.filter(d => d.type === 'proposal'), d => d.label)\n .join(enter => {\n const group = enter.append('g')\n .classed('proposal', true)\n .on('mouseover', function(d) {\n d3.select(this)\n .select('circle')\n .raise()\n .transition()\n .duration(250)\n .attr('fill', 'white')\n .attr('stroke', 'white');\n\n d3.select(this)\n .select('.nodeLabel')\n .transition().duration(250)\n .style('opacity', 1.0);\n\n d3.select(nodeGroupRef.current)\n .selectAll('.category')\n .filter(c => c.id === d.parentId)\n .select('.shape')\n .transition()\n .duration(250)\n .attr('fill', 'white')\n .attr('stroke', 'white');\n\n })\n .on('mouseout', function(d) {\n d3.select(this)\n .select('circle')\n .transition()\n .duration(250)\n .attr('fill', 'black')\n .attr('stroke', 'black');\n\n d3.select(this).select('.nodeLabel')\n .transition().duration(250)\n .style('opacity', 0);\n\n d3.select(nodeGroupRef.current)\n .selectAll('.category')\n .filter(c => c.id === d.parentId)\n .select('.shape')\n .transition()\n .duration(250)\n .attr('fill', d => colorScale(d.colorIndex / d.maxParents))\n .attr('stroke', d => colorScale(d.colorIndex / d.maxParents));\n });\n\n group.append('circle')\n .attr('r', 3)\n .attr('fill', 'black')\n .attr('strokeWidth', 0.5)\n .attr('stroke', 'black');\n\n // create the labels, hidden by default\n const textGroup = group.append('g')\n .classed('nodeLabel', true)\n .attr('transform', `translate(0 -20)`)\n .style('opacity', 0)\n .style('pointer-events', 'none');\n\n // fake label so the following path can get a real size\n textGroup.append('text')\n .text(d => d.label)\n .attr('font-size', 12)\n .attr('text-anchor', 'middle')\n .attr('stroke', 'none')\n .attr('fill', 'none');\n\n // label background\n textGroup.append('path')\n .attr('d', function(d) {\n const { width, height } = d3.select(this.parentNode).select('text').node().getBBox();\n const upperLeft = [-width / 2 - 4, -height / 2 - 5];\n return `M ${upperLeft[0]},${upperLeft[1]} \n l ${width + 8},0 \n l 0,${height + 8} \n l ${-width / 2},0 \n l -4,4 \n l -4,-4 \n l ${-width / 2},0`;\n });\n\n // label itself\n textGroup.append('text')\n .text(d => d.label)\n .attr('z-index', 1)\n .attr('font-size', 12)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('stroke', 'none')\n .attr('fill', 'white');\n\n },\n update => update.attr('transform', d => `translate(${d.x} ${d.y})`),\n exit => exit.remove());\n\n // set up dragging\n proposals.call(dragHook(simulation));\n\n // render category nodes\n const categories = d3.select(nodeGroupRef.current)\n .selectAll('.category')\n .data(nodes.filter(d => d.type === 'category'), d => d.label)\n .join(enter => {\n const group = enter.append('g')\n .classed('category', true)\n .on('mouseover', function(d) {\n d3.select(this).select('.shape')\n .transition()\n .duration(250)\n .attr('fill', 'white')\n .attr('stroke', 'white');\n\n d3.select(this).select('.label')\n .transition()\n .duration(250)\n .attr('font-size', 16)\n .attr('font-weight', 'bolder');\n\n d3.select(nodeGroupRef.current)\n .selectAll('.proposal')\n .filter(p => p.parentId === d.id)\n .selectAll(\"circle\")\n .transition()\n .duration(250)\n .attr('fill', 'white')\n .attr('stroke', 'white');\n })\n .on('mouseout', function(d) {\n d3.select(this).select('.shape')\n .transition()\n .duration(250)\n .attr('fill', d => colorScale(d.colorIndex / d.maxParents))\n .attr('stroke', d => colorScale(d.colorIndex / d.maxParents));\n\n d3.select(nodeGroupRef.current)\n .selectAll('.proposal')\n .filter(p => p.parentId === d.id)\n .selectAll(\"circle\")\n .transition()\n .duration(250)\n .attr('fill', 'black')\n .attr('stroke', 'black');\n\n d3.select(this).select('.label')\n .transition()\n .duration(500)\n .attr('font-size', 12)\n .attr('font-weight', 'normal')\n .attr('fill', 'white');\n });\n\n group.append('circle')\n .classed('shape', true)\n .attr('r', d => centroidScale(d.count))\n .attr('fill', d => colorScale(d.colorIndex / d.maxParents))\n .attr('strokeWidth', 0.5)\n .attr('stroke', d => colorScale(d.colorIndex / d.maxParents));\n\n group.append('text')\n .classed('label', true)\n .text(d => d.label)\n .attr('y', d => centroidScale(d.count) + 5)\n .attr('fill', 'white')\n .attr('font-size', '12')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging');\n },\n update => update.attr('transform', d => `translate(${d.x} ${d.y})`),\n exit => exit.remove());\n\n // set up dragging\n categories.call(dragHook(simulation));\n\n }, [nodeGroupRef, linkGroupRef, data, tick, simulation, nodes, colorScale, centroidScale]);\n\n return (\n \n \n \n \n \n \n );\n};\n","/** @jsx jsx */\n// TODO: remove eslint statement when 'css' is implemented\nimport { jsx } from '@emotion/react';\n// eslint-disable-next-line no-unused-vars\nimport React from 'react';\n\n/**\n * Custom renderer for the controls available to change the chart settings.\n *\n * Data Properties for this Widget:\n * -- propertyList\n * -- limit\n *\n * Chart Properties for this Widget:\n *\n * @param chartConfiguration\n * @param updateConfiguration\n * @returns {*}\n * @constructor\n */\nexport const InnovationGraphKnobs = ({\n cardIndex,\n endpointQuery,\n widgetConfiguration,\n }) => {\n return (\n \n \n );\n};\n","import { propertyHierarchy } from 'slykit';\nimport { PropertyFlag as SrsPropertyFlag } from 'srs-middleware';\nimport { InnovationGraphWrapper } from './wrapper';\nimport { InnovationGraphKnobs } from './knobs';\nimport { filterProperties } from \"slykit\";\n\nconst flags = [SrsPropertyFlag.Categorical];\n\nexport const config = {\n key: \"INNOVATION\",\n label: 'Innovation',\n icon: 'graph',\n wrapper: InnovationGraphWrapper,\n endpoint: propertyHierarchy,\n Knobs: InnovationGraphKnobs,\n flags: flags,\n createDefaultOptions: () => {\n return {\n options: {\n propertyList: [\n \"Category\",\n \"Title\"\n ],\n parameters: {\n maxValues: 1000,\n },\n },\n };\n },\n isValid: (selectedDefinitionName) => {\n return filterProperties(selectedDefinitionName, flags).length >= 2;\n },\n};\n","import React, { useEffect, useState } from 'react';\nimport { InnovationGraph } from './index';\nimport { NonIdealState } from '@blueprintjs/core';\n\n/**\n * ChartWrapper for the physics based clustering diagram.\n *\n * Expects: [{count, labels:['term'...]}]\n * Converts: [nodes: [], links: [{source, target}]]\n *\n * @param widgetConfiguration\n * @param dimensions\n * @param data\n * @returns {*}\n * @constructor\n */\nexport function InnovationGraphWrapper({widgetConfiguration, loading, dimensions, data}) {\n const [convertedData, setConvertedData] = useState({nodes: [], links: []});\n\n useEffect(() => {\n const nodes = [];\n const links = [];\n\n // empty data is \"valid\" and different than null.\n if (data?.values?.length === 0) {\n setConvertedData({nodes: [], links: []});\n }\n\n // the data is null, or in the wrong shape...so we exit\n if (!data || !data?.values)\n return;\n\n // for each cluster, create a parent node\n data.values.forEach(({size, value, values, weight}, i) => {\n const parent = {label: value, type: \"category\", colorIndex: i, id: i, maxParents: data.values.length, count: size, weight };\n nodes.push(parent);\n\n // create a child node for each term in the cluster and link to parent\n values.forEach(({size, value, values, weight}) => {\n const child = {label: value, type: \"proposal\", count: 1, colorIndex: i, maxParents: data.values.length, parentId: i};\n nodes.push(child);\n links.push({source: parent, target: child});\n });\n });\n\n setConvertedData({nodes, links});\n }, [data]);\n\n return (\n (convertedData?.nodes?.length > 0)\n ? \n : \n );\n}\n","import widgetConfigurations from '../configurations/widgetConfigurations.json';\nimport { filterInWidgets, WIDGET_TYPES, WIDGETS } from 'slykit';\nimport { config } from '../widgets/innovation/config';\n\n/**\n * Loads the application configuration information from files.\n *\n * @returns {object}\n */\nexport function useLoadApplicationSpecificStateLocal() {\n\t// inject local vis\n\tWIDGET_TYPES['INNOVATION'] = 'INNOVATION';\n\tWIDGETS[WIDGET_TYPES.INNOVATION] = config;\n\n\tconst wantedWidgets = [\n\t\tWIDGET_TYPES.TYPOGRAPH,\n\t\tWIDGET_TYPES.CUSTOM_CIRCLE_PACK,\n\t\tWIDGET_TYPES.BIPARTITE_GRAPH,\n\t\tWIDGET_TYPES.DONUT_GRAPH,\n\t\tWIDGET_TYPES.TABLE,\n\t\tWIDGET_TYPES.STACKED_BAR_GRAPH,\n\t\tWIDGET_TYPES.PARACORD,\n\t\tWIDGET_TYPES.NETWORK_GRAPH,\t\n\t\tWIDGET_TYPES.POLAR_AREA,\n\t\tWIDGET_TYPES.TREE_MAP,\n\t\tWIDGET_TYPES.NODE_GRAPH,\n\t];\n\n\t// widget order is a new default for all docs projects\n\tconst widgetOrder = [\n\t\t// WIDGET_TYPES.TREE_MAP,\n\t\tWIDGET_TYPES.TYPOGRAPH,\n\t\tWIDGET_TYPES.CUSTOM_CIRCLE_PACK,\n\t];\n\n\t// currently using all of the widgets\n\tlet widgets = filterInWidgets(\n\t\twantedWidgets,\n\t\twidgetConfigurations,\n\t\twidgetOrder\n\t);\n\n\treturn {\n\t\tsavedStates: {\n\t\t\twidgets: widgets.reduce(\n\t\t\t\t(map, obj) => ({\n\t\t\t\t\t...map,\n\t\t\t\t\t[obj.key]: obj,\n\t\t\t\t}),\n\t\t\t\t{}\n\t\t\t),\n\t\t},\n\t};\n}\n","import { css } from '@emotion/react';\n\nexport const flexChildrenV = css`\n display: flex;\n flex-direction: column;\n`;\nexport const flexChildrenH = css`\n display: flex;\n flex-direction: row;\n`;\nexport const flexStay = css`\n flex-grow: 0;\n flex-shrink: 0;\n`;\nexport const flexAdapt = css`\n flex-grow: 1;\n flex-shrink: 1;\n flex-basis: 0;\n overflow: hidden;\n`;\n\nexport const backgroundStyles = (publicURL) => css`\n background-image: url(\"${publicURL}bg.png\");\n background-repeat: no-repeat;\n background-attachment: fixed;\n background-position: top;\n background-size: contain;\n background-color: #003467;\n `;\n\nexport const centerSelf = css`\n transform: translate(-50%, -50%);\n top: 50%;\n left: 50%;\n position: relative;\n`;\n\nexport const centerContent = css`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const centerContentVertically = css`\n display: flex;\n align-items: center;\n`;\n","/** @jsx jsx */\nimport { css, jsx } from '@emotion/react';\nimport {\n\tClasses,\n\tH3,\n\tIcon,\n\tNavbar,\n\tNavbarGroup,\n\tNavbarHeading,\n\tAlignment,\n\tTooltip\n} from '@blueprintjs/core';\nimport { useMediaQuery } from 'react-responsive'; \nimport { NetworkConfigContext } from 'slykit';\nimport logo from '../../images/virus-pixabay.png';\nimport serberus from '../../images/Serberus.svg';\nimport { backgroundStyles } from '../../styles/styledComponentUtils';\nimport { useContext } from 'react';\nimport styled from '@emotion/styled';\n\n/**\n * Navigation bar for Serberus.\n *\n * @returns {*}\n * @constructor\n */\nexport const Navigation = () => {\n\tconst config = useContext(NetworkConfigContext);\n\tconst BigView = ({ children }) => {\n\t\tconst isDesktop = useMediaQuery({ minWidth: 1020 })\n\t\treturn isDesktop ? children : null\n\t}\n\tconst SmallView = ({ children }) => {\n\t\tconst isTablet = useMediaQuery({ minWidth: 500, maxWidth: 1019 })\n\t\treturn isTablet ? children : null\n\t}\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t} />\n\t\t\t\t\t\n\t\t\t\t\t\tPublication Literature Analysis and Text Interaction Platform for User Studies\n\t\t\t\t\t\tPLATIPUS\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t

Publication Literature Analysis and Text Interaction Platform for User Studies (PLATIPUS) research was supported by the DOE Office of Science through the National Virtual Biotechnology Laboratory, a consortium of DOE national laboratories focused on response to COVID-19, with funding provided by the Coronavirus CARES Act.

}>\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t} />\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst NavBarStyled = styled(Navbar)`\n\t${({ publicURL }) => backgroundStyles(publicURL)};\n\tborder-bottom: 1px solid rgba(255, 255, 240, 0.1);\n\tbox-shadow: none !important;\n\tflex: 0 0 auto;\n\tpadding-left: 8px;\n`;\n","/** @jsx jsx */\nimport React, { useCallback } from 'react';\nimport { DocumentsList, DocumentViewer, HighlightWorkspaceTerms, formatDate } from 'slykit';\nimport { AnchorButton, Tag, Intent, Tooltip } from '@blueprintjs/core';\nimport * as ellipsize from 'ellipsize';\nimport { css, jsx } from '@emotion/react';\nimport * as d3 from 'd3';\n\nconst scoreScale = d3\n\t.scaleLinear()\n\t.domain([0, 0.5, 1])\n\t.range(['red', 'yellow', 'green']);\n\n/**\n *\n * @returns {*}\n * @constructor\n */\nexport const PlatipusList = () => {\n\tconst properties = ['Title', 'Published', 'Journal', 'Link', 'Abstract'];\n\n\tconst Row = useCallback(({ item, onSelect }) => {\n\t\tconst { Title, Published, Journal, Abstract } = item;\n\n\t\treturn (\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{formatDate(Published)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{Journal}\n\t\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t);\n\t}, []);\n\n\tconst SubTitle = useCallback(({ item }) => {\n\t\tconst { Published, Journal } = item.propertyValues ?? {};\n\t\tconst published = formatDate(Published);\n\t\treturn (\n\t\t\t\n\t\t\t\tPublished {published} in {Journal}\n\t\t\t\n\t\t);\n\t}, []);\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst small = css`\n\tflex: 0 0 auto;\n`;\n\nconst published = css`\n\tdisplay: inline-flex;\n\talign-items: center;\n\toverflow: hidden;\n`;\n\nconst journal = css`\n\tfont-style: italic;\n\tmin-width: 0;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\toverflow: hidden;\n`;\n\nconst titleStyle = css`\n\t${small};\n\tfont-size: 14px;\n\tfont-weight: bold;\n\t/* overflow: hidden; */\n\t/* text-overflow: ellipsis; */\n\t/* display: flex; */\n\tpadding-bottom: 6px;\n\n\tspan {\n\t\t/* white-space: nowrap !important; */\n\t\t/* text-overflow: ellipsis; */\n\t\t/* min-width: 0; */\n\t\t/* overflow: hidden; */\n\t}\n`;\n\nconst textStyle = css`\n\t${small};\n\tfont-size: 12px;\n\tfont-weight: lighter;\n`;\n\nconst detailsStyle = css`\n\t${small};\n\tdisplay: flex;\n\tflex-direction: row;\n`;\n","import React, {useContext, useRef} from 'react';\nimport {PlatipusList} from \"./PlatipusList\";\nimport {WIDGET_TYPES, DocumentsExplorer} from \"slykit\";\nimport {LoginContext} from \"../../app\";\n\n/**\n * PLATIPUS specific instance of a Documents Explorer.\n *\n * @returns {null|*}\n * @constructor\n */\nexport const PlatipusExplorer = () => {\n const isReady = useContext(LoginContext);\n const out = useRef([WIDGET_TYPES.INNOVATION]);\n\n return (\n }\n widgetOutFilter={out.current}/>\n )\n};\n\n","/** @jsx jsx */\nimport { Global, css, jsx } from '@emotion/react';\nimport { createContext, useMemo } from 'react';\nimport { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom';\nimport { NonIdealState } from '@blueprintjs/core';\nimport {\n\tConfigFetcher,\n\tLoginScreen,\n\tSlykitContext,\n\tuseApplicationState,\n\tuseFocusedSessionPolling,\n\tuseSlykit,\n} from 'slykit';\nimport { useLoadApplicationSpecificStateLocal } from './hooks/useLoadApplicationSpecificStateLocal';\nimport { Navigation } from './views/navigation';\nimport { PlatipusExplorer } from './views/explorer/PlatipusExplorer';\nimport logo from './images/corona-virus-pixabay-bw.png';\n\nexport const LoginContext = createContext(false);\n\nconst _404 = () => ;\n\nexport function Root() {\n\treturn (\n\t\t{({ config }) => }\n\t);\n}\n\nfunction App({ config }) {\n\tconst { isReady, authenticate, error } = useSlykit(\n\t\tconfig.hostName,\n\t\tconfig.path,\n\t\t{ noAnonymous: config.noAnonymous }\n\t);\n\n\t// initialize the application specific data\n\tconst initialState = useLoadApplicationSpecificStateLocal();\n\n\t// set up state management\n\tconst [state, dispatch] = useApplicationState(initialState);\n\n\t// memoize the values\n\tconst contextValue = useMemo(() => {\n\t\treturn { state, dispatch };\n\t}, [state, dispatch]);\n\n\t// Because this app only has explorers we only need auth then the user is focused on the page\n\tuseFocusedSessionPolling();\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{ isReady && \n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t}\n\t\t\t\t\t{ !isReady && \n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t

Loading PLATIPUS...

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t{ config.noAnonymous &&\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t);\n}\n\nconst Title = () => {\n\treturn '';\n};\n\nconst layout = css`\n\tdisplay: flex;\n\tflex-flow: column;\n\tflex: 1 1 auto;\n`;\nconst logoStyle = css`\n\tposition: absolute;\n\tleft: 40%;\n\ttop: 40%;\n\twidth: 20%;\n\topacity: 0.2;\n`;\n","// @ts-ignore\nimport { get, SESSION_END_POINTS } from 'srs-middleware';\nimport { useEffect } from 'react';\n\n/**\n * Keeps the session alive while the user is focused on the page and checks auth\n * when the user returns to the page\n * @param intervalMinutes - Delay between checking authentication state\n */\nexport function useFocusedSessionPolling(intervalMinutes = 10) {\n\n // Check authentication if user is focused on page\n\tuseEffect(() => {\n\t\tconst timer = setInterval(() => {\n\t\t\tif (document.hidden) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait get(SESSION_END_POINTS.Current);\n\t\t\t\t} catch (e) {}\n\t\t\t})();\n\t\t}, intervalMinutes * 60 * 1000);\n\t\treturn () => {\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, [intervalMinutes]);\n\n\t// Test session validity when user returns to the page\n\tuseEffect(() => {\n\t\tconst handler = () => {\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait get(SESSION_END_POINTS.Current);\n\t\t\t\t} catch (e) {}\n\t\t\t})();\n\t\t};\n\t\twindow.addEventListener('focus', handler);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('focus', handler);\n\t\t};\n\t}, [intervalMinutes]);\n}\n\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Root } from './app';\nimport { FocusStyleManager } from '@blueprintjs/core';\n\nimport './styles/index.scss';\n\n// Hides CSS outline unless tab character is used.\nFocusStyleManager.onlyShowFocusOnTabs();\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""}