{"version":3,"sources":["core/Sys.ts","mustangui/Api.tsx","coreui/Icon.tsx","coreui/Button.tsx","coreui/Typography.tsx","core/AppServer.ts","stores/PaneDataStore.ts","stores/RequestsStore.ts","core/TrackableModel.ts","core/Logging.ts","mustangui/CaptchaControl.tsx","services/ActionButtonService.ts","mustangui/ApiButton.tsx","mustangui/ActionButtons/ConfirmationDialog.tsx","mustangui/ActionButtons/CustomActionButton.tsx","mustangui/ActionButtons/DeletePresentationButton.tsx","mustangui/ActionButtons/DeleteRowButton.tsx","mustangui/ActionButtons/NewRowButton.tsx","mustangui/ActionButtons/SavePresentationButton.tsx","coreui/Collapse.tsx","coreui/Paper.tsx","mustangui/WizardControl.tsx","mustangui/ActionButtons/WizardNextButton.tsx","mustangui/ActionButtons/WizardPreviousButton.tsx","mustangui/ActionButton.tsx","mustangui/BrandingImageDisplay.tsx","mustangui/CardControl.tsx","coreui/FormHelperText.tsx","coreui/FormControl.tsx","coreui/FormControlLabel.tsx","mustangui/Checkbox.tsx","core/SubscribeEvent.ts","coreui/Chip.tsx","mustangui/GridNewRowChip.tsx","coreui/ErrorTooltip.tsx","coreui/RowErrorBadge.tsx","coreui/table/FullWidthRenderer.tsx","coreui/table/SelectionHeader.tsx","coreui/table/CellUtil.tsx","coreui/table/SelectionRenderer.tsx","coreui/Table.tsx","coreui/table/AsyncData.tsx","coreui/ErrorBadge.tsx","coreui/table/CellFocusUtil.tsx","mustangui/Columns/CheckBoxColumn.tsx","mustangui/Columns/ComponentTypeDisplayColumn.tsx","coreui/IconWithLink.tsx","coreui/ImageWithLink.tsx","coreui/Thumbnail.tsx","services/DocumentService.ts","mustangui/Columns/DataImageDisplayColumn.tsx","mustangui/Columns/DataLinkColumn.tsx","mustangui/DateEdit.tsx","coreui/Input.tsx","mustangui/Columns/DateEditColumnDialog.tsx","mustangui/Columns/DateEditColumnEdit.tsx","coreui/TextField.tsx","coreui/MultilineTextFieldDialog.tsx","mustangui/Columns/TextColumn.tsx","mustangui/Columns/DateEditColumn.tsx","mustangui/DomainComboBox.tsx","mustangui/Columns/DomainComboBoxColumnDisplay.tsx","mustangui/Columns/DomainComboBoxColumnEdit.tsx","mustangui/Columns/IconDisplayColumn.tsx","mustangui/Columns/ManualLinkColumn.tsx","mustangui/Columns/SLTextEditColumnEdit.tsx","mustangui/Columns/MLTextEditColumnEdit.tsx","mustangui/NumericEdit.tsx","mustangui/Columns/NumericEditColumn.tsx","mustangui/Columns/NumericEditColumnEdit.tsx","mustangui/Columns/RelationshipComboBoxColumnDisplay.tsx","mustangui/Columns/RelationshipComboBoxColumnEdit.tsx","mustangui/Columns/GridColumn.tsx","mustangui/Columns/TableEditDialog.tsx","mustangui/GridRelatedEditButton.tsx","mustangui/ComplexGridControl.tsx","mustangui/ComponentTest.tsx","coreui/FormData.tsx","mustangui/ComponentTypeDisplay.tsx","mustangui/DashboardCriteria.tsx","mustangui/DashboardGridControl.tsx","mustangui/DataImageDisplay.tsx","mustangui/DataLink.tsx","mustangui/DividerDisplay.tsx","mustangui/DocumentEdit.tsx","mustangui/FreeflowContainerItem.tsx","mustangui/FreeflowContainerGroup.tsx","mustangui/FreeflowContainerSection.tsx","mustangui/Freeflow.tsx","coreui/Grow.tsx","mustangui/ToolbarInputWrapper.tsx","mustangui/GridFilter.tsx","mustangui/GridPager.tsx","mustangui/GridSelectedCount.tsx","mustangui/GroupHeading.tsx","mustangui/IconDisplay.tsx","mustangui/IconDisplayVerticalLayout.tsx","coreui/MenuItemDisplay.tsx","mustangui/MenuButton.tsx","mustangui/LanguageSelect.tsx","mustangui/ManualLink.tsx","mustangui/Media.tsx","mustangui/PresentationButton.tsx","mustangui/MenuItem.tsx","mustangui/MenuPane.tsx","coreui/MultilineTextField.tsx","mustangui/MLTextEdit.tsx","coreui/FormLabel.tsx","coreui/RadioGroup.tsx","mustangui/ApiRadio.tsx","mustangui/RadioSelect.tsx","mustangui/RelationshipComboBox.tsx","mustangui/ResponsiveGrid.tsx","mustangui/SearchButton.tsx","mustangui/SelectControl.tsx","mustangui/SelectControlSelectedGrid.tsx","mustangui/SelectDialogResultsGrid.tsx","coreui/table/UploadDialog.tsx","coreui/table/DocumentDropArea.tsx","stores/DocumentStore.ts","mustangui/SimpleGridControl.tsx","mustangui/SubPane.tsx","mustangui/SubPaneControl.tsx","coreui/ExpansionPanel.tsx","coreui/Tab.tsx","coreui/TabScrollButton.tsx","coreui/Tabs.tsx","mustangui/TabControl.tsx","mustangui/TableExport.tsx","mustangui/TablePrint.tsx","mustangui/TableSort.tsx","mustangui/TableSummary.tsx","mustangui/TextCriteria.tsx","mustangui/TextDisplay.tsx","mustangui/ThumbnailDisplay.tsx","mustangui/Toolbar.tsx","mustangui/ToolbarContainerGroup.tsx","mustangui/ToolbarContainerItem.tsx","mustangui/ToolbarContainerOverflowItem.tsx","mustangui/ToolbarContainerOverflowSection.tsx","mustangui/ToolbarContainerSection.tsx","mustangui/WizardStepNumberDisplay.tsx","coreui/Step.tsx","mustangui/WizardStepsDisplay.tsx","templates/components/ThemeWrapper.tsx","coreui/Presentation.tsx","coreui/Menu.tsx","models/PaneRow.ts","services/RoundTripService.ts","services/BaseService.ts","coreui/MenuItem.tsx","services/UserService.ts","coreui/InformationBadge.tsx","core/Routing.ts","core/TrackableCollection.ts","services/PresentationService.ts","coreui/Hidden.tsx","mustangui/GridItem.tsx","coreui/Dialog.tsx","mustangui/ErrorBoundary.tsx","coreui/Link.tsx","mustangui/Grid.tsx","muiTheme.ts","coreui/InputAdornment.tsx","templates/styles/CenteredContentClasses.ts","coreui/DialogContent.tsx","coreui/ProcessingMask.tsx","config/Layout.tsx","coreui/Drawer.tsx","pages/AuthenticatedPage.tsx","pages/GuestPage.tsx","coreui/KeyboardNavigationGroup.tsx","coreui/DialogActions.tsx","coreui/Fade.tsx","stores/MaskingStore.ts","coreui/GridItem.tsx","services/NewObjectService.ts","stores/LayoutStateStore.ts","mustangui/Panel.tsx","coreui/EditMask.tsx","mustangui/EmbeddedAddOn.tsx","coreui/Grid.tsx","mustangui/ApiSelect.tsx","core/RequestPromise.ts","templates/styles/PaperClasses.ts","templates/ErrorPageTemplate.tsx","pages/ErrorPage.tsx","templates/components/ConfirmContinueDialog.tsx","templates/BasePageTemplate.tsx","coreui/SnackbarContent.tsx","templates/components/EnvironmentBanner.tsx","templates/components/Logo.tsx","coreui/IconButton.tsx","coreui/Select.tsx","stores/ConfirmContinueStore.ts","coreui/Toast.tsx","templates/LandingPageTemplate.tsx","pages/LandingPage.tsx","mustangui/SessionMessageDisplay.tsx","templates/components/BackgroundImage.tsx","templates/components/PageProcessing.tsx","coreui/CircularProgress.tsx","pages/Logon.tsx","coreui/PasswordField.tsx","mustangui/SLTextEdit.tsx","coreui/Tooltip.tsx","core/WithForwardedRef.tsx","coreui/Snackbar.tsx","stores/CustomIconStore.ts","services/CustomIconService.ts","core/Monitor.ts","models/Credentials.ts","services/SystemConfigService.ts","index.tsx"],"names":["Sys","currentNextId","config","handler","targetElement","key","JSON","stringify","keyListeners","has","document","getElementById","window","listener","event","keyboardEvent","result","ctrlKey","altKey","shiftKey","repeat","stopPropagation","preventDefault","returnValue","cancelBubble","set","addEventListener","dataId","name","rowKey","row","PaneRow","get","getWidget","properties","businessErrors","length","message","rows","widgets","hideToast","messages","gridErrorCountByKey","error","gridErrors","widget","isColumnWidget","push","description","parentGridDescription","parentGridKey","gridError","count","hasOwnProperty","translationArgs","errorTemplate","getTranslation","showToast","Presentation","create","children","Api","getErrorMessages","props","color","component","variant","type","clearErrors","requestCacheKey","request","requestCacheStorage","getRequestCache","responseText","setItem","cookiePath","exception","clearRequestCache","Logging","log","addRequestCacheItem","announcer","innerText","setTimeout","deleteCount","done","forEach","businessError","index","some","widgetName","clearWidgetErrors","splice","updateErrorDisplay","reload","requestCache","clear","Object","keys","startsWith","removeItem","location","clearState","promise","Promise","resolve","reject","ignoreChanges","EmbeddedAddOnBase","instances","embeddedAddOn","roundTripStarting","hasChanges","ConfirmContinueStore","instance","openDialog","then","AppServer","catch","method","deferPeriod","scope","args","call","cookie","encodeURIComponent","dateValue","format","date","Date","toLocaleString","fraction","dayNames","settings","days","dayAbbreviations","monthNames","months","monthAbbreviations","replace","getFullYear","toString","slice","getMonth","getDate","getHours","hh","getMinutes","getSeconds","match","exec","getMilliseconds","substr","getDay","cookies","split","cookieParts","trim","decodeURIComponent","asObject","hash","queryStringToObject","baseToken","getRouteToken","Map","localStorage","getItem","authenticated","getCookie","sessionTokenCookie","url","currentHash","getHash","filter","p","toLowerCase","offset","parts","indexOf","traceKey","prompt","setTraceKey","alert","text","context","translations","contextTranslations","regx","matches","arg","object1","object2","property","topPaneUseKey","items","Array","from","TrackableModel","models","values","item","Toast","current","close","useConfiguredAuthentication","Routing","isNonConfiguredAuthenticationSessionExpiredRoute","sessionMessages","BaseService","TrackableCollection","getRouteRootToken","goToErrorPage","RequestsStore","clearAllProcessing","isEdge","dataTransfer","dropEffect","body","onbeforeunload","onBeforeUnload","onscroll","MenuBase","closeAll","ApiSelectBase","SelectBase","onresize","loadMonitor","monitor","Monitor","monitorKey","addKeyHandler","show","requestCacheClearKey","languageCode","setHash","deleteCookie","guestSessionTokenCookie","setCookie","SystemConfigService","loadConfig","currentCredentials","Credentials","register","initialize","script","scripts","add","eval","addScript","loadScript","object","map","isNaN","parseInt","join","readyState","queryString","includes","getRequestCacheKey","hasRequestCacheItem","removeEventListener","delete","clearMessages","widgetErrors","value","expires","today","toUTCString","merge","replaceHash","ignoreHashChanges","hashString","href","history","replaceState","objectToQueryString","assign","traceKeyCookie","errors","m","createBusinessError","unshift","light","icon","horizontalPosition","verticalPosition","duration","closeHandler","render","anchorOrigin","horizontal","vertical","autoHideDuration","this","confirm","getTraceKey","pathname","baseUrl","fileUrl","isChrome","navigator","userAgent","isFirefox","isMobile","isSafari","lastHash","loadArgs","modelNameSpace","alt","ctrl","shift","requestId","Set","scriptUrl","sessionExpirationTimeout","availableLanguages","baselineGridSize","colorPalette","currentLanguageCode","dateFormat","decimalSeparator","enableEmailAuthentication","environmentBannerColor","externalAuthenticators","iconName","providerName","favIcon","nonProdEnvironment","reCaptchaSiteKey","rootUrl","showErrorDetails","siteName","thousandsSeparator","observable","AccessLevel","justification","style","nextId","className","float","marginTop","fixedWidth","fontSize","marginLeft","list","getErrorMessage","marginBottom","undefined","colorName","colors","danger","information","success","warning","warn","textStyle","widgetObservable","getObservable","getReadOnlyProperties","cleanColor","lastIndexOf","substring","materialUiColorNameMapping","colorShade","widgetProperties","getWidgetProperties","hidden","disabled","readOnly","actionable","enterable","Error","errorElement","overflow","whiteSpace","amber","blue","bluegrey","brown","cyan","deeporange","deeppurple","green","grey","indigo","lightblue","lightgreen","lime","orange","pink","purple","red","teal","yellow","Icon","React","constructor","super","initialized","fontAwesomeLibrary","fab","fad","far","fas","state","customIconContents","setState","CustomIconStore","iconForName","contents","componentDidMount","updateCustomIconContents","componentDidUpdate","prevProps","prevState","classes","fullHeight","iconProps","child","childClasses","adjustSvgWidth","fullHeightSvg","customSvg","aria-hidden","dangerouslySetInnerHTML","__html","role","iconNameParts","iconPrefix","adjustWidth","rootClasses","root","withStyles","theme","createStyles","display","width","fill","height","pointerEvents","verticalAlign","Button","_props","isFab","label","badge","marginRight","iconClass","fabIcon","size","fabIconMedium","customSize","fabIconTiny","tiny","endIcon","fullWidth","fabProps","minHeight","backgroundColor","darken","getSystemColor","palette","getContrastText","dark","textOverflow","minWidth","Typography","ellipsis","flex","otherProps","ellipsisClass","flexClass","rootClass","otherClasses","classNames","pane","panes","stateRecoveryPoint","stateRecoveryPointCreated","hasDataChanges","RecordChange","PaneDataStore","model","changedRecords","deletedRowKeys","getDeleted","getPrimaryKey","allModels","isModified","record","getModifiedPropertyValues","staticInstance","itemsToCheck","trackables","clearDeleted","getDataChanges","trackableCollection","observableCollection","paneData","clearDeletedRows","load","existingPane","panesByDataId","lastLoadingToMatchDate","lastRetrieved","moment","toDate","paneUseKey","data","collection","paneRow","updateWidget","addPane","toMatchDate","getPane","setLoadingToMatchDate","disableRestoreFocus","processing","isNew","isProcessing","pendingRequestCount","processingStarted","isNewPage","processingStopped","computed","acceptChanges","modelName","deleted","primaryKeyNames","trackable","revertValues","defaultValues","initialValues","isLoaded","isTrackableNew","loadOnce","trackUndo","propertyName","getPropertyNames","getPropertyValue","revertToDefaultValues","getDefaultValue","getInitialValue","primaryKeyName","getPrimaryKeyName","propertyNameUnderscore","loadData","setPropertyValue","revertValue","setProperty","setDefaultValue","setPrimaryKeyName","initialValue","propName","showFunctions","shallow","delimiter","limit","delim","member","members","getMembers","addMessage","console","group","logMessage","arguments","groupCollapsed","groupEnd","CaptchaControl","responseToken","reset","isGuest","reCaptcha","createElement","setAttribute","head","appendChild","token","componentWillUnmount","querySelectorAll","remove","iframe","siteKey","data-callback","data-expired-callback","data-sitekey","ActionButtonService","propagated","parentTable","hasRelatedEditDialog","createStateRecoveryPoint","RoundTripService","customRoundTrip","response","validationErrors","showErrors","clearStateRecoveryPoint","appServerState","clearBusinessErrors","loadResponse","paneDataByDataId","setBusinessErrors","newRowData","newRowPaneDataByDataId","newRowDataId","insert","populateData","openRowEditDialog","scrollToRow","finally","selectedRowKeys","captchaResponseToken","CaptchaControlBase","standardRoundTrip","newSessionMessages","newObjectId","NewObjectService","navigateToNewObject","layoutId","ApiButton","observer","muiProps","anchorElement","buttonRef","onClick","tabIndex","target","buttonColor","alternateText","renderLink","renderAsLink","renderButtonOrLink","buttonProps","Link","aria-label","setAccessLevel","InformationBadge","disabledHelpText","withWidth","ConfirmationDialog","dangerColor","isDanger","continueButtonColor","Dialog","fullScreen","onClose","onCancel","open","isOpen","DialogContent","Grid","grouping","lg","md","sm","xs","GridItem","xl","title","DialogActions","autoFocus","continueButtonIcon","onContinue","continueButtonText","cancelButtonText","CustomActionButton","parentRowKey","gridApi","getApi","selection","getSelectedRows","forEachNode","r","i","getPinnedTopRowCount","getPinnedTopRow","onRoundTrip","runtimeProperties","saved","ActionButton","showSavedToast","validateCaptcha","configProps","runtimeProps","runtime","isConfirmDialogOpen","setIsConfirmDialogOpen","accessLevel","confirmMessage","Drawer","onAcceptConfirm","onCancelConfirm","useObserver","isValid","indent","onClickPromise","abort","DeletePresentationButton","DeleteRowButton","parentSelect","objectHandles","isVerticalLayout","parentRowObjectHandle","objectHandle","onRowsRemoved","deleteRow","contentDataId","menuStyles","makeStyles","input","cursor","left","opacity","position","top","NewRowButton","onChange","files","uploadFiles","paginationGoToFirstPage","onNewRow","uploadOnNew","extensions","validExtensions","extension","onFocus","e","nodeName","querySelector","focus","accept","multiple","uploadInput","SavePresentationButton","Collapse","collapse","toggle","hasExpanded","onCollapse","node","onCollapseEnd","onExpand","isAppearing","onExpandStart","in","addInstance","ReactDOM","container","onEnter","onEntering","onExited","onExiting","transition","transitions","Paper","groups","switching","paper","hide","visible","isSwitching","fade","CollapseBase","blended","card","cardDepth","margin","paperProps","paperChildren","cardAlternate","elevation","Fade","timeout","displayStyle","flexGrow","paperHidden","common","white","breakpoints","only","padding","up","WizardControl","scrollToPageTop","clearAllDataChanges","isOnLastStep","ActionButtonBase","scrollTo","steps","step","selectedPaneUseKey","navigationDirection","_response","finishNavigate","navigationPaneUseKey","findIndex","s","dataMonitorDisposer","lastRetrievedPaneDate","loadedPaneUseKeys","retrieveDataPromises","dataMonitor","parentPane","retrievePromise","LayoutStateStore","setSelectedStep","activeStep","find","t","renderSelectedStepPane","selectedStep","stepContents","paneUse","autorun","ErrorBoundary","boxSizing","WizardNextButton","WizardControlBase","gotoNextStep","getStepCount","last","getStepNumber","getSteps","Hidden","xsDown","smUp","WizardPreviousButton","gotoPreviousStep","buttonAction","renderMenuItem","alignItems","BrandingImageDisplay","imageHeight","imageWidth","src","imageUrl","maxWidth","CardControl","headerToolbar","verticalLayout","getPaneCollection","cards","selectionToolbar","content","FormHelperText","FormControl","formHelperTextProps","FormHelperTextProps","helperText","FormControlLabel","Checkbox","checkboxProps","checkedIcon","TouchRippleProps","ripple","showSubPane","isPaneController","paneName","controlledPaneName","getValue","PaperBase","checked","control","setBinding","setHelperText","roundTripOnChange","setValue","withTheme","SubscribeEvent","callbacks","callback","dispatchEvent","Chip","GridNewRowChip","borderColor","borderStyle","borderWidth","zIndex","ErrorTooltip","tooltip","tooltipPlacementBottom","RowErrorBadge","ClickAwayListener","onClickAway","enterTouchDelay","FullWidthRenderer","onTableReady","isTableReady","tableProps","newChip","id","print","selectToolbarChild","SelectionHeader","setAllSelected","isSelectAllEnabled","selectedCount","getSelectedCount","api","rowCount","getModel","getRowCount","CellUtil","disableNavigationKeys","params","customNavigationKeys","currentPage","paginationGetCurrentPage","paginationGetTotalPages","paginationGoToNextPage","firstRow","getFirstDisplayedRow","setFocusedCell","column","paginationGoToPreviousPage","lastRow","getLastDisplayedRow","cell","disableCellNavigation","action","SelectionRenderer","onCellKeyDown","customizeGridNavigation","isChecked","setRowsSelected","runOnAction","eGridCell","setReadOnlyAttribute","refresh","forceUpdate","isRowSelected","Table","allPageSize","columnResizedTimeout","componentDidUpdateTimeout","footerToolbar","gridContainerRef","gridSizeChangedTimeout","isKeyboardNavigatingCells","lastRowErrors","lastRowsData","lastUploadFilesCount","noData","populateDataTimeout","populateDataWaitRenderTimeout","progressBars","removeRowErrorsTimeout","rowErrors","selectedRows","selectToolbar","summaryToolbar","updateLayoutTimeout","updateRowHeightTimeout","uploadFilesDisposer","agProps","gridWidth","lastSelectedRows","minRowHeight","columnApi","stopEditingWhenGridLosesFocus","onBlur","currentTarget","contains","relatedTarget","HTMLElement","stopEditing","isFocused","onFocusTabbableElement","lastFocusedCell","getFocusedCell","pinnedRowCount","minRow","maxRow","rowPinned","rowIndex","firstRowIndex","firstColumn","getAllDisplayedColumns","onKeyDown","getEditingCells","getDisplayedRowAtIndex","isEmpty","selectionToolbarVisible","setPopulate","fileInfo","uploadProgress","file","status","fullWidthChild","finalizedFiles","f","newestFile","setRestoreLostFocus","restoreLostFocus","setScrollToRow","initialPageSize","scrollToTop","isMultiSelect","rowSelection","disableSelectAll","setStopEditingWhenGridLosesFocus","updateRowHeight","tableKey","animateRows","cacheQuickFilter","columnDefs","rowHeight","getColumnApi","hasHorizontalScrollBar","clientWidth","scrollWidth","columns","cellEditorParams","cellRendererParams","cellClass","colId","headerClass","resizable","sortable","suppressMovable","suppressNavigable","suppressSizeToFit","domLayout","ensureDomOrder","getRowNodeId","headerHeight","fullWidthCellRendererFramework","fullWidthCellRendererParams","isFullWidthCell","rowStyle","border","scrollbarWidth","pagination","paginationPageSize","rowClassRules","singleClickEdit","cellEdit","sortingOrder","suppressClickEdit","suppressColumnVirtualisation","suppressDragLeaveHidesColumns","suppressLoadingOverlay","suppressNoRowsOverlay","suppressPaginationPanel","suppressRowHoverHighlight","unSortIcon","suppressKeyboardEvent","which","cellRendererFramework","cellStyle","headerComponentFramework","headerComponentParams","lockPosition","pinned","concat","rowDeselection","rowMultiSelectWithClick","suppressRowClickSelection","onBodyScroll","onCellFocused","forceBrowserFocus","onColumnResized","getColDef","finished","sizeColumnsToFit","clearTimeout","doLayout","onDragStopped","refreshCells","force","refreshHeader","onFilterChanged","updateNoData","getDisplayedRowCount","onGridReady","createToolbars","isGridReady","updateClasses","onGridSizeChanged","updateLayout","clientHeight","onPaginationChanged","newPage","onSelectionChanged","updateSelection","addNewIndicator","pinnedTop","eTop","rowNode","chip","createWithTheme","addProgressBar","progressBar","positionProgressBar","addRowError","centerColumns","eBodyViewport","rowError","positionRowError","propagatedProps","headerToolbarChild","footerToolbarChild","summaryToolbarChild","getErrorCount","getTableErrors","ignoreBusinessErrors","dataSerialized","toJS","showNoData","resetPageOnPopulate","setRowData","setPinnedTopRowData","getSelectedRowKeys","rowId","rowKeys","selected","removeProgressBars","updateRowErrors","positionAllProgressBars","_progressBar","childIndex","paginationGetPageSize","refreshCellRenderer","getCellRendererInstances","rowNodes","parentElement","removeRowErrors","errorContainers","errorContainer","removeChild","scrollToRowVerticalLayout","scrollToRowHorizontalLayout","pinnedRowsCount","containerOffset","getBoundingClientRect","rowBottomOffset","rowTopOffset","innerHeight","scrollY","newRowContainer","getRowNode","disableScrollOnPageChange","tableOffset","scrollBy","Math","max","requestAnimationFrame","userInitiated","forEachNodeAfterFilter","selectAllFiltered","deselectAllFiltered","pinnedRows","onRowSelected","onRowUnselected","redrawRows","setColumns","flexColumns","columnsChanged","agColumn","getColumn","wasVisible","isVisible","isColumnVisible","setColumnVisible","autoSizeColumn","getMinWidth","getActualWidth","setActualWidth","isColumnFlex","next","isRowPinned","setSelected","classList","isDocumentGrid","eFullWidthContainer","depth","errorsSerialized","entries","pinnedRow","pinnedTopRowData","element","min","setRowHeight","onRowHeightChanged","progress","firstChild","loaded","total","pct","round","setColumnDefs","errorCount","tableErrors","hideTable","hideEmptyDocument","isFocusable","implementation","xlDown","keepHeaderOnSelect","dropAreaChild","ref","AsyncData","paneState","paneStates","aborted","getRequestExceptionMessage","initializeDataTimeout","lastPopulatedContentPaneDate","retrieveDataPromise","contentPane","retrieveData","isPopulatingData","isLoadingData","initializeData","getData","processResponse","ProcessingMask","ErrorBadge","suppressEdit","onOpen","mouseEvent","disableHoverListener","button","onMouseDown","GridColumn","isShort","shortError","short","normal","badgeContent","right","CellFocusUtil","lastFocusedSubscriber","renderer","parentTableKey","getFrameworkComponentInstance","subscribers","focusSubscribers","subscriber","columnId","getColId","onCellEditingStarted","CheckBoxColumn","runtimeData","configProperties","functionName","d","onCellBlur","isErrorBadgeOpen","onCellFocus","onCloseErrorBadge","onOpenErrorBadge","subscribeToCellKeyboardFocusedEvent","unsubscribeToCellKeyboardFocusedEvent","justifyContent","ComponentTypeDisplayColumn","colDef","field","lineHeight","IconWithLink","ButtonBase","linkRef","focusRipple","disableFocusRipple","bottom","background","outline","ImageWithLink","image","imgSrc","objectFit","fit","Thumbnail","setLinkRef","thumbnailType","additionalDownloadLinkProps","inGrid","downloadUrl","hasImage","DocumentService","documentHandle","pendingDocumentId","documentName","pendingThumbnailId","getTime","batch","formData","FormData","XMLHttpRequest","append","upload","onprogress","responseData","parse","uploadErrors","clientKey","DataImageDisplayColumn","getThumbnailUrl","getDocumentUrl","fileName","hasThumbnailImage","DataLinkColumn","anchorText","buildUrl","objectId","presentationId","DateEdit","userFormatted","getDateFormat","c","l","pts","aDateVal","aFormat","y","prevGood","newString","str","month","toUpperCase","a","search","pos","part","Number","charAt","rDate","dialogContentRef","lastValidDate","localeName","closeCalendar","isDialogOpen","focusCalendarSelectedDay","navigateYears","nextSibling","previousSibling","openCalendar","currentDate","getCurrentValueParsed","calendarSelectedDate","calendarVisibleMonth","showYearsView","switchToYearsView","offsetTop","offsetHeight","scrollTop","InputProps","placeholder","formatCurrentValueAndSetErrors","rawValue","currentValue","formatValue","monthsShort","weekdays","weekdaysMin","weekdaysShort","raw","errorIndex","dateFormatError","setFormattedValue","getCalendarContent","calendar","initialMonth","locale","localeUtils","LocaleUtils","selectedDays","showOutsideDays","onDayClick","captionElement","caption","arial-label","switchYearBtn","switchYearBtnRipple","formatMonthTitle","navbarElement","navButtonPrev","onPreviousClick","navButtonNext","onNextClick","renderDay","day","modifiers","weekdayElement","formatWeekdayShort","weekday","parsed","parseDate","getYearClass","year","getYearTabIndex","selectYear","clientX","lastState","currentMonth","endAdornment","required","showDisabledHelp","formatted","showAsMandatory","years","currentYear","InputLabelProps","inputLabelRoot","shrink","inputLabelShrink","onEntered","dialogContainer","yearSelector","down","maxHeight","textAlign","textTransform","fontWeight","letterSpacing","borderRadius","paddingTop","paddingLeft","paddingRight","Input","startAdornment","iconColor","inputProps","DateEditColumnDialog","yearSelected","editor","DateEditColumnEditBase","restoreFocus","DateEditColumnEdit","inputElement","formattedValue","keyPress","charPress","inputRef","disableGridNavigation","setInitialFocus","enableGridNavigation","getErrors","TextField","defaultId","onValueChange","readOnlyProps","readOnlyPropOverrides","multiline","contentClassName","readOnlyContentMultiline","contentRef","readOnlyClassNames","readOnlyRoot","readOnlyLabel","startIcon","rootWithStartIcon","muiHelperText","hasErrors","errorMessages","flexShrink","primary","MultilineTextFieldDialog","onAccept","contentRootClassName","contentRootReadOnly","contentRoot","contentWrapperClassName","contentWrapperReadOnly","contentWrapper","disableBackdropClick","inputRoot","readOnlyContent","paddingBottom","TextColumn","bodyText","isCellEditable","onDialogCancel","showDialog","expandButton","expandButtonDialog","cellEditorFramework","editMask","EditMaskBase","showEllipsis","columnWidth","textWidth","measureText","headerName","edit","getAlignment","DateEditColumn","DomainComboBox","disposeObserve","onSelect","propOptions","selectedValue","selectedDisplayValue","options","o","historicOption","historic","controlledPaneKeysByValue","hideGroup","controlledGroupName","getOptions","ApiSelect","DomainComboBoxColumnDisplay","currentOption","table","DomainComboBoxColumnEdit","select","focusedCell","Select","disableUnderline","hasOptions","innerRef","MenuProps","getContentAnchorEl","SelectDisplayProps","IconDisplayColumn","ManualLinkColumn","linkType","SLTextEditColumnEdit","editingValueHasChanged","dataSize","maxSizeError","updatedValue","String","originalValue","dataCase","onMaskValueChange","EditMask","mask","MLTextEditColumnEdit","onDialogAccept","onDialogExited","textarea","setSelectionRange","scrollHeight","NumericEdit","part1","part2","rgx","test","decimals","rounded","toFixed","scale","systemDecimalCharacter","addThousandsSeparators","isFocusing","updateValueInterval","stopIncreaseOrDecreaseValue","clearInterval","maximum","minimum","validateKeyPress","activeElement","updateErrors","formatNumericValue","regex","RegExp","parseFloat","increaseOrDecreaseValue","increase","increment","startIncreaseOrDecreaseValue","setInterval","minimumError","maximumError","scaleError","pow","tagName","validCharacters","isControlChar","parsedValue","canDecrement","canIncrement","labelRootWithIncrementors","labelShrinkWithIncrementors","NumericEditColumn","isFirst","NumericEditColumnEdit","cleaned","updateValue","onMouseUp","handleIncreaseOrDecreaseValue","startEditingCell","colKey","RelationshipComboBoxColumnDisplay","selectedOption","getRelationshipComboBoxOptions","RelationshipComboBoxColumnEdit","rowA","rowB","widgetType","widgetProps","visibleCols","getDisplayedCenterColumns","lastColumn","allColumns","getQuickFilterText","editorComponent","rendererComponent","CheckBoxColumnBase","cellHorizontalPadding","TextColumnBase","sortDescending","autoHeight","cellClassRules","shouldShowRightBorderOnColumn","comparator","valueA","valueB","nodeA","nodeB","isInverted","editable","isColumnEditable","getColumnHeaderClass","header","lockPinned","sortEnabled","valueGetter","v","valueSetter","newValue","colRowHeight","breakpoint","showRightBorder","isRight","parentGridIsReadOnly","TableEditDialog","dialogContents","closeDialog","isFirstOpenOfNewRow","onDeleteRow","recoverStateFromPoint","dialogOpenResponse","scriptsByDataId","setPanes","loadScripts","presentationConfig","breakPointColumns","breakPoints","accepted","parentTableWidgetProperties","isEnterable","dialogContent","trapFocus","styles","GridRelatedEditButton","altText","ComplexGridControl","populate","partialDataRetrevial","getRowKey","onDialogOpen","async","dialogRowKey","relatedEditLayoutId","PresentationService","getConfigForDialog","configResponse","relatedEditLayoutIds","getColumnsMinRowHeight","editDialogInfo","getColumnDef","createColDef","ComponentTest","runtimePropsStr","blockHeader","propertyBlock","black","fontFamily","ComponentTypeDisplay","DashboardCriteria","openMenu","parentDashboard","initialSearch","searches","Menu","anchorEl","boxShadow","DashboardGridControl","currentSearchName","searchName","SearchName","isSearching","AsyncDataBase","DashboardCriteriaBase","tableChildProps","DataImageDisplay","imageType","noImage","getUrl","imageRender","suppressDownloadLink","transform","DataLink","DividerDisplay","DocumentEdit","componentId","customInputRef","dragEnterStack","helperTextId","lastDocumentHandle","rootRef","saveMonitorDisposer","createCustomInput","other","showExtension","blocks","lazy","onInput","placeholderChar","unmask","deleteDocument","isDocumentUploadFinished","widgetData","loadWidgetData","setLocalErrors","maskValue","isDocumentUploading","newDocumentFileName","onClickFileUpload","uploadPercentComplete","onDragEnterIntoDocument","canDelete","isDragging","onDragLeaveOutOfDocument","onDragOverIntoWidget","onDropIntoDocument","onDropIntoWidget","uploadFile","onFileSelected","updateProgress","percent","uploadError","localErrors","completeDocumentUpload","uploadResponse","getCurrentValue","documentBaseName","isDocumentSelected","nameRequiredError","fullFileName","validExtensionsError","maxFileBytes","maxFileBytesError","newDocumentExtension","all","responses","documentExtension","documentUrl","previewButton","extensionIconName","formattedDocumentName","cellLeft","cellRight","helperTextProps","actionButton","fileInput","showProgress","progressBarStyle","progressBarFilledSlow","progressBarFilled","textField","inputComponent","barColorPrimary","uploadCompleteIcon","dropArea","onDragOver","onDrop","editableRoot","lightGreen","transitionDuration","flexDirection","FreeflowContainerItem","breakPoint","isLayoutOnlyWidget","childWidgetName","visibilityBreakPoints","childWidget","visibilityStyles","itemSpaceStyle","spacingBreakPoints","itemSpacing","freeflow","spacing","FreeflowContainerGroup","FreeflowContainerItemBase","groupSpaceStyle","groupSpacing","flexWrap","FreeflowContainerSection","section","g","FreeflowContainerGroupBase","justify","sectionSpaceStyle","Freeflow","startSpacerClasses","spacer","endSpacerClasses","startVisible","FreeflowContainerSectionBase","start","middleVisible","middle","endVisible","end","numberVisible","grid1Column","grid2Column","grid3Column","spacerVisible","responsiveStyles","gridTemplateColumns","sectionSpacing","gridColumnGap","Grow","ToolbarInputWrapper","rootElement","onKeyUp","keyCode","focused","GridFilter","lastTableWidth","setFilterTimeout","buttonOnClick","filterVisible","setQuickFilter","filterValue","onGrowEnd","onGrowStart","visibility","onShrinkEnd","textFieldOnChange","spellCheck","GridPager","currentPageCount","currentPageNumber","mounted","nextButtonRef","pageSizes","prevButtonRef","setCurrentPageInfo","paginationGetRowCount","first","pageMessage","setMenuButtonRef","menuButtonRef","setPageSizes","sizes","paginationSetPageSize","clearFocusedCell","changePage","menuName","pageSize","isFullWidth","leftButton","menuButton","GridSelectedCount","updateSelectedRowCount","selectedRowCount","tableApi","GroupHeading","getTextStyle","headingSize","headingText","_muiProps","wrap","aria-describedby","goToTopBtn","IconDisplay","iconHeight","IconDisplayVerticalLayout","MenuItemDisplay","forwardedRef","overrides","MuiMenuItem","gutters","WithForwardedRef","subMenuHeader","isDisabled","MenuButton","isDrawerMenu","gridSize","menuItemRef","setMenuItemRef","useTheme","isLargeBreakPoint","useMediaQuery","renderFlatMenu","menuPane","setButtonRef","ariaLabel","hasParentToolbar","LanguageSelect","hideIcons","code","changeLanguage","setRootRef","languages","currentLanuage","largeVersion","aria-haspopup","smallVersion","ManualLink","isInPageFooter","displayType","link","Media","shouldRender","mediaWidgetProperties","media","contentClasses","orientation","gridGrouping","mediaGrouping","contentsGridWidth","lgleft","lgleftcontent","alignSelf","lgtop","lgtopcontent","mdleft","mdleftcontent","mdtop","mdtopcontent","smleft","smleftcontent","smtop","smtopcontent","xsleft","xsleftcontent","xstop","xstopcontent","generateUrl","targetObjectId","targetLayoutId","shouldGenerateUrl","navigationType","PresentationButton","requestNewRelatedObject","confirmContinue","MenuItem","MenuPane","childConfig","menuItems","MultilineTextField","rawField","onExpandButtonClick","onTextFieldFocus","onWindowResize","checkForOverflow","isOverflowing","displayButtonReadOnly","displayButton","onTouchStart","MLTextEdit","disabledField","FormLabel","childrenProp","RadioGroup","ApiRadio","controlledPaneKey","paneKey","groupName","RadioSelect","labelId","radioGroup","aria-labelledby","_item","RelationshipComboBox","ResponsiveGrid","horizontalLayout","SearchButton","selectProps","canAddRemoveRows","SelectControl","criteriaPane","lastElementFocused","selectedGrid","selectionChanges","acceptDialog","addedRowKeys","removedRowKeys","cancelDialog","addedObjectIds","removedObjectIds","getCurrentlySelectedRowObjectHandles","selectedObjectHandles","getInitiallySelectedRowObjectHandles","h","selectedDataId","clearPaneData","selectDialogId","isSingleSelect","criteriaWidgetName","postArgs","getSelectedRowObjectHandles","dialogOpenUrl","dialogOpenPostArgs","dialogOpenRequest","configRequest","getConfigForSelectDialog","noRowsSelected","dialogTitle","withMobileDialog","dialogWidths","b","panel","maxWidths","errorText","SelectControlSelectedGrid","SelectDialogResultsGrid","UploadDialog","outerProgress","innerProgress","transitionProperty","transitionTimingFunction","DocumentDropArea","filesDisposer","isFinalizing","lastFilesNumber","progressTotal","enabled","dialogPercent","reaction","renderProgressDialog","updatePercent","isDropable","borderBottom","borderTop","DocumentStore","completeUpload","createRows","onModelChanged","clearDocuments","documents","uploaded","createResponse","newModels","newRows","newRow","filesMap","every","progressEvent","uploadResponses","uploadedFiles","completeResponse","uploadErrorsByRowKey","SimpleGridControl","documentStore","relationshipComboBoxOptions","onDialogClose","dialogLayoutId","onUploadFiles","validFiles","dropProps","SubPane","containerStyle","controlKey","controlType","SubPaneControl","visiblePaneName","ExpansionPanel","onClickLink","labelClasses","labelDisabled","errorIcon","expanded","summaryDisabled","summary","linkLabel","disableTouchRipple","expandIcon","main","Tab","tabProps","TabScrollButton","direction","order","Tabs","tabScroller","KeyboardNavigationGroup","childSelector","rootSelector","flexContainer","ScrollButtonComponent","scrollButtons","TabControl","activeTab","tabs","loadingPaneUseKeys","updateSelectedTab","accordianCollapsed","switchingTab","setSelectedTab","loadSelectedTab","getTabId","tab","uniqueId","tabRuntimeProps","requestPromise","k","renderExpansionPanel","hasBusinessErrors","contentsExist","renderSelectedTabPane","BreakpointRanges","nestedIn","selectedTab","isLoadingTab","tabContents","renderTabButton","aria-controls","TableExport","exportDataAsCsv","TablePrint","currentPageSize","TableSort","sortColumns","sortModel","sort","gridColumn","setSortModel","isSelected","TableSummary","columnConfigProperties","onGridFilterChanged","isAnyFilterPresent","visibleRowKeys","columnWidgetName","parentGridRows","getSummaryValue","TextCriteria","onClickSearchButton","onKeyPress","TextDisplay","align","listStyle","ThumbnailDisplay","parentColumnHeader","Toolbar","childLayoutWidgetNames","childWidgetNames","selectionVerticalLayout","headerFooterVerticalLayout","toolbarType","pageHeaderLayout","isVerticalFooter","ToolbarInputWrapperBase","startChild","endChild","overflowChild","containerSpaceStyle","footer","borderBottomColor","borderBottomStyle","borderTopColor","borderTopStyle","borderBottomWidth","borderTopWidth","ToolbarContainerGroup","ToolbarContainerItem","childLayoutWidgetName","footerVerticalLayout","headerVerticalLayout","ToolbarContainerOverflowItem","ToolbarContainerOverflowSection","overflowMenuName","openOverflowMenu","overflowButtonRef","setOverflowButtonRef","childItems","isLayoutOnly","isPageHeader","drawerMenu","ToolbarContainerSection","WizardStepNumberDisplay","Step","complete","barClasses","stepbar","buttonClasses","stepbutton","stepSelected","stepCompleteSelected","stepComplete","badgeRoot","wrapped","disableRipple","WizardStepsDisplay","renderStepButton","stepWidgetProps","gotoStep","ThemeWrapper","generateClassName","rootTheme","createGenerateClassName","disableGlobal","seed","containerName","muiTheme","StylesProvider","ThemeProvider","presentation","getComponent","baseForegroundColor","isHeaderOrFooter","EmbeddedAddOn","IconButton","InputAdornment","Panel","SLTextEdit","Snackbar","SnackbarContent","Tooltip","getTrackable","getObservableCollection","defaultValue","font","canvas","getContext","injectContainer","CheckboxBase","endIconColor","cleanValue","currentComponent","currentPresentationId","menu","DrawerBase","muiDrawerProps","anchor","transformOrigin","MenuListProps","rowWidgets","newWidget","prop","oldValue","urlParams","jsonData","getState","dataChanges","getChanges","layoutState","getCurrentState","RequestPromise","disableMask","parsedResponse","requests","hasAll","getRequestException","handled","handleMustangException","renderSignInAttempts","Message","renderSignIn","sessionExpiredErrorMessage","errorMessageByStatus","statusText","redirect","requestTimeoutMilliseconds","onabort","onerror","handleRequestError","ontimeout","handleRequestTimeout","onreadystatechange","DONE","registerRequest","handleRequestException","abortRequest","getRequestCacheItem","send","setRequestHeader","addRequest","408","413","UserService","requestObject","parameters","userAccountObjectHandle","accountObjectHandle","expirationSeconds","navigate","credentials","UserName","Password","password","userName","DisplayName","hrefRoot","newHref","nonConfiguredAuthSessionExpiredRoute","sessionValidated","routeRoot","infoToken","info","atob","ErrorPage","logout","extractHashParameters","completeAuthentication","routeIsValid","sessionIsValid","validateUserSession","goToRoutesRequiringSession","renderHomePage","objectDefName","presentationName","fromObjectId","jobId","renderNewObjectPresentationForJobProcessByName","renderNewObjectPresentationForName","fromPaneUseKey","fromRowKey","fromWidgetId","newObjectHandle","renderNewObjectPresentationForIdInternal","newObjectDefId","endPointId","renderNewObjectPresentationForJobProcessById","renderNewObjectPresentationForIdExternal","presentationNameOrId","renderPresentationForName","renderPresentationForId","processHash","isAuthenticated","AuthenticatedPage","renderHome","LandingPage","setDocumentTitle","forIdExternal","goToNewObjectErrorPage","GuestPage","forIdInternal","processTypeId","forJobProcessById","processTypeName","forJobProcessByName","urlParameters","endPointName","forName","getPresentationIdForName","maxMilliseconds","expirationMilliseconds","floor","logonAsGuest","setSessionTimeoutWarning","goToNonConfiguredAuthenticationSessionExpiredRoute","checkSession","errorInfo","btoa","errorHash","onhashchange","onHashChange","getUserInfo","goToRoute","objectTitle","objectDefDescription","components","objectComponents","announce","array","itemList","dataIds","hiddenProps","gridColumnEnd","currentOpenInstance","MaskingStore","maskOpened","forceClose","forced","maskClosed","dialogProps","paperClasses","paperMargin","n","PaperProps","paperWidths","measurements","getPanelMeasurements","maxColumns","dialog","gutterWidth","childrenWithError","componentDidCatch","process","links","rippleColor","textDecoration","disabledColor","hoverTextDecoration","hoverColor","groupingClassName","Related","Tight","Unrelated","closelyRelatedSpaceStyle","columnSpaceStyle","relatedSpaceStyle","unrelatedSpaceStyle","tightSpaceStyle","columnSpacing","horizontalSpacing","related","closelyRelatedSpacing","verticalSpacing","closelyRelated","relatedSpacing","unrelatedSpacing","unrelated","tightSpacing","tight","closelyrelated","ForegroundColorType","createTheme","buttonBackgroundColor","lighterForegroundColor","linkDisabledForegroundColor","normalForegroundColor","Grey","White","hoverForegroundColor","buttonHoverBackgroundColor","MuiButton","contained","sizeLarge","sizeSmall","MuiCardContent","MuiCardHeader","MuiCheckbox","MuiChip","MuiCollapse","entered","MuiDialog","paperScrollPaper","MuiDialogActions","MuiDialogContent","MuiDivider","MuiDrawer","MuiExpansionPanel","borderTopLeftRadius","borderTopRightRadius","MuiExpansionPanelSummary","MuiFab","sizeMedium","MuiFilledInput","adornedEnd","adornedStart","underline","MuiFormControlLabel","MuiFormHelperText","MuiFormLabel","asterisk","MuiIcon","colorPrimary","colorSecondary","MuiIconButton","MuiInput","MuiInputAdornment","MuiInputBase","MuiInputLabel","filled","MuiRadio","MuiSelect","MuiSnackbar","MuiSnackbarContent","MuiTab","textColorInherit","MuiTabs","indicator","MuiTooltip","popper","tooltipPlacementTop","MuiTouchRipple","rippleVisible","animation","MuiTypography","disabledBackground","secondary","MuiPaper","square","variantMapping","srOnly","typography","h1","h2","h3","h4","h5","h6","body1","body2","widthBreakPoints","createMuiTheme","iconButton","CenteredContentClasses","closeTimeout","isClosing","minMillisecondsOpen","openedOn","openTimeout","restoreScrollPosition","documentElement","millisecondsOpen","rootClickThrough","isFixed","rootFixed","rootAbsolute","enter","shortFade","exit","disableBackground","unmountOnExit","BackdropComponent","muiBackdrop","BackdropProps","disableAutoFocus","disableEnforceFocus","disablePortal","disableScrollLock","Layout","preventClear","drawer","closeButton","menuList","templateResponse","getAuthenticatedPageData","templateConfig","template","dataResponse","getPresentationData","shouldRedirectHome","backgroundImageUrl","paperWidth","getPresentationConfig","homeLayout","allDataIds","layout","getGuestPageData","forgotPasswordUrl","signInTitle","hasFocus","offsetParent","domObserver","lastAriaSelectedChild","lastFocusedChild","visibilityObserver","updateIsFocusable","onDomChange","isFocusWithinRootElement","setFocus","focusedElement","onVisibilityChange","intersectionRatio","disconnect","MutationObserver","IntersectionObserver","getAriaSelectedChild","ariaSelectedElement","getFocusableChildren","hasAttribute","isElementHidden","move","ariaSelectedChild","selectedChild","selectChildIndex","hasFocusableChild","observe","childList","subtree","divProps","numberOpen","currentState","selectedStepPaneUseKey","selectedWizardStep","controlName","selectedTabPaneUseKey","selectedTabs","imask","MaskedPattern","definitions","patternDefinitions","patternMask","createMaskedPattern","unmaskedValue","maskedPattern","isComplete","prepare","setLazy","A","x","X","addOnConfiguration","addOnUrl","callDeferTimeout","deferredCalls","hostId","lastObjectHandle","queryArgs","callDeferPeriod","filler","host","addOnName","addOnDescription","clearDefer","callName","_isLoaded","_refresh","defer","setReadOnly","_setReadOnly","showData","_showData","addOnLoaded","_setConfiguration","rect","offsetLeft","expansionSize","full","fixed","configurationChanged","configurationName","ok","expand","getDataBuffer","getObjectBuffer","componentTypeName","processHandle","isExpanded","addon","sandbox","xsUp","roundTrip","_roundTripStarting","setBusy","busy","processingInfo","setDataBuffer","setHeight","transformStyle","openInstance","SelectProps","autoWidth","displayEmpty","IconComponent","option","executor","onAbort","onrejected","onfinally","onfulfilled","PaperClasses","supportedColumnWidths","useDefaultColor","breakPointToUse","ErrorPageTemplate","goHome","backgroundImage","headerContentClasses","headerContent","bottomBorderColor","Logo","imageSrc","logoUrl","line","EnvironmentBanner","mainContent","mdDown","paragraph","backgroundRepeat","backgroundSize","backgroundGeneralUrl","background404Url","background408Url","ConfirmContinueDialog","cancel","continue","BasePageTemplate","footerTheme","headerTheme","foreground","footerContentClasses","footerContent","BackgroundImage","mainClasses","mainContentClasses","PageProcessing","SessionMessageDisplay","flexBasis","bannerColor","bannerTitle","wrapper","titleBackground","svg","viewBox","points","small","unmountComponent","ClickAwayListenerProps","touchEvent","LandingPageTemplate","signInClasses","signIn","topContentClasses","topContent","welcomeTitle1Classes","titleLight","welcomeTitle","welcomeMessage","welcomeTitle1","welcomeTitle2","welcome","Logon","getLandingPageData","removeMessage","messageId","messageNode","messageType","caution","imageClasses","maskClasses","visibleStyle","objectPosition","enableBackground","CircularProgress","thickness","handleCredentialMessages","logon","validateCredentials","onAuthenticatorClick","isLoadingExternalAuthenticators","getExternalAuthenticators","emailAuthentication","externalAuthentication","focusUserName","focusPassword","emailAddressField","isPassword","autoComplete","passwordField","forgotPasswordLink","authenticators","buttons","authenticator","divider","PasswordField","onToggleShowValue","showValue","withForwardedRef","Component","handle","displayName","normalizedName","iconsByName","iconContent","fetch","getIcon","contentsByName","logMessages","scriptErrors","source","lineNumber","colno","scriptError","callStack","exceptionType","stack","addScriptError","timestamp","now","requestConfig","formattedTimestamp","formatDate","_UserName","_Password","_EmailAddress","EmailMessage","_DisplayName","_Message","_EmailMessage","_WidgetProperties","WidgetProperties","EmailAddress","requestUrl","favIconUrl","html","lang","getSystemConfig","setFavIcon","setLanguage","setConfig","authenticatedPage","ajaxTimeoutMilliSeconds","customIconsByName","errorPage","guestPage","landingPage","WebFont","google","families","onReadyStateChange"],"mappings":"iiEAiFqBA,K,cAAN,MAAMA,IAuGjB,oBAEI,OAAOA,IAAIC,gBAGf,qBAA6BC,EAAgBC,GAEzC,IAAIC,EACJ,MAAMC,EAAMC,KAAKC,UAAUL,GAE3B,IAAKF,IAAIQ,aAAaC,IAAIJ,IAAQF,IAI1BC,EAFAF,EAAM,OAEUQ,SAASC,eAAeT,EAAM,QAI9BU,OAGhBR,GACJ,CACI,MAAMS,EAAYC,IAEd,MAAMC,EAAgBD,EACtB,IAAIE,GAAS,EAmBb,OAjBID,EAAcV,MAAQH,EAAM,KACzBa,EAAcE,UAAYf,EAAM,MAChCa,EAAcG,SAAWhB,EAAM,KAC/Ba,EAAcI,WAAajB,EAAM,OAChCa,EAAcK,SAElBJ,EAASb,EAAQY,GAEZC,IAEDD,EAAcM,kBACdN,EAAcO,iBACdP,EAAcQ,aAAc,EAC5BR,EAAcS,cAAe,IAI9BR,GAGXhB,IAAIQ,aAAaiB,IAAInB,KAAKC,UAAUL,GAASW,GAC7CT,EAAcsB,iBAAiB,UAAWb,IAKtD,yBACIc,EACAC,EACAC,GAGA,MAAMC,EAAMC,+CAAQC,IAAIL,EAAQE,GAE3BC,IAKUA,EAAIG,UAAUL,GACtBM,WAAWC,eAAeC,OAAS,GAG9C,2BAAmCC,GAS/B,MANA,CACIA,UACAC,KAAM,GACNC,QAAS,IAMjB,4BAEI,GAAkC,IAA9BvC,IAAImC,eAAeC,OAInB,YAFApC,IAAIwC,YAKR,MAAMC,EAAqB,GACrBC,EACwD,GAE9D,IAAK,MAAMC,KAAS3C,IAAImC,eACxB,CACI,MAAMS,EAII,GAEV,IAAK,MAAMC,KAAUF,EAAMJ,QAEnBM,EAAOC,gBAEPF,EAAWG,KACX,CACIC,YAAaH,EAAOI,sBACpB5C,IAAKwC,EAAOK,gBAKxB,IAAK,MAAMpB,KAAOa,EAAML,KAEpBM,EAAWG,KACX,CACIC,YAAalB,EAAImB,sBACjB5C,IAAKyB,EAAIoB,gBAIjB,IAAK,MAAMC,KAAaP,EAEhBO,EAAU9C,OAAOqC,EAEjBA,EAAoBS,EAAU9C,KAAK+C,QAInCV,EAAoBS,EAAU9C,KAC1B,CACI+C,MAAO,EACPJ,YAAaG,EAAUH,aAKb,IAAtBJ,EAAWR,QAEXK,EAASM,KAAKJ,EAAMN,SAI5B,IAAK,MAAMhC,KAAOqC,EAClB,CACI,IAAKA,EAAoBW,eAAehD,GAEpC,SAGJ,MAAMiD,EACN,CACIF,MAAOV,EAAoBrC,GAAK+C,MAChCJ,YAAaN,EAAoBrC,GAAK2C,aAGpCO,EAA0C,IAA1BD,EAAgBF,MAChC,sDACA,sDAEAf,EAAUrC,IAAIwD,eAChBD,EAAe,aAAcD,GAEjCb,EAASM,KAAKV,GAGlBrC,IAAIyD,UACAC,oDAAaC,OACT,CACIC,SAAUC,+CAAIC,iBAAiBrB,GAC/BsB,MACA,CACIC,MAAO,QACPC,UAAW,MACXC,QAAS,SAEbC,KAAM,gBAEd,EACA,KACA,QACA,SACA,KACA,KAAQnE,IAAIoE,gBAGpB,2BACIC,EACAC,GAGA,OAAQtE,IAAIuE,qBAER,IAAK,YACDvE,IAAIwE,kBAAkB/C,IAAI4C,EAAiBC,EAAQG,cACnD,MACJ,IAAK,eACD,IAEIzE,IAAIwE,kBAAkBE,QAAtB,UACO1E,IAAI2E,WADX,YACyBN,GACrBC,EAAQG,cAEhB,MAAOG,GAEH,GAAuB,uBAAnBA,EAAUhD,KASV,MAAMgD,EAPN5E,IAAI6E,oBACJC,6CAAQC,IACJ,gDACJ/E,IAAIgF,oBAAoBX,EAAiBC,GAOjD,MACJ,QACIQ,6CAAQC,IAAR,sCACmC/E,IAAIuE,uBAKnD,gBAAuBlC,GAEnB,MAAM4C,EAAYvE,SAASC,eAAe,aAEtCsE,IAEAA,EAAUC,UAAY7C,EAGtB8C,WACI,KAEIF,EAAUC,UAAY,IAE1B,MAIZ,2BACIvD,EAAiBC,EAAeC,GAEhC,GAAIF,GAAUC,GAAQC,EACtB,CACI,IAAIuD,EAAsB,EACtBC,GAAgB,EAGpB,IAAIrF,IAAImC,gBAAgBmD,QACpB,CAACC,EAA8BC,KAEvBD,EAAchD,QAAQkD,KAAK5C,GAC3BA,EAAOlB,SAAWA,GACfkB,EAAO6C,aAAe9D,GACtBiB,EAAOhB,SAAWA,KAErB0D,EAAchD,QAAQ+C,QAASzC,IAE3B7C,IAAI2F,kBACA9C,EAAOlB,OACPkB,EAAO6C,WACP7C,EAAOhB,UAGf7B,IAAImC,eAAeyD,OAAOJ,EAAQJ,EAAa,GAC/CA,IACAC,GAAO,KAIdA,GAEDrF,IAAI6F,0BAGP,GAAIlE,GAAUC,EACnB,CACI,IAAIwD,EAAsB,EACtBC,GAAgB,EAGpB,IAAIrF,IAAImC,gBAAgBmD,QACpB,CAACC,EAA8BC,KAEvBD,EAAchD,QAAQkD,KAAK5C,GAC3BA,EAAOlB,SAAWA,GACfkB,EAAO6C,aAAe9D,KAEzB2D,EAAchD,QAAQ+C,QAASzC,IAE3B7C,IAAI2F,kBACA9C,EAAOlB,OACPkB,EAAO6C,WACP7C,EAAOhB,UAGf7B,IAAImC,eAAeyD,OAAOJ,EAAQJ,EAAa,GAC/CA,IACAC,GAAO,KAIdA,GAEDrF,IAAI6F,0BAGP,GAAIlE,GAAUE,EACnB,CACI,IAAIuD,EAAsB,EACtBC,GAAgB,EAGpB,IAAIrF,IAAImC,gBAAgBmD,QACpB,CAACC,EAA8BC,KAEvBD,EAAchD,QAAQkD,KAAK5C,GAC3BA,EAAOlB,SAAWA,GACfkB,EAAOhB,SAAWA,IAErB0D,EAAchD,QAAQ+C,QAASzC,IAE3B7C,IAAI2F,kBACA9C,EAAOlB,OACPkB,EAAO6C,WACP7C,EAAOhB,UAGf7B,IAAImC,eAAeyD,OAAOJ,EAAQJ,EAAa,GAC/CA,IACAC,GAAO,GAEFE,EAAcjD,KAAKmD,KAAK3D,GAC7BA,EAAIH,SAAWA,GACZG,EAAID,SAAWA,KAElB7B,IAAImC,eAAeyD,OAAOJ,EAAQJ,EAAa,GAC/CA,IACAC,GAAO,KAIdA,GAEDrF,IAAI6F,0BAKR7F,IAAIoE,cAIZ,qBAEI,IAAK,MAAMzB,KAAS3C,IAAImC,eAEpB,IAAK,MAAMU,KAAUF,EAAMJ,QAEvBvC,IAAI2F,kBACA9C,EAAOlB,OAAQkB,EAAO6C,WAAY7C,EAAOhB,QAIrD7B,IAAImC,eAAeC,OAAS,EAC5BpC,IAAI6F,qBAGR,yBAAgCC,GAAkB,GAE9C,MAAMC,EAAe/F,IAAIwE,kBAEzB,OAAQxE,IAAIuE,qBAER,IAAK,YACDwB,EAAaC,QACb,MACJ,IAAK,eACD,IAAK,MAAM3F,KAAO4F,OAAOC,KAAKH,GAEtB1F,EAAI8F,WAAJ,UAAkBnG,IAAI2E,WAAtB,OAEAoB,EAAaK,WAAW/F,GAGhC,MACJ,QACIyE,6CAAQC,IAAR,sCACmC/E,IAAIuE,sBAI3CuB,GAEAlF,OAAOyF,SAASP,SAIxB,6BACIQ,GAAsB,GAGtB,MAAMC,EAAU,IAAIC,QAAiB,CAACC,EAASC,KAEtC1G,IAAI2G,cAmBLF,GAAQ,IAjBRG,yDAAkBC,UAAUvB,QACvBwB,IAEGA,EAAcC,sBAGlB/G,IAAIgH,aAEJC,6DAAqBC,SAASC,WAAWV,EAASC,GAIlDD,GAAQ,MAiBpB,OARKzG,IAAI2G,eAAiB3G,IAAIgH,cAAgBV,GAE1CC,EAAQa,KAAK,KAETC,2CAAUf,eACXgB,MAAM,QAGNf,EAGX,aACIgB,EACAC,EACAC,EACAC,GAGIF,EAEArC,WAAW,KAAQoC,EAAOI,KAAKF,KAAUC,IAAUF,GAInDD,EAAOI,KAAKF,KAAUC,GAI9B,oBAA2B9F,GAEnBA,IAGAlB,SAASkH,OAAT,UAAqBC,mBAAmBjG,GAAxC,mBAAwD5B,IAAI2E,WAA5D,6CAIR,kBACImD,EACAC,GAGA,GAAID,GAAa,EAEb,OAAO,KAGX,MAAME,EAAa,IAAIC,KAAKH,GAC5B,IAAKC,EAED,OAAOC,EAAKE,iBAGhB,MAAMC,EAAW,KACXC,EAAWpI,IAAIqI,SAASC,KACxBC,EAAmBvI,IAAIqI,SAASE,iBAChCC,EAAaxI,IAAIqI,SAASI,OAC1BC,EAAqB1I,IAAIqI,SAASK,mBAExC,IAAI1H,EAAS+G,EACb/G,EAASA,EAAO2H,QAAQ,OAAQX,EAAKY,cAAcC,YACnD7H,EAASA,EAAO2H,QAAQ,KAAMX,EAAKY,cAAcC,WAAWC,OAAO,IACnE9H,EAASA,EAAO2H,QAAQ,KAAM,WAAIX,EAAKe,WAAa,GAAID,OAAO,IAC/D9H,EAASA,EAAO2H,QAAQ,KAAMX,EAAKe,WAAa,GAAGF,YACnD7H,EAASA,EAAO2H,QAAQ,KAAM,WAAIX,EAAKgB,WAAYF,OAAO,IAC1D9H,EAASA,EAAO2H,QAAQ,IAAKX,EAAKgB,UAAUH,YAC5C7H,EAASA,EAAO2H,QAAQ,KAAM,WAAIX,EAAKiB,YAAaH,OAAO,IAC3D9H,EAASA,EAAO2H,QAAQ,IAAKX,EAAKiB,WAAWJ,YAC7C,MAAMK,EAAKlB,EAAKiB,WAAa,GAAKjB,EAAKiB,WAAa,GAChDjB,EAAKiB,WAAa,EAAI,GAAKjB,EAAKiB,WACpCjI,EAASA,EAAO2H,QAAQ,KAAM,WAAIO,GAAKJ,OAAO,IAC9C9H,EAASA,EAAO2H,QAAQ,IAAKX,EAAKiB,WAAa,IAC1CjB,EAAKiB,WAAa,IAAIJ,WACnBb,EAAKiB,WAAa,EAAI,KAAOjB,EAAKiB,WAAWJ,YACrD7H,EAASA,EAAO2H,QAAQ,KAAM,WAAIX,EAAKmB,cAAeL,OAAO,IAC7D9H,EAASA,EAAO2H,QAAQ,IAAKX,EAAKmB,aAAaN,YAC/C7H,EAASA,EAAO2H,QAAQ,KAAM,WAAIX,EAAKoB,cAAeN,OAAO,IAC7D9H,EAASA,EAAO2H,QAAQ,IAAKX,EAAKoB,aAAaP,YAC/C7H,EAASA,EAAO2H,QAAQ,KAAMX,EAAKiB,WAAa,GAAK,KAAO,MAE5D,MAAMI,EAAQlB,EAASmB,KAAKtI,GAe5B,OAbIqI,IAEArI,EAASA,EAAO2H,QACZR,EACAH,EAAKuB,kBAAkBV,WAAWW,OAC9B,EAAGH,EAAM,GAAGjH,UAGxBpB,EAASA,EAAO2H,QAAQ,OAAQH,EAAWR,EAAKe,aAChD/H,EAASA,EAAO2H,QAAQ,MAAOD,EAAmBV,EAAKe,aACvD/H,EAASA,EAAO2H,QAAQ,OAAQP,EAASJ,EAAKyB,WAC9CzI,EAASA,EAAO2H,QAAQ,MAAOJ,EAAiBP,EAAKyB,WAE9CzI,EAGX,iBAAwBY,GAEpB,IACI8H,EADA1I,EAAwB,KAkB5B,OAfIY,GAAQlB,SAASkH,SAEjB8B,EAAUhJ,SAASkH,OAAO+B,MAAM,KAEhCD,EAAQpE,QAASsC,IAEb,MAAMgC,EAAwBhC,EAAO+B,MAAM,KAEvCC,EAAY,GAAGC,SAAWhC,mBAAmBjG,KAE7CZ,EAAS8I,mBAAmBF,EAAY,QAK7C5I,EAIX,eAAsB+I,GAAoB,GAGtC,MAAMC,EAAOpJ,OAAOyF,SAAS2D,KAAKrB,QAAQ,MAAO,IACjD,IAAI3H,EAAiC,KAWrC,OAVIgJ,EAAK5H,OAAS,IAEdpB,EAASgJ,EAAKR,OAAO,GAEjBO,IAEA/I,EAAShB,IAAIiK,oBAAoBjJ,KAIlCA,EAGX,uBACIkJ,EACAF,EAAsB,MAGtB,OAAOhK,IAAImK,cAAcD,EAAW,EAAGF,GAG3C,uBACIE,EACAF,EAAsB,MAGtB,OAAOhK,IAAImK,cAAcD,EAAW,EAAGF,GAI3C,yBAEI,IAAKhK,IAAI+F,aAEL,OAAQ/F,IAAIuE,qBAER,IAAK,YACDvE,IAAI+F,aAAe,IAAIqE,IACvB,MACJ,IAAK,eACDpK,IAAI+F,aAAenF,OAAOyJ,aAC1B,MACJ,QACIvF,6CAAQC,IAAR,sCACmC/E,IAAIuE,sBAKnD,OAAOvE,IAAI+F,aAGf,2BAAkC1B,GAE9B,IAAIrD,EAAwB,KAE5B,OAAQhB,IAAIuE,qBAER,IAAK,YACDvD,EAAShB,IAAIwE,kBAAkBxC,IAAIqC,GACnC,MACJ,IAAK,eACDrD,EACIhB,IAAIwE,kBACC8F,QADL,UACgBtK,IAAI2E,WADpB,YACkCN,IACtC,MACJ,QACIS,6CAAQC,IAAR,sCACmC/E,IAAIuE,sBAI/C,OAAOvD,EAGX,0BAAiCd,GAE7B,MAAMwH,EAAI,2LAAQxH,EAAM,MAIxB,cAFOwH,EAAI,aAEJpH,KAAKC,UACR,CACImH,OACA6C,cAAevK,IAAIwK,UAAUxK,IAAIyK,oBACjCC,IAAKxK,EAAM,MAIvB,yBAAgC8J,EAAsB,MAElD,IAAIhJ,EAAwB,KAC5B,MAAM2J,EAA6BX,GAAQhK,IAAI4K,UAE/C,GAAID,GAAe,MAAOA,EAC1B,CAEI3J,EADwB2J,EAAY,GAAKhB,MAAM,KAChCkB,OAAQC,GAAcA,EAAE1I,OAAS,GAAG,GAAG2I,cAG1D,OAAO/J,EAIX,qBACIkJ,EACAc,EACAhB,EAAsB,MAEtB,IAAIhJ,EAAwB,KAC5B,MAAM2J,EAA6BX,GAAQhK,IAAI4K,UAE/C,GAAID,GAAe,MAAOA,EAC1B,CACI,MAAMM,EAAkBN,EAAY,GAAKhB,MAAM,KACzCnE,EAAgByF,EAAMC,QAAQhB,GAEhC1E,GAAS,IAETxE,EAASiK,EAAMzF,EAAQwF,IAI/B,OAAOhK,EAIX,qBAEI,MAAMmK,EAAWC,OACb,+CAAgD,IAChDD,GAEAnL,IAAIqL,YAAYF,GAChBG,MAAM,iEAINA,MAAM,4CAId,sBACIC,EACAC,EAAkB,mBAClB9D,GAEA,IAAI1G,EAAiBuK,GAAQ,GAE7B,GAAIC,KAAWxL,IAAIqI,SAASoD,aAC5B,CACI,MAAMC,EAA8B1L,IAAIqI,SAASoD,aAAaD,GAE1DD,GAAQA,KAAQG,IAEhB1K,EAAS0K,EAAoBH,IAIrC,GAAI7D,EACJ,CACI,MAAMiE,EAAO,YACPC,EAAU5K,EAAOqI,MAAMsC,GAEzBC,GAEAA,EAAQtG,QAAS+D,IAEbrI,EAASA,EAAO2H,QACZU,EACA3B,EAAK2B,EAAMG,OAAO,EAAGH,EAAMjH,OAAS,OAKpD,OAAOpB,EAKX,cACI0J,EACAhD,GAGA,IAAI1G,EAAiB0J,EAErB,GAAIhD,EAEA,IAAK,MAAMmE,KAAO5F,OAAOC,KAAKwB,GAEtB1G,EAAQkK,QAAR,WAAoBW,EAApB,OAA+B,IAE/B7K,EAASA,EAAQ2H,QAAR,WAAoBkD,EAApB,eAA+BnE,EAAKmE,YACtCnE,EAAKmE,IAKxB,OAAO7K,EAIX,cAAqB8K,EAAwBC,GAEzC,IAAI/K,GAAS,EAEb,GAAI8K,GAAWC,EAEX,IAAK,MAAMC,KAAY/F,OAAOC,KAAK6F,GACnC,CACI,IAAIA,EAAQC,GAaZ,CACIhL,GAAS,EACT,MAbA,GAAI8K,EAAQE,KAAcD,EAAQC,GAKlC,CACIhL,GAAS,EACT,MALAA,GAAS,EAgBzB,OAAOA,EAGX,yBAAgCiL,GAE5B,IAAIjL,GAAkB,EAEtB,IAAK,MAAMuE,KAAiBvF,IAAImC,eAK5B,GAHAnB,EAASuE,EAAchD,QAAQkD,KAC3B5C,GAAUA,EAAOoJ,gBAAkBA,GAEnCjL,EAEA,MAIR,IAAKA,EAED,IAAK,MAAMuE,KAAiBvF,IAAImC,eAK5B,GAHAnB,EAASuE,EAAcjD,KAAKmD,KACxB3D,GAAOA,EAAImK,gBAAkBA,GAE7BjL,EAEA,MAKZ,OAAOA,EAIX,oBAEI,MAAMkL,EAAQC,MAAMC,KAAKC,gDAAeC,OAAOC,UAE/C,OAAqB,IAAjBL,EAAM9J,WAKNiF,2CAAUL,cAKPkF,EAAMzG,KAAK+G,IAASA,EAAK7F,eAAiB6F,EAAKxF,eAG1D,2BAAkC3C,GAE9B,IAAIrD,GAAkB,EAEtB,OAAQhB,IAAIuE,qBAER,IAAK,YACDvD,EAAShB,IAAIwE,kBAAkB/D,IAAI4D,GACnC,MACJ,IAAK,eACDrD,EACgD,OADtChB,IAAIwE,kBAAkB8F,QAAtB,UACHtK,IAAI2E,WADD,YACeN,IACzB,MACJ,QACIS,6CAAQC,IAAR,sCACmC/E,IAAIuE,sBAI/C,OAAOvD,EAGX,mBAEQyL,6CAAMC,SAEND,6CAAMC,QAAQC,QAItB,0BAEI,IAAK3M,IAAIqI,SAASuE,mCAEJC,yCAAQC,mDAEd,OAIR9M,IAAImC,eAAiB,GACrBnC,IAAI+M,gBAAkB,GAEtBnM,OAAM,QACN,CACIoM,kEACAlI,qDACA/C,uDACA/B,QACAiN,yEACAZ,gEAGJzL,OAAOc,iBAAiB,QAAUZ,IAGK,UAA5Bd,IAAIkN,oBAEPL,yCAAQM,cAAcnN,IAAIwD,eAAe,SAAU,MAKnD4J,sDAAclG,SAASmG,uBAI1BrN,IAAIsN,QAEL1M,OAAOc,iBAAiB,WAAaZ,IAE7BA,EAAMyM,eAENzM,EAAMyM,aAAaC,WAAa,QAGpC1M,EAAMQ,kBAEC,IAIdZ,SAAS+M,KAAyBC,eAAiB1N,IAAI2N,eACvDjN,SAAS+M,KAAyBG,SAAW,KAE1CC,4CAASC,WACTC,qDAAcD,WACdE,8CAAWF,YAEdpN,SAAS+M,KAAyBQ,SAAW,KAE1CJ,4CAASC,WACTC,qDAAcD,YAGd9N,IAAIkO,cAEJlO,IAAImO,QAAU,IAAIC,0CAGlBpO,IAAIqO,YAEJrO,IAAIsO,cACAtO,IAAIqO,WACHvN,IAEQd,IAAImO,UAELnO,IAAImO,QAAU,IAAIC,0CAGtBpO,IAAImO,QAAQI,SAKpBvO,IAAIwO,sBAEJxO,IAAIsO,cACAtO,IAAIwO,qBACH1N,IAA2Bd,IAAI6E,sBAGxC,IAAI4J,EAA8B,KAClC,MAAMzE,EAAOhK,IAAI4K,UAEbZ,IAEAyE,EAAezE,EAAI,aACfyE,WAEOzE,EAAI,aACXhK,IAAI0O,QAAQ1E,GAAM,GAAO,GAEzBhK,IAAI6E,mBAAkB,IAGpBmF,EAAI,oBAENhK,IAAI2O,aAAa3O,IAAI4O,yBACrB5O,IAAI6O,UACA7O,IAAIyK,mBACJT,EAAI,0BACDA,EAAI,kBAEP/D,OAAOC,KAAK8D,GAAM5H,OAElBpC,IAAI0O,QAAQ1E,GAAM,GAAO,GAAM,GAI/BhK,IAAI0O,QAAQ,IAAI,GAAO,GAAM,WAKnCI,8DAAoBC,WAAWN,GAErCzO,IAAIgP,mBAAqB,IAAIC,mDAC7B5C,gDAAe6C,SAASlP,IAAIgP,0BAEtBnC,yCAAQsC,aAGlB,kBAAyB9O,IAAa+O,QAElC,IAAKpP,IAAIqP,QAAQ5O,IAAIJ,MAEb+O,OAEA,IAEIpP,IAAIqP,QAAQC,IAAIjP,KAGhBkP,KAAKH,QAEDpP,IAAImO,SAEJnO,IAAImO,QAAQqB,UAAUnP,IAAK+O,QAGnC,MAAOxK,WAEHE,6CAAQnC,MAAMiC,WACdiI,yCAAQM,cACJnN,IAAIwD,eAAe,gBACnBoB,UAAUvC,UAM9B,mBAA0BgN,GAEtB,IAAK,MAAM1N,KAAUsE,OAAOC,KAAKmJ,GAE7BrP,IAAIyP,WAAW9N,EAAQ0N,EAAQ1N,IAKvC,2BAAkC+N,GAE9B,OAAOzJ,OAAOC,KAAKwJ,GAAQC,IAAKtP,IAE5B,IAAIW,EAYJ,OAPIA,EAHA4O,MAAMC,SAASxP,EAAK,KAGd,UAAMwH,mBAAmBxH,GAAzB,YAAiCwH,mBAAmB6H,EAAOrP,KAIxDqP,EAAOrP,GAGbW,IACR8O,KAAK,KAIZ,sBAA6BhP,GAEpBd,IAAI2G,gBAELC,yDAAkBC,UAAUvB,QACvBwB,IAEGA,EAAcC,sBAGlB/G,IAAIgH,eAEJlG,EAAMS,YACFvB,IAAIwD,eAAe,oCAMnC,4BAEgC,aAAxB9C,SAASqP,YAET/P,IAAImP,aAKZ,2BAAkCa,GAE9B,MAAMhP,EAAiBiF,OAAOtC,OAAO,IAErC,GAAIqM,EACJ,CACI,IAAI/E,EAEJ+E,EAAYrG,MAAM,SAASrE,QAAQ,CAACkH,EAAMhH,KAElCgH,IAEIA,EAAKyD,SAAS,MAEdhF,EAAQuB,EAAK7C,MAAM,KACnB3I,EAAO8I,mBAAmBmB,EAAM,IAAItC,QAAQ,IAAK,QAC7CmB,mBAAmBmB,EAAM,GAAGtC,QAAQ,IAAK,SAI7C3H,EAAOwE,GACHsE,mBAAmB0C,EAAK7D,QAAQ,IAAK,WAMzD,OAAO3H,EAIX,uBAA8BsD,GAE1B,IAAID,EAEAC,EAAO,OAAP,MAA6BA,EAAO,OAAP,oBAE7BD,EAAkBrE,IAAIkQ,mBAAmB5L,EAAO,QAE3CtE,IAAImQ,oBAAoB9L,IAEzBrE,IAAIgF,oBAAoBX,EAAiBC,IAKrD,wBAA+BpE,GAE3B,IAAIE,EACJ,MAAMC,EAAMC,KAAKC,UAAUL,GAEvBF,IAAIQ,aAAaC,IAAIJ,KAIjBD,EAFAF,EAAM,OAEUQ,SAASC,eAAeT,EAAM,QAI9BU,OAGhBR,IAEAA,EAAcgQ,oBACV,UAAWpQ,IAAIQ,aAAawB,IAAI3B,IACpCL,IAAIQ,aAAa6P,OAAOhQ,KAKpC,yBACI8B,EAAkC,GAClCmO,GAAyB,GAGzB,IAAItP,GAAkB,EAqCtB,OApCImB,EAAeC,OAAS,GAExBpB,GAAS,EAELsP,GAIAtQ,IAAIoE,cAGRpE,IAAImC,eAAeY,QAAQZ,GAC3BnC,IAAI6F,sBAIJ7F,IAAImC,eAAemD,QAASC,IAExBA,EAAchD,QAAQ+C,QAASzC,IAE3B,MAAMf,EAAMC,+CAAQC,IAAIa,EAAOlB,OAAQkB,EAAOhB,QAE9C,GAAIC,EACJ,CACI,MAAMyO,EAAezO,EAAIG,UACrBY,EAAO6C,YAAaxD,WAAWC,gBAEkB,IAAjDoO,EAAarF,QAAQ3F,EAAclD,UAEnCkO,EAAaxN,KAAKwC,EAAclD,cAO7CrB,EAGX,iBACIY,EACA4O,EACAlI,EAAe,GAEf,GAAI1G,EACJ,CACI,IAAI6O,EAAyB,KAE7B,GAAInI,EAAO,EACX,CACI,MAAMoI,EAAQ,IAAIzI,KAClBwI,EAAU,IAAIxI,KACVyI,EAAM9H,cACN8H,EAAM3H,WACN2H,EAAM1H,UAAYV,EAClB,EAAG,EAAG,GAAGqI,cAGjBjQ,SAASkH,OAAT,UAEOC,mBAAmBjG,GAF1B,YAEmCiG,mBAAmB2I,GAFtD,kBAEsExQ,IAAI2E,WAF1E,qBAEiG8L,IAKzG,eACID,EACAI,GAAiB,EACjBC,GAAuB,EACvBC,GAA6B,GAG7B,MAAM9G,EAAOhK,IAAI4K,UACjB,IAAImG,EAEJ,GAAIF,EACJ,CACI,MAAMG,EAAOpQ,OAAOyF,SAAS2K,KAAKrH,MAAM,KAAK,GAExB,kBAAV6G,EAEP5P,OAAOqQ,QAAQC,aAAa,KAAM,GAAlC,UAAyCF,EAAzC,YAAiDR,IAI7CI,EAEAhQ,OAAOqQ,QAAQC,aACX,KACA,GAFJ,UAGOF,EAHP,YAGehR,IAAImR,oBACXlL,OAAOmL,OAAOpH,GAAQ/D,OAAOtC,OAAO,MAAO6M,MAInD5P,OAAOqQ,QAAQC,aACX,KACA,GAFJ,UAGOF,EAHP,YAGehR,IAAImR,oBAAoBX,UAQ3CO,EAFiB,kBAAVP,EAEMA,EAITI,EAEa5Q,IAAImR,oBACblL,OAAOmL,OAAOpH,GAAQ/D,OAAOtC,OAAO,MAAO6M,IAIlCxQ,IAAImR,oBAAoBX,GAIzC5P,OAAOyF,SAAS2D,OAAS+G,IAErBD,IAEA9Q,IAAI8Q,mBAAoB,GAG5BlQ,OAAOyF,SAAS2D,KAAO+G,GAMnC,mBAA0B5F,GAEtBnL,IAAI6O,UAAU7O,IAAIqR,eAAgBlG,GAGtC,kBAAyB1I,GAErB,IAAKA,EAED,OAGJ,GAAwB,IAApBA,EAASL,OAET,OAGJ,MAAMkP,EAAS7O,EAASkN,IAAI4B,GAAKvR,IAAIwR,oBAAoBD,IACzDvR,IAAImC,eAAesP,WAAWH,GAC9BtR,IAAI6F,qBAGR,iBACIxD,EACAqP,GAAiB,EACjBC,EACAC,EAA6B,SAC7BC,EAA2B,SAC3BC,EAA0B,IAC1BC,EAAgC,MAEhCrO,oDAAasO,OACT,CACIjO,MACA,CACIkO,aACA,CACIC,WAAYN,EACZO,SAAUN,GAEdO,iBAAkBN,EAClBC,eACAJ,OACAD,QACArP,WAEJ8B,KAAM,SAEV,SAIR,wBAEI,MAAMgH,EAAWnL,IAAIwK,UAAU6H,KAAKhB,gBAChClG,EAEImH,QAAQ,uBAAD,OAAwBnH,EAAxB,QAEPnL,IAAIqL,YAAY,IAKpBrL,IAAIuS,gB,QAj8CGtS,cAAwB,E,QAEf0E,WACpB/D,OAAOyF,SAASmM,UAAY,I,QAEjBzM,aAAoB,K,QACrB0M,QAAyB,K,QAEzBtQ,oB,UACA6M,wB,UACA0D,QAAyB,mB,QACzB9D,wBAAkC,oB,QAElCjI,eAAyB,E,QAEzBmK,mBAA6B,E,QAC7B6B,SACV/R,OAAOgS,UAAUC,UAAU5C,SAAS,YACnCrP,OAAOgS,UAAUC,UAAU5C,SAAS,Q,QAC3B3C,OACV1M,OAAOgS,UAAUC,UAAU5C,SAAS,Q,QAC1B6C,UACVlS,OAAOgS,UAAUC,UAAU5C,SAAS,W,QAC1B8C,SACVnS,OAAOgS,UAAUC,UAAU5C,SAAS,YACjCrP,OAAOgS,UAAUC,UAAU5C,SAAS,eACpCrP,OAAOgS,UAAUC,UAAU5C,SAAS,SACpCrP,OAAOgS,UAAUC,UAAU5C,SAAS,WACpCrP,OAAOgS,UAAUC,UAAU5C,SAAS,UACpCrP,OAAOgS,UAAUC,UAAU5C,SAAS,iB,QAC7B+C,SACVpS,OAAOgS,UAAUC,UAAU5C,SAAS,U,QAE1BzP,aACV,IAAI4J,I,QACM6I,SAA0B,K,QAC1BC,SAA0B,K,QAC1BhF,aAAuB,E,QACvBiF,eAAgC,U,QAChChF,QAA0B,K,QAC1BE,WACV,CACI+E,KAAK,EACLC,MAAM,EACNhT,IAAK,IACLiT,OAAO,G,QAED9E,qBACV,CACI4E,KAAK,EACLC,MAAM,EACNhT,IAAK,IACLiT,OAAO,G,QAED/O,oBAA8B,e,QAC9BgP,UAA2B,S,QAG3BlE,QAAuB,IAAImE,I,QAC3BC,UAA2B,qB,QAE3BC,8B,UAEA3G,qB,UACAtC,mBAA6B,4B,QAC7B4G,eAAyB,W,QAGzBhJ,SAAsB,CAChCsL,mBAAoB,GACpBC,iBAAkB,EAClBC,aAAc,KACdC,oBAAqB,GACrBC,WAAY,eACZxL,iBAAkB,GAClBD,KAAM,GACN0L,iBAAkB,IAClBC,2BAA2B,EAC3BC,uBAAwB,KACxBC,uBACA,CACI,CACInR,YAAa,GACboR,SAAU,GACVC,aAAc,GACd3J,IAAK,KAGb4J,QAAS,GACT5L,mBAAoB,GACpBD,OAAQ,GACR8L,mBAAoB,GACpBC,iBAAkB,GAClBC,QAAS,GACTC,kBAAkB,EAClBC,SAAU,GACVC,mBAAoB,IACpBnJ,aAAcxF,OAAOtC,OAAO,MAC5BiJ,6BAA6B,G,yOA3FhCiI,sC,qZAuDAA,sC,oOChJL,uIAUO,IAAKC,G,SAAAA,O,mBAAAA,I,uBAAAA,I,uBAAAA,I,2BAAAA,I,0BAAAA,M,KAyBG,MAAMjR,EAyBjB,oBAA2BkR,GAEvB,IAAI/T,EAEJ,OAAQ+T,GAEJ,IAAK,WACD/T,EAAS,SACT,MACJ,IAAK,OACDA,EAAS,UACT,MACJ,QACIA,EAAS+T,EAAchK,cAI/B,OAAO/J,EAGX,uBAA8BqB,EAAiB2S,GAE3C,IAAIhU,EAA0B,KA0B9B,OAxBIqB,IAEArB,EACI,uBAAKX,IAAKL,IAAIiV,OAAQD,MAAOA,GACzB,uBACIE,UAAU,YACVF,MAAO,CAAEG,MAAO,OAAQC,UAAW,SAEnC,gBAAC,IAAD,CACIC,YAAU,EACV1D,KAAK,qBACLqD,MAAO,CAAEM,SAAU,UAEvB,gBAAC,IAAD,CACID,YAAU,EACV1D,KAAK,oBAGb,uBAAKqD,MAAO,CAAEO,WAAY,UACrBlT,KAKVrB,EAGX,wBAA+BsQ,GAE3B,IAAItQ,EAA0B,KAC9B,MAAMwU,EAA0B,GAehC,OAbIlE,EAAOlP,OAAS,IAEhBkP,EAAOhM,QAAQ,CAACkH,EAAchH,KAE1BgQ,EAAKzS,KAAKc,EAAI4R,gBACVjJ,EACAhH,EAAQ8L,EAAOlP,OAAS,EAAI,CAAEsT,aAAc,QAAMC,MAG1D3U,EACI,gBAAC,WAAD,KAAiBwU,IAGlBxU,EAGX,sBAA6B4U,GAEzB,IAAK5V,IAAIqI,SAASwL,aAEd,OAAOgC,IAAY,KAGvB,IAAI7R,EACJ,OAAQ4R,GAEJ,IAAK,SACD5R,EAAQhE,IAAIqI,SAASwL,aAAaiC,OAClC,MACJ,IAAK,OACD,OAAOD,IAAY,KACvB,IAAK,cACD7R,EAAQhE,IAAIqI,SAASwL,aAAakC,YAClC,MACJ,IAAK,UACD/R,EAAQhE,IAAIqI,SAASwL,aAAamC,QAClC,MACJ,IAAK,UACDhS,EAAQhE,IAAIqI,SAASwL,aAAaoC,QAClC,MACJ,QAGI,OAFAnR,IAAQoR,KAAR,wBAA8BN,IAEvB,GAGf,OAAO5R,EAGX,oBAA2BmS,GAEvB,IAAInV,EAEJ,OAAQmV,GAEJ,IAAK,UACDnV,EAAS,KACT,MACJ,IAAK,UACDA,EAAS,KACT,MACJ,IAAK,UACDA,EAAS,KACT,MACJ,IAAK,UACDA,EAAS,KACT,MACJ,IAAK,UACDA,EAAS,KACT,MACJ,IAAK,UACDA,EAAS,KACT,MACJ,IAAK,SACDA,EAAS,QACT,MACJ,IAAK,SACDA,EAAS,QACT,MACJ,QACIA,EAASmV,EAAUpL,cAI3B,OAAO/J,EAIX,2BACI+C,EACA8Q,EAA4B,MAE5B,IAAI7T,EAAwB,KACxBoV,EAAkCvB,EAOtC,GALKuB,IAEDA,EAAmB1S,IAAa2S,cAActS,IAG9CqS,EACJ,CAEIpV,EADYoV,EACCE,sBAAsBvS,EAAK,MAG5C,OAAO/C,EAGX,0BAAiCgD,GAE7B,MAAMuS,EAAqBvS,EAAM6F,OAEjC,IAEI,MAAMrE,EAAgB+Q,EAAWC,YAAY,KAC7C,GAAIhR,EAAQ,EAIR,OAFAV,IAAQoR,KAAR,iCAAuCK,EAAvC,MAEOV,IAAY,KAGvB,IAAID,EAAoBW,EAAWE,UAAU,EAAGjR,GAChDoQ,EAAYA,EAAUjN,QAAQ,KAAM,IAAIoC,cACxC6K,EAAY/R,EAAI6S,2BAA2Bd,GAE3C,MAAMe,EAAqBJ,EAAWE,UAAUjR,EAAQ,GAExD,OAAKoQ,GAAee,KAAcd,EAAOD,GAOlCC,EAAOD,GAAWe,IALrB7R,IAAQoR,KAAR,iCAAuCK,EAAvC,MAEOV,IAAY,MAK3B,MAAOlT,GAKH,OAHAmC,IAAQoR,KAAR,iCAAuCK,EAAvC,MACAzR,IAAQoR,KAAKvT,EAAMN,SAEZwT,IAAY,MAK3B,sBACI9R,EACA6S,GAGA,IAAI5V,GAAkB,EAClBkB,EAA4B0U,EAOhC,GALK1U,IAEDA,EAAa2B,EAAIgT,oBAAoB9S,IAGrC7B,GAAcA,EAAU,YAExB,OAAQA,EAAU,aAEd,KAAK4S,EAAYgC,OACb9V,GAAS,EACT,MACJ,KAAK8T,EAAYiC,SACbhT,EAAK,UAAe,EACpB,MACJ,KAAK+Q,EAAYkC,SACbjT,EAAK,UAAe,EACpB,MACJ,KAAK+Q,EAAYmC,WAEjB,KAAKnC,EAAYoC,UACb,MACJ,QACI,MAAM,IAAIC,MAAJ,+BACsBjV,EAAU,mBAK9ClB,GAAS,EAGb,OAAOA,EAGX,qBACIiD,EACAqN,EACAvN,GAEA,GAAsB,IAAlBuN,EAAOlP,OAEP2B,EAAK,OAAY,EACjBA,EAAK,WAAiBE,EAAUF,MAAV,eAG1B,CACI,MAAMqT,EACF,uBAAKpC,MAAO,CACRqC,SAAU,UACVC,WAAY,WAEXzT,EAAIC,iBAAiBwN,IAG9BvN,EAAK,OAAY,EAEbE,EAAUF,MAAV,WAEAA,EAAK,WACD,2BACI,gBAAC,IAAD,CAAYG,QAAQ,WACfD,EAAUF,MAAV,YAEJqT,GAKTrT,EAAK,WAAiBqT,IAlTjBvT,EAEO6S,2BACpB,CACIa,MAAO,QACPC,KAAM,OACNC,SAAU,WACVC,MAAO,QACPC,KAAM,OACNC,WAAY,aACZC,WAAY,aACZC,MAAO,QACPC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,WAAY,aACZC,KAAM,OACNC,OAAQ,SACRC,KAAM,OACNC,OAAQ,SACRC,IAAK,MACLC,KAAM,OACNC,OAAQ,W,uJCUb,MAAMC,UACTC,gBAIOC,YAAY7U,GAEf8U,MAAM9U,GAED2U,EAAKI,cAENJ,EAAKI,aAAc,EACnBC,IAAmBzJ,IAAI0J,KACvBD,IAAmBzJ,IAAI2J,KACvBF,IAAmBzJ,IAAI4J,KACvBH,IAAmBzJ,IAAI6J,MAG3B9G,KAAK+G,MACL,CACIC,mBAAoB,MAI5B,iCAEI,IAAKhH,KAAKtO,MAAM4N,KAIZ,YAFAU,KAAKiH,SAAS,CAAED,mBAAoB,OAKxC,IAAKhH,KAAKtO,MAAM4N,KAAK1B,SAAS,KAI1B,YAFAoC,KAAKiH,SAAS,CAAED,mBAAoB,OAKxC,MAAM1H,QAAa4H,IAAgBC,YAAYnH,KAAKtO,MAAM4N,MAC7C,OAATA,EAOJU,KAAKiH,SAAS,CAAED,mBAAoB1H,EAAK8H,WALrCpH,KAAKiH,SAAS,CAAED,mBAAoB,OAQrCK,oBAEHrH,KAAKsH,2BAGFC,mBAAmBC,EAAsBC,GAExCD,EAAUlI,OAASU,KAAKtO,MAAM4N,MAE9BU,KAAKsH,2BAIN3H,SAEH,MAAM,EAOFK,KAAKtO,OAPH,QACFgW,EADE,UAEF7E,EAFE,WAGFG,EAHE,WAIF2E,EAJE,KAKFrI,GALJ,EAMOsI,EANP,wEASA,IAAKtI,EAED,OAAO,KAGX,IAAIuI,EAAgC,KAEpC,GAAIvI,EAAK1B,SAAS,KAClB,CACI,IAAKoC,KAAK+G,MAAMC,mBAEZ,OAAO,KAGX,MAAMc,EAAyB,GAC1B9E,GAED8E,EAAapX,KAAKgX,EAAQK,gBAG1BJ,GAEAG,EAAapX,KAAKgX,EAAQM,eAG9BF,EAAapX,KAAKgX,EAAQO,WAE1BJ,EACI,wBACIK,cAAY,OACZrF,UAAWiF,EAAarK,KAAK,KAO7B0K,wBACI,CACIC,OAAQpI,KAAK+G,MAAMC,oBAE3BqB,KAAK,YAKjB,CACI,MAAMC,EAA0BhJ,EAAKhI,MAAM,KAE3C,GAA6B,IAAzBgR,EAAcvY,OAGd,OADA0C,IAAQoR,KAAR,wBAA8BvE,EAA9B,MACO,KAGX,MAAMiJ,EAAqBD,EAAc,GACzC,GAA0B,IAAtBC,EAAWxY,SAAiBwY,EAAWzU,WAAW,MAGlD,OADArB,IAAQoR,KAAR,wBAA8BvE,EAA9B,MACO,KAGX,IAAIyC,EAAmBuG,EAAc,GACrC,MAAMR,EAAyB,GAC1B9E,GAED8E,EAAapX,KAAKgX,EAAQc,aAG1Bb,GAEAG,EAAapX,KAAKgX,EAAQC,YAG9B5F,EAAWA,EAASzL,QAAQ,MAAO,IAEnCuR,EACI,gBAAC,IAAD,CACIhF,UAAWiF,EAAarK,KAAK,KAC7B6B,KAAM,CAACiJ,EAAYxG,KAK/B,MAAM0G,EAAwB,CAACf,EAAQgB,MAMvC,OALI7F,GAEA4F,EAAY/X,KAAKmS,GAIjB,gBAAC,IAAD,eACIA,UAAW4F,EAAYhL,KAAK,MACxBmK,GAEHC,IA1KJxB,EAGMI,aAAc,EA4KlBkC,gBAzNCC,GAAiBC,YAC7B,CACId,eACA,CACI,QACA,CACIe,QAAS,QACTC,MAAO,oBAGfP,YACA,CACIM,QAAS,QACTC,MAAO,mBAEXd,UACA,CACI,QACA,CACIe,KAAM,eACNC,OAAQ,MACRC,cAAe,OACfC,cAAe,UACfJ,MAAO,QAGfpB,WACA,CACIsB,OAAQ,mBAEZjB,cACA,CACI,QACA,CACIiB,OAAQ,oBAGhBP,KACA,KAmLOC,CAAmBtC,I,uGCnJ3B,MAAM+C,UACT9C,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACzB,IAAI4X,IAAmBD,EAAO1C,IAC1BhY,EAA0B,KAqD9B,GAlDK0a,EAAOxG,UAMRwG,EAAOxG,WAAa,IAJpBwG,EAAOxG,UAAP,UAAsBwG,EAAO3B,QAAQgB,KAArC,KAOA,UAAWW,IAEPA,EAAOE,QAEPF,EAAO9X,SAAW8X,EAAOE,cAGtBF,EAAOE,OAGd,UAAWF,IAEU,WAAjBA,EAAO1X,OAAuC,SAAjB0X,EAAO1X,OACnB,YAAjB0X,EAAO1X,QAEP0X,EAAOxG,WAAP,UAAuBwG,EAAO3B,QAAQ2B,EAAO1X,OAA7C,YACO0X,EAAO1X,QAIlB,UAAW0X,IAEXA,EAAOxG,WAAP,UAAuBwG,EAAO3B,QAAQ8B,MAAtC,YAEOH,EAAOG,OAGbH,EAAOxX,UAERwX,EAAOxX,QAAU,aAGjBwX,EAAO9X,UAAuC,kBAApB8X,EAAO9X,WAEjC8X,EAAO9X,SACH,wBAAMsR,UAAWwG,EAAO3B,QAAQxO,MAC3BmQ,EAAO9X,WAKhB,SAAU8X,EACd,CACI,GAAIA,EAAO/J,KAEP,GAAI+J,EAAO9X,SAEP8X,EAAO9X,SACH,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI+N,KAAM+J,EAAO/J,KACbqD,MAAO,CAAE8G,YAAa,UAEzBJ,EAAO9X,cAIpB,CACI+X,GAAQ,EAER,IAAII,EAAYL,EAAO3B,QAAQiC,QACX,WAAhBN,EAAOO,OAEPF,GAAS,WAAQL,EAAO3B,QAAQmC,gBAEV,SAAtBR,EAAOS,aAEPJ,GAAS,WAAQL,EAAO3B,QAAQqC,aAChCV,EAAOxG,WAAP,UAAuBwG,EAAO3B,QAAQsC,KAAtC,KACAX,EAAOO,KAAO,SAGlBP,EAAO9X,SACH,gBAAC,IAAD,CACIsR,UAAW6G,EACXpK,KAAM+J,EAAO/J,cAKtB+J,EAAO/J,KAgDlB,GA7CI,YAAa+J,IAETA,EAAOY,UAEHZ,EAAO9X,SAEH8X,EAAO9X,oBAAoBuI,MAE3BuP,EAAO9X,SAASb,KACZ,gBAAC,IAAD,CACI4O,KAAM+J,EAAOY,QACbjc,IAAI,UACJ2U,MAAO,CAAEO,WAAY,WAK7BmG,EAAO9X,SACH,gBAAC,WAAD,KACK8X,EAAO9X,SACR,gBAAC,IAAD,CACI+N,KAAM+J,EAAOY,QACbtH,MAAO,CAAEO,WAAY,WAOrCmG,EAAO9X,SAAW,gBAAC,IAAD,CAAM+N,KAAM+J,EAAOY,kBAItCZ,EAAOY,gBAGXZ,EAAO3B,eACP2B,EAAOS,kBACPT,EAAOa,UAEV,QAASb,UAEFA,EAAO1C,IAGd2C,EACJ,CACI,MAAMa,EAAQ,eAAQd,UAEfc,EAAStY,QAEhBlD,EACI,gBAAC,IAAD,eACI+Y,QAAS,CACL6B,MAAOvJ,KAAKtO,MAAMgW,QAAQ6B,QAE1BY,SAKZxb,EACI,gBAAC,IAAD,eACI+Y,QAAS,CACL6B,MAAOvJ,KAAKtO,MAAMgW,QAAQ6B,MAC1Bb,KAAM1I,KAAKtO,MAAMwY,UACXlK,KAAKtO,MAAMgW,QAAQwC,eAAY5G,IAErC+F,IAIhB,OAAO1a,GAIAga,gBA1PCC,GAAiBC,YAC7B,CACIW,MACA,CACIvG,SAAU,EACVgG,OAAQ,GACRmB,UAAW,GACXrB,MAAO,IAEXtF,OACA,CACI,UACA,CACI4G,gBAAiBC,iBAAO9Y,IAAI+Y,eAAe,UAAW,KAE1DF,gBAAiB7Y,IAAI+Y,eAAe,UACpC5Y,MAAOiX,EAAM4B,QAAQC,gBAAgBjZ,IAAI+Y,eAAe,YAE5DG,KACA,CACI,UACA,CACIL,gBAAiBC,iBAAO9Y,IAAI+Y,eAAe,QAAS,KAExDF,gBAAiB7Y,IAAI+Y,eAAe,QACpC5Y,MAAOiX,EAAM4B,QAAQC,gBAAgBjZ,IAAI+Y,eAAe,UAE5DZ,QACA,CACIZ,MAAO,QAEXc,cACA,CACI5G,SAAU,IAEd8G,YACA,CACI9G,SAAU,IAEdiH,UACA,CACInB,MAAO,QAEXQ,MACA,GAEAb,KACA,GAEA/E,QACA,CACI,UACA,CACI0G,gBAAiBC,iBAAO9Y,IAAI+Y,eAAe,WAAY,KAE3DF,gBAAiB7Y,IAAI+Y,eAAe,WACpC5Y,MAAOiX,EAAM4B,QAAQC,gBAAgBjZ,IAAI+Y,eAAe,aAE5DrR,KACA,CACI8L,SAAU,SACV2F,aAAc,YAElBX,KACA,CACIf,OAAQ,GACRmB,UAAW,GACXQ,SAAU,GACV7B,MAAO,MAsLJJ,CAAmBS,I,wEC7O3B,MAAMyB,UACTvE,gBAEO3G,SAEH,MAAM,EAMFK,KAAKtO,OANH,QACFgW,EADE,UAEF9V,EAFE,SAGFkZ,EAHE,KAIFC,GAJJ,EAKOC,EALP,0DASIF,SAAUG,EACVF,KAAMG,EACNxC,KAAMyC,GAENzD,EADG0D,EAJP,YAKI1D,EALJ,4BAOM2D,EAAa,CAACF,GAYpB,OAVIL,GAEAO,EAAW3a,KAAKua,GAGhBF,GAEAM,EAAW3a,KAAKwa,GAIhB,gBAAC,IAAD,eACIxD,QAAS0D,EACTvI,UAAWwI,EAAW5N,KAAK,KAC3B7L,UAAWA,GACPoZ,KAKLrC,gBA5DCC,GAAiBC,YAC7B,CACIiC,SACA,CACI9F,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,QAEXgC,KACA,CACIA,KAAM,QAEVrC,KACA,KA8COC,CAAmBkC,I,+BCzElC,kCAAe,MAAM7V,EAMjB,eAAsBsW,GAElB,IAAKtW,EAAU+R,MAEX,MAAMjC,MACF,0DAGR9P,EAAU+R,MAAMwE,MAAM7a,KAAK4a,GAG/B,oBAEItW,EAAU+R,MAAQ,KAClB/R,EAAUwW,mBAAqB,KAC/BxW,EAAUyW,2BAA4B,EAG1C,iCAEIzW,EAAUwW,mBAAqB,KAC/BxW,EAAUyW,2BAA4B,EAG1C,kCAEI,GAAIzW,EAAUyW,0BAEV,MAAM3G,MAAM,+EAIhB9P,EAAUwW,mBAAqBxW,EAAU+R,MACzC/R,EAAUyW,2BAA4B,EAG1C,kBAEI,OAAOzW,EAAU+R,MAGrB,oBAEI,OAAwB,OAApB/R,EAAU+R,OAKP/R,EAAU+R,MAAM2E,eAG3B,+BAEI,IAAK1W,EAAUyW,0BAEX,MAAM3G,MAAM,iFAIhB9P,EAAU+R,MAAQ/R,EAAUwW,mBAC5BxW,EAAUwW,mBAAqB,KAC/BxW,EAAUyW,2BAA4B,EAG1C,gBAAuB1E,GAEnB/R,EAAU+R,MAAQA,GAxEL/R,EAEF+R,MAAsB,KAFpB/R,EAGFwW,mBAAmC,KAHjCxW,EAIFyW,2BAAqC,G,oICwBxD,MAAME,EACL,cAAD,KACInc,YADJ,OAEI0K,YAFJ,G,IAKqB0R,G,IAAN,MAAMA,EACpB,cAAD,yCAMI,sBAA8BC,GAE1B,MAAMld,EACF,CACImd,eAAgB,GAChBxc,OAAQuc,EAAMvc,OACdyc,eAAgB,IAGR/R,IAAegS,WAAWH,EAAMvc,QACxC2D,QAASiM,IAEbvQ,EAAOod,eAAerb,KAAKwO,EAAE+M,mBAGjC,IAAIC,EAA8B,GAyBlC,OAtBIA,EAFAL,aAAiB/R,MAEL+R,EAIA,CAACA,GAGjBK,EAAUjZ,QAASiM,IAEf,GAAIvQ,EAAOod,eAAelT,QAAQqG,EAAE5P,QAAW,GAEvC4P,EAAEiN,WACN,CACI,MAAMC,EAAS,IAAIT,EACnBS,EAAO5c,OAAS0P,EAAE+M,gBAClBG,EAAOlS,OAASgF,EAAEmN,4BAElB1d,EAAOmd,eAAepb,KAAK0b,MAKhCzd,EAGX,sBAOI,OALKid,EAAcU,iBAEfV,EAAcU,eAAiB,IAAIV,GAGhCA,EAAcU,eAGzB,6BAEI,MAAMC,EAAezS,MAAMC,KAAKC,IAAeC,OAAOC,UAEtD,IAAK,MAAMC,KAAQoS,EAEXpS,IAASA,EAAK7F,eAAiB6F,EAAKxF,cAEpCwF,EAAKxG,QAQjB,0BAEI,MAAM6Y,EAAa1S,MAAMC,KAAKC,IAAeC,OAAOC,UACpD,IAAK,MAAMC,KAAQqS,EAEXrS,aAAgBS,KAEhBT,EAAKsS,eAMjB,oBAEI,MAAM9d,EAAwB,GAExB4d,EAAezS,MAAMC,KAAKC,IAAeC,OAAOC,UAEtD,IAAK,MAAMC,KAAQoS,EAEXpS,IAASA,EAAK7F,eAAiB6F,EAAKxF,cAEpChG,EAAO+B,KAAKkb,EAAcc,eAAevS,IAIjD,OAAOxL,EAGX,yBAAgCW,GAE5B,IAAIqd,EAQJ,GANI3S,IAAeC,OAAO7L,IAAIkB,KAE1Bqd,EACI3S,IAAeC,OAAOtK,IAAIL,KAG7Bqd,IAAwBA,EAAoBC,qBAE7C,MAAM,IAAI9H,MAAJ,yBAA4BxV,EAA5B,eAGV,OAAOqd,EAAoBC,qBAI/B,oBAA2BC,GAKvBjB,EAAckB,mBAEd,IAAK,MAAM9e,KAAO4F,OAAOC,KAAKgZ,GAC9B,CACI,IAAK7S,IAAeC,OAAO7L,IAAIJ,GAE3B,MAAM8W,MAAM,oDAAD,OAC6C9W,EAD7C,MAIfgM,IAAeC,OAAOtK,IAAI3B,GAAM+e,KAAKF,EAAS7e,GAAKiC,MAEnD,IAAI+c,OAAqC1J,EACrCsI,EAAc/W,SAASoY,cAAc7e,IAAIJ,KAEzCgf,EAAepB,EAAc/W,SAASoY,cAActd,IAAI3B,IAG5D4d,EAAc/W,SAASoY,cAAc7d,IACjCpB,EACA,CACIsB,OAAQud,EAAS7e,GAAKsB,OACtB4d,uBAAwBF,EAClBA,EAAaE,4BAAyB5J,EAC5C6J,cAAeN,EAAS7e,GAAKmf,cACvBC,EAAOP,EAAS7e,GAAKmf,eAAeE,cACpC/J,EACNgK,WAAYT,EAAS7e,GAAKsf,WAE1Brd,KAAM,MAKtB,sBACIX,EAAgBie,GAEhB,IAAKvT,IAAeC,OAAO7L,IAAIkB,GAE3B,MAAMwV,MAAM,yCAAD,OAA0CxV,IAGzDsc,EAAckB,mBAEd,MAAMU,EACFxT,IAAeC,OAAOtK,IAAIL,GAMxBme,GAJuBD,EAAWZ,qBAClCY,EAAWZ,qBACXY,GAE+B,GAErC,IAAK,MAAMna,KAAcka,EAEjBA,EAAKvc,eAAeqC,IAEpBoa,EAAQC,aAAara,EAAYka,EAAKla,IAK3Csa,QAAQre,EAAgBse,GAY3B,OAVA5N,KAAKiN,cAAc7d,IACfE,EACA,CACIA,SACA4d,uBAAwBU,EACxBT,mBAAe7J,EACfgK,WAAY,GACZrd,KAAM,KAGP+P,KAAKiN,cAActd,IAAIL,GAG3Bue,QAAQve,GAEX,OAAO0Q,KAAKiN,cAActd,IAAIL,GAG3Bwe,sBAAsBxe,EAAgBse,GAEzC,MAAMf,EAAW7M,KAAKiN,cAActd,IAAIL,GACxCud,EAASK,uBAAyBU,EAC7Bf,EAASM,gBAEVN,EAASM,cAAgB,IAAIvX,KAAK,2B,EAxN3B0W,oB,iDAEd9J,K,yEAA0D,IAAIzK,O,oHClC9CgD,G,IAAN,MAAMA,EACpB,cAAD,sCAWI,sBAOI,OALKA,EAAcuR,iBAEfvR,EAAcuR,eAAiB,IAAIvR,GAGhCA,EAAcuR,eAGzB,qBAEI,MAAO,CACHyB,oBAAqB/N,KAAKgO,WAAWD,oBACrCE,MAAOjO,KAAKgO,WAAWC,MACvBC,aAAclO,KAAKgO,WAAWG,oBAAsB,EACpDne,QAASgQ,KAAKgO,WAAWhe,SAI1BgL,qBAEHgF,KAAKgO,WAAWG,oBAAsB,EAGnCC,kBACHpe,EAAyB,KACzBqe,GAAqB,EACrBN,GAA+B,GAGa,IAAxC/N,KAAKgO,WAAWG,sBAEhBnO,KAAKgO,WAAWD,oBAAsBA,EACtC/N,KAAKgO,WAAWC,MAAQI,EACxBrO,KAAKgO,WAAWhe,QAAUA,GAE9BgQ,KAAKgO,WAAWG,sBAGbG,oBAEHtO,KAAKgO,WAAWG,sBAEZnO,KAAKgO,WAAWG,oBAAsB,IAItCnO,KAAKgO,WAAWG,oBAAsB,K,EA1D/B7B,oB,8CAEd9J,K,wEACG,CACIuL,qBAAqB,EACrBE,OAAO,EACPje,QAAS,KACTme,oBAAqB,M,0CAa5BI,K,qJChCL,gJA+Be,MAAevU,eAoC1B,qBAA4BC,GAExBD,eAAeyS,aAAaxS,EAAO3K,QAE/B2K,GAEAA,EAAOhH,QAAS4Y,IAERA,GAEAA,EAAM2C,kBAOtB,oBAA2BC,GAEnBzU,eAAe0U,QAAQtgB,IAAIqgB,IAE3BzU,eAAe0U,QAAQ1Q,OAAOyQ,GAKtC,cACIA,UACAnf,OACAie,MAEA,IAAI1B,MAkBJ,OAbIA,MAHAle,oCAAImT,eAGI5D,KAAK,OAAD,OAAQvP,oCAAImT,eAAZ,YAA8B2N,UAA9B,aAA4Cnf,OAA5C,OAKJ4N,KAAK,OAAD,OAAQuR,UAAR,aAAsBnf,OAAtB,OAGZie,MAEA1B,MAAMkB,KAAKQ,MAGR1B,MAIX,kBAAyBvc,GAErB,IAAIX,EAWJ,OAPIA,EAFAqL,eAAe0U,QAAQtgB,IAAIkB,GAElB0K,eAAe0U,QAAQ/e,IAAIL,GAI3B,IAAI6R,IAGVxS,EAGX,yBAAgC8f,GAE5B,IAAKzU,eAAe2U,gBAAgBvgB,IAAIqgB,GAEpC,MAAM3J,MAAM,GAAD,OAAI2J,EAAJ,wBAGf,OAAOzU,eAAe2U,gBAAgBhf,IAAI8e,GAI9C,kBAAyBxU,GAErB,IAAItL,GAAkB,EAQtB,OANIsL,KACKtL,EAASqL,eAAegS,WAAW/R,EAAO3K,QAAQsa,KAAO,KAE9Djb,EAASsL,EAAO7G,KAAKyY,GAASA,GAASA,EAAMlX,eAG1ChG,EAGX,gBAAuBigB,GAQnB,OANK5U,eAAeC,OAAO7L,IAAIwgB,EAAUtf,SACrC0K,eAAeC,OAAOtK,IAAIif,EAAUtf,UAAYsf,GAEhD5U,eAAeC,OAAO7K,IAAIwf,EAAUtf,OAAQsf,GAGzCA,EAKX,oBAA2B3U,GAEnBA,GAEAA,EAAOhH,QAAS4Y,IAERA,GAEAA,EAAMgD,iBAMtB,yBAAgCJ,EAAmBlf,GAE/CyK,eAAe2U,gBAAgBvf,IAAIqf,EAAWlf,GAGlDgX,YAAYjX,GACX,KAvJMA,OAAwB,KAuJ/B,KArJOwf,cAAwBlb,OAAOtC,OAAO,MAqJ7C,KAnJOgD,eAAyB,EAmJhC,KAjJOya,cAAwBnb,OAAOtC,OAAO,MAiJ7C,KA/IO0d,UAAoB,EA+I3B,KA7IO7C,YAAsB,EA6I7B,KA3IO8B,OAAiB,EA2IxB,KAzIOgB,gBAA0B,EAyIjC,KAvIOC,UAAoB,EAuI3B,KArIOT,UAA2B,KAqIlC,KAlIOU,WAAqB,EAmIxBnP,KAAKyO,UAAYzO,KAAKuG,YAAYhX,KAClCyQ,KAAK1Q,OAASA,EAYXkf,gBAIH,GAFAxU,eAAeyS,aAAazM,KAAK1Q,QAE7B0Q,KAAKmM,WAEL,IAAK,MAAMiD,KAAgBpP,KAAKqP,mBAExBD,KAAgBpP,KAAK+O,gBAErB/O,KAAK+O,cAAcK,GACfpP,KAAKsP,iBAAiBF,IAKtCpP,KAAKmM,YAAa,EAClBnM,KAAKiP,gBAAiB,EAInBtb,MAAMkb,GAAwB,GAE5B7O,KAAKkP,WAGFlV,eAAeC,OAAO7L,IAAI4R,KAAK1Q,SAE/B0K,eAAeyS,aAAazM,KAAK1Q,QAGjCuf,GAEA7O,KAAKuP,wBAETvP,KAAK+O,cAAgBnb,OAAOtC,OAAO,MACnC0O,KAAKmM,YAAa,EAClBnM,KAAKiP,gBAAiB,GAMvBjR,OAAO/D,GAEL+F,KAAKiP,iBAEFjV,eAAe0U,QAAQtgB,IAAI4R,KAAK1Q,QAE1B0K,eAAe0U,QAAQ/e,IAAIqQ,KAAK1Q,QAASlB,IAAI4R,OAE/ChG,eAAe0U,QAAQ/e,IAAIqQ,KAAK1Q,QAAS2N,IAAI+C,MAKjDhG,eAAe0U,QAAQtf,IACnB4Q,KAAK1Q,OAAQ,IAAI6R,IAAoB,CAACnB,SAK9C/F,GAAUA,EAAOpB,QAAQmH,OAAS,IAElC/F,EAAO1G,OAAO0G,EAAOpB,QAAQmH,MAAO,GAGhC/F,EAAO2S,sBACJ3S,EAAO2S,qBAAqB/T,QAAQmH,OAAS,GAEhD/F,EAAO2S,qBAAqBrZ,OACxB0G,EAAO2S,qBAAqB/T,QAAQmH,MAAO,IAOpDwP,gBAAgBJ,GAGnB,IAAIzgB,EAAc,KAOlB,OALIygB,KAAgBpP,KAAK8O,gBAErBngB,EAASqR,KAAK8O,cAAcM,IAGzBzgB,EAKJ8gB,gBAAgBL,GAGnB,IAAIzgB,EAWJ,OAPIA,EAFAygB,KAAgBpP,KAAK+O,cAEZ/O,KAAK+O,cAAcK,GAInBpP,KAAKsP,iBAAiBF,GAG5BzgB,EAIJ0d,4BAGH,MAAM3a,EAA+B,GACrC,IAAK,MAAM0d,KAAgBpP,KAAKqP,mBAExBrP,KAAKrL,WAAWya,KAEhB1d,EAAM0d,GAAgBpP,KAAKsP,iBAAiBF,IAIpD,OAAO1d,EAKJua,gBAGH,IAAItd,EAAc,KAClB,MAAM+gB,EAAiB1P,KAAK2P,oBAO5B,OALID,IAEA/gB,EAASqR,KAAK0P,IAGX/gB,EAIJghB,oBAEH,IAAIhhB,EAAwB,KAO5B,OALIqL,eAAe2U,gBAAgBvgB,IAAI4R,KAAKyO,aAExC9f,EAASqL,eAAe2U,gBAAgBhf,IAAIqQ,KAAKyO,YAG9C9f,EAWJgG,WAAWya,GAEd,IAAIzgB,GAAkB,EAEtB,GAAIygB,EAKA,GAAIA,KAAgBpP,KAAK+O,cAErBpgB,EAASqR,KAAKsP,iBAAiBF,KAC3BpP,KAAK+O,cAAcK,OAG3B,CACI,MAAMQ,EAA8B,WAAOR,GAEvCQ,KAA0B5P,KAAK+O,gBAE/BpgB,EAASqR,KAAKsP,iBAAiBM,KACvB5P,KAAK+O,cAAca,SAMnCjhB,EAASqR,KAAKiP,gBAAkBjP,KAAKmM,YAC9BnS,eAAegS,WAAWhM,KAAK1Q,QAAQlB,IAAI4R,MAGtD,OAAOrR,EAIJoe,KAAKQ,GAER,KAAKvN,KAAKkP,WAAalP,KAAKgP,YAExBhP,KAAKrM,OAAM,GAEP4Z,GACJ,CACIvN,KAAKgP,UAAW,EAEhBhP,KAAK6P,SAAStC,GAEd,IAAK,MAAM6B,KAAgBpP,KAAKqP,mBAE5BrP,KAAK+O,cAAcK,GACfpP,KAAKsP,iBAAiBF,GAKtC,OAAOpP,KAGJuP,wBAEH,IAAK,MAAM5V,KAAY/F,OAAOC,KAAKmM,KAAK8O,eAEpC9O,KAAK8P,iBAAiBnW,EAAUqG,KAAK8O,cAAcnV,IAIpDoW,YAAYX,GAEXA,KAAgBpP,KAAK+O,eAErB/O,KAAKgQ,YAAYZ,EAAcpP,KAAK+O,cAAcK,IAMnDP,eAEH,GAAI7O,KAAKmM,WAEL,IAAK,MAAMiD,KAAgBpP,KAAKqP,mBAExBD,KAAgBpP,KAAK+O,eAErB/O,KAAK8P,iBACDV,EAAcpP,KAAK+O,cAAcK,IAKjDpP,KAAKmM,YAAa,EAIf8D,gBAAgBb,EAAsBjR,GAEzC6B,KAAK8O,cAAcM,GAAgBjR,EAIhC+R,kBAAkB3gB,GAErByK,eAAe2U,gBAAgBvf,IAAI4Q,KAAKyO,UAAWlf,GAMhDygB,YAAYZ,EAAsBjR,GAErC,IAAIxP,GAAkB,EAClBwd,GAAsB,EACtBgE,GAAwB,EAU5B,GARMf,KAAgBpP,KAAK+O,gBAEvB/O,KAAKiQ,gBACDb,EAAcpP,KAAKsP,iBAAiBF,IACxCpP,KAAK+O,cAAcK,GAAgBjR,EACnCgS,GAAe,GAGfnQ,KAAKsP,iBAAiBF,KAAkBjR,EAC5C,CACI,IAAKgS,EAED,GAAInQ,KAAK+O,cAAcK,KAAkBjR,GAAS6B,KAAKmP,UACvD,CAOI,IAAK,MAAMiB,KAAYpQ,KAAKqP,mBAExB,GAAIe,IAAahB,GACbgB,KAAYpQ,KAAK+O,eAEb/O,KAAKrL,WAAWyb,GACpB,CACIjE,GAAa,EACb,MAKZnM,KAAKmM,WAAaA,OAIlBnM,KAAKmM,YAAa,EAI1BnM,KAAK8P,iBAAiBV,EAAcjR,GACpCxP,GAAS,EAGb,OAAOA,GAlfeqL,eAGT0U,QACb,IAAI3W,IAJkBiC,eAMZC,OACV,IAAIlC,IAPkBiC,eAQZ2U,gBACV,IAAI5W,K,6BCxCZ,6CAEe,MAAMtF,EAEjB,kBAEI4K,EACAgT,GAAyB,EACzBC,GAAmB,EACnBC,EAA2B,KAC3BC,EAAuB,MAGvB,IAAIxgB,EAAU,GAEd,MAAMygB,EAAQF,GAAa,KAE3B,GAAsB,kBAAXlT,GAAyC,mBAAXA,GAChB,kBAAXA,EAEVrN,EAAUqN,EAAO7G,eAGrB,CACI,IAAK,MAAMka,KAAU9c,OAAOC,KAAKwJ,GACjC,CACI,GAAKmT,KAASxgB,EAAQD,OAASygB,GAyC/B,CACIxgB,GAAW,MACX,MAzCA,IAEI,GAA8B,kBAAnBqN,EAAOqT,GAEd1gB,GAAO,UACA0gB,EADA,cACYrT,EAAOqT,GADnB,YAC8BD,QAEpC,GAA8B,oBAAnBpT,EAAOqT,GAEfL,IAEArgB,GAAO,UAAO0gB,EAAP,uBAA4BD,SAGtC,GAA8B,kBAAnBpT,EAAOqT,IAAyBJ,EAgB5CtgB,GAAO,UAAO0gB,EAAP,aAAkBrT,EAAOqT,IAAzB,OAAmCD,QAd1C,GAAuB,OAAnBpT,EAAOqT,GAEP1gB,GAAO,UAAO0gB,EAAP,iBAAsBD,OAGjC,CACI,MAAME,EAAUle,EAAQme,WACpBvT,EAAOqT,GAASL,EAChBC,EAAS,KAAM,KACnBtgB,GAAO,UAAO0gB,EAAP,cAAmBC,EAAnB,YAA8BF,IAQjD,MAAOle,GAEHvC,GAAO,UAAO0gB,EAAP,6BAAkCD,IAUjDzgB,EAAQmH,OAAOnH,EAAQD,OAAS0gB,EAAM1gB,UAAY0gB,IAElDzgB,EAAUA,EAAQmH,OAAO,EAAGnH,EAAQD,OAAS0gB,EAAM1gB,SAI3D,OAAOC,EAGX,aAAoBM,GAEZ3C,IAAImO,UAEAxL,aAAiBwU,MAEjBnX,IAAImO,QAAQ+U,WAAWvgB,EAAMN,SAI7BrC,IAAImO,QAAQ+U,WAAWvgB,IAI3B/B,OAAOuiB,SAEPA,QAAQxgB,MAAMA,GAKtB,WAAkBN,EAAc+gB,GAE5B,GAAI/gB,aAAmB8U,MASnB,OAPArS,EAAQnC,MAAMN,QACVzB,OAAOuiB,SAEPA,QAAQjN,KACJ,4DAMZ,IAAImN,EAAqBhhB,EAEzB,GAAuB,kBAAZA,EAEPghB,EAAave,EAAQme,WAAW5gB,QAIhC,IAAK,IAAImD,EAAQ,EAAGA,EAAQ8d,UAAUlhB,OAAQoD,IAE1C6d,EAAahhB,EAAQsG,QAAR,WAAoBnD,EAAQ,EAA5B,KAAkC8d,UAAU9d,IAI7D6d,EAAWjhB,OAAS,IAEhBpC,IAAImO,UAEAiV,EAEApjB,IAAImO,QAAQ+U,WAAZ,UAA0BE,EAA1B,YAAmCC,IAInCrjB,IAAImO,QAAQ+U,WAAWG,IAI3BziB,OAAOuiB,UAEHC,GAEAD,QAAQI,eAAeH,GAG3BD,QAAQpe,IAAIse,GAERD,GAEAD,QAAQK,aAMxB,YACInhB,EACA+gB,GAGIpjB,IAAImO,UAEAiV,EAEApjB,IAAImO,QAAQ+U,WAAZ,UAA0BE,EAA1B,YAAmC/gB,IAInCrC,IAAImO,QAAQ+U,WAAW7gB,IAI3BzB,OAAOuiB,UAEHC,GAEAD,QAAQI,eAAeH,GAG3BD,QAAQjN,KAAK7T,GAET+gB,GAEAD,QAAQK,e,qNC7KjB,IAAMC,GAAb,IAAO,MAAMA,UACT9K,gBAMA,iBAEI,MAAwC,KAAjC8K,EAAeC,cAG1B,eAEID,EAAeC,cAAgB,GAC/B9iB,OAAM,WAAe+iB,QAGlB/K,YAAY7U,GAMf,GAJA8U,MAAM9U,GADV,KAdQ6f,SAAmB,EAiBvBvR,KAAKuR,QAAyD,OAA/C5jB,IAAIwK,UAAUxK,IAAI4O,yBAE7ByD,KAAKuR,QACT,CACI,MAAMnV,EAAuBzO,IAAIqI,SAASyL,oBACpC+P,EAA+BnjB,SAASojB,cAAc,UAE5DD,EAAUE,aAAa,OAAQ,mBAC/BF,EAAUE,aACN,MADJ,qDAEkDtV,IAElD/N,SAASsjB,KAAKC,YAAYJ,GAC1BjjB,OAAM,yBACDsjB,IAEGT,EAAeC,cAAgBQ,GAEvCtjB,OAAM,gCACDsjB,IAEGT,EAAeC,cAAgB,KAKxCS,uBAEazjB,SAASsjB,KAAKI,iBAC1B,4BACI9e,QAAQ8J,GAAUA,EAAOiV,UAEjB3jB,SAAS0jB,iBAAiB,4BAClC9e,QAAQgf,GAAUA,EAAOD,UAG9BrS,SAEH,MAAMuS,EAAkBvkB,IAAIqI,SAASmM,iBACrC,IAAIxT,EAA0B,KAa9B,OAXIqR,KAAKuR,UAEL5iB,EACI,uBACIkU,UAAU,cACVsP,gBAAc,2BACdC,wBAAsB,kCACtBC,eAAcH,KAInBvjB,IA1Ef,EAIkB0iB,cAAwB,GAJ1C,mCAGK7O,MAHL,4JA8EemG,kBArFCC,GAAiBC,YAC7B,CACIH,KACA,KAkFOC,CAAmByI,G,gCC3DnB,MAAMkB,EAEjB,gBACI9iB,EACAF,EACA+D,EACAkf,GAUA,OAPAxX,IAAclG,SAASuZ,oBAEnBmE,EAAWC,YAAYC,sBAEvBzd,IAAU0d,2BAGPC,IAAiBC,gBACpB,uDACA,CAAEtjB,SAAQE,SAAQ6D,eACpB0B,KAAM8d,IAEJ,GAAIA,EAASC,iBAAiB/iB,OAAS,EAQnC,OANApC,IAAIolB,WAAWF,EAASC,uBACpBP,EAAWC,YAAYC,sBAEvBzd,IAAUge,2BAQlB,GAFAhe,IAAUiS,SAAS4L,EAASI,gBAExBJ,EAAS/iB,eAAeC,OAAS,EAWjC,OATAiF,IAAUiS,SAAS4L,EAASI,gBAC5BtlB,IAAIulB,sBACJtH,IAAcuH,aAAaN,EAASO,kBACpCzlB,IAAI0lB,kBAAkBR,EAAS/iB,gBAAgB,QAC3CyiB,EAAWC,YAAYC,sBAEvBzd,IAAUge,2BAMlB,MAAMM,EAAaT,EAASU,uBACtBC,EAAe5f,OAAOC,KAAKyf,GAAY,GACvC7jB,EAAM6jB,EAAWE,GAAcvjB,KAAK,GAE1C2b,IAAckB,mBACK9S,IAAeC,OAAOtK,IAAI6jB,GAElCC,OAAOhkB,GAAK,GACvB8iB,EAAWC,YAAYkB,eAEnBnB,EAAWC,YAAYC,qBAEvBF,EAAWC,YAAYmB,kBACnBlkB,EAAG,QAAY,GAInB8iB,EAAWC,YAAYoB,YAAYnkB,EAAG,UAE3CokB,QAAQ,IAAM9Y,IAAclG,SAASyZ,qBAG5C,mBACI5c,EACAoiB,EAAmC,MAGnC,MAAMC,EAAuBC,EAAmB3C,cAEhD,OAAOsB,IAAiBsB,kBACpB,2BACAviB,EACA,CAAEqiB,uBAAsBD,oBAC1B/e,KAAM8d,IAEAA,EAASqB,mBAAmBnkB,QAE5BpC,IAAI+M,gBAAgBhK,QAAQmiB,EAASqB,oBAGrCrB,EAASC,kBACND,EAASC,iBAAiB/iB,OAAS,EAE/B8iB,EAGPA,EAAS/iB,gBACN+iB,EAAS/iB,eAAeC,OAAS,EAE7B8iB,GAGP,gBAAiBA,GAAYA,EAASsB,aAEtCC,IAAiBC,oBACbxB,EAASsB,YAAatB,EAASyB,UAGhCzB,KACR5d,MAAO4d,IAENpgB,IAAQnC,MAAMuiB,GACPA,K,8CClGZ,IAAM0B,EADZC,YACD,EADA,cAEIlO,YAIOC,YACH7U,GAGA8U,MAAM9U,GADV,KALU+iB,cAKV,EAGIzU,KAAK+G,MAAQ,CAAE2N,cAAe,MAE9B1U,KAAKyU,SACL,CACIE,UAAWjjB,EAAMijB,UACjB/iB,UAAWF,EAAME,WAAa,SAC9BqY,QAASvY,EAAMuY,QACftL,KAAMjN,EAAMiN,KACZW,KAAM5N,EAAMqQ,SACZ6S,QAASljB,EAAK,QACdiR,MAAOjR,EAAK,MACZmjB,SAAUnjB,EAAMmjB,SAChBC,OAAQpjB,EAAMojB,OACdjjB,QAASH,EAAK,SAGQ,YAAtBA,EAAMqjB,cAEN/U,KAAKyU,SAAS9iB,MAAQD,EAAMqjB,YAAYrc,eAGxChH,EAAMsjB,gBAENhV,KAAKyU,SAAS,cAAgB/iB,EAAMsjB,eAIrCrV,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAC5B,IAAI1a,EAA0B,KAE9B,IAAK4V,EAED,OAAO,KAGXvE,KAAKyU,SAASlL,MAAQF,EAAOE,MAC7BvJ,KAAKyU,SAAS5R,UAAd,UAA6BwG,EAAO3B,QAAQgB,KAA5C,KACA1I,KAAKyU,SAAL,SAA4BpL,EAAM,gBAC3BA,EAAOO,KAEd,MAAMqL,EAAa5L,EAAO6L,eAClB7L,EAAOE,OAASvJ,KAAKyU,SAAL,UAElBU,EAAsBC,IAExB,GAAIH,EACJ,CACI,MAAM1jB,EAA8B,GAoBpC,OAnBIyO,KAAKyU,SAAL,SAEAljB,EAASb,KAAKsP,KAAKyU,SAAL,UAIdljB,EAASb,KAAK,wBAAM1C,IAAI,KAAKqb,EAAOE,QAGpCF,EAAM,SAEN9X,EAASb,KACL,gBAAC2V,EAAA,EAAD,CACIrY,IAAI,IACJsR,KAAM+J,EAAM,QACZ1G,MAAO,CAAEO,WAAY,WAK7B,gBAACmS,EAAA,EAAD,CACIC,aAAYjM,EAAO2L,cACnBL,UAAWtL,EAAOsL,UAClBpjB,SAAUA,EACVmT,SAAU0Q,EAAY1Q,SACtB/F,KAAM0K,EAAO1K,KACboD,SAAUsH,EAAOtH,SACjB6S,QAASvL,EAAOuL,QAChBC,SAAUxL,EAAOwL,SACjBC,OAAO,UAInB,IAAIlL,OAAiDtG,EAUrD,OATKtD,KAAKtO,MAAMkY,MAAmC,kBAApB5J,KAAKtO,MAAMkY,KAIjC5J,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMkY,OAEpCA,EAAO5J,KAAKtO,MAAMkY,KAAK5J,KAAKtO,MAAMqX,QAJlCa,EAAO5J,KAAKtO,MAAMkY,KAQlB,gBAACR,EAAA,EAAD,iBACQgM,EADR,CAEIlL,WAAW,EACXN,KAAMA,MAkClB,OA9BIpY,IAAI+jB,eAAelM,EAAQ9E,KAEvB8E,EAAM,UAENrJ,KAAKyU,SAAS/P,UAAW,EAIrB/V,EAFA4V,EAAgB,iBAGZ,gBAACiR,EAAA,EAAD,CACItL,WAAW,EACXla,QAASqZ,EAAOoM,iBAChBZ,SAAUxL,EAAOwL,UAEhBM,EAAmBnV,KAAKyU,WAKxBU,EAAmBnV,KAAKyU,YAKrCzU,KAAKyU,SAAS/P,UAAW,EAEzB/V,EAASwmB,EAAmBnV,KAAKyU,YAIlC9lB,MAhJf,EAoJega,kBA5JCC,GAAiBC,YAC7B,CACIH,KACA,KAyJOC,CAAmB+M,cAAYnB,I,iDClKvC,MAAMoB,UACTrP,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHiBkkB,iBAGjB,EAGI5V,KAAK4V,YAAcpkB,IAAI+Y,eAAe,UAGnC5K,SAEH,MAAMkW,EAAuD,WAAnC7V,KAAKtO,MAAMokB,oBAErC,OACI,gBAACC,EAAA,EAAD,CACIC,YAAY,EACZC,QAAS,IAAMjW,KAAKtO,MAAMwkB,WAC1BC,KAAMnW,KAAKtO,MAAM0kB,QAEjB,gBAACC,EAAA,EAAD,KACI,gBAACC,EAAA,EAAD,CAAMC,SAAS,kBAAkBC,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACtD,gBAACC,EAAA,EAAD,CAAUC,GAAI,EAAGL,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACtC,gBAAC,IAAD,CACIhU,MAAO,CACHhR,MAAOkkB,EACD7V,KAAK4V,iBAActS,GAE7BzR,QAAQ,MAEPgkB,EACG,uBACIhT,UAAU,YACVF,MAAO,CAAE8G,YAAa,SAEtB,gBAACpD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,qBACLqD,MAAO,CAAEM,SAAU,UAEvB,gBAACoD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,oBAGb,KACHU,KAAKtO,MAAMolB,QAGpB,gBAACF,EAAA,EAAD,CAAUC,GAAI,EAAGL,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACtC,gBAAC,IAAD,KACK3W,KAAKtO,MAAM1B,YAK5B,gBAAC+mB,EAAA,EAAD,KACI,gBAAC3N,EAAA,EAAD,CACI4N,WAAS,EACTrlB,MAAOqO,KAAKtO,MAAMokB,oBAAoBpd,cACtC4G,KAAMU,KAAKtO,MAAMulB,mBACjBrC,QAAS,IAAM5U,KAAKtO,MAAMwlB,cAEzBlX,KAAKtO,MAAMylB,oBAEhB,gBAAC/N,EAAA,EAAD,CACIwL,QAAS,IAAM5U,KAAKtO,MAAMwkB,WAC1BvT,MAAO,CAAEO,WAAY,KAEpBlD,KAAKtO,MAAM0lB,qBAQrBzO,I,EAAAA,cAtFCC,GAAiBC,YAC7B,CACIH,KACA,KAmFOC,CAAmBgN,GC3E3B,IAAM0B,EADZ7C,YACD,EADA,MACa6C,UACT/Q,YAIA,eACIzY,GAQA,IAAIimB,EAAmC,KACvC,GAAIjmB,EAAO0kB,YAAc1kB,EAAO0kB,WAAWC,YAIvC,GAFAsB,EAAkB,GAEdjmB,EAAO0kB,WAAW+E,aAElBxD,EAAgBpjB,KAAK7C,EAAO0kB,WAAW+E,kBAG3C,CACI,MAAMC,EAAU1pB,EAAO0kB,WAAWC,YAAYgF,SAExCvnB,EACFpC,EAAO0kB,WAAWC,YAAYiF,UAAUC,kBAC5C,GAAIznB,EAAKF,QAAU,EACnB,CACIwnB,EAAQI,YAAYC,GAAK3nB,EAAKS,KAAKknB,EAAErK,OACrC,IAAK,IAAIsK,EAAI,EAAGA,EAAIN,EAAQO,uBAAwBD,IAEhD5nB,EAAKS,KAAK6mB,EAAQQ,gBAAgBF,GAAGtK,MAI7C,IAAK,MAAM9d,KAAOQ,EAEd6jB,EAAiBpjB,KAAKjB,EAAID,QAKtC,OAAO8iB,EAAoB0F,YACvBnqB,EACAimB,GACF/e,KAAM8d,IAEJ,MAAMoF,EACFzmB,IAAIgT,oBAAoB3W,GAa5B,OAXIglB,EAASqF,QAAUrF,EAASxa,MAE5B1K,IAAIulB,sBACJiF,GAAaC,eAAevqB,EAAOkU,WAGnCkW,EAAkBI,iBAElBrE,EAAmB1C,QAGhBuB,IAIf,sBAA6BnhB,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,SAEpBC,EAAqBC,GACxBpS,YAAwB,GAEtBsO,EAAU,KAER2D,EAAaI,aAAelW,IAAYmC,aAEpC2T,EAAaK,eAEbF,GAAuB,IAIvBrB,EAAmBzC,QAAQ0D,GAC3B9c,IAASC,WACTod,IAAOpd,cAKbqd,EAAkB,KAEpBJ,GAAuB,GACvBrB,EAAmBzC,QAAQ0D,GAC3B9c,IAASC,YAGPsd,EAAkB,KAEpBL,GAAuB,IAG3B,OAAOM,YAAY,IACf,gBAAC,WAAD,KACKT,EAAaK,eACV,gBAAC,EAAD,CACIxB,iBAAkBmB,EAAanB,iBAC/BtB,oBAAqBwC,EAAYvD,YACjCkC,mBAAoBqB,EAAYvW,SAChCoV,mBAAoBoB,EAAapB,mBACjCf,OAAQqC,EACRzoB,QAASuoB,EAAaK,eACtB1C,SAAU6C,EACV7B,WAAY4B,EACZhC,MAAOyB,EAAahP,MACdgP,EAAahP,MAAQ+O,EAAYtD,gBAE3C,KACJ,gBAAC,IAAD,CACItQ,SAAU6T,EAAaI,cAAgBlW,IAAYiC,UAC3ChT,EAAM8mB,QAAQH,kBACdrE,EAAmBiF,UAC3BlX,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAASA,GAER2D,EAAahP,SAMvBhD,YAAY7U,GAEf8U,MAAM9U,GADV,KAtIQynB,oBAsIR,OAMQL,gBAAkB,KAEtB9Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IACrCpB,EAAmBzC,QAAQ5U,KAAKtO,QATpC,KAYQqnB,gBAAkB,KAEtB/Y,KAAKiH,SAAS,CAAEwR,qBAAqB,KAdzC,KAiBQ7D,QAAU,KAEYllB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAEZqpB,eAElB5Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IAIrCzY,KAAKmZ,eAAiB9B,EAAmBzC,QAAQ5U,KAAKtO,QAzB1DsO,KAAK+G,MAAQ,CAAE0R,qBAAqB,GA6BjC3G,uBAEC9R,KAAKmZ,gBAELnZ,KAAKmZ,eAAeC,QAIrBzZ,SAEH,MAAMsY,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAC5BmV,EAAoBuT,EAAkBI,kBACpCrE,EAAmBiF,UAE3B,OACI,gBAAC,WAAD,KACKhB,EAAkBW,eACf,gBAAC,EAAD,CACIxB,iBAAkBa,EAAkBb,iBACpCtB,oBAAqB9V,KAAKtO,MAAMqjB,YAChCkC,mBAAoBjX,KAAKtO,MAAMqQ,SAC/BoV,mBACIc,EAAkBd,mBACtBf,OAAQpW,KAAK+G,MAAM0R,oBACnBzoB,QAASioB,EAAkBW,eAC3B1C,SAAUlW,KAAK+Y,gBACf7B,WAAYlX,KAAK8Y,gBACjBhC,MAAOmB,EAAkB1O,MACnB0O,EAAkB1O,MAAQvJ,KAAKtO,MAAMsjB,gBAE/C,KACJ,gBAAC,EAAD,CACIA,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoV,SAAUA,EACV+Q,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,KACjBiL,SAAU7U,KAAKtO,MAAM6gB,YACdvS,KAAKtO,MAAM6gB,WAAWC,aAAe,EAAI,SArNpE,EA4Ne7J,I,GAAAA,eApOCC,GAAiBC,YAC7B,CACIH,KACA,KAiOOC,CAAmB0O,GChO3B,IAAMgC,GADZ7E,YACD,GADA,MACa6E,UACT/S,YAIA,eACI5U,GAGA,OAAO4gB,EAAoB0F,YAAYtmB,GAAOqD,KAAM8d,IAG5CrhB,IAAIgT,oBAAoB9S,GAEN2mB,iBAElBrE,EAAmB1C,QAGhBuB,IAIf,sBAA6BnhB,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,SAEpBC,EAAqBC,GACxBpS,YAAwB,GAEtBsO,EAAU,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAErC2T,EAAaK,eAEbF,GAAuB,IAIvBW,EAAyBzE,QAAQ0D,GACjC9c,IAASC,cAKfqd,EAAkB,KAEpBJ,GAAuB,GACvBW,EAAyBzE,QAAQ0D,GACjC9c,IAASC,YAGPsd,EAAkB,KAEpBL,GAAuB,IAG3B,OAAOM,YAAY,IACf,gBAAC,WAAD,KACKT,EAAaK,eACV,gBAAC,EAAD,CACIxB,iBAAkBmB,EAAanB,iBAC/BtB,oBAAqBwC,EAAYvD,YACjCkC,mBAAoBqB,EAAYvW,SAChCoV,mBAAoBoB,EAAapB,mBACjCf,OAAQqC,EACRzoB,QAASuoB,EAAaK,eACtB1C,SAAU6C,EACV7B,WAAY4B,EACZhC,MAAOyB,EAAahP,MACdgP,EAAahP,MAAQ+O,EAAYtD,gBAE3C,KACJ,gBAAC,IAAD,CACItQ,SAAU6T,EAAaI,cAAgBlW,IAAYiC,UAC3ChT,EAAM8mB,QAAQH,kBACVrE,EAAmBiF,UAC/BlX,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAASA,GAER2D,EAAahP,SAMvBhD,YAAY7U,GAEf8U,MAAM9U,GADV,KAxFQynB,oBAwFR,OAMQL,gBAAkB,KAEtB9Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IACrCzY,KAAKmZ,eAAiBE,EAAyBzE,QAAQ5U,KAAKtO,QAThE,KAYQqnB,gBAAkB,KAEtB/Y,KAAKiH,SAAS,CAAEwR,qBAAqB,KAdzC,KAiBQ7D,QAAU,KAEYllB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAEZqpB,eAElB5Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IAIrCzY,KAAKmZ,eAAiBE,EAAyBzE,QAAQ5U,KAAKtO,QAzBhEsO,KAAK+G,MAAQ,CAAE0R,qBAAqB,GA6BjC3G,uBAEC9R,KAAKmZ,gBAELnZ,KAAKmZ,eAAeC,QAIrBzZ,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,GACtB3E,EAAoBuT,EAAkBI,kBACpCrE,EAAmBiF,UAE3B,OACI,gBAAC,WAAD,KACKhB,EAAkBW,eACf,gBAAC,EAAD,CACIxB,iBAAkBa,EAAkBb,iBACpCtB,oBAAqB9V,KAAKtO,MAAMqjB,YAChCkC,mBAAoBjX,KAAKtO,MAAMqQ,SAC/BoV,mBACIc,EAAkBd,mBACtBf,OAAQpW,KAAK+G,MAAM0R,oBACnBzoB,QAASioB,EAAkBW,eAC3B1C,SAAUlW,KAAK+Y,gBACf7B,WAAYlX,KAAK8Y,gBACjBhC,MAAOmB,EAAkB1O,MACnB0O,EAAkB1O,MAAQvJ,KAAKtO,MAAMsjB,gBAE/C,KACJ,gBAAC,EAAD,CACIA,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoV,SAAUA,EACV+Q,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,YAtKrC,GA6KejB,I,GAAAA,eArLCC,GAAiBC,YAC7B,CACIH,KACA,KAkLOC,CAAmB0Q,IC5K3B,IAAMC,GADZ9E,YACD,GADA,MACa8E,UACThT,gBAEA,eACI5U,GAKA,MAAM8gB,EAAc9gB,EAAM6gB,WAAWC,YAErC,GAAI9gB,EAAM6gB,WAAWgH,aACrB,CACI,IAAIC,EAaJ,OAVIA,EAFAhH,EAAYiH,iBAEI,CAAC/nB,EAAM6gB,WAAWmH,uBAIlBlH,EAAYiF,UAAUC,kBAAkBpa,IACpDsa,GAAKA,EAAE+B,mBAGfjoB,EAAM6gB,WAAWgH,aAAaK,cAAcJ,GAKhD,GAAIhH,EAAYiH,iBAEZ7e,IAAoBif,UAChBrH,EAAY8F,YAAYwB,cACxBpoB,EAAM6gB,WAAW+E,kBAGzB,CACuBtd,IAAeC,OAAOtK,IACrC6iB,EAAY8F,YAAYwB,eAEjB9b,OAAOwU,EAAYiF,UAAUC,mBAG5ClF,EAAYkB,eAGhB,sBAA6BhiB,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,SAEpBC,EAAqBC,GACxBpS,YAAwB,GA8B5B,OACI,gBAAC,WAAD,KACKiS,EAAaK,eACV,gBAAC,EAAD,CACIxB,iBAAkBmB,EAAanB,iBAC/BtB,oBAAqBwC,EAAYvD,YACjCkC,mBAAoBqB,EAAYvW,SAChCoV,mBAAoBoB,EAAapB,mBACjCf,OAAQqC,EACRzoB,QAASuoB,EAAaK,eACtB1C,SAfQ,KAEpBwC,GAAuB,IAcXxB,WAvBQ,KAEpBwB,GAAuB,GACvBY,EAAgB1E,QAAQ0D,GACxB9c,IAASC,YAoBGqb,MAAOyB,EAAahP,MACdgP,EAAahP,MAAQ+O,EAAYtD,gBAE3C,KACJ,gBAAC,IAAD,CACItQ,SAAUhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SACpD3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAjDI,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAErC2T,EAAaK,eAEbF,GAAuB,IAIvBY,EAAgB1E,QAAQ0D,GACxB9c,IAASC,eAwCR8c,EAAahP,QAMvBhD,YAAY7U,GAEf8U,MAAM9U,GADV,KAMQonB,gBAAkB,KAEtB9Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IACrCa,EAAgB1E,QAAQ5U,KAAKtO,QATjC,KAYQqnB,gBAAkB,KAEtB/Y,KAAKiH,SAAS,CAAEwR,qBAAqB,KAdzC,KAiBQ7D,QAAU,KAEYllB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAEZqpB,eAElB5Y,KAAKiH,SAAS,CAAEwR,qBAAqB,IAIrCa,EAAgB1E,QAAQ5U,KAAKtO,QAzBjCsO,KAAK+G,MAAQ,CAAE0R,qBAAqB,GA6BjC9Y,SAEH,MAAMsY,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAElC,OACI,gBAAC,WAAD,KACK0oB,EAAkBW,eACf,gBAAC,EAAD,CACIxB,iBAAkBa,EAAkBb,iBACpCtB,oBAAqB9V,KAAKtO,MAAMqjB,YAChCkC,mBAAoBjX,KAAKtO,MAAMqQ,SAC/BoV,mBACIc,EAAkBd,mBACtBf,OAAQpW,KAAK+G,MAAM0R,oBACnBzoB,QAASioB,EAAkBW,eAC3B1C,SAAUlW,KAAK+Y,gBACf7B,WAAYlX,KAAK8Y,gBACjBhC,MAAOmB,EAAkB1O,MACnB0O,EAAkB1O,MAAQvJ,KAAKtO,MAAMsjB,gBAE/C,KACJ,gBAAC,EAAD,CACIA,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAY,SACZzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAK,QACLiL,UAAW,SAhL/B,GAuLelM,I,GAAAA,eA/LCC,GAAiBC,YAC7B,CACIH,KACA,KA4LOC,CAAmB2Q,I,UCjMlC,MAkBMS,GAAaC,aAAYpR,IAAD,CAE1BqR,MACA,CACIC,OAAQ,UACRjR,OAAQ,OACRkR,KAAM,EACNC,QAAS,EACTC,SAAU,WACVC,IAAK,EACLvR,MAAO,WAKR,IAAMwR,GADZ/F,YACD,GADA,MACa+F,UACTjU,YACH,eAAD,oBACY6S,oBADZ,OAwHYqB,SAAY/rB,IAEhB8rB,EAAaC,SAASxa,KAAKtO,MAAM6gB,WAAY9jB,EAAMqmB,SA1H3D,KA6HYF,QAAU,KAEd5U,KAAKmZ,eAAiBoB,EAAa3F,QAAQ5U,KAAKtO,QA5HpD,gBACI6gB,EACA0H,IAGKA,EAAMQ,OAASR,EAAMQ,MAAM1qB,QAAU,GAK1CwiB,EAAWC,YAAYkI,YAAYT,EAAMQ,OAAO1lB,KAAK,KAEjDklB,EAAM9b,MAAQ,KAItB,eACItQ,GAGIA,EAAO0kB,WAAWC,YAAYiH,kBAE9B5rB,EAAO0kB,WAAWC,YAAYgF,SAASmD,0BAG3C,MAAMnY,EAAanR,GAAa2S,cAAcnW,GAC9C,OAAOykB,EAAoBsI,SACvBpY,EAAWhT,OACX3B,EAAOyB,OACPzB,EAAO0B,KACP1B,EAAO0kB,YAGf,sBAA6B7gB,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,QAE3B,GAAI9mB,EAAM8mB,QAAQG,aAAelW,IAAYkC,SAEzC,OACI,gBAAC,IAAD,CACID,SACIhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SAC9C3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,GAEtCX,EAAahP,OAK1B,GAAI+O,EAAYuC,YAChB,CAAC,IAAD,EACI,MAAMnT,EAAUqS,KAEVS,EACF/rB,IAEA8rB,EAAaC,SAASlC,EAAY/F,WAAY9jB,EAAMqmB,QACpDtZ,IAASC,YAGPqf,EAA8B,UAChCxC,EAAY/F,WAAWC,YAAYuI,uBADH,aAChC,EACIzd,IAAI0d,GAAS,WAAQA,IAAavd,KAAK,KAE/C,OACI,gBAAC,IAAD,CACIiH,SACIhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SAC9C3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvC+B,QAAUC,IAEN,GAA0B,UAAtBA,EAAEpG,OAAOqG,SACb,CAEQD,EAAEpG,OAAOsG,cAAc,SACrBC,UAGdxG,UAAW,GAEX,gBAAC,WAAD,KACK0D,EAAahP,MACd,yBACI+R,OAAQR,EACRjY,UAAW6E,EAAQuS,MACnBsB,UAAU,EACVf,SAAUA,EACV3F,SAAU,EACV/iB,KAAK,WAOzB,OACI,gBAAC,IAAD,CACIiQ,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAAS,KAEL2F,EAAa3F,QAAQ0D,GACrB9c,IAASC,aAGZ8c,EAAahP,OAenBuI,uBAEC9R,KAAKmZ,gBAELnZ,KAAKmZ,eAAeC,QAIrBzZ,SAEH,MAAMsY,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAElC,QAAsC+T,IAAlC2U,EAAkBU,YAElB,OAAO,KAGX,GAAIV,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,GAAIzE,KAAKtO,MAAMmpB,aACR5C,EAAkBU,aAAelW,IAAYmC,WACpD,CAAC,IAAD,EACI,MAAMkW,EAA8B,UAChC9a,KAAKtO,MAAM6gB,WAAWC,YAAYuI,uBADF,aAChC,EACIzd,IAAI0d,GAAS,WAAQA,IAAavd,KAAK,KAE/C,IAAIsX,OAAczR,EACa,YAA3BtD,KAAKtO,MAAMqjB,cAEXA,EAAc/U,KAAKtO,MAAMqjB,YAAYrc,eAGzC,MAAM8iB,EACF,yBACIF,OAAQR,EACRjY,UAAW7C,KAAKtO,MAAMgW,QAAQuS,MAC9BsB,UAAU,EACVf,SAAUxa,KAAKwa,SACf3F,UAAW,EACXiC,MAAOnpB,IAAIwD,eAAe,eAC1BW,KAAK,SAIb,OAAImmB,EAAkB1O,MAGd,gBAACH,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,eAC/BQ,MAAOojB,EACPnjB,UAAU,OACV0N,KAAMU,KAAKtO,MAAMqQ,SACjB6H,KAAK,QACLiL,UAAW,GAEVoD,EAAkB1O,MAClBiS,GAMT,gBAACpS,EAAA,EAAD,CACIkM,aAAYtV,KAAKtO,MAAMsjB,cACvBrjB,MAAOojB,EACPnjB,UAAU,OACV+U,KAAG,EACHiD,KAAK,QACLiL,UAAW,GAEX,gBAACxO,EAAA,EAAD,CACIxD,UAAW7C,KAAKtO,MAAMgW,QAAQiC,QAC9BrK,KAAMU,KAAKtO,MAAMqQ,WAEpByZ,GAKb,OACI,gBAAC,EAAD,CACIxG,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAK,QACLiL,UAAW,QAlO3B,GAwOelM,I,GAAAA,eAzQCC,GAAiBC,YAC7B,CACIc,QACA,CACIZ,MAAO,QAEXkR,MACA,CACIC,OAAQ,UACRjR,OAAQ,OACRkR,KAAM,EACNC,QAAS,EACTC,SAAU,WACVC,IAAK,EACLvR,MAAO,UA2PJJ,CAAmB4R,ICrQ3B,IAAMkB,GADZjH,YACD,GADA,MACaiH,UACTnV,YACH,eAAD,oBACY6S,oBADZ,OA2DYvE,QAAU,KAEd5U,KAAKmZ,eAAiBsC,EAAuB7G,QAAQ5U,KAAKtO,QA1D9D,eACIA,GAOA,OAAO4gB,EAAoB0F,YAAYtmB,GAAOqD,KAAM8d,IAEhD,MAAMoF,EACFzmB,IAAIgT,oBAAoB9S,GAa5B,OAXImhB,EAASqF,QAAUrF,EAASxa,MAE5B1K,IAAIulB,sBACJiF,GAAaC,eAAe1mB,EAAMqQ,WAGlCkW,EAAkBI,iBAElBrE,EAAmB1C,QAGhBuB,IAIf,sBAA6BnhB,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,QACrB5D,EAAU,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAEzC6W,EAAuB7G,QAAQ0D,GAC/B9c,IAASC,aAIjB,OAAOud,YAAY,IACf,gBAAC,IAAD,CACItU,SAAUhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,UAC5ChT,EAAM8mB,QAAQH,kBACVrE,EAAmBiF,UAC/BlX,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAASA,GAER2D,EAAahP,QAUnBuI,uBAEC9R,KAAKmZ,gBAELnZ,KAAKmZ,eAAeC,QAIrBzZ,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,GACtB3E,EAAoBuT,EAAkBI,kBACpCrE,EAAmBiF,UAE3B,OACI,gBAAC,EAAD,CACIjE,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoV,SAAUA,EACV+Q,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,WA7FjC,GAmGejB,mBA3GCC,GAAiBC,YAC7B,CACIH,KACA,KAwGOC,CAAmB8S,I,6BC3G3B,MAAMC,WACTpV,gBAMA,mBAA2BzR,EAAoBtF,GAEtCmsB,GAASlnB,UAAUpG,IAAImB,IAExBmsB,GAASlnB,UAAUpF,IAAIG,EAAM,IAAI4R,KAGrCua,GAASlnB,UAAU7E,IAAIJ,GAAO0N,IAAIpI,GAGtC,aAAoBtF,GAEXA,GAASmsB,GAASlnB,UAAUpG,IAAImB,IAKrCmsB,GAASlnB,UAAU7E,IAAIJ,GAAO0D,QAAS0oB,IAEnCA,EAASrhB,UAIjB,YAAmB/K,GAEVA,GAASmsB,GAASlnB,UAAUpG,IAAImB,IAKrCmsB,GAASlnB,UAAU7E,IAAIJ,GAAO0D,QAAS0oB,IAEnCA,EAASxF,SAIjB,cAAqB5mB,GAEZA,GAASmsB,GAASlnB,UAAUpG,IAAImB,IAKrCmsB,GAASlnB,UAAU7E,IAAIJ,GAAO0D,QAAS0oB,IAEnCA,EAASC,WAIjBrV,YAAY7U,GAER8U,MAAM9U,GADV,KApDQmqB,aAAuB,EAoD/B,KAkBQC,WAAcC,IAElBA,EAAKpZ,MAAMI,UAAY,OApB3B,KAuBQiZ,cAAiBD,IAErBA,EAAKpZ,MAAMmG,QAAU,QAzBzB,KA4BQmT,SAAW,CAACF,EAAmBG,KAEnCH,EAAKpZ,MAAMI,UAAY,IA9B3B,KAiCQoZ,cAAgB,CAACJ,EAAmBG,KAExCH,EAAKpZ,MAAMmG,QAAU,IA9BjB9I,KAAK+G,MAFL,OAAQrV,EAEK,CAAEykB,KAAMzkB,EAAM0qB,IAId,CAAEjG,MAAM,GAGrBzkB,EAAMnC,MAENmsB,GAASW,YAAYrc,KAAMtO,EAAMnC,MAwBlC+K,QAEE0F,KAAK+G,MAAL,MAKL/G,KAAKiH,SAAS,CAAEkP,MAAM,IAGnB9O,oBAEH,GAAIrH,KAAK+G,MAAL,KAEA,OAIJ,MAAMgV,EAAOO,cAAqBtc,MAClC+b,EAAKpZ,MAAL,QAAwB,OACxBoZ,EAAKpZ,MAAL,UAA0B,MAGvBmP,uBAEE9R,KAAKtO,MAAMnC,MAASmsB,GAASlnB,UAAUpG,IAAI4R,KAAKtO,MAAMnC,QAK3DmsB,GAASlnB,UAAU7E,IAAIqQ,KAAKtO,MAAMnC,MAAOyO,OAAOgC,MAEM,IAAlD0b,GAASlnB,UAAU7E,IAAIqQ,KAAKtO,MAAMnC,MAAOqa,MAEzC8R,GAASlnB,UAAUwJ,OAAOgC,KAAKtO,MAAMnC,OAItC4mB,OAECnW,KAAK+G,MAAL,MAKJ/G,KAAKiH,SAAS,CAAEkP,MAAM,IAGnBxW,SAOH,OALIK,KAAK+G,MAAL,OAEA/G,KAAK6b,aAAc,GAInB,gBAAC,KAAD,CACIhZ,UAAW7C,KAAKtO,MAAMgW,QAAQ6U,UAC9BH,GAAIpc,KAAK+G,MAAL,KACJyV,QAASxc,KAAKmc,cACdM,WAAYzc,KAAKic,SACjBS,SAAU1c,KAAKgc,cACfW,UAAW3c,KAAK8b,YAEf9b,KAAK6b,YAAc7b,KAAKtO,MAAMH,SAAW,MAK/CqqB,SAEH5b,KAAKiH,SAAS,CAAEkP,MAAOnW,KAAK+G,MAAL,QAtKlB2U,GAIKlnB,UAAY,IAAIuD,IAsKnB4Q,mBAlLCC,GAAiBC,YAC7B,CACI0T,UACA,CACIK,WAAYhU,EAAMiU,YAAYvrB,OAAO,CAAC,SAAU,kBA8K7CqX,CAAmB+S,I,SC1H3B,MAAMoB,WACTxW,gBAOA,mBAA2BzR,EAAiBtF,EAAcwhB,GAEjD+L,GAAMtoB,UAAUpG,IAAImB,IAErButB,GAAMtoB,UAAUpF,IAAIG,EAAM,IAAI4R,KAGlC2b,GAAMtoB,UAAU7E,IAAIJ,GAAO0N,IAAIpI,GAE1Bkc,IAKA+L,GAAMC,OAAOptB,IAAIohB,IAElB+L,GAAMC,OAAO3tB,IAAI2hB,EAAO,IAAI5P,KAGhC2b,GAAMC,OAAOptB,IAAIohB,GAAQ9T,IAAI1N,IAGjC,YAAmBA,EAAsBytB,GAAqB,GAE1D,IAAKztB,IAASutB,GAAMtoB,UAAUpG,IAAImB,GAE9B,OAAO,EAGX,IAAIZ,GAAS,EAUb,OATAmuB,GAAMtoB,UAAU7E,IAAIJ,GAAO0D,QAASgqB,IAEjBA,EAAMC,KAAKF,KAGtBruB,GAAS,KAIVA,EAGX,iBAAwBoiB,GAEfA,GAAU+L,GAAMC,OAAO3uB,IAAI2iB,IAKhC+L,GAAMC,OAAOptB,IAAIohB,GAAQ9d,QAAS1D,IAE9ButB,GAAMI,KAAK3tB,GAAM,KAIzB,YAAmBA,GAEVA,GAASutB,GAAMtoB,UAAUpG,IAAImB,IAKlCutB,GAAMtoB,UAAU7E,IAAIJ,GAAO0D,QAASgqB,IAEhCA,EAAM/gB,SAId,cAAqB3M,GAEZA,GAASutB,GAAMtoB,UAAUpG,IAAImB,IAKlCutB,GAAMtoB,UAAU7E,IAAIJ,GAAO0D,QAASgqB,IAEhCA,EAAMrB,WAIdrV,YAAY7U,GAER8U,MAAM9U,GAEF,WAAYA,EAEZsO,KAAK+G,MAAQ,CAAEoW,SAAUzrB,EAAM+S,QAE1B/S,EAAMiqB,UAAYjqB,EAAMqf,MAE7B/Q,KAAK+G,MAAQ,CAAEoW,SAAS,GAIxBnd,KAAK+G,MAAQ,CAAEoW,SAAS,GAGxBzrB,EAAMnC,MAENutB,GAAMT,YAAYrc,KAAMtO,EAAMnC,KAAMmC,EAAMqf,OAAS,MAIpDe,uBAEH,IAAK9R,KAAKtO,MAAMnC,OAASutB,GAAMtoB,UAAUpG,IAAI4R,KAAKtO,MAAMnC,MAEpD,OAUJ,GAPAutB,GAAMtoB,UAAU7E,IAAIqQ,KAAKtO,MAAMnC,MAAOyO,OAAOgC,MAEM,IAA/C8c,GAAMtoB,UAAU7E,IAAIqQ,KAAKtO,MAAMnC,MAAOqa,MAEtCkT,GAAMtoB,UAAUwJ,OAAOgC,KAAKtO,MAAMnC,OAGjCyQ,KAAKtO,MAAMqf,QAAU+L,GAAMC,OAAO3uB,IAAI4R,KAAKtO,MAAMqf,OAElD,OAGJ,MAAMA,EAAqB+L,GAAMC,OAAOptB,IAAIqQ,KAAKtO,MAAMqf,OAEnDA,EAAM3iB,IAAI4R,KAAKtO,MAAMnC,QAErBwhB,EAAM/S,OAAOgC,KAAKtO,MAAMnC,MAEL,IAAfwhB,EAAMnH,MAENkT,GAAMC,OAAO/e,OAAOgC,KAAKtO,MAAMqf,QAKpCmM,KAAKF,GAAqB,GAE7B,QAAKhd,KAAK+G,MAAMoW,UAKhBnd,KAAKiH,SAAS,CAAEmW,YAAaJ,GAAa,KAEtChd,KAAKiH,SAAS,CAAEkW,SAAS,KAErBnd,KAAKtO,MAAMiqB,UAAY3b,KAAKtO,MAAM2rB,OAElCC,GAAahjB,MAAM0F,KAAKtO,MAAMnC,SAI/B,GAGJoQ,SAEH,MAAM,EAcFK,KAAKtO,OAdH,QACF6rB,EADE,KAEFC,EAFE,UAGFC,EAHE,SAIFlsB,EAJE,QAKFmW,EALE,SAMFiU,EANE,OAOFrsB,EAPE,KAQF+tB,EARE,MASFtM,EATE,OAUFtM,EAVE,OAWFiZ,EAXE,KAYFnuB,GAZJ,EAaOouB,EAbP,+HAgBA,IAAIC,EAAgBrsB,EACpB,GAAIjC,EACJ,CAcI,MAAMG,EAAMC,IAAQC,IAAIL,GAEnBG,GAIKA,EAAIuf,WAFV4O,EAAgB,MAgBxB,GARAD,EAAW9a,UAAY,UAAG6E,EAAQgB,KAAX,eACdiV,EAAW9a,UAAY8a,EAAW9a,UAAY,GADhC,KAGnB0a,IAEAI,EAAW9a,WAAX,UAA2B6E,EAAQ6V,QAAnC,MAGAC,EACJ,CACI,QAAkBla,IAAdma,EAGA,MADAhrB,IAAQC,IAAIsN,KAAKtO,OACX,IAAIoT,MAAJ,oCAAuCvV,IAK7CouB,EAAW9a,WAAX,UAFA4a,EAAY,IAAM,EAES/V,EAAQ8V,KAIR9V,EAAQmW,cAJnC,KAiBR,GATIH,EAEAC,EAAW9a,WAAX,UAA2B6E,EAAQgW,OAAnC,KAIAC,EAAWG,UAAY,EAGvBnC,EAEA,OACI,gBAAC,GAAD,CAAUS,GAAIpc,KAAK+G,MAAMoW,QAAU5tB,KAAMA,GACrC,gBAAC,KAAqBouB,EACjBC,IAMjB,GAAIP,GAAQA,EAAO,EAEf,OAAIrd,KAAK+G,MAAMqW,YAEPpd,KAAK+G,MAAMoW,QAGP,gBAACY,GAAA,EAAD,CAAMC,QAASX,GACX,gBAAC,KAAqBM,EACjBC,IAMV,KAIP,gBAAC,GAAD,CAAUxB,GAAIpc,KAAK+G,MAAMoW,QAAU5tB,KAAMA,GACrC,gBAAC,KAAqBouB,EACjBC,IAMjB,IAAIK,EAAe,OAUnB,OATIje,KAAK+G,MAAMoW,UAEXc,EAAe,UACVje,KAAKtO,MAAM6rB,UAEZU,EAAe,UAKnB,gBAAC,KAAD,iBACQN,EADR,CAEIhb,MAAO,CACHmG,QAASmV,EACTC,SAAU,KAGbN,GAIN1hB,OAEH,IAAI8D,KAAK+G,MAAMoW,QAAf,CAKA,GAAInd,KAAKtO,MAAMiqB,SAEX2B,GAAanH,KAAKnW,KAAKtO,MAAMnC,WAE5B,GAAIyQ,KAAKtO,MAAMqf,OAAS+L,GAAMC,OAAO3uB,IAAI4R,KAAKtO,MAAMqf,OACzD,CACI,IAAIoN,GAAc,EAClBrB,GAAMC,OAAOptB,IAAIqQ,KAAKtO,MAAMqf,OAAQ9d,QAAS1D,IAEzC,GAAIA,IAASyQ,KAAKtO,MAAMnC,KACxB,CACmButB,GAAMI,KAAK3tB,GAAM,KAG5B4uB,GAAc,MAKrBA,GAEDb,GAAanH,KAAKnW,KAAKtO,MAAMnC,MAGjCyQ,KAAKiH,SAAS,CAAEmW,YAAae,IAGjCne,KAAKiH,SAAS,CAAEkW,SAAS,KAGtBvB,SAEE5b,KAAK+G,MAAMoW,QAMZnd,KAAKkd,OAJLld,KAAK9D,QA1VJ4gB,GAIKC,OAAS,IAAIhlB,IAJlB+kB,GAMKtoB,UAAY,IAAIuD,IA6VnB4Q,I,YAAAA,eAzYCC,GAAuBC,YACnC,CACI0U,QACA,CACIlT,gBAAiB,eAErBmT,KACA,CACInT,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,MAExCmY,cACA,CACIxT,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,OAE1CX,OACA,CACI,CAAC9U,EAAM0V,YAAYC,KAAK,OACxB,CACIC,QAAS5V,EAAMqU,MAAMuB,QAAQ7H,IAEjC,CAAC/N,EAAM0V,YAAYC,KAAK,OACxB,CACIC,QAAS5V,EAAMqU,MAAMuB,QAAQ9H,IAEjC,CAAC9N,EAAM0V,YAAYC,KAAK,OACxB,CACIC,QAAS5V,EAAMqU,MAAMuB,QAAQ/H,IAEjC,CAAC7N,EAAM0V,YAAYG,GAAG,OACtB,CACID,QAAS5V,EAAMqU,MAAMuB,QAAQhI,KAGrC9N,KACA,KAuWOC,CAAmBmU,I,kBC3V3B,IAAM4B,IAAb,MAAO,MAAMA,UACTpY,gBAUA,sBACIuM,EACA8L,GAEI9L,KACKA,EAAS/iB,gBACP+iB,EAAS/iB,eAAeC,QAAU,MACpC8iB,EAASC,kBACPD,EAASC,iBAAiB/iB,QAAU,KAG3C6b,IAAcgT,sBAEVF,EAAcG,iBAEVhM,EAASsB,aAETC,IAAiBC,oBACbxB,EAASsB,YAAatB,EAASyB,UAGvC3mB,IAAIulB,sBACJ4L,GAAiB1G,eAAe,gBAGhCuG,GAEApwB,OAAOwwB,SAAS,EAAG,IAK/B,sBAEI,IAAIpwB,EAAiB,EAErB,GAAI+vB,EAAcna,iBAClB,CACI5V,EAAS+vB,EAAcna,iBAAiBya,MAAMjvB,OAAS,EAEvD,IAAK,MAAMkvB,KAAQP,EAAcna,iBAAiBya,MAE1CC,EAAKtG,cAAgBlW,IAAYgC,QAEjC9V,IAKZ,OAAOA,EAGX,qBAA4BswB,GAExB,IAAItwB,EAAiBswB,EAAO,EAE5B,GAAIP,EAAcna,iBAEd,IAAK,IAAIpR,EAAQ,EAAGA,GAAS8rB,EAAM9rB,IAE3BurB,EAAcna,iBAAiBya,MAAM7rB,GAAOwlB,cAC5ClW,IAAYgC,QAEZ9V,IAKZ,OAAOA,EAGX,kBAEI,MAAMkG,EAAW6pB,EAAc7pB,SAC/B,IAAIlG,EAA6B,KAOjC,OALIkG,IAEAlG,EAASkG,EAASnD,MAAMstB,OAGrBrwB,EAGX,6BAEI,IAAIA,EAAkC,KAgBtC,OAZIA,EAFA+vB,EAAcna,iBAELma,EAAcna,iBAKvB,CACIoU,YAAalW,IAAYoC,UACzBqa,mBAAoB,KACpBF,MAAO,IAIRrwB,EAGX,4BAEI,MAAMkG,EAAW6pB,EAAc7pB,SAC/B,IAAKA,EAED,OAAO,KAGXkG,IAAclG,SAASuZ,kBAAkB,MAAM,GAAO,GAEtD,MAAMyE,QACIF,IAAiBsB,kBACnB,2BACApf,EAASnD,MACT,CAAEytB,oBAAqB,SACvB,GACClqB,MAAOmqB,IAEJ3sB,IAAQnC,MAAM8uB,GACPA,IAOnB,OAJArkB,IAAclG,SAASyZ,oBAEvBoQ,EAAcW,eAAexM,GAAU,GAEhCA,EAGX,gCAEI,MAAMhe,EAAW6pB,EAAc7pB,SAC/B,IAAKA,EAED,OAAO,KAGXkG,IAAclG,SAASuZ,kBAAkB,MAAM,GAAO,GAEtD,MAAMyE,QACIF,IAAiBsB,kBACnB,2BACApf,EAASnD,MACT,CAAEytB,oBAAqB,aACvB,GACClqB,MAAOmqB,IAEJ3sB,IAAQnC,MAAM8uB,GACPA,IAOnB,OAJArkB,IAAclG,SAASyZ,oBAEvBoQ,EAAcW,eAAexM,GAAU,GAEhCA,EAGX,sBACIyM,GAGA,MAAMzqB,EAAW6pB,EAAc7pB,SAC/B,IAAKA,EAED,OAAO,KAGX,MAAMge,QACIF,IAAiBsB,kBACnB,2BACApf,EAASnD,MACT,CAAE4tB,yBACDrqB,MAAOmqB,IAEJ3sB,IAAQnC,MAAM8uB,GACPA,IAKnB,OAFAV,EAAcW,eAAexM,GAAU,GAEhCA,EAGX,sBAEI,MAAMhe,EAAW6pB,EAAc7pB,SAE/B,GAAIA,EACJ,CAII,OAHcA,EAASnD,MAAMstB,MAAMO,UAC/BC,GAAKA,EAAElS,aAAezY,EAASkS,MAAMmY,sBAExBrqB,EAASnD,MAAMstB,MAAMjvB,OAAS,EAGnD,OAAO,EAGJwW,YAAY7U,GAEf8U,MAAM9U,GADV,KAlNQ+tB,yBAkNR,OAjNQC,2BAiNR,OAhNQC,kBAA8B,GAgNtC,KA/MQC,qBAA0D,GA+MlE,KAUQC,YAAc,KAElB,MAAMC,EACFlU,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMpC,QAE9C,IAAKwwB,EAAW3S,cAEZ,OAGJ,GAAInN,KAAK0f,uBACF1f,KAAK0f,uBAAyBI,EAAW3S,cAE5C,OAGJ,IAAK,MAAM4S,KAAmB/f,KAAK4f,qBAE/BG,EAAgB3G,QAGpBsF,EAAcna,iBACV/S,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,MAAM4b,EACFoR,EAAcna,iBAAiB2a,mBAInC,GAFAc,KAAiBC,gBAAgB3S,GAE7BA,EACJ,CACI,MAAM4S,EACFxB,EAAcna,iBAAiBya,MAAMmB,KACjCC,GAAKA,EAAE9S,aAAeA,GAE9B,IAAK4S,EAED,MAAM,IAAIpb,MAAJ,uCAC8BwI,EAD9B,WAIVtN,KAAK2f,kBAAoB,CAACO,EAAW5S,YAErCtN,KAAKiH,SAAS,CACViY,mBAAoBgB,EAAW5S,kBAKnCtN,KAAK2f,kBAAoB,GACzB3f,KAAKiH,SAAS,CACViY,wBAAoB5b,IAI5BtD,KAAK0f,sBAAwBI,EAAW3S,eA9DxCnN,KAAK+G,MAAQ,CACTmY,wBAAoB5b,GAGxBob,EAAc7pB,SAAWmL,KA6DrBqgB,uBACJ9b,GAEA,GAAIA,EAAiBoU,aAAelW,IAAYiC,SAE5C,OAAO,KAGX,MAAM4b,EAA0BtgB,KAAKtO,MAAMstB,MAAMmB,KAAKX,GAClDA,EAAElS,aAAetN,KAAK+G,MAAMmY,oBAEhC,IAAIqB,EAAgC,KAapC,OAZIvgB,KAAK2f,kBAAkB9mB,QAAQynB,EAAahT,aAAe,IAK3DiT,EACI,uBAAKvyB,IAAKsyB,EAAahT,YAClBjc,GAAaC,OAAOgvB,EAAaE,WAM1C,gBAAC,GAAD,CACIhD,MAAM,EACNC,UAAW,EACX5a,UAAW7C,KAAKtO,MAAMgW,QAAQuV,MAC9Ba,UAAW,EACXJ,QAAQ,EACRrV,KAAK,YAEJkY,GAINlZ,oBAEHrH,KAAKyf,oBAAsBgB,YAAQzgB,KAAK6f,aAGrC/N,uBAEH4M,EAAc7pB,SAAW,KAEzB,IAAK,MAAMkrB,KAAmB/f,KAAK4f,qBAE/BG,EAAgB3G,QAGpBpZ,KAAKyf,sBAELO,KAAiBC,gBAAgB,MAG9BtgB,SAEH,OAAKK,KAAK+G,MAAMmY,oBAAsBlf,KAAKtO,MAAMstB,MAAMjvB,QAAU,EAEtD,KAGN2uB,EAAcna,iBAKfma,EAAcna,iBAAiBoU,cAAgBlW,IAAYgC,OAEpD,KAIP,gBAACic,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC5ByQ,KAAKqgB,uBAAuB3B,EAAcna,mBAVxC,OA7VnB,GAImBA,iBAA4C,KAJ/D,GAKkB1P,SAAiC,KALnD,yCAGK2N,MAHL,sKA4WemG,I,GAAAA,eAtXCC,GAAiBC,YAC7B,CACIoU,MACA,CACI0D,UAAW,aACXvW,UAAW,GACXiQ,SAAU,cAgXP1R,CAAmB+V,IC5Z3B,IAAMkC,GADZpM,YACD,GADA,MACaoM,UACTta,YACH,eAAD,oBAiCYsO,QAAU,KAEdgM,EAAiBhM,WAlCrB,iBAEIiM,GAAkBC,eAGtB,sBAA6BpvB,GAEzB,MAAM6mB,EAAe7mB,EAAM8mB,QAUrBF,EAAc5mB,EAAM7D,OAE1B,OACI,gBAAC,IAAD,CACI6W,SAAUhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SACpD3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAjBQ,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAEzCgc,EAAiBhM,UACjBpZ,IAASC,cAcR8c,EAAahP,OAUnB5J,SAEH,MAAMsY,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAC5BgV,EAAmBsc,GAAkBrc,sBAE3C,IAAKD,EAED,OAAO,KAGX,MAAMxT,EAAgB8vB,GAAkBE,eAClCC,EAAezc,EAAiBya,MAAMjvB,OAAS,EAC/CuwB,EAAuB/b,EAAiBya,MAAMO,UAAUC,GAC1DA,EAAElS,aAAe/I,EAAiB2a,oBAChCD,EAAe4B,GAAkBI,cAAcX,GAC/CtB,EAA4B6B,GAAkBK,WACpD,IAAIvyB,EAA0B,KAE9B,GAAI2xB,EAAeU,EACnB,CACI,IAAIzX,EAAgB0O,EAAkB1O,MAClCxH,EAAmB,qBAEnBkd,IAASluB,GAASiuB,IAElBzV,EAAQyV,EAAMgC,GAAMzX,MACpBxH,EAAW,gBAGfpT,EACI,gBAAC,WAAD,KACI,gBAACwyB,GAAA,EAAD,CAAQC,QAAM,GACV,gBAAC,EAAD,CACIrM,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7BlmB,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,MAEhBL,EACD,gBAAClD,EAAA,EAAD,CACI/G,KAAMyC,EACNY,MAAO,CAAEO,WAAY,YAIjC,gBAACie,GAAA,EAAD,CAAQE,MAAI,GACR,gBAAC,EAAD,CACIrM,cAAeiD,EAAkB1O,MACjCwL,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAI7B1T,SAAS,qBACTxS,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,SAMrC,OAAOjb,MA1Gf,GA8Gega,I,GAAAA,eAtHCC,GAAiBC,YAC7B,CACIH,KACA,KAmHOC,CAAmBiY,IChH3B,IAAMU,GADZ9M,YACD,GADA,MACa8M,UACThb,YACH,eAAD,oBAiCYsO,QAAU,KAEd0M,EAAqB1M,WAlCzB,iBAEIiM,GAAkBU,mBAGtB,sBAA6B7vB,GAEzB,MAAM6mB,EAAe7mB,EAAM8mB,QAUrBF,EAAc5mB,EAAM7D,OAE1B,OACI,gBAAC,IAAD,CACI6W,SAAUhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SACpD3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAjBQ,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAEzC0c,EAAqB1M,UACrBpZ,IAASC,cAcR8c,EAAahP,OAUnB5J,SAEH,MAAMsY,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAC5BgV,EAAmBsc,GAAkBrc,sBAE3C,IAAKD,EAED,OAAO,KAGX,MAAM+b,EAAuB/b,EAAiBya,MAAMO,UAAUC,GAC1DA,EAAElS,aAAe/I,EAAiB2a,oBAChCD,EAAe4B,GAAkBI,cAAcX,GAErD,OACI,gBAAC,WAAD,KACI,gBAACa,GAAA,EAAD,CAAQC,QAAM,GACV,gBAAC,EAAD,CACIrM,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoV,SAAmB,IAATua,EACVxJ,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAS,oBACTwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,QAGzB,gBAACuX,GAAA,EAAD,CAAQE,MAAI,GACR,gBAAC,EAAD,CACIrM,cAAeiD,EAAkB1O,MACjCwL,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoV,SAAmB,IAATua,EACVxJ,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B1T,SAAS,oBACTxS,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAK4U,QACdhL,KAAM5J,KAAKtO,MAAMkY,aAhFzC,GAwFejB,mBAhGCC,GAAiBC,YAC7B,CACIH,KACA,KA6FOC,CAAmB2Y,ICzC3B,MAAMnJ,WACT7R,gBAEA,sBAA6B5U,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OAE1B,GAAiC,OAA7ByqB,EAAYkJ,aAEZ,OAAO,gBAAC,EAAuBC,eAAmB/vB,GAGtD,OAAQ4mB,EAAYkJ,cAEhB,IAAK,sBACD,OAAO,gBAAC,GAA6BC,eAAmB/vB,GAC5D,IAAK,aACD,OAAO,gBAAC,GAAoB+vB,eAAmB/vB,GACnD,IAAK,UACD,OAAO,gBAAC,GAAiB+vB,eAAmB/vB,GAChD,IAAK,oBACD,OAAO,gBAAC,GAA2B+vB,eAAmB/vB,GAC1D,IAAK,cACD,OAAO,gBAAC,GAAqB+vB,eAAmB/vB,GACpD,IAAK,kBACD,OAAO,gBAAC,GAAyB+vB,eAAmB/vB,GACxD,QACI,MAAM,IAAIoT,MAAJ,gCACuBwT,EAAYkJ,gBAIrD,sBAA6Bzf,GAEzBpU,IAAIyD,UACA,uBAAKuR,MAAO,CAAE+e,WAAY,SAAU5Y,QAAS,SACxC/G,EACG,gBAACsE,EAAA,EAAD,CACI/G,KAAMyC,EACNY,MAAO,CAAE8G,YAAa,UAE1B,KANR,UASA,OACAnG,EACA,aACAA,EACA,KAGD3D,SAEH,MAAM,EAA4CK,KAAKtO,OAAjD,aAAE8vB,EAAF,QAAgB9Z,GAAtB,EAAkC0N,EAAlC,0CAEA,GAAgC,OAA5BpV,KAAKtO,MAAM8vB,aAEX,OAAO,gBAAC,GAAuBpM,GAGnC,OAAQpV,KAAKtO,MAAM8vB,cAEf,IAAK,sBACD,OAAO,gBAAC,GAA6BpM,GACzC,IAAK,aACD,OAAO,gBAAC,GAAoBA,GAChC,IAAK,UACD,OAAO,gBAAC,GAAiBA,GAC7B,IAAK,oBACD,OAAO,gBAAC,GAA2BA,GACvC,IAAK,cACD,OAAO,gBAAC,GAAqBA,GACjC,IAAK,kBACD,OAAO,gBAAC,GAAyBA,GACrC,QACI,MAAM,IAAItQ,MAAJ,gCACuB9E,KAAKtO,MAAM8vB,iBAKzC7Y,I,GAAAA,eAxFCC,GAAiBC,YAC7B,CACIH,KACA,KAqFOC,CAAmBwP,ICjH3B,IAAMwJ,GADZnN,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,MAAMwE,EAASjJ,KAAKtO,MAAMkwB,YAAY5hB,KAAKtO,MAAMqX,OAC3CA,EAAQ/I,KAAKtO,MAAMmwB,WAAW7hB,KAAKtO,MAAMqX,OAE/C,OAAKE,GAAWF,EAMZ,uBACIb,eAAclI,KAAKtO,MAAMsjB,oBAAiB1R,EAC1CgS,aAAYtV,KAAKtO,MAAMsjB,oBAAiB1R,EACxCT,UAAW7C,KAAKtO,MAAMgW,QAAQgB,KAC9BoZ,IAAK9hB,KAAKtO,MAAMqwB,SAChBpf,MAAO,CAAEsG,SAAQF,WATd,SAvBnB,GAsCeJ,I,GAAAA,eAhDCC,GAAiBC,YAC7B,CACIH,KACA,CACII,QAAS,QACTkZ,SAAU,UA2CPrZ,CAAmB+M,cAAYiM,KCoC/BM,OA1FdzN,YACD,GADA,cACiClO,YAItBC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQwwB,cAAiC,KAMjCxwB,EAAMwwB,gBAENliB,KAAKkiB,cAAgB7wB,GAAaC,OAC9B0O,KAAKtO,MAAMwwB,cACX,CACIC,gBAAgB,KAKzBxiB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,IAAK9E,EAED,OAAO,KAGX,GAAIA,EAAiBoU,cAAgBlW,IAAYgC,OAE7C,OAAO,KAGX,MAAMxU,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzCuI,EAA2B,GACjC,IAAK,MAAMxW,KAAS5b,EACpB,CACI,MAAMwd,EAAU5B,EAChBwW,EAAM3xB,KACF,gBAACkmB,EAAA,EAAD,CACI5oB,IAAKyf,EAAQje,OACbgnB,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJE,GAAI,GAEJ,gBAAC,GAAD,CACI2G,MAAI,EACJC,UAAWpU,EAAOoU,UAClBC,QAAM,EACNI,UAAW,GAGP9d,KAAKtO,MAAM4wB,iBACPjxB,GAAaC,OACT0O,KAAKtO,MAAM4wB,iBACX,CACIxI,cAAe9Z,KAAKtO,MAAMooB,cAC1BxC,aAAc7J,EAAQje,SAEhC,KAGF6B,GAAaC,OACT0O,KAAKtO,MAAM6wB,QACX,CACI/yB,OAAQie,EAAQje,YAQ5C,OACI,2BACKwQ,KAAKkiB,cACN,gBAAC5L,EAAA,EAAD,CAAMC,SAAS,kBAAkBC,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACrD0L,QAlFrB,G,wCCXO,MAAMG,WACTlc,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAIzB,OAFA2X,EAAOzX,UAAY,MAEZ,gBAAC,KAA8ByX,IAI/BV,mBApBCC,GAAiBC,YAC7B,CACIH,KACA,KAiBOC,CAAmB6Z,ICV3B,MAAMC,WACTnc,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBgxB,EAAsBrZ,EAAOsZ,oBAyBnC,MAvBI,wBAAyBtZ,UAElBA,EAAOsZ,oBAGd,eAAgBtZ,IAEZA,EAAOuZ,aAEPvZ,EAAO9X,SACH,gBAAC,WAAD,KACK8X,EAAO9X,SACR,gBAAC,GACOmxB,EAEHrZ,EAAOuZ,qBAKjBvZ,EAAOuZ,YAGX,gBAAC,KAA2BvZ,IAI5BV,mBA1CCC,GAAiBC,YAC7B,CACIH,KACA,KAuCOC,CAAmB8Z,I,UCtC3B,MAAMI,WACTvc,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,OAAO,gBAAC,KAAgC2X,IAIjCV,I,GAAAA,eAlBCC,GAAiBC,YAC7B,CACIH,KACA,KAeOC,CAAmBka,I,SCwB3B,IAAMC,GADZtO,YACD,GADA,cAEIlO,YAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAJUqxB,mBAIV,OAHUtO,cAGV,EAGIzU,KAAKyU,SAAW,GAEhBzU,KAAKyU,SAASvK,WAAY,EAE1BlK,KAAK+iB,cACL,CACIC,YAAa,gBAAC3c,EAAA,EAAD,CAAM/G,KAAK,wBACxB3N,MAAO,UACP2N,KAAM,gBAAC+G,EAAA,EAAD,CAAM/G,KAAK,kBACjB2jB,iBAAkB,CAAEpgB,UAAWnR,EAAMgW,QAAQwb,SAI3CC,cAEN,MAAM9Z,EAAM,eAAQrJ,KAAKtO,OAEzB,IAAK2X,EAAO+Z,iBAER,OAGJ,MAAM5zB,EACF6Z,EAAM,WAAiBA,EAAM,WAAN,OAAiC,KAC5D,IAAIga,EAAWha,EAAOia,mBAElB9zB,IAEA6zB,GAAQ,WAAQ7zB,IAGhB6B,GAAakyB,SAASla,GAAQ,GAE9Bma,GAAUtnB,KAAKmnB,GAIfG,GAAUtG,KAAKmG,GAIhBhc,oBAEHrH,KAAKmjB,cAGF5b,qBAEHvH,KAAKmjB,cAGFxjB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAC5B,IAAI1a,EAA0B,KAE9B,OAAK4V,GAKLvE,KAAKyU,SAAS5R,UAAd,UAA6BwG,EAAO3B,QAAQgB,KAA5C,KAEIlX,IAAI+jB,eAAelM,EAAQ9E,KAEvB8E,EAAM,UAENrJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASmO,WAAa,KAC3B5iB,KAAK+iB,cAAcU,aAAUngB,EAIzB3U,EAFA4V,EAAgB,iBAGZ,gBAACiR,EAAA,EAAD,CACItL,WAAW,EACXla,QAASqZ,EAAOoM,kBAEhB,gBAAC,GAAgBzV,KAAKyU,SAClB,gBAAC,GAAD,CACIiP,QACI,gBAAC,KACO1jB,KAAK+iB,eAEjBxZ,MAAOF,EAAOE,UAQ3B,gBAAC,GAAgBvJ,KAAKyU,SACjB,gBAAC,GAAD,CACIiP,QACI,gBAAC,KACO1jB,KAAK+iB,eAEjBxZ,MAAOF,EAAOE,UAKzBF,EAAM,UAEXhY,GAAasyB,WAAW3jB,KAAMA,KAAK+iB,eAEnCp0B,EACI,2BACI,gBAAC,KAAD,CACIiD,UAAU,MACVkZ,UAAQ,EACRnI,MAAO,CAAEU,aAAc,GACvBxR,QAAQ,WAEPwX,EAAOE,OAEZ,gBAAC,KAAD,CAAY3X,UAAU,OACjBoO,KAAK+iB,cAAcU,QAAU,MAAQ,QAMlDzjB,KAAKyU,SAAS/P,UAAW,EAEzBrT,GAAasyB,WAAW3jB,KAAMA,KAAK+iB,eACnCvxB,IAAIoyB,cACA5jB,KACAuE,EAAgB,eAChBvE,KAAKyU,UAELpL,EAAOwa,oBAEP7jB,KAAK+iB,cAAcvI,SAAW,CAC1B/rB,EACAg1B,KAEA91B,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAClC8B,GAAayyB,SAAS9jB,KAAKtO,MAAO+xB,GAElC9Q,IAAiBsB,kBACb,oBAAqBjU,KAAKtO,OAC5BuD,MAAM,KAGJ5D,GAAayyB,SAAS9jB,KAAKtO,OAAQ+xB,OAK/C90B,EACI,gBAAC,GAAgBqR,KAAKyU,SAClB,gBAAC,GAAD,CACIiP,QACI,gBAAC,KACO1jB,KAAK+iB,eAEjBxZ,MAAOF,EAAOE,WAM3B5a,GA3GI,SAtEnB,GAqLega,mBApMCC,GAAiBC,YAC7B,CACIqa,OACA,CACIle,SAAU,WAEd0D,KACA,CACI,UAAW,CAAE2B,gBAAiB,eAC9BA,gBAAiB,cACjBvB,QAAS,kBA0LNH,CAAmBob,aAAUjB,K,sCCxO7B,MAAMkB,GACpB,cAAD,KACIC,UAA4B,GAErB50B,iBAAiB60B,GAEpBlkB,KAAKikB,UAAUvzB,KAAKwzB,GAGjBC,gBAEHnkB,KAAKikB,UAAUhxB,QAASixB,IAEpBA,MAIDnmB,oBAAoBmmB,GAEvBlkB,KAAKikB,UAAU1wB,OAAOyM,KAAKikB,UAAUprB,QAAQqrB,GAAW,I,cCHzD,MAAME,WACT9d,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,OAAO,gBAAC,KAAoB2X,IAIrBV,mBAlBCC,GAAiBC,YAC7B,CACIH,KACA,KAeOC,CAAmByb,ICH3B,MAAMC,WACT/d,gBAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHU+iB,cAGV,EAGIzU,KAAKyU,SACL,CACI/M,QAAShW,EAAMgW,QACf6B,MAAO5b,IAAIwD,eAAe,MAAO,cAIlCwO,SAEH,OAAO,gBAAC,GAASK,KAAKyU,WAIf9L,mBAlCCC,GAAiBC,YAC7B,CACIH,KACA,CACI2B,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,MACtCiG,YAAa9yB,IAAI+Y,eAAe,WAChCga,YAAa,QACbC,YAAa,EACbC,OAAQ,KA0BL9b,CAAmB0b,I,6BCpB3B,MAAMK,WACTpe,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,OAAO,gBAAC,KAAuB2X,IAIxBV,mBA3BCC,GAAiBC,YAC7B,CACI8b,QACA,CACIta,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,KACpC/T,MAAOH,IAAI+Y,eAAe,WAE9Bqa,uBACA,CACI,0BACA,CACI7hB,UAAW,OAgBZ4F,CAAmB+b,ICO3B,MAAMG,WACTve,gBAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQijB,eAGR,EAGI3U,KAAK+G,MAAQ,CAAEoP,MAAM,GAGlBxW,SAEH,MACM3P,EADM,eAAQgQ,KAAKtO,OACF1B,QACvB,IAAIrB,EAA0B,KAiC9B,OA/BIqB,IAEArB,EACI,gBAACm2B,GAAA,EAAD,CACIC,YAAa,IAAM/kB,KAAKiH,SAAS,CAAEkP,MAAM,KAEzC,gBAAC,GAAD,CAEI6O,gBAAiB,EACjB7O,KAAMnW,KAAK+G,MAAMoP,KACjBW,MAAO9mB,GAEP,gBAACoZ,EAAA,EAAD,CACII,OAAK,EACLmL,UAAWiD,GAAK5X,KAAK2U,UAAYiD,EACjClQ,QAAS,CAAEgB,KAAM1I,KAAKtO,MAAMgW,QAAQgB,MACpCpJ,KAAK,qBACLsV,QAAS,KAGL5U,KAAK2U,UAAU0G,QACfrb,KAAKiH,SAAS,CAAEkP,MAAM,KAE1B8M,iBAAkB,CACdpgB,UAAW7C,KAAKtO,MAAMgW,QAAQwb,aAO/Cv0B,GAIAga,mBA7ECC,GAAiBC,YAC7B,CACIqa,OACA,CACI,kBACA,CACI7Y,gBAAiB7Y,IAAI+Y,eAAe,YAG5C7B,KACA,CACI,UACA,CACI2B,gBAAiBC,kBAAO9Y,IAAI+Y,eAAe,UAAW,KAE1DF,gBAAiB7Y,IAAI+Y,eAAe,UACpC5Y,MAAOiX,EAAM4B,QAAQC,gBAAgBjZ,IAAI+Y,eAAe,WACxDlH,aAAc,EACdoG,YAAa,EACbP,cAAe,UA0DZP,CAAmBkc,IC1D3B,MAAMI,WACT3e,YAEOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAWQwzB,aAAe,KAEnBllB,KAAKiH,SAAS,CAAEke,cAAc,KAV9BnlB,KAAK+G,MACL,CACIoe,aAAczzB,EAAM6gB,WAAWC,YAAY2S,gBAG/CzzB,EAAMwzB,aAAa71B,iBAAiB2Q,KAAKklB,cAQtCpT,uBAEH9R,KAAKtO,MAAMwzB,aAAannB,oBAAoBiC,KAAKklB,cAG9CvlB,SAEH,MAAMylB,EAAaplB,KAAKtO,MAAM6gB,WAAWC,YAAY8F,YAErD,IAAI+M,EAA2B,KAa/B,OAXIrlB,KAAKtO,MAAM6b,KAAKU,QAEhBoX,EACI,gBAAC,WAAD,KACI,uBAAKxiB,UAAU,+BACf,uBAAKA,UAAU,uBACX,gBAAC,GAAD,SAMZ,gBAAC,GAAD,CACI2a,MAAI,EACJC,UAAWzd,KAAKtO,MAAM+rB,UACtB5a,UAAW7C,KAAKtO,MAAMgW,QAAQgB,KAC9BgV,QAAM,EACNI,UAAW,EACXwH,GAAI,UAAGF,EAAWtL,cAAd,YAA+BsL,EAAW71B,KAA1C,eACKyQ,KAAKtO,MAAM6b,KAAKtB,kBAExBoZ,EACD,uBAAKxiB,UAAW7C,KAAKtO,MAAMgW,QAAQ6d,OAC9BvlB,KAAK+G,MAAMoe,cAAgBnlB,KAAKtO,MAAM8zB,mBACjCn0B,GAAaC,OACX0O,KAAKtO,MAAM8zB,mBADb,eAGSxlB,KAAKtO,MAAM6gB,WAHpB,CAIMhF,KAAMvN,KAAKtO,MAAM6b,KACjB+J,aAActX,KAAKtO,MAAM6b,KAAK/d,OAC9BkqB,sBACI1Z,KAAKtO,MAAM6b,KAAKoM,gBAE1B,MAETtoB,GAAaC,OACV0O,KAAKtO,MAAMmW,MACX,CACI2K,YAAaxS,KAAKtO,MAAM6gB,WAAWC,YACnChjB,OAAQwQ,KAAKtO,MAAM6b,KAAK/d,WAMjCmZ,mBA3FCC,GAAiBC,YAC7B,CACI0c,MACA,CACI,eACA,CACIzc,QAAS,SAGjBJ,KACA,CACIzD,WAAY,YAgFT0D,CAAmBsc,ICzGlC,MAAMQ,WAAwBnf,YAInBC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHU+iB,cAGV,EAGIzU,KAAKyU,SACL,CACIuO,YAAa,gBAAC3c,EAAA,EAAD,CAAM/G,KAAK,wBACxB3N,MAAO,UACP6oB,SAAU,CACN/rB,EACAg1B,KAEAzjB,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAUiO,eACxCjC,IAER5O,UAAW,GAIZlV,SAEH,IAAKK,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAUkO,mBAE7C,OAAO,KAGX,MAAMC,EACF5lB,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAUoO,mBAC1CvmB,EAAyB,IAAlBsmB,EAAsB,gBAC/B,uBACE,IAAEE,GAAQ9lB,KAAKtO,MACfq0B,EAAWD,EAAIE,WAAWC,cAC1BH,EAAIhO,uBAEV,OAAIiO,GAAY,EAEL,6BAGX/lB,KAAKyU,SAASgP,QAAUmC,IAAkBG,EAC1C/lB,KAAKyU,SAASnV,KAAO,gBAAC+G,EAAA,EAAD,CAAM/G,KAAMA,IAG7B,uBACIqD,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,UAGhB,gBAAC,GAAD,CACIgG,QAAS,gBAAC,KAAwB1jB,KAAKyU,UACvClL,MAAM,GACN5G,MAAO,CAAEqf,SAAU,aAMxByD,UC1ER,MAAMS,GAQT,6BAAqCz3B,GAE7By3B,GAASC,sBAAsBttB,QAAQpK,EAAMT,MAAQ,IAErDS,EAAMO,kBACNP,EAAMQ,kBAId,+BACIR,EACA23B,GAGA,IAAKF,GAASG,qBAAqBzoB,SAASnP,EAAMT,KAE9C,OAGJS,EAAMQ,iBACNR,EAAMO,kBAEN,MAAMs3B,EAAsBF,EAAON,IAAIS,2BAEvC,OAAQ93B,EAAMT,KAEV,IAAK,MACL,IAAK,OAED,MAEJ,IAAK,WACD,GAAIs4B,EAAcF,EAAON,IAAIU,0BAA4B,EACzD,CACIJ,EAAON,IAAIW,yBAEX,MAAMC,EAAWN,EAAON,IAAIa,uBAC5BP,EAAON,IAAIc,eAAeF,EAAUN,EAAOS,QAE/C,MAEJ,IAAK,SACD,GAAIP,EAAc,EAClB,CACIF,EAAON,IAAIgB,6BAEX,MAAMC,EAAUX,EAAON,IAAIkB,sBAC3BZ,EAAON,IAAIc,eAAeG,EAASX,EAAOS,QAE9C,MAEJ,QACI,MAAM,IAAI/hB,MAAJ,sBAAyBrW,EAAMT,OAIjD,6BACIi5B,EACAhN,GAEAgN,EAAK53B,iBAAiB,UAAW62B,GAASgB,uBAE1CjN,EAAM5qB,iBAAiB,UAAYZ,IAE3By3B,GAASC,sBAAsBttB,QAAQpK,EAAMT,MAAQ,GAErDS,EAAMO,oBAKlB,4BAAmCi4B,GAE/BA,EAAKlpB,oBAAoB,UAAWmoB,GAASgB,uBAGjD,mBACID,EACAE,GAEAF,EAAK53B,iBAAiB,UAAYZ,IAEZ,UAAdA,EAAMT,KAENm5B,EAAO14B,KAKnB,uBAA8BwrB,GAG1B1rB,OAAOuE,WAAW,IAAMmnB,EAAMoB,QAAS,IAG3C,4BACI4L,EACAtiB,GAEAsiB,EAAKvV,aAAa,gBAAiB/M,EAAW,OAAS,UA3GlDuhB,GAEMG,qBAAuB,CAClC,MAAO,OAAQ,WAAY,UAHtBH,GAKMC,sBAAwB,CACnC,YAAa,YAAa,aAAc,UAAW,MAAO,QCSlE,MAAMiB,WAA0B9gB,YAIrBC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHU+iB,cAGV,OAyCQ4S,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAxC7CsO,KAAK+G,MAAQ,CAAEwgB,WAAW,GAE1BvnB,KAAKyU,SACL,CACIuO,YAAa,gBAAC3c,EAAA,EAAD,CAAM/G,KAAK,wBACxB3N,MAAO,UACP2N,KAAM,gBAAC+G,EAAA,EAAD,CAAM/G,KAAK,kBACjBkb,SAAU,CACN/rB,EACAg1B,KAEAzjB,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAU+P,gBACxC,CAACxnB,KAAKtO,MAAMqqB,MAAO0H,GACvBzjB,KAAKiH,SAAS,CAAEsgB,UAAW9D,KAE/B5O,UAAW,GAGfqR,GAASuB,YAAY/1B,EAAMg2B,UAAW,KAElC1nB,KAAKiH,SACAQ,IAEU,CAAE8f,WAAY9f,EAAU8f,YAEnC,KAEIvnB,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAU+P,gBACxC,CAACxnB,KAAKtO,MAAMqqB,MAAO/b,KAAK+G,MAAMwgB,eAI9CrB,GAASyB,qBAAqBj2B,EAAMg2B,WAAW,GAC/Ch2B,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eAEjD31B,EAAMg2B,UAAUhW,aAAa,aAAc,cAQxCI,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtDO,UAIH,OAFA5nB,KAAK6nB,eAEE,EAGJloB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAMzB,OAJAsO,KAAKyU,SAASgP,QACVzjB,KAAKtO,MAAM6gB,WAAWC,YAAYiF,UAAUqQ,cACxCze,EAAO0S,MAGX,uBACIpZ,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,WAGhB,gBAAC,GAAD,CACIgG,QACI,gBAAC,KAAwB1jB,KAAKyU,UAClClL,MAAM,GACN5G,MAAO,CAAEqf,SAAU,YAMxBoF,I,GAAAA,MCkFR,IAAMW,GADZvT,YACD,GADA,cAEIlO,YAuCOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAtCiBs2B,YAAc,OAsC/B,KArCQC,0BAqCR,OApCQC,+BAoCR,OAnCQC,cAAwC,KAmChD,KAlCQC,sBAkCR,OAjCQC,4BAiCR,OAhCQnG,cAAwC,KAgChD,KA/BQoG,2BAA4B,EA+BpC,KA9BQC,cAA+B,KA8BvC,KA7BQC,aAAuB,KA6B/B,KA5BQC,qBAAuB,EA4B/B,KA3BQC,OAAgC,KA2BxC,KA1BQxD,aAAe,IAAIlB,GA0B3B,KAzBQ2E,yBAyBR,OAxBQC,mCAwBR,OAtBQC,aACJ,IAAI9wB,IAqBR,KApBQ+wB,4BAoBR,OAlBQC,UACJ,IAAIhxB,IAiBR,KAhBQixB,aAAe,IAAI7nB,IAgB3B,KAfQ8nB,cAAwC,KAehD,KAdQC,eAAyC,KAcjD,KAbQC,yBAaR,OAZQC,4BAYR,OAXQC,yBAWR,OAVUC,aAUV,OATUC,eASV,OARUC,iBAA4C,KAQtD,KAPUC,aAAuB,EAOjC,KANU9c,yBAMV,OALO+c,eAKP,OAJOnS,aAIP,OAHOoS,+BAAgC,EAGvC,KA+iBQC,OAAUn7B,KAETA,EAAMo7B,cAAcC,SAASr7B,EAAMs7B,gBACjCt7B,EAAMqmB,kBAAkBkV,aACxBv7B,EAAMo7B,cAAcC,SAASr7B,EAAMqmB,UAElC9U,KAAK2pB,+BAEL3pB,KAAKuX,QAAQ0S,cAGjBjqB,KAAKiH,SAAS,CAAEijB,WAAW,MA1jBnC,KA8jBQjP,QAAWxsB,KAEVA,EAAMo7B,cAAcC,SAASr7B,EAAMs7B,gBACjCt7B,EAAMo7B,cAAcC,SAASr7B,EAAMqmB,SAEtC9U,KAAKiH,SAAS,CAAEijB,WAAW,KAnkBnC,KAukBQC,uBAAyB,KAE7B,MAAMC,EAAgCpqB,KAAKuX,QAAQ8S,iBAC7CC,EAAyBtqB,KAAKuX,QAAQO,uBAE5C,IAAIyS,EAAS,EACTC,EAASF,EAAiB,EAO9B,GANIF,IAAoBA,EAAgBK,YAEpCF,EAASvqB,KAAKuX,QAAQoP,uBACtB6D,EAASxqB,KAAKuX,QAAQyP,uBAGtBoD,GACGA,EAAgBM,UAAYH,GAC5BH,EAAgBM,UAAYF,EAE/BxqB,KAAKuX,QAAQqP,eACTwD,EAAgBM,SAChBN,EAAgBvD,OAChBuD,EAAgBK,eAGxB,CACI,MAAME,EACFL,EAAiB,EAAI,EAAItqB,KAAKuX,QAAQoP,uBACpCiE,EACF5qB,KAAK0pB,UAAUmB,yBAAyB,GAE5C7qB,KAAKuX,QAAQqP,eACT+D,EACAC,EACAN,EAAiB,EAAI,WAAQhnB,KAvmBzC,KA2mBQwnB,UAAar8B,IAEjB,GAAkB,MAAdA,EAAMT,KAAegS,KAAKuX,QAAQwT,kBAAkBh7B,QAAU,EAClE,CACItB,EAAMQ,iBAEN,MAAMg4B,EAAOjnB,KAAKuX,QAAQ8S,iBAC1B,IAAI56B,EAGAA,EAFAw3B,EAAKwD,UAECzqB,KAAKuX,QAAQQ,gBAAgBkP,EAAKyD,UAIlC1qB,KAAKuX,QAAQyT,uBAAuB/D,EAAKyD,UAGnD1qB,KAAKwnB,gBAAgB,CAAC/3B,IAAOuQ,KAAK8nB,cAAcr4B,IAAM,GAEtDuQ,KAAKuX,QAAQqP,eACTK,EAAKyD,SAAUzD,EAAKJ,OAAQI,EAAKwD,aA5nBzCzqB,KAAK+G,MACL,CACIkkB,SAAS,EACTf,WAAW,EACXgB,yBAAyB,GAG7Bx5B,EAAMy5B,YAAYvT,GAAK5X,KAAK0T,aAAakE,IAErClmB,EAAMgpB,cAEN1a,KAAKqpB,oBAAsB5I,YAAQ,KAE/B,MAAM/F,EAA0BhpB,EAAMgpB,YACtC,IAAK,MAAM0Q,KAAY1Q,EAEnB1a,KAAKqrB,eACDD,EAASE,KAAMF,EAASG,OAAQH,EAAS38B,OAGjD,GAAIiD,EAAM85B,eACV,CACI,MAAMC,EACF/Q,EAAYliB,OAAOkzB,GAAkB,cAAbA,EAAEH,QAE9B,GAAIE,EAAe17B,OAASiQ,KAAKyoB,qBACjC,CACI,MAAMkD,EACFF,EAAeA,EAAe17B,OAAS,GAC3CiQ,KAAK4T,YAAY+X,EAAWL,KAAX,QAErBtrB,KAAKyoB,qBAAuBgD,EAAe17B,WAG/C,CACI,GAAI2qB,EAAY3qB,OAASiQ,KAAKyoB,qBAC9B,CACI,MAAMkD,EACFjR,EAAYA,EAAY3qB,OAAS,GACrCiQ,KAAK4T,YAAY+X,EAAWL,KAAX,QAErBtrB,KAAKyoB,qBAAuB/N,EAAY3qB,WAKhD2B,EAAMk6B,qBAENl6B,EAAMk6B,oBAAoB,IAAM5rB,KAAK6rB,oBAGrCn6B,EAAMo6B,gBAENp6B,EAAMo6B,eAAet8B,GAAUwQ,KAAK4T,YAAYpkB,IAGpD,MAAMu8B,EAAkBr6B,EAAMq6B,iBAAmB,CAC7CvV,GAAI,GACJC,GAAI,GACJC,GAAI,EACJG,GAAI,GACJF,GAAI,GA8CR,GA3CAjlB,EAAM6gB,WAAWC,YAAjB,eAEO9gB,EAAM6gB,WAAWC,YAFxB,CAGIgF,OAAQ,IAAMxX,KAAKuX,QACnBwU,kBACA5G,aAAc,MAAQnlB,KAAKuX,QAC3BkC,mBAAoB/nB,EAAM85B,eAC1B5X,YAAapkB,GAAUwQ,KAAK4T,YAAYpkB,GACxCw8B,YAAa,IAAMhsB,KAAKgsB,cACxBvU,UACA,CACIoO,iBAAkB,IAAM7lB,KAAK6lB,mBAC7BnO,gBAAiB,IAAM1X,KAAK0X,kBAC5BuU,cAAsC,aAAvBv6B,EAAMw6B,aACrBpE,cAAelQ,GAAK5X,KAAK8nB,cAAclQ,GACvC+N,mBAA2C,aAAvBj0B,EAAMw6B,eAClBx6B,EAAMy6B,iBACdzG,eAAgBlG,GAAKxf,KAAK0lB,eAAelG,GAAG,GAC5CgI,gBAAiB,CAAC5P,EAAG4H,IAAMxf,KAAKwnB,gBAAgB5P,EAAG4H,GAAG,IAE1D4M,iCACI5M,GAAKxf,KAAKosB,iCAAiC5M,GAC/C6M,gBAAiB,IAAMrsB,KAAKqsB,oBAEhC36B,EAAM6gB,WAAWC,YAAY8F,YAAYgU,SAAW56B,EAAM46B,SAE1DtsB,KAAKspB,QAAU,GAEftpB,KAAKspB,QAAQiD,aAAc,EAC3BvsB,KAAKspB,QAAQkD,kBAAmB,EAChCxsB,KAAKspB,QAAQmD,WAAa,GAC1BzsB,KAAKspB,QAAQoD,UAAYh7B,EAAM+3B,aAC/BzpB,KAAKspB,QAAQnwB,QAAU,CACnBwzB,aAAc,IAAM3sB,KAAK0pB,UACzBkD,uBAAwB,KAEpB,MAAMxxB,EAAgB4E,KAAKooB,iBAAkBhN,cACzC,qBAEJ,OAAOhgB,EAAKyxB,YAAczxB,EAAK0xB,cAInCp7B,EAAMq7B,QAAQh9B,OAClB,CACI,IAAK,MAAM82B,KAAUn1B,EAAMq7B,QAEvBlG,EAAOmG,iBAAP,eAEOnG,EAAOmG,iBAFd,CAGIza,WAAY7gB,EAAM6gB,aAEtBsU,EAAOoG,mBAAP,eAEOpG,EAAOoG,mBAFd,CAGI1a,WAAY7gB,EAAM6gB,aAGtBvS,KAAKspB,QAAQmD,WAAW/7B,KAAKm2B,GAIjC7mB,KAAKspB,QAAQmD,WAAW/7B,KACpB,CACIw8B,UAAW,uBACXC,MAAO,UACPC,YAAa,kCACblQ,MAAM,EACNtS,SAAU,EACVyiB,WAAW,EACXC,UAAU,EACVC,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACnB1kB,MAAO,IA2DnB,GAlDA/I,KAAKspB,QAAQoE,UAAY,aAEzB1tB,KAAKspB,QAAQqE,gBAAiB,EAC9B3tB,KAAKspB,QAAQsE,aAAgBn+B,GAAiBA,EAAID,OAClDwQ,KAAKspB,QAAQuE,aAAe,GAExBn8B,EAAM85B,iBAENxrB,KAAKspB,QAAQiD,aAAc,EAC3BvsB,KAAKspB,QAAQwE,+BAAiC7I,GAC9CjlB,KAAKspB,QAAQyE,4BAA8B,CACvCtQ,UAAW/rB,EAAM+rB,UACjB5V,MAAOnW,EAAM85B,eACbtG,aAAcllB,KAAKklB,aACnB3S,WAAY7gB,EAAM6gB,WAClBiT,mBAAoB9zB,EAAM8zB,oBAE9BxlB,KAAKspB,QAAQuE,aAAe,EAC5B7tB,KAAKspB,QAAQ0E,gBAAkB,KAAM,EACrChuB,KAAKspB,QAAQ2E,SAAW,CAAEC,OAAQ,QAClCluB,KAAKspB,QAAQ6E,eAAiB,GAGlCnuB,KAAKspB,QAAQ8E,YAAa,EAE1BpuB,KAAKspB,QAAQ+E,mBAAqBruB,KAAKgoB,YACvChoB,KAAKspB,QAAQgF,cAAgB,CACzB,kBAAoB7+B,GAETuQ,KAAK8nB,cAAcr4B,IAGlCuQ,KAAKspB,QAAQiF,gBAAkB78B,EAAM88B,SACrCxuB,KAAKspB,QAAQmF,aAAe,CAAC,MAAO,QACpCzuB,KAAKspB,QAAQK,+BAAgC,EAC7C3pB,KAAKspB,QAAQoF,mBAAqBh9B,EAAM88B,SACxCxuB,KAAKspB,QAAQqF,8BAA+B,EAC5C3uB,KAAKspB,QAAQsF,+BAAgC,EAC7C5uB,KAAKspB,QAAQuF,wBAAyB,EACtC7uB,KAAKspB,QAAQwF,uBAAwB,EACrC9uB,KAAKspB,QAAQyF,yBAA0B,EACvC/uB,KAAKspB,QAAQ0F,2BAA4B,EACzChvB,KAAKspB,QAAQ2F,YAAa,EAC1BjvB,KAAKspB,QAAQ4F,sBAAyB9I,GAEtB,IAELA,EAAO33B,MAAM0gC,MAGpBz9B,EAAMq7B,QAAQh9B,QAAU2B,EAAMw6B,aAClC,CACI,IAAKx6B,EAAM85B,eACX,CACI,MAAMpF,EAAS,CAAE7T,WAAY7gB,EAAM6gB,YAEnCvS,KAAKspB,QAAQmD,WAAc,CAAC,CACxB2C,sBAAuBhI,GACvB6F,mBAAoB7G,EACpBiJ,UACA,CACI,sBAAuB39B,EAAMkX,MAAM4B,QAAQ9E,KAAK,MAEpDynB,MAAO,qBACPmC,yBAA0B7J,GAC1B8J,sBAAuBnJ,EACvBlJ,MAAM,EACNsS,cAAc,EACdC,OAAQ,OACRpC,WAAW,EACXE,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACnB1kB,MAAO,KACK2mB,OAAO1vB,KAAKspB,QAAQmD,YAGxCzsB,KAAKspB,QAAQqG,eAAwC,aAAvBj+B,EAAMw6B,aACpClsB,KAAKspB,QAAQ4C,aAAex6B,EAAMw6B,aAClClsB,KAAKspB,QAAQsG,wBACc,aAAvBl+B,EAAMw6B,aACVlsB,KAAKspB,QAAQuG,2BAA4B,EAG7C7vB,KAAKspB,QAAQwG,aAAe,KAGpB9vB,KAAKsoB,2BAELtoB,KAAK6rB,oBAIb7rB,KAAKspB,QAAQyG,cAAiBthC,IAEtBA,EAAMuhC,oBAENhwB,KAAKsoB,2BAA4B,EACjCx1B,WAAW,IAAMkN,KAAKsoB,2BAA4B,KAI1DtoB,KAAKspB,QAAQ2G,gBAAmBxhC,IAEvBA,EAAMo4B,QAAWp4B,EAAMo4B,OAAOqJ,YAAYzC,mBACvCh/B,EAAM0hC,WAKdnwB,KAAK0pB,UAAU0G,iBAAiBpwB,KAAKupB,WAGrCh7B,OAAO8hC,aAAarwB,KAAKioB,sBACzBjoB,KAAKioB,qBAAuB15B,OAAOuE,WAC/B,IAAMkN,KAAKuX,QAAQ+Y,WACnB,OAGRtwB,KAAKspB,QAAQiH,cAAgB,KAEzBvwB,KAAKuX,QAAQiZ,aAAa,CAAEC,OAAO,IACnCzwB,KAAKuX,QAAQmZ,iBAGjB1wB,KAAKspB,QAAQqH,gBAAmBliC,IAE5BuR,KAAKqsB,kBACLrsB,KAAKuX,QAAQmZ,gBACb1wB,KAAK4wB,aAAa5wB,KAAKuX,QAAQsZ,yBAGnC7wB,KAAKspB,QAAQwH,YAAeriC,IAExBuR,KAAK0pB,UAAYj7B,EAAMi7B,UACvB1pB,KAAKuX,QAAU9oB,EAAMq3B,IAErB9lB,KAAK+wB,iBAEL/wB,KAAKiH,SACD,CAAE+pB,aAAa,GACf,KAEIhxB,KAAKixB,gBAGDjxB,KAAKtO,MAAM85B,gBACgC,IAAxCxrB,KAAKuX,QAAQsZ,yBAEhB7wB,KAAKopB,uBAAyB76B,OAAOuE,WACjC,IAAMkN,KAAKqsB,kBACX,MAGRrsB,KAAKklB,aAAaf,mBAI9BnkB,KAAKspB,QAAQ4H,kBAAqBziC,IAKzBuR,KAAKooB,mBAKV75B,OAAO8hC,aAAarwB,KAAKqoB,wBACzBroB,KAAKqoB,uBAAyB95B,OAAOuE,WACjC,KAGIkN,KAAKmxB,aAAa1iC,EAAM2iC,aAAc3iC,EAAMo+B,YAAc,IAE9D,OAGR7sB,KAAKspB,QAAQ+H,oBAAuB5iC,IAE5BA,EAAM6iC,UAENtxB,KAAKqsB,kBAGLrsB,KAAK6rB,qBAIb7rB,KAAKspB,QAAQiI,mBAAsB9iC,IAE/BuR,KAAKwxB,mBAILC,kBAEJ,MAAMC,EAAY1xB,KAAKuX,QAAL,UAA0Boa,KAG5C,GAFsB3xB,KAAKuX,QAAQO,yBAErB4Z,EAAUtW,cAAc,qBACtC,CACI,MAAMmB,EAA4BluB,SAASojB,cAAc,OACnDmgB,EAAmB5xB,KAAKuX,QAAQQ,gBAAgB,GAOhD8Z,GANU,aAEZ/X,cAAe9Z,KAAKtO,MAAMooB,cAC1BvM,KAAMqkB,EAAQrkB,MACXvN,KAAKtO,MAAM6gB,YAELlhB,GAAaygC,gBAElB,gBAAC,WAAD,KACI,uBACIjvB,UAAU,0BACVyiB,GAAIsM,EAAQrkB,KAAK/d,SAErB,gBAAC,GAAD,OAGR,QACA,IAEJ+sB,EAAU1Z,UAAY,mBACtB6uB,EAAU9f,YAAY2K,GAEtBD,SAAgBuV,EAAMtV,IAItBwV,eAAezG,GAEnB,GAAItrB,KAAKtO,MAAM85B,eAEX,OAGJ,MAAMkG,EAAY1xB,KAAKooB,iBAAkBhN,cACrC,oBACEmB,EAA4BluB,SAASojB,cAAc,OACzD8K,EAAU1Z,UAAY,wBACtB6uB,EAAU9f,YAAY2K,GAEtB,MAAMgG,EAAUlxB,GAAaygC,gBAErB,uBAAKjvB,UAAU,kBAAkByiB,GAAIgG,EAAI,QACrC,uBAAKzoB,UAAU,cAAcF,MAAO,CAAEoG,MAAO,KAC7C,gBAAC1C,EAAA,EAAD,CACIxD,UAAU,uBACVvD,KAAK,sBACLqD,MAAO,CAAEsG,OAAQ,OAI7B,QACA,GAEJqT,SAAgBiG,EAAShG,EAAW,KAEhC,MAAMyV,EAAczV,EAAUnB,cAAV,eACRkQ,EAAI,OADI,OAGpBtrB,KAAKiyB,oBAAoBD,GACzBhyB,KAAK6oB,aAAaz5B,IAAIk8B,EAAM0G,KAI5BE,YAAYN,EAAkBxhC,GAElC,GAAI4P,KAAKtO,MAAM85B,eAEX,OAGJ,MAAMjP,EAA4BluB,SAASojB,cAAc,OACnD0gB,EAAgBnyB,KAAKuX,QAAL,UAA0B6a,cAC1CV,EAAY1xB,KAAKuX,QAAL,UAA0Boa,KACtCniC,EAASoiC,EAAQrkB,KAAK/d,OAExBoiC,EAAQrkB,KAAKU,OAEbsO,EAAU1Z,UAAY,oCACtB6uB,EAAU9f,YAAY2K,KAItBA,EAAU1Z,UAAY,yBACtBsvB,EAAcvgB,YAAY2K,IAG9B,MAAMgG,EAAUlxB,GAAaygC,gBAErB,uBAAKjvB,UAAU,eAAeyiB,GAAI91B,GAC9B,gBAAC,GAAD,CACIQ,QAASwB,IAAIC,iBAAiBrB,MAI1C,QACA,GAEJksB,SAAgBiG,EAAShG,EAAW,KAEhC,MAAM8V,EAAW9V,EAAUnB,cAAV,eACL5rB,EADK,OAGjBwQ,KAAKsyB,iBAAiBD,GACtBryB,KAAK+oB,UAAU35B,IAAII,EAAQ6iC,KAI3BtB,iBAEJ,MAAMwB,EAAmCvyB,KAAKtO,MAAM6gB,WAEhDvS,KAAKtO,MAAM8gC,qBAEXxyB,KAAKkiB,cAAgB7wB,GAAaC,OAC9B0O,KAAKtO,MAAM8gC,mBAAoBD,IAGnCvyB,KAAKtO,MAAM8zB,oBAAsBxlB,KAAKtO,MAAMw6B,eACxClsB,KAAKtO,MAAM85B,iBAEfxrB,KAAKipB,cAAgB53B,GAAaC,OAC9B0O,KAAKtO,MAAM8zB,mBAAoB+M,IAGnCvyB,KAAKtO,MAAM+gC,qBAEXzyB,KAAKmoB,cAAgB92B,GAAaC,OAC9B0O,KAAKtO,MAAM+gC,mBAAoBF,IAGnCvyB,KAAKtO,MAAMghC,sBAEX1yB,KAAKkpB,eAAiB73B,GAAaC,OAC/B0O,KAAKtO,MAAMghC,oBAAqBH,IAIpCI,gBAEJ,IAAIhkC,EAAiB,EAUrB,OARAhB,IAAImC,eAAemD,QAASC,IAExBvE,GAAUuE,EAAchD,QAAQsI,OAAOhI,GACnCA,EAAOlB,SAAW0Q,KAAKtO,MAAMooB,eAAe/pB,OAChDpB,GAAUuE,EAAcjD,KAAKuI,OAAO/I,GAChCA,EAAIH,SAAW0Q,KAAKtO,MAAMooB,eAAe/pB,SAG1CpB,EAGHk3B,mBAEJ,OAAO7lB,KAAKgpB,aAAapf,KAGrB8N,kBAEJ,IAAK1X,KAAKuX,QAEN,KAAM,oBAGV,MAAMtnB,EAAkB,GACxB+P,KAAKuX,QAAQyO,WAAWrO,YAAaoE,IAE7B/b,KAAKgpB,aAAa56B,IAAI2tB,EAAKxO,KAAK/d,SAEhCS,EAAKS,KAAKqrB,EAAKxO,QAIvB,IAAK,IAAIsK,EAAI,EAAGA,EAAI7X,KAAKuX,QAAQO,uBAAwBD,IACzD,CACI,MAAMpoB,EAAMuQ,KAAKuX,QAAQQ,gBAAgBF,GACrC7X,KAAKgpB,aAAa56B,IAAIqB,EAAI8d,KAAK/d,SAE/BS,EAAKS,KAAKjB,EAAI8d,MAItB,OAAOtd,EAGH2iC,iBAEJ,MAAMruB,EACF/S,IAAIgT,oBAAoBxE,KAAKtO,OACjC,IAAI/C,EAA0B,KAQ9B,OALKqR,KAAKtO,MAAMmhC,sBAAwBtuB,EAAiBzU,iBAErDnB,EAAS6C,IAAIC,iBAAiB8S,EAAiBzU,iBAG5CnB,EAGHm5B,cAAcr4B,GAElB,OAAOuQ,KAAKgpB,aAAa56B,IAAIqB,EAAI8d,KAAK/d,QAuFlCkkB,aAAanG,GAEjBhf,OAAO8hC,aAAarwB,KAAK4oB,+BACzBr6B,OAAO8hC,aAAarwB,KAAKopB,wBAGzB,MAAM0J,EAAiB7kC,KAAKC,UAAU6kC,YAAKxlB,IAE3C,GAAKvN,KAAKuX,SAsBV,GAZIvX,KAAKtO,MAAMshC,YAEXhzB,KAAK4wB,aAAarjB,EAAKxd,QAGvBiQ,KAAKtO,MAAMuhC,qBAEXjzB,KAAKuX,QAAQoD,0BAKb3a,KAAKwoB,eAAiBsK,EAc1B,GATA9yB,KAAKwoB,aAAesK,EAEpB9yB,KAAKiH,SAAS,CAAEgkB,QAAyB,IAAhB1d,EAAKxd,SAE1BiQ,KAAK0X,kBAAkB3nB,OAAS,IAEhCiQ,KAAKwpB,iBAAmBxpB,KAAK0X,mBAG7B1X,KAAKtO,MAAM85B,eAEXxrB,KAAKuX,QAAQ2b,WAAW3lB,GAExBvN,KAAKopB,uBACD76B,OAAOuE,WAAW,IAAMkN,KAAKqsB,kBAAmB,SAGxD,CAWI,GAVArsB,KAAKuX,QAAQ2b,WACT3lB,EAAK/U,OAAO2F,IAAUA,EAAM8P,QAChCjO,KAAKuX,QAAQ4b,oBACT5lB,EAAK/U,OAAO2F,GAASA,EAAM8P,QAE3BjO,KAAKtO,MAAMshC,YAEXhzB,KAAK4wB,aAAarjB,EAAKxd,aAGWuT,IAAlCtD,KAAKtO,MAAM0hC,mBACf,CACIpzB,KAAKgpB,aAAar1B,QAClB,IAAK,MAAM0/B,KAASrzB,KAAKtO,MAAM0hC,qBAE3BpzB,KAAKgpB,aAAa/rB,IAAIo2B,OAI9B,CAEI,MAAMC,EAAU,IAAInyB,IAChBoM,EAAKjQ,IAAYua,GAAKA,EAAC,SAC3B,IAAK,MAAM7pB,KAAOgS,KAAKgpB,aAEdsK,EAAQllC,IAAIJ,IAEbgS,KAAKgpB,aAAahrB,OAAOhQ,GAKrC,GAAIuf,EAAKxd,OAAS,GAAKiQ,KAAKwpB,iBAC5B,CACI,MAAMv5B,EAAkB,GACxB+P,KAAKuX,QAAQyO,WAAWrO,YAAaoE,IAE7B/b,KAAKwpB,iBAAkBp2B,KAAKmgC,GAC5BxX,EAAKxO,KAAKtB,kBAAoBsnB,EAAStnB,kBAEvChc,EAAKS,KAAKqrB,KAIlB,IAAK,IAAIlE,EAAI,EACTA,EAAI7X,KAAKuX,QAAQO,uBAAwBD,IAC7C,CACI,MAAMpoB,EAAMuQ,KAAKuX,QAAQQ,gBAAgBF,GACrC7X,KAAKwpB,iBAAiBp2B,KAAKmgC,GAC3B9jC,EAAI8d,KAAKtB,kBAAoBsnB,EAAStnB,kBAEtChc,EAAKS,KAAKjB,GAGlBuQ,KAAKwnB,gBAAgBv3B,GAAM,GAAM,GAErC+P,KAAKwpB,iBAAmB,KAExBxpB,KAAKixB,gBAGL1iC,OAAO8hC,aAAarwB,KAAK2oB,qBACzB3oB,KAAK2oB,oBAAsBp6B,OAAOuE,WAC9B,KAEIkN,KAAKuX,QAAQmZ,gBACb1wB,KAAKwxB,kBACLxxB,KAAKwzB,qBACLxzB,KAAKyzB,kBACLzzB,KAAK+oB,UAAU91B,QAASo/B,IAEpBryB,KAAKsyB,iBAAiBD,KAE1BryB,KAAKyxB,mBAET,UApHJzxB,KAAK4oB,8BACDr6B,OAAOuE,WAAW,IAAMkN,KAAK0T,aAAanG,IAuH9CmmB,0BAEJ1zB,KAAK6oB,aAAa51B,QAAS0gC,IAEvB3zB,KAAKiyB,oBAAoB0B,KAIzB1B,oBAAoBD,GAExB,IAAK,IAAI7+B,EAAQ,EAAGA,EAAQ6M,KAAKuX,QAAQO,uBACrC3kB,IACJ,CACI,MAAMy+B,EAAmB5xB,KAAKuX,QAAQQ,gBAAgB5kB,GAEtD,GAAIy+B,EAAQrkB,KAAK/d,SAAWwiC,EAAY1M,GACxC,CACI0M,EAAYrvB,MAAM2X,IAAlB,WACSnnB,EAAQ,GAAKy+B,EAAQlF,UAAa,EAD3C,MAEA,QAKJ4F,iBAAiBD,GAErB,IAAK,IAAIl/B,EAAQ,EAAGA,EAAQ6M,KAAKuX,QAAQO,uBACrC3kB,IACJ,CACI,MAAMy+B,EAAmB5xB,KAAKuX,QAAQQ,gBAAgB5kB,GAEtD,GAAIy+B,EAAQrkB,KAAK/d,SAAW6iC,EAAS/M,GACrC,CACI+M,EAAS1vB,MAAM2X,IAAf,UACQnnB,EAAQy+B,EAAQlF,UAAY,EADpC,MAEA2F,EAAS1vB,MAAMsG,OAAf,UAA2B2oB,EAAQlF,UAAY,EAA/C,MACA,OAIR1sB,KAAKuX,QAAQI,YAAaia,IAEtB,GAAIA,EAAQrkB,KAAK/d,SAAW6iC,EAAS/M,GACrC,CAEI,MAAM3sB,EAAwC,IAAvBi5B,EAAQgC,YACtBhC,EAAQgC,WACP5zB,KAAKuX,QAAQsc,wBAA0B,EACvC,EAAJ,EACNxB,EAAS1vB,MAAM2X,IAAf,UACQsX,EAAQgC,WAAahC,EAAQlF,UAAa/zB,EADlD,MAEA05B,EAAS1vB,MAAMsG,OAAf,UAA2B2oB,EAAQlF,UAAY/zB,EAA/C,SAKJm7B,oBAAoBjN,EAAgB52B,GAExC+P,KAAKuX,QAAQwc,yBAAyB,CAClChH,QAAS,CAAClG,GACVmN,SAAU/jC,IACXgD,QAAQg0B,GAAQA,EAAKW,QAAQ,KAG5B4L,qBAEJ,MAAMziC,EAAQiP,KAAKuX,QAAQO,uBACrB2C,EAAQza,KAAKtO,MAAMgpB,iBACXpX,IAAVmX,IAKA1pB,EAEAiP,KAAK6oB,aAAa51B,QAAS++B,IAEvB,IAAIh/B,GAAgB,EAEpB,IAAK,IAAIG,EAAQ,EAAGA,EAAQpC,EAAOoC,IAE3B6M,KAAKuX,QAAQQ,gBAAgB5kB,GAAOoa,KAAK/d,SACzCwiC,EAAY1M,KAEZtyB,GAAO,GAIf,IAAKA,EACL,CACIspB,yBACI0V,EAAYiC,eAEhB,MAAM3I,EACF7Q,EAAM0F,KAAKuL,GAAKA,EAAEJ,KAAF,SAAqB0G,EAAY1M,IACjDgG,IAEAtrB,KAAK6oB,aAAa7qB,OAAOstB,GACzB7Q,EAAMlnB,OAAOknB,EAAM5hB,QAAQyyB,GAAO,GAClCtrB,KAAK0zB,+BAOjB1zB,KAAK6oB,aAAa51B,QAAS++B,IAEvB1V,yBACI0V,EAAYiC,iBAGpBj0B,KAAK6oB,aAAal1B,QAClB8mB,EAAM1qB,OAAS,IAIfmkC,kBAEJ,MAAMC,EAAiC,GAEvCn0B,KAAK+oB,UAAU91B,QAASo/B,IAEpB8B,EAAgBzjC,KAAK2hC,EAAS4B,eAE9B3X,yBACI+V,EAAS4B,iBAGbE,EAAgBpkC,OAAS,IAEzBxB,OAAO8hC,aAAarwB,KAAK8oB,wBACzB9oB,KAAK8oB,uBAAyBv6B,OAAOuE,WACjC,KAEIqhC,EAAgBlhC,QAASmhC,IAErB,MAAMjC,EACFnyB,KAAKuX,QAAL,UAA0B6a,cACxBV,EAAY1xB,KAAKuX,QAAL,UAA0Boa,KAE5C,IAEIQ,EAAckC,YAAYD,GAC1B1C,EAAU2C,YAAYD,GAE1B,gBAQhBp0B,KAAK+oB,UAAUp1B,QAGXk4B,mBAEJ,MAAM5E,EAAOjnB,KAAKuX,QAAQ8S,iBACtBpD,GAEAjnB,KAAKuX,QAAQqP,eACTK,EAAKyD,SAAUzD,EAAKJ,OAAQI,EAAKwD,WAIrC7W,YAAYpkB,GAEZwQ,KAAKtO,MAAM85B,eAEXxrB,KAAKs0B,0BAA0B9kC,GAI/BwQ,KAAKu0B,4BAA4B/kC,GAIjC+kC,4BAA4B/kC,GAEhC,IAAIoiC,EAA0B,KAC9B,MAAM4C,EAA0Bx0B,KAAKuX,QAAQO,uBAC7C,IAAI4S,GAAY,EAChB,IAAK,IAAI7S,EAAI,EAAGA,EAAI2c,EAAiB3c,IAGjC,GADA+Z,EAAU5xB,KAAKuX,QAAQQ,gBAAgBF,GAClC+Z,EAAQrkB,KAAiB/d,SAAWA,EACzC,CACIk7B,EAAW7S,EACX,MAIR,GAAI6S,EAAW,IAAMkH,EAEjB,MAAM,IAAI9sB,MAAJ,cAAiBtV,EAAjB,eAGV,MAGMilC,EAH2Bz0B,KAAKooB,iBAAkBhN,cACpD,8BAGgBsZ,wBAAwBpa,IACtCqa,EACFF,EAAkB7C,EAAQlF,WAAahC,EAAW,GAChDkK,EACFH,EAAkB7C,EAAQlF,UAAYhC,EAEtCiK,EAAkB,GAAKpmC,OAAOsmC,YAE9BtmC,OAAOwwB,SACH,EACAxwB,OAAOumC,QAAUH,EAAkB,GAAKpmC,OAAOsmC,aAE9CD,EAAe,IAEpBrmC,OAAOwwB,SAAS,EAAGxwB,OAAOumC,QAAUF,EAAe,IAInDN,0BAA0B9kC,GAE9B,MAAMulC,EAA2B/0B,KAAKooB,iBAAkBhN,cACpD,4BACEwW,EAAmB5xB,KAAKuX,QAAQyd,WAAWxlC,GAI3ColC,EADFG,EAAgBL,wBAAwBpa,IAEtBsX,EAAQlF,UAAYkF,EAAQlH,SAElDn8B,OAAOwwB,SAAS,EAAGxwB,OAAOumC,QAAUF,EAAe,IAG/C5I,cAEJ,GAAIhsB,KAAKtO,MAAMujC,0BAEX,OAGJ,MAAMC,EAAsB7mC,SAASC,eACjC0R,KAAKtO,MAAM46B,UAAWoI,wBAAwBpa,IAE9C4a,EAAc,IAEd3mC,OAAO4mC,SAAS,GAAKC,KAAKC,KAAM,EAAIH,EAAc,GAAK,IACvDI,sBAAsB,IAAMt1B,KAAKgsB,gBAIjCtG,eAAe6N,EAAmBgC,GAEtC,GAAgC,WAA5Bv1B,KAAKtO,MAAMw6B,aAEX,KAAM,8DAKNqH,GAEAvzB,KAAKuX,QAAQie,uBACTzZ,GAAQ/b,KAAKgpB,aAAa/rB,IAAI8e,EAAKxO,KAAL,SAClCvN,KAAKuX,QAAQke,sBAIbz1B,KAAKuX,QAAQie,uBACTzZ,GAAQ/b,KAAKgpB,aAAahrB,OAAO+d,EAAKxO,KAAL,SACrCvN,KAAKuX,QAAQme,uBAGjB,MAAMC,EAAa,GACnB,IAAK,IAAI9d,EAAI,EAAGA,EAAI7X,KAAKuX,QAAQO,uBAAwBD,IACzD,CACI,MAAMpoB,EAAMuQ,KAAKuX,QAAQQ,gBAAgBF,GACrC0b,EAEAvzB,KAAKgpB,aAAa/rB,IAAIxN,EAAI8d,KAAJ,QAItBvN,KAAKgpB,aAAahrB,OAAOvO,EAAI8d,KAAJ,QAE7BooB,EAAWjlC,KAAKjB,GAEZ8lC,IAEIhC,GAAYvzB,KAAKtO,MAAMkkC,cAEvB51B,KAAKtO,MAAMkkC,cAAcnmC,EAAI8d,KAAJ,SAEnBgmB,GAAYvzB,KAAKtO,MAAMmkC,iBAE7B71B,KAAKtO,MAAMmkC,gBAAgBpmC,EAAI8d,KAAJ,SAKvCvN,KAAKuX,QAAQue,WAAW,CAAE9B,SAAU2B,IACpC31B,KAAK8zB,oBAAoB,sBACzB9zB,KAAKuX,QAAQmZ,gBACb1wB,KAAKuX,QAAQ4M,cAAc,CAAEryB,KAAM,qBAG/BikC,aAEJ,IAAK/1B,KAAK0pB,YAAc1pB,KAAKtO,MAAMq7B,QAE/B,OAAO,EAGX,MAAMiJ,EAAwB,GAC9B,IAAIC,GAAiB,EAErB,IAAK,MAAMpP,KAAU7mB,KAAKtO,MAAMq7B,QAChC,CACI,MAAMmJ,EAAmBl2B,KAAK0pB,UAAUyM,UAAUtP,EAAOsG,OACnDiJ,EAAsBF,EAASG,YAC/BA,EACFr2B,KAAKtO,MAAM4kC,gBAAgBzP,EAAOsG,MAAQntB,KAAKtO,MAAMqX,OAQzD,GANIqtB,IAAeC,IAEfr2B,KAAK0pB,UAAU6M,iBAAiB1P,EAAOsG,MAAQkJ,GAC/CJ,GAAiB,IAGhBpP,EAAO9d,OAASstB,IAAcD,EACnC,CACIp2B,KAAK0pB,UAAU8M,eAAe3P,EAAOsG,OAIrC,MAAMviB,EAAWsrB,EAASO,cAC1B,IAAI1tB,EAAQmtB,EAASQ,iBACjB3tB,EAAQ6B,IAER7B,EAAQqsB,KAAKC,IAAY,IAARtsB,EAAc6B,GAC/BsrB,EAASS,eAAe5tB,IAI5BstB,GAAar2B,KAAKtO,MAAMklC,aAAa/P,EAAOsG,QAE5C6I,EAAYtlC,KAAKm2B,EAAOsG,OAqBhC,OAjBI8I,IAIAj2B,KAAK0pB,UAAU6M,iBAAiB,sBAAsB,GACtDv2B,KAAK0pB,UAAU6M,iBAAiB,YAAY,GAE5Cv2B,KAAK0pB,UAAU6M,iBAAiB,WAAYP,EAAYjmC,SAG5DiQ,KAAK0pB,UAAU0G,iBAAiBpwB,KAAKupB,WAEjCyM,EAAYjmC,QAEZiQ,KAAKuX,QAAQiZ,aAAa,CAAEzD,QAASiJ,EAAavF,OAAO,IAGtDwF,EAGHzO,gBACJv3B,EAAiBsjC,EAAmBgC,GAEpC,GAAgC,WAA5Bv1B,KAAKtO,MAAMw6B,aACf,CACI,GAAIj8B,EAAKF,OAAS,EAEd,MAAM,IAAI+U,MAAM,+DAIpB,GAAIyuB,GAAYvzB,KAAKgpB,aAAapf,KAAO,EACzC,CACI,MAAMypB,EAAgBrzB,KAAKgpB,aAAa9uB,SAAS28B,OAAO14B,MACpDo3B,GAAiBv1B,KAAKtO,MAAMmkC,iBAE5B71B,KAAKtO,MAAMmkC,gBAAgBxC,GAG/B,MAAM5jC,EAAMuQ,KAAKuX,QAAQyd,WAAW3B,GAChC5jC,GAEAuQ,KAAK8zB,oBAAoB,qBAAsB,CAACrkC,IAEpDuQ,KAAKgpB,aAAar1B,SAI1B,MAAMgiC,EAAwB,GAC9B,IAAK,MAAMlmC,KAAOQ,EAClB,CACI,MAAMT,EAASC,EAAI8d,KAAK/d,OACpB+jC,EAEAvzB,KAAKgpB,aAAa/rB,IAAIzN,GAItBwQ,KAAKgpB,aAAahrB,OAAOxO,GAIzBC,EAAIqnC,cAEJnB,EAAWjlC,KAAKjB,GAIhBA,EAAIsnC,YAAYxD,GAGhBgC,IAEIhC,GAAYvzB,KAAKtO,MAAMkkC,cAEvB51B,KAAKtO,MAAMkkC,cAAcpmC,IAEnB+jC,GAAYvzB,KAAKtO,MAAMmkC,iBAE7B71B,KAAKtO,MAAMmkC,gBAAgBrmC,IAIvCwQ,KAAKuX,QAAQue,WAAW,CAAE9B,SAAU2B,IACpC31B,KAAK8zB,oBAAoB,qBAAsB7jC,GAC/C+P,KAAKuX,QAAQmZ,gBACb1wB,KAAKuX,QAAQ4M,cAAc,CAAEryB,KAAM,qBAG/Bs6B,iCAAiCnC,GAErCjqB,KAAK2pB,8BAAgCM,EAGjCgH,gBAEJ,IAAKjxB,KAAKuX,QAEN,OAGJ,MAAMnc,EAAgB4E,KAAKuX,QAAL,UAA0B6a,cAC1CV,EAAqB1xB,KAAKuX,QAAL,UAA0Boa,KAEjDv2B,GAEIs2B,IAEI1xB,KAAKuX,QAAQO,wBAEb4Z,EAAUsF,UAAU/5B,IAAI,mBAEpB+C,KAAKtO,MAAMulC,gBAEXvF,EAAUsF,UAAU/5B,IAAI,kCAK5By0B,EAAUsF,UAAUhlB,OAAO,mBAEvBhS,KAAKtO,MAAMulC,gBAEXvF,EAAUsF,UAAUhlB,OAAO,kCAOvCmf,aAAaloB,EAAgBF,GAIjC,GAFA/I,KAAKupB,UAAYxgB,EAEb/I,KAAKtO,MAAMq7B,QAAQh9B,OACvB,CACoCiQ,KAAK+1B,eAIjC/1B,KAAKuX,QAAQmZ,gBACb1wB,KAAKuX,QAAQiZ,eACbxwB,KAAKyzB,kBAILllC,OAAO8hC,aAAarwB,KAAKmpB,qBACzBnpB,KAAKmpB,oBAAsB56B,OAAOuE,WAC9B,KAEIkN,KAAKuX,QAAQ+Y,WACbtwB,KAAK+oB,UAAU91B,QAASo/B,IAEpBryB,KAAKsyB,iBAAiBD,MAG9B,MAIZryB,KAAKqsB,kBAGDuE,aAAa7/B,GAEjB,MAAMwrB,EAA8Bvc,KAAKtO,MAAM85B,eACrCxrB,KAAKuX,QAAL,UAA0B2f,oBAC9Bl3B,KAAKuX,QAAL,UAA0B6a,cAEhC,GAAMrhC,EAEEiP,KAAK0oB,SAELnM,EAAU8X,YAAYr0B,KAAK0oB,QAC3B1oB,KAAK0oB,OAAS,WAKlB,IAAK1oB,KAAK0oB,OACV,CACI,MAAMyO,EACFn3B,KAAKtO,MAAM6gB,WAAWC,YAAYiL,UAEtCzd,KAAK0oB,OAASr6B,SAASojB,cAAc,OACrCzR,KAAK0oB,OAAO7lB,UAAc7C,KAAKtO,MAAM85B,eAC3B2L,EAAQ,IAAM,EACV,sBAAwB,yBAC5B,YACVn3B,KAAK0oB,OAAO71B,UACRlF,IAAIwD,eAAe,YAAa,aACpCorB,EAAU3K,YAA4B5R,KAAK0oB,SAK/C+K,kBAEJ,GAA4C,IAAxCzzB,KAAKuX,QAAQsZ,wBAC8B,IAAxC7wB,KAAKuX,QAAQO,uBAEhB,OAGJ,MAAMiR,EAAmC,IAAIhxB,IAE7CpK,IAAImC,eAAemD,QAASC,IAExBA,EAAchD,QAAQsI,OAClBhI,GAAUA,EAAOlB,SAAW0Q,KAAKtO,MAAMooB,eACvC7mB,QAASzC,IAEL,IAAKwP,KAAKtO,MAAM4kC,gBACZ9lC,EAAO6C,WAAY2M,KAAKtO,MAAMqX,OAClC,CACI,MAAMvZ,EAAiBgB,EAAOhB,OAE1Bu5B,EAAU36B,IAAIoB,GAEdu5B,EAAUp5B,IAAIH,GAASkB,KAAKwC,EAAclD,SAI1C+4B,EAAU35B,IAAII,EAAQ,CAAC0D,EAAclD,aAKrDkD,EAAcjD,KAAKuI,OACf/I,GAAOA,EAAIH,SAAW0Q,KAAKtO,MAAMooB,eACjC7mB,QAASxD,IAEL,MAAMD,EAAiBC,EAAID,OAEvBu5B,EAAU36B,IAAIoB,GAEdu5B,EAAUp5B,IAAIH,GAASkB,KAAKwC,EAAclD,SAI1C+4B,EAAU35B,IAAII,EAAQ,CAAC0D,EAAclD,cAKrD,MAAMonC,EAAmBnpC,KAAKC,UAAU4L,MAAMC,KAAKgvB,EAAUsO,YAEzDr3B,KAAKuoB,gBAAkB6O,IAEvBp3B,KAAKuoB,cAAgB6O,EACrBp3B,KAAKk0B,kBAELnL,EAAU91B,QAAQ,CAAC7C,EAAUZ,KAEzB,IAAIoiC,EAAU5xB,KAAKuX,QAAQyd,WAAWxlC,GAEtC,IAAKoiC,EAED,IAAK,IAAIz+B,EAAQ,EACbA,EAAQ6M,KAAKuX,QAAQO,uBACrB3kB,IACJ,CACI,MAAMmkC,EACFt3B,KAAKuX,QAAQQ,gBAAgB5kB,GAEjC,GAAImkC,EAAU/pB,KAAK/d,SAAWA,EAC9B,CACIoiC,EAAU0F,EACV,OAKR1F,GAEA5xB,KAAKkyB,YAAYN,EAASxhC,MAMlCi8B,kBAECrsB,KAAKuX,SAAYvX,KAAKtO,MAAM85B,iBAK7BxrB,KAAKspB,QAAQiO,kBAGbv3B,KAAKuX,QAAQ4b,oBAAoBnzB,KAAKspB,QAAQiO,kBAGlDv3B,KAAKuX,QAAQI,YAAaoE,IAEtB,GAAIA,EAAK2O,UAAY1qB,KAAKuX,QAAQoP,wBAC9B5K,EAAK2O,UAAY1qB,KAAKuX,QAAQyP,sBAClC,CACI,MAAMwQ,EACFnpC,SAASC,eACL,UAAG0R,KAAKtO,MAAMooB,cAAd,YAA+B9Z,KAAKtO,MAAMnC,MAA1C,WACUwsB,EAAKxO,KAAKtB,kBAC5B,IAAIhD,EAASjJ,KAAKypB,aAEd+N,GAAWA,EAAQpG,eAEnBnoB,EAASuuB,EAAQpG,aAAe,GAEhCpxB,KAAKypB,aACD2L,KAAKqC,IAAIz3B,KAAKypB,cAAgBxgB,EAAQA,IAG9C8S,EAAK2b,aAAazuB,QAIlB8S,EAAK2b,aAAa13B,KAAKypB,gBAI/BzpB,KAAKuX,QAAQogB,sBAGTnG,kBAEJ,IAAKxxB,KAAKuX,UAAYvX,KAAKtO,MAAMw6B,aAE7B,OAGJ,MAAMn7B,EAAQiP,KAAK0X,kBAAkB3nB,OACrCiQ,KAAKiH,SAAS,CAAEikB,wBAAyBn6B,EAAQ,IAG7Cs6B,eACJC,EAAYC,EAAwB98B,GAEpC,IAAImpC,OAAuCt0B,EAO3C,OANItD,KAAK6oB,aAAaz6B,IAAIk9B,KAEtBsM,EACI53B,KAAK6oB,aAAal5B,IAAI27B,GAAOuM,YAG7BtM,GAEJ,IAAK,YACD,IAAKqM,EAED,OAGgB53B,KAAK6oB,aAAal5B,IAAI27B,GACblQ,cACzB,yBACKzY,MAAMyX,QAAU,IACzB,MAEJ,IAAK,UACD,IAAKwd,IAAanpC,EAEd,OAGJ,GAAIA,EAAMqpC,OAASrpC,EAAMspC,OAAS,EAK9B,OAHAH,EAASZ,UAAU/5B,IAAI,yBACvB26B,EAASj1B,MAAMoG,MAAQ,OAM3B,MAAMivB,EAAM5C,KAAK6C,MAAOxpC,EAAMqpC,OAASrpC,EAAMspC,MAAS,IACtDH,EAASj1B,MAAMoG,MAAf,UAA0BivB,EAA1B,KACA,MAEJ,IAAK,UAEDh4B,KAAK0zB,0BACL1zB,KAAK+xB,eAAezG,GACpB,MAEJ,IAAK,WACD,IAAKsM,EAED,OAGJA,EAASZ,UAAUhlB,OAAO,oBAC1B4lB,EAASj1B,MAAMoG,MAAQ,QAO5BxB,qBAGHhZ,OAAO8hC,aAAarwB,KAAKkoB,2BACzBloB,KAAKkoB,0BAA4B35B,OAAOuE,WACpC,KAEIkN,KAAKyzB,kBACLzzB,KAAK+oB,UAAU91B,QAASo/B,IAEpBryB,KAAKsyB,iBAAiBD,MAG9B,KAGDvgB,uBAEHvjB,OAAO8hC,aAAarwB,KAAKioB,sBACzB15B,OAAO8hC,aAAarwB,KAAKkoB,2BACzB35B,OAAO8hC,aAAarwB,KAAKqoB,wBACzB95B,OAAO8hC,aAAarwB,KAAK2oB,qBACzBp6B,OAAO8hC,aAAarwB,KAAK4oB,+BACzBr6B,OAAO8hC,aAAarwB,KAAK8oB,wBACzBv6B,OAAO8hC,aAAarwB,KAAKmpB,qBACzB56B,OAAO8hC,aAAarwB,KAAKopB,wBAEzBppB,KAAKtO,MAAMy5B,YAAY,MACnBnrB,KAAKtO,MAAMk6B,qBAEX5rB,KAAKtO,MAAMk6B,oBAAoB,MAE/B5rB,KAAKtO,MAAMo6B,gBAEX9rB,KAAKtO,MAAMo6B,eAAe,MAG1B9rB,KAAKuX,SAILvX,KAAKuX,QAAQ2gB,cAAc,IAG3Bl4B,KAAKqpB,qBAELrpB,KAAKqpB,sBAIN1pB,SAEH,MAAMw4B,EAAqBn4B,KAAK2yB,gBAC1ByF,EAA+Bp4B,KAAK4yB,iBACpCyF,EAAYr4B,KAAKtO,MAAM4mC,mBAAqBt4B,KAAK+G,MAAMkkB,QACvDsN,GAAev4B,KAAK+G,MAAMkkB,UAAYjrB,KAAK+G,MAAMmjB,UAEvD,OACI,uBACIrnB,UACI7C,KAAKtO,MAAM85B,eACLxrB,KAAKtO,MAAMgW,QAAQya,eACnBniB,KAAKtO,MAAMgW,QAAQgB,KAC7B4c,GAAItlB,KAAKtO,MAAM46B,UAEZ6L,GAAcC,EACb,gBAAC,KAAD,CAAOta,UAAW,EAAGnb,MAAO,CAAE6b,QAAS,KACnC,gBAAC,KAAD,CACI5sB,UAAU,MACV+Q,MAAO,CAAEhR,MAAOH,IAAI+Y,eAAe,YAElC6tB,EACED,EAAa3mC,IAAI4R,gBAAJ,UAET+0B,EAFS,YAEoB,IAAfA,EAAmBxqC,IAAIwD,eAAe,gCAAiC,cAAgBxD,IAAIwD,eAAe,gCAAiC,gBAC1J,OAGd,KAEH6O,KAAKkiB,cACF,gBAACf,GAAA,EAAD,CACIqX,eAAe,MACfC,QAASz4B,KAAKtO,MAAMgnC,oBACb14B,KAAK+G,MAAMmkB,yBAElB,gBAACnN,GAAA,EAAD,CACIC,QAAS,IACT5B,GAAIpc,KAAKtO,MAAMgnC,qBACP14B,KAAK+G,MAAMmkB,yBAEnB,uBAAKroB,UAAW7C,KAAKtO,MAAMgW,QAAQ6d,OAC9BvlB,KAAKkiB,iBAIlB,KAEHliB,KAAKipB,cACF,gBAAC9H,GAAA,EAAD,CACIqX,eAAe,MACfC,QAASz4B,KAAK+G,MAAMmkB,yBAEpB,gBAACnN,GAAA,EAAD,CACIC,QAAS,IACT5B,GAAIpc,KAAK+G,MAAMmkB,yBAEf,uBAAKroB,UAAW7C,KAAKtO,MAAMgW,QAAQ6d,OAC9BvlB,KAAKipB,iBAIlB,KAEHjpB,KAAK+G,MAAMiqB,YACR,uBAAKnuB,UAAW7C,KAAKtO,MAAMgW,QAAQ6d,OAC9BvlB,KAAKtO,MAAMinC,eACN,KAEd,uBAAKh2B,MAAO,CAAEmG,QAASuvB,EAAY,OAAS,UACxC,uBACIx1B,UAAW,+BACD7C,KAAK+G,MAAMmjB,UAAY,aAAe,IAChDN,OAAQ5pB,KAAK4pB,OACb3O,QAASjb,KAAKib,QACd6P,UAAW9qB,KAAK8qB,UAChB8N,IAAKhhB,GAAK5X,KAAKooB,iBAAmBxQ,GAElC,uBACIqD,QAASjb,KAAKmqB,uBACdtV,SAAU0jB,EAAc,GAAK,IAEjC,gBAAC,eAAgBv4B,KAAKspB,UAEzBtpB,KAAKkpB,eACF,uBACIvmB,MAAO,CACHU,aAAcrD,KAAKmoB,eACS,OAArBnoB,KAAKtO,MAAMqX,MAAiB,GAAK,IAG3C/I,KAAKkpB,gBAEV,KACJ,uBAAKrmB,UAAW7C,KAAKtO,MAAMgW,QAAQ6d,OAC9BvlB,KAAKmoB,cAAgBnoB,KAAKmoB,cAAgB,YA9qDnE,GAqrDexf,mBA5sDCC,GAAiBC,YAC7B,CACI0c,MACA,CACI,eACA,CACIzc,QAAS,SAGjBJ,KACA,CACI2B,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,OAE1C8D,eACA,CACI,4CACA,CACInd,SAAU,aA2rDX2D,CAAmBob,aAAUrO,cAAYqS,M,kBCn1DjD,MAAM8Q,WACTvyB,gBAOA,6BACIpS,GAGA,IAEI,MAAM2e,QAAkC3e,EAExC0X,IAAcuH,aAAaN,EAASO,kBACpC,IAAK,MAAM0lB,KAAajmB,EAASkmB,WAE7B/jC,IAAU2Y,QAAQmrB,GAKtB,OAFAnrC,IAAI0lB,qBAEG,EAEX,MAAOphB,GACN,IAAD,EACI,UAAIA,QAAJ,IAAIA,OAAJ,YAAIA,EAASpE,cAAb,aAAI,EAAiBmrC,QAEjB,OAAO,EAGX,MAAMhpC,EACF2K,KAAYs+B,2BAA2BhnC,GAM3C,MALIjC,GAEArC,IAAIolB,WAAW,CAAC/iB,IAGdiC,GAIPsU,YAAY7U,GAEf8U,MAAM9U,GADV,KA1CQ+tB,yBA0CR,OAzCQyZ,2BAyCR,OAxCQC,kCAAiD71B,EAwCzD,KAvCQ81B,yBAuCR,OAUQvZ,YAAc,KAElB,MAAMwZ,EACFztB,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMooB,eACxCgG,EACFlU,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMpC,QAEzC+pC,EAAYlsB,eAAkB2S,EAAW3S,cAM1CksB,EAAYlsB,cAAgB2S,EAAW3S,cAEnCksB,EAAYnsB,uBAA0B4S,EAAW3S,cAEjDnN,KAAKs5B,aAAaxZ,EAAW3S,eAI7BnN,KAAKiH,SAAS,CAAEsyB,kBAAkB,MAMrCv5B,KAAKm5B,8BACHn5B,KAAKm5B,6BAA+BE,EAAYlsB,gBAEnDnN,KAAK0T,eArBL1T,KAAKiH,SAAS,CAAEsyB,kBAAkB,KAhBtCv5B,KAAK+G,MACL,CACIyyB,eAAe,EACfD,kBAAkB,GAsClBE,iBAEJ,IAAIJ,EACAztB,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMooB,eAC9C,MAAMgG,EACFlU,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMpC,QAEzC+pC,EAYIA,EAAYlsB,eAAiB2S,EAAW3S,eAC1CksB,EAAYlsB,eAAiB2S,EAAW3S,eAE3CnN,KAAK0T,gBAbA1Z,IAAeC,OAAO7L,IAAI4R,KAAKtO,MAAMooB,gBAEtC9f,IAAe6C,SAAS,IAAIjC,IACxB,UAAWoF,KAAKtO,MAAMooB,gBAE9Buf,EAAcztB,IAAc/W,SAAS8Y,QACjC3N,KAAKtO,MAAMooB,cAAegG,EAAW3S,eAEzCnN,KAAKs5B,aAAaxZ,EAAW3S,gBAQjCnN,KAAKyf,oBAAsBgB,YAAQzgB,KAAK6f,aAGpCnM,eAEJ,MAAM2lB,EACFztB,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMooB,eAE9C9Z,KAAKm5B,6BAA+BE,EAAYlsB,cAEhDnN,KAAKiH,SAAS,CAAEsyB,kBAAkB,IAElCv5B,KAAKtO,MAAMgiB,eAGf,mBAA2B9F,GAEnB5N,KAAKo5B,qBAELp5B,KAAKo5B,oBAAoBhgB,QAG7BxN,IAAc/W,SAASiZ,sBACnB9N,KAAKtO,MAAMooB,cAAelM,GAE9B5N,KAAKiH,SAAS,CAAEuyB,eAAe,IAE/Bx5B,KAAKo5B,oBAAsBp5B,KAAKtO,MAAMgoC,UAEtC,IAKI,SAFUb,GAAUc,gBAAgB35B,KAAKo5B,qBAGzC,CACI,MAAMC,EACFztB,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMooB,eAC1Cuf,IAEAA,EAAYlsB,cAAgB,IAAIvX,KAAK,wBACrCyjC,EAAYnsB,uBACRmsB,EAAYlsB,oBAKpBnN,KAAKiH,SAAS,CAAEuyB,eAAe,IAGvC,SAEIx5B,KAAKiH,SAAS,CAAEuyB,eAAe,EAAOD,kBAAkB,KAIzDlyB,oBAIHrH,KAAKk5B,sBAAwBpmC,WAAW,IAAMkN,KAAKy5B,kBAGhD3nB,uBAEHvjB,OAAO8hC,aAAarwB,KAAKk5B,uBAErBl5B,KAAKyf,qBAELzf,KAAKyf,sBAGLzf,KAAKo5B,qBAELp5B,KAAKo5B,oBAAoBhgB,QAI1BzZ,SAEH,OACI,gBAACi6B,GAAA,EAAD,CACIxjB,OAAQpW,KAAK+G,MAAMyyB,eACZx5B,KAAK+G,MAAMwyB,oBAMnBV,U,mBCtJR,MAAMgB,WACTvzB,gBAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQijB,eAGR,EAGI3U,KAAK+G,MAAQ,CAAEoP,MAAM,GAGlBxW,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB1B,EAAUqZ,EAAOrZ,QACjB8pC,EAAezwB,EAAOywB,aACtBvoC,EAAW8X,EAAO9X,SACxB,IAAIgxB,EAA2B,mCAExBlZ,EAAO9X,gBACP8X,EAAO3B,eACP2B,EAAOrZ,eACPqZ,EAAO4M,eACP5M,EAAO0wB,cACP1wB,EAAO8M,YACP9M,EAAOywB,aAEV9pC,IAEAuyB,EACI,gBAACuC,GAAA,EAAD,CACIkV,WAAW,cACXjV,YAAa,IAAM/kB,KAAKiH,SAAS,CAAEkP,MAAM,KAEzC,gBAAC,GAAD,CACI8jB,sBAAoB,EACpBjV,gBAAiB,EACjB/O,QAASjW,KAAKtO,MAAMukB,QACpB8jB,OAAQ/5B,KAAKtO,MAAMqoC,OACnB5jB,KAAMnW,KAAK+G,MAAMoP,QAAUnW,KAAKtO,MAAMykB,KACtCW,MAAO9mB,GAEP,gBAACoZ,EAAA,EAAD,CACII,OAAK,EACLmL,UAAWiD,GAAK5X,KAAK2U,UAAYiD,EACjClQ,QAAS,CAAEgB,KAAM1I,KAAKtO,MAAMgW,QAAQwyB,QACpC56B,KAAK,qBACLsV,QAAS,KAGL5U,KAAK2U,UAAU0G,QACfrb,KAAKiH,SAAS,CAAEkP,MAAM,KAE1BgkB,YAAaL,EACP,KAAQM,GAAWN,cAAe,QAClCx2B,EACN2f,iBAAkB,CACdpgB,UAAW7C,KAAKtO,MAAMgW,QAAQwb,aAOtD,IAAIrgB,EAAS,UAAM7C,KAAKtO,MAAMgW,QAAQgB,KAAzB,KAcb,OAbIW,EAAOgxB,QAEPx3B,GAAa7S,EACPgQ,KAAKtO,MAAMgW,QAAQ4yB,WAAat6B,KAAKtO,MAAMgW,QAAQ6yB,MAIzD13B,GAAa7S,EACPgQ,KAAKtO,MAAMgW,QAAQpX,MAAQ0P,KAAKtO,MAAMgW,QAAQ8yB,cAGjDnxB,EAAOgxB,QAGV,gBAAC,KAAD,iBACQhxB,EADR,CAEIoxB,aAAclY,EACd7a,QAAS,CAAE8B,MAAOxJ,KAAKtO,MAAMgW,QAAQ8B,OACrC3G,UAAWA,IAEVtR,IAKFoX,I,GAAAA,eApJCC,GAAiBC,YAC7B,CACIW,MACA,CACIkxB,MAAO,GACPpgB,IAAK,qBAET4f,OACA,CACI,UACA,CACI7vB,gBAAiBC,kBAAO9Y,IAAI+Y,eAAe,UAAW,KAE1DF,gBAAiB7Y,IAAI+Y,eAAe,UACpC5Y,MAAOiX,EAAM4B,QAAQC,gBAAgBjZ,IAAI+Y,eAAe,YAE5Dja,MACA,CACIg0B,YAAa9yB,IAAI+Y,eAAe,WAEpCiwB,OACA,CACIlW,YAAa,eAEjBpB,OACA,CACI,kBACA,CACI7Y,gBAAiB7Y,IAAI+Y,eAAe,YAG5C7B,KACA,CACIgZ,WAAY,SACZ6C,YAAa,QACbC,YAAa,EACbvb,OAAQ,mBACR/F,YAAa,EACbH,UAAW,EACXgG,MAAO,mBACP0b,OAAQ,GAEZ8V,MACA,CACIjW,YAAa,cACbrb,OAAQ,mBACRlG,UAAW,GAEfu3B,WACA,CACIhW,YAAa9yB,IAAI+Y,eAAe,UAChCtB,OAAQ,mBACRlG,UAAW,KAgGR4F,CAAmBkxB,IC1J3B,MAAMc,GAOT,8BAEQA,GAAcC,uBAEdD,GAAcC,sBAAsBhR,SAI5C,qBAA6Bn7B,GAEzB,GAAqB,OAAjBA,EAAMo4B,QAAsC,OAAnBp4B,EAAMi8B,SAE/B,OASJ,GANIiQ,GAAcC,uBAEdD,GAAcC,sBAAsBhR,UAInCn7B,EAAMuhC,kBAEP,OAGJ,IAAIvgC,EASJ,GANIA,EAFAhB,EAAMg8B,UAEAh8B,EAAMq3B,IAAI/N,gBAAgBtpB,EAAMi8B,UAIhCj8B,EAAMq3B,IAAIkF,uBAAuBv8B,EAAMi8B,WAE5Cj7B,EAED,OAGJ,MAGMorC,EAHYpsC,EAAMq3B,IAAIiO,yBACxB,CAAEhH,QAAS,CAACt+B,EAAMo4B,QAASmN,SAAU,CAACvkC,KAEf,GAC3B,IAAKorC,EAED,OAGJ,MACMC,EADgBD,EAASE,gCAAgCrpC,MAE7C6gB,WAAWC,YAAY8F,YAAYgU,SAE/C0O,EAAcL,GAAcM,iBAAiBH,GACnD,IAAK,MAAMI,KAAcF,EAEjBE,EAAWC,WAAa1sC,EAAMo4B,OAAOuU,YAClCF,EAAWxQ,WAAaj8B,EAAMi8B,UAC9BwQ,EAAWzQ,YAAch8B,EAAMg8B,YAElCyQ,EAAWjgB,UACX0f,GAAcC,sBAAwBM,GAKlD,2CACI9U,EACAnL,EACA2O,GAEA,MAAMkR,EACF1U,EAAO7T,WAAWC,YAAY8F,YAAYgU,SAExCwO,KAAkBH,GAAcM,mBAElCN,GAAcM,iBAAiBH,GAAkB,GAEjD1U,EAAON,IAAIz2B,iBACP,cAAesrC,GAAc5K,eACjC3J,EAAON,IAAIz2B,iBACP,qBAAsBsrC,GAAcU,uBAG5CV,GAAcM,iBAAiBH,GAAgBpqC,KAC3C,CACIyqC,SAAU/U,EAAOS,OAAOuU,WACxBxR,SACA3O,UACAyP,SAAUtE,EAAOsE,SACjBD,UAAWrE,EAAO7Y,KAAKU,MAAQ,MAAQ,OAInD,6CACImY,EACAnL,EACA2O,GAEA,MAAMkR,EACF1U,EAAO7T,WAAWC,YAAY8F,YAAYgU,SAE9CqO,GAAcM,iBAAiBH,GAC3BH,GAAcM,iBAAiBH,GAAgBtiC,OAC3CgnB,GAAKA,EAAEoK,SAAWA,GAEtB+Q,GAAcC,uBACXD,GAAcC,sBAAsBhR,SAAWA,IAElD+Q,GAAcC,sBAAwB,MAGtCD,GAAcM,iBAAiBH,GAAgB/qC,QAAU,WAElD4qC,GAAcM,iBAAiBH,GAEtC1U,EAAON,IAAI/nB,oBACP,cAAe48B,GAAc5K,eACjC3J,EAAON,IAAI/nB,oBACP,qBAAsB48B,GAAcU,wBA9HvCV,GAEMM,iBACiC,GAHvCN,GAKMC,sBAAgD,KCsB5D,IAAMU,GADZ9mB,YACD,GADA,cAEIlO,YAIA,0BAAiC8f,GAE7B,MAAO,GAGX,uBACImV,EACAC,EACAC,GAGA,OAAOF,EAAY/iC,OAAOkjC,GAAKA,EAAEv9B,OAAOpO,OAAOyG,WAG5C+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAjBU+iB,cAiBV,OAkCQknB,WAAa,KAEjB37B,KAAKiH,SAAS,CAAE20B,kBAAkB,KApCtC,KAuCQC,YAAc,KAElB77B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAzCtC,KA4CQvU,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QA9CjD,KAiDQoqC,kBAAoB,KAExB97B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAnDtC,KAsDQG,iBAAmB,KAEvB/7B,KAAKiH,SAAS,CAAE20B,kBAAkB,KArDlC57B,KAAK+G,MAAQ,CAAE60B,kBAAkB,GAEjC57B,KAAKyU,SACL,CACIuO,YAAa,gBAAC3c,EAAA,EAAD,CAAM/G,KAAK,wBACxB3N,MAAO,UACP2N,KAAM,gBAAC+G,EAAA,EAAD,CAAM/G,KAAK,kBACjBkb,SAAU,CACN/rB,EACAg1B,KAEA91B,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxD6B,GAAayyB,SAASpyB,EAAO+xB,IAEjC5O,UAAW,GAGfqR,GAASuB,YAAY/1B,EAAMg2B,UAAW,KAElC,MAAMvpB,EAAiB9M,GAAakyB,SAAS7xB,GAAO,GACpD/D,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxD6B,GAAayyB,SAASpyB,GAAQyM,KAGlCw8B,GAAcqB,oCACVtqC,EAAOsO,KAAK67B,YAAa77B,KAAK27B,YAClCjqC,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eA4B9CvV,uBAEH6oB,GAAcsB,sCACVj8B,KAAKtO,MAAOsO,KAAK67B,YAAa77B,KAAK27B,YACvC37B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtDO,UAIH,OAFA5nB,KAAK6nB,eAEE,EAGJloB,SAEH,MAAMsY,EAAoBzmB,IAAIgT,oBAC1BxE,KAAKtO,MAAOsO,KAAKtO,MAAM6b,MAE3B,IAAK0K,EAED,OAAO,KAGXiO,GAASyB,qBACL3nB,KAAKtO,MAAMg2B,UACXzP,EAAkBU,aAAelW,IAAYmC,YAEjD,MAAM3F,EAAmBe,KAAKtO,MAAM6b,KAAK5Y,WAAWqL,KAAKtO,MAAMnC,MACzD,GAAK,IAAI0oB,EAAkBnoB,gBAEjC,OAAImoB,EAAkBU,aAAelW,IAAYoC,WAE7C7E,KAAKyU,SAASgP,QACVpyB,GAAakyB,SAASvjB,KAAKtO,OAAO,GAElCuN,EAAOlP,OAGH,gBAAC,GAAD,eACIsqC,QACIr6B,KAAKtO,MAAM6b,KAAKU,OACbjO,KAAKtO,MAAM6gB,WAAWC,YAAYykB,eACzCjnC,QAASwB,IAAIC,iBAAiBwN,GAC9BgX,QAASjW,KAAK87B,kBACd/B,OAAQ/5B,KAAK+7B,iBACb5lB,KAAMnW,KAAK+G,MAAM60B,iBACjB9B,cAAc,GACV,CAAEn3B,MAAO,CAAEu5B,eAAgB,YAE/B,gBAAC,KAAwBl8B,KAAKyU,WAKtC,uBAAK5R,UAAW7C,KAAKtO,MAAMgW,QAAQgB,MAC/B,gBAAC,KAAwB1I,KAAKyU,YAKtC,uBACI5R,UAAW7C,KAAKtO,MAAMgW,QAAQgB,KAC9B/F,MAAO,CAAEM,SAAU,KAEnB,gBAACoD,EAAA,EAAD,CACI/G,KAAMU,KAAKtO,MAAMyM,MAAQ,eAAiB,GAC1CwE,MAAO,CAAEsG,OAAQ,WAlJrC,GAwJeN,mBAtKCC,GAAiBC,YAC7B,CACIH,KACA,CACIgZ,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRizB,eAAgB,SAChBh5B,YAAa,EACbsb,QAAS,YA6JN7V,CAAmB2yB,ICpL3B,MAAMa,WACT71B,gBAEA,0BAAiC8f,GAG7B,OADYA,EAAO7Y,KACRtJ,sBACPmiB,EAAOgW,OAAOC,OAAQ9yB,MAG9B,uBACIgyB,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CAC8BhuB,EAAK1d,WAET8oB,aAAelW,IAAYkC,WAE7ChW,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAMQ21B,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAL7CA,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eAQ9CvV,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAMsY,EAAoBzmB,IAAIgT,oBAC1BxE,KAAKtO,MAAOsO,KAAKtO,MAAM6b,MAE3B,OAAK0K,GAKLiO,GAASyB,qBAAqB3nB,KAAKtO,MAAMg2B,WAAW,GAChDzP,EAAkBU,aAAelW,IAAYgC,OAEtC,KAIP,uBACI9B,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,aAGhB,gBAACrX,EAAA,EAAD,CACI/G,KAAM2Y,EAAkBlW,SACxBY,MACI,CACIM,SAAU,GACVgG,OAAQ,OACR/F,WAAY,EACZuG,YAAa,UAGzB,uBACI9G,MACI,CACI25B,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,SAGdkP,EAAkB1O,SAvCpB,MA6CJ4yB,U,UCrER,MAAMI,WACTj2B,gBAEO3G,SAEH,OACI,gBAAC68B,GAAA,EAAD,CACIlnB,aAAYtV,KAAKtO,MAAMsjB,cACvBL,UACIiD,GAAK5X,KAAKtO,MAAM+qC,QACVz8B,KAAKtO,MAAM+qC,QAAQ7kB,GAAoB,KAEjD/U,UAAW7C,KAAKtO,MAAMgW,QAAQgB,KAC9Bg0B,aAAc18B,KAAKtO,MAAMirC,mBACzBh+B,KAAMqB,KAAKtO,MAAMiN,KACjBgE,MACI3C,KAAKtO,MAAMuX,OACL,CAAEA,OAAQjJ,KAAKtO,MAAMuX,OAAQF,MAAO/I,KAAKtO,MAAMqX,OAC/C,GACV8L,SAAU7U,KAAKtO,MAAMmjB,SACrBC,OAAO,SACPmO,iBAAkB,CAAEpgB,UAAW7C,KAAKtO,MAAMgW,QAAQwb,SAElD,gBAAC7c,EAAA,EAAD,CACIxD,UAAW7C,KAAKtO,MAAMgW,QAAQpI,KAC9BqI,YAAU,EACVrI,KAAMU,KAAKtO,MAAM4N,OAErB,gBAAC8J,EAAA,EAAD,CACIvG,UAAW7C,KAAKtO,MAAMgW,QAAQwyB,OAC9BpwB,WAAW,OACXxK,KAAK,kBACLuV,UAAW,MAMhBlM,mBAvECC,GAAiBC,YAC7B,CACIqxB,OACA,CACI0C,OAAQ,EACR1zB,cAAe,OACfmR,SAAU,WACVqgB,MAAO,GAEXp7B,KACA,CACI3N,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BuD,OAAQ,MACRF,MAAO,OAEXma,OACA,CACIja,OAAQ,oBACRyU,OAAQ,QACR3U,MAAO,qBAEXL,KACA,CACIm0B,WAAYj0B,EAAM4B,QAAQ9E,KAAK,KAC/BoD,QAAS,OACTG,OAAQ,GACR6zB,QAAS,OACT93B,SAAU,SACVqV,SAAU,WACVtR,MAAO,MA0CJJ,CAAmB4zB,ICtC3B,MAAMQ,WACTz2B,gBAEO3G,SAEH,OACI,gBAAC68B,GAAA,EAAD,CACIlnB,aAAYtV,KAAKtO,MAAMsjB,cACvBL,UACIiD,GAAK5X,KAAKtO,MAAM+qC,QACVz8B,KAAKtO,MAAM+qC,QAAQ7kB,GAAoB,KAEjD/U,UAAW7C,KAAKtO,MAAMgW,QAAQgB,KAC9Bg0B,aAAc18B,KAAKtO,MAAMirC,mBACzBh+B,KAAMqB,KAAKtO,MAAMiN,KACjBgE,MAAO,CAAEsG,OAAQjJ,KAAKtO,MAAMuX,QAC5B4L,SAAU7U,KAAKtO,MAAMmjB,SACrBC,OAAO,SACPmO,iBAAkB,CAAEpgB,UAAW7C,KAAKtO,MAAMgW,QAAQwb,SAElD,uBACIrgB,UAAW7C,KAAKtO,MAAMgW,QAAQs1B,MAC9Blb,IAAK9hB,KAAKtO,MAAMurC,OAChBt6B,MACI,CACIqf,SAAU,OACVkb,UAAWl9B,KAAKtO,MAAMyrC,IACtBp0B,MAAO/I,KAAKtO,MAAMqX,SAG9B,gBAACK,EAAA,EAAD,CACIvG,UAAW7C,KAAKtO,MAAMgW,QAAQwyB,OAC9BpwB,WAAW,OACXxK,KAAK,kBACLuV,UAAW,MAMhBlM,mBAzECC,GAAiBC,YAC7B,CACIqxB,OACA,CACI0C,OAAQ,EACR1zB,cAAe,OACfmR,SAAU,WACVqgB,MAAO,GAEXsC,MACA,CACI/zB,OAAQ,OACRF,MAAO,QAEXma,OACA,CACIja,OAAQ,oBACRyU,OAAQ,QACR3U,MAAO,qBAEXL,KACA,CACII,QAAS,eACTg0B,QAAS,OACT93B,SAAU,SACVqV,SAAU,WACV,CAACzR,EAAM0V,YAAYC,KAAK,OACxB,CACIyD,SAAU,WA6CXrZ,CAAmBo0B,IClE3B,MAAMK,WACT92B,gBACH,eAAD,oBACY+2B,WAAczE,IAEd54B,KAAKtO,MAAM+qC,SAEXz8B,KAAKtO,MAAM+qC,QAAQ7D,IAIpBj5B,SAEH,OAAQK,KAAKtO,MAAM4rC,eAEf,IAAK,qBACD,MAAMC,EAA8B,GAMpC,OALIv9B,KAAKtO,MAAM8rC,SAEXD,EAA2B,WAAiB,QAI5C,gBAACn0B,EAAA,EAAD,eACIkM,aAAYtV,KAAKtO,MAAMsjB,cACvBL,UAAW3U,KAAKq9B,WAChBV,mBAAoB38B,KAAKtO,MAAMirC,mBAC/Bh+B,KAAMqB,KAAKtO,MAAM+rC,YACjBn+B,KAAK,kBACLsK,KAAK,QACLjH,MAAO,CAAEsG,OAAQ,QACjB4L,SAAU7U,KAAKtO,MAAMmjB,SACrBC,OAAO,UACHyoB,IAIhB,IAAK,kBAmCL,IAAK,mBACD,OAAIv9B,KAAKtO,MAAMgsC,SAGP,gBAAC,GAAD,CACI1oB,cAAehV,KAAKtO,MAAMsjB,cAC1B2nB,mBAAoB38B,KAAKtO,MAAMirC,mBAC/BQ,IAAI,QACJl0B,OAAQjJ,KAAKtO,MAAMkwB,YACnBjjB,KAAMqB,KAAKtO,MAAM+rC,YACjBR,OAAQj9B,KAAKtO,MAAMurC,OACnBR,QAASz8B,KAAKq9B,WACdxoB,SAAU7U,KAAKtO,MAAMmjB,SACrB9L,MAAO/I,KAAKtO,MAAMmwB,aAKzB7hB,KAAKtO,MAAMqQ,SAMZ,gBAAC,GAAD,CACIiT,cAAehV,KAAKtO,MAAMsjB,cAC1B2nB,mBAAoB38B,KAAKtO,MAAMirC,mBAC/B1zB,OAAQjJ,KAAKtO,MAAMkwB,YACnBjjB,KAAMqB,KAAKtO,MAAM+rC,YACjBn+B,KAAMU,KAAKtO,MAAMqQ,SACjB06B,QAASz8B,KAAKq9B,WACdxoB,SAAU7U,KAAKtO,MAAMmjB,SACrB9L,MAAO/I,KAAKtO,MAAMmwB,aAZf,KAef,QACI,MAAM,IAAI/c,MAAJ,iCACwB9E,KAAKtO,MAAM4rC,kBAK1CF,UChIA,MAAMO,GAEjB,sBACIC,EACAC,EACAC,GAIA,MAAO,0CACGF,GADH,WAEGC,GAFH,WAGGC,GAGd,uBACIF,EACAC,EACAE,EACAT,GAOA,MAAO,2CACGM,GADH,WAEGC,EAFH,YAEwBE,GAFxB,WAGGT,EAHH,iBAGwB,IAAI1nC,MAAOooC,WAG9C,mBACI1uC,EACA+D,EACAonB,EACAmd,EACAtnC,GAGA,MAAM2tC,EAA2C,GAEjD,IAAK,MAAM3S,KAAQ7Q,EACnB,CACI,GAAI6Q,EAAI,SAEJ,SAGJ,MAAM4S,EAA4B,IAAIC,SAChClsC,EAA0B,IAAImsC,eAEpCF,EAASG,OAAO,OAAQ/S,GACxBr5B,EAAQqsC,OAAOC,WAAc9vC,IAErBmpC,GAEAA,EAAStM,EAAM78B,IAMvB,MAAME,EAA0CgM,KAAY1I,QAAZ,0BACzB3C,EADyB,YACf+D,EADe,YACDi4B,EAAI,QAC/C,CAAE4S,YACF,QACA,EACAjsC,GACF8C,KAAM8d,IAEJ,MAAM2rB,EAAevwC,KAAKwwC,MACtB5rB,EAASzgB,cACP6M,EAAmBu/B,EAAaE,aAEtC,GAAIz/B,EAAOlP,OAEHO,GAEAA,EAAMg7B,EAAMrsB,GAGhBxM,IAAQC,IAAR,UAAe44B,EAAK/7B,KAApB,0BAA0C0P,QAG9C,CAEQ4T,EAAQ,OAAR,SAGR,OAAO2rB,IACRvpC,MAAM,KAEL,MAAMjF,EAAU,6BAQhB,OAPIM,GAEAA,EAAMg7B,EAAM,CAAC39B,IAAIwD,eAAenB,KAGpCyC,IAAQC,IAAR,UAAe44B,EAAK/7B,KAApB,0BAA0CS,IAEnC,CACH2uC,UAAWrT,EAAI,OACfuS,mBAAoB,EACpBE,oBAAqB,EACrBW,aAAc,CAAC/wC,IAAIwD,eAAenB,OAI1CiuC,EAAMvtC,KAAK/B,GAGf,OAAOsvC,GC/ER,MAAMW,WACTt4B,gBAIA,uBACIi1B,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CACI,MAAMtjB,EAAoB1K,EAAK1d,WAE3BooB,EAAkBU,aAAelW,IAAYkC,WACzCsT,EAAkB2lB,gBACnB3lB,EAAkB4lB,qBAErBlvC,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAzBQ+qC,aAyBR,OAQQZ,YAAc,KAEd77B,KAAKy8B,SAELz8B,KAAKy8B,QAAQphB,SAZrB,KAgBQgM,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAf7Cw0B,GAASyB,qBAAqBj2B,EAAMg2B,WAAW,GAC/Ch2B,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eACjD31B,EAAMg2B,UAAUr4B,iBAAiB,QAAS2Q,KAAK67B,aAgB5C/pB,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,QAASiC,KAAK67B,aACvD77B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAMsY,EAAoBzmB,IAAIgT,oBAC1BxE,KAAKtO,MAAOsO,KAAKtO,MAAM6b,MAE3B,IAAK0K,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,IAAKwT,EAAkB2lB,iBACf3lB,EAAkB4lB,kBAEtB,OAAO,KAGX,MAAMZ,EAAiBU,GAAgBkB,gBACnC5mB,EAAkB2lB,eAClB3lB,EAAkB4lB,kBAClB5lB,EAAkB8lB,mBAClB/9B,KAAKtO,MAAM4rC,eAETG,EAAsBE,GAAgBmB,eACxC7mB,EAAkB2lB,eAClB3lB,EAAkB4lB,kBAClB5lB,EAAkB8mB,UAEtB,OACI,uBAAKl8B,UAAW7C,KAAKtO,MAAMgW,QAAQgB,MAC/B,gBAAC,GAAD,CACIsM,cAAeiD,EAAkBjD,cACjC2nB,oBAAoB,EACpBc,YAAaA,EACbC,SAAUzlB,EAAkB+mB,kBAC5Bj9B,SAAUkW,EAAkBlW,SAC5B6f,YAAa5hB,KAAKtO,MAAMkwB,YACxBC,WAAY7hB,KAAKtO,MAAMmwB,WACvBob,OAAQA,EACRO,QAAQ,EACRf,QAAS7kB,GAAK5X,KAAKy8B,QAAU7kB,EAC7B/C,UAAW,EACXyoB,cAAet9B,KAAKtO,MAAM4rC,kBAM/B30B,mBAxHCC,GAAiBC,YAC7B,CACIH,KACA,CACIgZ,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRizB,eAAgB,SAChBh5B,YAAa,EACb6F,MAAO,UA+GJJ,CAAmBi2B,IChI3B,MAAMK,WACT34B,gBAKA,0BAAiC8f,GAE7B,MAAMnO,EACFzmB,IAAIgT,oBACA,CAAEjV,KAAM62B,EAAOgW,OAAOC,OACtBjW,EAAO7Y,MAEf,OAAO0K,EAAoBA,EAAiB,KAAW,GAG3D,uBACIsjB,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CACI,MAAMtjB,EAAoB1K,EAAK1d,WAE3BooB,EAAkBU,aAAelW,IAAYkC,UAC1CsT,EAAkBinB,aAErBvwC,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAnCQ+qC,aAmCR,OAlCUhoB,cAkCV,OAuBQonB,YAAc,KAEd77B,KAAKy8B,SAELz8B,KAAKy8B,QAAQphB,SA3BrB,KA+BQgM,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QA9B7CsO,KAAKyU,SACL,CACIE,UAAWiD,GAAK5X,KAAKy8B,QAAU7kB,EAC/B8kB,aAAa,EACb36B,SAAUrQ,EAAMqQ,SAChB8S,UAAW,EACXC,OAAQ,SAGZoR,GAASyB,qBAAqBj2B,EAAMg2B,WAAW,GAC/Ch2B,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eACjD31B,EAAMg2B,UAAUr4B,iBAAiB,QAAS2Q,KAAK67B,aAG3CsD,SAASlnB,GAEb,MAAO,mBAAYA,EAAkBmnB,UAA9B,WACGnnB,EAAkBonB,gBAgBzBvtB,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,QAASiC,KAAK67B,aACvD77B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,EAAQA,EAAOkE,MAC3C,IAAIrU,EAAwB,4BACxBvK,EAA0B,KAmB9B,OAjBIspB,EAAkBinB,aAElBhmC,EACI,uBACIyJ,MACI,CACIM,SAAU,GACV+B,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,SAGdkP,EAAkBinB,aAIvBjnB,EAAkBU,aAEtB,KAAKlW,IAAYmC,WACb5E,KAAKyU,SAAS9V,KAAOqB,KAAKm/B,SAASlnB,GACnCjY,KAAKyU,SAASljB,SAAW2H,EAEzBvK,EAAS,gBAAC0mB,EAAA,EAAiBrV,KAAKyU,UAChC,MACJ,KAAKhS,IAAYkC,SACbhW,EAASuK,EAsBjB,OAhBIvK,IAEAA,EACI,uBACIgU,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,WAGf/uB,IAINA,GAIAswC,I,GAAAA,M,qECyGR,IAAMK,GADZ9qB,YACD,GADA,MACa8qB,UACTh5B,YAOA,mBACInI,EACAohC,GAEA,OAAIphC,GAA0B,kBAAVA,EAETiP,GAAOjP,GAAOzI,OAAO4pC,EAASE,cAAcD,IAGhDphC,EAGX,qBAA4BohC,GAExB,IAAI7pC,EAAS,GAiBb,OAbIA,EAFA6pC,EAES5xC,IAAIqI,SAAS0L,WAIb,aAKbhM,EAASA,EAAOY,QAAQ,MAAO,KAC/BZ,EAASA,EAAOY,QAAQ,MAAO,KAC/BZ,EAASA,EAAOY,QAAQ,MAAO,KAExBZ,EAKX,iBAAwBukB,EAAevkB,GAEnC,IAII+pC,EAAG/T,EAA+BgU,EAClCjnC,EAAGknC,EAAK/mC,EALRgnC,EAAW3lB,EACX4lB,EAAUnqC,EAGJgmC,EAAI,EAAGx8B,EAAI,EAAG4gC,EAAI,EAAGjoB,EAAI,EAE/BkoB,GAAW,EACXC,EAAY,GAGhB,IAAIC,EACJ,IAFAP,EAAIE,EAAS7vC,OAEN8nB,EAAI6nB,GAEPO,EAAML,EAASzoC,OAAO0gB,EAAG,GALZ,UAMAhf,QAAQonC,IAAQ,EAErBF,IAEAC,GAAa,IACbD,GAAW,IAKfA,GAAW,EACXC,GAAaC,GAEjBpoB,IAEJ,KAAkD,MAA3CmoB,EAAU7oC,OAAO6oC,EAAUjwC,OAAS,IAEvCiwC,EAAYA,EAAU7oC,OAAO,EAAG6oC,EAAUjwC,OAAS,GAEvD6vC,EAAWI,EAEX,MAAM5pC,EAASzI,IAAIqI,SAASI,OAAOkH,IAAI4iC,GAASA,EAAMC,eAChD9pC,EAAqB1I,IAAIqI,SAASK,mBAAmBiH,IACvD8iC,GAAKA,EAAED,eAGX,IADAvnC,EAAQgnC,EAAStoC,MAAM,KAClBugB,EAAI,EAAGA,EAAIjf,EAAM7I,OAAQ8nB,IAE1B,GAAU,IAAN3Y,EACJ,CACI,MAAMmhC,EAASznC,EAAMif,GAAGsoB,cACxB,IAAIG,EAAMjqC,EAAmBkpB,UAAU6gB,GAAKA,IAAMC,GAC9CC,EAAM,IAENA,EAAMlqC,EAAOmpB,UAAU2gB,GAASA,EAAMpsC,WAAWusC,KAEjDC,GAAO,IAEPphC,EAAIohC,EAAM,GAOtB,IAFAzoB,EAAI,EACJ8nB,EAAM,GACDlnC,EAAI,EAAGA,EAAIG,EAAM7I,OAAQ0I,IAC9B,CACI,MAAM8nC,EAAO/iC,SAAS5E,EAAMH,GAAI,GAC3B8E,MAAMijC,OAAOD,MAED,IAATA,EAGAT,EAAI,IAECS,EAAO,GAEZT,EAAIS,GAIJZ,EAAI9nB,GAAK0oB,EACT1oB,MASZ,GALAgoB,EAAUA,EAAQM,cAElB1nC,EAAI,EACJizB,EAAI,EACJ+T,EAAI,GACe,IAAfE,EAAI5vC,QAAgBmP,EAAI,GAAK4gC,EAAI,EAEjCpE,EAAIiE,EAAIlnC,QAIR,KAAOizB,EAAImU,EAAQ9vC,SAEf0vC,EAAII,EAAQY,OAAO/U,KACfjzB,GAAKknC,EAAI5vC,UAIH,MAAN0vC,GAAmB,IAANK,GAEbA,EAAIH,EAAIlnC,GAAIA,KAED,MAANgnC,GAAmB,IAANvgC,GAElBA,EAAIygC,EAAIlnC,GAAIA,KAED,MAANgnC,GAAmB,IAAN/D,IAElBA,EAAIiE,EAAIlnC,GAAIA,KAEhBizB,IAIR,MAAMrtB,EAAQ,IAAIzI,KAClB,GAAU,IAANkqC,EAEAA,EAAIzhC,EAAM9H,mBAET,GAAIupC,EAAI,IAETA,EAAI,IAAY,EAAJA,OAEX,GAAIA,EAAI,KAET,OAAO,KAED,IAAN5gC,IAEAA,EAAIb,EAAM3H,WAAa,GAG3B,IAAIgqC,EAAqB,IAAI9qC,KAAKkqC,EAAG5gC,EAAI,EAAGw8B,GAQ5C,OAPIgF,EAAMnqC,gBAAkBupC,GAAKY,EAAMhqC,aAAewI,EAAI,GACnDwhC,EAAM/pC,YAAc+kC,IAEvBgF,EAAQ,MAILA,EAGJn6B,YAAY7U,GAEf8U,MAAM9U,GADV,KA3LQivC,sBA2LR,OA1LQC,cAA6B,KA0LrC,KAzLiBC,WAAa,UAyL9B,KAxLQpsB,cAwLR,OA+EQqsB,cAAgB,KAEpB9gC,KAAKiH,SAAS,CAAE85B,cAAc,KAjFlC,KAoFQC,yBAA2B,KAE/B,IAAIzN,EAAWvzB,KAAK2gC,iBAAkBvlB,cAClC,4BACCmY,IAEDA,EAAWvzB,KAAK2gC,iBAAkBvlB,cAC9B,iCAEJmY,GAEAA,EAASlY,SA/FjB,KA0QQ4lB,cAAiBxyC,IAGrB,MAAMV,EAAgBU,EAAMqmB,OAE5B,OAAQrmB,EAAMT,KAEV,IAAK,YACGD,EAAcmzC,cAEdnzC,EAAcmzC,YAAY7lB,QAC1B5sB,EAAMQ,kBAEV,MACJ,IAAK,UACGlB,EAAcozC,kBAEdpzC,EAAcozC,gBAAgB9lB,QAC9B5sB,EAAMQ,oBA5RtB,KAmSQmyC,aAAe,KAEnB,IAAIC,EAAcrhC,KAAKshC,uBAAsB,GACxCD,EAI2B,kBAAhBA,IAEZA,EAAcrhC,KAAK4gC,cAAgB5gC,KAAK4gC,cAAgB,IAAIhrC,MAJ5DyrC,EAAc,IAAIzrC,KAOtBoK,KAAKiH,SAAS,CACVs6B,qBAAsBF,EACtBG,qBAAsBH,EACtBN,cAAc,EACdU,eAAe,KAnTvB,KAoVQC,kBAAoB,KAExB1hC,KAAKiH,SAAS,CAAEw6B,eAAe,IAC/B3uC,WAAW,KAEP,MAAMypB,EAAYvc,KAAK2gC,iBAAkB1M,cACnC95B,EAAOoiB,EAAUnB,cACnB,gCACEd,EAAMngB,EAAKwnC,UAAYxnC,EAAKynC,aAAe,EAC3CrlB,EAAUqlB,aAAe,EAE/BrlB,EAAUslB,UAAYvnB,EACtBngB,EAAKkhB,WA7VTrb,KAAK+G,MACL,CACIw6B,qBAAsB,IAAI3rC,KAC1B4rC,qBAAsB,IAAI5rC,KAC1BmrC,cAAc,EACd7W,WAAW,EACXuX,eAAe,GAGnBzhC,KAAKyU,SAAW,GAEhBzU,KAAKyU,SAASvK,WAAY,EAC1BlK,KAAKyU,SAAS6Q,GAAd,qBAAiC33B,IAAIiV,QACrC5C,KAAKyU,SAASlL,MAAQ7X,EAAM6X,MAC5BvJ,KAAKyU,SAASllB,KAAOmC,EAAMnC,KAC3ByQ,KAAKyU,SAASuC,UAAYtlB,EAAK,UAC/BsO,KAAKyU,SAASqtB,WAAapwC,EAAK,YAAkB,GAClDsO,KAAKyU,SAASqtB,WAAYC,YAAcp0C,IAAIqI,SAAS0L,WAGrD1B,KAAKyU,SAASkO,oBACd,CACI/wB,UAAW,MACX+Q,MACA,CACIO,WAAY,GACZuG,YAAa,KAIrBzJ,KAAKyU,SAASmV,OAAS,KAEnB5pB,KAAKiH,SAAS,CAAEijB,WAAW,IAC3BlqB,KAAKgiC,gCAA+B,IAExChiC,KAAKyU,SAAS+F,SAAYU,IAEtBvtB,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtDyQ,KAAKiH,SAAS,CAAEg7B,SAAU/mB,EAAEpG,OAAO3W,SAEvC6B,KAAKyU,SAASwG,QAAU,KAEpB,MAAMinB,EAAeliC,KAAKshC,uBAAsB,GAChDthC,KAAKiH,SAAS,CACVijB,WAAW,EACX+X,SAAU3C,EAAS6C,YAAYD,GAAc,KAErB,kBAAjBA,IAEPliC,KAAK4gC,cAAgBsB,IAG7BliC,KAAKyU,SAASqW,UAAa5P,IAET,UAAVA,EAAEltB,MAEFgS,KAAKgiC,gCAA+B,GACpChiC,KAAKiH,SAAS,CACVg7B,SAAU3C,EAAS6C,YACfniC,KAAKshC,uBAAsB,IAAQ,OAK/Cl0B,cAAoBpN,KAAK6gC,YAEzBzzB,gBAAoBpN,KAAK6gC,WAAY,CACjCzqC,OAAQzI,IAAIqI,SAASI,OACrBgsC,YAAaz0C,IAAIqI,SAASK,mBAC1BgsC,SAAU10C,IAAIqI,SAASC,KACvBqsC,YAAa30C,IAAIqI,SAASE,iBAC1BqsC,cAAe50C,IAAIqI,SAASE,mBAyBhC8rC,+BAA+BQ,GAEnC,MAAMj+B,EAAmB/S,IAAIgT,oBAAoBxE,KAAKtO,OAEtD,IAAK6S,EAED,OAGJ,MAAMzU,EAAiByU,EAAgB,eACjCk+B,EAAa3yC,EAAe+I,QAAQmH,KAAKtO,MAAMgxC,iBAE/C/sC,EAAOqK,KAAKshC,sBAAsBkB,GACpB,kBAAT7sC,GAEPqK,KAAK8jB,SAAS9jB,KAAK+G,MAAMk7B,UAErBQ,EAAa,GAEb3yC,EAAeY,KAAKsP,KAAKtO,MAAMgxC,mBAKnC1iC,KAAK2iC,kBAAkBhtC,GAEnB8sC,GAAc,GAEd3yC,EAAeyD,OAAOkvC,EAAY,IAKtCG,qBAEJ,OACI,gBAAC,KAAD,CACI//B,UAAW7C,KAAKtO,MAAMgW,QAAQm7B,SAC9BC,aAAc9iC,KAAK+G,MAAMy6B,qBACzBuB,OAAQ/iC,KAAK6gC,WACbmC,YAAaC,eACbC,aAAcljC,KAAK+G,MAAMw6B,qBACzB4B,iBAAe,EACfC,WAAaztC,IAETqK,KAAK2iC,kBAAkBhtC,GACvBqK,KAAKgiC,gCAA+B,GACpChiC,KAAK8gC,iBAETuC,eAAiB3xC,IAEb,MAAMgW,EAAU1H,KAAKtO,MAAMgW,QAE3B,OACI,uBAAK7E,UAAWnR,EAAM2Z,WAAWi4B,SAC7B,gBAACl6B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eAAe,cAAe,YACtC0R,UAAW6E,EAAQ87B,cACnB3xC,QAAQ,OACR+iB,QAAS5U,KAAK0hC,kBACdze,iBAAkB,CACdpgB,UAAW6E,EAAQ+7B,sBAGtB/xC,EAAMsxC,YAAYU,iBACfhyC,EAAMiE,KAAMjE,EAAMqxC,WAItCY,cAAgBjyC,GAGR,uBAAKmR,UAAWnR,EAAMmR,WAClB,wBAAMA,UAAWnR,EAAM2Z,WAAWu4B,eAC9B,gBAACx6B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eACA,iBAAkB,YAC1BmO,KAAK,sBACLsK,KAAK,QACLgL,QAAS,IAAMljB,EAAMmyC,qBAG7B,wBAAMhhC,UAAWnR,EAAM2Z,WAAWy4B,eAC9B,gBAAC16B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eACA,aAAc,YACtBmO,KAAK,uBACLsK,KAAK,QACLgL,QAAS,IAAMljB,EAAMqyC,kBAMzCC,UAAW,CAACC,EAAKC,IAGT,gBAAC96B,EAAA,EAAD,CAAQvX,QAAQ,OAAOgjB,UAAW,GAC7BovB,EAAIttC,WAGjBwtC,eAAiBzyC,GAGT,gBAAC,KAAD,CACIgW,QAAS,CAAEgB,KAAMhX,EAAMmR,WACvBjR,UAAU,QAETF,EAAMsxC,YAAYoB,mBACf1yC,EAAM2yC,QAAS3yC,EAAMqxC,WAQzCzB,sBAAsBkB,GAE1B,MAAMrkC,EAAQqkC,EACRxiC,KAAK+G,MAAMk7B,SACX5wC,GAAakyB,SAASvjB,KAAKtO,OAEjC,IAAI4yC,EAA+B,KACnC,GAAInmC,EACJ,CACI,MAAMzI,EAAS4pC,EAASE,cAAcgD,GAChC7sC,EAAOyX,GAAOjP,EAAOzI,EAAQ8sC,EAAMxiC,KAAK6gC,WAAa,MAAM,GAC7DlrC,EAAKsjB,UAELqrB,EAAS3uC,EAAK0X,SAIVm1B,GAEA8B,EAAShF,EAASiF,UAAUpmC,EAAOzI,GAC9B4uC,IAEDA,EAASnmC,IAKbmmC,EAASnmC,EAKrB,OAAOmmC,EAGHE,aAAaC,GAEjB,MAAM,kCAAN,OACMA,IAASzkC,KAAK+G,MAAMy6B,qBAAsBjrC,cAC5C,+BAAiC,IAGjCmuC,gBAAgBD,GAEpB,OAAOA,IAASzkC,KAAK+G,MAAMy6B,qBAAsBjrC,cAAgB,GAAK,EAgDlEouC,WAAWF,EAAch2C,GAEP,IAAlBA,EAAMm2C,SAEN9xC,WAAWkN,KAAKghC,0BAGpBhhC,KAAKiH,SAAU49B,IAEX,MAAMC,EAAeD,EAAUrD,qBAAsB9qC,WAErD,MAAO,CACH8qC,qBAAsB,IAAI5rC,KAAK6uC,EAAMK,EAAc,GACnDrD,eAAe,KAKnBkB,kBAAkBxkC,GAEtB6B,KAAK8jB,SAASwb,EAAS6C,YAAYhkC,GAAO,IAGtC2lB,SAAS3lB,GAEbxQ,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,GAmB/BwB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACH/S,IAAIgT,oBAAoB6E,GAC3B,IAAI1a,EAA0B,KAE9B,IAAK4V,EAED,OAAO,KAGX,IAAK/S,IAAI+jB,eAAelM,EAAQ9E,GAE5B,OAAO5V,EASX,GANAqR,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASqtB,WAAYiD,kBAAezhC,EACzCtD,KAAKyU,SAASuwB,UAAW,EACzBhlC,KAAKyU,SAAS9R,WAAQW,EACtBtD,KAAKyU,SAAS5iB,QAAU,SAEpBwX,EAAM,SAENrJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASmO,WAAa,KAC3B5iB,KAAKyU,SAAStW,MAAQ,GAIlBxP,EAFA4V,EAAiB0gC,iBAGb,gBAACzvB,EAAA,EAAD,CAAkBxlB,QAASqZ,EAAOoM,kBAC9B,gBAAC,KAAyBzV,KAAKyU,WAK9B,gBAAC,KAAyBzU,KAAKyU,eAG3C,GAAIpL,EAAM,SACf,CACI,MAAMlL,EACFmhC,EAAS6C,YAAYniC,KAAKshC,uBAAsB,IAAQ,GAE5D3yC,EACI,2BACI,gBAAC,KAAD,CACIiD,UAAU,MACVkZ,UAAQ,EACRnI,MAAO,CAAEU,aAAc,GACvBxR,QAAQ,WAEPwX,EAAOE,OAEZ,gBAAC,KAAD,CAAY3X,UAAU,OACjBuM,GAAgB,UAKjC,CAuBI,IAAI+mC,EAtBJllC,KAAKyU,SAASqtB,WAAYiD,aAEtB,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAEI,WAAY,IAErB,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,eAC/BmO,KAAK,sBACLsK,KAAK,QACLgL,QAAS5U,KAAKohC,gBAK1BphC,KAAKyU,SAASuwB,SAAWzgC,EAAiB4gC,gBAE1C3zC,IAAIoyB,cACA5jB,KACAuE,EAAgB,eAChBvE,KAAKyU,UAKLywB,EAFAllC,KAAK+G,MAAMmjB,UAEClqB,KAAK+G,MAAMk7B,SAIX3C,EAAS6C,YACjBniC,KAAKshC,uBAAsB,IAAQ,GAE3CthC,KAAKyU,SAAStW,MAAsB,OAAd+mC,EAAqB,GAAKA,EAEhD,MAAME,EAAkB,GAClBC,EAAcrlC,KAAK+G,MAAMy6B,qBAAsBjrC,cACrD,IAAK,IAAIshB,EAAIwtB,EAAc,GAAIxtB,GAAKwtB,EAAc,GAAIxtB,GAAK,EAEvDutB,EAAM10C,KAAKmnB,GAGflpB,EACI,gBAAC,WAAD,KACI,gBAAC,KAAD,iBACQqR,KAAKyU,SADb,CAEI6wB,gBACI,CACI59B,QACA,CACIgB,KAAM1I,KAAKtO,MAAMgW,QAAQ69B,eACzBC,OAAQxlC,KAAKtO,MAAMgW,QAAQ+9B,sBAM3C,gBAAC1vB,EAAA,EAAD,CACIE,QAASjW,KAAK8gC,cACd3qB,KAAMnW,KAAK+G,MAAMg6B,aACjB2E,UAAW1lC,KAAKghC,0BAEhB,gBAAC,KAAD,CACIn+B,UAAW7C,KAAKtO,MAAMgW,QAAQi+B,iBAE9B,uBACI/M,IAAKhhB,GAAK5X,KAAK2gC,iBAAmB/oB,EAClCjV,MAAO,CAAE+a,OAAQ,WAEhB1d,KAAK+G,MAAM06B,cACR,uBACI5+B,UAAW7C,KAAKtO,MAAMgW,QAAQk+B,cAE7BR,EAAM9nC,IAAImnC,GACP,gBAACr7B,EAAA,EAAD,CACIvG,UAAW7C,KAAKwkC,aAAaC,GAC7Bz2C,IAAKy2C,EACL7vB,QAASsG,GACLlb,KAAK2kC,WAAWF,EAAMvpB,GAC1B4P,UAAW9qB,KAAKihC,cAChBpsB,SACI7U,KAAK0kC,gBAAgBD,GAEzB5yC,QAAQ,QAEP4yC,KAKbzkC,KAAK4iC,qBAEP5iC,KAAK+G,MAAM06B,cAOT,KANA,gBAACr4B,EAAA,EAAD,CACIvG,UAAU,eACV+R,QAAS5U,KAAK8gC,eAFlB,cAa5B,OAAOnyC,MA1sBf,GA8sBega,mBA36BCC,GAAiBC,YAC7B,CACIg6B,SACA,CACI,CAACj6B,EAAM0V,YAAYunB,KAAK,OACxB,CACIrnB,QAAS,IAGb,oBACA,CACI1V,QAAS,mBAGb,uBACA,CACIA,QAAS,gBACTzF,aAAc,SACdyiC,UAAW,GACXtnB,QAAS,SACTunB,UAAW,UAEf,8BACA,CACI7J,eAAgB,aAChBla,SAAU,IACVgkB,cAAe,QAEnB,mCACA,CACI/iC,SAAU,GACVgjC,WAAY,IACZC,cAAe,YACf5J,WAAY,OACZr3B,WAAY,UAGhB,mBACA,CACI6D,QAAS,aACTg0B,QAAS,OACTiJ,UAAW,UAEf,0BACA,CACII,aAAc,MACdF,WAAY,IACZr7B,SAAU,OACV4T,QAAS,UAEb,mCACA,CACI7sB,MAAOiX,EAAM4B,QAAQ9E,KAAK,MAE9B,oCACA,CACIm3B,WAAW,GAAD,OAAKj0B,EAAM4B,QAAQ9E,KAAK,KAAxB,eACV/T,MAAOiX,EAAM4B,QAAQC,gBAAgB7B,EAAM4B,QAAQ9E,KAAK,OAE5D,0CACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,0CACA,CACIm3B,WAAYj0B,EAAM4B,QAAQ9E,KAAK,MAEnC,gDACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,gCACA,CACIm3B,WAAYj0B,EAAM4B,QAAQ9E,KAAK,MAEnC,sCACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAGlD,qBACA,CACIoD,QAAS,QACTC,MAAO,QAGX,yBACA,CACIsR,SAAU,WACVC,IAAK,OAET,kCACA,CACIrR,OAAQ,GACRuV,QAAS,EACTzV,MAAO,IAEX,+BACA,CACI2xB,MAAO,UAEX,+BACA,CACIvgB,KAAM,UAGV,oBACA,CACIrR,QAAS,aAEb,uBACA,CACInX,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BoD,QAAS,aACT7F,SAAU,GACVq5B,WAAY,UACZ9d,QAAS,SACTunB,UAAW,UAEf,wBACA,CACIj9B,QAAS,sBAEb,2BACA,CACIA,QAAS,aAGb,uBACA,CACIg0B,QAAS,OACTziB,SAAU,YAGdmE,QAAS,IAGbmnB,gBACA,CACI,kBACA,CACI/I,OAAQ,GACR9zB,QAAS,OACTuR,SAAU,WACVqgB,MAAO,GAEP,CAAC9xB,EAAM0V,YAAYunB,KAAK,OACxB,CACI/8B,QAAS,iBAGjB,gBACA,CACIs9B,WAAY,GAGhBn9B,OAAQ,IACRyU,OAAQ,SACRsE,SAAU,OACVxD,QAAS,EACTzV,MAAO,KAGXw8B,eACA,CACIx8B,MAAO,qBAGX08B,iBACA,CACI18B,MAAO,+BAGXy6B,cACA,CACItH,eAAgB,oBAChBtxB,SAAU,IACVy7B,YAAa,EACbC,aAAc,EACdjsB,SAAU,UAGdopB,oBACA,CACI5G,WAAY,cACZnf,OAAQ,SACRooB,UAAW,GACX9jB,SAAU,KAGd4jB,aACA,CACI,uBACA,CACI3iC,SAAU,GACVgjC,WAAY,IACZznB,QAAS,SACTzV,MAAO,QAEX,4BACA,CACImzB,eAAgB,cAEpB,iCACA,CACIW,WAAYj0B,EAAM4B,QAAQ9E,KAAK,KAC/B/T,MAAOiX,EAAM4B,QAAQC,gBAAgB7B,EAAM4B,QAAQ9E,KAAK,OAE5D,uCACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,6BACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ4T,OAAOC,MAAO,KAEnDG,QAAS,WAmtBN7V,CAAmB22B,I,uCCl8B3B,MAAMiH,WACTjgC,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,GAAI,SAAU2X,EACd,CACQA,EAAO/J,OAEP+J,EAAOm9B,eACH,gBAAC,KAAD,CACIlnC,KAAM+J,EAAO/J,KACb+a,SAAS,QACT1X,MACI,CACIhR,MAAO0X,EAAOo9B,UACdxjC,SAAU,GACVgG,OAAQ,GACR/F,WAAY,GACZuG,YAAa,WAKjC,MAAM9G,EACN,CACIsG,OAAQ,GACRlG,UAAW,EACXgjC,UAAW18B,EAAO3G,eAGjB2G,EAAO07B,eAERpiC,EAAM8G,YAAc,IAGpBJ,EAAOq9B,WAEHr9B,EAAOq9B,WAAW/jC,MAElB0G,EAAOq9B,WAAW/jC,MAAlB,eAEOA,EAFP,GAGO0G,EAAOq9B,WAAW/jC,OAKzB0G,EAAOq9B,WAAW/jC,MAAQA,EAK9B0G,EAAOq9B,WAAa,CAAE/jC,gBAGnB0G,EAAO/J,KAQlB,MALI,cAAe+J,UAERA,EAAOo9B,UAGX,gBAAC,KAAqBp9B,IAItBV,I,GAAAA,eAlFCC,GAAiBC,YAC7B,CACIoR,MACA,CACIosB,YAAa,EACbC,aAAc,GAElB59B,KACA,KA0EOC,CAAmB49B,ICkJ3B,IAAMI,GADZnyB,YACD,GADA,cAEIlO,YAQOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAPQ8vC,0BAOR,OANQH,iBAMR,OAHQV,sBAGR,OAUQG,cAAgB,KAEpB9gC,KAAKiH,SAAS,CAAEw6B,eAAe,EAAOmF,cAAc,IACpD5mC,KAAKtO,MAAMm1C,OAAO/F,iBAbtB,KAgBQE,yBAA2B,KAE/B,MAAMzN,EAAWvzB,KAAK2gC,iBAAiBvlB,cACnC,4BAEAmY,EAEAA,EAASlY,QAITrb,KAAK2gC,iBAAiBvlB,cAClB,gCAAgCC,SA5B5C,KAoIQ4lB,cAAiBxyC,IAGrB,MAAMV,EAAgBU,EAAMqmB,OAE5B,OAAQrmB,EAAMT,KAEV,IAAK,YACGD,EAAcmzC,cAEdnzC,EAAcmzC,YAAY7lB,QAC1B5sB,EAAMQ,kBAEV,MACJ,IAAK,UACGlB,EAAcozC,kBAEdpzC,EAAcozC,gBAAgB9lB,QAC9B5sB,EAAMQ,oBAtJtB,KA6JQy2C,UAAY,KAEhB1lC,KAAKghC,4BA/JT,KAsLQU,kBAAoB,KAExB1hC,KAAKiH,SAAS,CAAEw6B,eAAe,IAC/B3uC,WAAW,KAEP,MAAMypB,EAAYvc,KAAK2gC,iBAAiB1M,cAClC95B,EAAOoiB,EAAUnB,cAAc,gCAC/Bd,EAAMngB,EAAKwnC,UAAYxnC,EAAKynC,aAAe,EAC3CrlB,EAAUqlB,aAAe,EAE/BrlB,EAAUslB,UAAYvnB,EACtBngB,EAAKkhB,WA9LTrb,KAAK+G,MACL,CACI06B,eAAe,EACfmF,cAAc,GA0BdhE,qBAEJ,MAAMiE,EAAS7mC,KAAKtO,MAAMm1C,OAE1B,OACI,gBAAC,KAAD,CACIhkC,UAAW7C,KAAKtO,MAAMgW,QAAQm7B,SAC9BC,aAAc9iC,KAAKwhC,qBACnBuB,OAAQ+D,GAAuBjG,WAC/BmC,YAAaC,eACbC,aAAcljC,KAAKqhC,YACnB8B,iBAAe,EACfC,WAAaztC,IAETkxC,EAAOlE,kBAAkBhtC,GACzBqK,KAAK8gC,iBAETuC,eAAiB3xC,IAEb,MAAMgW,EAAU1H,KAAKtO,MAAMgW,QAE3B,OACI,uBAAK7E,UAAWnR,EAAM2Z,WAAWi4B,SAC7B,gBAACl6B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eAAe,cAAe,YACtC0R,UAAW6E,EAAQ87B,cACnB3xC,QAAQ,OACR+iB,QAAS5U,KAAK0hC,kBACdze,iBAAkB,CACdpgB,UAAW6E,EAAQ+7B,sBAGtB/xC,EAAMsxC,YAAYU,iBACfhyC,EAAMiE,KAAMjE,EAAMqxC,WAItCY,cAAgBjyC,GAGR,uBAAKmR,UAAWnR,EAAMmR,WAClB,wBAAMA,UAAWnR,EAAM2Z,WAAWu4B,eAC9B,gBAACx6B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eACA,iBAAkB,YAC1BmO,KAAK,sBACLsK,KAAK,QACLgL,QAAS,IAAMljB,EAAMmyC,qBAG7B,wBAAMhhC,UAAWnR,EAAM2Z,WAAWy4B,eAC9B,gBAAC16B,EAAA,EAAD,CACIm6B,cACI51C,IAAIwD,eACA,aAAc,YACtBmO,KAAK,uBACLsK,KAAK,QACLgL,QAAS,IAAMljB,EAAMqyC,kBAMzCC,UAAW,CAACC,EAAKC,IAGT,gBAAC96B,EAAA,EAAD,CAAQvX,QAAQ,OAAOgjB,UAAW,GAC7BovB,EAAIttC,WAGjBwtC,eAAiBzyC,GAGT,gBAAC,KAAD,CACIgW,QAAS,CAAEgB,KAAMhX,EAAMmR,WACvBjR,UAAU,QAETF,EAAMsxC,YAAYoB,mBACf1yC,EAAM2yC,QAAS3yC,EAAMqxC,WAQzCyB,aAAaC,GAEjB,MAAM,kCAAN,OACMA,IAASzkC,KAAKwhC,qBAAsBjrC,cAClC,+BAAiC,IAGrCmuC,gBAAgBD,GAEpB,OAAOA,IAASzkC,KAAKwhC,qBAAsBjrC,cAAgB,GAAK,EAiC5DouC,WAAWF,EAAch2C,GAE7B,MAAMq2C,EAAe9kC,KAAKwhC,qBAAsB9qC,WAE1B,IAAlBjI,EAAMm2C,SAEN9xC,WAAWkN,KAAKghC,0BAGpBhhC,KAAKwhC,qBAAuB,IAAI5rC,KAAK6uC,EAAMK,EAAc,GACzD9kC,KAAKqhC,YAAcrhC,KAAKwhC,qBAExBxhC,KAAKiH,SACD,CACIw6B,eAAe,EACfmF,aAAc5mC,KAAKqhC,YAAY9qC,gBACvByJ,KAAKtO,MAAM2vC,YAAY9qC,gBAmBpCoJ,SAEH,MAAMknC,EAAS7mC,KAAKtO,MAAMm1C,OACpBzB,EAAkB,GAEnBplC,KAAK+G,MAAM6/B,eAEZ5mC,KAAKqhC,YAAcrhC,KAAKtO,MAAM2vC,aAGlCrhC,KAAKwhC,qBAAuBxhC,KAAKqhC,YACjC,MAAMgE,EAAsBrlC,KAAKqhC,YAAa9qC,cAC9C,IAAK,IAAIshB,EAAIwtB,EAAc,GAAIxtB,GAAKwtB,EAAc,GAAIxtB,GAAK,EAEvDutB,EAAM10C,KAAKmnB,GAGf,OACI,gBAAC9B,EAAA,EAAD,CACIE,QAASjW,KAAK8gC,cACd4E,UAAW1lC,KAAK0lC,UAChBhpB,SAAU,IAAMmqB,EAAOE,eACvB5wB,KAAMnW,KAAKtO,MAAMykB,MAEjB,gBAAC,KAAD,CACItT,UAAW7C,KAAKtO,MAAMgW,QAAQi+B,iBAE9B,uBACI/M,IAAKhhB,GAAK5X,KAAK2gC,iBAAmB/oB,EAClCjV,MAAO,CAAE+a,OAAQ,WAEhB1d,KAAK+G,MAAM06B,cACR,uBACI5+B,UAAW7C,KAAKtO,MAAMgW,QAAQk+B,cAE7BR,EAAM9nC,IAAImnC,GACP,gBAACr7B,EAAA,EAAD,CACIvG,UAAW7C,KAAKwkC,aAAaC,GAC7Bz2C,IAAKy2C,EACL7vB,QAASsG,GACLlb,KAAK2kC,WAAWF,EAAMvpB,GAC1B4P,UAAW9qB,KAAKihC,cAChBpsB,SACI7U,KAAK0kC,gBAAgBD,GAEzB5yC,QAAQ,QAEP4yC,KAKbzkC,KAAK4iC,qBAEP5iC,KAAK+G,MAAM06B,cAOT,KANA,gBAACr4B,EAAA,EAAD,CACIvG,UAAU,eACV+R,QAAS5U,KAAK8gC,eAFlB,iBAtQ5B,GAmRen4B,I,SAAAA,eAveCC,GAAiBC,YAC7B,CACIg6B,SACA,CACI,CAACj6B,EAAM0V,YAAYunB,KAAK,OACxB,CACIrnB,QAAS,IAGb,oBACA,CACI1V,QAAS,mBAGb,uBACA,CACIA,QAAS,gBACTzF,aAAc,SACdyiC,UAAW,GACXtnB,QAAS,SACTunB,UAAW,UAEf,8BACA,CACI7J,eAAgB,aAChBla,SAAU,IACVgkB,cAAe,QAEnB,mCACA,CACI/iC,SAAU,GACVgjC,WAAY,IACZC,cAAe,YACf5J,WAAY,OACZr3B,WAAY,UAGhB,mBACA,CACI6D,QAAS,aACTg0B,QAAS,OACTiJ,UAAW,UAEf,0BACA,CACII,aAAc,MACdF,WAAY,IACZr7B,SAAU,OACV4T,QAAS,UAEb,mCACA,CACI7sB,MAAOiX,EAAM4B,QAAQ9E,KAAK,MAE9B,oCACA,CACIm3B,WAAW,GAAD,OAAKj0B,EAAM4B,QAAQ9E,KAAK,KAAxB,eACV/T,MAAOiX,EAAM4B,QAAQC,gBAAgB7B,EAAM4B,QAAQ9E,KAAK,OAE5D,0CACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,0CACA,CACIm3B,WAAYj0B,EAAM4B,QAAQ9E,KAAK,MAEnC,gDACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,gCACA,CACIm3B,WAAYj0B,EAAM4B,QAAQ9E,KAAK,MAEnC,sCACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAGlD,qBACA,CACIoD,QAAS,QACTC,MAAO,QAGX,yBACA,CACIsR,SAAU,WACVC,IAAK,OAET,kCACA,CACIrR,OAAQ,GACRuV,QAAS,EACTzV,MAAO,IAEX,+BACA,CACI2xB,MAAO,UAEX,+BACA,CACIvgB,KAAM,UAGV,oBACA,CACIrR,QAAS,aAEb,uBACA,CACInX,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BoD,QAAS,aACT7F,SAAU,GACVq5B,WAAY,UACZ9d,QAAS,SACTunB,UAAW,UAEf,wBACA,CACIj9B,QAAS,sBAEb,2BACA,CACIA,QAAS,aAGb,uBACA,CACIg0B,QAAS,OACTziB,SAAU,YAGdmE,QAAS,IAGbmnB,gBACA,CACI,kBACA,CACI/I,OAAQ,GACR9zB,QAAS,OACTuR,SAAU,WACVqgB,MAAO,GAEP,CAAC9xB,EAAM0V,YAAYunB,KAAK,OACxB,CACI/8B,QAAS,iBAGjB,gBACA,CACIs9B,WAAY,GAGhBn9B,OAAQ,IACRyU,OAAQ,SACRsE,SAAU,OACVxD,QAAS,EACTzV,MAAO,KAGXy6B,cACA,CACItH,eAAgB,oBAChBtxB,SAAU,IACVy7B,YAAa,EACbC,aAAc,EACdjsB,SAAU,UAGdopB,oBACA,CACI5G,WAAY,cACZnf,OAAQ,SACRooB,UAAW,GACX9jB,SAAU,KAGd4jB,aACA,CACI,uBACA,CACI3iC,SAAU,GACVgjC,WAAY,IACZznB,QAAS,SACTzV,MAAO,QAEX,4BACA,CACImzB,eAAgB,cAEpB,iCACA,CACIW,WAAYj0B,EAAM4B,QAAQ9E,KAAK,KAC/B/T,MAAOiX,EAAM4B,QAAQC,gBAAgB7B,EAAM4B,QAAQ9E,KAAK,OAE5D,uCACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ9E,KAAK,KAAQ,KAElD,6BACA,CACIm3B,WAAYvyB,kBAAO1B,EAAM4B,QAAQ4T,OAAOC,MAAO,KAGnDG,QAAS,WAwRN7V,CAAmBg+B,IC9d3B,IAAMK,GADZxyB,aACD,MADA,MACawyB,UACT1gC,YAOA,iBACI5U,EACA6b,EAEApP,GAEA,MAAMoG,EACF/S,IAAIgT,oBAAoB9S,EAAO6b,GACnC,IAAI5e,EAEJ,IAAK4V,EAED,MAAO,GAoBX,OAfI5V,EAFA4e,EAAK5Y,WAAWjD,EAAMnC,MAEb,GAIA,IAAIgV,EAAiBzU,gBAMP,kBAFvBk3C,EAAmB1F,uBAAsB,EAAMnjC,IAI/CxP,EAAO+B,KAAKgB,EAAMgxC,iBAGf/zC,EAGX,6BACI4wC,EAEAphC,GAGA,IAAImmC,EAAsB,KAE1B,GAAInmC,EACJ,CACI,MAAMzI,EAAS4pC,GAASE,cAAcD,GAChC5pC,EAAOyX,GACTjP,EACAzI,EACA6pC,EAAgByH,EAAmBnG,WAAa,MAChD,GAEAlrC,EAAKsjB,UAELqrB,EAAS3uC,EAAK0X,SAIVkyB,GAEA+E,EAAShF,GAASiF,UAAUpmC,EAAOzI,GAC9B4uC,IAEDA,EAASnmC,IAKbmmC,EAASnmC,EAKrB,OAAOmmC,EAGX,0BAAiCle,GAE7B,IAAKA,EAAOjoB,MAER,MAAO,GAGX,MAAMmmC,EACF0C,EAAmB1F,uBAAsB,EAAOlb,EAAOjoB,OACrD+mC,EAAY5F,GAAS6C,YAAYmC,GAAQ,GAE/C,OAAOY,GAAwB,GAG5B3+B,YAAY7U,GAEf8U,MAAM9U,GADV,KA/FQu1C,kBA+FR,OA9FQrG,cAA6B,KA8FrC,KA7FUnsB,cA6FV,OA+CQ2sB,aAAe,KAEnBphC,KAAKiH,SAAS,CAAE85B,cAAc,KAjDlC,KA2DOD,cAAgB,KAEnB9gC,KAAKiH,SAAS,CAAE85B,cAAc,KA1D9B,MAAMM,EACF2F,EAAmB1F,uBAAsB,EAAO5vC,EAAMyM,OAC1D,IAAI+oC,EAAiB5H,GAAS6C,YAAYd,GAAa,GAGhC,IAAnB3vC,EAAMy1C,UAAkBD,EAExBA,EAAiBA,EAAe/vC,OAAO,EAAG+vC,EAAen3C,OAAS,GAE7D2B,EAAM01C,YAEPF,EAEAA,GAAkBx1C,EAAM01C,UAIxBF,EAAiBx1C,EAAM01C,WAI/BpnC,KAAK+G,MACL,CACIg6B,cAAc,EACd5iC,MAAO+oC,GAGgB,kBAAhB7F,IAEPrhC,KAAK4gC,cAAgBS,GAGzBrhC,KAAKyU,SACL,CACIuC,WAAW,EACX9M,WAAW,EACX5K,KAAM,gBACNmnC,UAAW/gC,KAAK,KAChB2hC,SAAW7P,IAAcx3B,KAAKinC,aAAezP,GAC7Chd,SAAUU,GAAKlb,KAAK8jB,SAAS5I,EAAEpG,OAAO3W,OACtCwE,MAAO,CAAEsG,OAAQ,mBAAoBo9B,YAAa,IASlDviB,SAAS3lB,GAEbxQ,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,UAQbkJ,oBAEH6e,GAASohB,sBACLtnC,KAAKtO,MAAMg2B,UAAW1nB,KAAKinC,cAE/B/gB,GAASqhB,gBAAgBvnC,KAAKinC,cAG3Bn1B,uBAEHoU,GAASshB,qBAAqBxnC,KAAKtO,MAAMg2B,WAGtCnE,WAEH,OAAO+b,GAAS6C,YACZ6E,EAAmB1F,uBAAsB,EAAMthC,KAAK+G,MAAM5I,QAC1D,GAGDwB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACzB,IAAI2vC,EACApiC,EAAmB,GAEvB,MAAMuT,EAAcxS,KAAKtO,MAAM6gB,WAAWC,YA2C1C,OA1CIxS,KAAK+G,MAAMg6B,aAEXvuB,EAAY4Z,kCAAiC,GAI7C5Z,EAAY4Z,kCAAiC,GAGjDpsB,KAAKyU,SAAStW,MAAQ6B,KAAK+G,MAAM5I,OAAS,GAE1CkjC,EACI2F,EAAmB1F,uBAAsB,EAAMthC,KAAKyU,SAAStW,OAE5DkjC,EAI2B,kBAAhBA,IAEZA,EAAcrhC,KAAK4gC,cAAgB5gC,KAAK4gC,cAAgB,IAAIhrC,MAJ5DyrC,EAAc,IAAIzrC,KAOtBqJ,EAAS+nC,EAAmBS,UACxBp+B,EAAQA,EAAO0S,KAAKxO,KAAMvN,KAAKyU,SAAStW,OAE5C6B,KAAKyU,SAASnkB,MAAQ2O,EAAOlP,OAAS,EACtCiQ,KAAKyU,SAASswB,aAEN,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAE8G,YAAa,GAAI1G,WAAY,IAEtC,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,eAC/BmO,KAAK,sBACLsK,KAAK,QACLgL,QAAS5U,KAAKohC,gBAM1B,gBAAC,GAAD,CACI/G,QAAShxB,EAAO0S,KAAKxO,KAAKU,OACnB5E,EAAOkJ,WAAWC,YAAYykB,eACrCjnC,QAASwB,IAAIC,iBAAiBwN,IAE9B,gBAAC,GAAUe,KAAKyU,UAChB,gBAAC,GAAD,CACI4sB,YAAaA,EACbwF,OAAQ7mC,KACRmW,KAAMnW,KAAK+G,MAAMg6B,gBAK1BgG,eAEC/mC,KAAKinC,cAELjnC,KAAKinC,aAAa5rB,QAInBsnB,kBAAkBxkC,GAErB6B,KAAK8jB,SAASwb,GAAS6C,YAAYhkC,GAAO,MAjQlD,GAG2B0iC,WAAa,UAHxC,YAqQemG,I,GAAAA,M,UClOR,IAAMU,GADZlzB,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHiBi2C,eAGjB,OAMQntB,SAAY/rB,IAEXuR,KAAKtO,MAAMk2C,eAKhB5nC,KAAKtO,MAAMk2C,cAAcn5C,EAAMqmB,OAAO3W,QAVtC6B,KAAK2nC,UAAL,qBAA+Bh6C,IAAIiV,QAahCjD,SAEH,MAAM,EAaFK,KAAKtO,OAbH,QACFgW,EADE,UAEF7E,EAFE,UAGF4kC,EAHE,WAIF7kB,EAJE,KAKFtjB,EALE,GAMFgmB,EANE,WAOFohB,EAPE,WAQF5E,EARE,cASF8F,EATE,SAUFjjC,EACAkjC,cAAeC,GAXnB,EAYO98B,EAZP,iJAeA,GAAIrG,EACJ,CACI,MAAM,MACF4E,EADE,UAEFw+B,EAFE,MAGF5pC,GACA6M,EAEJ,IAAIg9B,EAAmB,GACnBD,IAEAC,EAAmBtgC,EAAQugC,0BAG/B,MAAMJ,EAAa,aAEXngC,QACA,CACI6a,QAAS,GACT7Z,KAAM,IAEVw/B,gBAAY5kC,GACTwkC,GAGLK,EACF,CACIN,EAAcngC,QAAQgB,MAAQ,GAC9BhB,EAAQ0gC,cAGhB,OACI,gBAAC,GAAD,CAAavlC,UAAWslC,EAAmB1qC,KAAK,KAAMyM,WAAS,GAC3D,gBAAC,KAAD,CACIrH,UAAW6E,EAAQ2gC,cACnBv9B,UAAQ,EACRjZ,QAAQ,WAEP0X,GAEL,uBACI1G,UAAWglC,EAAcngC,QAAQ6a,QACjCqW,IAAKiP,EAAcK,YAEnB,gBAAC,KAAD,CAAYrlC,UAAWmlC,GAClB7pC,KAOrB,MAAMkN,EACF,CACIxI,GAAwB,GACxB6E,EAAQgB,MAGhB,IAAIq8B,EAAgC,UACvBzhC,IAAThE,IAIAylC,EACI,gBAAC,KAAD,CACI1qB,SAAS,MACT9oB,SACI,gBAAC8U,EAAA,EAAD,CACIqB,QAAS,CAAEgB,KAAMhB,EAAQ4gC,WACzBhpC,KAAMA,MAMtB+L,EAAW3a,KAAKgX,EAAQ6gC,oBAG5B,IAAIC,EAAgB5lB,EAChB6lB,GAAY,EAEhB,GAAIhB,EACJ,CACI,MAAMxoC,EAASwoC,EAAUz8B,EAAW7M,OACpC,GAAIc,EAAOlP,OAAS,EACpB,CACI04C,GAAY,EAEZ,MAAMC,EAAgBl3C,IAAIC,iBAAiBwN,GAGvCupC,EAFA5lB,EAGI,2BACI,gBAAC,KAAD,CAAY/wB,QAAQ,WACf+wB,GAEJ8lB,GAMOA,GAK5B,OACI,gBAAC,KAAD,eACI7lC,UAAWwI,EAAW5N,KAAK,KAC3BnN,MAAOm4C,EACP9lB,oBACI,CAGI/wB,UAAW,MACX+Q,MACA,CACIO,WAAY,GACZuG,YAAa,KAIzBS,WAAW,EACX0Y,WAAY4lB,EACZljB,QAAWhiB,IAAPgiB,EAAmBA,EAAKtlB,KAAK2nC,UACjCrC,gBACI,CACI59B,QACA,CACIgB,KAAMhB,EAAQ69B,eACdC,OAAQ99B,EAAQ+9B,mBAI5BiB,WAAYA,EACZ5E,WAAU,aAEFiD,gBACGjD,GAGXtnB,SAAUxa,KAAKwa,SACf3oB,QAAQ,UACJmZ,QAvLpB,GA6LerC,I,GAAAA,eAzOCC,GAAiBC,YAC7B,CACI08B,eACA,CACIx8B,MAAO,qBAEX08B,iBACA,CACI18B,MAAO,+BAEXk/B,yBACA,CACIhjC,WAAY,YAEhBojC,cACA,CACI12C,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BijC,WAAY,EACZtlC,aAAc,GAElB+kC,aACA,CACI,UAAW,CAAE/9B,gBAAiB,eAC9BA,gBAAiB,eAErB3B,KACA,GAEA6/B,kBACA,CACI,mBACA,CACIrlC,WAAY,KAGpBolC,UACA,CACI32C,MAAOiX,EAAM4B,QAAQtR,KAAK0vC,QAC1BzuB,KAAM,GACNE,SAAU,cAkMP1R,CAAmB++B,IC1L3B,IAAMmB,GADZr0B,YACD,GADA,cAEIlO,YAEOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAMQo3C,SAAW,KAEX9oC,KAAKtO,MAAMo3C,UAEX9oC,KAAKtO,MAAMo3C,SAAS9oC,KAAK+G,MAAM5I,QAVvC,KAcQ+X,SAAW,KAEflW,KAAKtO,MAAMwkB,YAhBf,KAmBQwG,SAAW,KAEX1c,KAAKtO,MAAMgrB,UAEX1c,KAAKtO,MAAMgrB,YAvBnB,KA2BQkrB,cAAiBzpC,IAErB6B,KAAKiH,SAAS,CAAE9I,WA1BhB6B,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAMyM,OA6BzBoJ,mBAAmBC,EAAkBC,IAEnCD,EAAU2O,MAAQnW,KAAKtO,MAAMykB,MAE9BnW,KAAKiH,SAAS,CAAE9I,MAAO6B,KAAKtO,MAAMyM,QAInCwB,SAEH,MAAMopC,EAAuB/oC,KAAKtO,MAAMiT,SAClC3E,KAAKtO,MAAMgW,QAAQshC,oBACnBhpC,KAAKtO,MAAMgW,QAAQuhC,YAEnBC,EAA0BlpC,KAAKtO,MAAMiT,SACrC3E,KAAKtO,MAAMgW,QAAQyhC,uBACnBnpC,KAAKtO,MAAMgW,QAAQ0hC,eAEzB,OACI,gBAACrzB,EAAA,EAAD,CACIszB,sBAAsB,EACtBpzB,QAASjW,KAAKkW,SACdwG,SAAU1c,KAAK0c,SACfvG,KAAMnW,KAAKtO,MAAMykB,MAEjB,gBAACE,EAAA,EAAD,CAAexT,UAAWkmC,GACtB,uBAAKlmC,UAAWqmC,GACZ,gBAAC,GAAD,CACIh/B,WAAW,EACXu9B,UAAWznC,KAAKtO,MAAM+1C,UACtB7kB,WAAY5iB,KAAKtO,MAAMkxB,WACvBkf,WAAY,CACRp6B,QACA,CACIuS,MAAOja,KAAKtO,MAAMgW,QAAQu/B,aAC1Bv+B,KAAM1I,KAAKtO,MAAMgW,QAAQ4hC,YAGjC//B,MAAOvJ,KAAKtO,MAAM6X,MAClBw+B,WAAW,EACXH,cAAe5nC,KAAK4nC,cACpBjjC,SAAU3E,KAAKtO,MAAMiT,SACrBkjC,cAAe,CACXngC,QACA,CACI6a,QAASviB,KAAKtO,MAAMgW,QAAQ6hC,gBAC5B7gC,KAAM1I,KAAKtO,MAAMgW,QAAQ0gC,eAGjCn4C,KAAM,EACNkO,MAAO6B,KAAK+G,MAAM5I,MAClBtM,QAAQ,aAIpB,gBAACklB,EAAA,EAAD,KAES/W,KAAKtO,MAAMiT,SAEV,KADA,gBAACyE,EAAA,EAAD,CAAQwL,QAAS5U,KAAK8oC,UAAtB,MAGN,gBAAC1/B,EAAA,EAAD,CACI4N,UAAWhX,KAAKtO,MAAMiT,SACtBiQ,QAAS5U,KAAKkW,SACdvT,MAAO,CAAEO,WAAY,KAEpBlD,KAAKtO,MAAMiT,SAAW,QAAU,gBAtGzD,GA8GegE,I,GAAAA,eA9JCC,GAAiBC,YAC7B,CACIogC,YACA,CACIngC,QAAS,OAGTiC,KAAM,aAEVi+B,oBACA,CACIlgC,QAAS,OACT9D,SAAU,UAEdokC,eACA,CACItgC,QAAS,OACTiC,KAAM,WACNhC,MAAO,KAEXogC,uBACA,CACIpgC,MAAO,KAEXk+B,aACA,CACIh+B,OAAQ,OACR/F,YAAa,GACbuG,aAAc,GACd48B,YAAa,GACbC,aAAc,IAElBgD,UACA,CACIv+B,KAAM,WACNy+B,cAAe,IAEnBD,gBACA,CACIvkC,SAAU,QAEdojC,aACA,CACIn/B,OAAQ,UAmHLN,CAAmBkgC,ICjI3B,IAAMY,GADZj1B,YACD,GADA,cAEIlO,YAEA,0BAAiC8f,GAE7B,MACMsjB,EADMtjB,EAAO7Y,KACEtJ,sBACjBmiB,EAAOgW,OAAOC,OAAQqN,SAE1B,OAAIA,EAEOA,EAASjsC,KAAK,KAGlB2oB,EAAOjoB,MAAQioB,EAAOjoB,MAAQ,GAGzC,uBACIo9B,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CACI,GAAmB,OAAfhuB,EAAKpP,OAA0C,kBAAhBoP,EAAKpP,MAEpC,MAAM,IAAI2G,MAAJ,sCAA0CyI,EAAKpP,QAGzD,MAAM8Z,EAAoB1K,EAAK1d,YAEFooB,EAAkByxB,SACzCzxB,EAAkByxB,SAASjsC,KAAK,MAAQ8P,EAAKpP,SAI/CxP,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAUQiqC,WAAa,KAEjB37B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAZtC,KAeQC,YAAc,KAElB77B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAjBtC,KAoBQvU,cAAiB54B,IAErB,GAAkB,UAAdA,EAAMT,MACFgS,KAAKtO,MAAMm1B,OAAO8iB,eAAe3pC,KAAKtO,MAAMqqB,MAOhD,OALAttB,EAAMQ,iBACNR,EAAMO,uBAENgR,KAAKiH,SAAS,CAAE85B,cAAc,IAKlC7a,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAjCjD,KAoCQoqC,kBAAoB,KAExB97B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAtCtC,KAyCQgO,eAAiB,KAErB5pC,KAAKiH,SAAS,CAAE85B,cAAc,KA3ClC,KA8CQhF,iBAAmB,KAEvB/7B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAhDtC,KAmDQiO,WAAa,KAEjB7pC,KAAKiH,SAAS,CAAE85B,cAAc,KAlD9B/gC,KAAK+G,MAAQ,CAAEg6B,cAAc,EAAOnF,kBAAkB,GAEtDjB,GAAcqB,oCACVtqC,EAAOsO,KAAK67B,YAAa77B,KAAK27B,YAClCjqC,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eAiD9CvV,uBAEH6oB,GAAcsB,sCACVj8B,KAAKtO,MAAOsO,KAAK67B,YAAa77B,KAAK27B,YACvC37B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,EAAQA,EAAOkE,MAE3C,IAAK0K,EAED,OAAO,KAGXiO,GAASyB,qBACLte,EAAOqe,UACPzP,EAAkBU,aAAelW,IAAYmC,YAEjD,IAAIklC,EAAgC,KAChCC,EAAsC,KACtC5rC,EAAuB8Z,EAAkByxB,SACvCzxB,EAAkByxB,SAASjsC,KAAK,MAAQ4L,EAAOlL,MACrD,MAAMc,EAAmBoK,EAAO+yB,OAAO4N,oBACnC3gC,EAAO+yB,OAAO4N,oBAAoBvC,UAC9Bp+B,EAAO+yB,OAAOpP,iBACd3jB,EAAOkE,KACPpP,GAAS,GAKjB,GAHAA,EAAQkL,EAAO4gC,UAAY9rC,EACrB+rC,KAAa/H,YAAY94B,EAAO4gC,SAAU9rC,GAASA,EAErDA,IAAUkL,EAAO8gC,aACrB,CACI,MAAMC,EAAc/gC,EAAOqe,UAAUgN,wBAAwB3rB,MACvDshC,EAAoBh5C,GAAai5C,YAAYnsC,IAG9C8Z,EAAkBU,aAAelW,IAAYoC,WAC3CwlC,EAAaD,EAAc,IAC1BnyB,EAAkBU,YAAclW,IAAYoC,WACzCwlC,EAAaD,EAAc,MAElCN,EACI,gBAAC1gC,EAAA,EAAD,CACIlB,eAAA,EACArF,UAAWwG,EAAO3B,QAAQoiC,aAC1BhgC,WAAW,OACXxK,KAAK,oBACLsV,QAAS5U,KAAK6pC,WACdjgC,KAAK,QACLiL,UAAW,IAGnBk1B,EACI,gBAAC,GAAD,CACIxgC,MAAOF,EAAO+yB,OAAOmO,WACrBr0B,SAAUlW,KAAK4pC,eACfzzB,KAAMnW,KAAK+G,MAAMg6B,aACjBp8B,UAAU,EACVxG,MAAOA,KAKvB,IAAIxP,EAA0B,KAO9B,GALK0a,EAAO3G,gBAER2G,EAAO3G,cAAgB,QAGvBuV,EAAkBU,aAAelW,IAAYoC,UACjD,CACI,MAAM2lC,EACFrsC,EAAQ,KACJ,uBAAK0E,UAAWwG,EAAO3B,QAAQ8iC,MAC1B78C,IAAIwD,eAAe,UAAW,cAKvCxC,EAFAsQ,EAAOlP,OAGH,gBAAC,GAAD,CACIsqC,QAAShxB,EAAOkE,KAAKU,OACd5E,EAAOkJ,WAAWC,YAAYykB,eACrCjnC,QAASwB,IAAIC,iBAAiBwN,GAC9BgX,QAASjW,KAAK87B,kBACd/B,OAAQ/5B,KAAK+7B,iBACb5lB,KAAMnW,KAAK+G,MAAM60B,iBACjB9B,cAAc,GAEd,uBACIn3B,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,OACN9B,OAAQ,OACRyU,OAAQ,SACR1Y,SAAU,WAGlB,uBAAKnC,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,gBACLqD,MACI,CACIhR,MAAO+T,KAAK,KACZzC,SAAU,GACVC,WAAY,EACZuG,YAAa,WAI7B,uBACI9G,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV+gC,UACIv0C,IAAIi5C,aAAaphC,EAAO3G,eAC5BiI,aACItB,EAAO8gC,aACD,WAAa,OACvBllC,WAAY,WAGnB9G,EACAqsC,GAEJV,EACAC,IAOT,uBACIpnC,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,WAGhB,uBAAK7a,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,gBACLqD,MACI,CACIhR,MAAO+T,KAAK,KACZzC,SAAU,GACVgG,OAAQ,OACRQ,YAAa,WAI7B,uBACI9G,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV+gC,UACIv0C,IAAIi5C,aAAaphC,EAAO3G,eAC5BiI,aACItB,EAAO8gC,aAAe,WAAa,OACvCllC,WAAY,WAGnB9G,EACAqsC,GAEJV,EACAC,QAMbp7C,EACI,uBACIgU,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,aAGhB,uBACI/a,MACI,CACI25B,WAAY,SACZt3B,SAAU,SACV+gC,UAAWv0C,IAAIi5C,aAAaphC,EAAO3G,eACnCiI,aAActB,EAAO8gC,aACf,WAAa,OACnBllC,WAAY,SACZ8D,MAAO,SAGd5K,GAEJ2rC,EACAC,GAIb,OAAOp7C,MAhUf,GAoUega,mBAlVCC,GAAiBC,YAC7B,CACI2hC,KACA,CACI74C,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BqgC,UAAW,QAEf+D,aACA,CACIz/B,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,SAyUnC1V,CAAmB8gC,IC7W3B,MAAMiB,WACTpkC,gBAGA,uBACIi1B,EACAC,EACAC,GAGA,IAAI9sC,EAAsB,KACtBoC,EAAgB,EACpB,IAAK,MAAMwc,KAAQguB,EACnB,CACI,GAAmB,OAAfhuB,EAAKpP,MAEL,SAEJ,GAA4B,kBAAhBoP,EAAKpP,MAEb,MAAM,IAAI2G,MAAJ,sCAA0CyI,EAAKpP,QAGzD,MAAMA,EACF6oC,GAAmB1F,uBAAsB,EAAO/zB,EAAKpP,OAEzD,OAAQs9B,GAEJ,IAAK,QACD1qC,GAAS,EACT,MACJ,IAAK,UACDpC,EAAoB,OAAXA,GAAmBwP,EAAQxP,EAASwP,EAAQxP,EACrD,MACJ,IAAK,UACDA,EAAoB,OAAXA,GAAmBwP,EAAQxP,EAASwP,EAAQxP,EACrD,MACJ,QACI,MAAM,IAAImW,MAAJ,mCAAsC22B,KAIxD,MAAqB,UAAjBA,EAEO1qC,EAAMyF,WAGV8oC,GAAS6C,YAAYxzC,GAAQ,GAGjCgR,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAMzB,OAJA2X,EAAOlL,MAAQmhC,GAAS6C,YACpB6E,GAAmB1F,uBAAsB,EAAOj4B,EAAOlL,QACvD,GAEG,gBAAC,GAAD,eAAYgsC,cAAY,GAAK9gC,KAI7BqhC,I,GAAAA,M,UC7BR,IAAMC,GADZn2B,YACD,GADA,MACam2B,UACTrkC,YACH,eAAD,oBACcskC,oBADd,OAkCYC,SAAYp8C,IAEhB,MAAM0P,EAAQ9M,GAAakyB,SAASvjB,KAAKtO,OAEzC/D,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOjD,EAAMqmB,OAAO3W,OAE1C6B,KAAKtO,MAAMmyB,mBAKhBlR,IAAiBsB,kBACb,0BAA2BjU,KAAKtO,OAClCuD,MAAM,KAGJ5D,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,MAhD1C,kBACI2sC,EACAC,EACAC,GAGA,MAAMC,EAAU,IAAIH,GAEpB,GAAIC,EACJ,CAMI,QAAqBznC,IAHA2nC,EAAQ9qB,KACzB+qB,GAAKA,EAAE/sC,QAAU4sC,GAGrB,CACI,MAAMI,EACN,CACIriC,QAASkiC,EACTI,UAAU,EACVjtC,MAAO4sC,GAGXE,EAAQv6C,KAAKy6C,IAIrB,OAAOF,EAwBD9nB,cAEN,MAAM9Z,EAAM,eAAQrJ,KAAKtO,OAEzB,IAAK2X,EAAO+Z,iBAER,OAGJ,MAAMjlB,EAAQ9M,GAAakyB,SAASla,EAAQ,MACtCia,EAAqBja,EAAOgiC,0BAA2BltC,GAEzDmlB,EAEAE,GAAUtnB,KAAKonB,GAIfE,GAAU8nB,UAAUjiC,EAAOkiC,qBAI5BlkC,oBAEHrH,KAAK4qC,eAAiBnqB,YAAQ,KAE1BzgB,KAAKmjB,gBAINrR,uBAEH9R,KAAK4qC,iBAGFjrC,SACN,IAAD,EACI,IAAInQ,EAAS,MACb,UAAIwQ,KAAKtO,MAAM6gB,kBAAf,aAAI,EAAuBC,eAGvBhjB,EAASwQ,KAAKtO,MAAM6gB,WAAW/iB,QAGnC,MAAMC,EAAMC,IAAQC,IAAIqQ,KAAKtO,MAAMpC,OAAQE,GAC3C,IAAKC,EAED,OAAO,KAGX,MACM8oB,EADS9oB,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MACZM,WAEtBo7C,EAAUN,EAAea,WAC3BxrC,KAAKtO,MAAMu5C,QACX1yB,EAAawyB,cACbxyB,EAAayyB,sBAEjB,OACI,gBAACS,GAAA,EAAD,CACI9yB,YAAaJ,EAAaI,YAC1B7oB,eAAgByoB,EAAazoB,eAC7B4X,QAAS1H,KAAKtO,MAAMgW,QACpBpY,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7BmN,WAAY5iB,KAAKtO,MAAMkxB,WACvBrZ,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjBs7C,SAAU7qC,KAAK6qC,SACfI,QAASA,EACT14B,WAAYvS,KAAKtO,MAAM6gB,WACvBsR,kBAAmB7jB,KAAKtO,MAAMmyB,kBAC9BshB,gBAAiB5sB,EAAa4sB,gBAC9BF,iBAAkB1sB,EAAa0sB,uBAlI/C,GAuIet8B,I,GAAAA,eAhJCC,GAAiBC,YAC7B,CACIH,KACA,CACIkC,SAAU,OA4IPjC,CAAmBgiC,ICnJ3B,IAAMe,GADZl3B,YACD,GADA,cAEIlO,YAEA,0BAAiC8f,GAE7B,MAAM32B,EAAM22B,EAAOrK,KAAKxO,KACxB,IAAK9d,EAED,MAAO,GAGX,MAAMiC,EAAQ00B,EAAOgW,OAAOnP,mBAEtBz8B,EAASf,EAAIG,UAAU8B,EAAMnC,MAC7BgpB,EAAe/nB,EAAOX,WAOtB87C,EALUhB,GAAea,WAC3B95C,EAAMu5C,QACN1yB,EAAawyB,cACbxyB,EAAayyB,sBAEa7qB,KAAK+qB,GAAKA,EAAE/sC,QAAU3N,EAAO2N,OAE3D,OAAOwtC,EAAgBA,EAAc7iC,QAAU,GAGnD,uBACIyyB,EACAC,EACAC,GAGA,OAAOF,EAAY/iC,OAAOkjC,GAAKA,EAAEv9B,OAAOpO,OAAOyG,WAG5C+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAUQiqC,WAAa,KAEjB37B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAZtC,KAeQC,YAAc,KAElB77B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAjBtC,KAoBQvU,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAtBjD,KAyBQoqC,kBAAoB,KAExB97B,KAAKiH,SAAS,CAAE20B,kBAAkB,KA3BtC,KA8BQG,iBAAmB,KAEvB/7B,KAAKiH,SAAS,CAAE20B,kBAAkB,KA7BlC57B,KAAK+G,MAAQ,CAAE60B,kBAAkB,GAEjCjB,GAAcqB,oCACVtqC,EAAOsO,KAAK67B,YAAa77B,KAAK27B,YAClCjqC,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eA4B9CvV,uBAEH6oB,GAAcsB,sCACVj8B,KAAKtO,MAAOsO,KAAK67B,YAAa77B,KAAK27B,YACvC37B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAES,eAAQK,KAAKtO,OAAzB,MACMjC,EAAMuQ,KAAKtO,MAAMqqB,KAAKxO,KAC5B,IAAK9d,EAED,OAAO,KAGX,MAAMe,EAASf,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MAClCgpB,EAAe/nB,EAAOX,WAEtBo7C,EAAUN,GAAea,WAC3BxrC,KAAKtO,MAAMu5C,QACX1yB,EAAawyB,cACbxyB,EAAayyB,sBAEjB,IAAI7sC,EAAQ,KACZ,GAAI3N,EAAO2N,MACX,CACI,MAAMwtC,EAAgBV,EAAQ9qB,KAC1B+qB,GAAKA,EAAE/sC,QAAU3N,EAAO2N,OAC5BA,EAAQwtC,EAAgBA,EAAc7iC,QAAU,KAGpDod,GAASyB,qBACL3nB,KAAKtO,MAAMg2B,UACXnP,EAAaI,aAAelW,IAAYmC,YAE5C,MAAM3F,EAAmBxP,EAAIkF,WAAWqL,KAAKtO,MAAMnC,MAC7C,GACA,IAAIgpB,EAAazoB,gBAEvB,IAAInB,EAA0B,KAE9B,GAAI4pB,EAAaI,aAAelW,IAAYoC,UAExC,GAAI5F,EAAOlP,OACX,CACI,MAAM67C,EAAQ5rC,KAAKtO,MAAM6gB,WAAWC,YACpC7jB,EACI,gBAAC,GAAD,CACI0rC,QAAS5qC,EAAIwe,OAAS29B,EAAM3U,eAC5BjnC,QAASwB,IAAIC,iBAAiBwN,GAC9BgX,QAASjW,KAAK87B,kBACd/B,OAAQ/5B,KAAK+7B,iBACb5lB,KAAMnW,KAAK+G,MAAM60B,iBACjB9B,cAAc,GAEd,uBACIn3B,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,OACN2S,OAAQ,oBACR1Y,SAAU,WAGlB,uBACIrC,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,WAGnB9G,GAEL,uBAAK0E,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,oBACLqD,MACI,CACIM,SAAU,GACVC,WAAY,OACZuG,YAAa,aASzC9a,EACI,uBACIgU,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,kBAGhB,uBACI/a,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,WAGnB9G,GAEL,uBAAK0E,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,oBACLqD,MACI,CACIM,SAAU,GACVgG,OAAQ,OACR/F,WAAY,iBASxCvU,EACI,uBACIgU,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,aAGhB,uBACI/a,MACI,CACI25B,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,SAGd5K,IAKjB,OAAOxP,MAtOf,GA0Oe+8C,I,GAAAA,M,UChFAG,OA5Jdr3B,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQo6C,YAGR,OAMQtxB,SAAY/rB,IAEhBd,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,MAAO1P,EAAMqmB,OAAO3W,SAVxC,KAaQ8X,QAAU,KAGdnjB,WACI,KAEI,MAAM0f,EAAcxS,KAAKtO,MAAM6gB,WAAWC,YACpCu5B,EAAc/rC,KAAKtO,MAAMo0B,IAAKuE,iBAEpC7X,EAAY4Z,kCAAiC,GAC7CpsB,KAAKtO,MAAMo0B,IAAX,YAA+BmE,cAC/BjqB,KAAKtO,MAAMo0B,IAAKc,eACZmlB,EAAYrhB,SACZqhB,EAAYllB,OACZklB,EAAYthB,YAEpB,MA7BR,KAgCQxP,QAAU,KAEMjb,KAAKtO,MAAM6gB,WAAWC,YAC9B4Z,kCAAiC,IAhC7CpsB,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAMyM,OAmCzBkJ,oBAECrH,KAAK8rC,QAGLv9C,OAAOuE,WACH,KAEI,GAAIkN,KAAK8rC,OACT,CACI,MAAM7xB,EACFja,KAAKtO,MAAMg2B,UAAUtM,cAAc,SAEnCnB,GAGAA,EAAMknB,gBAAN,QAGJnhC,KAAK8rC,OAAO31B,SAGpB,IAILrE,uBAEH9R,KAAKtO,MAAM6gB,WAAWC,YAAY4Z,kCAAiC,GAGhE7I,WAEH,MAA4B,KAArBvjB,KAAK+G,MAAM5I,MAAe,KAAO6B,KAAK+G,MAAM5I,MAGhDwB,SAEH,MAAMlQ,EAAMuQ,KAAKtO,MAAMqqB,KAAKxO,KAC5B,IAAK9d,EAED,OAAO,KAGX,MACM8oB,EADS9oB,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MACZM,WAEtBo7C,EAAUN,GAAea,WAC3BxrC,KAAKtO,MAAMu5C,QACX1yB,EAAawyB,cACbxyB,EAAayyB,sBAEX/rC,EAAmBxP,EAAIkF,WAAWqL,KAAKtO,MAAMnC,MAC7C,GACA,IAAIgpB,EAAazoB,gBAEjB87C,EAAQ5rC,KAAKtO,MAAM6gB,WAAWC,YACpC,OACI,gBAAC,GAAD,CACI6nB,QAAS5qC,EAAIwe,OAAS29B,EAAM3U,eAC5BjnC,QAASwB,IAAIC,iBAAiBwN,IAE9B,gBAAC+sC,GAAA,EAAD,CACIh1B,WAAW,EACXi1B,kBAAkB,EAClB/hC,WAAW,EACX5Z,MAAO2O,EAAOlP,OAAS,EACvBm8C,WAAYjB,EAAQl7C,OAAS,EAC7Bo8C,SACKv6C,IAEGoO,KAAK8rC,OAASl6C,GAEtBw6C,UAAW,CACPxsC,aAAc,CAAEC,WAAY,OAAQC,SAAU,UAC9CusC,wBAAoB/oC,GAExBkX,SAAUxa,KAAKwa,SACfvE,QAASjW,KAAKiW,QACdgF,QAASjb,KAAKib,QACdqxB,mBACI,CACI3pC,MACA,CACI25B,WAAW,GAAD,OAAKt8B,KAAKtO,MAAMqqB,KAAK2Q,UAArB,MACV8c,cAAe,EACfnD,YAAa,GACbD,WAAY,IAGxBzjC,MAAO,CACHuX,OAAQ,UACRpR,QAAS,OACTG,OAAQ,oBAEZ9K,MAAO6B,KAAK+G,MAAM5I,OAAS,IAGvB8sC,EAAQ3tC,IAAI4tC,GACT,gBAAC,IAAD,CACK35C,SAAU25C,EAAEpiC,QACZpE,SAAUwmC,EAAEE,SACZp9C,IAAKk9C,EAAE/sC,MAAQ+sC,EAAE/sC,MAAQ,GACzBA,MAAO+sC,EAAE/sC,MAAQ+sC,EAAE/sC,MAAQ,YAnJ3D,GCfO,MAAMouC,WACTjmC,gBAEA,uBACIi1B,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CAC8BhuB,EAAK1d,WAET8oB,aAAelW,IAAYkC,WAE7ChW,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAMQ21B,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAL7CA,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eAQ9CvV,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAMsY,EAAoBzmB,IAAIgT,oBAC1BxE,KAAKtO,MAAOsO,KAAKtO,MAAM6b,MAE3B,OAAK0K,GAKLiO,GAASyB,qBAAqB3nB,KAAKtO,MAAMg2B,WAAW,GAEhDzP,EAAkBU,aAAelW,IAAYgC,OAEtC,KAIP,uBACI9B,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,gBACR3U,MAAO,SAGf,gBAAC1C,EAAA,EAAD,CACIiP,aAAY2C,EAAkBjD,cAC9B1V,KAAM2Y,EAAkBlW,SACxBY,MACI,CACIM,SAAU,GACVgG,OAAQ,YA3BjB,MAkCJsjC,UCxER,MAAMC,WACTlmC,gBAKA,0BAAiC8f,GAE7B,MAAM7hB,EACF/S,IAAIgT,oBACA,CAAEjV,KAAM62B,EAAOgW,OAAOC,OACtBjW,EAAO7Y,MAEf,OAAOhJ,EAAmBA,EAAgB,WAAiB,GAG/D,uBACIg3B,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACb,IAAK,MAAM4e,KAAQguB,EACnB,CAC8BhuB,EAAK1d,WAET8oB,aAAelW,IAAYmC,aAE7CjW,GAAU,GAIlB,OAAOA,EAAO6H,WAGX+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAlCQ+qC,aAkCR,OAjCUhoB,cAiCV,OAkBQonB,YAAc,KAEd77B,KAAKy8B,SAELz8B,KAAKy8B,QAAQphB,SAtBrB,KA0BQgM,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAzB7CsO,KAAKyU,SACL,CACI,aAAc/iB,EAAMsjB,cACpBL,UAAWiD,GAAK5X,KAAKy8B,QAAU7kB,EAC/B8kB,aAAa,EACb36B,SAAUrQ,EAAMqQ,SAChB8S,UAAW,EACXC,OAA2B,aAAnBpjB,EAAM+6C,SAA0B,QAAU,UAGtDvmB,GAASyB,qBAAqBj2B,EAAMg2B,WAAW,GAC/Ch2B,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eACjD31B,EAAMg2B,UAAUr4B,iBAAiB,QAAS2Q,KAAK67B,aAgB5C/pB,uBAEH9R,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,QAASiC,KAAK67B,aACvD77B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,EAAQA,EAAOkE,MAC3C,IAAIrU,EAAwB,KACxBvK,EAA0B,KAmB9B,OAjBI4V,EAAiB26B,aAEjBhmC,EACI,uBACIyJ,MACI,CACIM,SAAU,GACV+B,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,SAGdxE,EAAiB26B,aAItB36B,EAAiBoU,aAErB,KAAKlW,IAAYmC,WACb5E,KAAKyU,SAAS9V,KAAO4F,EAAiBlM,IACtC2H,KAAKyU,SAASljB,SAAW2H,EAEzBvK,EAAS,gBAAC0mB,EAAA,EAAiBrV,KAAKyU,UAChC,MACJ,KAAKhS,IAAYkC,SACbhW,EAASuK,EAsBjB,OAhBIvK,IAEAA,EACI,uBACIgU,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,WAGf/uB,IAINA,GAIA69C,I,GAAAA,MCjIR,IAAME,GADZl4B,YACD,GADA,MACak4B,UACTpmC,YAKA,iBACI5U,EACA6b,EACApP,EACAwuC,GAAkC,GAGlC,MAAMpoC,EACF/S,IAAIgT,oBAAoB9S,EAAO6b,GACnC,IAAI5e,EAEJ,OAAK4V,GAOD5V,EAFA4e,EAAK5Y,WAAWjD,EAAMnC,MAEb,GAIA,IAAIgV,EAAiBzU,gBAG9B4B,EAAMk7C,UAAYzuC,GAASA,EAAMpO,OAAS2B,EAAMk7C,UAEhDj+C,EAAO+B,KAAKgB,EAAMm7C,eAGjBF,GAA0Bj7C,EAAMu4C,WAEjCt7C,EAASA,EAAO+gC,OACZwa,KAAazC,UAAU/1C,EAAMu4C,SAAU9rC,KAGxCxP,GAvBI,GA0Bf,uBAA8By3B,GAE1B,IAAI0mB,EAA8B,KA6BlC,OA1BwB,IAApB1mB,EAAO+gB,UAAkB/gB,EAAOjoB,OAEhC2uC,EAAeC,OAAO3mB,EAAOjoB,OAE7B2uC,EACIA,EAAa31C,OAAO,EAAG21C,EAAa/8C,OAAS,IAQzC+8C,EAJJ1mB,EAAOghB,UAEHhhB,EAAOjoB,MAEQioB,EAAOjoB,MAAQioB,EAAOghB,UAItBhhB,EAAOghB,UAKXhhB,EAAOjoB,MAIvB2uC,EAGJvmC,YAAY7U,GAEf8U,MAAM9U,GADV,KA7EQs7C,mBA6ER,OA5EU/F,kBA4EV,OAQQzsB,SAAY/rB,IAEhB,IAAI0P,EAAgB1P,EAAMqmB,OAAO3W,MAEjC,OAAQ6B,KAAKtO,MAAMu7C,UAEf,IAAK,QACD9uC,EAAQA,EAAMzF,cACd,MACJ,IAAK,QACDyF,EAAQA,EAAMgiC,cAQtBxyC,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,WA5BpB,KA+BQ+uC,kBAAqB/uC,IAEzBxQ,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,WAhChB6B,KAAK+G,MAAQ,CAAE5I,MAAOuuC,EAAqBj9B,gBAAgB/d,IAE3DsO,KAAKgtC,cAAgBhtC,KAAK+G,MAAM5I,MAiC7BkJ,oBAEH6e,GAASohB,sBACLtnC,KAAKtO,MAAMg2B,UAAW1nB,KAAKinC,cAE/B/gB,GAASqhB,gBAAgBvnC,KAAKinC,cAG3Bn1B,uBAEHoU,GAASshB,qBAAqBxnC,KAAKtO,MAAMg2B,WAGtCnE,WAEH,MAA4B,KAArBvjB,KAAK+G,MAAM5I,MAAe,KAAO6B,KAAK+G,MAAM5I,MAGhDwB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnByM,EAAQ6B,KAAK+G,MAAM5I,OAAS,GAE5Bc,EAAmBytC,EAAqBjF,UAC1Cp+B,EACAA,EAAO0S,KAAKxO,KACZpP,EACA6B,KAAK+G,MAAM5I,QAAU6B,KAAKgtC,eAE9B,IAAI/yB,EAiCJ,OA9BIA,EAFA5Q,EAAO4gC,SAGH,gBAACkD,GAAA,EAAD,CACIF,SAAU5jC,EAAO4jC,SACjB3tC,KAAK,gBACLmnC,UAAW/gC,KAAK,KAChBo8B,WAAY,CAAEn/B,MAAO,CAAEsG,OAAQ,OAAQo9B,YAAa,IACpDgB,SAAUzvB,GAAK5X,KAAKinC,aAAervB,EACnCw1B,KAAM/jC,EAAO4gC,SACb16C,KAAM8Z,EAAO9Z,KACbirB,SAAUxa,KAAKktC,kBACfvqC,MAAO,CAAEsG,OAAQ,oBACjB9K,MAAOA,IAMX,gBAAC,GAAD,CACI6Y,WAAW,EACX1mB,MAAO2O,EAAOlP,OAAS,EACvBma,WAAW,EACX5K,KAAK,gBACLmnC,UAAW/gC,KAAK,KAChB2hC,SAAUzvB,GAAK5X,KAAKinC,aAAervB,EACnC4C,SAAUxa,KAAKwa,SACf7X,MAAO,CAAEsG,OAAQ,mBAAoBo9B,YAAa,GAClDloC,MAAOA,IAKf,gBAAC,GAAD,CACIk8B,QAAShxB,EAAO0S,KAAKxO,KAAKU,OACnB5E,EAAOkJ,WAAWC,YAAYykB,eACrCjnC,QAASwB,IAAIC,iBAAiBwN,IAE7Bgb,OA1LjB,GA+LeyyB,I,GAAAA,MCfAW,I,eAAAA,GA/Kd74B,YACD,GADA,MACa64B,UACT/mC,YAKA,iBACI5U,EACA6b,EACApP,EACAwuC,GAAkC,GAGlC,MAAMpoC,EACF/S,IAAIgT,oBAAoB9S,EAAO6b,GACnC,IAAI5e,EAEJ,OAAK4V,GAOD5V,EAFA4e,EAAK5Y,WAAWjD,EAAMnC,MAEb,GAIA,IAAIgV,EAAiBzU,gBAG9B4B,EAAMk7C,UAAYzuC,GAASA,EAAMpO,OAAS2B,EAAMk7C,UAEhDj+C,EAAO+B,KAAKgB,EAAMm7C,cAGfl+C,GAjBI,GAoBR4X,YAAY7U,GAEf8U,MAAM9U,GADV,KArCQu1C,kBAqCR,OApCQ+F,mBAoCR,OAWQxyB,SAAY/rB,IAEhBuR,KAAK8jB,SAASr1B,EAAMqmB,OAAO3W,QAb/B,KAgBQmvC,eAAkBnvC,IAEtB6B,KAAK8jB,SAAS3lB,GAEd6B,KAAKiH,SAAS,CAAE85B,cAAc,KApBlC,KAuBQ6I,eAAiB,KAErB5pC,KAAKiH,SAAS,CAAE85B,cAAc,KAzBlC,KA4BQwM,eAAiB,KAEDvtC,KAAKtO,MAAM6gB,WAAWC,YAC9B4Z,kCAAiC,IA/BjD,KAkCQnR,QAAWxsB,IAEf,MAAM++C,EAAW/+C,EAAMqmB,OACvB04B,EAASC,kBACLD,EAASrvC,MAAMpO,OACfy9C,EAASrvC,MAAMpO,QACnBy9C,EAAS3L,UAAY2L,EAASE,cAxClC,KA2CQ54C,WAAa,KAEGkL,KAAKtO,MAAM6gB,WAAWC,YAC9B4Z,kCAAiC,GAE7CpsB,KAAKiH,SAAS,CAAE85B,cAAc,KA7C9B/gC,KAAK+G,MAAQ,CACTg6B,cAAc,EACd5iC,MAAOuuC,GAAqBj9B,gBAAgB/d,IAGhDsO,KAAKgtC,cAAgBhtC,KAAK+G,MAAM5I,MA2C5B2lB,SAAS3lB,GAEbxQ,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,UAGbkJ,oBAEH6e,GAASohB,sBACLtnC,KAAKtO,MAAMg2B,UACX1nB,KAAKinC,cAET/gB,GAASqhB,gBAAgBvnC,KAAKinC,cAG3Bn1B,uBAEHoU,GAASshB,qBAAqBxnC,KAAKtO,MAAMg2B,WAGtCnE,WAEH,MAA4B,KAArBvjB,KAAK+G,MAAM5I,MAAe,KAAO6B,KAAK+G,MAAM5I,MAGhDwB,SAEH,MAAMxB,EAAQ6B,KAAK+G,MAAM5I,OAAS,GAE5Bc,EAAmBouC,EAAqB5F,UAC1CznC,KAAKtO,MACLsO,KAAKtO,MAAMqqB,KAAKxO,KAChBpP,EACA6B,KAAK+G,MAAM5I,QAAU6B,KAAKgtC,eAE9B,OACI,gBAAC,GAAD,CACI3S,QAASr6B,KAAKtO,MAAMqqB,KAAKxO,KAAKU,OACvBjO,KAAKtO,MAAM6gB,WAAWC,YAAYykB,eACzCjnC,QAASwB,IAAIC,iBAAiBwN,IAE9B,gBAAC,GAAD,CACI+X,WAAW,EACX+tB,aACI,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAE8G,YAAa,GAAI1G,WAAY,IAEtC,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,QAC/BmO,KAAK,cACLsV,QAAS5U,KAAKlL,WACd8U,KAAK,WAIjBtZ,MAAO2O,EAAOlP,OAAS,EACvBma,WAAW,EACX5K,KAAK,gBACLmnC,UAAW/gC,KAAK,KAChBghC,WAAY,CACRzrB,QAASjb,KAAKib,QACdtY,MAAO,CAAEsG,OAAQ,KAErBo+B,SAAUzvB,GAAK5X,KAAKinC,aAAervB,EACnCmwB,WAAS,EACTvtB,SAAUxa,KAAKwa,SACf7X,MAAO,CAAEsG,OAAQ,mBAAoBo9B,YAAa,GAClDloC,MAAOA,IAEX,gBAAC,GAAD,CACIoL,MAAOvJ,KAAKtO,MAAM0qC,OAAOmO,WACzBzB,SAAU9oC,KAAKstC,eACfp3B,SAAUlW,KAAK4pC,eACfltB,SAAU1c,KAAKutC,eACfp3B,KAAMnW,KAAK+G,MAAMg6B,aACjB5iC,MAAOA,SAxK3B,G,gBC0BO,IAAMwvC,GADZn5B,aACD,MADA,MACam5B,UACTrnC,YASA,8BAAsCnI,GAElC,MAAMvF,EAAQuF,EAAM7G,MAAM3J,IAAIqI,SAAS2L,kBACvC,IAAIisC,EAAQh1C,EAAM,GAClB,MAAMi1C,EAAQj1C,EAAM7I,OAAS,EAAIpC,IAAIqI,SAAS2L,iBACxC/I,EAAM,GAAK,GACXk1C,EAAM,eACZ,KAAOA,EAAIC,KAAKH,IAEZA,EAAQA,EAAMt3C,QAAQw3C,EAAd,YAAwBngD,IAAIqI,SAASuM,mBAArC,OAGZ,OAAOqrC,EAAQC,EAGnB,aAAqB1vC,EAAe6vC,GAIhC,MAAMC,EAAU7Y,KAAK6C,MAAMuI,OAAO,GAAD,OAAIriC,EAAJ,YAAa6vC,KAE9C,OAAOxN,OAAO,GAAD,OAAIyN,EAAJ,aAAgBD,IAAYE,QAAQF,GAGrD,0BACI7vC,EACAohC,EACA4O,GAEA,GAAc,OAAVhwC,EAEA,OAAO,KAGX,IAAI+oC,EAA2B,OAAViH,EACfR,EAAY1V,MAAM95B,EAAOgwC,GACzBhwC,EAAM3H,WAWZ,OATI+oC,IAEA2H,EAAiBA,EAAe5wC,QAC5Bq3C,EAAYS,uBACZzgD,IAAIqI,SAAS2L,kBACjBulC,EACIyG,EAAYU,uBAAuBnH,IAGpCA,EAGJ3gC,YAAY7U,GAEf8U,MAAM9U,GADV,4CAvDQ48C,YAAa,EAuDrB,KAtDQ75B,cAsDR,OArDQ85B,yBAqDR,OA0KQC,4BAA8B,KAElCngD,SAAS0P,oBAAoB,UAAWiC,KAAKwuC,6BAC7CC,cAAczuC,KAAKuuC,sBA1KnBvuC,KAAKyU,SACL,CACIuC,UAAWtlB,EAAK,UAChBwY,WAAW,EACXob,GAAG,gBAAD,OAAkB33B,IAAIiV,QACxBk/B,WAAYpwC,EAAK,YAAkB,GACnC6X,MAAO7X,EAAM6X,MACbha,KAAMmC,EAAMnC,KACZsC,QAAS,UAIbmO,KAAKyU,SAASkO,oBACd,CACI/wB,UAAW,MACX+Q,MACA,CACIO,WAAY,GACZuG,YAAa,KAIrBzJ,KAAKyU,SAASiyB,WACd,CACIrR,IAAK3jC,EAAMg9C,QACXjX,IAAK/lC,EAAMi9C,SAGf3uC,KAAKyU,SAAS+F,SAAWU,GAAKlb,KAAK8jB,SAAS5I,GAC5Clb,KAAKyU,SAASqW,UAAY5P,GAAKlb,KAAK4uC,iBAAiB1zB,GACrDlb,KAAKyU,SAASwG,QAAWC,IAErB,GAAIlb,KAAKsuC,WAEL,OAGJ,MAAMx5B,EAASoG,EAAEpG,OACjB9U,KAAKkqB,WAAY,EACjBlqB,KAAKsuC,YAAa,EAGlBx7C,WACI,KAEQzE,SAASwgD,gBAAkB/5B,IAE3BA,EAAOuG,QACPvG,EAAOg3B,UAEX9rC,KAAKsuC,YAAa,GAEtB,MAERtuC,KAAKyU,SAASmV,OAAS,KAEd5pB,KAAKsuC,aAENtuC,KAAKkqB,WAAY,EACjBlqB,KAAK2iC,kBAAkB3iC,KAAKshC,yBAC5BthC,KAAK8uC,iBAKT3M,YAAYhkC,EAAsBohC,GAEtC,MAAM4O,EAAqC,OAArBnuC,KAAKtO,MAAMy8C,MAAiB,EAAInuC,KAAKtO,MAAMy8C,MACjE,OAAOR,EAAYoB,mBAAmB5wC,EAAOohC,EAAe4O,GAGxD7M,wBAEJ,IAAInjC,EAAQ9M,GAAakyB,SAASvjB,KAAKtO,OACnC4yC,EAAwB,KAE5B,GAAInmC,EAEA,cAAeA,GAEX,IAAK,SACDA,EAAQA,EAAM7H,QACV3I,IAAIqI,SAAS2L,iBACbgsC,EAAYS,wBAEhB,MAAMY,EAAQ,IAAIC,OAAJ,YACLthD,IAAIqI,SAASuM,oBAAsB,KAC5C+hC,EAAS4K,WAAW/wC,EAAM7H,QAAQ04C,EAAO,KACrCzxC,MAAM+mC,KAENA,EAAS,MAEb,MACJ,IAAK,SACDA,EAASnmC,EACT,MACJ,QACI,MAAM,IAAI2G,MAAM,uDACA3G,IAI5B,OAAOmmC,EAGH6K,wBAAwBC,GAE5B,GAA6B,OAAzBpvC,KAAKtO,MAAM29C,UAEX,OAGJ,IAAInN,EAAeliC,KAAKshC,wBAEG,OAAvBthC,KAAKtO,MAAMi9C,UACU,OAAjBzM,GAAyBA,EAAeliC,KAAKtO,MAAMi9C,SAEvDzM,EAAeliC,KAAKtO,MAAMi9C,QAEE,OAAvB3uC,KAAKtO,MAAMg9C,UACK,OAAjBxM,GAAyBA,EAAeliC,KAAKtO,MAAMg9C,SAEvDxM,EAAeliC,KAAKtO,MAAMg9C,SAI1BxM,EAAgC,OAAjBA,EAAwB,EAAIA,EAC3CA,GACmBliC,KAAKtO,MAAM29C,WAAaD,EAAW,GAAK,KAG1DA,GACyB,OAAvBpvC,KAAKtO,MAAMi9C,SACXzM,GAAgBliC,KAAKtO,MAAMi9C,YAE5BS,GAC4B,OAAvBpvC,KAAKtO,MAAMg9C,SACXxM,GAAgBliC,KAAKtO,MAAMg9C,WAElC1uC,KAAK2iC,kBAAkBT,GACvBliC,KAAK8uC,gBAILnM,kBAAkBxkC,GAEtBxQ,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOsO,KAAKmiC,YAAYhkC,GAAO,IAGtD2lB,SAASr1B,GAGbd,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOjD,EAAMqmB,OAAO3W,OAG3CmxC,6BAA6BF,GAEjC/gD,SAASgB,iBACL,UAAW2Q,KAAKwuC,6BAEpBxuC,KAAKuuC,oBAAsBhgD,OAAOghD,YAC9B,IAAMvvC,KAAKmvC,wBAAwBC,GACnC,KASAN,eAEJ,MAAM5M,EAAeliC,KAAKshC,wBACpB/8B,EAAmB/S,IAAIgT,oBAAoBxE,KAAKtO,OAEtD,IAAK6S,EAED,OAGJ,MAAMzU,EAAiByU,EAAgB,eAEvC,IAAIpR,EAAQrD,EAAe+I,QAAQmH,KAAKtO,MAAM89C,cA6B9C,GA5B2B,OAAvBxvC,KAAKtO,MAAMi9C,SACS,OAAjBzM,GAAyBA,EAAeliC,KAAKtO,MAAMi9C,QAElDx7C,EAAQ,GAERrD,EAAeY,KAAKsP,KAAKtO,MAAM89C,cAG9Br8C,GAAS,GAEdrD,EAAeyD,OAAOJ,EAAO,GAGjCA,EAAQrD,EAAe+I,QAAQmH,KAAKtO,MAAM+9C,cACf,OAAvBzvC,KAAKtO,MAAMg9C,SACS,OAAjBxM,GAAyBA,EAAeliC,KAAKtO,MAAMg9C,QAElDv7C,EAAQ,GAERrD,EAAeY,KAAKsP,KAAKtO,MAAM+9C,cAG9Bt8C,GAAS,GAEdrD,EAAeyD,OAAOJ,EAAO,GAGjCA,EAAQrD,EAAe+I,QAAQmH,KAAKtO,MAAMg+C,YACb,OAAzB1vC,KAAKtO,MAAM29C,UACf,CACI,MAAMlB,EAA6B,OAArBnuC,KAAKtO,MAAMy8C,MACrB/Y,KAAKua,IAAI,GAAI3vC,KAAKtO,MAAMy8C,OAAS,EAEhB,OAAjBjM,GACI9M,KAAK6C,MAAMiK,EAAeiM,IACzBnuC,KAAKtO,MAAM29C,UAAYlB,GAAUA,IAAU,EAE5Ch7C,EAAQ,GAERrD,EAAeY,KAAKsP,KAAKtO,MAAMg+C,YAG9Bv8C,GAAS,GAEdrD,EAAeyD,OAAOJ,EAAO,GAIrCoR,EAAgB,eAAqBzU,EAGjC8+C,iBAAiBngD,GAErB,IAAKA,EAAMT,KACsC,UAAzCS,EAAMqmB,OAAuB86B,QAEjC,OAGJ,MAAMC,EAAkB,CACpBliD,IAAIqI,SAASuM,mBAAoB5U,IAAIqI,SAAS2L,iBAAkB,KACpE,IAAK,IAAIkW,EAAI,EAAGA,GAAK,EAAGA,IAEpBg4B,EAAgBn/C,KAAKmnB,EAAErhB,YAG3B,MAAMs5C,EAAgBrhD,EAAMT,IAAI+B,OAAS,GACpCtB,EAAMG,UAAYkhD,GAChBD,EAAgBh3C,QAAQpK,EAAMT,KAAO,GAExCS,EAAMQ,iBAIP0Q,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAC5B,IAAI1a,EAA0B,KAE9B,IAAK4V,EAED,OAAO,KAiBX,GAdAvE,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASqtB,WAAYiD,kBAAezhC,EACzCtD,KAAKyU,SAASuwB,UAAW,EACzBhlC,KAAKyU,SAAS9R,WAAQW,EAItBtD,KAAKyU,SAAS3iB,KAAO,OAErBkO,KAAKyU,SAASiyB,WAAY/jC,MAC1B,CACIojC,UAAWv0C,IAAIi5C,aAAaphC,EAAO3G,gBAGnClR,IAAI+jB,eAAelM,EAAQ9E,GAE3B,GAAI8E,EAAM,SAENrJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASmO,WAAa,KAC3B5iB,KAAKyU,SAAStW,MAAQ,GAIlBxP,EAFA4V,EAAiB0gC,iBAGb,gBAACzvB,EAAA,EAAD,CAAkBxlB,QAASqZ,EAAOoM,kBAC9B,gBAAC,KAAyBzV,KAAKyU,WAK9B,gBAAC,KAAyBzU,KAAKyU,eAG3C,GAAIpL,EAAM,SACf,CACI,MAAMlL,EAAQ6B,KAAKmiC,YAAYniC,KAAKshC,yBAAyB,GAE7D3yC,EACI,2BACI,gBAAC,KAAD,CACIiD,UAAU,MACVkZ,UAAQ,EACRnI,MAAO,CAAEU,aAAc,GACvBxR,QAAQ,WAEPwX,EAAOE,OAEZ,gBAAC,KAAD,CAAY3X,UAAU,OACjBuM,GAAgB,UAKjC,CACI,MAAM4xC,EAAc/vC,KAAKshC,wBAEzB,GAAyB,OAArBj4B,EAAOgmC,UACX,CACI,MAAMW,EAA+B,OAAhBD,GACK,OAAnB1mC,EAAOslC,SACPoB,EAAc1mC,EAAOgmC,WAAahmC,EAAOslC,QAC1CsB,EAA+B,OAAhBF,GACK,OAAnB1mC,EAAOqlC,SACPqB,EAAc1mC,EAAOgmC,WAAahmC,EAAOqlC,QAEhD1uC,KAAKyU,SAASqtB,WAAYiD,aAEtB,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAEI,WAAY,IAErB,gBAAC,WAAD,KACI,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAC/BuT,UAAWsrC,EACX1wC,KAAK,eACLsV,QAAS,IACL5U,KAAKmvC,yBAAwB,GACjChV,YAAa,IACTn6B,KAAKsvC,8BAA6B,GACtC1lC,KAAK,UAET,gBAACR,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAC/BuT,UAAWurC,EACX3wC,KAAK,cACLsV,QAAS,IACL5U,KAAKmvC,yBAAwB,GACjChV,YAAa,IACTn6B,KAAKsvC,8BAA6B,GACtC1lC,KAAK,QACLjH,MAAO,CAAEO,WAAY,OAOzClD,KAAKyU,SAASuwB,SAAWzgC,EAAiB4gC,gBAE1C,MAAMr1C,EACF,IAAIyU,EAAiBzU,gBAGzB,IAAIo1C,EAFJ1zC,IAAIoyB,cAAc5jB,KAAMlQ,EAAgBkQ,KAAKyU,UAKzCywB,EAFAllC,KAAKkqB,UAEO74B,GAAakyB,SAASvjB,KAAKtO,OAAO4E,QAC1Cq3C,EAAYS,uBACZzgD,IAAIqI,SAAS2L,kBAIL3B,KAAKmiC,YAAY4N,GAAa,GAE9C/vC,KAAKyU,SAAStW,MAAsB,OAAd+mC,EAAqB,GAAKA,EAEhDv2C,EACI,gBAAC,KAAD,iBACQqR,KAAKyU,SADb,CAEI6wB,gBAAiB,CACb59B,QACA,CACIgB,KAAM1I,KAAKtO,MAAM29C,UAEbrvC,KAAKtO,MAAMgW,QAAQwoC,0BAEnBlwC,KAAKtO,MAAMgW,QAAQ69B,eAEvBC,OAAQxlC,KAAKtO,MAAM29C,UAEfrvC,KAAKtO,MAAMgW,QAAQyoC,4BAEnBnwC,KAAKtO,MAAMgW,QAAQ+9B,sBAO/C,OAAO92C,IA7df,GAG2By/C,uBAAyB,IAHpD,+CAKK5rC,KALL,yEAKoC,KALpC,YAieemG,mBAzfCC,GAAiBC,YAC7B,CACI08B,eACA,CACIx8B,MAAO,qBAEX08B,iBACA,CACI18B,MAAO,+BAEXmnC,0BACA,CACInnC,MAAO,sBAEXonC,4BACA,CACIpnC,MAAO,gCAEXL,KACA,KAseOC,CAAmBglC,IC9gB3B,MAAMyC,WACT9pC,gBAEA,0BAAiC8f,GAE7B,IAAKA,EAAOjoB,MAER,MAAO,GAGX,MAAMmmC,EAAS4K,WAAW9oB,EAAOjoB,OAC3BgwC,EAAQ/nB,EAAOgW,OAAOnP,mBAAmBkhB,OAAS,KAClD31C,EAASm1C,GAAYoB,mBAAmBzK,GAAQ,EAAM6J,GAE5D,OAAkB,OAAX31C,EAAkBA,EAAS,GAGtC,uBACI+iC,EACAC,EACAC,GAGA,IAAI9sC,EAAS,EACToC,EAAQ,EACRs/C,GAAU,EACd,IAAK,MAAM9iC,KAAQguB,EACnB,CACI,GAAmB,OAAfhuB,EAAKpP,MAEL,SAEJ,GAA4B,kBAAhBoP,EAAKpP,MAEb,MAAM,IAAI2G,MAAJ,sCAA0CyI,EAAKpP,QAGzD,MAAMA,EAAgB+wC,WAAW3hC,EAAKpP,OAEtC,OAAQs9B,GAEJ,IAAK,UACD9sC,GAAUwP,EACVpN,GAAS,EACT,MACJ,IAAK,QACDA,GAAS,EACT,MACJ,IAAK,UACDpC,EAAS0hD,GAAWlyC,EAAQxP,EAASwP,EAAQxP,EAC7C0hD,GAAU,EACV,MACJ,IAAK,UACD1hD,EAAS0hD,GAAWlyC,EAAQxP,EAASwP,EAAQxP,EAC7C0hD,GAAU,EACV,MACJ,IAAK,MACD1hD,GAAUwP,EACV,MACJ,QACI,MAAM,IAAI2G,MAAJ,mCAAsC22B,KAIxD,MAAqB,UAAjBA,EAEO1qC,EAAMyF,YAGI,YAAjBilC,GAA8B1qC,EAAQ,IAEtCpC,GAAkBoC,GAGf48C,GAAYoB,mBACfpgD,GACA,EACA6sC,EAAiB2S,QAGlBxuC,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAOzB,OALA2X,EAAOlL,MAAQwvC,GAAYoB,mBACvB1lC,EAAOlL,MAAQ+wC,WAAW7lC,EAAOlL,OAAS,MAC1C,EACAkL,EAAO8kC,OAEJ,gBAAC,GAAD,eAAYhE,cAAY,GAAK9gC,KAI7B+mC,I,GAAAA,MCyTAE,I,GAAAA,GAhYd97B,YACD,GADA,MACa87B,UACThqC,YAOA,6BAAqCnI,GAEjC,IAAImmC,EAAwB,KAE5B,GAAInmC,EAEA,cAAeA,GAEX,IAAK,SACD,MAAMoyC,EAAUpyC,EAAM7H,QAClB3I,IAAIqI,SAAS2L,iBACbgsC,GAAYS,wBAEVY,EAAQ,IAAIC,OAAJ,YACLthD,IAAIqI,SAASuM,oBAAsB,KAC5C+hC,EAAS4K,WAAWqB,EAAQj6C,QAAQ04C,EAAO,KACvCzxC,MAAM+mC,KAENA,EAAS,MAEb,MACJ,IAAK,SACDA,EAASnmC,EACT,MACJ,QACI,MAAM,IAAI2G,MAAM,uDACA3G,IAI5B,OAAOmmC,EAGX,iBACI5yC,EACA6b,EAEApP,GAEA,MAAMoG,EACF/S,IAAIgT,oBAAoB9S,EAAO6b,GACnC,IAAI5e,EAEJ,IAAK4V,EAED,MAAO,GAKP5V,EAFA4e,EAAK5Y,WAAWjD,EAAMnC,MAEb,GAIA,IAAIgV,EAAiBzU,gBAGlC,MAAMigD,EAAcO,EAAsBhP,sBAAsBnjC,GAEhE,GAAoB,OAAhB4xC,IAEsB,OAAlBr+C,EAAMi9C,SAAoBoB,EAAcr+C,EAAMi9C,SAE9ChgD,EAAO+B,KAAKgB,EAAM89C,cAGA,OAAlB99C,EAAMg9C,SAAoBqB,EAAcr+C,EAAMg9C,SAE9C//C,EAAO+B,KAAKgB,EAAM+9C,cAGE,OAApB/9C,EAAM29C,WACV,CACI,MAAMlB,EAAwB,OAAhBz8C,EAAMy8C,MAChB/Y,KAAKua,IAAI,GAAIj+C,EAAMy8C,OAAS,EAC3B/Y,KAAK6C,MAAM8X,EAAc5B,IACzBz8C,EAAM29C,UAAYlB,GAAUA,IAAU,GAEvCx/C,EAAO+B,KAAKgB,EAAMg+C,YAK9B,OAAO/gD,EAGJ4X,YAAY7U,GAKf,GAHA8U,MAAM9U,GADV,KA5FQ8+C,iBA4FR,OA3FUvJ,kBA2FV,OA1FUxyB,cA0FV,OAsJQg8B,UAAY,KAEhBzwC,KAAKwwC,aAAc,EACnBjiD,OAAOwP,oBAAoB,UAAWiC,KAAKywC,YArJpB,IAAnB/+C,EAAMy1C,UAAkBz1C,EAAMyM,MAClC,CACI,IAAIA,EAAQ4uC,OAAOr7C,EAAMyM,OAEzBA,EAAQA,EAAMhH,OAAO,EAAGgH,EAAMpO,OAAS,GACvCiQ,KAAK+G,MAAQ,CAAE5I,aAGnB,CACI,MAAM6wC,EAAQ,IAAIC,OAAJ,aAEJthD,IAAIqI,SAAS2L,iBAFT,aAE8BhU,IAAIqI,SAASuM,mBAF3C,WAEwE,KAElF7Q,EAAM01C,WAAa4H,EAAMjB,KAAKr8C,EAAM01C,WAEhC11C,EAAMyM,MAEN6B,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAMyM,MAAQzM,EAAM01C,WAI1CpnC,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAM01C,WAKhCpnC,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAMyM,OAIpC6B,KAAKyU,SACL,CACIuC,WAAW,EACX9M,WAAW,EACX5K,KAAM,gBACNmnC,UAAW/gC,KAAK,KAChBghC,WACA,CACIrR,IAAK3jC,EAAMg9C,QACXjX,IAAK/lC,EAAMi9C,SAEfjsC,cAAehR,EAAMgR,eAGzB1C,KAAKyU,SAAS4yB,SAAY7P,IAEtBx3B,KAAKinC,aAAezP,GAGxBx3B,KAAKyU,SAAS+F,SAAYU,IAEtBvtB,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,MAAO+c,EAAEpG,OAAO3W,SAEpC6B,KAAKyU,SAASqW,UAAY5P,GAAKlb,KAAK4uC,iBAAiB1zB,GACrDlb,KAAKyU,SAAS9R,MAAQ,CAAEsG,OAAQ,mBAAoBo9B,YAAa,GAG7DlE,YAAYhkC,EAAsBohC,GAEtC,OAAOoO,GAAYoB,mBACf5wC,EACAohC,EACAv/B,KAAKtO,MAAMy8C,OAGXuC,8BAA8BtB,GAE9BpvC,KAAKwwC,cAELxwC,KAAKmvC,wBAAwBC,GAE7Bt8C,WACI,KAEIkN,KAAK0wC,8BAA8BtB,IAEvC,MAIJD,wBAAwBC,GAE5B,GAA6B,OAAzBpvC,KAAKtO,MAAM29C,UAEX,OAGJ,IAAInN,EACAoO,EAAsBhP,sBAAsBthC,KAAKyU,SAAStW,OAEnC,OAAvB6B,KAAKtO,MAAMi9C,UAAsC,OAAjBzM,GAC7BA,EAAeliC,KAAKtO,MAAMi9C,SAE7BzM,EAAeliC,KAAKtO,MAAMi9C,QAEE,OAAvB3uC,KAAKtO,MAAMg9C,UAAsC,OAAjBxM,GAClCA,EAAeliC,KAAKtO,MAAMg9C,SAE7BxM,EAAeliC,KAAKtO,MAAMg9C,SAI1BxM,EAAeA,GAAgB,EAC/BA,GACmBliC,KAAKtO,MAAM29C,WAAaD,EAAW,GAAK,KAG1DA,GACyB,OAAvBpvC,KAAKtO,MAAMi9C,SACXzM,GAAgBliC,KAAKtO,MAAMi9C,YAE5BS,GAC4B,OAAvBpvC,KAAKtO,MAAMg9C,SACXxM,GAAgBliC,KAAKtO,MAAMg9C,UAElC1uC,KAAK2iC,kBAAkBT,IAGC,OAAvBliC,KAAKtO,MAAMi9C,cACQrrC,IAAjB4+B,GACAA,EACDliC,KAAKtO,MAAMi9C,QAAU3uC,KAAKtO,MAAM29C,WACP,OAAvBrvC,KAAKtO,MAAMg9C,cACKprC,IAAjB4+B,GACAA,EACDliC,KAAKtO,MAAMg9C,QAAU1uC,KAAKtO,MAAM29C,aAElCrvC,KAAKwwC,aAAc,EAEfxwC,KAAKinC,aAELjnC,KAAKinC,aAAa5rB,QAIlBrb,KAAKtO,MAAMo0B,IAAK6qB,iBACZ,CACIC,OAAQ5wC,KAAKtO,MAAMm1B,OAAOuU,WAC1B1Q,SAAU1qB,KAAKtO,MAAMg5B,YAYjCiY,kBAAkBxkC,GAEtBxQ,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,MAAO6B,KAAKmiC,YAAYhkC,GAAO,KAG3CmxC,6BAA6BF,GAEjCpvC,KAAKwwC,aAAc,EAEnBjiD,OAAOc,iBAAiB,UAAW2Q,KAAKywC,WAExC39C,WACI,KAEIkN,KAAK0wC,8BAA8BtB,IAEvC,KAGAR,iBAAiBngD,GAGrB,IAAKA,EAAMT,IAEP,OAGJ,MAAM6hD,EAAkB,CACpBliD,IAAIqI,SAASuM,mBAAoB5U,IAAIqI,SAAS2L,iBAAkB,KACpE,IAAK,IAAIkW,EAAI,EAAGA,GAAK,EAAGA,IAEpBg4B,EAAgBn/C,KAAKmnB,EAAErhB,YAG3B,MAAMs5C,EAAgBrhD,EAAMT,IAAI+B,OAAS,GACpCtB,EAAMG,UAAYkhD,GAChBD,EAAgBh3C,QAAQpK,EAAMT,KAAO,GAExCS,EAAMQ,iBAIPoY,oBAEH6e,GAASohB,sBACLtnC,KAAKtO,MAAMg2B,UAAW1nB,KAAKinC,cAE/B/gB,GAASqhB,gBAAgBvnC,KAAKinC,cAG3Bn1B,uBAEHoU,GAASshB,qBAAqBxnC,KAAKtO,MAAMg2B,WAGtCnE,WAIH,OAFAvjB,KAAKwwC,aAAc,EAEZxwC,KAAKmiC,YACRmO,EAAsBhP,sBAAsBthC,KAAK+G,MAAM5I,QAAQ,GAGhEwB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzBsO,KAAKyU,SAAStW,MAAQ6B,KAAK+G,MAAM5I,OAAS,GAE1C,MAAMc,EAAmBqxC,EAAsB7I,UAC3Cp+B,EAAQA,EAAO0S,KAAKxO,KAAMvN,KAAKyU,SAAStW,OAE5C6B,KAAKyU,SAASnkB,MAAQ2O,EAAOlP,OAAS,EAEtC,MAAMggD,EAAcO,EAAsBhP,sBACtCthC,KAAKyU,SAAStW,OAElB,GAAyB,OAArBkL,EAAOgmC,UACX,CACI,MAAMW,EAA+B,OAAhBD,GACK,OAAnB1mC,EAAOslC,SACPoB,EAAc1mC,EAAOgmC,WAAahmC,EAAOslC,QAC1CsB,EAA+B,OAAhBF,GACK,OAAnB1mC,EAAOqlC,SACPqB,EAAc1mC,EAAOgmC,WAAahmC,EAAOqlC,QAEhD1uC,KAAKyU,SAASswB,aAEN,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAE8G,YAAa,GAAI1G,WAAY,IAEtC,gBAAC,WAAD,KACI,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAC/BuT,UAAWsrC,EACX1wC,KAAK,eACLsK,KAAK,QACLgL,QAAS,IACL5U,KAAKmvC,yBAAwB,GACjChV,YAAa,IACTn6B,KAAKsvC,8BAA6B,KAE1C,gBAAClmC,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAC/BuT,UAAWurC,EACX3wC,KAAK,cACLsK,KAAK,QACLjH,MAAO,CAAEO,WAAY,GACrB0R,QAAS,IACL5U,KAAKmvC,yBAAwB,GACjChV,YAAa,IACTn6B,KAAKsvC,8BAA6B,OAO9D,OACI,gBAAC,GAAD,CACIjV,QAAShxB,EAAO0S,KAAKxO,KAAKU,OACnB5E,EAAOkJ,WAAWC,YAAYykB,eACrCjnC,QAASwB,IAAIC,iBAAiBwN,IAE9B,gBAAC,GAAUe,KAAKyU,eA1XhC,GCNO,IAAMo8B,GADZr8B,YACD,GADA,cAEIlO,YAEA,0BAAiC8f,GAE7B,MAAM32B,EAAM22B,EAAOrK,KAAKxO,KACxB,IAAK9d,EAED,MAAO,GAGX,MAAMiC,EAAQ00B,EAAOgW,OAAOnP,mBAEtBz8B,EAASf,EAAIG,UAAU8B,EAAMnC,MAC7BgpB,EAAe/nB,EAAOX,WAEtBihD,EACN,CACIhoC,QAASyP,EAAayyB,qBACtB7sC,MAAOoa,EAAawyB,eAQlBY,EALQj6C,EAAM6gB,WAAWC,YACTu+B,+BAClBr/C,EAAMnC,KACNuhD,GAE0B3wB,KAAK+qB,GAAKA,EAAE/sC,QAAU3N,EAAO2N,OAE3D,OAAOwtC,EAAgBA,EAAc7iC,QAAU,GAGnD,uBACIyyB,EACAC,EACAC,GAGA,OAAOF,EAAY/iC,OAAOkjC,GAAKA,EAAEv9B,OAAOpO,OAAOyG,WAG5C+P,YAAY7U,GAEf8U,MAAM9U,GADV,KAUQiqC,WAAa,KAEjB37B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAZtC,KAeQC,YAAc,KAElB77B,KAAKiH,SAAS,CAAE20B,kBAAkB,KAjBtC,KAoBQvU,cAAiB54B,IAErBy3B,GAASoB,wBAAwB74B,EAAOuR,KAAKtO,QAtBjD,KAyBQoqC,kBAAoB,KAExB97B,KAAKiH,SAAS,CAAE20B,kBAAkB,KA3BtC,KA8BQG,iBAAmB,KAEvB/7B,KAAKiH,SAAS,CAAE20B,kBAAkB,KA7BlC57B,KAAK+G,MAAQ,CAAE60B,kBAAkB,GAEjCjB,GAAcqB,oCACVtqC,EAAOsO,KAAK67B,YAAa77B,KAAK27B,YAClCjqC,EAAMg2B,UAAUr4B,iBAAiB,UAAW2Q,KAAKqnB,eA4B9CvV,uBAEH6oB,GAAcsB,sCACVj8B,KAAKtO,MAAOsO,KAAK67B,YAAa77B,KAAK27B,YACvC37B,KAAKtO,MAAMg2B,UAAU3pB,oBAAoB,UAAWiC,KAAKqnB,eAGtD1nB,SAEH,MAAMlQ,EAAMuQ,KAAKtO,MAAMqqB,KAAKxO,KAC5B,IAAK9d,EAED,OAAO,KAGX,MAAMe,EAASf,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MAClCgpB,EAAe/nB,EAAOX,WAEtBihD,EACN,CACIhoC,QAASyP,EAAayyB,qBACtB7sC,MAAOoa,EAAawyB,eAGlBa,EAAQ5rC,KAAKtO,MAAM6gB,WAAWC,YAC9By4B,EAAUW,EAAMmF,+BAClB/wC,KAAKtO,MAAMnC,KACXuhD,GAEJ,IAAI3yC,EAAQ,KACZ,GAAI3N,EAAO2N,MACX,CACI,MAAMwtC,EAAgBV,EAAQ9qB,KAAK+qB,GAAKA,EAAE/sC,QAAU3N,EAAO2N,OAC3DA,EAAQwtC,EAAgBA,EAAc7iC,QAAU,KAGpDod,GAASyB,qBACL3nB,KAAKtO,MAAMg2B,UACXnP,EAAaI,aAAelW,IAAYmC,YAE5C,MAAM3F,EAAmBxP,EAAIkF,WAAWqL,KAAKtO,MAAMnC,MAC7C,GACA,IAAIgpB,EAAazoB,gBAEvB,IAAInB,EAA0B,KAsH9B,OAhHQA,EAJJ4pB,EAAaI,aAAelW,IAAYoC,UAEpC5F,EAAOlP,OAGH,gBAAC,GAAD,CACIsqC,QAAS5qC,EAAIwe,OAAS29B,EAAM3U,eAC5BjnC,QAASwB,IAAIC,iBAAiBwN,GAC9BgX,QAASjW,KAAK87B,kBACd/B,OAAQ/5B,KAAK+7B,iBACb5lB,KAAMnW,KAAK+G,MAAM60B,iBACjB9B,cAAc,GAEd,uBACIn3B,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,OACN2S,OAAQ,oBACR1Y,SAAU,WAGlB,uBACIrC,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,WAGnB9G,GAEL,uBAAK0E,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,oBACLqD,MACI,CACIM,SAAU,GACVC,WAAY,OACZuG,YAAa,QAUrC,uBACI9G,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,kBAGhB,uBACI/a,MACI,CACIoI,KAAM,OACNuxB,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,WAGnB9G,GAEL,uBAAK0E,UAAU,YACX,gBAACwD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,oBACLqD,MACI,CACIM,SAAU,GACVgG,OAAQ,OACR/F,WAAY,YAUpC,uBACIP,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRyU,OAAQ,aAGhB,uBACI/a,MACI,CACI25B,WAAY,SACZt3B,SAAU,SACV2F,aAAc,WACd1F,WAAY,SACZ8D,MAAO,SAGd5K,IAKVxP,MA/Of,GAmPekiD,I,GAAAA,MCrFAG,I,GAAAA,GAjKdx8B,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQo6C,YAGR,OAMQtxB,SAAY/rB,IAEhBd,IAAIulB,oBACAlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,KAAMyQ,KAAKtO,MAAM6b,KAAK/d,QACxDwQ,KAAKiH,SAAS,CAAE9I,MAAO1P,EAAMqmB,OAAO3W,SAVxC,KAaQ8X,QAAU,KAGdnjB,WACI,KAEI,MAAM0f,EAAcxS,KAAKtO,MAAM6gB,WAAWC,YACpCu5B,EAAc/rC,KAAKtO,MAAMo0B,IAAKuE,iBAEpC7X,EAAY4Z,kCAAiC,GAC7CpsB,KAAKtO,MAAMo0B,IAAX,YAA+BmE,cAC/BjqB,KAAKtO,MAAMo0B,IAAKc,eACZmlB,EAAYrhB,SACZqhB,EAAYllB,OACZklB,EAAYthB,YAEpB,MA7BR,KAgCQxP,QAAU,KAEMjb,KAAKtO,MAAM6gB,WAAWC,YAC9B4Z,kCAAiC,IAhC7CpsB,KAAK+G,MAAQ,CAAE5I,MAAOzM,EAAMyM,OAmCzBkJ,oBAECrH,KAAK8rC,QAGLv9C,OAAOuE,WACH,KAEI,GAAIkN,KAAK8rC,OACT,CACI,MAAM7xB,EACFja,KAAKtO,MAAMg2B,UAAUtM,cAAc,SAEnCnB,GAGAA,EAAMknB,gBAAN,QAGJnhC,KAAK8rC,OAAO31B,SAGpB,IAILrE,uBAEH9R,KAAKtO,MAAM6gB,WAAWC,YAAY4Z,kCAAiC,GAGhE7I,WAEH,MAA4B,KAArBvjB,KAAK+G,MAAM5I,MAAe,KAAO6B,KAAK+G,MAAM5I,MAGhDwB,SAEH,MAAMlQ,EAAMuQ,KAAKtO,MAAMqqB,KAAKxO,KAC5B,IAAK9d,EAED,OAAO,KAGX,MACM8oB,EADS9oB,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MACZM,WAEtBihD,EACN,CACIhoC,QAASyP,EAAayyB,qBACtB7sC,MAAOoa,EAAawyB,eAGlBa,EAAQ5rC,KAAKtO,MAAM6gB,WAAWC,YAC9By4B,EAAUW,EAAMmF,+BAClB/wC,KAAKtO,MAAMnC,KACXuhD,GAEE7xC,EAAmBxP,EAAIkF,WAAWqL,KAAKtO,MAAMnC,MAC7C,GACA,IAAIgpB,EAAazoB,gBAEvB,OACI,gBAAC,GAAD,CACIuqC,QAAS5qC,EAAIwe,OAAS29B,EAAM3U,eAC5BjnC,QAASwB,IAAIC,iBAAiBwN,IAE9B,gBAAC+sC,GAAA,EAAD,CACIh1B,WAAW,EACXi1B,kBAAkB,EAClB/hC,WAAW,EACX5Z,MAAO2O,EAAOlP,OAAS,EACvBm8C,WAAYjB,EAAQl7C,OAAS,EAC7Bo8C,SACKv6C,IAEGoO,KAAK8rC,OAASl6C,GAEtBw6C,UAAW,CACPxsC,aAAc,CAAEC,WAAY,OAAQC,SAAU,UAC9CusC,wBAAoB/oC,GAExBkX,SAAUxa,KAAKwa,SACfvE,QAASjW,KAAKiW,QACdgF,QAASjb,KAAKib,QACdqxB,mBACI,CACI3pC,MACA,CACI25B,WAAW,GAAD,OAAKt8B,KAAKtO,MAAMqqB,KAAK2Q,UAArB,MACV8c,cAAe,EACfnD,YAAa,GACbD,WAAY,IAGxBzjC,MAAO,CACHuX,OAAQ,UACRpR,QAAS,OACTG,OAAQ,oBAEZ9K,MAAO6B,KAAK+G,MAAM5I,OAAS,IAGvB8sC,EAAQ3tC,IAAI4tC,GACT,gBAAC,IAAD,CACK35C,SAAU25C,EAAEpiC,QACZpE,SAAUwmC,EAAEE,SACZp9C,IAAKk9C,EAAE/sC,MAAQ+sC,EAAE/sC,MAAQ,GACzBA,MAAO+sC,EAAE/sC,MAAQ+sC,EAAE/sC,MAAQ,YAxJ3D,GCuBe,MAAMi8B,GAIjB,kBACIvT,EACAoqB,EACAC,GAQA,OAN0BD,EAAKrhD,UAAUi3B,EAAOt3B,MAAMM,WAClB,UAEVqhD,EAAKthD,UAAUi3B,EAAOt3B,MAAMM,WAClB,UA6BxC,wBACIu2B,EAA4BS,GAG5B,IAAKT,EAAOgW,OAAOC,OACU,mBAAtBxV,EAAOsqB,YACP/W,GAAWN,aAId,OAFAM,GAAWN,cAAe,GAEnB,EAGX,MAAMpoC,EAAQm1B,EAAOuqB,YAIrB,OAFI5/C,IAAIgT,oBAAoB9S,EAAO00B,EAAO7Y,MAEjBoL,aAAelW,IAAYoC,UAGxD,qCACIuhB,GAGA,MAAMjtB,EAAUitB,EAAOjtB,QACvB,IAAIk4C,EAAcl4C,EAAQwzB,eAAe2kB,4BACnC94C,OAAOinC,GAAsB,iBAAjBA,EAAErE,YAIhBjiC,EAAQyzB,2BAERykB,EAAcA,EAAY74C,OAAOinC,GAAsB,YAAjBA,EAAErE,aAG5C,MAAMmW,EACFF,EAAYthD,OAAS,EAAIshD,EAAYA,EAAYthD,OAAS,GAAK,KAEnE,QAASwhD,GAAcA,EAAWnW,aAAehV,EAAOgW,OAAOjP,MAGnE,oBACItG,EACA2qB,EACAj/B,GAIA,IAEIk/B,EAFAC,EAAiC,KACjC9mC,EAAW,GAEX+mC,EAAmC,KAEvC,OAAQ9qB,EAAOsqB,YAEX,IAAK,iBACDQ,EAAoBrW,GACpBmW,EAAqBG,GAAmBH,mBACxC,MACJ,IAAK,6BACDE,EAAoBxV,GACpBsV,EAAqBtV,GAA2BsV,mBAChD,MACJ,IAAK,yBACDE,EAAoB/S,GACpB6S,EAAqB,IAAe,GACpC7mC,EAAWic,EAAOuqB,YAAP,WAnBmB,GAqB9B,MACJ,IAAK,iBACDO,EAAoB1S,GACpBwS,EAAqBxS,GAAewS,mBACpC,MACJ,IAAK,iBACDE,EAAoBjH,GACpBgH,EAAkB1K,GAClByK,EAAqBzK,GAAmByK,mBACxC,MACJ,IAAK,uBACDE,EAAoBjG,GACpBgG,EAAkB7F,GAClB4F,EACI/F,GAA4B+F,mBAChC,MACJ,IAAK,oBACDE,EAAoBpF,GACpBkF,EAAqB,IAAe,GACpC7mC,EAAWinC,GACX,MACJ,IAAK,mBACDF,EAAoBnF,GACpBiF,EAAqBjF,GAAiBiF,mBACtC,MACJ,IAAK,mBACDE,EAAoBlI,GACpBiI,EAAkBrE,GAClBoE,EAAqBK,GAAeL,mBACpC,MACJ,IAAK,oBACDE,EAAoBvB,GACpBsB,EAAkBpB,GAClBmB,EAAqBrB,GAAkBqB,mBACvC,MACJ,IAAK,6BACDE,EAAoBd,GACpBa,EAAkBV,GAClBS,EACIZ,GAAkCY,mBACtC,MACJ,IAAK,mBACDE,EAAoBlI,GACpBiI,EAAkBhF,GAClB+E,EAAqBK,GAAeL,mBACpC,MACJ,IAAK,oBACDE,EAAoBlI,GACpBgI,EAAqBK,GAAeL,mBACpC,MACJ,QACI,MAAM,IAAI3sC,MAAM,qDACP+hB,EAAOsqB,WADA,MAIxB,MAUM1iB,EACF5H,EAAOkrB,eACD,CAAC,OAAQ,OACT,CAAC,MAAO,QAyElB,OAvEIlrB,EAAO9b,MAAQ8b,EAAO9d,OACnB8d,EAAO9d,MA5FwB,GA4FQ6B,IAE1CA,EAAWic,EAAO9d,MA9FgB,IAkGlC,CACIipC,YAAY,EACZ9kB,UAAW,UACX+kB,eAAgB,CACZ,eAAiB7rB,IACZgU,GAAW8X,8BAA8B9rB,IAElD4jB,oBAAqB0H,EACrB1kB,iBAAiB,eAAMnG,EAAOuqB,YAAd,CAA2B7+B,eAC3C6c,sBAAuBuiB,EACvB1kB,mBAAmB,eAAOpG,EAAOuqB,YAAf,CAA4B7+B,eAC9C8c,UACA,CACIrqB,SAAU,UACVwZ,QAAS,OAEb2O,MAAOtG,EAAOt3B,KACd4iD,WAAY,CAERC,EAEAC,EACAC,EACAC,EACAC,KAEA,MAAMvB,EAAOqB,EAAO/kC,KACd2jC,EAAOqB,EAAOhlC,KAEpB,OAAO6sB,GAAW+X,WAAWtrB,EAAQoqB,EAAMC,IAE/CuB,SAAUh6C,GAAK2hC,GAAWsY,iBAAiBj6C,EAAGouB,GAC9CwV,MAAOxV,EAAOt3B,KACdkiD,mBAvD2BrrB,GAE1BA,EAAOS,OAAOwP,YAKZob,EAAmBrrB,GAHf,GAoDPgH,YAAahH,GAAUgU,GAAWuY,qBAC9BvsB,EACAorB,EACAj/B,EAAWC,YAAY8F,aAC3BiyB,WAAY1jB,EAAO+rB,QAAU,GAC7B11B,MAAM,EACN21B,YAAY,EACZjoC,WACAyiB,WAAYxG,EAAO9b,KACnBuiB,SAAUzG,EAAOisB,YACjBrkB,eACAhB,mBAAoB5G,EAAO9b,OAAS8b,EAAO9d,MAC3CgqC,YAAcC,GAEEA,EAAEzlC,KAEH3d,UAAUojD,EAAE5W,OAAOC,OAAQl+B,MAE1C80C,YAAcD,IAEEA,EAAEzlC,KACVyC,YAAYgjC,EAAE5W,OAAOC,MAAQ2W,EAAEE,WAE5B,GAEXnqC,MAAO8d,EAAO9d,MACR8d,EAAO9d,MA9JiB,QA+JxBzF,GAMlB,8BACIypB,GAIA,IAAIL,EAAY,GAEhB,IAAK,MAAM7F,KAAUkG,EACrB,CACI,IAAIomB,EAAe,EACnB,OAAQtsB,EAAOsqB,YAEX,IAAK,yBACDgC,EAAetsB,EAAOuqB,YAAP,YAVC,GAYhB,MACJ,QACI+B,EAAe,EAGnBA,EAAezmB,IAEfA,EAAYymB,GAIpB,OAAOzmB,EAGX,oBACIK,EACAI,GAGA,MAAMtG,EAASkG,EAAQ5M,KAAKsf,GAAKA,EAAElwC,OAAS49B,GAC5C,YAAkB7pB,IAAXujB,GAAwBA,EAAO9b,KAG1C,uBACIgiB,EACAI,EACAimB,GAGA,MAAMvsB,EAASkG,EAAQ5M,KAAKsf,GAAKA,EAAElwC,OAAS49B,GAC5C,YAAkB7pB,IAAXujB,GAAwBA,EAAOusB,IA3SzBhZ,GAEHN,cAAwB,EAFrBM,GAkBFuY,qBAAuB,CAClCvsB,EACA2G,EACAzU,KAGA,MAAMuO,EACFkG,EAAQ5M,KAAKsf,GAAKA,EAAElwC,OAAS62B,EAAOgW,OAAOjP,OACzCkmB,EACFjZ,GAAW8X,8BAA8B9rB,GACvCktB,IACAzsB,GAAkD,UAAxCA,EAAOuqB,YAAP,cAKVmC,EAFF/hD,IAAIgT,oBAAoB8T,GAGNK,aAAelW,IAAYkC,SAEjD,OADiBkiB,GAAUA,EAAOme,WAAauO,EAC5B,sBAAwB,KACpCF,EAAkB,GAAK,oBACvBC,EAAU,mBAAqB,KClBvC,IAAME,GADZh/B,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQ+hD,oBAGR,OAMQ3K,SAAW,KAEf,IAAK9oC,KAAKtO,MAAMo3C,SAEZ,KAAM,4CAGV9oC,KAAKiH,SAAS,CAAEiH,cAAc,IAE9BlO,KAAKtO,MAAMo3C,SAAS9oC,KAAKtO,MAAM4lB,cAAeviB,KAC1C8d,IAEIA,EAASC,kBACND,EAASC,iBAAiB/iB,OAAS,EAEtCpC,IAAIolB,WAAWF,EAASC,mBAI5B9d,IAAUiS,SAAS4L,EAASI,gBAExBJ,EAAS/iB,eAAeC,OAAS,EAEjCpC,IAAIulB,sBAIJvlB,IAAIulB,oBACAlT,KAAKtO,MAAMooB,mBAAexW,EAAWtD,KAAKtO,MAAM4lB,cAGxD1L,IAAcuH,aAAaN,EAASO,kBAE/BzlB,IAAI0lB,kBAAkBR,EAAS/iB,gBAAgB,KAEhDkF,IAAUge,0BACVhT,KAAK0zC,aAAY,OAEtB7/B,QAAQ,IAAM7T,KAAKiH,SAAS,CAAEiH,cAAc,MA5CnD,KA+CQgI,SAAW,KAEf,GAAIlW,KAAKtO,MAAMiiD,oBACf,CACI,MAAMnmC,EAAaxT,IAAeC,OAAOtK,IACrCqQ,KAAKtO,MAAMooB,eAETjO,EAAwB2B,EAAW2S,KACrCjhB,GAAKA,EAAE+M,kBAAoBjM,KAAKtO,MAAM4lB,cAE1C9J,EAAWxP,OAAO6N,GAIlB2B,EAAWxB,aAAahO,OAAO6N,GAC/B7L,KAAKtO,MAAMkiD,cAGfjmD,IAAIulB,oBACAlT,KAAKtO,MAAMooB,mBAAexW,EAAWtD,KAAKtO,MAAM4lB,cAEpDtiB,IAAU6+C,wBACV7zC,KAAK0zC,aAAY,IArErB,KAwEQ5+C,WAAa,KAEjBiG,IAAclG,SAASuZ,oBAEvBpO,KAAKtO,MAAMqoC,OACP/5B,KAAKtO,MAAM4lB,cACbviB,KAAM++C,IAEJ,MAAMhhC,EAAmBghC,EAAmBhhC,iBAC5C,GAAIA,GAAoBA,EAAiB/iB,OAAS,EAM9C,OAJApC,IAAIolB,WAAWD,GACf9d,IAAUge,+BACVhT,KAAKtO,MAAMukB,SAAQ,GAKvB,MAAMjZ,EAAkB82C,EAAmBC,gBAE3C1iD,GAAa2iD,SAASF,EAAmBx/B,SAAUtX,GACnDrP,IAAIsmD,YAAYj3C,GAEhBgD,KAAKyzC,eAAiBpiD,GAAaC,OAC/BwiD,EAAmBI,oBAEvBl/C,IAAUiS,SAAS6sC,EAAmB7gC,gBACtCrH,IAAcuH,aAAa2gC,EAAmB1gC,kBAEzCpT,KAAKtO,MAAMiiD,qBAEZ3+C,IAAU0d,2BAGd1S,KAAKiH,SAAS,CACVktC,kBAAmBL,EAAmBM,YACtCrT,cAAc,MAGpBltB,QAAQ,IAAM9Y,IAAclG,SAASyZ,sBA/G3C,KAkHOolC,YAAeW,IAElBr0C,KAAKiH,SAAS,CAAE85B,cAAc,IAC9B/gC,KAAKtO,MAAMukB,QAAQo+B,IAlHnBr0C,KAAK+G,MAAQ,CAAEg6B,cAAc,EAAO7yB,cAAc,GAqH/C3G,mBAAmBC,GAElBxH,KAAKtO,MAAM4lB,eAAiB9P,EAAU8P,cACnCtX,KAAKtO,MAAM4lB,eAAiBtX,KAAK+G,MAAMg6B,cAE1C/gC,KAAKlL,aAIN6K,SAEH,MAAM20C,EAA8B5kD,IAAQ8U,oBACxCxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAElC,IAAK+kD,EAED,OAAO,KAGX,MAAMC,EACFD,EAA4B37B,aAAelW,IAAYoC,UAE3D,OACI,gBAACkR,EAAA,EAAD,CACIo+B,kBAAmBn0C,KAAK+G,MAAMotC,kBAC9B9K,sBAAsB,EACtBlzB,KAAMnW,KAAK+G,MAAMg6B,gBAAmB/gC,KAAKtO,MAAM4lB,aAC/CrB,QAASjW,KAAKkW,SACdwG,SAAU1c,KAAKtO,MAAMgrB,UAErB,gBAACrG,EAAA,EAAD,CACI3O,QAAS,CAAEgB,KAAM1I,KAAKtO,MAAMgW,QAAQ8sC,gBAEpC,4BACKx0C,KAAKyzC,iBAGd,gBAAC18B,EAAA,EAAD,KACKw9B,EACG,gBAACnrC,EAAA,EAAD,CAAQwL,QAAS5U,KAAK8oC,UAAtB,MAGA,KACJ,gBAAC1/B,EAAA,EAAD,CAAQwL,QAAS5U,KAAKkW,SAAUvT,MAAO,CAAEO,WAAY,KAChDqxC,EAAc,SAAW,UAGlC,gBAAC3a,GAAA,EAAD,CACIxjB,OAAQpW,KAAK+G,MAAMmH,aACnBumC,WAAW,SA/K/B,GAqLe9rC,I,GAAAA,eArMCC,GAAiBC,YAC7B,CACI2rC,cACA,CACI,UACA,CACI,CAAC5rC,EAAM0V,YAAYC,KAAK,OACxB,CACI8nB,YAAa,EACbC,aAAc,OA4LnB39B,CAAmB6qC,IC1OlC,MAAMkB,GAAU9rC,GAAiBC,YAC7B,CACIH,KACA,CACIgZ,WAAY,SACZ5Y,QAAS,OACTG,OAAQ,OACRizB,eAAgB,YAKrB,IAAMyY,GADZngC,YACD,GADA,MACamgC,UACTruC,YAEA,oBAA2BiM,GAEvB,MAAO,CACH2a,UAAW,uBACXkC,sBAAuBzmB,YAAW+rC,GAAX/rC,CAAmBgsC,GAC1C1nB,mBAAoB,CAAE1a,cACtB8c,UAAW,CAAE0W,UAAW,UACxB5Y,MAAO,WACPC,YAAa,iBACblQ,MAAM,EACNuS,OAAQ,QACRpC,WAAW,EACXC,UAAU,EACVC,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACnB1kB,MAAO,IAIRxC,YAAY7U,GAEf8U,MAAM9U,GADV,KAYOoD,WAAa,KAEhB,MAAMyY,EAAOvN,KAAKtO,MAAM6b,MAAQvN,KAAKtO,MAAM6gB,WAAWhF,KAEtDvN,KAAKtO,MAAM6gB,WAAWC,YAAYmB,kBAC9BpG,EAAK/d,QAAS,IAddkC,EAAMg2B,WAENxB,GAASuB,YAAY/1B,EAAMg2B,UAAW,KAElC1nB,KAAKlL,eAaV6K,SAEH,MAAM6S,EAAcxS,KAAKtO,MAAM6gB,WAAWC,YAEpC8hC,EACF5kD,IAAQ8U,oBACJgO,EAAY8F,YAAYhpB,OACxBkjB,EAAY8F,YAAY/oB,MAEhC,IAAK+kD,EAED,OAAO,KAGX,MAAM/mC,EAAOvN,KAAKtO,MAAM6b,MAAQvN,KAAKtO,MAAM6gB,WAAWhF,KAChD+lB,EAAUghB,EAA4BhhB,QAC5C,GAAIA,IAA6C,IAAlCA,EAAQz6B,QAAQ0U,EAAK/d,QAEhC,OAAO,KAGX,MAAM+kD,EACFD,EAA4B37B,aAAelW,IAAYoC,UAErD+vC,EAAUjnD,IAAIwD,eAChBojD,EAAc,eAAiB,eAAgB,aAEnD,OACI,uBAAK1xC,UAAW7C,KAAKtO,MAAMgW,QAAQgB,MAC/B,gBAACU,EAAA,EAAD,CACIkM,aAAYs/B,EACZjjD,MAAM,UACN2N,KAAMi1C,EAAc,cAAgB,qBACpC3/B,QAAS5U,KAAKlL,WACd8U,KAAK,QACLiL,UAAW,SA/E/B,GAqFelM,I,GAAAA,eAAW+rC,GAAX/rC,CAAmBgsC,ICvD3B,IAAME,GADZrgC,YACD,GADA,cAEIlO,YAQOC,YACH7U,GAEA8U,MAAM9U,GADV,KAPQojD,SAAsD,KAO9D,KANQviC,gBAMR,OALQsZ,sBAKR,OAJQzG,gBAIR,OAiDQsU,QAAU,IAEP/mB,IAAiBoiC,qBACpB,yCAAkC/0C,KAAKg1C,aAAvC,WACMh1C,KAAKtO,MAAMpC,OADjB,YAC2B0Q,KAAKtO,MAAMnC,OArD9C,KA+DQ0lD,aAAeC,UAEnB,MAAMpB,QACInhC,IAAiBC,gBACnB,0CAAmC5S,KAAKg1C,aAAxC,WACMh1C,KAAKtO,MAAMpC,OADjB,YAC2B0Q,KAAKtO,MAAMnC,WACtC+T,EACA,CAAE6xC,aAAc79B,IAGlBhD,EAAWw/B,EAAmBsB,oBAAoB5+C,WAExD,OAAO6+C,KAAoBC,mBACvBhhC,GACFvf,KAAMwgD,GAEG,eAAKzB,EAAZ,GAAmCyB,EAAnC,CAAmDjhC,eA/E3D,KAwFQZ,aAAe,KAEnB,MAAMzjB,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzB,OAAlB9Z,KAAK80C,UAEL90C,KAAK80C,SAAS7kD,IA5FlB+P,KAAK+G,MAAQ,GAEb/G,KAAKuS,WAAa,CACdC,YACA,CACIiL,UAAW/rB,EAAM+rB,UACjBsP,QAASr7B,EAAMq7B,QACfzU,YACA,CACIwB,cAAepoB,EAAMooB,cACrBvM,KAAM7b,EAAM6b,KACZje,OAAQoC,EAAMpC,OACdC,KAAMmC,EAAMnC,MAEhBkjB,uBAAsB/gB,EAAM8jD,qBAC5Bve,gBAAgB,EAChBtjB,kBAAmB,CAACiE,EAAGC,IAAM7X,KAAK2T,kBAAkBiE,EAAGC,GACvDnE,aAAc,IAAM1T,KAAK0T,iBAIjC1T,KAAKolB,WAAa,CACd3H,UAAW/rB,EAAM+rB,UACjB+Q,UAAU,EACVzB,QAAS,GACTjT,cAAepoB,EAAMooB,cACrBxqB,OAAQoC,EAAMpC,OACdmjC,mBAAoB/gC,EAAMy2B,cAC1BqK,mBAAoB9gC,EAAMwwB,cAC1B0U,aAAezJ,GACXiN,GAAWxD,aAAallC,EAAMq7B,QAASI,GAC3CmJ,gBAAiB,CAACnJ,EAAeimB,IAC7BhZ,GAAW9D,gBAAgB5kC,EAAMq7B,QAASI,EAAOimB,GACrD3pB,aACI2Q,GAAWqb,uBAAuB/jD,EAAMq7B,SAC5Cx9B,KAAMmC,EAAMnC,KACZgjB,WAAYvS,KAAKuS,WACjB2Z,aAAcx6B,EAAMw6B,aAAe,gBAAa5oB,EAChDkiB,mBAAoB9zB,EAAM4wB,iBAC1B6I,YAAa2pB,GAAY90C,KAAK80C,SAAWA,EACzClpB,oBACImb,GAAgB/mC,KAAK6rB,iBAAmBkb,EAC5CrU,oBAAqBhhC,EAAMw3B,gBAY3B8rB,YAGJ,OADmB3jD,GAAa2S,cAAchE,KAAKtO,OACjClC,OAuBdmkB,kBAAkBnkB,EAAgBmkD,GAEtC3zC,KAAKiH,SAAS,CAAEyuC,eAAgB,CAAE/B,sBAAqBnkD,YAcpD6X,oBAEH,IAAK,MAAMwf,KAAU7mB,KAAKtO,MAAMq7B,QAE5B/sB,KAAKolB,WAAW2H,QAAQr8B,KAAK0pC,GAAWub,aACpC9uB,EACA7mB,KAAKtO,MAAMq7B,QACX/sB,KAAKuS,aAGTvS,KAAKtO,MAAM8jD,sBAEXx1C,KAAKolB,WAAW2H,QAAQr8B,KAAKikD,GAAsBiB,aAC/C51C,KAAKuS,aAIVhL,mBAAmBC,GAElBA,EAAUuB,QAAU/I,KAAKtO,MAAMqX,OAE/BjW,WAAW,IAAMkN,KAAK0T,gBAIvB/T,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,OAAKumB,EAKDA,EAAkBU,cAAgBlW,IAAYgC,OAEvC,KAIP,gBAACic,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC7B,uBAAKoT,MAAO,CAAE0X,SAAU,aACpB,gBAAC,GAAD,CACIP,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoqC,QAAS15B,KAAK05B,QACdhmB,aAAc1T,KAAK0T,eAEvB,gBAAC,GAAD,iBACQ1T,KAAKolB,WADb,CAEIoG,eAAgBxrB,KAAKtO,MAAMywB,eAC3BmK,SAAUtsB,KAAKtO,MAAM46B,YAEzB,gBAAC,GAAD,CACIxS,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBqkD,sBAAqB3zC,KAAK+G,MAAM2uC,gBAC1B11C,KAAK+G,MAAM2uC,eAAe/B,oBAEhCpkD,KAAMyQ,KAAKtO,MAAMnC,KACjB0mB,QAAS,IACLjW,KAAKiH,SAAS,CAAEyuC,oBAAgBpyC,IACpCswC,YAAa,IAAM5zC,KAAK0T,eACxBgJ,SAAU,IAAM1c,KAAK6rB,mBACrBkO,OAAQ/5B,KAAKi1C,aACb39B,aAActX,KAAK+G,MAAM2uC,eACnB11C,KAAK+G,MAAM2uC,eAAelmD,YAAS8T,MAnC9C,SA9InB,GAwLeqF,mBA7LCC,GAAiBC,YAC7B,IA4LWF,CAAmB+M,cAAYm/B,KCzNvC,MAAMgB,WACTvvC,gBAEO3G,SAEH,IAAIm2C,EAA0B,6CAE9B,GAAI91C,KAAKtO,MAAL,QAAwBsO,KAAKtO,MAAL,KAC5B,CACI,MAAM6S,EAAmB/S,IAAIgT,oBAAoBxE,KAAKtO,OAGlDokD,EAFAvxC,EAEkBtW,KAAKC,UAAUqW,EAAkB,KAAM,GAIvC,4CAI1B,OACI,uBAAK1B,UAAW7C,KAAKtO,MAAMgW,QAAQgB,MAC/B,uBAAK7F,UAAW7C,KAAKtO,MAAMgW,QAAQquC,aAAnC,4BAGA,uBAAKlzC,UAAW7C,KAAKtO,MAAMgW,QAAQsuC,eAC9B/nD,KAAKC,UAAU8R,KAAKtO,MAAO,KAAM,IAEtC,uBAAKmR,UAAW7C,KAAKtO,MAAMgW,QAAQquC,aAAnC,yCAGA,uBAAKlzC,UAAW7C,KAAKtO,MAAMgW,QAAQsuC,eAC9BF,KAONntC,I,GAAAA,eA/DCC,GAAiBC,YAC7B,CACIktC,YACA,CACI9yC,SAAU,OACVgjC,WAAY,KAEhB+P,cACA,CACI3rC,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,KACpC4e,YAAa1b,EAAM4B,QAAQ9E,KAAK,KAChC/T,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BzC,SAAU,OACVub,QAAS,MACTvZ,WAAY,YAEhByD,KACA,CACI4b,YAAa1b,EAAM4B,QAAQ4T,OAAO63B,MAClCC,WAAY,YACZ13B,QAAS,UA2CN7V,CAAmBktC,IC5C3B,IAAM1X,GADZ3pB,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAazB,OAXI2X,EAAO/Z,SAEH+Z,EAAO9Z,OAAS8Z,EAAO9X,WAEvB8X,EAAO9X,SAAWF,GAAakyB,SAASla,WAGrCA,EAAO/Z,cACP+Z,EAAO9Z,MAId,gBAAC,GAAD,CACIsT,UAAWwG,EAAO3B,QAAQgB,KAC1BwB,WAAS,EACTvH,MAAO0G,EAAO1G,OAEd,gBAAC,KAAD,CACI9Q,QAAQ,UACRiZ,UAAQ,EACRjI,UAAWwG,EAAO3B,QAAQ6B,OAEzBF,EAAOE,OAEZ,gBAAC,KAAD,CACI3X,UAAU,MACV+Q,MAAO,CAAEyH,UAAW,KAEnBf,EAAO9X,eAnC5B,GAyCeoX,I,GAAAA,eAxDCC,GAAiBC,YAC7B,CACIU,MACA,CACI5X,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BrC,aAAc,GAElBqF,KACA,CACI,UAAW,CAAE2B,gBAAiB,eAC9BA,gBAAiB,iBA8Cd1B,CAAmBw1B,ICRlBgY,OAzCf3hC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,OAAKumB,EAKDA,EAAkBU,cAAgBlW,IAAYgC,OAEvC,KAIP,gBAAC,GAAD,CAAU8E,MAAOvJ,KAAKtO,MAAMkhD,QACxB,uBAAKjwC,MAAO,CAAE+e,WAAY,SAAU5Y,QAAS,SACzC,gBAACzC,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAM2Y,EAAkBlW,SACxBY,MACI,CACIM,SAAU,GACVgG,OAAQ,OACRQ,YAAa,UAGzB,uBAAK9G,MAAO,CAAE25B,WAAY,WACrBrkB,EAAkB1O,SAtBxB,SAVnB,GCmBO,MAAM6sC,WACT9vC,gBAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHiB1D,SAGjB,OA2CQqoD,SAAY5nD,IAEhB,MAAMyrC,EAA4BzrC,EAAMo7B,cAExC7pB,KAAKiH,SAAS,CAAE0N,UAAWulB,GAAU,KAEjC1+B,IAAS2a,KAAKnW,KAAKhS,IAAKksC,MA9C5Bl6B,KAAKhS,IAAMgS,KAAKtO,MAAM6gB,WAAWC,YAAY8F,YAAYwB,cAEzD,IAAI3b,EAAgBzM,EAAM6gB,WAAW+jC,gBAAgBC,cAEjDH,GAAkBl8C,OAAO9L,IAAI4R,KAAKhS,KAElCmQ,EAAQi4C,GAAkBl8C,OAAOvK,IAAIqQ,KAAKhS,KAI1CooD,GAAkBl8C,OAAO9K,IAAI4Q,KAAKhS,IAAKmQ,GAG3C6B,KAAK+G,MAAQ,CAAE5I,SAGnB,eAAuBA,GAEnB,GAAIA,IAAUi4C,GAAkBl8C,OAAOvK,IAAIqQ,KAAKhS,KAAhD,CAKAwN,IAASC,WACTuE,KAAKiH,SAAS,CAAE9I,UAEhB,UAEU6B,KAAKtO,MAAM6gB,WAAW+jC,gBAAgBjW,OAAOliC,GACnDi4C,GAAkBl8C,OAAO9K,IAAI4Q,KAAKhS,IAAKmQ,GAE3C,SAEI6B,KAAKiH,SACD,CACI9I,MAAOi4C,GAAkBl8C,OAAOvK,IAAIqQ,KAAKhS,SAelD2R,SAEH,MAAM62C,EACFx2C,KAAKtO,MAAM6gB,WAAW+jC,gBAAgBE,SACpCjjB,EACFijB,EAASr2B,KAAKX,GAAKA,EAAEjwB,OAASyQ,KAAK+G,MAAM5I,OAE7C,OACI,2BACI,gBAACiL,EAAA,EAAD,CACIvG,UAAW7C,KAAKtO,MAAMgW,QAAQwyB,OAC9BtlB,QAAS5U,KAAKq2C,SACdxhC,UAAW,GAEX,2BACI,gBAAC,KAAD,CAAYhjB,QAAQ,WACflE,IAAIwD,eAAe,cAExB,gBAAC,KAAD,KACKoiC,EAAS5iC,cAGlB,gBAAC0V,EAAA,EAAD,CACI/G,KAAK,oBACLqD,MAAO,CAAEO,WAAY,WAG7B,gBAACuzC,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAM4N,UACrB/U,aAAc,CAAEC,WAAY,OAAQC,SAAU,UAC9CusC,wBAAoB/oC,EACpB/T,KAAMyQ,KAAKhS,IACX0uB,SAAU,IAAM1c,KAAK+G,MAAM4N,UAAW0G,QACtClF,MAAM,GAELqgC,EAASl5C,IAAIoiC,GACV,gBAAC,IAAD,CACInuC,SAAUmuC,EAAE/uC,YACZ3C,IAAK0xC,EAAEnwC,KACPqlB,QAAS,IAAM5U,KAAKwa,SAASklB,EAAEnwC,MAC/BgkC,SAAUmM,EAAEnwC,OAASyQ,KAAK+G,MAAM5I,MAChCA,MAAOuhC,EAAEnwC,WArGxB6mD,GAGKl8C,OAA8B,IAAInC,IA0GrC4Q,I,GAAAA,eA9HCC,GAAiBC,YAC7B,CACIqxB,OACA,CACI,UACA,CACIyc,UAAW,QAGf9Z,WAAY,OACZ8Z,UAAW,OACXn4B,QAAS,EACTunB,UAAW,OACXC,cAAe,UAiHZr9B,CAAmBytC,IClF3B,IAAMQ,GADZpiC,YACD,GADA,cAEIlO,YAQOC,YACH7U,GAEA8U,MAAM9U,GADV,KAPQmlD,uBAOR,OANQ/B,SAAsD,KAM9D,KALQviC,gBAKR,OAJQ6S,gBAIR,OAwEQsU,QAAWod,GAERnkC,IAAiBoiC,qBACpB,2CAAoC/0C,KAAKg1C,aAAzC,WACMh1C,KAAKtO,MAAMpC,OADjB,YAC2B0Q,KAAKtO,MAAMnC,WACtC+T,EACA,CAAEyzC,WAAYD,GAA0B92C,KAAK62C,oBA9ErD,KAuFQnjC,aAAe,KAEnB,MAAMzjB,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzB,OAAlB9Z,KAAK80C,UAEL90C,KAAK80C,SAAS7kD,IA9FtB,KAkGQowC,OAAS6U,UAEbl1C,KAAKiH,SAAS,CAAE+vC,aAAa,IAE7B,UAEUC,GAActd,gBAAgB35B,KAAK05B,QAAQ2G,IACjDrgC,KAAK62C,kBAAoBxW,EAH7B,QAOIrgC,KAAKiH,SAAS,CAAE+vC,aAAa,MA1GjCh3C,KAAK+G,MAAQ,CAAEiwC,aAAa,GAE5B,MAAM/+B,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAE7BwlD,GAAsBh9C,OAAO9L,IAAI4R,KAAKtO,MAAMooB,eAE5C9Z,KAAK62C,kBACDK,GAAsBh9C,OAAOvK,IAAIqQ,KAAKtO,MAAMooB,eAIhD9Z,KAAK62C,kBAAoB5+B,EAAkBs+B,cAG/C,MAAMY,EACN,CACI3kC,YACA,CACIiL,UAAW/rB,EAAM+rB,UACjBsP,QAASr7B,EAAMq7B,QACfzU,YACA,CACIwB,cAAepoB,EAAMooB,cACrBvM,KAAM7b,EAAM6b,KACZje,OAAQoC,EAAMpC,OACdC,KAAMmC,EAAMnC,KACZ+8B,SAAU56B,EAAM46B,UAEpB7Z,sBAAsB,EACtBwkB,gBAAgB,EAChBvjB,aAAc,IAAM1T,KAAK0T,iBAIjC1T,KAAKuS,WAAL,aAEI+jC,gBACA,CACIC,cAAet+B,EAAkBs+B,cACjClW,OAAQrgC,KAAKqgC,OACbmW,SAAU9kD,EAAM8kD,WAEjBW,GAGPn3C,KAAKolB,WAAa,CACd3H,UAAW/rB,EAAM+rB,UACjB+Q,UAAU,EACVzB,QAAS,GACTjT,cAAepoB,EAAMooB,cACrBxqB,OAAQoC,EAAMpC,OACdmjC,mBAAoB/gC,EAAMy2B,cAC1BqK,mBAAoB9gC,EAAMwwB,cAC1B0U,aAAezJ,GACXiN,GAAWxD,aAAallC,EAAMq7B,QAASI,GAC3CmJ,gBAAiB,CAACnJ,EAAeimB,IAC7BhZ,GAAW9D,gBAAgB5kC,EAAMq7B,QAASI,EAAOimB,GACrD3pB,aACI2Q,GAAWqb,uBAAuB/jD,EAAMq7B,SAC5Cx9B,KAAMmC,EAAMnC,KACZgjB,WAAYvS,KAAKuS,WACjB0gB,qBAAqB,EACrB9H,YAAa2pB,GAAY90C,KAAK80C,SAAWA,EACzC9hB,YAAY,EACZN,oBAAqBhhC,EAAMw3B,gBAa3B8rB,YAGJ,OADmB3jD,GAAa2S,cAAchE,KAAKtO,OACjClC,OA6Bf6X,oBAEH,IAAK,MAAMwf,KAAU7mB,KAAKtO,MAAMq7B,QAE5B/sB,KAAKolB,WAAW2H,QAAQr8B,KAAK0pC,GAAWub,aACpC9uB,EACA7mB,KAAKtO,MAAMq7B,QACX/sB,KAAKuS,aAIVhL,mBAAmBC,GAElBA,EAAUuB,QAAU/I,KAAKtO,MAAMqX,OAE/BjW,WAAW,IAAMkN,KAAK0T,gBAIvB/T,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,OAAKumB,EAKDA,EAAkBU,cAAgBlW,IAAYgC,OAEvC,KAIP,gBAACic,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC7B,uBAAKoT,MAAO,CAAE0X,SAAU,aACpB,gBAAC,GAAD,CACIP,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoqC,QAAS15B,KAAK05B,QACdhmB,aAAc1T,KAAK0T,eAEvB,gBAACkmB,GAAA,EAAD,CAAgBxjB,OAAQpW,KAAK+G,MAAMiwC,cACnC,gBAAC,GAAD,iBACQh3C,KAAKolB,WADb,CAEIoG,eAAgBxrB,KAAKtO,MAAMywB,eAC3BmK,SAAUtsB,KAAKtO,MAAM46B,cArB1B,SAtJnB,GAkLe3jB,I,GAAAA,eAvLCC,GAAiBC,YAC7B,IAsLWF,CAAmB+M,cAAYkhC,KC1KvC,IAAMQ,GADZ5iC,YACD,GADA,MACa4iC,UACT9wC,YAEA,cACIs3B,EACAC,EACAE,EACAT,EACAQ,GAIA,MAAO,+CACGF,GADH,WAEGC,EAFH,YAEwBE,GAFxB,WAGGT,GAHH,WAIGQ,GAGPn+B,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,IAAK9E,EAED,OAAO,KAGX,IAAI0E,OAA6B3F,EAC7BtD,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMkwB,cAE/B3Y,EAASjJ,KAAKtO,MAAMkwB,YAAY5hB,KAAKtO,MAAMqX,QAE/C,IAAIA,OAA4BzF,EAMhC,GALItD,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMmwB,aAE/B9Y,EAAQ/I,KAAKtO,MAAMmwB,WAAW7hB,KAAKtO,MAAMqX,SAGxCA,IAAUE,EAEX,OAAO,KAGX,IAAK1E,EAAiBq5B,iBACdr5B,EAAiBs5B,kBACzB,CACI,GAAyB,uBAArBx0B,EAAOguC,UAEP,OAAO,KAGX,MAAMxa,EAAa78B,KAAKtO,MAAMkX,MAAM4B,QAAQ9E,KAAK,KAIjD,OACI,uBACI/C,MAAO,CACHk6B,aACA5zB,SACAoR,SAAU,WACVtR,UAGJ,gBAAC1C,EAAA,EAAD,CACIiP,aACI3nB,IAAIwD,eAAe,iBAAkB,WACzC0R,UAAWwG,EAAO3B,QAAQ4vC,QAC1Bt0C,YAAU,EACV1D,KAAK,kBAMrB,MAAM29B,EAAiBma,EAAiBG,OACpChzC,EAAiBq5B,eACjBr5B,EAAiBs5B,kBACjBt5B,EAAiBw5B,mBACjB10B,EAAOguC,UACP9yC,EAAiBw6B,UAEftB,EAAsB2Z,EAAiBG,OACzChzC,EAAiBq5B,eACjBr5B,EAAiBs5B,kBACjBt5B,EAAiBw5B,mBACjB,YACAx5B,EAAiBw6B,UAErB,GAAyB,cAArB11B,EAAOguC,UACX,CACI,MAAMla,EAA6B,iBAAvB9zB,EAAOmuC,YACb,QAAU,UAEhB,OAAKx3C,KAAKtO,MAAM+lD,qBAcZ,uBAAK90C,MAAO,CAAEqC,SAAU,WACpB,uBACInC,UAAWwG,EAAO3B,QAAQs1B,MAC1Br6B,MACI,CACIsG,WAGR,uBACIqM,aAAY/Q,EAAiByQ,cAC7B8M,IAAKmb,EACLt6B,MACI,CACIsG,OAAQ,OACR+Y,SAAU,OACVkb,UAAWC,EACXp0B,aA3BhB,gBAAC,GAAD,CACIiM,cAAezQ,EAAiByQ,cAChCmoB,IAAKA,EACLl0B,OAAQA,EACRtK,KAAM8+B,EACNR,OAAQA,EACRl0B,MAAOA,IA4BvB,OACI,gBAAC,GAAD,CACIiM,cAAezQ,EAAiByQ,cAChCyoB,YAAaA,EACbC,UAAU,EACV37B,SAAUwC,EAAiBxC,SAC3B6f,YAAa3Y,EACb4Y,WAAY9Y,EACZk0B,OAAQA,EACRK,cAAej0B,EAAOguC,gBA/ItC,GAqJe1uC,I,GAAAA,eAnLCC,GAAiBC,YAC7B,CACIm0B,MACA,CACIh4B,SAAU,SACV,CAAC4D,EAAM0V,YAAYC,KAAK,OACxB,CACIyD,SAAU,SAGlBs1B,QACA,CACI,UACA,CACIruC,OAAQ,kBACRF,MAAO,mBAEXpX,MAAOiX,EAAM4B,QAAQ9E,KAAK,KAC1BuD,OAAQ,iBACRkR,KAAM,MACN2rB,UAAW,OACX9jB,SAAU,OACV3H,SAAU,WACVC,IAAK,MACLo9B,UAAW,wBACX3uC,MAAO,oBA0JJJ,CAAmB+M,cAAaqO,aAAUqzB,MCvJ1CO,OAnDdnjC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,GAC5B,IAAI1a,EAA0B,KAE9B,IAAKspB,EAED,OAAO,KAGX,IAAI5f,EAAG,mBAAe4f,EAAkBmnB,SAAjC,KA+BP,OA9BI/1B,EAAOg2B,eAEPhnC,GAAOgR,EAAOg2B,eAKdhnC,GAAO4f,EAAkBonB,eAGzB7tC,IAAI+jB,eAAelM,EAAQ4O,KAEtB5O,EAAM,SAYPA,EAAO9X,SAAW0mB,EAAkBinB,WAVpC71B,EAAO9X,SACH,gBAAC8jB,EAAA,EAAD,CACI9jB,SAAU0mB,EAAkBinB,WAC5BvgC,KAAMtG,EACNsK,MAAO,CAAEsG,OAAQ,GAAImB,UAAW,IAChC0K,OAAO,UAQnBnmB,EAAS,gBAAC,GAAa0a,IAGpB1a,MA9Cf,G,UChBO,MAAMipD,WAAuBtxC,gBAEzB3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,OAAO,gBAAC,KAAD,iBAAwB2X,EAAxB,CAAgCxX,QAAQ,gBAIxC+lD,I,GAAAA,M,wCC6JR,IAAMC,GADZrjC,YACD,GADA,cAEIlO,YAWOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAViBomD,iBAUjB,OATQC,oBASR,OARQC,eAAiB,EAQzB,KAPiBC,kBAOjB,OANQC,wBAMR,OALQC,QAAU7xC,cAKlB,KAJQ8xC,yBAIR,OAHiBr9B,qBAGjB,OAoEQs9B,kBACJ3mD,IAGA,MAAM,UAAEspB,EAAF,SAAaR,GAAuB9oB,EAAV4mD,EAAhC,YAA0C5mD,EAA1C,0BAEM6mD,IACAv9B,MAAgBtpB,EAAMyM,OAAS6B,KAAK+G,MAAMmjB,WAEhD,OACI,gBAAC,cAAD,iBACQouB,EADR,CAEIE,OAAQ,CAAE,IAAK,CAAEpL,KAAM,OACvBqL,MAAM,EACNrL,KAAMmL,EAAa,YAAQv9B,GAAc,IAIzC09B,QAASl+B,EACTm+B,gBAAgB,IAChB/f,IAAMA,IAEF54B,KAAK+3C,eAAiBnf,GAE1BggB,QAAQ,MA5FpB,KAiGQC,eAAiB,KAErB99C,IAAclG,SAASuZ,oBAEvB,MAAM5L,EAAanR,GAAa2S,cAAchE,KAAKtO,OAGnD8Q,EAAWuN,YAAY/P,KAAKtO,MAAMnC,MAElCyQ,KAAKiH,SAAS,CAAE6xC,0BAA0B,IAE1CnmC,IAAiBC,gBACb,6DACA,CACItjB,OAAQ0Q,KAAKtO,MAAMpC,OACnBE,OAAQgT,EAAWhT,OACnB6D,WAAY2M,KAAKtO,MAAMnC,OAE7BwF,KAAM8d,IAEJ,MAAMC,EAAmBD,EAAQ,iBAC7BC,GAAoBA,EAAiB/iB,OAAS,EAE9CpC,IAAIolB,WAAWD,IAKnB9d,IAAUiS,SAAS4L,EAASI,gBAC5BrH,IAAcuH,aAAaN,EAASO,kBAChCP,EAASkmC,YAETntC,IAAcotC,eACVh5C,KAAKtO,MAAMpC,OAAQujB,EAASkmC,YAEpC/4C,KAAKi5C,oBACNplC,QAAQ,IAAM9Y,IAAclG,SAASyZ,sBArI5C,KA2KQsb,OAAS,KAEb5pB,KAAKi5C,iBACLj5C,KAAKiH,SAAS,CAAEijB,WAAW,KA9K/B,KAiLQ1P,SAAW,KAEf,MAAMrc,EAAgB6B,KAAK+3C,eAAemB,UAE1CvrD,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MAElDyQ,KAAK+G,MAAMoyC,oBAEXn5C,KAAKiH,SAAS,CAAEmyC,oBAAqBj7C,IAIrC9M,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,IA7L1C,KAiMQk7C,kBAAoB,KAExBr5C,KAAKiH,SACD,CACI6xC,0BAA0B,EAC1BQ,sBAAuB,KAtMnC,KA0MQC,wBAA0B,KAE9Bv5C,KAAKg4C,iBAEL,MAAM//B,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAE7BumB,EAAkBU,aAAelW,IAAYoC,YACzCoT,EAAkBuhC,YAClBx5C,KAAK+G,MAAMoyC,qBAEfn5C,KAAKiH,SAAS,CAAEwyC,YAAY,KArNpC,KAyNQC,yBAA2B,KAE/B15C,KAAKg4C,iBAEDh4C,KAAKg4C,eAAiB,GAEtBh4C,KAAKiH,SAAS,CAAEwyC,YAAY,KA/NpC,KAmOQE,qBAAwBlrD,IAE5BA,EAAMyM,aAAaC,WAAa,OAChC1M,EAAMQ,iBACNR,EAAMO,mBAEC,GAzOX,KA4OQ4qD,mBAAsBnrD,IAG1BqE,WAAW,KAEPkN,KAAKg4C,eAAiB,EACtBh4C,KAAKiH,SAAS,CACV6xC,0BAA0B,EAC1BW,YAAY,EACZH,sBAAuB,MAI/B7qD,EAAMQ,kBAEC,GA3PX,KA8PQ4qD,iBAAoBprD,IAExBuR,KAAK85C,WAAWrrD,EAAMyM,aAAauf,OAEnChsB,EAAMQ,iBACNR,EAAMO,mBAEC,GArQX,KAwQQ+qD,eAAkBtrD,IAEtB,MAAMwrB,EAAQxrB,EAAMqmB,QAEfmF,EAAMQ,OAASR,EAAMQ,MAAM1qB,QAAU,IAK1CpC,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtDyQ,KAAK85C,WAAW7/B,EAAMQ,SAlR1B,KAqRQQ,QAAU,KAEdjb,KAAKiH,SAAS,CAAEijB,WAAW,KAvR/B,KA0SQ8vB,eAAiB,CAAC1uB,EAAY78B,KAGlC,MAAMwrD,EAAU7kB,KAAK6C,MAAOxpC,EAAMqpC,OAASrpC,EAAMspC,MAAS,IAC1D/3B,KAAKiH,SAAUQ,GAEPhZ,EAAMqpC,OAASrpC,EAAMspC,OAAS,EAEvB,CAAEuhB,sBAAuB,IAGhCW,EAAUxyC,EAAU6xC,uBAA0BW,GAAW,GAElD,CAAEX,sBAAuBW,GAG7B,KA1Tf,KA8TQC,YAAc,CAAC5uB,EAAmBrsB,KAElCqsB,EAEA39B,IAAIolB,WAAW9T,EAAO3B,IAAIhN,GAAK,UAAOg7B,EAAK/7B,KAAZ,cAAsBe,KAIrD3C,IAAIolB,WAAW9T,GAEnBe,KAAKiH,SAAS,CAAEkyC,qBAAqB,KArUrCn5C,KAAK83C,YAAL,wBAAoCnqD,IAAIiV,QACxC5C,KAAKi4C,aAAL,UAAuBj4C,KAAK83C,YAA5B,gBAEA93C,KAAK+G,MACL,CACI+xC,0BAA0B,EAC1BK,qBAAqB,EACrBjvB,WAAW,EACXiwB,YAAa,GACbb,sBAAuB,GAG3Bt5C,KAAK+a,gBAAkB/a,KAAKtO,MAAMqpB,gBAC7Bzd,IAAI0d,GAAS,WAAQA,IAAavd,KAAK,KAGxC28C,uBACJC,EAAwC/uB,GAExCvwB,IAAclG,SAASuZ,kBACnBzgB,IAAIwD,eAAe,sBAEvB6O,KAAKiH,SAAS,CAAEqyC,sBAAuB,MAEvC,MAAM92C,EAAanR,GAAa2S,cAAchE,KAAKtO,OAEnD,OAAOihB,IAAiBC,gBACpB,qEACA,CACItjB,OAAQ0Q,KAAKtO,MAAMpC,OACnBE,OAAQgT,EAAWhT,OACnB6D,WAAY2M,KAAKtO,MAAMnC,MAE3B,CACI+7B,KAAM,CAAEyT,SAAUzT,EAAK/7B,KAAMqa,KAAM0hB,EAAK1hB,MACxCi0B,kBAAmBwc,EAAexc,kBAClCE,mBAAoBsc,EAAetc,qBAEzChpC,KAAM8d,IAEJ7d,IAAUiS,SAAS4L,EAASI,gBAC5BrH,IAAcuH,aAAaN,EAASO,kBAChCP,EAASkmC,YAETntC,IAAcotC,eACVh5C,KAAKtO,MAAMpC,OAAQujB,EAASkmC,YAGhClmC,EAAS6rB,aAAa3uC,OAAS,EAE/BiQ,KAAKk6C,YAAY5uB,EAAMzY,EAAS6rB,eAIhCrtC,GAAayyB,SACT9jB,KAAKtO,MAAOsO,KAAK+G,MAAMqyC,qBAC3Bp5C,KAAKiH,SAAS,CACV6xC,0BAA0B,EAC1BK,qBAAqB,EACrBG,sBAAuB,SAGhCzlC,QAAQ,IAAM9Y,IAAclG,SAASyZ,qBAuEpCgsC,kBAEJ,IAAIC,EAAmBlpD,GAAakyB,SAASvjB,KAAKtO,OAMlD,OALIsO,KAAK+G,MAAMoyC,sBAEXoB,EAAmBv6C,KAAK+G,MAAMqyC,qBAG3BmB,EAGH9S,UAAU33C,GAEd,IAAInB,EAcJ,OATIA,EAJe0C,GAAa2S,cAAchE,KAAKtO,OAEpCiD,WAAWqL,KAAKtO,MAAMnC,MAExB,GAIA,IAAIO,GAGjBnB,EAASA,EAAO+gC,OAAO1vB,KAAK+G,MAAMozC,aAE3BxrD,EAGH6rD,mBAAmBviC,GAEvB,QAASA,EAAkB2lB,eAkHvBqb,iBAEJ,MAAMkB,EAAwB,GACxBliC,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAE5BsO,KAAKs6C,oBACFt6C,KAAKw6C,mBAAmBviC,KACrBjY,KAAK+G,MAAMoyC,qBAElBgB,EAAYzpD,KAAKsP,KAAKtO,MAAM+oD,mBAGhCz6C,KAAKiH,SAAS,CAAEkzC,gBAoCZL,WAAWr/B,GAEf,GAAqB,IAAjBA,EAAM1qB,OAON,YALAiQ,KAAKk6C,YACD,KACA,CAACvsD,IAAIwD,eAAe,wCAM5B,MAAMm6B,EAAO7Q,EAAM,GACbigC,EAAepvB,EAAK/7B,KACpB4D,EAAQunD,EAAav2C,YAAY,KACjC6W,EAAY7nB,EAAQ,EAAIunD,EAAat2C,UAAUjR,EAAQ,GAAK,GAElE,GAAI6M,KAAKtO,MAAMqpB,gBAAgBhrB,OAAS,GACjCiQ,KAAKtO,MAAMqpB,gBAAgBliB,QAAQmiB,EAAUtiB,eAAiB,EACrE,CACI,MAAMpI,EAAQ0P,KAAKtO,MAAMipD,qBAAqBrkD,QAC1C,cAAe0kB,GAGnB,YAFAhb,KAAKk6C,YAAY5uB,EAAM,CAACh7B,IAK5B,GAAgC,OAA5B0P,KAAKtO,MAAMkpD,cACRtvB,EAAK1hB,KAAO5J,KAAKtO,MAAMkpD,aAI1B,YAFA56C,KAAKk6C,YAAY5uB,EAAM,CAACtrB,KAAKtO,MAAMmpD,oBAKvC76C,KAAKiH,SACD,CACIkyC,qBAAqB,EACrB2B,qBAAsB9/B,EACtBo+B,oBAAqBjmD,EAAQ,EACvBunD,EAAat2C,UAAU,EAAGjR,GAASunD,GAE7C,KAEI16C,KAAKi5C,iBACLj5C,KAAKm4C,QAAQ99C,QAASghB,UAG9B,MAAM4iB,EAAQN,GAAgBjjB,YAC1B1a,KAAKtO,MAAMpC,OACX0Q,KAAKtO,MAAMnC,KACX,CAAC+7B,GACDtrB,KAAKg6C,eACLh6C,KAAKk6C,aAET/lD,QAAQ4mD,IAAI9c,GAAOlpC,KAAMimD,IAEjBA,EAAU,GAAGtc,aAAa3uC,QAAU,GAEpCiQ,KAAKo6C,uBAAuBY,EAAU,GAAI1vB,KAK/CjkB,oBAEHhZ,SAAS+M,KAAK/L,iBACV,YAAa2Q,KAAKu5C,yBACtBlrD,SAAS+M,KAAK/L,iBACV,YAAa2Q,KAAK05C,0BACtBrrD,SAAS+M,KAAK/L,iBAAiB,OAAQ2Q,KAAK45C,oBAG5C55C,KAAKo4C,oBAAsB33B,YAAQ,KAE/B,MAAMxI,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAE7BumB,GACGjY,KAAKk4C,qBAAuBjgC,EAAkB2lB,iBAEjD59B,KAAKk4C,mBAAqBjgC,EAAkB2lB,eAC5C59B,KAAKiH,SAAS,CAAE6xC,0BAA0B,OAK/ChnC,uBAEHzjB,SAAS+M,KAAK2C,oBACV,YAAaiC,KAAKu5C,yBACtBlrD,SAAS+M,KAAK2C,oBACV,YAAaiC,KAAK05C,0BACtBrrD,SAAS+M,KAAK2C,oBAAoB,OAAQiC,KAAK45C,oBAE/C55C,KAAKo4C,sBAGFz4C,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,GAAIwT,EAAkBU,cAAgBlW,IAAYiC,SAClD,CACI,MAAMA,EACF,gBAAC,GAAD,CACIA,UAAU,EACV6E,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjBsC,QAAQ,WAGhB,OAAIomB,EAAkBgtB,iBAGd,gBAACzvB,EAAA,EAAD,CAAkBxlB,QAASgQ,KAAKtO,MAAM+jB,kBACjC/Q,GAINA,EAGX,IAAIu2C,EAAoBhjC,EAAkBgjC,kBACtCj7C,KAAK+G,MAAMoyC,sBAEX8B,EAAoBj7C,KAAK+G,MAAM+zC,sBAEnC,MAAMP,EAAmBv6C,KAAKs6C,kBAExBY,EAAcvd,GAAgBmB,eAChC7mB,EAAkB2lB,eAClB3lB,EAAkB4lB,kBAClB0c,EAAgB,UAAMA,EAAN,YAA0BU,GAAsB,IAEpE,IAAIE,EAAwC,KAE5C,OAAQljC,EAAkBqlB,eAEtB,IAAK,SACD6d,EACI,gBAAC,GAAD,CACInmC,cAAernB,IAAIwD,eAAe,iBAClCwrC,oBAAoB,EACpBQ,IAAI,QACJl0B,OAAQ,GACRtK,KAAMu8C,EACNje,OAAQU,GAAgBkB,gBACpB5mB,EAAkB2lB,eAClB3lB,EAAkB4lB,kBAClB5lB,EAAkB8lB,mBAClB,oBACJh1B,MAAO,KAEf,MACJ,IAAK,gBACDoyC,EACI,gBAAC,GAAD,CACInmC,cAAernB,IAAIwD,eAAe,iBAClCwrC,oBAAoB,EACpB1zB,OAAQ,GACRtK,KAAMu8C,EACN57C,KAAM2Y,EAAkBmjC,kBACxBryC,MAAO,KAMvB,MAAM,EAAyB/I,KAAKtO,OAA9B,QAAEgW,GAAR,EAAoB2B,EAApB,2BAEA,GAAI4O,EAAkBU,cAAgBlW,IAAYkC,SAClD,CACI,MAAM02C,EAAuCd,EAAgB,UACpDA,EADoD,YAChCU,GACvB,IAEN,OACI,uBAAKp4C,UAAW6E,EAAQ0gC,cACpB,uBAAKvlC,UAAW6E,EAAQjY,KACpB,uBAAKoT,UAAW6E,EAAQ4zC,UACnBH,GAEL,uBAAKt4C,UAAW6E,EAAQ6zC,WACpB,2BACI,gBAAC,KAAD,CACI3pD,UAAU,MACVkZ,UAAQ,EACRnI,MAAO,CAAEU,aAAc,GACvBxR,QAAQ,WAEPwX,EAAOE,OAEZ,gBAAC,KAAD,CAAY3X,UAAU,OACjBypD,OAQ7B,MAAMG,EAAkB,CAAElrD,OAAO,EAAOsyB,WAAY,IAC9C3jB,EAAmBe,KAAKynC,UAC1BxvB,EAAkBnoB,gBAGtB,IAAI2rD,EAFJjqD,IAAIoyB,cAAc5jB,KAAMf,EAAQu8C,GAK5BC,EAFAxjC,EAAkBuhC,UAGd,gBAACpwC,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,eAC/BQ,MAAM,SACN+S,SAAU1E,KAAK+G,MAAMoyC,oBACrB75C,KAAK,eACLsV,QAAS5U,KAAK64C,eACdjvC,KAAK,UAMT,gBAACR,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,eAC/BuT,SAAU1E,KAAK+G,MAAMoyC,oBACrBxyC,KAAG,EACHiD,KAAK,QACLiL,UAAW,GAEX,gBAACxO,EAAA,EAAD,CAAM/G,KAAK,kBACX,yBACIgc,OAAQtb,KAAK+a,gBACblY,UAAW6E,EAAQg0C,UACnBngC,UAAU,EACVf,SAAUxa,KAAK+5C,eACf5f,YAAan6B,KAAKq5C,kBAClBviC,MAAOnpB,IAAIwD,eAAe,eAC1BW,KAAK,UAKrB,MAAM6pD,EAAwB37C,KAAK+G,MAAMoyC,qBAClCn5C,KAAK+G,MAAM+xC,yBACZQ,EAAwBt5C,KAAK+G,MAAMuyC,sBACnCsC,EACFtC,EAAwB,IAAMA,EAAwB,IACpD5xC,EAAQm0C,sBAAwBn0C,EAAQo0C,kBAExCC,EACF,uBAAKp5C,MAAO,CAAE0X,SAAU,aACpB,gBAAC,GAAD,CACI3V,UAAW1E,KAAKw6C,mBAAmBviC,KAC3BjY,KAAK+G,MAAMoyC,oBACnB7oD,MAAOkrD,EAAgBlrD,MACvBg1B,GAAItlB,KAAK83C,YACTxS,gBAAiB,CACb59B,QACA,CACIgB,KAAMhB,EAAQ69B,eACdC,OAAQ99B,EAAQ+9B,kBAEpB/gC,UAAU,GAEdo9B,WAAY,CACR,mBAAoB9hC,KAAKi4C,aACzBvwC,QAAS,CAAEgB,KAAMhB,EAAQuS,OACzB8qB,aACI,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAEI,WAAY,IAEpB04C,GAETO,eAAgBh8C,KAAKq4C,kBACrB3R,WAAY,CAAE1rB,UAAWigC,IAE7B1xC,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjBq6B,OAAQ5pB,KAAK4pB,OACbpP,SAAUxa,KAAKwa,SACfS,QAASjb,KAAKib,QACd+pB,SAAU/sB,EAAkBktB,gBAC5BhnC,MAAOo8C,GAAoB,GAC3B1oD,QAAQ,WAEX8pD,EACG,gBAAC,WAAD,KACI,gBAAC,KAAD,CACIj0C,QAAS,CACLu0C,gBAAiBL,EACjBlzC,KAAMhB,EAAQsqB,aAElBngC,QAAQ,cACRsM,MAAOm7C,IAEX,gBAACjzC,EAAA,EAAD,CACIqB,QAAS,CAAEgB,KAAMhB,EAAQw0C,oBACzBr5C,UAAU,uBACVvD,KAAK,sBACLqD,MAAO,CACHyX,QACIpa,KAAK+G,MAAM+xC,yBAA2B,EAAI,MAI1D,KACH94C,KAAK+G,MAAM0yC,WACR,uBACI52C,UAAS,UAAK6E,EAAQy0C,SAAb,iBACTC,WAAYp8C,KAAK25C,qBACjB0C,OAAQr8C,KAAK65C,kBAEb,gBAAC,KAAD,KACI,gBAACxzC,EAAA,EAAD,CAAM/G,KAAK,sBAAsB0D,YAAU,KAE/C,gBAAC,KAAD,CACIL,MAAO,CAAEM,SAAU,GAAIC,WAAY,QACnCrR,QAAQ,SAEPlE,IAAIwD,eAAe,SAExB,gBAAC,KAAD,CAAYwR,MAAO,CAAEM,SAAU,KAA/B,OACWtV,IAAIwD,eAAe,oBAGlC,MAIZ,OACI,uBACI0R,UAAW6E,EAAQ40C,aACnB1jB,IAAK54B,KAAKm4C,QACVtjC,SAAU7U,KAAK+G,MAAMoyC,oBAAsB,GAAK,GAEhD,uBAAKt2C,UAAW6E,EAAQjY,KACnB0rD,IAAkBn7C,KAAK+G,MAAMoyC,oBAC1B,uBAAKt2C,UAAW6E,EAAQ4zC,UACnBH,GAEL,KACJ,uBAAKt4C,UAAW6E,EAAQ6zC,WACnBQ,IAGRP,EAAgB54B,WACb,uBAAK/f,UAAW6E,EAAQjY,KACnB0rD,IAAkBn7C,KAAK+G,MAAMoyC,oBAC1B,uBAAKt2C,UAAW6E,EAAQ4zC,WACxB,KACJ,uBAAKz4C,UAAW6E,EAAQ6zC,WACpB,gBAAC,GAAD,CACIhqD,SAAUiqD,EAAgB54B,WAC1B0C,GAAItlB,KAAKi4C,aACT3nD,MAAOkrD,EAAgBlrD,MACvBuB,QAAQ,aAIpB,UA5sBpB,GAitBe8W,I,GAAAA,eAxyBCC,GAAiBC,YAC7B,CACIyyC,SACA,CACIvyC,MAAO,IAEXwyC,UACA,CACIxwC,KAAM,GAEVoxC,SACA,CACIz6B,WAAY,UAEhB46B,aACA,CACIxf,QAAS,OACTziB,SAAU,WACVtR,MAAO,QAEX2yC,UACA,CACIxhC,OAAQ,UACRjR,OAAQ,OACRkR,KAAM,EACNC,QAAS,EACTC,SAAU,WACVC,IAAK,EACLvR,MAAO,QAEXkR,MACA,CACI5P,gBAAgB,GAAD,OAAKzB,EAAM4B,QAAQ9E,KAAK,KAAxB,gBAEnB6/B,eACA,CACIx8B,MAAO,qBAEX08B,iBACA,CACI18B,MAAO,+BAEXQ,MACA,CACIR,MAAO,qBAEXoyC,cACA,CACI1xC,YAAa,IAEjBuoB,YACA,CACI3nB,gBAAiBkyC,KAAW,KAC5B3f,OAAQ,EACR3zB,OAAQ,EACRoR,SAAU,WACVtR,MAAO,QAEX+yC,kBACA,CACIzxC,gBAAiBkyC,KAAW,KAC5BC,mBAAoB,QAExBX,sBACA,CACIxxC,gBAAiBkyC,KAAW,KAC5BC,mBAAoB,MAExBpU,aACA,CACIt/B,QAAS,QAEbrZ,IACA,CACIiyB,WAAY,SACZ5Y,QAAS,OACT2zC,cAAe,OAEnBP,mBACA,CACItf,OAAQ,EACR35B,SAAU,GACVy3B,OAAO,MAstBJ/xB,CAAmBkvC,I,UCtzB3B,IAAM6E,GADZloC,YACD,GADA,MACakoC,UACTp2C,YAEA,iBACIhX,EACA6K,EACAwiD,GAGA,IAAKxiD,EAAKk8B,UAAUsmB,GAEhB,OAAO,EAGX,GAAIxiD,EAAKyiD,mBAEL,OAAO,EAGX,MAAMr4C,EAAmB7U,IAAQ8U,oBAC7BlV,EAAQ6K,EAAK0iD,iBAEjB,YAAqCv5C,IAAjCiB,EAAiBoU,aAKdpU,EAAiBoU,aAAelW,IAAYiC,SAGhD/E,SAEH,MAAM+H,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MACxCE,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAE3B,GAAIJ,EAAsBrmB,UACtBr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAOirD,GACnC,CACI,MAAM95C,EAAS,uBAAmB85C,GAClCj1C,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQ7E,IAIxC,OACI,uBAAKA,UAAW6E,EAAQjK,KAAK,MAErBpM,GAAaC,OACT0O,KAAKtO,MAAMqrD,YACX/8C,KAAKtO,MAAM6gB,iBAlDnC,GAyDe5J,I,GAAAA,eArGCC,IAEZ,MAAMo0C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,gBAAD,OAAiBL,IAC7B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,UAKzB,MAAMm0C,EAAiB,GACvB,IAAK,MAAMN,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMC,EAAcv0C,EAAMw0C,SAASjjD,KAAKkjD,QAAQV,GAEhDM,EAAer0C,EAAM0V,YAAYG,GAAGk+B,IAChC,CACInT,cAAsC,GAAvB2T,EAAYr9C,SAC3BumC,YAAsC,GAAzB8W,EAAYt9C,WACzBymC,aAAuC,GAAzB6W,EAAYt9C,WAC1BumC,WAAmC,GAAvB+W,EAAYr9C,UAIpC,MAAMnR,EAAM,aAEJ+Z,KAAK,aAEDI,QAAS,OACT8B,SAAU,EACV7B,MAAO,QACJk0C,IAEJD,GAGX,OAAOn0C,YAAala,IA6DTga,CAAmBob,aAAU24B,KC9CrC,IAAMY,GADZ9oC,YACD,GADA,MACa8oC,UACTh3C,YAEA,iBACIhX,EACAyhB,EACA4rC,GAGA,OAAO5rC,EAAMlX,MAAMzG,KACfykB,GAAK0lC,GAA0BlnB,UAAU/mC,EAAQuoB,EAAG8kC,IAGrDh9C,SAEH,MAAM+H,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MACxCE,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAE3B,GAAIQ,EAAuBjnB,UACvBr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAOirD,GACnC,CACI,MAAM95C,EAAS,uBAAmB85C,GAClCj1C,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQ7E,IAIxC,OACI,uBAAKA,UAAW6E,EAAQjK,KAAK,MAErBuC,KAAKtO,MAAMmI,MAAMyD,IAAI,CAACnD,EAAkBhH,IACpC,gBAAC,GAAD,iBACQgH,EADR,CAEI7K,OAAQ0Q,KAAKtO,MAAMpC,OACnBtB,IAAKmF,EACLof,WAAYvS,KAAKtO,MAAM6gB,oBApCnD,GA4Ce5J,I,GAAAA,eA/FCC,IAEZ,MAAMo0C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,gBAAD,OAAiBL,IAC7B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,SAKzB,MAAM00C,EAAkB,GACxB,IAAK,MAAMb,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMC,EAAcv0C,EAAMw0C,SAASjjD,KAAKkjD,QAAQV,GAC1Cc,EAAe70C,EAAMw0C,SAASrsC,MAAMssC,QAAQV,GAElDa,EAAgB50C,EAAM0V,YAAYG,GAAGk+B,IACjC,CACIt5C,aAAsC,IAAvB85C,EAAYr9C,SAC3BoD,WAAsC,IAAzBi6C,EAAYt9C,WACzB4J,YAAuC,IAAzB0zC,EAAYt9C,WAC1BkD,UAAmC,IAAvBo6C,EAAYr9C,SAExB0pC,cAAuC,GAAxBiU,EAAa39C,SAC5BumC,YAAuC,GAA1BoX,EAAa59C,WAC1BymC,aAAwC,GAA1BmX,EAAa59C,WAC3BumC,WAAoC,GAAxBqX,EAAa39C,UAIrC,MAAMnR,EAAM,aAEJ+Z,KAAK,aAEDgZ,WAAY,SACZ5Y,QAAS,OACT40C,SAAU,OACVxhB,eAAgB,WACbshB,IAEJR,GAGX,OAAOn0C,YAAala,IAgDTga,CAAmBob,aAAUu5B,KCrCrC,IAAMK,GADZnpC,YACD,GADA,MACampC,UACTr3C,YAEA,iBACIhX,EACAsuD,EACAjB,GAGA,OAAOiB,EAAQ7gC,OAAO3pB,KAClByqD,GAAKC,GAA2BznB,UAAU/mC,EAAQuuD,EAAGlB,IAGtDh9C,SAEH,MAAM+H,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MACxCE,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAE3B,GAAIa,EAAyBtnB,UACzBr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAOirD,GACnC,CACI,MAAM95C,EAAS,uBAAmB85C,GAClCj1C,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQ7E,IAMxC,OAFA6E,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAX,kBAA8B1H,KAAKtO,MAAMqsD,WAGlD,uBAAKl7C,UAAW6E,EAAQjK,KAAK,MAErBuC,KAAKtO,MAAMqrB,OAAOzf,IACd,CAACyT,EAAoB5d,IACjB,gBAAC,GAAD,iBACQ4d,EADR,CAEIzhB,OAAQ0Q,KAAKtO,MAAMpC,OACnBtB,IAAKmF,EACLof,WAAYvS,KAAKtO,MAAM6gB,oBAvCvD,GA+Ce5J,I,GAAAA,eAxGCC,IAEZ,MAAMo0C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,gBAAD,OAAiBL,IAC7B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,SAKzB,MAAMk1C,EAAoB,GAC1B,IAAK,MAAMrB,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMO,EAAe70C,EAAMw0C,SAASrsC,MAAMssC,QAAQV,GAC3B/zC,EAAMw0C,SAASQ,QAAQP,QAAQV,GAEtDqB,EAAkBp1C,EAAM0V,YAAYG,GAAGk+B,IACnC,CACIt5C,aAAuC,IAAxBo6C,EAAa39C,SAC5BoD,WAAuC,IAA1Bu6C,EAAa59C,WAC1B4J,YAAwC,IAA1Bg0C,EAAa59C,WAC3BkD,UAAoC,IAAxB06C,EAAa39C,UAIrC,MAAMnR,EAAM,aAEJ,cACA,CACIutC,eAAgB,YAEpB,iBACA,CACIA,eAAgB,UAEpB,gBACA,CACIA,eAAgB,cAEpBxzB,KAAK,aAEDgZ,WAAY,SACZ5Y,QAAS,OACT40C,SAAU,QACPM,IAEJhB,GAGX,OAAOn0C,YAAala,IAmDTga,CAAmBob,aAAU45B,K,ICnCtCM,GADLzpC,Y,GAAD,cAEIlO,YAEO3G,SAEH,MAAM8I,EAAwB,CAACzI,KAAKtO,MAAMgW,QAAQgB,MAC5Cw1C,EAA+B,CAACl+C,KAAKtO,MAAMgW,QAAQy2C,QACnDC,EAA6B,CAACp+C,KAAKtO,MAAMgW,QAAQy2C,QACjDv1C,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAC/B,CACI,MAAMuB,EAAeC,GAA6BjoB,UAC9Cr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAM6sD,MAAO5B,GACnC6B,EAAgBF,GAA6BjoB,UAC/Cr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAM+sD,OAAQ9B,GACpC+B,EAAaJ,GAA6BjoB,UAC5Cr2B,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMitD,IAAKhC,GAEjCiC,GAAiBP,EAAe,EAAI,IACnCG,EAAgB,EAAI,IACpBE,EAAa,EAAI,GAExB,GAAsB,IAAlBE,EAEA,SAKJ,GAFAn2C,EAAY/X,KAAKsP,KAAKtO,MAAMgW,QAAX,uBAAmCi1C,KAE9B,IAAlBiC,EACJ,CACI,MAAMC,EAAW,wBAAoBlC,GACrCl0C,EAAY/X,KAAKsP,KAAKtO,MAAMgW,QAAQm3C,IAEpC,SAGJ,IAAKL,EACL,CACI,MAAMM,EAAW,wBAAoBnC,GACrCl0C,EAAY/X,KAAKsP,KAAKtO,MAAMgW,QAAQo3C,IAEpC,SAGJ,MAAMC,EAAW,wBAAoBpC,GACrCl0C,EAAY/X,KAAKsP,KAAKtO,MAAMgW,QAAQq3C,IAEpC,MAAMC,EAAa,yBAAqBrC,GACnC0B,GAEDH,EAAmBxtD,KAAKsP,KAAKtO,MAAMgW,QAAQs3C,IAG1CN,GAEDN,EAAiB1tD,KAAKsP,KAAKtO,MAAMgW,QAAQs3C,IAIjD,OACI,uBAAKn8C,UAAW4F,EAAYhL,KAAK,MAC7B,uBAAKoF,UAAWq7C,EAAmBzgD,KAAK,OACxC,gBAAC,GAAD,iBACQuC,KAAKtO,MAAM6sD,MADnB,CAEIjvD,OAAQ0Q,KAAKtO,MAAMpC,OACnByuD,QAAQ,QACRxrC,WAAYvS,KAAKtO,MAAM6gB,cAE3B,gBAAC,GAAD,iBACQvS,KAAKtO,MAAM+sD,OADnB,CAEInvD,OAAQ0Q,KAAKtO,MAAMpC,OACnByuD,QAAQ,SACRxrC,WAAYvS,KAAKtO,MAAM6gB,cAE3B,gBAAC,GAAD,iBACQvS,KAAKtO,MAAMitD,IADnB,CAEIrvD,OAAQ0Q,KAAKtO,MAAMpC,OACnByuD,QAAQ,MACRxrC,WAAYvS,KAAKtO,MAAM6gB,cAE3B,uBAAK1P,UAAWu7C,EAAiB3gD,KAAK,Y,GAKvCkL,mBA/JCC,IAEZ,MAAMq2C,EAAmB,GACzB,IAAK,MAAMtC,KAAc/zC,EAAMk0C,sBAE3BmC,EAAiB,iBAAD,OAAkBtC,IAC9B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACIuC,oBAAqB,QAGjCD,EAAiB,iBAAD,OAAkBtC,IAC9B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACIuC,oBAAqB,cAGjCD,EAAiB,iBAAD,OAAkBtC,IAC9B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACIuC,oBAAqB,iBAGjCD,EAAiB,kBAAD,OAAmBtC,IAC/B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,UAGrBm2C,EAAiB,gBAAD,OAAiBtC,IAC7B,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,SAKzB,MAAMk1C,EAAoB,GAC1B,IAAK,MAAMrB,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMiC,EAAiBv2C,EAAMw0C,SAASQ,QAAQP,QAAQV,GAEtDqB,EAAkBp1C,EAAM0V,YAAYG,GAAGk+B,IACnC,CACIyC,cAAc,GAAD,OAAKD,EAAet/C,WAApB,OAIzB,MAAMlR,EAAM,aAEJ+Z,KAAK,aAEDgZ,WAAY,SACZ5Y,QAAS,QACNk1C,GAEPG,OACA,CACIr1C,QAAS,SAEVm2C,GAGX,OAAOp2C,YAAala,IA2FTga,CAAmBob,aAAUk6B,K,UC9KrC,MAAMoB,WACT/4C,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAOzB,MALM,OAAQ2X,IAEVA,EAAO+S,IAAK,GAIZ,gBAAC,KACO/S,IAKLV,mBA1BCC,GAAiBC,YAC7B,CACIH,KACA,KAuBOC,CAAmB02C,ICF3B,MAAMC,WACTh5C,gBAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQ6tD,iBAGR,OAMQ31B,OAAUn7B,IAETA,EAAMo7B,cAAcC,SAASr7B,EAAMs7B,gBAEpC/pB,KAAKiH,SAAS,CAAEijB,WAAW,KAVnC,KAcQjP,QAAWxsB,IAEVA,EAAMo7B,cAAcC,SAASr7B,EAAMs7B,gBAEpC/pB,KAAKiH,SAAS,CAAEijB,WAAW,KAlBnC,KAsBQs1B,QAAW/wD,IAEO,KAAlBA,EAAMgxD,UAEFhxD,EAAMqmB,SAAW9U,KAAKu/C,YAEtBv/C,KAAKtO,MAAMu1C,aAAa5rB,QAIxBrb,KAAKu/C,YAAalkC,SAIJ,KAAlB5sB,EAAMgxD,SACHhxD,EAAMqmB,SAAW9U,KAAKu/C,aACtBv/C,KAAKtO,MAAMukB,SAEdjW,KAAKtO,MAAMukB,WArCfjW,KAAK+G,MAAQ,CAAEmjB,WAAW,GAyCvBvqB,SAEH,OACI,uBACIkD,UAAW,UAAG7C,KAAKtO,MAAMgW,QAAQgB,MAAtB,WACD42C,GAAoBz8C,WADnB,WAED7C,KAAK+G,MAAMmjB,UACXlqB,KAAKtO,MAAMgW,QAAQg4C,QAAU,IACvC91B,OAAQ5pB,KAAK4pB,OACb3O,QAASjb,KAAKib,QACdukC,QAASx/C,KAAKw/C,QACd5mB,IAAKhhB,GAAK5X,KAAKu/C,YAAc3nC,EAC7BjV,MAAO3C,KAAKtO,MAAMiR,MAClBkS,UAAW,GAEV7U,KAAKtO,MAAMH,WAlEf+tD,GAGKz8C,UAAY,gBAoEf8F,mBAxFCC,GAAiBC,YAC7B,CACI62C,QACA,CACI,sBAAuB,CACnBhI,UAAW,cAGnBhvC,KACA,CACI2B,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,MACtCye,QAAS,OACTziB,SAAU,WACVqgB,MAAO,MA2EJ/xB,CAAmB22C,ICxE3B,MAAMK,WACTr5C,gBAQOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAPQijB,eAOR,OANiB4C,aAMjB,OALQ0vB,kBAKR,OAJQ2Y,eAAyB,EAIjC,KAHQC,sBAGR,OAmBQC,cAAgB,KAEhB9/C,KAAK+G,MAAMg5C,cAEX//C,KAAK1F,QAIL0F,KAAKiH,SAAS,CAAE84C,eAAe,KA3BvC,KAsCQ7uB,kBAAqBziC,IAEpBuR,KAAK+G,MAAMg5C,eACT//C,KAAK4/C,iBAAmBnxD,EAAMo+B,cAKrC7sB,KAAK4/C,eAAiBnxD,EAAMo+B,YAI5B/5B,WACI,KAKIkN,KAAKuX,QAAQyoC,eAAe,oBAC5BhgD,KAAKuX,QAAQyoC,eAAehgD,KAAK+G,MAAMk5C,iBAzDnD,KA6DQC,UAAankC,IAEjB/b,KAAKinC,aAAa5rB,SA/DtB,KAkEQ8kC,YAAc,CAACpkC,EAAmBG,KAEtCH,EAAKpZ,MAAMy9C,WAAa,UACxBpgD,KAAKinC,aAAa5rB,SArEtB,KAwEQglC,YAAetkC,IAEnBA,EAAKpZ,MAAMy9C,WAAa,UA1E5B,KA6EQE,kBACJ7xD,IAEA,MAAM0P,EAAgB1P,EAAMo7B,cAAc1rB,MAE1C6B,KAAKiH,SAAS,CAAEg5C,YAAa9hD,IAE7B5P,OAAO8hC,aAAarwB,KAAK6/C,kBACzB7/C,KAAK6/C,iBAAmBtxD,OAAOuE,WAC3B,KAEIkN,KAAKuX,QAAQyoC,eAAe7hD,IAEhC,MAvFJ6B,KAAKuX,QAAU7lB,EAAM6gB,WAAWC,YAAYgF,SAE5CxX,KAAK+G,MACL,CACIk5C,YAAa,GACbF,eAAe,GAGdruD,EAAM6gB,WAAWC,YAAYiH,kBAE9BzZ,KAAKuX,QAAQloB,iBACT,kBACA2Q,KAAKkxB,mBAgBT52B,QAEJ0F,KAAKuX,QAAQyoC,eAAe,IAC5BhgD,KAAKiH,SAAS,CAAEg5C,YAAa,KAC7BjgD,KAAKiH,SAAS,CAAE84C,eAAe,IA0D5BjuC,uBAEE9R,KAAKtO,MAAM6gB,WAAWC,YAAYiH,kBAEnCzZ,KAAKuX,QAAQxZ,oBACT,kBACAiC,KAAKkxB,mBAIVvxB,SAEH,MAAMw3B,EAAgBn3B,KAAKtO,MAAM6gB,WAAWC,YAAYiL,UAExD,OACI,uBACI9a,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACTuR,SAAU,aAGlB,gBAAC,GAAD,CACI+B,GAAIpc,KAAK+G,MAAMg5C,cACfvjC,QAASxc,KAAKmgD,YACdza,UAAW1lC,KAAKkgD,UAChBxjC,SAAU1c,KAAKqgD,YACf19C,MAAO,CAAEy9C,WAAY,UACrBpiC,QAAS,KAET,gBAAC,GAAD,CACIipB,aAAcjnC,KAAKinC,aACnBhxB,QAAS,KAELjW,KAAK1F,QAED0F,KAAK2U,WAEL3U,KAAK2U,UAAU0G,UAIvB,gBAAC,GAAD,CACI3W,UAAW1E,KAAK+G,MAAMg5C,cACtBzgD,KAAK,gBACLonC,WAAY,CAAE6Z,YAAY,EAAO1rC,UAAW,GAC5CwyB,SAAU7P,GAAWx3B,KAAKinC,aAAezP,EACzCjuB,MAAO5b,IAAIwD,eAAe,SAAU,aACpCqpB,SAAUxa,KAAKsgD,kBACf39C,MACI,CACIoG,MAAO/I,KAAKtO,MAAM6gB,WAAWC,YACzBiH,iBADG,uBAEwB,GAAR0d,EAAc,GAF9B,OAGD,KAEdh5B,MAAO6B,KAAK+G,MAAMk5C,YAClBpuD,QAAQ,aAIpB,gBAACuX,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,SAAU,aACzCwjB,UAAWiD,GAAK5X,KAAK2U,UAAYiD,EACjCjR,KAAG,EACHiO,QAAS5U,KAAK8/C,cACdl2C,KAAK,QACLiL,UAAW,GAEX,gBAACxO,EAAA,EAAD,CACI/G,KAAMU,KAAK+G,MAAMg5C,cACX,eAAiB,gBACvBp9C,MAAO,CAAEI,UAAW,EAAGgG,MAAO,aAOvCJ,I,GAAAA,eA9LCC,GAAiBC,YAC7B,CACIH,KACA,KA2LOC,CAAmBg3C,ICxK3B,IAAMa,GADZhsC,YACD,GADA,cAEIlO,YAWOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAViBs2B,YAAc,OAU/B,KATQy4B,iBAAmB,EAS3B,KARQC,kBAAoB,EAQ5B,KAPiBnpC,aAOjB,OANQopC,SAAmB,EAM3B,KALQC,mBAKR,OAJQC,eAIR,OAHQC,mBAGR,OA8CQC,mBAAqB,KAEzB,MAAMhwD,EAAQiP,KAAKuX,QAAQypC,wBACrBC,EAAQ7rB,KAAKqC,IAAI1mC,EAAOiP,KAAKuX,QAAQoP,uBAAyB,GAC9D3F,EAAOhhB,KAAKuX,QAAQyP,sBAAwB,EAClD,IAAIk6B,EAEJlhD,KAAK0gD,kBAAoB1gD,KAAKuX,QAAQgP,2BACtCvmB,KAAKygD,iBAAmBzgD,KAAKuX,QAAQiP,0BAEQ,IAAzCxmB,KAAKuX,QAAQsc,yBAEbqtB,EAAcvzD,IAAIwD,eACd,8BAA+B,aACnC+vD,EAAcA,EAAY5qD,QACtB,eAAgB2qD,EAAMzqD,YAC1B0qD,EAAcA,EAAY5qD,QACtB,cAAevF,EAAMyF,cAIzB0qD,EAAcvzD,IAAIwD,eACd,4DACA,aACJ+vD,EAAcA,EAAY5qD,QACtB,wBAAyB2qD,EAAMzqD,YACnC0qD,EAAcA,EAAY5qD,QACtB,uBAAwB0qB,EAAKxqB,YACjC0qD,EAAcA,EAAY5qD,QACtB,cAAevF,EAAMyF,aAGzBwJ,KAAK2gD,SAEL3gD,KAAKiH,SAAS,CAAEi6C,iBAhFxB,KAoFQC,iBAAoBvoB,IAExB54B,KAAKiH,SAAUQ,GAEPA,EAAU25C,gBAAkBxoB,EAErB,CAAEwoB,cAAexoB,GAGrB,KA7Ff,KAiGQyoB,aAAe,KAGnB,IAAIC,EADJthD,KAAK6gD,UAAY,GAKbS,EAFAthD,KAAKtO,MAAM6gB,WAAWC,YAAYiH,iBAE1B,CAAC,EAAG,EAAG,GAAI,GAAIzZ,KAAKgoB,aAIpB,CAAC,EAAG,GAAI,GAAIhoB,KAAKgoB,aAG7Bs5B,EAAMruD,QAAS2W,IAEX5J,KAAK6gD,UAAUnwD,KACX,CACI6Y,MAAOK,IAAS5J,KAAKgoB,YAAc,MAAQpe,EAAKpT,WAChDoe,QAAS,KAEL,MAAMm3B,EAAc/rC,KAAKuX,QAAQ8S,iBAEjCrqB,KAAKuX,QAAQgqC,sBAAsB33C,GACnC5J,KAAKuX,QAAQoD,0BAEToxB,GAAeA,EAAYrhB,SAAY9gB,EAAO,GAE9C5J,KAAKuX,QAAQiqC,mBAGjBhmD,IAASC,YAEbmO,YA/HZ5J,KAAK+G,MAAQ,GAEb/G,KAAKuX,QAAU7lB,EAAM6gB,WAAWC,YAAYgF,SAE5CxX,KAAKuX,QAAQgqC,sBACT7vD,EAAM6gB,WAAWC,YAAYuZ,gBAAgBr6B,EAAMqX,QACvD/I,KAAKqhD,eAELrhD,KAAKuX,QAAQloB,iBACT,oBACA2Q,KAAK+gD,oBAGLU,WAAW5qB,GAEXA,EAEA72B,KAAKuX,QAAQkP,yBAIbzmB,KAAKuX,QAAQuP,6BAGjBh0B,WAAW,KAIP,MAAMwzB,EAActmB,KAAKuX,QAAQgP,2BAC7BD,GAAe,GAAKtmB,KAAK4gD,eAEzB5gD,KAAK4gD,cAAcvlC,QAEnBiL,GAAetmB,KAAKuX,QAAQiP,0BAA4B,GACrDxmB,KAAK8gD,eAER9gD,KAAK8gD,cAAczlC,QAGvBrb,KAAKtO,MAAM6gB,WAAWC,YAAYwZ,gBA6FnC3kB,oBAEHrH,KAAK2gD,SAAU,EACf3gD,KAAK+gD,qBAGFjvC,uBAEH9R,KAAK2gD,SAAU,EACf3gD,KAAKuX,QAAQxZ,oBACT,oBACAiC,KAAK+gD,oBAGNphD,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEnBgwD,EAAQ,UAAM1hD,KAAKtO,MAAMpC,OAAjB,YAA2B0Q,KAAKtO,MAAMnC,MAC9CoyD,EAAW3hD,KAAKuX,QAAQsc,wBACxB+tB,EAAc5hD,KAAKtO,MAAM6gB,WAAWC,YAAYiH,iBAEhDooC,EACF,gBAACz4C,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,iBAC/BwjB,UAAWiD,GAAK5X,KAAK8gD,cAAgBlpC,EACrClT,SAAqC,IAA3B1E,KAAK0gD,kBACfphD,KAAK,sBACLsV,QAAS,IAAM5U,KAAKyhD,YAAW,GAC/B73C,KAAK,QACLjH,MACA,CACIO,WAAY0+C,EAAc,EAAI,GAC9Bn4C,YAAam4C,EAAc,GAAK,GAEpC/sC,UAAW,IAGnB,OACI,uBACIlS,MAAO,CACHmG,QAAS,SAGZ84C,EAAcC,EAAa,KAC5B,uBACIl/C,MAAO,CACHmG,QAAS,OACTiC,KAAM62C,EAAc,YAASt+C,EAC7B44B,eAAgB0lB,EAAc,cAAWt+C,IAG7C,gBAAC,KAAD,CACIX,MACI,CACI25B,WAAY,OACZr3B,WAAY,UAEpBpT,QAAQ,WAEPlE,IAAIwD,eAAe,iBAAkB,cAE1C,gBAACiY,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,oBAC/BwjB,UAAW3U,KAAKmhD,iBAChBt+C,UAAWwG,EAAO3B,QAAQo6C,WAC1BltC,QAAS,IACLpZ,IAAS2a,KAAKurC,EAAU1hD,KAAK+G,MAAMq6C,eACvCx3C,KAAK,QACLiL,UAAW,EACXhjB,QAAQ,QAEP8vD,IAAa3hD,KAAKgoB,YAAc,MAAQ25B,EACzC,gBAACt7C,EAAA,EAAD,CACI/G,KAAK,oBACLqD,MAAO,CAAEM,SAAU,GAAIC,WAAY,WAG3C,gBAACuzC,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAMq6C,cACrB7xD,KAAMmyD,EACNhlC,SAAU,IAAM1c,KAAK+G,MAAMq6C,cAAe/lC,QAC1ClF,MAAM,GAELnW,KAAK6gD,UAAUvjD,IAAK7E,GAGb,gBAAC,IAAD,CACIzK,IAAKyK,EAAE8Q,MACPqL,QAASnc,EAAEmc,QACX2e,SAAU96B,EAAEmR,OAAS+3C,GAEpBlpD,EAAE8Q,SAInB,gBAAC,KAAD,CACI5G,MAAO,CAAE25B,WAAY,OAAQr3B,WAAY,UACzCpT,QAAQ,WAEPmO,KAAK+G,MAAMm6C,cAGlBU,EAA2B,KAAbC,EAChB,gBAACz4C,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAC/BwjB,UAAWiD,GAAK5X,KAAK4gD,cAAgBhpC,EACrClT,SACI1E,KAAK0gD,mBAAsB1gD,KAAKygD,iBAAmB,EACvDnhD,KAAK,uBACLsV,QAAS,IAAM5U,KAAKyhD,YAAW,GAC/B73C,KAAK,QACLjH,MACI,CACIO,WAAY0+C,EAAc,GAAK,GAEvC/sC,UAAW,SAxQ/B,GA8QelM,I,GAAAA,eAlSCC,GAAiBC,YAC7B,CACIi5C,WACA,CACI7+C,SAAU,GACVgjC,WAAY,IACZC,cAAe,SACfhjC,WAAY,GACZuG,YAAa,GACbmB,SAAU,EACVy7B,YAAa,EACbC,aAAc,EACdN,cAAe,QAEnBt9B,KACA,KAmROC,CAAmB+M,cAAY8qC,KCjSvC,IAAMuB,GADZvtC,YACD,GADA,cAEIlO,YAEOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAMQswD,uBAAyB,KAE7B,MAAMxvC,EAAcxS,KAAKtO,MAAM6gB,WAAWC,YAC1CxS,KAAKiH,SACD,CACIg7C,iBAAkBzvC,EAAYiF,UAAUC,kBAAkB3nB,UARlEiQ,KAAK+G,MAAQ,CAAEk7C,iBAAkB,GAY9B56C,oBAEHrH,KAAKtO,MAAM6gB,WAAWC,YAAYgF,SAASnoB,iBACvC,mBACA2Q,KAAKgiD,wBAEThiD,KAAKgiD,yBAGFlwC,uBAEH,MAAMowC,EAAWliD,KAAKtO,MAAM6gB,WAAWC,YAAYgF,SAC/C0qC,GAEAA,EAASnkD,oBACL,mBACAiC,KAAKgiD,wBAIVriD,SAEH,OACI,gBAAC,KAAD,CAAY9N,QAAQ,SACflE,IAAIwD,eAAe,eAAgB,aAAamF,QAC7C,MAAO0J,KAAK+G,MAAMk7C,iBAAiBzrD,iBA5CvD,GAiDemS,I,GAAAA,eAzDCC,GAAiBC,YAC7B,CACIH,KACA,KAsDOC,CAAmBo5C,I,mBCP3B,IAAMI,GADZ3tC,YACD,GADA,cAEIlO,YAMOC,YAAY7U,GAEf8U,MAAM9U,GADV,KALiBomD,iBAKjB,OAJiBG,kBAIjB,OAHUxjC,cAGV,EAGIzU,KAAK83C,YAAL,wBAAoCnqD,IAAIiV,QACxC5C,KAAKi4C,aAAL,UAAuBj4C,KAAK83C,YAA5B,gBAEA93C,KAAKyU,SAAW,GAEZ,gBAAiB/iB,IAEjBsO,KAAKyU,SAAS5iB,QACVL,IAAI4wD,aAAa1wD,EAAM2wD,cAI5B1iD,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,GAC5B,IAAI/J,EAAwB,KAG5B,IAAK2Y,EAED,OAAO,KAOX,GAJAjY,KAAKyU,SAAS5R,UAAd,UAA6BwG,EAAO3B,QAAQgB,KAA5C,KAEA1I,KAAKyU,SAASljB,SAAW0mB,EAAkBqqC,aAEtC9wD,IAAI+jB,eAAelM,EAAQ4O,GAE5B,OAAO,KAGP,aAAc5O,GAAUA,EAAOtH,WAE/BzC,EACI,gBAAC,KAAD,KACI,gBAAC,IAA0BU,KAAKyU,SAC5B,gBAACpO,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAM+J,EAAOtH,SACbY,MAAO,CAAE8G,YAAa,aAM1C,MAAM84C,EAAS,eAAQviD,KAAKyU,UAM5B,OALIwD,EAAkBktB,kBAElBod,EAAU1/C,WAAV,UAA0BwG,EAAO3B,QAAQs9B,SAAzC,MAIA,2BACI,gBAAC,KAAD,CAAMwd,KAAK,UACNljD,EACD,gBAAC,KAAD,CAAUqD,MAAO,CAAEoI,KAAM,aACrB,gBAAC,IAAD,eACI03C,mBAAkBxqC,EAAkB2K,WAC9B5iB,KAAKi4C,kBAAe30C,EAC1BgiB,GAAItlB,KAAK83C,YACTn1C,MAAO,CAAEmG,QAAS,iBACdy5C,KA9CQ,MAmDvBtqC,EAAkB2K,WACf,gBAAC,IAAD,CACI/f,UAAWwG,EAAO3B,QAAQkb,WAC1B0C,GAAItlB,KAAKi4C,cAERhgC,EAAkB2K,YAEvB,UAvFpB,GA4Feja,I,GAAAA,eAtICC,GAAiBC,YAC7B,CACI65C,WACA,CACIr4C,gBAAiBzB,EAAM4B,QAAQ4T,OAAOC,MACtC5U,YAAa,EAEb,CAACb,EAAM0V,YAAYG,GAAG,OACtB,CACIvb,WAA4C,EAAhCvV,IAAIqI,SAASuL,iBACzBwB,UAA2C,EAAhCpV,IAAIqI,SAASuL,kBAE5B,CAACqH,EAAM0V,YAAYG,GAAG,OACtB,CACIvb,WAA4C,EAAhCvV,IAAIqI,SAASuL,iBACzBwB,UAA2C,EAAhCpV,IAAIqI,SAASuL,kBAE5B,CAACqH,EAAM0V,YAAYG,GAAG,OACtB,CACIvb,WAA4C,GAAhCvV,IAAIqI,SAASuL,iBACzBwB,UAA2C,EAAhCpV,IAAIqI,SAASuL,mBAGhCqhB,WACA,CACI7f,UAAW,EACXif,SAAU,KAEdgjB,SACA,CACI,UACA,CACIrzC,MAAOH,IAAI+Y,eAAe,UAC1BgY,QAAS,SAGjB7Z,KACA,KAiGOC,CAAmBw5C,IC9H3B,IAAMQ,GADZnuC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,MAAMxD,EACN,CACInV,KAAM2Y,EAAkBlW,UAGxBkW,EAAkBjD,gBAElBP,EAAS,cAAgBwD,EAAkBjD,eAG/C,IAAI/L,OAA6B3F,EAMjC,OALItD,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMkxD,aAE/B35C,EAASjJ,KAAKtO,MAAMkxD,WAAW5iD,KAAKtO,MAAMqX,QAI1C,uBAAKpG,MAAO,CAAEqC,SAAU,WACpB,gBAAC,IAAD,CACIrC,MAAO,CACHM,SAAUgG,EACVA,SACAF,MAAOE,IAGX,gBAAC5C,EAAA,EAASoO,SAtC9B,GA4Ce9L,I,GAAAA,eAjDCC,GAAiBC,YAC7B,IAgDWF,CAAmB+M,cAAYitC,KC1CvC,IAAME,GADZruC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,aAAelW,IAAYgC,OAE7C,OAAO,KAGX,MAAMnF,EACF,uBAAKuD,UAAW7C,KAAKtO,MAAMgW,QAAQ6U,WAC/B,gBAAClW,EAAA,EAAD,CACIiP,aAAY2C,EAAkBjD,cAC9BnS,UAAW7C,KAAKtO,MAAMgW,QAAQpI,KAC9BA,KAAM2Y,EAAkBlW,YAIpC,OAAI/B,KAAKtO,MAAM6X,MAGP,gBAAC,GAAD,CAAUA,MAAOvJ,KAAKtO,MAAM6X,OACvBjK,GAINA,MAnCf,GAuCeqJ,mBAvDCC,GAAiBC,YAC7B,CACI0T,UACA,CACImF,WAAY,OACZ5Y,QAAS,OACTC,MAAO,QAEXzJ,KACA,CACI2D,SAAU,GACVgG,OAAQ,UA4CLN,CAAmBk6C,I,6BCxD3B,MAAMC,WACTx8C,gBAEO3G,SACN,IAAD,EACI,MAAM8I,EAAwB,CAACzI,KAAKtO,MAAMgW,QAAQgB,MAMlD,OALI1I,KAAKtO,MAAMmR,WAEX4F,EAAY/X,KAAKsP,KAAKtO,MAAMmR,WAI5B,uBACIA,UAAW4F,EAAYhL,KAAK,KAC5Bm7B,IAAK54B,KAAKtO,MAAMqxD,aAChBpgD,MAAO,CAAEO,WAAU,UAAElD,KAAKtO,MAAMwnB,cAAb,QAAuB,IAEzClZ,KAAKtO,MAAMH,WAMboX,I,GAAAA,eAhCCC,IAAD,eAAkBC,YAC7B,CACIH,KAAK,eAAD,QAAC,EAEEE,EAAMo6C,iBAFT,uBAEG,EAAiBC,mBAFpB,aAEG,EAA8BC,QAFjC,CAGAviC,UAAW,kBA2BRhY,CAAmBw6C,aAAiBL,KCMnD,MAAM/oC,GAAaC,aAAYpR,IAAD,CAE1Bw6C,cAAgB1xD,IAAD,CAEXC,MAAOiX,EAAM4B,QAAQ9E,KAAKhU,EAAM2xD,WAAa,IAAM,KACnDnpC,OAAQ,eAST,IAAMopC,GADZ9uC,YACD,GADA,MACa8uC,UACTh9C,YAIA,sBACI5U,GAUA,MAAMgW,EAAUqS,GAAW,CAAEspC,WAAY3xD,EAAM2xD,aAE/C,OACI,gBAAC,WAAD,KACI,gBAAC,GAAD,CAAiBnqC,OAAQxnB,EAAMwnB,QAC3B,gBAAC,KAAD,CACIxR,QAAS,CAAEgB,KAAMhB,EAAQ07C,eACzBt4C,UAAQ,EACRjZ,QAAQ,SAEPH,EAAMqQ,SACH,gBAACsE,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAM5N,EAAMqQ,SACZY,MAAO,CAAE8G,YAAa,UAE1B,KACH/X,EAAMkhD,SAGblhD,EAAM2xD,WAA8B,KAAjB3xD,EAAMH,UAKvC,sBAA6BG,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,QACrBjG,EACF+F,EAAY/F,WAEV2G,EAAS3G,GAAcA,EAAW2G,OAAS3G,EAAW2G,OAAS,EAC/DqqC,IAAehxC,GAAaA,EAAWgxC,aACvCC,EAAW71D,IAAIqI,SAASuL,iBACxB8hD,EACF9qC,EAAaI,cAAgBlW,IAAYiC,UACtC++C,EAAaC,GAAkBp9C,aAChCo7C,EAAQ,UAAMppC,EAAYhpB,OAAlB,YAA4BgpB,EAAY/oB,MAkBtD,MAAMqZ,EAAe+6C,eACfC,EACFC,aAAcj7C,EAAM0V,YAAYG,GAAG,OAEvC,OAAI8kC,IAAiBK,EAGb,gBAACN,EAAWQ,eAAZ,CACIlR,OAAQr6B,EAAahP,MACrBxH,SAAUuW,EAAYvW,SACtBmX,OAAQA,EACRmqC,WAAYA,GAEXhyD,GAAaC,OACVgnB,EAAYyrC,SADf,eAGUxxC,EAHV,CAIO2G,OAAQA,EAAoB,EAAXsqC,MAOjC,gBAAC,WAAD,KACI,gBAAC,IAAD,CACI9+C,SAAU2+C,EACVthD,SAAUuW,EAAYvW,SACtBmX,OAAQA,EACRtE,QA7CK,KAET2D,EAAaI,aAAelW,IAAYmC,YAExCpJ,IAAS2a,KAAKurC,EAAU+B,IA0CpB7qB,IAAMhhB,IAtClB,IAAoBghB,KAsCmChhB,IApCxCghB,IAAQ6qB,GAEfC,EAAe9qB,KAoCP,uBAAKj2B,MAAO,CAAEmG,QAAS,OAAQiC,KAAM,SACjC,uBAAKpI,MAAO,CAAEoI,KAAM,SACfwN,EAAahP,OAElB,gBAAClD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,qBACLqD,MAAO,CAAEojC,UAAW,cAIpC,gBAAC0Q,EAAA,EAAD,CACIC,SAAU+M,EACV7jD,aAAc,CAAEC,WAAY,QAASC,SAAU,OAC/CvQ,KAAMmyD,EACNvrC,MAAM,GAEL9kB,GAAaC,OACVgnB,EAAYyrC,SADf,eAC8BxxC,EAD9B,CAC0C2G,OAAQ,OAK5D3S,YAAY7U,GAEf8U,MAAM9U,GADV,KA7HiBgwD,cA6HjB,OAOQrL,SAAW,KAEf76C,IAAS2a,KAAKnW,KAAK0hD,SAAU1hD,KAAK+G,MAAM4N,YANxC3U,KAAK+G,MAAQ,GACb/G,KAAK0hD,SAAL,UAAmBhwD,EAAMpC,OAAzB,YAAmCoC,EAAMnC,MAQrCy0D,aAAaprB,GAEbA,GAAOA,IAAQ54B,KAAK+G,MAAM4N,WAE1B3U,KAAKiH,SAAS,CAAE0N,UAAWikB,IAI5Bj5B,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAGjC,IAAIkO,EACA,CAAEC,WAAY,OAAQC,SAAU,UAChCmkD,OAAgC3gD,EAChCvB,EAA+B/B,KAAKtO,MAAMqQ,SAC1CkI,EAA8B,oBAUlC,OARgC,OAA5BgO,EAAkB1O,QAElB3J,EAAe,CAAEC,WAAY,OAAQC,SAAU,IAC/CmkD,EAAYt2D,IAAIwD,eAAe,QAC/B4Q,EAAW,oBACXkI,OAAU3G,GAIV,gBAAC,WAAD,KACI,gBAAC,EAAD,CACI0R,cAAeivC,EACflvC,YAAY,UACZzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAiB,GACjBd,UAAWiD,GAAK5X,KAAKgkD,aAAapsC,GAClCrO,MAAO0O,EAAkB1O,MACzBU,QAASA,EACTlI,SAAUA,EACVxS,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAAS5U,KAAKq2C,SACdnhC,aAAclV,KAAKtO,MAAMwjB,aACzBtL,KAAM5J,KAAKtO,MAAMkY,KACjBiL,SAAU7U,KAAKtO,MAAM6gB,YACdvS,KAAKtO,MAAM6gB,WAAW2xC,kBAAoB,EAAI,IAEzD,gBAACzN,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAM4N,UACrB/U,aAAcA,EACdysC,wBAAoB/oC,EACpB/T,KAAMyQ,KAAK0hD,SACXhlC,SAAU,IAAM1c,KAAK+G,MAAM4N,UAAW0G,QACtClF,MAAM,GAEL9kB,GAAaC,OACV0O,KAAKtO,MAAMqyD,SAAU/jD,KAAKtO,MAAM6gB,kBAnMxD,GAyMe5J,I,SAAAA,eA9MCC,GAAiBC,YAC7B,IA6MWF,CAAmBob,aAAUu/B,KCzNrC,IAAMa,GADZ3vC,aACD,MADA,MACa2vC,UACT79C,YAeA,sBAA6B5U,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OAEpBqrB,EAAiBZ,EAAY/F,YAC5B+F,EAAY/F,WAAW2G,OAASZ,EAAY/F,WAAW2G,OAAS,EACjEsqC,EAAmB71D,IAAIqI,SAASuL,iBAEtC,OACI,gBAAC,GAAWuiD,eAAZ,CACIlR,OAAQjlD,IAAIwD,eAAe,YAC3B4Q,SAAUuW,EAAY/F,WAAW6xC,eAC3B9gD,EAAY,kBAClB4V,OAAQA,EACRmqC,YAAY,GAEX11D,IAAIqI,SAASsL,mBAAmBhE,IAAIoiC,GACjC,gBAAC,IAAD,CACInuC,SAAUmuC,EAAE/uC,YACZuoB,OAAQA,EAAoB,EAAXsqC,EACjBx1D,IAAK0xC,EAAE2kB,KACPzvC,QACI,IAAMuvC,EAAeG,eAAe5kB,EAAE2kB,UAMvD99C,YAAY7U,GAEf8U,MAAM9U,GADV,KA1CQ+P,yBA0CR,OAzCQigD,cAyCR,OASQrL,SAAW,KAEf76C,IAAS2a,KAAKnW,KAAK0hD,SAAU1hD,KAAK+G,MAAMoxC,UARxCn4C,KAAK+G,MAAQ,GAEb/G,KAAKyB,oBAAsB9T,IAAIqI,SAASyL,oBACxCzB,KAAK0hD,SAAL,UAAmBhwD,EAAMpC,OAAzB,YAAmCoC,EAAMnC,MAQrCg1D,WAAW3rB,GAEXA,GAAOA,IAAQ54B,KAAK+G,MAAMoxC,SAE1Bn4C,KAAKiH,SAAS,CAAEkxC,QAASvf,IAI1Bj5B,SAEH,MAAM6kD,EAAY72D,IAAIqI,SAASsL,mBAEzBmjD,EAAiBD,EAAUrkC,KAC7Buf,GAAKA,EAAE2kB,OAASrkD,KAAKyB,qBACnBwiD,EAAoBt2D,IAAIwD,eAAe,mBAE7C,OACI,uBAAKynC,IAAKhhB,GAAK5X,KAAKukD,WAAW3sC,IAC3B,uBAAK/U,UAAW7C,KAAKtO,MAAMgW,QAAQg9C,cAC/B,gBAACrvC,EAAA,EAAD,CACIsvC,iBAAe,EACfrvC,aAAY2uC,EACZrvC,QAAS5U,KAAKq2C,SACdxhC,UAAW,GAEX,gBAACxO,EAAA,EAAD,CACI/G,KAAK,kBACLqD,MAAO,CAAEM,SAAU,OAAQwG,YAAa,UAE3Cg7C,EAAgB9zD,YACjB,gBAAC0V,EAAA,EAAD,CACI/G,KAAK,oBACLqD,MAAO,CAAEO,WAAY,YAIjC,uBAAKL,UAAW7C,KAAKtO,MAAMgW,QAAQk9C,cAC/B,gBAACx7C,EAAA,EAAD,CACIu7C,iBAAe,EACfrvC,aAAY2uC,EACZt9C,KAAG,EACHiO,QAAS5U,KAAKq2C,SACdzsC,KAAK,QACLiL,UAAW,GAEX,gBAACxO,EAAA,EAAD,CACI/G,KAAK,sBAIjB,gBAACm3C,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAMoxC,QACrBv4C,aAAc,CAAEC,WAAY,OAAQC,SAAU,UAC9CusC,wBAAoB/oC,EACpB6S,MAAM,EACN5mB,KAAMyQ,KAAK0hD,UAEV8C,EAAUlnD,IAAIoiC,GACX,gBAAC,IAAD,CACInuC,SAAUmuC,EAAE/uC,YACZ3C,IAAK0xC,EAAE2kB,KACPzvC,QACI,IAAMuvC,EAAeG,eAAe5kB,EAAE2kB,MAC1C9wB,SAAUmM,EAAE2kB,OAASrkD,KAAKyB,2BA1HtD,GAMmB6iD,eAAkBloD,IAE7BzB,KAAY1I,QAAZ,kCAC+BmK,IAC7BrH,KAAK,KAEHpH,IAAI6E,uBAZhB,YAkIemW,I,GAAAA,eAtJCC,GAAuBC,YACnC,CACI67C,aACA,CACI,CAAC97C,EAAM0V,YAAYunB,KAAK,OACxB,CACI/8B,QAAS,SAGjB87C,aACA,CACI97C,QAAS,OACT,CAACF,EAAM0V,YAAYunB,KAAK,OACxB,CACI/8B,QAAS,mBAwIVH,CAAmBw7C,IClI3B,IAAMU,GADZrwC,YACD,GADA,cAEIlO,YAEA,sBAA6B5U,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpB0qB,EAAe7mB,EAAM8mB,QAe3B,OACI,gBAAC,IAAD,CACI9T,SAAU6T,EAAaI,cAAgBlW,IAAYiC,SACnD3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAnBQ,KAER2D,EAAaI,aAAelW,IAAYmC,aAExCrW,OAAO4nB,KACHoC,EAAalgB,IACY,aAAzBigB,EAAYm0B,SAA0B,QAAU,UAEpDjxC,IAASC,WACTod,IAAOpd,cAYN8c,EAAa2mB,YAKnBv/B,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnBumB,EACFzmB,IAAIgT,oBAAoB6E,GAEtBwL,EAAmBxL,EAAOkJ,aACxBlJ,EAAOkJ,WAAW2xC,kBACf76C,EAAOkJ,WAAWuyC,iBAAmB,EAAI,EAEpD,GAA6C,SAAzCz7C,EAAO07C,YAAY/kD,KAAKtO,MAAMqX,OAClC,CACI,IAAKkP,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,IAAI9V,EAA0B,KAC9B,MAAMq2D,EACF,gBAAC3vC,EAAA,EAAD,CACI9jB,SAAU0mB,EAAkBinB,WAC5Bx6B,SACIuT,EAAkBU,aAAelW,IAAYkC,SACjD5C,SAAUsH,EAAOtH,SACjBpD,KAAMsZ,EAAkB5f,IACxBwc,SAAUA,EACVC,OAA4B,aAApBzL,EAAOojC,SAA0B,QAAU,WAY3D,OAPI99C,EAFA0a,EAAOE,MAEE,gBAAC,GAAaF,EAAS27C,GAIvBA,EAGNr2D,EAGX,IAAIo2D,OAAwDzhD,EAC5D,GAAItD,KAAKtO,MAAMqX,SAASM,EAAO07C,YAE3B,OAAQ17C,EAAO07C,YAAY/kD,KAAKtO,MAAMqX,QAElC,IAAK,eACDg8C,EAAc,QACd,MACJ,IAAK,gBACDA,EAAc,SACd,MACJ,IAAK,eACDA,EAAc,QACd,MACJ,QACI,MAAM,IAAIjgD,MAAM,6CACPuE,EAAO07C,YAAY/kD,KAAKtO,MAAMqX,SAInD,OACI,gBAAC,EAAD,CACIgM,YAAY,UACZxjB,SAAU0mB,EAAkBinB,WAC5B5vC,OAAQ+Z,EAAO/Z,OACfmmB,iBAAiB,GACjB9W,KAAMsZ,EAAkB5f,IACxB0J,SAAUsH,EAAOtH,SACjBxS,KAAM8Z,EAAO9Z,KACbqa,KAAMm7C,EACNlwC,SAAUA,EACVC,OAA4B,aAApBzL,EAAOojC,SAA0B,QAAU,eA/GnE,GAqHe9jC,I,GAAAA,eA7HCC,GAAiBC,YAC7B,CACIH,KACA,KA0HOC,CAAmB+M,cAAYmvC,KCyBvC,IAAMI,GADZzwC,YACD,GADA,cAEIlO,gBAEQ4+C,eAEJ,MAAMC,EAAwBnlD,KAAKtO,MAAM0zD,MAEnCntC,EAAoBvoB,IAAQ8U,oBAC9B2gD,EAAsBzzD,MAAMpC,OAC5B61D,EAAsBzzD,MAAMnC,MAEhC,OAAK0oB,GAKDA,EAAkBU,aAAelW,IAAYiC,SAQ9C/E,SAEH,IAAKK,KAAKklD,eAEN,OAAO,KAGX,MAAMz8C,EAAwB,CAACzI,KAAKtO,MAAMgW,QAAQgB,MAC5C28C,EAA2B,CAACrlD,KAAKtO,MAAMgW,QAAQ6a,SAE/C6xB,EAA4B,CAAC,KAAM,KAAM,KAAM,MACrD,IAAK,MAAMuI,KAAcvI,EACzB,CACI,MAAMkR,EAActlD,KAAKtO,MAAM4zD,YAAY3I,GAC3C,GAAI2I,EACJ,CACI,MAAMziD,EAAS,UAAM85C,GAAN,OAAmB2I,EAAY5sD,eAE9C+P,EAAY/X,KAAKsP,KAAKtO,MAAMgW,QAAQ7E,IACpCwiD,EAAe30D,KAAKsP,KAAKtO,MAAMgW,QAAX,UAAsB7E,EAAtB,cAI5B,MAAMuiD,EAAyB/zD,GAAaC,OACxC0O,KAAKtO,MAAM0zD,MACXplD,KAAKtO,MAAM6gB,YACT1Y,EAA2B,GACjC,IAAK,IAAIge,EAAI,EAAGA,EAAI7X,KAAKtO,MAAMmI,MAAM9J,OAAQ8nB,IAC7C,CACI,MAAM1d,EAAO6F,KAAKtO,MAAMmI,MAAMge,GAC9Bhe,EAAMnJ,KACF,uBAAK1C,IAAK6pB,GACLxmB,GAAaC,OAAO6I,EAAM6F,KAAKtO,MAAM6gB,cAIlD,MAAMgzC,EAC6C,WAA/CvlD,KAAKtO,MAAM8zD,cAAcxlD,KAAKtO,MAAMqX,OAC9B,kBACA/I,KAAKtO,MAAM8zD,cAAcxlD,KAAKtO,MAAMqX,OAE9C,OACI,gBAAC,KAAD,CAAMlG,UAAW4F,EAAYhL,KAAK,MAC9B,gBAAC,KAAD,KACK2nD,GAEL,gBAAC,KAAD,CACIviD,UAAWwiD,EAAe5nD,KAAK,KAC/BkF,MAAO,CAAEoI,KAAM,WAEf,gBAAC,IAAD,CACIwL,SAAUgvC,EACV/uC,GAAIxW,KAAKtO,MAAM+zD,kBAAX,GACJhvC,GAAIzW,KAAKtO,MAAM+zD,kBAAX,GACJ/uC,GAAI1W,KAAKtO,MAAM+zD,kBAAX,GACJ9uC,GAAI3W,KAAKtO,MAAM+zD,kBAAX,IAEH5rD,SAjFzB,GAwFe8O,I,GAAAA,eAjOCC,GAAiBC,YAC7B,CACI0Z,QACA,CACI3X,SAAU,SAEd86C,OACA,CACI,CAAC98C,EAAM0V,YAAYG,GAAG,OACtB,CACIg+B,cAAe,MACfiB,SAAU,WAGlBiI,cACA,CACI,CAAC/8C,EAAM0V,YAAYG,GAAG,OACtB,CACImnC,UAAW,SACX1iD,WAA4C,GAAhCvV,IAAIqI,SAASuL,mBAGjCskD,MACA,CACI,CAACj9C,EAAM0V,YAAYG,GAAG,OACtB,CACIiD,WAAY,SACZ+6B,cAAe,WAGvBqJ,aACA,CACI,CAACl9C,EAAM0V,YAAYG,GAAG,OACtB,CACI1b,UAA2C,GAAhCpV,IAAIqI,SAASuL,mBAGhCwkD,OACA,CACI,CAACn9C,EAAM0V,YAAYC,KAAK,OACxB,CACIk+B,cAAe,MACfiB,SAAU,WAGlBsI,cACA,CACI,CAACp9C,EAAM0V,YAAYC,KAAK,OACxB,CACIqnC,UAAW,SACX1iD,WAA4C,EAAhCvV,IAAIqI,SAASuL,mBAGjC0kD,MACA,CACI,CAACr9C,EAAM0V,YAAYC,KAAK,OACxB,CACImD,WAAY,SACZ+6B,cAAe,WAGvByJ,aACA,CACI,CAACt9C,EAAM0V,YAAYC,KAAK,OACxB,CACIxb,UAA2C,EAAhCpV,IAAIqI,SAASuL,mBAGhCmH,KACA,CACIsZ,SAAU,QAEdmkC,OACA,CACI,CAACv9C,EAAM0V,YAAYC,KAAK,OACxB,CACIk+B,cAAe,MACfiB,SAAU,WAGlB0I,cACA,CACI,CAACx9C,EAAM0V,YAAYC,KAAK,OACxB,CACIqnC,UAAW,SACX1iD,WAA4C,EAAhCvV,IAAIqI,SAASuL,mBAGjC8kD,MACA,CACI,CAACz9C,EAAM0V,YAAYC,KAAK,OACxB,CACImD,WAAY,SACZ+6B,cAAe,WAGvB6J,aACA,CACI,CAAC19C,EAAM0V,YAAYC,KAAK,OACxB,CACIxb,UAA2C,EAAhCpV,IAAIqI,SAASuL,mBAGhCglD,OACA,CACI,CAAC39C,EAAM0V,YAAYC,KAAK,OACxB,CACIk+B,cAAe,MACfiB,SAAU,WAGlB8I,cACA,CACI,CAAC59C,EAAM0V,YAAYC,KAAK,OACxB,CACIqnC,UAAW,SACX1iD,WAA4C,EAAhCvV,IAAIqI,SAASuL,mBAGjCklD,MACA,CACI,CAAC79C,EAAM0V,YAAYC,KAAK,OACxB,CACImD,WAAY,SACZ+6B,cAAe,WAGvBiK,aACA,CACI,CAAC99C,EAAM0V,YAAYC,KAAK,OACxB,CACIxb,UAA2C,EAAhCpV,IAAIqI,SAASuL,qBA8FzBoH,CAAmB+M,cAAYuvC,KC/N9C,SAAS0B,GAAY1uC,GAKjB,MAHY,sBACFA,EAAkB2uC,gBADhB,WAEF3uC,EAAkB4uC,gBAIhC,SAASC,GAAkBC,GAEvB,MAAuB,0BAAnBA,GACsB,kBAAnBA,GACmB,gBAAnBA,EAQJ,IAAMC,GADZxyC,YACD,GADA,MACawyC,UACT1gD,gBACH,eAAD,oBAmDYsO,QAAU,KAEdoyC,EAAmBC,wBAAwBjnD,KAAKtO,QApDpD,sBAA6BA,GAEzB,MAAM4mB,EAAc5mB,EAAM7D,OACpBoqB,EACFzmB,IAAIgT,oBAAoB8T,GAmB5B,OACI,gBAAC,IAAD,CACI5T,SAAUhT,EAAM8mB,QAAQG,cAAgBlW,IAAYiC,SACpD3C,SAAUuW,EAAYvW,SACtBmX,OAAQxnB,EAAM7D,OAAO0kB,WACf7gB,EAAM7D,OAAO0kB,WAAW2G,OAAS,EACvCtE,QAvBQ,KAERljB,EAAM8mB,QAAQG,aAAelW,IAAYmC,aAErCkiD,GAAkBxuC,EAAYyuC,gBAE9Bx4D,OAAO4nB,KAAKwwC,GAAY1uC,GAAoB,SAI5C+uC,EAAmBC,wBAAwB3uC,GAE/C9c,IAASC,WACTod,IAAOpd,cAYNwc,EAAkB1O,OAK/B,+BACI7X,GAGA/D,IAAIu5D,iBAAgB,GAAOnyD,KAAK,IAErB4d,IAAiBsB,kBACpB,6BAA8BviB,IACnCuD,MAAM,QAWN0K,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAIkY,OAAiDtG,EACjDtD,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMkY,OAE/BA,EAAO5J,KAAKtO,MAAMkY,KAAK5J,KAAKtO,MAAMqX,QAGtC,IAAI1Q,OAA0BiL,EAM9B,OALIwjD,GAAkB9mD,KAAKtO,MAAMq1D,kBAE7B1uD,EAAMsuD,GAAY1uC,IAIlB,gBAAC,EAAD,CACIjD,cAAehV,KAAKtO,MAAMsjB,cAC1BD,YAAa/U,KAAKtO,MAAMqjB,YACxBzlB,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7B9W,KAAMtG,EACN0J,SAAU/B,KAAKtO,MAAMqQ,SACrBwH,MAAO0O,EAAkB1O,MACzBha,KAAMyQ,KAAKtO,MAAMnC,KACjBqlB,QAASvc,OAAMiL,EAAYtD,KAAK4U,QAChCM,aAAclV,KAAKtO,MAAMwjB,aACzBtL,KAAMA,EACNiL,SAAU7U,KAAKtO,MAAM6gB,YACdvS,KAAKtO,MAAM6gB,WAAW2xC,kBAAoB,EAAI,QAzFrE,GA+Fev7C,I,GAAAA,eAvHCC,GAAiBC,YAC7B,IAsHWF,CAAmB+M,cAAYsxC,KC1D/BG,I,GAAAA,GA9Ed3yC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM2Y,EAAW,eAENtY,KAAKtO,MAAMmW,MAAMnW,MAFX,CAGT6gB,WAAYvS,KAAKtO,MAAM6gB,aAG/B,OAAQvS,KAAKtO,MAAMmW,MAAM/V,MAErB,IAAK,iBACD,OACI,gBAAC,GAAe2vB,eAAhB,CACI5zB,OAAQyqB,EACRtqB,IAAKsqB,EAAY/oB,KACjBipB,QAAS,CAAEG,YAAalW,IAAYkC,YAKpD,MAAMsT,EAAoBzmB,IAAIgT,oBAC1BxE,KAAKtO,MAAMmW,MAAMnW,OAErB,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,OAAQzE,KAAKtO,MAAMmW,MAAM/V,MAErB,IAAK,eACD,OACI,gBAAC,GAAa2vB,eAAd,CACI5zB,OAAQyqB,EACRtqB,IAAKsqB,EAAY/oB,KACjBipB,QAASP,IAGrB,IAAK,aACD,OACI,gBAAC,GAAWwJ,eAAZ,CACI5zB,OAAQyqB,EACRtqB,IAAKsqB,EAAY/oB,KACjBipB,QAASP,IAGrB,IAAK,aACD,OACI,gBAAC,GAAWwJ,eAAZ,CACI5zB,OAAQyqB,EACRtqB,IAAKsqB,EAAY/oB,KACjBipB,QAASP,IAGrB,IAAK,qBACD,OACI,gBAAC,GAAmBwJ,eAApB,CACI5zB,OAAQyqB,EACRtqB,IAAKsqB,EAAY/oB,KACjBipB,QAASP,IAGrB,QACI,MAAM,IAAInT,MAAJ,iCACwB9E,KAAKtO,MAAMmW,MAAM/V,YAxE/D,GCjBO,IAAMs1D,GADZ5yC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMpO,EAA8B,GAEpC,IAAK,MAAM81D,KAAernD,KAAKtO,MAAM41D,UAEjC/1D,EAASb,KACL,gBAAC,GAAD,CACI1C,IAAKq5D,EAAY31D,MAAMnC,KACvBsY,MAAOw/C,EACP90C,WAAYvS,KAAKtO,MAAM6gB,cAKnC,OAAO,gBAAC,WAAD,KAAiBhhB,OAlBhC,GAsBeoX,I,GAAAA,eA3BCC,GAAiBC,YAC7B,IA0BWF,CAAmBob,aAAUqjC,KC2BrC,IAAMG,GADZ/yC,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHQ81D,cAGR,OAqBQ59B,OAAUn7B,IAETA,EAAMo7B,cAAcC,SAASr7B,EAAMs7B,iBACjCt7B,EAAMo7B,cAAcC,SAASr7B,EAAMqmB,SAClC9U,KAAK+G,MAAMg6B,cAEf/gC,KAAKiH,SAAS,CAAEijB,WAAW,KA3BnC,KA+BQojB,eAAkBnvC,IAEtB6B,KAAKiH,SAAS,CAAE85B,cAAc,IAE1B/gC,KAAKtO,MAAMk2C,eAEX5nC,KAAKtO,MAAMk2C,cAAczpC,IArCjC,KAyCQyrC,eAAiB,KAErB5pC,KAAKiH,SAAS,CAAE85B,cAAc,KA3ClC,KA8CQ0mB,oBAAsB,KAE1BznD,KAAKiH,SAAS,CAAE85B,cAAc,KAhDlC,KAmDQ2mB,iBACJj5D,IAEAuR,KAAKiH,SAAS,CAAEijB,WAAW,KAtD/B,KAyDQy9B,eAAiB,KAErB3nD,KAAK4nD,oBAxDL5nD,KAAK+G,MACL,CACIg6B,cAAc,EACd7W,WAAW,EACX29B,eAAe,GAIfD,mBAEJ,MAAMvrB,EAAQr8B,KAAKwnD,SAEnBxnD,KAAKiH,SACD,CACI4gD,cAAexrB,EAAMjL,aAAeiL,EAAMqR,eA6C/CrmC,oBAEHrH,KAAK4nD,mBACLr5D,OAAOc,iBAAiB,SAAU2Q,KAAK2nD,gBAGpCpgD,mBAAmBC,EAAkBC,GAEpCD,EAAUrJ,QAAU6B,KAAKtO,MAAMyM,OAE/B6B,KAAK4nD,mBAIN91C,uBAEHvjB,OAAOwP,oBAAoB,SAAUiC,KAAK2nD,gBAGvChoD,SAEH,MAAM,EAOFK,KAAKtO,OAPH,QACFgW,EADE,WAEFg/B,EAFE,WAGF5E,EAHE,SAIFn9B,EAJE,cAKFkjC,GALJ,EAMO78B,EANP,gFASA,IAAI8+B,EAAgC,KACpC,GAAI9pC,KAAK+G,MAAM8gD,eAAiB7nD,KAAK+G,MAAMmjB,UAC3C,CACI,MAAMrnB,EAAY8B,EACZ+C,EAAQogD,sBACRpgD,EAAQqgD,cAERzoD,EAAOU,KAAK+G,MAAMmjB,YAAcvlB,EAChC,cACA,oBAENmlC,EACI,gBAAC1gC,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,gBAC/B0R,UAAWA,EACXvD,KAAMA,EACNsV,QAAS5U,KAAKynD,oBASdO,aAAchoD,KAAKynD,oBACnB79C,KAAK,UASjB,OALIjF,IAEAqG,EAAW7M,MAAQ6M,EAAW7M,MAAQ6M,EAAW7M,MAAkB,KAInE,uBAAK0E,UAAW6E,EAAQgB,KAAMkhB,OAAQ5pB,KAAK4pB,QACvC,gBAAC,GAAD,eACI8c,WAAU,aACN9N,IAAMhhB,GAAmB5X,KAAKwnD,SAAW5vC,GACtC8uB,GAEP5E,WAAU,aACNp6B,QACA,CACIuS,MAAOvS,EAAQu/B,aACfv+B,KAAMhB,EAAQ4hC,YAEfxH,GAEPiG,WAAW,EACX9sB,QAASjb,KAAK0nD,iBACd/iD,SAAUA,EACVkjC,cAAa,aACTngC,QACA,CACI6a,QAAS7a,EAAQ6hC,gBACjB7gC,KAAMhB,EAAQ0gC,cAElBF,WAAatwB,GAAsB5X,KAAKwnD,SAAW5vC,GAChDiwB,GAEP53C,KAAM,EACN6B,KAAK,QACDkZ,IAEP8+B,EACD,gBAAC,GAAD,CACIrC,UAAWz8B,EAAWy8B,UACtB7kB,WAAY5X,EAAW4X,WACvBrZ,MAAOyB,EAAWzB,MAClBu/B,SAAU9oC,KAAKstC,eACfp3B,SAAUlW,KAAK4pC,eACfzzB,KAAMnW,KAAK+G,MAAMg6B,aACjBp8B,SAAUA,EACVxG,MAAO6M,EAAW7M,aA7KtC,GAoLewK,I,GAAAA,eAnOCC,GAAiBC,YAC7B,CACIk/C,cACA,CACI1tC,SAAU,WACVqgB,MAAO,EAMPpgB,IAAK,KAETwtC,sBACA,CACIlrB,OAAQ,EACRviB,SAAU,WACVqgB,MAAO,GAEXuM,aACA,CACIh+B,OAAQ,OACRjE,SAAU,UAEdskC,UACA,CAIIrgC,OAAQ,KAEZsgC,gBACA,CACIvkC,SAAU,UAEdojC,aACA,CACItC,UAAW,KAEfp9B,KACA,CACI2R,SAAU,WACVtR,MAAO,UAyLJJ,CAAmB4+C,ICxInBU,I,GAAAA,GApFdzzC,YACD,GADA,cACgClO,YAC/B,eAAD,oBACYmhC,UAAatpC,IAEjB,MAAMoG,EACF/S,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAK6S,EAED,MAAO,GAGX,MAAMtF,EAAmB,IAAIsF,EAAiBzU,gBAM9C,OALIkQ,KAAKtO,MAAMk7C,UAAYzuC,GAASA,EAAMpO,OAASiQ,KAAKtO,MAAMk7C,UAE1D3tC,EAAOvO,KAAKsP,KAAKtO,MAAMm7C,cAGpB5tC,GAjBf,KAoBY2oC,cAAiBzpC,IAErBxQ,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,IAG/BwB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,IAAK9E,EAED,OAAO,KAGX,GAAIA,EAAiBoU,cAAgBlW,IAAYgC,OAE7C,OAAO,KAGX,GAAIF,EAAiBoU,cAAgBlW,IAAYiC,SACjD,CACI,MAAMwjD,EACF,gBAAC,GAAD,CACIxjD,UAAU,EACV6E,MAAOF,EAAOE,MACdha,KAAM8Z,EAAO9Z,KACbuC,KAAK,OACLD,QAAQ,WAIhB,OAAO0S,EAAiB0gC,iBAEhB,gBAACzvB,EAAA,EAAD,CAAkBxlB,QAASqZ,EAAOoM,kBAC7ByyC,GAGPA,EAGV,MAAM/pD,EAAQ9M,GAAakyB,SAASla,GAEpC,OACI,gBAAC,GAAD,CACIo+B,UAAWznC,KAAKynC,UAChB7kB,WAAYvZ,EAAOuZ,WACnBrZ,MAAOF,EAAOE,MACdha,KAAM8Z,EAAO9Z,KACbq4C,cAAe5nC,KAAK4nC,cACpBjjC,SACIJ,EAAiBoU,cAAgBlW,IAAYkC,SACjDqgC,SAAUzgC,EAAiB4gC,gBAC3BhnC,MAAOA,EACPtM,QAAQ,eA7ExB,G,mBCCO,IAAMs2D,GADZ3zC,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM,EAMFK,KAAKtO,OALLH,SAAU62D,EADR,UAEFx2D,EAFE,OAGFtC,EAHE,KAIFC,GAJJ,EAKOyb,EALP,wDAQA,IAAIzZ,EAAW62D,EAOf,OALI94D,GAAUC,IAEVgC,EAAWF,GAAakyB,SAASvjB,KAAKtO,QAItC,gBAAC,KAAD,eACIE,UAAWA,GACPoZ,GAEHzZ,OAzBjB,GA8BeoX,mBAtCCC,GAAiBC,YAC7B,CACIH,KACA,KAmCOC,CAAmBw/C,I,UC3C3B,MAAME,WACT/hD,gBAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAEzB,OAAO,gBAAC,KAA0B2X,IAI3BV,I,GAAAA,eAlBCC,GAAiBC,YAC7B,CACIH,KACA,KAeOC,CAAmB0/C,I,UCuB3B,IAAMC,GADZ9zC,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHU+iB,cAGV,EAGIzU,KAAKyU,SACL,CACIuO,YACI,gBAAC3c,EAAA,EAAD,CACI/G,KAAK,oBACLuD,UAAWnR,EAAMgW,QAAQpI,OAEjC3N,MAAO,UACP2N,KACI,gBAAC+G,EAAA,EAAD,CACI/G,KAAK,gBACLuD,UAAWnR,EAAMgW,QAAQpI,OAEjC2jB,iBAAkB,CAAEpgB,UAAWnR,EAAMgW,QAAQwb,SAI7CS,aAEJ3jB,KAAKyU,SAAS+F,SAAW,KAErB7sB,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOsO,KAAKtO,MAAMyM,QAGjD6B,KAAKyU,SAASgP,QACVpyB,GAAakyB,SAASvjB,KAAKtO,UAC1BsO,KAAKtO,MAAMyM,OAAS,IAEzB6B,KAAKyU,SAAStW,MAAQ9M,GAAakyB,SAASvjB,KAAKtO,OAG3CyxB,cAEN,MAAM9Z,EAAM,eAAQrJ,KAAKtO,OAEzB,IAAK2X,EAAO+Z,iBAER,OAGJ,MAAMjlB,EAAQ9M,GAAakyB,SAASla,GAC9Bk/C,EAAoBl/C,EAAOgiC,0BAA2BltC,GAEtD3O,EACF6Z,EAAM,WAAiBA,EAAM,WAAN,OAAiC,KAE5D,GAAIk/C,EACJ,CACI,IAAIC,EAAUD,EACV/4D,IAEAg5D,GAAO,WAAQh5D,IAGnBg0B,GAAUtnB,KAAKssD,OAGnB,CACI,IAAIC,EAAYp/C,EAAOkiC,oBACnB/7C,IAEAi5D,GAAS,WAAQj5D,IAGrBg0B,GAAU8nB,UAAUmd,IAIrBphD,oBAEHrH,KAAKmjB,cAGF5b,qBAEHvH,KAAKmjB,cAGFxjB,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,IAAK9E,EAED,OAAO,KAGX,IAAK/S,IAAI+jB,eAAelM,EAAQ9E,GAE5B,OAAO,KAGXvE,KAAKyU,SAAS5R,UAAd,UAA6BwG,EAAO3B,QAAQgB,KAA5C,KAEA,IAAI/F,EAA6B0G,EAAOqU,OAAS,CAAEjU,YAAa,IAAO,GAEvE,OAAIJ,EAAM,UAENrJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASgP,aAAUngB,EACxBtD,KAAKyU,SAAStW,MAAQ,GAGlB,gBAAC,GAAD,CACIulB,QAAS,gBAAC,KAAqB1jB,KAAKyU,UACpClL,MAAOF,EAAOE,MACd5G,MAAOA,KAIf0G,EAAM,UAENrJ,KAAK2jB,aAELhhB,EAAK,eAEEA,EAFF,CAGDmG,QAAS,cACT7F,SAAU,GACVq5B,WAAY,OACZj5B,aAAc,EACdN,UAAW,IAIX,gBAAC,KAAD,CACIJ,MAAOA,EACP/Q,UAAU,OAEV,gBAACyU,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAMU,KAAKyU,SAASgP,QAAU,gBAC1B,gBACJ9gB,MACI3C,KAAKyU,SAASgP,QACV,CACIxgB,SAAU,GACVwG,YAAa,IAEjB,CACI9X,MAAO0X,EAAOT,MAAM4B,QAAQ9E,KAAK,KACjC+D,YAAa,KAG7B,gBAAC,KAAD,CACIqB,UAAQ,EACRnI,MAAO,CAAEM,SAAU,GAAIq5B,WAAY,SAElCjzB,EAAOE,UAKxBvJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAK2jB,aAEDta,EAAOwa,oBAEP7jB,KAAKyU,SAAS+F,SAAW,KAErB,MAAMrc,EAAQ9M,GAAakyB,SAASvjB,KAAKtO,OAEzC/D,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOsO,KAAKtO,MAAMyM,OAE7CwU,IAAiBsB,kBACb,uBAAwBjU,KAAKtO,OAC/BuD,MAAM,KAGJ5D,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,OAM1C,gBAAC,GAAD,CACIulB,QAAS,gBAAC,KAAqB1jB,KAAKyU,UACpClL,MAAOF,EAAOE,MACd5G,MAAOA,SA/LvB,GAoMegG,I,GAAAA,eArNCC,GAAiBC,YAC7B,CACIvJ,KACA,CAEImK,aAAc,KAElByZ,OACA,CACIle,SAAU,WAEd0D,KACA,KAyMOC,CAAmBob,aAAUukC,KCpMrC,IAAMI,GADZl0C,YACD,GADA,cAEIlO,YAOOC,YACH7U,GAEA8U,MAAM9U,GADV,KAPiBomD,iBAOjB,OANiBG,kBAMjB,OALiB0Q,aAKjB,OAJUl0C,cAIV,EAGIzU,KAAK83C,YAAL,uBAAmCnqD,IAAIiV,QACvC5C,KAAKi4C,aAAL,UAAuBj4C,KAAK83C,YAA5B,gBACA93C,KAAK2oD,QAAL,UAAkB3oD,KAAK83C,YAAvB,UAEA93C,KAAKyU,SAAW,GAChBzU,KAAKyU,SAASkO,oBACV,CACI2C,GAAItlB,KAAKi4C,cAEjBj4C,KAAKyU,SAASvK,WAAY,EAGvBvK,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAC5B,IAAI1a,EAA0B,KAE9B,IAAK4V,EAED,OAAO,KAKX,GAFAvE,KAAKyU,SAAS5R,UAAd,UAA6BwG,EAAO3B,QAAQgB,KAA5C,KAEIlX,IAAI+jB,eAAelM,EAAQ9E,GAC/B,CACI,MAAM0mC,EAAU,IAAI1mC,EAAiB0mC,SACrC,GAAI1mC,EAAiBwmC,cACrB,CAMI,QAAqBznC,IAHA2nC,EAAQ9qB,KACzB+qB,GAAKA,EAAE/sC,QAAUoG,EAAiBwmC,eAGtC,CACI,MAAMI,EACN,CACIriC,QAASvE,EAAiBymC,qBAC1BI,UAAU,EACVjtC,MAAOoG,EAAiBwmC,eAG5BE,EAAQv6C,KAAKy6C,IAIrB,IAAI5hC,EAAyB,KACzBF,EAAOE,QAEPA,EACI,gBAAC,GAAD,CACI+b,GAAItlB,KAAK2oD,QACThmD,MAAO,CAAEhR,MAAO0X,EAAOT,MAAM4B,QAAQ9E,KAAK,OAEzC2D,EAAOE,QAIpB,IAAIq/C,EACA,gBAAC,GAAD,CACInG,mBAAkBziD,KAAKi4C,aACvB4Q,kBAAiB7oD,KAAK2oD,QACtBrjC,GAAItlB,KAAK83C,YACTvoD,KAAM8Z,EAAO9Z,KACbE,IAAsB,OAAjB4Z,EAAON,OAGRkiC,EAAQ3tC,IAAI,CAAC4tC,EAAG/3C,IACZ,gBAAC,GAAD,iBACQkW,EADR,CAEIrb,IAAKk9C,EAAE/sC,MAAQ+sC,EAAE/sC,MAAQ,GACzBoL,MAAO2hC,EAAEpiC,QACT4U,OAAQvqB,EAAQ83C,EAAQl7C,OAAS,EACjCoO,MAAO+sC,EAAE/sC,WAK7B,GAAIkL,EAAM,SAENrJ,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASuwB,UAAW,EACzBhlC,KAAKyU,SAASmO,WAAa,KAIvBj0B,EAFA4V,EAAgB,iBAGZ,gBAAC,GAAD,iBAAiBvE,KAAKyU,SAAtB,CAAgCvK,WAAW,IACvC,gBAACsL,EAAA,EAAD,CAAkBxlB,QAASqZ,EAAOoM,kBAC7BlM,GAEJq/C,GAML,gBAAC,GAAgB5oD,KAAKyU,SACjBlL,EACAq/C,OAKjB,CASI,GARA5oD,KAAKyU,SAAS/P,UAAW,EACzB1E,KAAKyU,SAASuwB,SAAWzgC,EAAiB4gC,gBAE1C3zC,IAAIoyB,cACA5jB,KACAuE,EAAiBzU,eACjBkQ,KAAKyU,UAELpL,EAAM,SACV,CACI,MAAMlL,EAAQ9M,GAAakyB,SAASla,EAAQ,MACtClP,EAAOoK,EAAiB0mC,QAAQ9qB,KAAK2oC,GACvCA,EAAM3qD,QAAUA,GAEpBoL,EAAQ,KAERq/C,EACI,2BACI,gBAAC,KAAD,CACIh3D,UAAU,MACVkZ,UAAQ,EACRnI,MAAO,CAAEU,aAAc,GACvBxR,QAAQ,WAEPwX,EAAOE,OAEZ,gBAAC,KAAD,CAAY3X,UAAU,OACjBuI,EAAOA,EAAK2O,QAAU,MAKvCna,EACI,gBAAC,GAAgBqR,KAAKyU,SACjBlL,EACAq/C,IAKjB,OAAOj6D,MAjKf,GAqKega,I,GAAAA,eA/KCC,GAAiBC,YAC7B,CACIH,KACA,CACI,UAAW,CAAE2B,gBAAiB,eAC9BA,gBAAiB,iBA0Kd1B,CAAmBob,aAAUrO,cAAYgzC,MC3KjD,IAAMK,GADZv0C,YACD,GADA,cAEIlO,YACH,eAAD,oBA2CYukC,SAAYp8C,IAEhB,MAAM0P,EAAQ9M,GAAakyB,SAASvjB,KAAKtO,OAEzC/D,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOjD,EAAMqmB,OAAO3W,OAE1C6B,KAAKtO,MAAMmyB,mBAKhBlR,IAAiBsB,kBACb,gCAAiCjU,KAAKtO,OACxCuD,MAAM,KAGJ5D,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,MA3DlCqtC,WAAWjzB,GAClB,IAAD,EAEI,aAAIvY,KAAKtO,MAAM6gB,kBAAf,aAAI,EAAuBC,YAC3B,CACI,MAAMs+B,EACN,CACIhoC,QAASyP,EAAayyB,qBACtB7sC,MAAOoa,EAAawyB,eAIxB,OADc/qC,KAAKtO,MAAM6gB,WAAWC,YACvBu+B,+BACT/wC,KAAKtO,MAAMnC,KACXuhD,GAGR,MAAM7F,EAAU,IAAI1yB,EAAa0yB,SAEjC,GAAI1yB,EAAawyB,cACjB,CAMI,QAAqBznC,IAHA2nC,EAAQ9qB,KACzB+qB,GAAKA,EAAE/sC,QAAUoa,EAAawyB,eAGlC,CACI,MAAMI,EACN,CACIriC,QAASyP,EAAayyB,qBACtBI,UAAU,EACVjtC,MAAOoa,EAAawyB,eAGxBE,EAAQv6C,KAAKy6C,IAIrB,OAAOF,EAwBJtrC,SACN,IAAD,EACI,IAAInQ,EAAS,MACb,UAAIwQ,KAAKtO,MAAM6gB,kBAAf,aAAI,EAAuBC,eAGvBhjB,EAASwQ,KAAKtO,MAAM6gB,WAAW/iB,QAGnC,MAAMC,EAAMC,IAAQC,IAAIqQ,KAAKtO,MAAMpC,OAAQE,GAC3C,IAAKC,EAED,OAAO,KAGX,MACM8oB,EADS9oB,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MACZM,WAEtBo7C,EAAUjrC,KAAKwrC,WAAWjzB,GAEhC,OACI,gBAACkzB,GAAA,EAAD,CACI9yB,YAAaJ,EAAaI,YAC1B7oB,eAAgByoB,EAAazoB,eAC7B4X,QAAS1H,KAAKtO,MAAMgW,QACpBpY,OAAQ0Q,KAAKtO,MAAMpC,OACnBmmB,iBAAkBzV,KAAKtO,MAAM+jB,iBAC7BmN,WAAY5iB,KAAKtO,MAAMkxB,WACvBrZ,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjBs7C,SAAU7qC,KAAK6qC,SACfI,QAASA,EACT14B,WAAYvS,KAAKtO,MAAM6gB,WACvBsR,kBAAmB7jB,KAAKtO,MAAMmyB,kBAC9BshB,gBAAiB5sB,EAAa4sB,gBAC9BF,iBAAkB1sB,EAAa0sB,uBArG/C,GA0Get8B,I,GAAAA,eAnHCC,GAAiBC,YAC7B,CACIH,KACA,CACIkC,SAAU,OA+GPjC,CAAmBogD,ICnI3B,IAAMC,GADZx0C,YACD,GADA,cAEIlO,YAKOC,YACH7U,GAEA8U,MAAM9U,GADV,KALQu3D,iBAA2C,KAKnD,KAJQ9mC,eAAyC,KAOzCzwB,EAAMu3D,mBAENjpD,KAAKipD,iBAAmB53D,GAAaC,OACjCI,EAAMu3D,iBACNv3D,EAAM6gB,aAEV7gB,EAAMywB,iBAENniB,KAAKmiB,eAAiB9wB,GAAaC,OAC/BI,EAAMywB,eACNzwB,EAAM6gB,aAIX5S,SAMH,OAAIK,KAAKtO,MAAMywB,gBAAuC,OAArBniB,KAAKtO,MAAMqX,MAGpC,gBAAC,WAAD,CAAgB/a,IAAI,YACfgS,KAAKmiB,gBAIdniB,KAAKtO,MAAMu3D,kBAAyC,OAArBjpD,KAAKtO,MAAMqX,MAGtC,gBAAC,WAAD,CAAgB/a,IAAI,cACfgS,KAAKipD,kBAQX,SAnDf,GAuDetgD,I,GAAAA,eA5DCC,GAAiBC,YAC7B,IA2DWF,CAAmB+M,cAAYszC,KCvDvC,IAAME,GADZ10C,YACD,GADA,cAEIlO,YACH,eAAD,oBACYsO,QAAU,KAEd5U,KAAKtO,MAAM6gB,WAAWgH,aAAa8mB,OAAO,OAGvC1gC,SAEH,MAAMwpD,EAAcnpD,KAAKtO,MAAM6gB,WAAWgH,aAAajB,YACjDL,EACFzmB,IAAIgT,oBAAoB2kD,GAE5B,OAAKlxC,EAKDA,EAAkBU,cAAgBlW,IAAYgC,OAEvC,KAGPwT,EAAkBU,cAAgBlW,IAAYkC,SAEvC,KAGNsT,EAAkBmxC,iBAMnB,gBAAChgD,EAAA,EAAD,CACI1E,SACIuT,EAAkBU,cAAgBlW,IAAYiC,SAClDpF,KAAK,gBACLiK,MAAO5b,IAAIwD,eAAe,UAC1ByjB,QAAS5U,KAAK4U,UATX,KAfA,SAhBnB,GA8CejM,I,GAAAA,eAnDCC,GAAiBC,YAC7B,IAkDWF,CAAmBugD,I,UCmD3B,IAAMG,GADZ70C,YACD,GADA,cAEIlO,YASOC,YAAY7U,GAEf8U,MAAM9U,GADV,KARQ43D,aAAuC,KAQ/C,KAPQ/2C,gBAOR,OANQg3C,mBAAyC,KAMjD,KALQC,aAAuC,KAK/C,KAJQC,sBAIR,OA6BQC,aAAe,KAEf1pD,KAAKypD,iBAAiBE,aAAa55D,QAAU,GAC1CiQ,KAAKypD,iBAAiBG,eAAe75D,QAAU,EAElDiQ,KAAK6pD,gBAKT7pD,KAAKiH,SAAS,CAAEuyB,eAAe,IAC/B7rC,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtDojB,IAAiBsB,kBACb,8BACAjU,KAAKtO,MACL,CACIo4D,eAAgB9pD,KAAKypD,iBAAiBE,aACtCI,iBAAkB/pD,KAAKypD,iBAAiBG,iBAE5C,GACF70D,KAAM8d,IAEAA,EAAS/iB,gBAAkB+iB,EAAS/iB,eAAeC,OAAS,IAKhEiF,IAAUge,0BACVhT,KAAKiH,SAAS,CAAE85B,cAAc,OAEjC9rC,MAAO4d,IAEJpgB,IAAQnC,MAAMuiB,GACPA,IAEVgB,QAAQ,KAEL7T,KAAKiH,SAAS,CAAEuyB,eAAe,QAlEvC,KAsEQqwB,aAAe,KAEnB70D,IAAU6+C,wBACV7zC,KAAKiH,SAAS,CAAE85B,cAAc,KAzElC,KA4EQipB,qCAAuC,KAE3C,IAAIC,EACAjqD,KAAKkqD,uCAQT,OANAD,EAAwBA,EAAsBzxD,OAC1C2xD,IAAMnqD,KAAKypD,iBAAiBG,eAAehsD,SAASusD,IAExDF,EACIA,EAAsBv6B,OAAO1vB,KAAKypD,iBAAiBE,cAEhDM,GAvFX,KA0FQC,qCAAuC,KAE3C,MAAMj6D,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAM04D,gBAEzCH,EAAkC,GACxC,IAAK,MAAMx6D,KAAOQ,EAEdg6D,EAAsBv5D,KAAKjB,EAAIkqB,cAGnC,OAAOswC,GArGX,KAgHQ1c,eAAiB,KAErBl8C,GAAag5D,cAAcrqD,KAAKtO,MAAM44D,eAAe9zD,YACrDwJ,KAAKiH,SAAS,CAAEwsC,oBAAgBnwC,IAIhCtD,KAAKupD,mBAAoBluC,SAvH7B,KA0HQua,cAAiBpmC,IAErB,MAAM2D,EAAQ6M,KAAKypD,iBAAiBG,eAAe/wD,QAAQrJ,GAC3D,GAAI2D,GAAS,EAET6M,KAAKypD,iBAAiBG,eAAer2D,OAAOJ,EAAO,QAElD,GAAI6M,KAAKypD,iBAAiBE,aAAa9wD,QAAQrJ,GAAU,EAE1D,GAAIwQ,KAAKtO,MAAM64D,eACf,CACIvqD,KAAKypD,iBAAiBE,aAAe,CAACn6D,GAEtC,MAAMskB,EACF9T,KAAKkqD,uCACLp2C,EAAgB/jB,OAAS,IACrBiQ,KAAKypD,iBAAiBG,eAAehsD,SACrCkW,EAAgB,KAEpB9T,KAAKypD,iBAAiBG,eAAel5D,KACjCojB,EAAgB,SAKxB9T,KAAKypD,iBAAiBE,aAAaj5D,KAAKlB,IAnJpD,KAwJQoqB,cAAiB0Z,IAErB3gB,IAAiBsB,kBACb,6BACAjU,KAAKtO,MACL,CAAEq4D,iBAAkBz2B,IACtBr+B,MAAO4d,IAELpgB,IAAQnC,MAAMuiB,GACPA,KAjKf,KAqKQgjB,gBAAmBrmC,IAEvB,MAAM2D,EAAQ6M,KAAKypD,iBAAiBE,aAAa9wD,QAAQrJ,GACrD2D,GAAS,EAET6M,KAAKypD,iBAAiBE,aAAap2D,OAAOJ,EAAO,GAE5C6M,KAAKypD,iBAAiBG,eAAe/wD,QAAQrJ,GAAU,GAE5DwQ,KAAKypD,iBAAiBG,eAAel5D,KAAKlB,IA9KlD,KA+OQ6wC,OAAUmqB,IAEd,IAAKxqD,KAAK+G,MAAMg6B,aAIZ,YAFA/gC,KAAKlL,WAAW01D,GAKpB,MAAMnyD,EAAM,oCACF2H,KAAKg1C,YADH,YACkBh1C,KAAKtO,MAAMpC,OAD7B,YACuC0Q,KAAKtO,MAAMnC,MACxDk7D,EAAW,CAAED,sBAEnBxqD,KAAKiH,SAAS,CAAEuyB,eAAe,IAC/B7mB,IAAiBC,gBAAgBva,OAAKiL,EAAWmnD,GAC5C11D,KAAM8d,IAECA,EAAS/iB,eAAeC,OAAS,GAEjCpC,IAAI0lB,kBAAkBR,EAAS/iB,gBAAgB,GAGnDkF,IAAUiS,SAAS4L,EAASI,gBAC5BrH,IAAcuH,aAAaN,EAASO,oBAEvCS,QAAQ,IAAM7T,KAAKiH,SAAS,CAAEuyB,eAAe,MArQlDx5B,KAAK+G,MAAQ,CAAEg6B,cAAc,EAAOvH,eAAe,GAEnDx5B,KAAKypD,iBAAmB,CAAEE,aAAc,GAAIC,eAAgB,IAE5D5pD,KAAKuS,WAAa,CACdgH,aAAc,CACVjB,YAAa,CACThpB,OAAQ0Q,KAAKtO,MAAMpC,OACnBi7D,eAAgBvqD,KAAKtO,MAAM64D,eAC3Bh7D,KAAMyQ,KAAKtO,MAAMnC,MAErBm7D,4BACI1qD,KAAKgqD,qCACTp0B,cAAe51B,KAAK41B,cACpBhc,cAAe5Z,KAAK4Z,cACpBic,gBAAiB71B,KAAK61B,gBACtBwK,OAAQrgC,KAAKqgC,SAIrBrgC,KAAKspD,aACDj4D,GAAaC,OAAOI,EAAM43D,aAActpD,KAAKuS,YACjDvS,KAAKwpD,aACDn4D,GAAaC,OAAOI,EAAM83D,aAAcxpD,KAAKuS,YA8E7CyiC,YAKJ,OAHmB3jD,GAAa2S,cAC5BhE,KAAKtO,OAESlC,OAqEdsF,WAAW01D,GAEfxqD,KAAKupD,mBAAqBl7D,SAASwgD,cACnC9zC,IAAclG,SAASuZ,oBAEvBpO,KAAKypD,iBAAiBE,aAAe,GACrC3pD,KAAKypD,iBAAiBG,eAAiB,GAEvC,MAAMe,EAAgB,wCACZ3qD,KAAKg1C,YADO,YACQh1C,KAAKtO,MAAMpC,OADnB,YAC6B0Q,KAAKtO,MAAMnC,MACxDq7D,EAAqB,CAAEJ,sBAEvBK,EACFl4C,IAAiBC,gBACb+3C,OAAernD,EAAWsnD,GAE5BN,EAAyBtqD,KAAKtO,MAAM44D,eAAe9zD,WACnDs0D,EAAgBzV,KAAoB0V,yBACtCT,GAEJt1D,IAAU0d,2BAEVve,QAAQ4mD,IAAI,CAAC8P,EAAmBC,IAAgB/1D,KAC5C,EAAE++C,EAAoByB,MAElB,MAAMziC,EAAmBghC,EAAmBhhC,iBAC5C,GAAIA,GAAoBA,EAAiB/iB,OAAS,EAK9C,OAHApC,IAAIolB,WAAWD,QACf9d,IAAUge,0BAKV8gC,EAAmBhkD,eAAeC,OAAS,GAE3CpC,IAAI0lB,kBACAygC,EAAmBhkD,gBACnB,GAGR,MAAMkN,EAAkBu4C,EAAexB,gBAEvC1iD,GAAa2iD,SAASsW,EAAgBttD,GACtCrP,IAAIsmD,YAAYj3C,GAEhBhI,IAAUiS,SAAS6sC,EAAmB7gC,gBACtCrH,IAAcuH,aAAa2gC,EAAmB1gC,kBAE9C,MAAMqgC,EAAiBpiD,GAAaC,OAChCikD,EAAerB,mBAAoBl0C,KAAKuS,YAE5CvS,KAAKiH,SAAS,CACVktC,kBAAmBoB,EAAenB,YAClCX,iBACA1S,cAAc,MAGxBltB,QAAQ,IAAM9Y,IAAclG,SAASyZ,qBA+BpC3O,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,GAAIwT,EAAkBU,cAAgBlW,IAAYiC,SAE9C,OAAIuT,EAAkBgtB,iBAGd,gBAACzvB,EAAA,EAAD,CACItL,WAAW,EACXla,QAASgQ,KAAKtO,MAAM+jB,kBAEnBzV,KAAKspD,cAKXtpD,KAAKspD,aAGhB,MAEM0B,EAAkD,IADpDp/C,IAAcwW,kBAAkBpiB,KAAKtO,MAAM04D,gBACFr6D,OAI7C,OACI,2BACI,gBAACumB,EAAA,EAAD,CAAMC,SAAS,kBAAkBC,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GACtD,gBAACC,EAAA,EAAD,CAAUJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGG,GAAI,EAAGF,GAAI,GACtC,2BAAM3W,KAAKspD,cACX,gBAACvzC,EAAA,EAAD,CACIo+B,kBAAmBn0C,KAAK+G,MAAMotC,kBAC9Bl+B,QAASjW,KAAK6pD,aACdntC,SAAU1c,KAAKutC,eACfp3B,KAAMnW,KAAK+G,MAAMg6B,cAEjB,gBAACnH,GAAA,EAAD,CACIxjB,OAAQpW,KAAK+G,MAAMyyB,cACnBib,WAAW,IAEf,gBAACp+B,EAAA,EAAD,KACI,gBAACC,EAAA,EAAD,CACIC,SAAS,kBACTC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GAEJ,gBAACC,EAAA,EAAD,CAAUJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGG,GAAI,EAAGF,GAAI,GACtC,gBAAC,KAAD,CAAY9kB,QAAQ,MACfmO,KAAKtO,MAAMu5D,cAGpB,gBAACr0C,EAAA,EAAD,CAAUJ,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGG,GAAI,EAAGF,GAAI,GACrC3W,KAAK+G,MAAM0sC,kBAIxB,gBAAC18B,EAAA,EAAD,KACI,gBAAC3N,EAAA,EAAD,CAAQwL,QAAS5U,KAAK0pD,cACjB/7D,IAAIwD,eAAe,WAExB,gBAACiY,EAAA,EAAD,CACIwL,QAAS5U,KAAK6pD,aACdlnD,MAAO,CAAEO,WAAY,KAEpBvV,IAAIwD,eAAe,cAKpC,gBAACylB,EAAA,EAAD,CACIH,GAAI,EACJD,GAAI,EACJE,GAAI,EACJ/T,MAAO,CAAEmG,QAASkiD,EAAiB,YAAS1nD,GAC5CuT,GAAI,EACJF,GAAI,GAEH3W,KAAKwpD,oBAlX9B,GA0Xe0B,I,GAAAA,gBAAmC,CAAE9X,WAAY,MAAjD8X,CACXviD,YAtZYC,IAEZ,MAAMuiD,EAAe,GACrB,IAAK,MAAMxO,KAAc/zC,EAAMs0C,mBAAmB1kD,OAAO4yD,GAAW,OAANA,GAC9D,CACI,MAAMppC,EAAWpZ,EAAMyiD,MAAMC,UAAU3O,GAEvCwO,EAAa,UAAD,OAAWxO,IACnB,CACI,CAAC/zC,EAAM0V,YAAYG,GAAGk+B,IACtB,CACI5zC,MAAOiZ,IAKvB,OAAOnZ,YAAa,eAETsiD,EAFQ,CAGXI,UACA,CACI55D,MAAOH,IAAI+Y,eAAe,eAiYtC5B,CAAmB0gD,KC1chB,IAAMmC,GADZh3C,YACD,GADA,cAEIlO,YAMOC,YACH7U,GAEA8U,MAAM9U,GADV,KANQojD,SAAsD,KAM9D,KALQviC,gBAKR,OAJQ6S,gBAIR,OA4CQsU,QAAU,IAEP/mB,IAAiBoiC,qBACpB,oCAA6B/0C,KAAKg1C,aAAlC,WACUh1C,KAAKtO,MAAMpC,OADrB,YAC+B0Q,KAAKtO,MAAMnC,OAhDlD,KA0DQmkB,aAAe,KAEnB,MAAMzjB,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzB,OAAlB9Z,KAAK80C,UAEL90C,KAAK80C,SAAS7kD,IA9DlB+P,KAAKuS,WAAL,aACIC,YACA,CACIiL,UAAW/rB,EAAM+rB,UACjBsP,QAASr7B,EAAMq7B,QACfzU,YACA,CACIwB,cAAepoB,EAAMooB,cACrBvM,KAAM7b,EAAM6b,KACZje,OAAQoC,EAAMpC,OACdC,KAAMmC,EAAMnC,MAEhB0nC,gBAAgB,EAChBvjB,aAAc,IAAM1T,KAAK0T,iBAE1BhiB,EAAM6gB,YAGbvS,KAAKolB,WAAa,CACd3H,UAAW/rB,EAAM+rB,UACjB+Q,UAAU,EACVzB,QAAS,GACTjT,cAAepoB,EAAMooB,cACrBxqB,OAAQoC,EAAMpC,OACdmjC,mBAAoB/gC,EAAMy2B,cAC1BqK,mBAAoB9gC,EAAMwwB,cAC1B0U,aAAezJ,GACXiN,GAAWxD,aAAallC,EAAMq7B,QAASI,GAC3CmJ,gBAAiB,CAACnJ,EAAeimB,IAC7BhZ,GAAW9D,gBACP5kC,EAAMq7B,QAASI,EAAOimB,GAC9B3pB,aACI2Q,GAAWqb,uBAAuB/jD,EAAMq7B,SAC5Cx9B,KAAMmC,EAAMnC,KACZgjB,WAAYvS,KAAKuS,WACjB2Z,aAAc,WACd1G,mBAAoB9zB,EAAM4wB,iBAC1B6I,YAAa2pB,GAAY90C,KAAK80C,SAAWA,GAYzCE,YAGJ,OADmB3jD,GAAa2S,cAAchE,KAAKtO,OACjClC,OAcf6X,oBAEH,IAAK,MAAMwf,KAAU7mB,KAAKtO,MAAMq7B,QAE5B/sB,KAAKolB,WAAW2H,QAAQr8B,KAAK0pC,GAAWub,aACpC9uB,EACA7mB,KAAKtO,MAAMq7B,QACX/sB,KAAKuS,aAIVhL,mBAAmBC,GAElBA,EAAUuB,QAAU/I,KAAKtO,MAAMqX,OAE/BjW,WAAW,IAAMkN,KAAK0T,gBAIvB/T,SAEH,OACI,gBAAC+gB,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC7B,uBAAKoT,MAAO,CAAE0X,SAAU,aACpB,gBAAC,GAAD,CACIP,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoqC,QAAS15B,KAAK05B,QACdhmB,aAAc1T,KAAK0T,eAEvB,gBAAC,GAAD,iBACQ1T,KAAKolB,WADb,CAEIoG,eAAgBxrB,KAAKtO,MAAMywB,eAC3BmK,SAAUtsB,KAAKtO,MAAM46B,kBA/G7C,GAsHe3jB,I,GAAAA,eA3HCC,GAAiBC,YAC7B,IA0HWF,CAAmB+M,cAAY81C,KC9HvC,IAAMC,GADZj3C,YACD,GADA,cAEIlO,YAOOC,YAAY7U,GAEf8U,MAAM9U,GADV,KANQ+tB,yBAMR,OALQq1B,SAAsD,KAK9D,KAJQviC,gBAIR,OAHQ6S,gBAGR,OA2DQ1R,aAAe,KAEnB,MAAMzjB,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzB,OAAlB9Z,KAAK80C,UAEL90C,KAAK80C,SAAS7kD,IA/DlB,MAAMspB,EAAe7nB,EAAM6gB,WAAWgH,aAEtCvZ,KAAKuS,WAAa,CACdC,YACA,CACIiL,UAAW,EACXsP,QAASr7B,EAAMq7B,QACfzU,YACA,CACIwB,cAAepoB,EAAMooB,cACrBvM,KAAM7b,EAAM6b,KACZje,OAAQiqB,EAAajB,YAAYhpB,OACjCC,KAAMgqB,EAAajB,YAAY/oB,MAEnC0nC,gBAAgB,EAChBvjB,aAAc,IAAM1T,KAAK0T,iBAIjC1T,KAAKolB,WAAa,CACd3H,UAAW,EACX+Q,UAAU,EACVzB,QAAS,GACTjT,cAAepoB,EAAMooB,cACrBxqB,OAAQiqB,EAAajB,YAAYhpB,OACjC68B,kBAAkB,EAClBsG,mBAAoB/gC,EAAMy2B,cAC1BiL,mBAAoB7Z,EAAamxC,4BACjCl4B,mBAAoB9gC,EAAMwwB,cAC1B2Q,sBAAsB,EACtB9G,gBAAiB,CACbvV,GAAI,EACJC,GAAI,EACJC,GAAI,EACJG,GAAI,EACJF,GAAI,GAERigB,aAAezJ,GACXiN,GAAWxD,aAAallC,EAAMq7B,QAASI,GAC3CmJ,gBAAiB,CAACnJ,EAAeimB,IAC7BhZ,GAAW9D,gBACP5kC,EAAMq7B,QAASI,EAAOimB,GAC9B3pB,aACI2Q,GAAWqb,uBAAuB/jD,EAAMq7B,SAC5Cx9B,KAAMgqB,EAAajB,YAAY/oB,KAC/BqmC,cAAerc,EAAaqc,cAC5BC,gBAAiBtc,EAAasc,gBAC9BtjB,WAAYvS,KAAKuS,WACjB0gB,qBAAqB,EACrB/G,aAAc3S,EAAajB,YAAYiyC,eACjC,SAAW,WACjBp/B,YAAa2pB,GAAY90C,KAAK80C,SAAWA,EACzC9hB,YAAY,GAeb3rB,oBAEH,IAAK,MAAMwf,KAAU7mB,KAAKtO,MAAMq7B,QAE5B/sB,KAAKolB,WAAW2H,QAAQr8B,KAAK0pC,GAAWub,aACpC9uB,EACA7mB,KAAKtO,MAAMq7B,QACX/sB,KAAKuS,aAGbzf,WAAW,KAEPkN,KAAKyf,oBAAsBgB,YAAQ,IAAMzgB,KAAK0T,kBAI/C5B,uBAEC9R,KAAKyf,qBAELzf,KAAKyf,sBAIN9f,SAEH,OACI,gBAAC+gB,GAAA,EAAD,KACI,gBAAC,GAAD,iBACQ1gB,KAAKolB,WADb,CAEI6P,2BAA2B,EAC3ByD,oBAAoB,EACpBpM,SAAUtsB,KAAKtO,MAAM46B,iBA/GzC,GAqHe3jB,mBA1HCC,GAAiBC,YAC7B,IAyHWF,CAAmB8iD,IChH3B,MAAMC,WACTplD,gBAEO3G,SAEH,MAAMF,EACFO,KAAKtO,MAAMuoD,QAAU,IAAMj6C,KAAKtO,MAAMuoD,QAAU,IAAM,KAAO,MAEjE,OACI,gBAAClkC,EAAA,EAAD,CACIC,YAAY,EACZ9L,WAAS,EACT+L,QAASjW,KAAKtO,MAAMukB,QACpBE,KAAMnW,KAAKtO,MAAMykB,MAEjB,gBAACE,EAAA,EAAD,CAAe1T,MAAO,CAAE6mC,cAAe,KACnC,gBAAC,KAAD,CAAY33C,QAAQ,MACflE,IAAIwD,eAAe,iBAExB,uBAAK0R,UAAW7C,KAAKtO,MAAMgW,QAAQikD,eAC/B,uBACI9oD,UAAW7C,KAAKtO,MAAMgW,QAAQkkD,cAC9BjpD,MACI,CACI65C,mBAAoB/8C,EACpBsJ,MAAM,GAAD,OAAK/I,KAAKtO,MAAMuoD,QAAhB,YAS1BtxC,I,GAAAA,eApDCC,GAAiBC,YAC7B,CACI+iD,cACA,CACIvhD,gBAAiBkyC,KAAW,KAC5BtzC,OAAQ,EACR4iD,mBAAoB,QACpBC,yBAA0B,UAE9BH,cACA,CACIthD,gBAAiBkyC,KAAW,KAC5BtzC,OAAQ,EACRlG,UAAW,GACXgG,MAAO,UAsCJJ,CAAmB+iD,IClC3B,IAAMK,GADZv3C,YACD,GADA,cAEIlO,YAUOC,YAAY7U,GAEf8U,MAAM9U,GADV,KATQsmD,eAAyB,EASjC,KARQgU,mBAQR,OAPQC,cAAe,EAOvB,KANQC,gBAAkB,EAM1B,KAJQt0B,SAAgC,IAAI7/B,IAI5C,KAHQo0D,cAAwB,EAGhC,KAiDQ5S,wBAA0B,KAE9Bv5C,KAAKg4C,iBAEDh4C,KAAKtO,MAAM06D,SAEXpsD,KAAKiH,SAAS,CAAEwyC,YAAY,KAvDpC,KA2DQC,yBAA2B,KAE/B15C,KAAKg4C,iBAEDh4C,KAAKg4C,eAAiB,GAEtBh4C,KAAKiH,SAAS,CAAEwyC,YAAY,KAjEpC,KAqEQE,qBAAwBlrD,IAE5BA,EAAMyM,aAAaC,WAAa,OAChC1M,EAAMQ,iBACNR,EAAMO,mBAEC,GA3EX,KA8EQ4qD,mBAAsBnrD,IAG1BqE,WAAW,KAEPkN,KAAKg4C,eAAiB,EACtBh4C,KAAKiH,SAAS,CAAEwyC,YAAY,MAGhChrD,EAAMQ,kBAEC,GAzFX,KA4FQ4qD,iBAAoBprD,IAExBuR,KAAKtO,MAAMgpB,YAAYjsB,EAAMyM,aAAauf,OAE1ChsB,EAAMQ,iBACNR,EAAMO,mBAEC,GAhGPgR,KAAK+G,MAAQ,CACTslD,cAAe,EACftrB,cAAc,EACd0Y,YAAY,GAGhBz5C,KAAKgsD,cAAgBM,YACjB,IAAMtsD,KAAKtO,MAAM+oB,MAAMnd,IAAKouB,IAEjB,CAAEj9B,MAAOi9B,EAAEj9B,MAAO68B,KAAMI,EAAEJ,KAAMC,OAAQG,EAAEH,UAEpD9Q,IAEOA,EAAM1qB,OAAS,GAA8B,IAAzBiQ,KAAKksD,iBAEzBlsD,KAAK43B,SAASjkC,QACdqM,KAAKmsD,cAAgB,EACjBnsD,KAAKtO,MAAM66D,sBAEXvsD,KAAKiH,SAAS,CAAE85B,cAAc,KAGZ,IAAjBtmB,EAAM1qB,QAAgBiQ,KAAKksD,gBAAkB,IAE9ClsD,KAAKtO,MAAM66D,qBAEXvsD,KAAKiH,SAAS,CAAE85B,cAAc,IAI9BhmC,IAAclG,SAASyZ,oBAG3BtO,KAAKisD,cAAe,GAGxB,IAAK,MAAM7gC,KAAY3Q,EAEnBza,KAAKqrB,eACDD,EAASE,KAAMF,EAASG,OAAQH,EAAS38B,OAGjDuR,KAAKksD,gBAAkBzxC,EAAM1qB,SAyDjCy8D,cAAcvS,GAEdA,GAAWj6C,KAAK+G,MAAMslD,gBAEtBrsD,KAAKiH,SAAS,CAAEolD,cAAepS,IAGf,MAAZA,GAEAnnD,WAAW,IAAMkN,KAAKiH,SAAS,CAAE85B,cAAc,IAAU,MAK7D1V,eACJC,EAAYC,EAAwB98B,GAEpC,OAAQ88B,GAEJ,IAAK,YACD,MAEJ,IAAK,UACD,IAAKvrB,KAAKtO,MAAM66D,uBAAyB99D,EAErC,OAGJ,IAAIwrD,EAAkB,EAGlBxrD,EAAMqpC,OAASxM,EAAK1hB,MAEpB5J,KAAK43B,SAASxoC,IAAIk8B,EAAM78B,EAAMqpC,QAGlC93B,KAAK43B,SAAS3kC,QAAS6kC,IAAamiB,GAAWniB,IAI3CmiB,EAFAxrD,EAAMqpC,OAASrpC,EAAMspC,OAAS,EAEpB,GAMN3C,KAAK6C,MAAQgiB,EAAUj6C,KAAKmsD,cAAiB,KAAQ,KAG7DnsD,KAAKwsD,cAAcvS,GACnB,MAEJ,IAAK,UACDj6C,KAAK43B,SAASxoC,IAAIk8B,EAAM,GACxBtrB,KAAKmsD,eAAiB7gC,EAAK1hB,KAC3B5J,KAAKiH,SAAS,CAAEolD,cAAe,IAC/B,MAEJ,IAAK,WACIrsD,KAAKisD,eAEFjsD,KAAKtO,MAAM66D,qBAEXvsD,KAAKwsD,cAAc,KAInBzxD,IAAclG,SAASuZ,kBACnBzgB,IAAIwD,eAAe,sBAG3B6O,KAAKisD,cAAe,IAQ7B5kD,oBAEHhZ,SAAS+M,KAAK/L,iBACV,YAAa2Q,KAAKu5C,yBACtBlrD,SAAS+M,KAAK/L,iBACV,YAAa2Q,KAAK05C,0BACtBrrD,SAAS+M,KAAK/L,iBAAiB,OAAQ2Q,KAAK45C,oBAGzC9nC,uBAEHzjB,SAAS+M,KAAK2C,oBACV,YAAaiC,KAAKu5C,yBACtBlrD,SAAS+M,KAAK2C,oBACV,YAAaiC,KAAK05C,0BACtBrrD,SAAS+M,KAAK2C,oBAAoB,OAAQiC,KAAK45C,oBAE3C55C,KAAKgsD,eAELhsD,KAAKgsD,gBAINrsD,SAEH,MAAM2kB,EAActkB,KAAKtO,MAAMkX,MAAM4B,QAAQ9E,KAAK,KAC5C+mD,EAAazsD,KAAKtO,MAAM06D,UAAYz+D,IAAI+S,SACxCuqB,EAC4D,IAA9Drf,IAAcwW,kBAAkBpiB,KAAKtO,MAAMpC,QAAQS,OAEvD,OACI,gBAAC,WAAD,KACKiQ,KAAK+G,MAAM0yC,WACR,uBACI52C,UAAU,eACVu5C,WAAYp8C,KAAK25C,qBACjB0C,OAAQr8C,KAAK65C,kBAEb,gBAAC,KAAD,CACIh3C,UAAU,uBACVjR,UAAU,MACV+Q,MACI,CACI+e,WAAY,SACZ5Y,QAAS,OACT2zC,cAAe,SACf/+B,OAAQ,YAEhB7rB,QAAQ,MAER,gBAAC,KAAD,CACI8Q,MAAO,CAAEU,aAAc,IACvBxR,QAAQ,MAER,gBAACwU,EAAA,EAAD,CAAM/G,KAAK,yBAEd3R,IAAIwD,eAAe,0BAG5B,KACJ,uBACIwR,MACI,CACI+pD,aAAczhC,EAAO,oBACF3G,GAAgB,MACnCqoC,UAAU,aAAD,OAAeroC,GACxBxb,QAAS2jD,EAAa,OAAS,SAGvC,uBACI5pD,UAAU,iBACVF,MAAO,CAAEsG,OAAQgiB,EAAU,GAAK,KAEhC,gBAAC,KAAD,KACI,gBAAC5kB,EAAA,EAAD,CAAM/G,KAAK,sBAAsB0D,YAAU,KAE/C,gBAAC,KAAD,CACIL,MAAO,CAAEM,SAAU,GAAIC,WAAY,QACnCrR,QAAQ,SAEPlE,IAAIwD,eAAe,gBAExB,gBAAC,KAAD,CAAYwR,MAAO,CAAEM,SAAU,KAA/B,OACWtV,IAAIwD,eAAe,sBAItC,gBAAC,GAAD,CACI8kB,QAAS,IAAMjW,KAAKiH,SAAS,CAAE85B,cAAc,IAC7C5qB,KAAMnW,KAAK+G,MAAMg6B,aACjBkZ,QAASj6C,KAAK+G,MAAMslD,qBA3RxC,GAkSe1jD,I,MAAAA,eAvSCC,GAAiBC,YAC7B,IAsSWF,CAAmBob,aAAUgoC,K,ICjSvBa,I,GAAN,MAWXrmD,YACIuT,EACA+yC,EAEAC,EACAC,GAEH,KAhBOF,oBAgBR,OAdQ/yC,mBAcR,OAbQgzC,gBAaR,OAXQC,oBAWR,yCACI/sD,KAAK8Z,cAAgBA,EACrB9Z,KAAK6sD,eAAiBA,EACtB7sD,KAAK8sD,WAAaA,EAClB9sD,KAAK+sD,eAAiBA,EAGlBC,iBAEJhtD,KAAKitD,UAAUl9D,OAAS,EAGpBmqD,YAAY5uB,EAAYrsB,GAE5BqsB,EAAI,UAAe,EAEnB39B,IAAIolB,WAAW9T,EAAO3B,IAAIhN,GAAK,UAAOg7B,EAAK/7B,KAAZ,cAAsBe,KAErDsK,IAAoBif,UAAU7Z,KAAK8Z,cAAewR,EAAI,QAEtDtrB,KAAK+sD,iBAGD1hC,eAAeC,EAAY78B,GAE/B,MAAMy+D,EAAWltD,KAAKitD,UAAU9sC,KAAKuL,GAAKA,EAAEJ,OAASA,GACjD4hC,IAEAA,EAAS3hC,OAAS,UAClB2hC,EAASz+D,MAAQA,GAIzB,kBACIa,EACA+D,EACAonB,GAGA,GAAIA,EAAM1qB,QAAU,EAEhB,OAGJgL,IAAclG,SAASuZ,oBAEvB,MAAMgd,EAAqB,GAE3B,IAAK,MAAME,KAAQ7Q,EAEf2Q,EAAS16B,KACL,CACIquC,SAAUzT,EAAK/7B,KACfqa,KAAM0hB,EAAK1hB,OAIvB,OAAO5J,KAAK8sD,WAAW1hC,GAAUr2B,KAC7Bo4D,IAIA,GAFApyD,IAAclG,SAASyZ,oBAEnB6+C,EAAer6C,iBAAiB/iB,OAAS,EAIzC,YAFApC,IAAIolB,WAAWo6C,EAAer6C,kBAKlC,MAAMtF,EAAaxT,IAAeC,OAAOtK,IACrCqQ,KAAK8Z,eACHszC,EAA8B,GAC9BC,EAAqBF,EAAeE,QACpC3uB,EAAuByuB,EAAc,qBAC3C,IAAIG,EAEJt4D,IAAUiS,SAASkmD,EAAel6C,gBAClCrH,IAAckB,mBAId,MAAMygD,EAAW,IAAIx1D,IACrB,IAAK,IAAI5E,EAAQsnB,EAAM1qB,OAAS,EAAGoD,GAAS,EAAGA,IAE3Ci6D,EAAU18D,KAAKsJ,IAAe1I,OAC1Bkc,EAAWiB,UAAWjB,EAAWle,OAAQ+9D,EAAQl6D,KAGzDqa,EAAWpO,WAAWguD,GACtB5/C,EAAWZ,qBAAsBxN,WAAWguD,GAC5CptD,KAAK+sD,iBAELtyC,EAAMxnB,QAAQ,CAACq4B,EAAMn4B,KAEjBm6D,EAASD,EAAQl6D,GACjBo6D,EAASn+D,IAAIk+D,EAAO99D,OAAQ87B,GAC5BA,EAAI,OAAagiC,EAAO99D,SAG5B,IAAK,MAAMA,KAAUoE,OAAOC,KAAK6qC,GAEzBA,EAAalvC,GAAQO,QAAUw9D,EAASn/D,IAAIoB,IAE5CwQ,KAAKk6C,YACDqT,EAAS59D,IAAIH,GACbkvC,EAAalvC,IAIzB,GAAIirB,EAAM+yC,MAAOliC,GAAkBA,EAAI,UAInC,YAFAtrB,KAAKgtD,iBAKT,IAAK,MAAM1hC,KAAQ7Q,EAEfza,KAAKitD,UAAUv8D,KAAK,CAAE46B,OAAMC,OAAQ,YAGxC,MAAM0S,EACFN,GAAgBjjB,YACZprB,EACA+D,EACAonB,EACA,CAAC6Q,EAAYmiC,KACXztD,KAAKqrB,eAAeC,EAAMmiC,IAC5B,CAACniC,EAAYrsB,KACXe,KAAKk6C,YAAY5uB,EAAMrsB,KAEjC,OAAO9K,QAAQ4mD,IAAI9c,GAAOlpC,KAAM24D,IAE5B,MAAMC,EAA0B,GAEhCD,EAAgBz6D,QAASurC,IAEjB+uB,EAASn/D,IAAIowC,EAAaG,aACtB4uB,EAAS59D,IAAI6uC,EAAaG,WAA1B,UAEJgvB,EAAcj9D,KACV,CACImtC,kBACIW,EAAaX,kBACjBE,mBACIS,EAAaT,mBACjBvuC,OAAQgvC,EAAaG,cAKrC,IAAK,MAAMrT,KAAQ7Q,EACnB,CACI,MAAMyyC,EAAWltD,KAAKitD,UAAU9sC,KAAKuL,GAAKA,EAAEJ,OAASA,GACjD4hC,IAEAA,EAAS3hC,OAAS,YAI1B,OAAOvrB,KAAK6sD,eAAec,GAAe54D,KACtC64D,IAEA,MAAM3uD,EACF2uD,EAAiBC,qBAErB74D,IAAUiS,SAAS2mD,EAAiB36C,gBAEpCrH,IAAcuH,aAAay6C,EAAiBx6C,kBAE5C,IAAK,MAAMkY,KAAQ7Q,EAEf,GAAI6Q,EAAI,UAAcrsB,GACfA,EAAOqsB,EAAI,QAAYv7B,OAE1BiQ,KAAKk6C,YAAY5uB,EAAMrsB,EAAOqsB,EAAI,cAEjC,IAAKA,EAAI,SACd,CACI,MAAM4hC,EACFltD,KAAKitD,UAAU9sC,KAAKuL,GAAKA,EAAEJ,OAASA,GACpC4hC,IAEAA,EAAS3hC,OAAS,aAK9BvrB,KAAKgtD,mBACN/3D,MAAM,KAEL+K,KAAKgtD,qBAEV/3D,MAAM,KAEL+K,KAAKgtD,qBAEV/3D,MAAM,KAEL+K,KAAKgtD,qB,yCAhNZxqD,K,wEAA0C,M,WCgCxC,IAAMsrD,GADZt5C,YACD,GADA,cAEIlO,YAUOC,YACH7U,GAEA8U,MAAM9U,GADV,KATQq8D,mBASR,OARQjZ,SAAsD,KAQ9D,KAPQviC,gBAOR,OANQsZ,sBAMR,OALQjY,iBAKR,OAJQwR,gBAIR,OA+DQynC,eAAkBc,GAEfh7C,IAAiBC,gBACpB,mDAA4C5S,KAAKg1C,aAAjD,WACUh1C,KAAKtO,MAAMpC,OADrB,YAC+B0Q,KAAKtO,MAAMnC,WAC1C+T,EACA,CAAEqqD,kBArEV,KAyEQb,WAAc1hC,GAEXzY,IAAiBC,gBACpB,+CAAwC5S,KAAKg1C,YAA7C,eACSh1C,KAAKtO,MAAMpC,OADpB,YAC8B0Q,KAAKtO,MAAMnC,WACzC+T,EACA,CAAE8nB,aA/EV,KAmFQsO,QAAU,IAEP/mB,IAAiBoiC,qBACpB,wCAAiC/0C,KAAKg1C,aAAtC,WACUh1C,KAAKtO,MAAMpC,OADrB,YAC+B0Q,KAAKtO,MAAMnC,OAvFlD,KA2FQwhD,+BAAiC,CACrC19C,EACAy9C,KAGA,MAAMrhD,EAAMC,IAAQC,IAAIqQ,KAAKtO,MAAMpC,QACnC,IAAKG,EAED,MAAO,GAGX,MAGMw7C,EACF,IAJWx7C,EAAIG,UAAUoQ,KAAKtO,MAAMnC,MACZM,WAIJm+D,4BAA4B7tC,KACxC+qB,GAAKA,EAAE37C,OAAS8D,GAAa43C,SAGzC,GAAI6F,EAAe3yC,MACnB,CAII,QAAqBmF,IAHA2nC,EAAQ9qB,KACzB+qB,GAAKA,EAAE/sC,QAAU2yC,EAAe3yC,OAGpC,CACI,MAAMgtC,EAAc,eAAQ2F,GAC5B3F,EAAeC,UAAW,EAC1BH,EAAQv6C,KAAKy6C,IAIrB,OAAOF,GA5HX,KAqIQqC,eAAkBh2B,GAEf3E,IAAiBC,gBACpB,0CAAmC5S,KAAKg1C,aAAxC,WACUh1C,KAAKtO,MAAMpC,OADrB,YAC+B0Q,KAAKtO,MAAMnC,WAC1C+T,EACA,CAAE6xC,aAAc79B,IA3IxB,KA+IQ22C,cAAiB5Z,IAEjBA,GAAYr0C,KAAK+G,MAAM2uC,eAAgB/B,qBAEvC3zC,KAAK4T,YAAa5T,KAAK+G,MAAM2uC,eAAgBlmD,QAGjDwQ,KAAKiH,SAAS,CAAEyuC,oBAAgBpyC,KAtJpC,KAyJQ2xC,aAAgB39B,IAEpB,MAAMhD,EAAWtU,KAAKtO,MAAMw8D,eAAgB13D,WAEtCs0D,EAAgBzV,KAAoBC,mBAAmBhhC,GAEvDu2C,EACFl4C,IAAiBC,gBACb,yCAAkC5S,KAAKg1C,aAAvC,WACMh1C,KAAKtO,MAAMpC,OADjB,YAC2B0Q,KAAKtO,MAAMnC,WACtC+T,EACA,CAAE6xC,aAAc79B,IAGxB,OAAOnjB,QAAQ4mD,IACX,CAAC8P,EAAmBC,IACtB/1D,KAAK,EAAE++C,EAAoByB,KAElB,eAAKzB,EAAZ,GAAmCyB,EAAnC,CAAmDjhC,eA3K3D,KA+KQ65C,cAAgBjZ,UAEpB,MAAMkZ,EAAqB,GAE3B,IAAK,IAAIv2C,EAAI,EAAGA,EAAI4C,EAAM1qB,OAAQ8nB,IAClC,CAAC,IAAD,EACI,MAAMyT,EAAa7Q,EAAM5C,GACnB6iC,EAAuBpvB,EAAK/7B,KAC5B4D,EAAgBunD,EAAav2C,YAAY,KACzC6W,EACF7nB,EAAQ,EAAIunD,EAAat2C,UAAUjR,EAAQ,GAAK,GAE9C8L,EAAmB,IAErB,UAAAe,KAAKtO,MAAMqpB,uBAAX,eAA4BliB,QAC5BmiB,EAAUtiB,gBAAiB,GAE3BuG,EAAOvO,KAAKsP,KAAKtO,MAAMipD,qBAAqBrkD,QACxC,cAAe0kB,IAGS,OAA5Bhb,KAAKtO,MAAMkpD,cACRtvB,EAAK1hB,KAAO5J,KAAKtO,MAAMkpD,cAE1B37C,EAAOvO,KAAKsP,KAAKtO,MAAMmpD,mBAGL,IAAlB57C,EAAOlP,OAEPq+D,EAAW19D,KAAK46B,GAIhB39B,IAAIolB,WAAW9T,EAAO3B,IAAIhN,GAAK,UAAOg7B,EAAK/7B,KAAZ,cAAsBe,KAIzD89D,EAAWr+D,OAAS,SAEdiQ,KAAK+tD,cAAcrzC,YACrB1a,KAAKtO,MAAMpC,OACX0Q,KAAKtO,MAAMnC,KACX6+D,IAzNZ,KAkOQ16C,aAAe,KAEnB,MAAMzjB,EACF2b,IAAcwW,kBAAkBpiB,KAAKtO,MAAMooB,eAEzB,OAAlB9Z,KAAK80C,UAEL90C,KAAK80C,SAAS7kD,IAtOlB+P,KAAK+G,MAAQ,GAEb/G,KAAKuS,WAAa,CACdC,YACA,CACIiL,UAAW/rB,EAAM+rB,UACjBsP,QAASr7B,EAAMq7B,QACfzU,YACA,CACIwB,cAAepoB,EAAMooB,cACrBvM,KAAM7b,EAAM6b,KACZje,OAAQoC,EAAMpC,OACdC,KAAMmC,EAAMnC,MAEhBwhD,+BACI/wC,KAAK+wC,+BACTt+B,uBAAsB/gB,EAAMw8D,eAC5Bj3B,eAAgBvlC,EAAMulC,eACtBtjB,kBAAmB,CAACiE,EAAGC,IAAM7X,KAAK2T,kBAAkBiE,EAAGC,GACvDnE,aAAc,IAAM1T,KAAK0T,eACzBgH,YAAa1a,KAAKmuD,cAClBpzC,gBAAiBrpB,EAAMqpB,kBAI/B/a,KAAKolB,WAAa,CACd3H,UAAW/rB,EAAM+rB,UACjB+Q,UAAU,EACVzB,QAAS,GACTjT,cAAepoB,EAAMooB,cACrBxqB,OAAQoC,EAAMpC,OACdmjC,mBAAoB/gC,EAAMy2B,cAC1BqK,mBAAoB9gC,EAAMwwB,cAC1B0U,aAAezJ,GACXiN,GAAWxD,aAAallC,EAAMq7B,QAASI,GAC3CmJ,gBAAiB,CAACnJ,EAAeimB,IAC7BhZ,GAAW9D,gBACP5kC,EAAMq7B,QAASI,EAAOimB,GAC9Bnc,eAAgBvlC,EAAMulC,eACtBxN,aACI2Q,GAAWqb,uBAAuB/jD,EAAMq7B,SAC5Cx9B,KAAMmC,EAAMnC,KACZgjB,WAAYvS,KAAKuS,WACjB2Z,aAAcx6B,EAAMw6B,aAAe,gBAAa5oB,EAChDkiB,mBAAoB9zB,EAAM4wB,iBAC1B6I,YAAa2pB,GAAY90C,KAAK80C,SAAWA,EACzClpB,oBACImb,GAAgB/mC,KAAK6rB,iBAAmBkb,EAC5Cjb,eAAgBlY,GAAe5T,KAAK4T,YAAcA,EAClD8e,oBAAqBhhC,EAAMw3B,gBAG/BlpB,KAAK+tD,cAAgB,IAAInB,GACrBl7D,EAAMooB,cACN9Z,KAAK6sD,eACL7sD,KAAK8sD,WACL9sD,KAAK0T,cAoELshC,YAGJ,OADmB3jD,GAAa2S,cAAchE,KAAKtO,OACjClC,OA2FdmkB,kBAAkBnkB,EAAgBmkD,GAEtC3zC,KAAKiH,SAAS,CAAEyuC,eAAgB,CAAE/B,sBAAqBnkD,YAcpD6X,oBAEH,IAAK,MAAMwf,KAAU7mB,KAAKtO,MAAMq7B,QAE5B/sB,KAAKolB,WAAW2H,QAAQr8B,KAAK0pC,GAAWub,aACpC9uB,EACA7mB,KAAKtO,MAAMq7B,QACX/sB,KAAKuS,aAGTvS,KAAKtO,MAAMw8D,gBAEXluD,KAAKolB,WAAW2H,QAAQr8B,KAAKikD,GAAsBiB,aAC/C51C,KAAKuS,aAIVhL,mBAAmBC,GAElBA,EAAUuB,QAAU/I,KAAKtO,MAAMqX,OAE/BjW,WAAW,IAAMkN,KAAK0T,gBAIvB/T,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGXzE,KAAKolB,WAAWkT,kBAAoBt4B,KAAKtO,MAAMulC,gBACxChf,EAAkBU,aAAelW,IAAYoC,UAEpD,MAAMwpD,EACN,CACI/+D,OAAQ0Q,KAAKtO,MAAMooB,cACnBsyC,QAASpsD,KAAKolB,WAAWkT,kBACzB7d,MAAOza,KAAK+tD,cAAcd,UAC1BvyC,YAAa1a,KAAKmuD,eAGtB,OACI,gBAACztC,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC7B,uBAAKoT,MAAO,CAAE0X,SAAU,aACpB,gBAAC,GAAD,CACIP,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBoqC,QAAS15B,KAAK05B,QACdhmB,aAAc1T,KAAK0T,eAEvB,gBAAC,GAAD,iBACQ1T,KAAKolB,WADb,CAEIuT,cACI,gBAAC,GAAD,eACI4zB,uBACIvsD,KAAKtO,MAAMywB,gBACXksC,IAGZ7iC,eAAgBxrB,KAAKtO,MAAMywB,eAC3BmK,SAAUtsB,KAAKtO,MAAM46B,SACrB5R,YAAa1a,KAAK+tD,cAAcd,aAEpC,gBAAC,GAAD,CACInzC,cAAe9Z,KAAKtO,MAAMooB,cAC1BxqB,OAAQ0Q,KAAKtO,MAAMpC,OACnBqkD,sBAAqB3zC,KAAK+G,MAAM2uC,gBAC1B11C,KAAK+G,MAAM2uC,eAAe/B,oBAEhCpkD,KAAMyQ,KAAKtO,MAAMnC,KACjBu5C,SAAU9oC,KAAKstC,eACfr3B,QAASjW,KAAKiuD,cACdra,YAAa,IAAM5zC,KAAK0T,eACxBgJ,SAAU,IAAM1c,KAAK6rB,mBACrBkO,OAAQ/5B,KAAKi1C,aACb39B,aAActX,KAAK+G,MAAM2uC,eACnB11C,KAAK+G,MAAM2uC,eAAelmD,YAAS8T,UAhVjE,GAuVeqF,mBA5VCC,GAAiBC,YAC7B,IA2VWF,CAAmB+M,cAAYo4C,K,UC5YvC,MAAMQ,WACThoD,gBAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHU+iB,cAGV,EAGIzU,KAAKyU,SACL,CACI8I,QAAkC,YAAzB7rB,EAAM68D,eACf/wC,KAA+B,WAAzB9rB,EAAM68D,eACZ9wC,UAAW/rB,EAAM+rB,UACjBK,UAAW,EACX/M,MAAO,KACP2M,OAAiC,WAAzBhsB,EAAM68D,eACdh/D,KAAM,MAGV,MAAMC,EACFkC,EAAK,WAAiBA,EAAK,WAAL,OAAgC,KAC1D,IAAI88D,EAAa98D,EAAM88D,WACnBhG,EAAU92D,EAAM82D,QAEhBh5D,IAEAg/D,GAAU,WAAQh/D,GAClBg5D,GAAO,WAAQh5D,IAGO,WAAtBkC,EAAM+8D,aAENzuD,KAAKyU,SAASnlB,OAASoC,EAAMpC,OAC7B0Q,KAAKyU,SAAS1D,MAAQy9C,EACtBxuD,KAAKyU,SAASllB,KAAOi5D,GAEM,cAAtB92D,EAAM+8D,aAEXzuD,KAAKyU,SAASkH,UAAW,EACzB3b,KAAKyU,SAASllB,KAAOi5D,GAEM,SAAtB92D,EAAM+8D,cAEXzuD,KAAKyU,SAAS4I,KAAO,IACrBrd,KAAKyU,SAAS1D,MAAQy9C,EACtBxuD,KAAKyU,SAASllB,KAAOi5D,GAItB7oD,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OAQzB,OANAsO,KAAKyU,SAAS5R,UAAYwG,EAAO3B,QAAQgB,KACzC1I,KAAKyU,SAASljB,SACV,gBAACmvB,GAAA,EAAD,CAAe5J,MAAOzN,EAAOm/C,SACxBn/C,EAAO9X,UAGT,gBAAC,GAAUyO,KAAKyU,WAIhB9L,I,GAAAA,eAvECC,GAAiBC,YAC7B,CACIH,KACA,KAoEOC,CAAmB2lD,ICmBnBI,OAtFdl6C,YACD,GADA,cAEIlO,YACH,eAAD,oBACcskC,oBADd,EAGcznB,cAEN,MAAM9Z,EAAM,eAAQrJ,KAAKtO,OAEzB,IAAK2X,EAAO+Z,iBAER,OAGJ,MAAM7e,EACF/S,IAAIgT,oBAAoB6E,GAEtB7Z,EACF6Z,EAAM,WAAiBA,EAAM,WAAN,OAAiC,KAE5D,GAAI9E,GACGA,EAAiBoU,cAAgBlW,IAAYgC,QAC7CF,EAAiBoqD,gBACxB,CACI,IAAItrC,EAAW9e,EAAiBoqD,gBAC5Bn/D,IAEA6zB,GAAQ,WAAQ7zB,IAGpBg0B,GAAUtnB,KAAKmnB,OAGnB,CACI,IAAIolC,EAAYp/C,EAAOkiC,oBACnB/7C,IAEAi5D,GAAS,WAAQj5D,IAGrBg0B,GAAU8nB,UAAUmd,IAIrBphD,oBAEHrH,KAAK4qC,eAAiBnqB,YAAQ,KAE1BzgB,KAAKmjB,gBAIN5b,qBAEHvH,KAAKmjB,cAGFrR,uBAEC9R,KAAK4qC,gBAEL5qC,KAAK4qC,iBAINjrC,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,OAAK9E,EAKDA,EAAiBoU,cAAgBlW,IAAYgC,OAEtC,KAGJ4E,EAAO9X,SARH,SAzEnB,G,oBC2EO,MAAMq9D,WACTtoD,gBACH,eAAD,oBACYkU,SAAY/rB,IAEXuR,KAAKtO,MAAMgT,UAEZ1E,KAAKtO,MAAM8oB,SAAS/rB,EAAOuR,KAAKtO,MAAMyM,QALlD,KASY0wD,YAAepgE,IAEnBA,EAAMO,kBAEDgR,KAAKtO,MAAMgT,UAEZ1E,KAAKtO,MAAM8oB,SAAS/rB,EAAOuR,KAAKtO,MAAMyM,QAIvCwB,SAEH,IAAImvD,EAAuB9uD,KAAKtO,MAAMgW,QAAQ6B,MAC1CvJ,KAAKtO,MAAMgT,WAEXoqD,GAAY,WAAQ9uD,KAAKtO,MAAMgW,QAAQqnD,gBAG3C,IAAIxlD,EAAQvJ,KAAKtO,MAAM6X,MA8DvB,OA7DIvJ,KAAKtO,MAAMgT,SAEP1E,KAAKtO,MAAMuzC,mBAEX17B,EACI,gBAACiM,EAAA,EAAD,CACI9N,QAAS,CACL8B,MAAOxJ,KAAKtO,MAAMgW,QAAQ8B,MAC1Bd,KAAMomD,GAEV5kD,WAAW,EACXla,QAASgQ,KAAKtO,MAAM+jB,kBAEnBlM,IAObA,EAFKvJ,KAAKtO,MAAM8X,MAGZ,gBAAC,KAAD,CACIixB,aACyB,aAArBz6B,KAAKtO,MAAM8X,MACP,gBAACnD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,4BACLqD,MAAO,CACHhR,MAAOH,IAAI+Y,eAAe,eAC1BtH,SAAU,MAIlB,uBAAKJ,UAAU,mBACX,gBAACwD,EAAA,EAAD,CACIxD,UAAW7C,KAAKtO,MAAMgW,QAAQsnD,UAC9BhsD,YAAU,EACV1D,KAAK,qBACLqD,MAAO,CAAEM,SAAU,UAEvB,gBAACoD,EAAA,EAAD,CACIxD,UAAW7C,KAAKtO,MAAMgW,QAAQsnD,UAC9BhsD,YAAU,EACV1D,KAAK,oBAIrBoI,QAAS,CACL8B,MAAOxJ,KAAKtO,MAAMgW,QAAQ8B,MAC1Bd,KAAMomD,IAGTvlD,GAMD,uBAAK1G,UAAWisD,GAAevlD,GAIvC,gBAAC,KAAD,CACI7E,SAAU1E,KAAKtO,MAAMgT,SACrBoZ,UAAW,EACXmxC,SAAUjvD,KAAKtO,MAAMu9D,SACrBz0C,SAAUxa,KAAKwa,UAEf,gBAAC,KAAD,CACI9S,QAAS,CACLhD,SAAU1E,KAAKtO,MAAMgW,QAAQwnD,gBAC7BxmD,KAAM1I,KAAKtO,MAAMgW,QAAQynD,SAE7Bt6C,UAAW,GAEX,gBAACQ,EAAA,EAAD,CACI3N,QAAS,CAAE6B,MAAOvJ,KAAKtO,MAAMgW,QAAQ0nD,WACrCvsD,UAAW7C,KAAKtO,MAAMgW,QAAQs9C,KAC9BpzD,UAAU,IACV+qC,mBAAoB38B,KAAKtO,MAAMgT,SAC/B2qD,oBAAoB,EACpBz6C,QAAS5U,KAAK6uD,YACdh6C,SAAU7U,KAAKtO,MAAMgT,UAAY,EAAI,GAErC,gBAAC,KAAD,CAAY9S,UAAU,QACjB2X,IAGT,gBAAC,KAAD,CAAY1G,UAAW7C,KAAKtO,MAAMgW,QAAQ4nD,YACtC,gBAACjpD,EAAA,EAAD,CACI/G,KAAMU,KAAKtO,MAAMu9D,SACX,eAAiB,cACvBjsD,YAAU,EACVL,MAAO,CACHsG,OAAQ,GACR/F,WAAYlD,KAAKtO,MAAM8X,OAChBxJ,KAAKtO,MAAMgT,SAAW,GAAK,EAClCqE,MAAO,QAKtB/I,KAAKtO,MAAMu9D,SAAWjvD,KAAKtO,MAAMH,SAAW,OAK9CoX,mBA9MCC,GAAiBC,YAC7B,CACIW,MACA,CACIV,QAAS,SACT4xB,OAAQ,GACRpgB,IAAK,GAET00C,UACA,CACIr9D,MAAOiX,EAAM4B,QAAQla,MAAMi/D,KAC3BtsD,SAAU,QAEdqsD,WACA,CACIxmD,QAAS,OACTiC,KAAM,OACNmxB,eAAgB,YAEpB3yB,MACA,CACIT,QAAS,eACT7F,SAAU,GACVijC,cAAe,EACfF,cAAe,aAEnB+oB,cACA,CACIp9D,MAAOiX,EAAM4B,QAAQ9E,KAAK,MAE9Bs/C,KACA,CACI9oB,eAAgB,aAChBn5B,UAAW,EACXqH,UAAW,EACXQ,SAAU,EACV4T,QAAS,GAEb4wC,UACA,CACIpqD,SAAU,WAEdmqD,QACA,CACI,CAACvmD,EAAM0V,YAAYG,GAAG,OACtB,CACI4nB,YAA6C,EAAhC14C,IAAIqI,SAASuL,iBAC1B+kC,aAA8C,EAAhC34C,IAAIqI,SAASuL,kBAE/B,CAACqH,EAAM0V,YAAYG,GAAG,OACtB,CACI4nB,YAA6C,EAAhC14C,IAAIqI,SAASuL,iBAC1B+kC,aAA8C,EAAhC34C,IAAIqI,SAASuL,kBAE/B,CAACqH,EAAM0V,YAAYG,GAAG,OACtB,CACI4nB,YAA6C,GAAhC14C,IAAIqI,SAASuL,iBAC1B+kC,aAA8C,EAAhC34C,IAAIqI,SAASuL,mBAGnC2tD,gBACA,CAEI90C,QAAS,eAETlR,cAAe,qBA6IZP,CAAmBimD,I,UC7K3B,MAAMY,WACTlpD,gBAEO3G,SAEH,MAAM,EASFK,KAAKtO,OATH,MACF8X,EADE,QAEF9B,EAFE,UAGF7E,EAHE,iBAIF4S,EAJE,SAKF+E,EALE,QAMF5F,EANE,iBAOFqwB,GAPJ,EAQOwqB,EARP,0GAWA,IAAIX,EAAuB,GAM3B,GALIW,EAAS/qD,WAEToqD,GAAY,WAAQpnD,EAAQqnD,gBAG5BU,EAAS/qD,SAELugC,IAEAwqB,EAASlmD,MACL,gBAACiM,EAAA,EAAD,CACI9N,QAAS,CAAE8B,MAAO9B,EAAQ8B,MAAOd,KAAMomD,GACvC5kD,WAAW,EACXla,QAASylB,EACTZ,UAAW,GAEV46C,EAASlmD,aAKrB,GAAIC,EACT,CACI,IAAIixB,EAGAA,EAFU,aAAVjxB,EAGI,gBAACnD,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAK,4BACLqD,MAAO,CACHhR,MAAOH,IAAI+Y,eAAe,eAC1BtH,SAAU,GACVq5B,WAAY,UAOpB,wBAAMz5B,UAAU,mBACZ,gBAACwD,EAAA,EAAD,CACIxD,UAAW6E,EAAQsnD,UACnBhsD,YAAU,EACV1D,KAAK,qBACLqD,MAAO,CAAEM,SAAU,UAEvB,gBAACoD,EAAA,EAAD,CACIxD,UAAW6E,EAAQsnD,UACnBhsD,YAAU,EACV1D,KAAK,oBAKrBmwD,EAASlmD,MACL,gBAAC,KAAD,CACIkxB,aAAcA,EACd/yB,QAAS,CAAE8B,MAAO9B,EAAQ8B,MAAOd,KAAMomD,IAEtCW,EAASlmD,YAMlBkmD,EAASlmD,MACL,wBAAM1G,UAAWisD,GAAeW,EAASlmD,OAIjD,OACI,gBAAC,KAAD,eACI7B,QAAS,CACLhD,SAAUgD,EAAQhD,SAClBgE,KAAMhB,EAAQgB,MAElB8R,SAAUi1C,EAAS/qD,cAAWpB,EAAYkX,EAC1C5F,QAAS66C,EAAS/qD,cAAWpB,EAAYsR,GACrC66C,KAKL9mD,mBAjJCC,GAAiBC,YAC7B,CACIW,MACA,CACIkxB,OAAQ,GACRpgB,IAAK,GAET5V,SACA,CAEI0V,QAAS,eAETlR,cAAe,mBAEnB8lD,UACA,CACIr9D,MAAOiX,EAAM4B,QAAQla,MAAMi/D,KAC3BtsD,SAAU,QAEd8rD,cACA,CACIp9D,MAAOiX,EAAM4B,QAAQ9E,KAAK,MAE9BgD,KACA,CACI,CAACE,EAAM0V,YAAYG,GAAG,OACtB,CACI4nB,YAAa,GACbC,aAAc,IAElB3lB,UAAW,aACX7X,QAAS,eACTkZ,SAAU,OACVhd,SAAU,SACVwZ,QAAS,EACTgrB,cAAe,GACfnD,YAAa,GACbC,aAAc,GACdF,WAAY,GACZz7B,aAAc,WACd1F,WAAY,YAyGT0D,CAAmB6mD,I,mBCrH3B,MAAME,WACTppD,gBAEO3G,SAEH,MAAM,EAOFK,KAAKtO,OAPH,QACFgW,EADE,UAEF7E,EAFE,QAGFoH,EAHE,UAIF0lD,EAJE,QAKFxyC,GALJ,EAMO/H,EANP,uEASA,OACI,gBAAChM,EAAA,EAAD,eACIkM,aAAY3nB,IAAIwD,eAA6B,SAAdw+D,EACzB,mBAAqB,qBAC3B9sD,UAAyB,SAAd8sD,EAAuBjoD,EAAQyS,KAAOzS,EAAQgzB,MACzDh2B,UAAWyY,EACXxW,KAAG,EACHrH,KAAoB,SAAdqwD,EACA,sBAAwB,uBAC9B/lD,KAAK,SACLiL,UAAW,GACPO,KAKLzM,mBA7DCC,GAAiBC,YAC7B,CACIsR,KACA,CACI,eACA,CACIrR,QAAS,QAEb88C,UAAW,WACXjd,WAAY,EACZtlC,aAAc,EACdH,WAAY,EACZ0sD,MAAO,EACPnrC,OAAQ,GAEZiW,MACA,CACI,eACA,CACI5xB,QAAS,QAEb88C,UAAW,WACXjd,WAAY,EACZtlC,aAAc,EACdH,WAAY,EACZuG,YAAa,EACbmmD,MAAO,EACPnrC,OAAQ,KAkCL9b,CAAmB+mD,ICvD3B,MAAMG,WACTvpD,gBACH,eAAD,oBACqB6xC,QAAU7xC,cAEpBe,oBAIH,MAAMyoD,EAA2B9vD,KAAKm4C,QAAQ99C,QAAS+gB,cACnD,oBAAqB6Y,cACzB67B,EAAYj7C,UAAY,EACxBi7C,EAAYntD,MAAMm6B,QAAU,OAGzBn9B,SAEH,MAAM,EAAwBK,KAAKtO,OAA7B,QAAEgW,GAAR,EAAoB4wC,EAApB,2BAEA,OACI,gBAACyX,GAAA,EAAD,CACIC,cAAc,WACdC,aAAc,oBAEd,gBAAC,KAAD,eACIvoD,QAAS,CAAEwoD,cAAexoD,EAAQwoD,eAClCt3B,IAAK54B,KAAKm4C,QACVgY,sBAAuBT,GACvBU,cAAc,OACdv+D,QAAQ,cACJymD,MAMT3vC,I,GAAAA,eA5CCC,GAAiBC,YAC7B,CACIqnD,cACA,CACIpzB,QAAS,UAwCNn0B,CAAmBknD,IC2B3B,IAAMQ,GADZ77C,YACD,GADA,cAEIlO,YAOOC,YAAY7U,GAEf8U,MAAM9U,GADV,KANQ+tB,yBAMR,OALQC,2BAKR,OAJQC,kBAA8B,GAItC,KAHQC,qBAA0D,GAGlE,KAUQC,YAAc,KAElB,MAAMC,EACFlU,IAAc/W,SAASgZ,QAAQ7N,KAAKtO,MAAMpC,QAE9C,IAAKwwB,EAAW3S,cAEZ,OAGJ,GAAInN,KAAK0f,uBACF1f,KAAK0f,uBAAyBI,EAAW3S,cAE5C,OAGJ,IAAK,MAAM4S,KAAmB/f,KAAK4f,qBAE/BG,EAAgB3G,QAGpB,MAAMnB,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAC3B4b,EACF2K,EAAkBiH,mBAEtB,GAAI5R,EACJ,CACI,MAAMgjD,EACFr4C,EAAkBs4C,KAAKpwC,KAAKC,GAAKA,EAAE9S,aAAeA,GAEtD,IAAKgjD,EAED,MAAM,IAAIxrD,MAAJ,sCAC6BwI,EAD7B,WAIVtN,KAAK2f,kBAAoB,CAAC2wC,EAAUhjD,YAEpCtN,KAAKiH,SAAS,CACVupD,mBAAoB,GACpBtxC,mBAAoBoxC,EAAUhjD,kBAKlCtN,KAAK2f,kBAAoB,GACzB3f,KAAKiH,SAAS,CACVupD,mBAAoB,GACpBtxC,wBAAoB5b,IAK5BsI,IAAcgT,sBAEd5e,KAAK0f,sBAAwBI,EAAW3S,eAlE5C,KA6QQsjD,kBAAoB,CACxBhiE,EACA0P,KAGA6B,KAAKiH,SACAQ,IAEU,CACHipD,oBAAqBjpD,EAAUipD,oBACxBvyD,IAAUsJ,EAAUyX,mBAC3BA,mBAAoB/gB,EACpBwyD,cAAc,IAGtB,KAEI3wC,KAAiB4wC,eACb5wD,KAAKtO,MAAMpC,OACX0Q,KAAKtO,MAAMnC,KACXyQ,KAAK+G,MAAMmY,oBAEXlf,KAAK2f,kBAAkB9mB,QACvBmH,KAAK+G,MAAMmY,oBAAuB,GAElClf,KAAK6wD,qBAnSjB7wD,KAAK+G,MAAQ,CACT2pD,oBAAoB,EACpBF,mBAAoB,GACpBG,cAAc,GA+DdG,SAASC,EAAexuC,GAE5B,MAAO,UAAGviB,KAAKtO,MAAMs/D,SAAd,YAA0BzuC,EAAU,UAAY,OAAhD,WACGwuC,EAAIzjD,YAGVujD,kBAEJ,MAEMI,EADFz/D,IAAIgT,oBAAoBxE,KAAKtO,OAEX6+D,KAAKpwC,KACnBC,GAAKA,EAAE9S,aAAetN,KAAK+G,MAAMmY,oBACnC5R,EAAqBtN,KAAK+G,MAAMmY,mBAEtClf,KAAKiH,SAAUQ,IAEX,MAAM+oD,EACF/oD,EAAU+oD,mBAAoB/5D,QAGlC,OAFA+5D,EAAmB9/D,KAAK4c,GAEjB,CAAEkjD,qBAAoBG,cAAc,KAG/C,MAAMO,EACFv+C,IAAiBoiC,qBACb,oDACA,CACIzlD,OAAQ0Q,KAAKtO,MAAMpC,OACnBge,aACA9d,OAAQyhE,EAAgBzhE,SAIpCwQ,KAAK4f,qBAAqBlvB,KAAKwgE,GAE/BA,EAAen8D,KAAM8d,IAEjB7S,KAAK4f,qBACD5f,KAAK4f,qBAAqBpnB,OAAOC,GAAKA,IAAMy4D,GAE5Cr+C,EAASC,kBACND,EAASC,iBAAiB/iB,OAAS,GAEtCpC,IAAIolB,WAAWF,EAASC,kBACpB9S,KAAK2f,kBAAkB5vB,OAAS,GAEhCiQ,KAAKywD,kBAAkB,KAAMzwD,KAAK2f,kBAAkB,MAKxD/T,IAAcuH,aAAaN,EAASO,kBACpCzlB,IAAI0lB,oBAEJrT,KAAK2f,kBAAkBjvB,KAAK4c,GAC5BtY,IAAU2Y,QAAQkF,EAASimB,YAG/B94B,KAAKiH,SAAUQ,IAKJ,CAAE+oD,mBAFL/oD,EAAU+oD,mBAAoBh4D,OAAO24D,GAAKA,IAAM7jD,GAEvBqjD,cAAc,OAEhD17D,MAAOhD,IAEN,MAAMjC,EACF2K,KAAYs+B,2BAA2BhnC,GACvCjC,GAEArC,IAAIolB,WAAW,CAAC/iB,IAEhBgQ,KAAK2f,kBAAkB5vB,OAAS,GAEhCiQ,KAAKywD,kBAAkB,KAAMzwD,KAAK2f,kBAAkB,MAKxDyxC,qBACJL,EAAe94C,GAEf,MAAMg5C,EAAkBh5C,EAAkBs4C,KAAKpwC,KAC3CC,GAAKA,EAAE9S,aAAeyjD,EAAIzjD,YAE9B,OAAK2jD,EAKDA,EAAgBt4C,cAAgBlW,IAAYgC,OAErC,KAIP,gBAAC,GAAD,CACI+E,MAAO7b,IAAI0jE,kBAAkBN,EAAIzjD,YAC3B,SACC2jD,EAAgBK,cAAgB,gBAAahuD,EACpDoB,SAAUusD,EAAgBt4C,cAAgBlW,IAAYiC,SACtD+Q,iBAAkBs7C,EAAIt7C,iBACtBw5C,UAAWjvD,KAAK+G,MAAM2pD,oBACfK,EAAIzjD,aAAetN,KAAK+G,MAAMmY,mBACrClxB,IAAK+iE,EAAIzjD,WACT/D,MAAOwnD,EAAIxnD,MACXiR,SAAUxa,KAAKywD,kBACfxrB,iBAAkBgsB,EAAgBhsB,iBAClC9mC,MAAO4yD,EAAIzjD,YAEX,gBAACoT,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC5BwhE,EAAIzjD,aAAetN,KAAK+G,MAAMmY,mBACzBlf,KAAKuxD,sBACHt5C,EAAmBu5C,KAAiBnwC,MACtC,OA3BP,KAgCPkwC,sBACJt5C,EACAw5C,GAGA,GAAIx5C,EAAkBU,aAAelW,IAAYiC,SAE7C,OAAO,KAGX,MAAMgtD,EAAwB1xD,KAAKtO,MAAM6+D,KAAKpwC,KAAKC,GAC/CA,EAAE9S,aAAetN,KAAK+G,MAAMmY,oBAC1ByyC,EAAwB3xD,KAAK+G,MAAMypD,mBAAoB33D,QACzDmH,KAAK+G,MAAMmY,qBAAwB,EAEvC,IAAI0yC,EAA+B,KAanC,OAZI5xD,KAAK2f,kBAAkB9mB,QAAQ64D,EAAYpkD,aAAe,IAK1DskD,EACI,uBAAK5jE,IAAK0jE,EAAYpkD,YACjBjc,GAAaC,OAAOogE,EAAYlxC,QAAS,CAAEixC,eAMpD,gBAAC,GAAD,CACI5I,kBAAiB7oD,KAAK8wD,SAASY,GAAa,GAC5Cl0C,MAAM,EACNC,UAAW,EACX5a,UAAW7C,KAAKtO,MAAMgW,QAAQuV,MAC9Ba,UAAW,EACXwH,GAAItlB,KAAK8wD,SAASY,GAAa,GAC/Bh0C,QAAQ,EACRrV,KAAK,aAEHrI,KAAK+G,MAAM4pD,cAAgBgB,EACzB,gBAAC/3B,GAAA,EAAD,CAAgBxjB,OAAQu7C,IACxB,KACHC,GAILC,gBACJd,EAAe94C,GAEf,MAAMg5C,EAAkBh5C,EAAkBs4C,KAAKpwC,KAC3CC,GAAKA,EAAE9S,aAAeyjD,EAAIzjD,YAE9B,OAAK2jD,EAKDA,EAAgBt4C,cAAgBlW,IAAYgC,OAErC,KAIP,gBAAC,GAAD,CACIqtD,gBAAe9xD,KAAK8wD,SAASC,GAAK,GAClCvnD,MAAO7b,IAAI0jE,kBAAkBJ,EAAgB3jD,YACvC,SACC2jD,EAAgBK,cAAgB,gBAAahuD,EACpDoB,SAAUusD,EAAgBt4C,cAAgBlW,IAAYiC,SACtD+Q,iBAAkBs7C,EAAIt7C,iBACtB6P,GAAItlB,KAAK8wD,SAASC,GAAK,GACvB/iE,IAAK+iE,EAAIzjD,WACT/D,MAAOwnD,EAAIxnD,MACX07B,iBAAkBgsB,EAAgBhsB,iBAClCpwB,UAAW,EACX1W,MAAO4yD,EAAIzjD,aArBR,KAuDRjG,oBAEHrH,KAAKyf,oBAAsBgB,YAAQzgB,KAAK6f,aAGrC/N,uBAEH,IAAK,MAAMiO,KAAmB/f,KAAK4f,qBAE/BG,EAAgB3G,QAGhBpZ,KAAKyf,qBAELzf,KAAKyf,sBAGTO,KAAiB4wC,eACb5wD,KAAKtO,MAAMpC,OACX0Q,KAAKtO,MAAMnC,KACX,MAGDoQ,SAEH,IAAKK,KAAK+G,MAAMmY,oBAAsBlf,KAAKtO,MAAM6+D,KAAKxgE,QAAU,EAE5D,OAAO,KAGX,MAAMkoB,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,OAAKumB,EAKDA,EAAkBU,cAAgBlW,IAAYgC,OAEvC,KAIP,2BACI,gBAAC0c,GAAA,EAAD,CAAQC,QAAM,GACV,gBAAC,GAAD,CACI5G,SAAUxa,KAAKywD,kBAKftyD,MAAO6B,KAAK+G,MAAMmY,oBAEjBlf,KAAKtO,MAAM6+D,KAAKjzD,IACb8iB,GAAKpgB,KAAK6xD,gBAAgBzxC,EAAGnI,KAErC,gBAACyI,GAAA,EAAD,CAAe5J,MAAO9W,KAAKtO,MAAMnC,MAC5ByQ,KAAKuxD,sBACFt5C,EAAmBu5C,KAAiBpwC,UAGhD,gBAACD,GAAA,EAAD,CAAQE,MAAI,GACPrhB,KAAKtO,MAAM6+D,KAAKjzD,IAAI8iB,GACjBpgB,KAAKoxD,qBAAqBhxC,EAAGnI,MA7BlC,SAvVnB,GA2XetP,mBAtYCC,GAAiBC,YAC7B,CACIoU,MACA,CACI0D,UAAW,aACXvW,UAAW,GACXiQ,SAAU,cAgYP1R,CAAmB0nD,ICzb3B,MAAM0B,WACTzrD,gBAEO3G,SAEH,OACI,gBAACyJ,EAAA,EAAD,CACIzX,MAAM,UACN2N,KAAK,qBACLsK,KAAK,QACLgL,QAAUnmB,IAENuR,KAAKtO,MAAM6gB,WAAWC,YAAYgF,SAASw6C,sBAMhDrpD,mBAzBCC,GAAiBC,YAC7B,CACIH,KACA,KAsBOC,CAAmBopD,IClB3B,MAAME,WACT3rD,gBAEO3G,SAEH,MAAM4X,EAAUvX,KAAKtO,MAAM6gB,WAAWC,YAAYgF,SAElD,OACI,gBAACpO,EAAA,EAAD,CACIzX,MAAM,UACN2N,KAAK,eACLsK,KAAK,QACLgL,QAAS,KAEL,MAAMs9C,EAAkB36C,EAAQsc,wBAChCtc,EAAQgqC,sBACJhqC,EAAQiP,2BAEZ1zB,WAAW,KAEPvE,OAAOg3B,QACPhO,EAAQgqC,sBAAsB2Q,SAOvCvpD,mBAnCCC,GAAiBC,YAC7B,CACIH,KACA,KAgCOC,CAAmBspD,ICjB3B,MAAME,WACT7rD,gBAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHiB0gE,iBAGjB,EAGIpyD,KAAK+G,MACL,CACI2N,cAAe,KACf29C,UAAW,CAAEllC,MAAO,GAAImlC,KAAM,KAGlCtyD,KAAKoyD,YAAc,GACnB,IAAK,MAAMvrC,KAAU7mB,KAAKtO,MAAM6gB,WAAWC,YAAYua,QACvD,CACI,MAAMwlC,EAAa1rC,EACf0rC,EAAW57C,IAEX3W,KAAKoyD,YAAY1hE,KAAK6hE,IAK1Blc,SAAS5nD,EAAsCizD,GAEnD,MAAMhtC,EAAgBjmB,EAAMo7B,cAI5B7pB,KAAKiH,SACD,CAAEyN,iBACF,KAAQlZ,IAAS2a,KAAKurC,EAAUhtC,KAIhC49C,KAAKnlC,EAAewiC,GAExB,MAAM0C,EAAY,CAAEllC,QAAOmlC,KAAM3C,GAEjC3vD,KAAKtO,MAAM6gB,WAAWC,YAAYgF,SAASg7C,aAAa,CAACH,IACzDryD,KAAKiH,SAAS,CAAEorD,cAChBryD,KAAKtO,MAAM6gB,WAAWC,YAAY6Z,kBAElC7wB,IAASC,WAGNkE,SAEH,MAAM2nD,EAA+B,GACrC,IAAK,MAAMzgC,KAAU7mB,KAAKoyD,YAC1B,CACI,MAAMC,EAAYryD,KAAK+G,MAAMsrD,UACvBI,EAAaJ,EAAUllC,QAAUtG,EAAOt3B,KAE9C,IAAIogE,EAAY9oC,EAAOkrB,eAAiB,OAAS,MAC7CtL,EAAYzmC,KAAKtO,MAAMkX,MAAM4B,QAAQ9E,KAAK,KAC1CpG,EAAO,cAEPmzD,IAEA9C,EAA+B,QAAnB0C,EAAUC,KAAiB,OAAS,MAChD7rB,EAAYzmC,KAAKtO,MAAMkX,MAAM4B,QAAQ9E,KAAK,KAC1CpG,EAA0B,QAAnB+yD,EAAUC,KACX,iBACA,oBAGVhL,EAAU52D,KACN,gBAAC,IAAD,CACI1C,IAAK64B,EAAOt3B,KACZqlB,QAAS,IAAM5U,KAAKsyD,KAAKzrC,EAAOt3B,KAAMogE,GACtCp8B,UAAU,GAEV,gBAACltB,EAAA,EAAD,CACIrD,YAAU,EACV1D,KAAMA,EACNqD,MACI,CACIhR,MAAO80C,EACPh9B,YAAa,UAGxBod,EAAO+rB,SAKpB,MAAM8O,EACF,UAAG1hD,KAAKtO,MAAM6gB,WAAWC,YAAY8F,YAAYgU,UAAjD,WACUtsB,KAAKtO,MAAMnC,MAEzB,OACI,gBAAC,WAAD,KACI,gBAAC6Z,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,aAAc,aAC7CmO,KAAK,cACLsK,KAAK,QACLgL,QAASsG,GAAKlb,KAAKq2C,SAASn7B,EAAGwmC,GAC/B7sC,UAAW,IAEf,gBAAC4hC,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAM2N,cACrBnlB,KAAMmyD,EACNvrC,MAAM,EACN5kB,SAAU+1D,MAOf3+C,I,GAAAA,eAzHCC,GAAiBC,YAC7B,CACIH,KACA,KAsHOC,CAAmBob,aAAUouC,KClGrC,IAAMO,GADZl+C,YACD,GADA,cAEIlO,YAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAJiBihE,4BAIjB,OAHiBp7C,aAGjB,OA2BQq7C,oBAAuBnkE,IAE3B,IAAKA,EAAMq3B,IAAI+sC,qBAIX,YAFA7yD,KAAKiH,SAAS,CAAE6rD,oBAAgBxvD,IAKpC,MAAMwvD,EAA2B,GACjCrkE,EAAMq3B,IAAI0P,uBAAuB,CAAC/lC,EAAK0D,KAEnC2/D,EAAepiE,KAAKjB,EAAI61B,MAG5BtlB,KAAKiH,SAAS,CAAE6rD,oBAvChB9yD,KAAK+G,MAAQ,GAEb,IAAK,MAAM8f,KAAU7mB,KAAKtO,MAAM6gB,WAAWC,YAAYua,QACvD,CACI,MAAMwlC,EAAa1rC,EACnB,GAAI0rC,EAAWhjE,OAASyQ,KAAKtO,MAAMqhE,iBACnC,CACI/yD,KAAK2yD,uBAAyBJ,EAC9B,OAIR,IAAKvyD,KAAK2yD,uBAEN,MAAM,IAAI7tD,MAAJ,iBAAoB9E,KAAKtO,MAAMqhE,iBAA/B,eAGV/yD,KAAKuX,QAAU7lB,EAAM6gB,WAAWC,YAAYgF,SAE5CxX,KAAKuX,QAAQloB,iBACT,gBACA2Q,KAAK4yD,qBAqBN9gD,uBAEH9R,KAAKuX,QAAQxZ,oBACT,gBACAiC,KAAK4yD,qBAGNjzD,SAEH,MAAMma,EACF9Z,KAAKtO,MAAM6gB,WAAWC,YAAY8F,YAAYwB,cAE5Ck5C,EACFpnD,IAAcwW,kBAAkBtI,GAE9ByhB,EAA+B,GACrC,IAAK,MAAM9rC,KAAOujE,EAClB,CACI,MAAMxjE,EAAiBC,EAAIwc,gBACtBjM,KAAK+G,MAAM+rD,iBACT9yD,KAAK+G,MAAM+rD,eAAe1/D,KAAK+9D,GAAKA,IAAM3hE,IAE7C+rC,EAAY7qC,KAAKjB,EAAIG,UAAUoQ,KAAKtO,MAAMqhE,mBAIlD,IAAIE,EAMJ,MAAM9hB,EAAqBnxC,KAAK2yD,uBAAuBxhB,WACvD,OAAQA,GAEJ,IAAK,iBACD8hB,EAAkB33B,GAAe23B,gBACjC,MACJ,IAAK,6BACDA,EAAkB92B,GAA2B82B,gBAC7C,MACJ,IAAK,yBACDA,EAAkBr0B,GAAuBq0B,gBACzC,MACJ,IAAK,iBACDA,EAAkBh0B,GAAeg0B,gBACjC,MACJ,IAAK,iBACDA,EAAkBvoB,GAAeuoB,gBACjC,MACJ,IAAK,uBACDA,EAAkBvnB,GAA4BunB,gBAC9C,MACJ,IAAK,oBACDA,EAAkB1mB,GAAkB0mB,gBACpC,MACJ,IAAK,mBACDA,EAAkBzmB,GAAiBymB,gBACnC,MACJ,IAAK,mBACDA,EAAkBxpB,GAAWwpB,gBAC7B,MACJ,IAAK,oBACDA,EAAkB7iB,GAAkB6iB,gBACpC,MACJ,IAAK,6BACDA,EACIpiB,GAAkCoiB,gBACtC,MACJ,IAAK,mBAGL,IAAK,oBACDA,EAAkBxpB,GAAWwpB,gBAC7B,MACJ,QACI,MAAM,IAAInuD,MAAJ,sCAAyCqsC,IAGvD,MAAMhzC,EAAuB80D,EACzB13B,EACAv7B,KAAK2yD,uBAAuBvhB,YAC5BpxC,KAAKtO,MAAM+pC,cAEf,OACI,gBAAC,KAAD,CAAY94B,MAAO,CAAEM,SAAU,KAC1BjD,KAAKtO,MAAM6X,MADhB,KACmC,OAAVpL,EAAiB,GAAKA,OA1I3D,GAgJewK,I,GAAAA,eArJCC,GAAiBC,YAC7B,IAoJWF,CAAmB+pD,IC9J3B,IAAMQ,GADZ1+C,YACD,GADA,cAEIlO,YACH,eAAD,oBACYmhC,UAAatpC,IAEjB,MAAM8Z,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,OAAKumB,EAKEA,EAAkBnoB,eAHd,IARnB,KAcYqjE,oBAAsB,KAE1BnzD,KAAKtO,MAAM6gB,WAAWgH,aAAa8mB,OAAOrgC,KAAKtO,MAAMnC,OAhB7D,KAmBY6jE,WAAc3kE,IAEA,UAAdA,EAAMT,MAKVS,EAAMQ,iBACNR,EAAMO,kBACNgR,KAAKtO,MAAM6gB,WAAWgH,aAAa8mB,OAAOrgC,KAAKtO,MAAMnC,QA5B7D,KA+BYq4C,cAAiBzpC,IAErBxQ,IAAIulB,oBAAoBlT,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMnC,MACtD8B,GAAayyB,SAAS9jB,KAAKtO,MAAOyM,IAG/BwB,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,GAAIwT,EAAkBU,cAAgBlW,IAAYiC,SAE9C,OACI,gBAAC,GAAD,CACIA,UAAU,EACV6E,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjBuC,KAAK,OACLqM,MAAM,GACNtM,QAAQ,WAKpB,MAAMsM,EAAQ9M,GAAakyB,SAASvjB,KAAKtO,OAEzC,OACI,gBAAC,GAAD,CACI+1C,UAAWznC,KAAKynC,UAChB7kB,WAAY5iB,KAAKtO,MAAMkxB,WACvBkf,WAAY,CACRiD,aACI,gBAAC,KAAD,CACI1qB,SAAS,MACT1X,MAAO,CAAEI,WAAY,IAErB,gBAACqG,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,UAC/BmO,KAAK,gBACLsV,QAAS5U,KAAKmzD,oBACdvpD,KAAK,YAKrBL,MAAOvJ,KAAKtO,MAAM6X,MAClBha,KAAMyQ,KAAKtO,MAAMnC,KACjB6jE,WAAYpzD,KAAKozD,WACjBxrB,cAAe5nC,KAAK4nC,cACpBjjC,SACIsT,EAAkBU,cAAgBlW,IAAYkC,SAClDqgC,SAAU/sB,EAAkBktB,gBAC5BhnC,MACI8Z,EAAkBU,cAAgBlW,IAAYkC,SAC5CxG,GAAgB,IAAMA,EAC5BtM,QAAQ,eAnGxB,GAyGe8W,I,GAAAA,eA9GCC,GAAiBC,YAC7B,IA6GWF,CAAmBuqD,ICpF3B,IAAMG,GADZ7+C,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAMsY,EACFzmB,IAAIgT,oBAAoBxE,KAAKtO,OAEjC,IAAKumB,EAED,OAAO,KAGX,GAAIA,EAAkBU,cAAgBlW,IAAYgC,OAE9C,OAAO,KAGX,MAAMlT,EAA8B,GAEpC,IAAI+hE,EAA6B,OAC7BtzD,KAAKtO,MAAMgR,gBAAkB1C,KAAKtO,MAAM6hE,YAEA,kBAA7BvzD,KAAKtO,MAAMgR,cAElB4wD,EAAQ9hE,IAAIi5C,aAAazqC,KAAKtO,MAAMgR,eAE/B1C,KAAKtO,MAAMqX,SAAS/I,KAAKtO,MAAMgR,gBAEpC4wD,EAAQ9hE,IAAIi5C,aACRzqC,KAAKtO,MAAMgR,cAAc1C,KAAKtO,MAAMqX,UAIhD,MAAMlX,EAAmBL,IAAI4wD,aAAapiD,KAAKtO,MAAMoS,WAqBrD,OAnBAmU,EAAkByxB,SAASz2C,QAAQ,CAACkH,EAAchH,KAE9C5B,EAASb,KACL,gBAAC,IAAD,CACI4iE,MAAOA,EACPzwD,UAAW,UAAG7C,KAAKtO,MAAMgW,QAAQgB,KAAtB,eACFvV,EAAQ,EAAI6M,KAAKtO,MAAMgW,QAAQy2C,OAAS,IACjDvsD,UAAWoO,KAAKtO,MAAM6hE,UAAY,UAAOjwD,EACzCtV,IAAKmF,EACLwP,MAAO,CACHmG,QAAS9I,KAAKtO,MAAM6hE,UAAY,iBAAcjwD,GAElDzR,QAASA,GAERsI,MAKT6F,KAAKtO,MAAM6hE,UAEJ,sBAAI1wD,UAAW7C,KAAKtO,MAAMgW,QAAQvE,MAAO5R,GAG7C,2BAAMA,OA5DrB,GAgEeoX,I,GAAAA,eA1FCC,GAAiBC,YAC7B,CACI1F,KACA,CACIE,aAAc,EACdN,UAAW,EACXsjC,YAA6C,GAAhC14C,IAAIqI,SAASuL,kBAE9BmH,KACA,CACI,CAACE,EAAM0V,YAAYG,GAAG,OACtB,CACIuD,SAAU,SAEd,CAACpZ,EAAM0V,YAAYG,GAAG,OACtB,CACIuD,SAAU,UAGlBm8B,OACA,CACIp7C,UAA2C,EAAhCpV,IAAIqI,SAASuL,oBAqErBoH,CAAmB+M,cAAY29C,KC/EvC,IAAMG,GADZh/C,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EACF/S,IAAIgT,oBAAoB6E,GAE5B,IAAK9E,EAED,OAAO,KAGX,GAAIA,EAAiBoU,cAAgBlW,IAAYgC,OAE7C,OAAO,KAGX,IAAKF,EAAiBq5B,iBACdr5B,EAAiBs5B,kBAErB,OAAO,KAGX,MAAMZ,EAAiBU,GAAgBkB,gBACnCt6B,EAAiBq5B,eACjBr5B,EAAiBs5B,kBACjBt5B,EAAiBw5B,mBACjB10B,EAAOi0B,eAELG,EAAsBE,GAAgBmB,eACxCv6B,EAAiBq5B,eACjBr5B,EAAiBs5B,kBACjBt5B,EAAiBw6B,UAErB,IAAIxc,EACA,gBAAC,GAAD,CACIvN,cAAezQ,EAAiByQ,cAChCyoB,YAAaA,EACbC,SAAUn5B,EAAiBy6B,kBAC3Bj9B,SAAUwC,EAAiBxC,SAC3B6f,YAAavY,EAAOuY,YACpBC,WAAYxY,EAAOwY,WACnBob,OAAQA,EACRK,cAAej0B,EAAOi0B,gBAa9B,OATIj0B,EAAOoqD,qBAEPlxC,EACI,gBAAC,GAAD,CAAUhZ,MAAOF,EAAOoqD,oBACnBlxC,IAKN,uBAAK1f,UAAWwG,EAAO3B,QAAQgB,MAAO6Z,OA1DrD,GA8De5Z,I,GAAAA,eAtECC,GAAiBC,YAC7B,CACIH,KACA,KAmEOC,CAAmB6qD,IC8D3B,IAAME,GADZl/C,YACD,GADA,cAEIlO,YAEOC,YAAY7U,GAEf8U,MAAM9U,GAENsO,KAAK+G,MAAQ,CAAEmjB,WAAW,GAGtBg7B,eAEJ,GAAIllD,KAAKtO,MAAMiiE,uBAAuB5jE,OAAS,EAE3C,OAAO,EAGX,IAAK,MAAMsD,KAAc2M,KAAKtO,MAAMkiE,iBACpC,CACI,MAAMrvD,EAAmB7U,IAAQ8U,oBAC7BxE,KAAKtO,MAAMpC,OAAQ+D,GAEvB,QAAqCiQ,IAAjCiB,EAAiBoU,YAEjB,OAAO,EAGX,GAAIpU,EAAiBoU,aAAelW,IAAYiC,SAE5C,OAAO,EAIf,OAAO,EAGJ/E,SAEH,IAAKK,KAAKklD,eAEN,OAAO,KAGX,MAAMx9C,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MAC9C,IAAI+Q,GAA4B,EAEhC,GAAIzZ,KAAKtO,MAAM6gB,WACf,CACI,IAAKvS,KAAKtO,MAAM6gB,WAAWC,YAEvB,OAAO,KAGPxS,KAAKtO,MAAM6gB,WAAW+E,aAEtB5P,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQmsD,yBAE3B7zD,KAAKtO,MAAM6gB,WAAWC,YAAYiH,kBAEvCA,GAAmB,EACnB/R,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQosD,6BAIhCpsD,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQ1H,KAAKtO,MAAMqiE,mBAK/CrsD,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQssD,kBAGpC,MAAMprD,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAEvB98C,KAAKtO,MAAMirD,IAEXj1C,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAX,kBAA8Bi1C,KAInD,MAAMpqC,EAA+C,eAE9CvS,KAAKtO,MAAM6gB,WAFmC,CAGjD2xC,kBAAkB,IAMhB+P,EAAmBx6C,GACS,WAA3BzZ,KAAKtO,MAAMqiE,YAElB,OACI,gBAAChE,GAAA,EAAD,CACIC,cAAe,wCACLkE,GAAwBrxD,WAClCA,UAAW6E,EAAQjK,KAAK,KACxB4K,KAAK,WAEJrI,KAAKtO,MAAMyiE,aAAeF,EACvB,uBAAKpxD,UAAW7C,KAAKtO,MAAMgW,QAAQ6U,WAC9BlrB,GAAaC,OAAO0O,KAAKtO,MAAMyiE,WAAY5hD,IAElD,KACDvS,KAAKtO,MAAM0iE,UAAYp0D,KAAKtO,MAAM2iE,cAC/B,uBAAKxxD,UAAW7C,KAAKtO,MAAMgW,QAAQ6U,WAC9Bvc,KAAKtO,MAAM0iE,SACR/iE,GAAaC,OAAO0O,KAAKtO,MAAM0iE,SAAU7hD,GAC3C,KACDvS,KAAKtO,MAAM2iE,cACRhjE,GAAaC,OACT0O,KAAKtO,MAAM2iE,cAAe9hD,GAChC,MAER,UApHlB,GA0He5J,I,GAAAA,eA/OCC,IAEZ,MAAM0rD,EAAsB,GAC5B,IAAK,MAAM3X,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMiC,EAAiBv2C,EAAMw0C,SAASQ,QAAQP,QAAQV,GAEtD2X,EAAoB1rD,EAAM0V,YAAYG,GAAGk+B,IACrC,CACIt5C,aAAyC,IAA1B87C,EAAer/C,SAC9BoD,WAAyC,IAA5Bi8C,EAAet/C,WAC5B4J,YAA0C,IAA5B01C,EAAet/C,WAC7BkD,UAAsC,IAA1Bo8C,EAAer/C,UAIvC,MAAMk9C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,WAAD,OAAYL,IACxB,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,SAKzB,MAAMna,EAAM,aAEJ4tB,UAAU,eAEH+3C,EAFE,CAGL5yC,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,WACNH,SAAU,IAEd2pD,OACA,CACI7yC,WAAY,SACZ8yC,kBAAmB5rD,EAAM4B,QAAQ9E,KAAK,KACtC+uD,kBAAmB,QACnBC,eAAgB,cAChBzrD,OAAQ,GACRo9B,YAAa,GACbC,aAAc,IAElBsM,OACA,CACIlxB,WAAY,SACZ8yC,kBAAmB,cACnBE,eAAgB9rD,EAAM4B,QAAQ9E,KAAK,KACnCivD,eAAgB,QAChB1rD,OAAQ,GACRo9B,YAAa,GACbC,aAAc,IAElBwtB,2BACA,CACIU,kBAAmB,cACnBE,eAAgB,cAChBruB,YAAa,EACbC,aAAc,GAElB0tB,iBACA,CACIQ,kBAAmB,cACnBE,eAAgB,cAChBruB,YAAa,EACbC,aAAc,GAElB59B,KACA,CACI+rD,kBAAmB,QACnBG,kBAAmB,EACnBD,eAAgB,QAChBE,eAAgB,EAChB/rD,QAAS,OACT40C,SAAU,SACVxhB,eAAgB,gBAChBY,QAAS,QAEbrlB,UACA,CACIiK,WAAY,SACZrX,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,KACpC8uD,kBAAmB,cACnBE,eAAgB9rD,EAAM4B,QAAQ9E,KAAK,KACnCuD,OAAQ,GACRo9B,YAAa,GACbC,aAAc,IAElButB,wBACA,CACIW,kBAAmB,cACnBE,eAAgB,cAChBruB,YAAa,EACbC,aAAc,GAElB6oB,QACA,CACIztC,WAAY,aACZ8yC,kBAAmB5rD,EAAM4B,QAAQ9E,KAAK,KACtCmvD,eAAgB,EAChB5rD,OAAQ,GACRo9B,YAAa,GACbC,aAAc,GACdF,WAAY,IAEb4W,GAGX,OAAOn0C,YAAala,IA8HTga,CAAmBob,aAAU2vC,KClNrC,IAAMoB,GADZtgD,YACD,GADA,cAEIlO,YAEQ4+C,eAEJ,GAAIllD,KAAKtO,MAAMiiE,uBAAuB5jE,OAAS,EAE3C,OAAO,EAGX,IAAK,MAAMsD,KAAc2M,KAAKtO,MAAMkiE,iBACpC,CACI,MAAMrvD,EAAmB7U,IAAQ8U,oBAC7BxE,KAAKtO,MAAMpC,OAAQ+D,GAEvB,QAAqCiQ,IAAjCiB,EAAiBoU,YAEjB,OAAO,EAGX,GAAIpU,EAAiBoU,aAAelW,IAAYiC,SAE5C,OAAO,EAIf,OAAO,EAGJ/E,SACN,IAAD,EACI,IAAKK,KAAKklD,eAEN,OAAO,KAGX,IAAIhpB,EACA,CACIyiB,IAAK,WACLF,OAAQ,SACRF,MAAO,cACTv+C,KAAKtO,MAAMqsD,SAKbhzC,OAAOzH,GACP,UAAAtD,KAAKtO,MAAM6gB,WAAWC,mBAAtB,eAAmCiH,mBACL,WAA3BzZ,KAAKtO,MAAMqiE,cAEd73B,EAAiB,SACjBnxB,EAAO,QAGX,MAAM2yC,EAA8B,WAAnBxhB,EAA8B,SAAW,OACpDtxB,EAA8B,WAAnBsxB,EAA8B,OAAS,EAElDx0B,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MACxCE,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAEvB98C,KAAKtO,MAAMirD,IAEXj1C,EAAQhX,KACJsP,KAAKtO,MAAMgW,QAAX,gCAA4Ci1C,KAIxD,OACI,uBACI95C,UAAW6E,EAAQjK,KAAK,KACxBkF,MAAO,CACHoI,OACA2yC,WACAxhB,iBACAtxB,aAGH5K,KAAKtO,MAAMH,cA/E5B,GAqFeoX,I,GAAAA,eAlICC,IAEZ,MAAMo0C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,yBAAD,OAA0BL,IACtC,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,SAKzB,MAAM00C,EAAkB,GACxB,IAAK,MAAMb,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMC,EAAcv0C,EAAMw0C,SAASjjD,KAAKkjD,QAAQV,GAC1Cc,EAAe70C,EAAMw0C,SAASrsC,MAAMssC,QAAQV,GAElDa,EAAgB50C,EAAM0V,YAAYG,GAAGk+B,IACjC,CACIz5C,WAAsC,IAAzBi6C,EAAYt9C,WACzB4J,YAAuC,IAAzB0zC,EAAYt9C,WAE1BwmC,YAAuC,GAA1BoX,EAAa59C,WAC1BymC,aAAwC,GAA1BmX,EAAa59C,YAIvC,MAAMlR,EAAM,aAEJ+Z,KAAK,aAEDgZ,WAAY,SACZ5Y,QAAS,QACN00C,IAEJR,GAGX,OAAOn0C,YAAala,IAyFTga,CAAmBob,aAAU+wC,KC1ErC,IAAMC,GADZvgD,YACD,GADA,cAEIlO,YAEQ4+C,eAEJ,GAAIllD,KAAKtO,MAAMsjE,wBAA0Bh1D,KAAKtO,MAAMpC,OAEhD,OAAO,EAGX,MAAMiV,EAAmB7U,IAAQ8U,oBAC7BxE,KAAKtO,MAAMpC,OAAQ0Q,KAAKtO,MAAMmrD,iBAElC,YAAqCv5C,IAAjCiB,EAAiBoU,aAKdpU,EAAiBoU,aAAelW,IAAYiC,SAGhD/E,SAEH,IAAKK,KAAKklD,eAEN,OAAO,KAGX,MAAMx9C,EAAoB,CAAC1H,KAAKtO,MAAMgW,QAAQgB,MAC9C,IAAIqC,OAAOzH,EACX,GAAItD,KAAKtO,MAAM6gB,WAEX,GAAIvS,KAAKtO,MAAM6gB,WAAW+E,aAEtB5P,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQmsD,8BAE/B,GAAI7zD,KAAKtO,MAAM6gB,WAAWC,aACxBxS,KAAKtO,MAAM6gB,WAAWC,YAAYiH,iBAErC,OAAQzZ,KAAKtO,MAAMqiE,aAEf,IAAK,SAIDhpD,EAAO,OACPrD,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQutD,sBAChC,MACJ,IAAK,SACDvtD,EAAQhX,KAAKsP,KAAKtO,MAAMgW,QAAQwtD,sBAOhD,MAAMtsD,EAAQ5I,KAAKtO,MAAMkX,MAEzB,IAAK,MAAM+zC,KAAc/zC,EAAMk0C,sBAEvB98C,KAAKtO,MAAMirD,IAEXj1C,EAAQhX,KACJsP,KAAKtO,MAAMgW,QAAX,+BAA2Ci1C,KAIvD,OACI,uBACI95C,UAAW6E,EAAQjK,KAAK,KACxBkF,MAAO,CACHoI,SAGH/K,KAAKtO,MAAMH,cA1E5B,GAgFeoX,mBAzICC,IAEZ,MAAMo0C,EAAmB,GACzB,IAAK,MAAML,KAAc/zC,EAAMk0C,sBAE3BE,EAAiB,wBAAD,OAAyBL,IACrC,CACI,CAAC/zC,EAAM0V,YAAYC,KAAKo+B,IACxB,CACI7zC,QAAS,UAKzB,MAAMm0C,EAAiB,GACvB,IAAK,MAAMN,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMC,EAAcv0C,EAAMw0C,SAASjjD,KAAKkjD,QAAQV,GAEhDM,EAAer0C,EAAM0V,YAAYG,GAAGk+B,IAChC,CACItW,YAAsC,GAAzB8W,EAAYt9C,WACzBymC,aAAuC,GAAzB6W,EAAYt9C,YAItC,MAAMlR,EAAM,aAEJsmE,qBACA,CACIzrB,cAAe,GAEnB0rB,qBACA,CACI1rB,cAAe,IAEnB9gC,KAAK,aAEDI,QAAS,OACT8B,SAAU,EACVw7B,WAAY,EACZr9B,MAAO,QAEJk0C,GAEP4W,wBACA,CACIrqB,cAAe,GACfpD,WAAY,IAEb4W,GAGX,OAAOn0C,YAAala,IAoFTga,CAAmBob,aAAUgxC,KCpJrC,MAAMI,WACT7uD,gBAEO3G,SAUH,OARIK,KAAKtO,MAAM6gB,WAAW6xC,WACnBpkD,KAAKtO,MAAMmW,MAAMnW,MAAjB,WAEHsO,KAAKtO,MAAMmW,MAAMnW,MAAjB,cAAqC4R,GAKpCtD,KAAKtO,MAAMsO,KAAKtO,MAAMqX,OAMvB,gBAAC,GAAD,CACIlB,MAAO7H,KAAKtO,MAAMmW,MAClB0K,WAAYvS,KAAKtO,MAAM6gB,aANpB,MAYJ4iD,I,GAAAA,MCJR,IAAMC,GADZ5gD,YACD,GADA,cAEIlO,YAIOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAHiB2jE,sBAGjB,OAQQC,iBAAmB,KAEvB95D,IAAS2a,KAAKnW,KAAKq1D,iBAAkBr1D,KAAK+G,MAAMwuD,oBAPhDv1D,KAAK+G,MAAQ,GAEb/G,KAAKq1D,iBAAL,UAA2B3jE,EAAMpC,QAQ7BkmE,qBAAqB58B,GAErBA,GAAOA,IAAQ54B,KAAK+G,MAAMwuD,mBAE1Bv1D,KAAKiH,SAAS,CAAEsuD,kBAAmB38B,IAInCssB,eAEJ,IAAK,MAAMr9C,KAAS7H,KAAKtO,MAAM+jE,WAC/B,CACI,IAAK5tD,EAAMnW,MAAMsO,KAAKtO,MAAMqX,OAExB,SAGJ,GAAIlB,EAAMnW,MAAMgkE,aAEZ,OAAO,EAGX,MAAMriE,EAAawU,EAAMnW,MAAMmW,MAAMnW,MAAMnC,KAErC0oB,EAAoBvoB,IAAQ8U,oBAC9BxE,KAAKtO,MAAMpC,OAAQ+D,GAEvB,IAAK4kB,EAED,OAAO,EAGX,GAAIA,EAAkBU,aAAelW,IAAYiC,SAE7C,OAAO,EAIf,OAAO,EAGJ/E,SAEH,IAAKK,KAAKklD,eAEN,OAAO,KAGX,MAAM3yC,EAAgC,eAE3BvS,KAAKtO,MAAM6gB,WAFgB,CAG9B6xC,UAAWpkD,KAAKtO,MAAM0yD,UACtBb,aAAcvjD,KAAKtO,MAAMikE,eAGjC,OACI,gBAAC,WAAD,KACI,gBAAC,GAAD,CACIX,sBAAsB,GACtBnY,gBAAgB,GAChBvtD,OAAO,GACPknB,IAAI,EACJC,IAAI,EACJlE,WAAYvS,KAAKtO,MAAM6gB,WACvBmE,IAAI,EACJq9C,YAAa/zD,KAAKtO,MAAMqiE,YACxBl9C,IAAI,EACJF,IAAI,GAEJ,gBAACvN,EAAA,EAAD,CACIkM,aAAY3nB,IAAIwD,eAAe,QAC/BwjB,UAAYiD,GACR5X,KAAKw1D,qBAAqB59C,GAC9BtY,KAAMU,KAAKtO,MAAMikE,aACX,cACA,oBACN/gD,QAAS5U,KAAKs1D,iBACd1rD,KAAM5J,KAAKtO,MAAMikE,aACX,QACA,QACN9gD,UAAW,KAGnB,gBAAC4hC,EAAA,EAAD,CACIC,SAAU12C,KAAK+G,MAAMwuD,kBACrB31D,aAAc,CACVC,WAAY,OACZC,SAAU,UAEd81D,WAAY51D,KAAKtO,MAAMikE,aACvBtpB,wBAAoB/oC,EACpB/T,KAAMyQ,KAAKq1D,iBACX34C,SAAU,IACN1c,KAAK+G,MAAMwuD,kBAAmBl6C,QAClClF,MAAM,GAILnW,KAAKtO,MAAM+jE,WAAWn4D,IAAI,CAACuK,EAAO1U,IAC/B,gBAAC,GAAD,eACInF,IAAKmF,EACLof,WAAYA,EACZxJ,MAAO/I,KAAKtO,MAAMqX,OACdlB,EAAMnW,eA1HtC,GAmIeqyB,I,GAAAA,gBAAUrO,cAAY0/C,KCpH9B,IAAMS,GADZrhD,YACD,GADA,cAEIlO,YAEQ4+C,eAEJ,GAAIllD,KAAKtO,MAAMiiE,uBAAuB5jE,OAAS,EAE3C,OAAO,EAGX,IAAK,MAAMsD,KAAc2M,KAAKtO,MAAMkiE,iBACpC,CACI,MAAMrvD,EAAmB7U,IAAQ8U,oBAC7BxE,KAAKtO,MAAMpC,OAAQ+D,GAEvB,QAAqCiQ,IAAjCiB,EAAiBoU,YAEjB,OAAO,EAGX,GAAIpU,EAAiBoU,aAAelW,IAAYiC,SAE5C,OAAO,EAIf,OAAO,EAGJ/E,SACN,IAAD,EACI,IAAKK,KAAKklD,eAEN,OAAO,KAGX,IAAIhpB,EACA,CACIyiB,IAAK,WACLJ,MAAO,cACTv+C,KAAKtO,MAAMqsD,SAWjB,OANI,UAAA/9C,KAAKtO,MAAM6gB,WAAWC,mBAAtB,eAAmCiH,mBACL,WAA3BzZ,KAAKtO,MAAMqiE,cAEd73B,EAAiB,UAIjB,uBACIr5B,UAAW7C,KAAKtO,MAAMgW,QAAQ6U,UAC9B5Z,MAAO,CACHu5B,mBAGHl8B,KAAKtO,MAAMH,cA1D5B,GAgEeoX,I,GAAAA,eA/FCC,IAEZ,MAAMo1C,EAAoB,GAC1B,IAAK,MAAMrB,KAAc/zC,EAAMs0C,mBAC/B,CACI,MAAMO,EAAe70C,EAAMw0C,SAASrsC,MAAMssC,QAAQV,GAC5CwC,EAAiBv2C,EAAMw0C,SAASQ,QAAQP,QAAQV,GAEtDqB,EAAkBp1C,EAAM0V,YAAYG,GAAGk+B,IACnC,CACIz5C,WAAuC,IAA1Bu6C,EAAa59C,WAC1B4J,YAAwC,IAA1Bg0C,EAAa59C,WAE3BwmC,YAAyC,GAA5B8Y,EAAet/C,WAC5BymC,aAA0C,GAA5B6Y,EAAet/C,YAIzC,OAAOgJ,YAAa,CAChB0T,UAAU,aAENmF,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,EACN2yC,SAAU,QACPM,MAsEAr1C,CAAmBktD,ICjEnBC,OA3CdthD,YACD,GADA,cAEIlO,YAEO3G,SAEH,MAAM4E,EAAmBsc,GAAkBrc,sBAE3C,IAAKD,EAED,OAAO,KAGX,GAAIA,EAAiBoU,cAAgBlW,IAAYgC,OAE7C,OAAO,KAGX,MAAM1T,EAAgB8vB,GAAkBE,eAClCT,EAAuB/b,EAAiBya,MAAMO,UAAUC,GAC1DA,EAAElS,aAAe/I,EAAiB2a,oBAChCD,EAAe4B,GAAkBI,cAAcX,GACrD,IAAI3xB,EAA0B,KAiB9B,OAfIswB,GAAQluB,IAERpC,EACI,gBAAC,IAAD,CACIiD,UAAU,OACV+Q,MAAO,CAAEsjC,WAAY,KACrBp0C,QAAQ,MAEPlE,IAAIwD,eACD,yBACA,SACA,CAAEJ,QAAOkuB,WAIlBtwB,MAtCf,GC+JO,MAAMonE,WACTzvD,gBACH,eAAD,oBACYsO,QAAWnmB,KAEVuR,KAAKtO,MAAMgT,UAAY1E,KAAKtO,MAAMkjB,UAEnC5U,KAAKtO,MAAMkjB,QAAQnmB,GACnBA,EAAMO,oBAIP2Q,SAEH,MAAM,EAUFK,KAAKtO,OAVH,QACFgW,EADE,UAEF7E,EAFE,SAGFmzD,EAHE,kBAIF3E,EAJE,KAKFrwC,EALE,SAMFxG,EANE,QAOF5F,EAPE,KAQFqK,GARJ,EASOwwC,EATP,yGAYA,IAAIwG,EAAqBvuD,EAAQwuD,QAC7BC,EAAwBzuD,EAAQ0uD,WAEhC3G,EAASl8B,UAET0iC,GAAU,WAAQvuD,EAAQ2uD,cAEtBL,IAEAG,GAAa,WAAQzuD,EAAQ4uD,wBAG5BN,IAELC,GAAU,WAAQvuD,EAAQ6uD,eAGjB,IAATt3C,IAEAg3C,GAAU,WAAQvuD,EAAQu5C,QAG1BjgC,IAEAi1C,GAAU,WAAQvuD,EAAQsZ,OAG9B,IAAI8tC,EAAuBpnD,EAAQ6B,MAkDnC,OAhDIkmD,EAAS/qD,WAEToqD,GAAY,WAAQpnD,EAAQqnD,gBAG5BU,EAASzqB,WAET8pB,GAAY,WAAQpnD,EAAQs9B,WAGhCyqB,EAASlmD,MACL,uBAAK1G,UAAW6E,EAAQuX,MACpB,gBAAC7V,EAAA,EAAD,CACIvG,UAAWszD,EACXxkE,MAAO89D,EAASl8B,SAAW,OAASyiC,EAChC,UAAY,UAChBpkE,UAAU,IACV8S,SAAU+qD,EAAS/qD,SACnBpF,KAAO02D,IAAavG,EAASl8B,UAAavS,EACtC,oBAAiB1d,EACrBqD,KAAG,EACHiO,QAAS5U,KAAK4U,QACdC,UAAW,GAETmhD,IAAavG,EAASl8B,UAAavS,EACjC,KAAO/B,GAEf,uBAAKpc,UAAWozD,IAChB,wBAAMpzD,UAAWisD,GAAeW,EAASlmD,QAI7C8nD,IAEA5B,EAASlmD,MACL,gBAAC,KAAD,CACIkxB,aACI,gBAACp0B,EAAA,EAAD,CACIxD,UAAW6E,EAAQsnD,UACnB1vD,KAAK,uBAEboI,QAAS,CAAE8B,MAAO9B,EAAQ8B,MAAOd,KAAMhB,EAAQ8uD,YAE9C/G,EAASlmD,QAMlB,gBAAC,KAAD,eACI7B,QAAS,CACLhD,SAAUgD,EAAQhD,SAClBgE,MAA6B,OAArB1I,KAAKtO,MAAMqX,OACS,OAArB/I,KAAKtO,MAAMqX,QAAmBkW,EAAQ,GAChB,OAArBjf,KAAKtO,MAAMqX,OAAkBkW,EAAQ,GAChB,OAArBjf,KAAKtO,MAAMqX,OAAkBkW,EAAQ,EACvCvX,EAAQ+uD,QAAU/uD,EAAQgB,KAChC6qB,SAAU7rB,EAAQ6rB,UAEtBmjC,eAAe,EACf9hD,QAAS5U,KAAK4U,SACV66C,KAKL9mD,I,GAAAA,eAlRCC,GAAiBC,YAC7B,CACIW,MACA,CACI,CAACZ,EAAM0V,YAAYG,GAAG,OACtB,CACItE,KAAM,OAEV9P,gBAAiBzB,EAAM4B,QAAQla,MAAMi/D,KACrCp1C,KAAM,GACNG,IAAK,GACLvR,MAAO,IAEXytD,UACA,CACIztD,MAAO,QAEXrE,SACA,CAEI0V,QAAS,eAETlR,cAAe,mBAEnB8lD,UACA,CACIr9D,MAAOiX,EAAM4B,QAAQ4T,OAAOC,MAC5Btb,UAAW,GAEfk+C,MACA,CACI,CAACr4C,EAAM0V,YAAYC,KAAK,OACxB,CACItV,OAAQ,kBACRlG,UAAW,oBAGnBwG,MACA,CAEI,CAACX,EAAM0V,YAAYG,GAAG,OAAQ,CAAEuD,SAAU,IAAKpX,SAAU,OACzD,CAAChC,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,IAAKpX,SAAU,KAC3D,CAAChC,EAAM0V,YAAYG,GAAG,OACtB,CACI4nB,YAAa,EACbD,WAAY,GACZL,UAAW,UAEf,CAACn9B,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,IAAKpX,SAAU,KAC3D,CAAChC,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,OAAQpX,SAAU,KAC9D5F,SAAU,SACVqhC,YAAa,GACbC,aAAc,EACdP,UAAW,OACXp7B,aAAc,YAElBokD,cACA,CACIp9D,MAAOiX,EAAM4B,QAAQ9E,KAAK,MAE9Bsb,KACA,CACI,CAACpY,EAAM0V,YAAYC,KAAK,OACxB,CACItV,OAAQ,kBACR5F,aAAc,KAGtB2hC,SACA,CACI,UACA,CACIrzC,MAAOH,IAAI+Y,eAAe,UAC1BgY,QAAS,SAGjB7Z,KACA,CACIgZ,WAAY,aACZ3W,KAAM,OACN9B,OAAQ,OACR+Y,SAAU,QAEduR,SACA,CACIlpB,gBAAiB,0BAErB4U,KACA,CACI,CAACrW,EAAM0V,YAAYG,GAAG,OACtB,CACIg+B,cAAe,SACfrW,WAAY,GAEhB1kB,WAAY,SACZ5Y,QAAS,OACTiC,KAAM,OACNhC,MAAO,QAEXmtD,QACA,CACI,CAACttD,EAAM0V,YAAYG,GAAG,OACtB,CACIpU,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,KACpCuD,OAAQ,EACR5F,aAAc,GACdH,WAAY,EACZH,WAAY,GACZgG,MAAO,QAEXsB,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,KACpCuD,OAAQ,GACR/F,YAAa,GACb0H,SAAU,EACV7B,MAAO,GAEXqtD,WACA,CACI,CAACxtD,EAAM0V,YAAYG,GAAG,OACtB,CACIxb,SAAU,GACVgG,OAAQ,GACRF,MAAO,IAEX6B,SAAU,IAEd2rD,aACA,CACIlsD,gBAAiB7Y,IAAI+Y,eAAe,YAExC+rD,qBACA,CACIhyC,YAAa9yB,IAAI+Y,eAAe,WAChCga,YAAa,QACbC,YAAa,GAEjB6xC,aACA,CACIhsD,gBAAiBzB,EAAM4B,QAAQ9E,KAAK,MAExC+wD,QACA,CACI,CAAC7tD,EAAM0V,YAAYG,GAAG,OAAQ,CAAEuD,SAAU,IAAKpX,SAAU,KACzD,CAAChC,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,IAAKpX,SAAU,KAC3D,CAAChC,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,IAAKpX,SAAU,KAC3D,CAAChC,EAAM0V,YAAYC,KAAK,OAAQ,CAAEyD,SAAU,OAAQpX,SAAU,KAC9D8W,WAAY,aACZ3W,KAAM,OACN9B,OAAQ,OACR+Y,SAAU,UA6HPrZ,CAAmB+M,cAAYqgD,KC5QvC,IAAMY,GADZniD,YACD,GADA,cAEIlO,YAEQswD,iBACJ33C,EAAiB9rB,EAAeoR,GAGhC,MAAMsyD,EAAkBtyD,EAAiBya,MAAMmB,KAC3CX,GAAKA,EAAElS,aAAe2R,EAAK3R,YAE/B,OAAKupD,EAKDA,EAAgBl+C,cAAgBlW,IAAYgC,OAErC,KAIP,gBAAC,GAAD,CACIuxD,SAAUa,EAAgBN,aAC1B7xD,SAAUmyD,EAAgBl+C,cAAgBlW,IAAYiC,SACtD2sD,kBACI1jE,IAAI0jE,kBAAkBpyC,EAAK3R,YAC/Btf,IAAKixB,EAAK3R,WACV/D,MAAO0V,EAAK1V,MACZyX,KAAO7tB,EAAQ,IAAOoR,EAAiBya,MAAMjvB,OAC7C6kB,QAAS,KAAQiM,GAAkBi2C,SAAS73C,EAAK3R,aACjDimB,SAAUtU,EAAK3R,aAAe/I,EAAiB2a,mBAC/CD,KAAM4B,GAAkBI,cAAc9tB,GACtC0hB,UAAW,EACX1W,MAAO8gB,EAAK3R,aArBT,KAyBR3N,SAEH,MAAM0J,EAAM,eAAQrJ,KAAKtO,OACnB6S,EAAmBsc,GAAkBrc,sBACrCwa,EAAQ6B,GAAkBK,WAEhC,OAAK3c,GAAqBya,EAKtBza,EAAiBoU,cAAgBlW,IAAYgC,OAEtC,KAIP,gBAACsrD,GAAA,EAAD,CACIC,cAAc,IACdntD,UAAWwG,EAAO3B,QAAQgB,MAEzBsW,EAAM1hB,IAAI,CAAC2hB,EAAM9rB,IACd6M,KAAK42D,iBAAiB33C,EAAM9rB,EAAOoR,KAdpC,SA7CnB,GAgEeoE,mBA1ECC,GAAiBC,YAC7B,CACIH,KACA,CACII,QAAS,OACT40C,SAAU,UAqEP/0C,CAAmBguD,I,oBC3ElC,MAAMI,WACFzwD,gBAKOC,YAAY7U,GAEf8U,MAAM9U,GADV,KAJiBslE,uBAIjB,OAHiBC,eAGjB,EAGIj3D,KAAKg3D,kBAAoBE,aACrB,CACIC,eAAe,EACfC,KAAMp3D,KAAKtO,MAAM2lE,gBAEzBr3D,KAAKi3D,UAAYK,YAAS,QAAQ,GAG/B33D,SAEH,OACI,gBAAC43D,GAAA,EAAD,CAAgBP,kBAAmBh3D,KAAKg3D,mBACpC,gBAACQ,EAAA,EAAD,CAAe5uD,MAAO5I,KAAKi3D,WACtB3wD,iBAAqBtG,KAAKtO,MAAM7D,QAC3BmS,KAAKtO,MAAM7D,OACXwD,GAAaC,OAAO0O,KAAKtO,MAAM7D,WAO1CkpE,U,qFCiFA,MAAM1lE,GAUjB,qBAA4BomE,GAEpBpmE,GAAaka,MAAMnd,IAAIqpE,EAAajhE,aAEpCnF,GAAaka,MAAM5b,IAAI8nE,EAAajhE,YAAavD,QAC5C3D,IAEO0K,IAAeC,OAAO7L,IAAIkB,IAE1B0K,IAAeC,OAAOtK,IAAIL,GAASqE,UAMvD,cACI9F,EACA0kC,EAA6B,MAE7B,IAAK1kC,EAED,OAAO,KAGX,IAAI6D,OAA4B4R,EAC5B,UAAWzV,GAEX6D,EAAK,eAAQ7D,EAAM,OACf0kC,IAEA7gC,EAAK,WAAkB6gC,IAGtBA,IAEL7gC,EAAQ,CAAE6gB,WAAYggB,IAG1B,IAAI5jC,EAAqC,KACzC,GAAI,aAAcd,EAGd,GAAIA,EAAM,oBAAwBiM,MAClC,CACI,MAAMvI,EAAoD,GAEzD1D,EAAM,SAA0BoF,QAAS4U,IAEjB,kBAAVA,EAEPtW,EAASb,KAAKmX,GAIdtW,EAASb,KACLW,GAAaC,OAAOuW,EAAO0qB,MAIvC5jC,EAAS2X,gBACLjV,GAAaqmE,aAAa7pE,EAAM,MAChC6D,KAAUH,QAGb,GAAI1D,EAAM,oBAAwB+F,OACvC,CACI,MAAMiU,EAAQxW,GAAaC,OACvBzD,EAAM,SAAc0kC,GAExB5jC,EAAS2X,gBACLjV,GAAaqmE,aAAa7pE,EAAM,MAChC6D,EAAOmW,QAKXlZ,EAAS2X,gBACLjV,GAAaqmE,aAAa7pE,EAAM,MAChC6D,EAAO7D,EAAM,eAMrBc,EAAS2X,gBACLjV,GAAaqmE,aAAa7pE,EAAM,MAAW6D,GAGnD,OAAO/C,EAIX,uBACId,EACA8pE,EACAC,GAGA,MACMrmE,EADY+U,iBAAqBzY,GACVA,EAASwD,GAAaC,OAAOzD,GAE1D,OACI,gBAAC2pE,EAAA,EAAD,CACI5uD,MAAO0uD,YAASK,EAAqBC,IAEpCrmE,GAOb,oBAA2BO,GAEvB,GAAoB,kBAATA,EAEP,OAAOA,EAGX,IAAInD,EAAmC,KAEvC,OAAQmD,GAEJ,IAAK,eACDnD,EAASwpB,GACT,MACJ,IAAK,uBACDxpB,EAASgzB,GACT,MACJ,IAAK,SACDhzB,EAASya,IACT,MACJ,IAAK,iBACDza,EAASyiB,EACT,MACJ,IAAK,cACDziB,EAASszB,GACT,MACJ,IAAK,WACDtzB,EAASm0B,GACT,MACJ,IAAK,OACDn0B,EAASy1B,GACT,MACJ,IAAK,WACDz1B,EAAS+sB,GACT,MACJ,IAAK,qBACD/sB,EAASkmD,GACT,MACJ,IAAK,gBACDlmD,EAASknD,GACT,MACJ,IAAK,uBACDlnD,EAASwnD,GACT,MACJ,IAAK,oBACDxnD,EAASynD,GACT,MACJ,IAAK,uBACDznD,EAASioD,GACT,MACJ,IAAK,mBACDjoD,EAASyoD,GACT,MACJ,IAAK,WACDzoD,EAASgpD,GACT,MACJ,IAAK,WACDhpD,EAAS2wC,GACT,MACJ,IAAK,MACD3wC,EAAS,MACT,MACJ,IAAK,iBACDA,EAASipD,GACT,MACJ,IAAK,eACDjpD,EAASkpD,GACT,MACJ,IAAK,iBACDlpD,EAASg8C,GACT,MACJ,IAAK,gBACDh8C,EAASkpE,KACT,MACJ,IAAK,eACDlpE,EAAS+1B,GACT,MACJ,IAAK,OACD/1B,EAASovB,KACT,MACJ,IAAK,cACDpvB,EAAS8zB,GACT,MACJ,IAAK,mBACD9zB,EAASk0B,GACT,MACJ,IAAK,WACDl0B,EAASwvC,GACT,MACJ,IAAK,WACDxvC,EAAS2X,WACT,MACJ,IAAK,WACD3X,EAASsvD,GACT,MACJ,IAAK,OACDtvD,EAAS2nB,IACT,MACJ,IAAK,aACD3nB,EAASgxD,GACT,MACJ,IAAK,WACDhxD,EAASioB,IACT,MACJ,IAAK,iBACDjoB,EAAS01B,GACT,MACJ,IAAK,YACD11B,EAAS6xD,GACT,MACJ,IAAK,wBACD7xD,EAASgmD,GACT,MACJ,IAAK,oBACDhmD,EAASozD,GACT,MACJ,IAAK,OACDpzD,EAAS0wD,GACT,MACJ,IAAK,eACD1wD,EAASwzD,GACT,MACJ,IAAK,SACDxzD,EAASwyB,KACT,MACJ,IAAK,OACDxyB,EAAS0X,IACT,MACJ,IAAK,cACD1X,EAASg0D,GACT,MACJ,IAAK,4BACDh0D,EAASk0D,GACT,MACJ,IAAK,aACDl0D,EAASmpE,KACT,MACJ,IAAK,mBACDnpE,EAAS6mB,IACT,MACJ,IAAK,iBACD7mB,EAASopE,KACT,MACJ,IAAK,iBACDppE,EAASw1D,GACT,MACJ,IAAK,OACDx1D,EAAS0mB,IACT,MACJ,IAAK,aACD1mB,EAASk2D,GACT,MACJ,IAAK,QACDl2D,EAASs2D,GACT,MACJ,IAAK,aACDt2D,EAAS20D,GACT,MACJ,IAAK,WACD30D,EAASw4D,GACT,MACJ,IAAK,WACDx4D,EAASy4D,GACT,MACJ,IAAK,aACDz4D,EAASs5D,GACT,MACJ,IAAK,cACDt5D,EAASg/C,GACT,MACJ,IAAK,QACDh/C,EAASqpE,KACT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lD,MAAO6R,IAAY,MAEvB+F,MACA,CACIvE,SAAU,SACVC,WAAY,UAEhByD,KACA,CACI,UAAW,CAAE2B,gBAAiB+6D,GAC9Bj/B,aAAc,EACdljC,SAAU,GACVgjC,WAAY,IACZC,cAAe,EACflkB,SAAU,OACV5X,UAAW,GACXo/B,cAAe,GACfnD,YAAa,GACbC,aAAc,GACdF,WAAY,IAEhBm/B,UACA,CACIp/B,aAAc,EACdljC,SAAU,GACVgjC,WAAY,IACZC,cAAe,EACf97B,UAAW,GACXo/B,cAAe,GACfnD,YAAa,GACbC,aAAc,GACdF,WAAY,IAEhBo/B,UACA,CACIr/B,aAAc,EACdljC,SAAU,EACVgjC,WAAY,IACZC,cAAe,EACf97B,UAAW,GACXo/B,cAAe,EACfnD,YAAa,GACbC,aAAc,GACdF,WAAY,GAEhBltC,KACA,CACImtC,YAAa,GACbC,aAAc,KAGtBm/B,eACA,CACI/8D,KACA,CACI,eAAgB,CAAE8gC,cAAe,GACjCpD,WAAY,IAGpBs/B,cACA,CACIv+C,OACA,CACI1d,YAAa,EACb1G,UAAW,IAGnB4iE,YACA,CACIj9D,KACA,CACIzF,SAAU,GACVgG,OAAQ,GACR/F,YAAa,EACbsb,QAAS,EACTzV,MAAO,KAGf68D,QACA,CACIr8D,MACA,CACI88B,YAAa,EACbC,aAAc,GAElB59B,KACA,CACI/W,MAAOqzE,EACP/hE,SAAU,GACVgG,OAAQ,KAGhB48D,YACA,CACIC,QACA,CACI9gE,SAAU,YAGlB+gE,UACA,CACIC,iBACA,CACIlgC,UAAW,SAGnBmgC,iBACA,CACIv9D,KACA,CACI8V,QAAS,IAGjB0nD,iBACA,CACIx9D,KACA,CACI1D,SAAU,WAGlBmhE,WACA,CACIz9D,KACA,CACI2B,gBAAiB7G,IAAY,OAGrC4iE,UACA,CACInpD,MACA,CACI,0BACA,CACIrS,SAAU,OAItBy7D,kBACA,CACI39D,KACA,CACI,gBACA,CACI49D,oBAAqB,EACrBC,qBAAsB,GAE1Bl8D,gBAAiB7G,IAAY,OAGrCgjE,yBACA,CACIjkD,QACA,CACI,kBAAmB,CAAE+jB,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","file":"static/js/main.37b9b0de.chunk.js","sourcesContent":["import { observable } from 'mobx';\r\nimport Logging from '../core/Logging';\r\nimport { Menu as MenuBase } from '../coreui/Menu';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { Select as SelectBase } from '../coreui/Select';\r\nimport { Toast } from '../coreui/Toast';\r\nimport Credentials from '../models/Credentials';\r\nimport PaneRow from '../models/PaneRow';\r\nimport Api from '../mustangui/Api';\r\nimport { ApiSelect as ApiSelectBase } from '../mustangui/ApiSelect';\r\nimport { EmbeddedAddOn as EmbeddedAddOnBase } from '../mustangui/EmbeddedAddOn';\r\nimport BaseService from '../services/BaseService';\r\nimport SystemConfigService from '../services/SystemConfigService';\r\nimport ConfirmContinueStore from '../stores/ConfirmContinueStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport AppServer from './AppServer';\r\nimport Monitor from './Monitor';\r\nimport Routing from './Routing';\r\nimport TrackableCollection from './TrackableCollection';\r\nimport TrackableModel from './TrackableModel';\r\n\r\nexport interface ISettings\r\n{\r\n availableLanguages: { code: string; description: string }[];\r\n baselineGridSize: number;\r\n colorPalette:\r\n {\r\n danger: string;\r\n information: string;\r\n primary: string;\r\n secondary: string;\r\n success: string;\r\n warning: string;\r\n } | null;\r\n currentLanguageCode: string;\r\n dateFormat: string;\r\n dayAbbreviations: string[];\r\n days: string[];\r\n decimalSeparator: string;\r\n enableEmailAuthentication: boolean;\r\n environmentBannerColor: string | null;\r\n favIcon: string;\r\n monthAbbreviations: string[];\r\n months: string[];\r\n nonProdEnvironment: string;\r\n reCaptchaSiteKey: string;\r\n rootUrl: string;\r\n siteName: string;\r\n thousandsSeparator: string;\r\n translations: object;\r\n useConfiguredAuthentication: boolean;\r\n}\r\n\r\nexport interface BusinessError\r\n{\r\n message: string;\r\n rows: {\r\n dataId: string;\r\n parentGridDescription: string;\r\n parentGridKey: string;\r\n rowKey: string;\r\n topPaneUseKey?: string;\r\n }[];\r\n widgets: {\r\n dataId: string;\r\n isColumnWidget: boolean;\r\n parentGridDescription: string | null;\r\n parentGridKey: string | null;\r\n rowKey: string;\r\n topPaneUseKey?: string;\r\n widgetName: string;\r\n }[];\r\n}\r\n\r\nexport interface SessionMessage\r\n{\r\n message: string;\r\n messageId: number;\r\n messageType: 'Caution' | 'Danger' | 'Info' | 'Success';\r\n}\r\n\r\nexport default class Sys\r\n{\r\n private static currentNextId: number = 1;\r\n // Grab the cookie path from the url, this works since it's a single page app\r\n private static readonly cookiePath =\r\n window.location.pathname || '/';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private static requestCache: any = null;\r\n public static baseUrl: string | null = null;\r\n @observable\r\n public static businessErrors: BusinessError[];\r\n public static currentCredentials: Credentials;\r\n public static fileUrl: string | null = 'FileHandler.ashx';\r\n public static guestSessionTokenCookie: string = 'guestSessionToken';\r\n // Indicates if pending changes should be ignored.\r\n public static ignoreChanges: boolean = false;\r\n // Indicates if changes to the hash should be ignored.\r\n public static ignoreHashChanges: boolean = false;\r\n public static isChrome: boolean =\r\n window.navigator.userAgent.includes('Chrome') &&\r\n !window.navigator.userAgent.includes('Edge');\r\n public static isEdge: boolean =\r\n window.navigator.userAgent.includes('Edge');\r\n public static isFirefox: boolean =\r\n window.navigator.userAgent.includes('Firefox');\r\n public static isMobile: boolean =\r\n window.navigator.userAgent.includes('Android')\r\n || window.navigator.userAgent.includes('BlackBerry')\r\n || window.navigator.userAgent.includes('iPad')\r\n || window.navigator.userAgent.includes('iPhone')\r\n || window.navigator.userAgent.includes('webOS')\r\n || window.navigator.userAgent.includes('Windows Phone');\r\n public static isSafari: boolean =\r\n window.navigator.userAgent.includes('Safari');\r\n // Dictionary of key listeners, keyed by key config.\r\n public static keyListeners: Map =\r\n new Map();\r\n public static lastHash: object | null = null;\r\n public static loadArgs: object | null = null;\r\n public static loadMonitor: boolean = false;\r\n public static modelNameSpace: string | null = 'mustang';\r\n public static monitor: Monitor | null = null;\r\n public static monitorKey: object =\r\n {\r\n alt: true,\r\n ctrl: true,\r\n key: 's',\r\n shift: false,\r\n };\r\n public static requestCacheClearKey: object =\r\n {\r\n alt: true,\r\n ctrl: true,\r\n key: 'r',\r\n shift: false,\r\n };\r\n public static requestCacheStorage: string = 'LocalStorage';\r\n public static requestId: string | null = 'dataId';\r\n // Collection of script request cache keys.\r\n // Used to track which scripts have already been executed.\r\n public static scripts: Set = new Set();\r\n public static scriptUrl: string | null = 'ScriptHandler.ashx';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static sessionExpirationTimeout: any;\r\n @observable\r\n public static sessionMessages: SessionMessage[];\r\n public static sessionTokenCookie: string = 'authenticatedSessionToken';\r\n public static traceKeyCookie: string = 'traceKey';\r\n // Must provide initial value for ajaxTimeout so settings can be requested.\r\n // Bracket placement is non standard because of linter bug.\r\n public static settings: ISettings = {\r\n availableLanguages: [],\r\n baselineGridSize: 4,\r\n colorPalette: null,\r\n currentLanguageCode: '',\r\n dateFormat: 'mmm dd, yyyy',\r\n dayAbbreviations: [], // Expects Sunday to be first\r\n days: [], // Expects Sunday to be first\r\n decimalSeparator: '.',\r\n enableEmailAuthentication: false,\r\n environmentBannerColor: null,\r\n externalAuthenticators:\r\n [\r\n {\r\n description: '',\r\n iconName: '',\r\n providerName: '',\r\n url: '',\r\n },\r\n ],\r\n favIcon: '',\r\n monthAbbreviations: [], // Expects January to be first\r\n months: [], // Expects January to be first\r\n nonProdEnvironment: '',\r\n reCaptchaSiteKey: '',\r\n rootUrl: '',\r\n showErrorDetails: false,\r\n siteName: '',\r\n thousandsSeparator: ',',\r\n translations: Object.create(null),\r\n useConfiguredAuthentication: false,\r\n } as ISettings;\r\n\r\n public static get nextId(): number\r\n {\r\n return Sys.currentNextId++;\r\n }\r\n\r\n private static addKeyHandler(config: object, handler: Function): void\r\n {\r\n let targetElement: HTMLElement | Window | null;\r\n const key = JSON.stringify(config);\r\n\r\n if (!Sys.keyListeners.has(key) && handler)\r\n {\r\n if (config['target'])\r\n {\r\n targetElement = document.getElementById(config['target']);\r\n }\r\n else\r\n {\r\n targetElement = window;\r\n }\r\n\r\n if (targetElement)\r\n {\r\n const listener = (event: Event) =>\r\n {\r\n const keyboardEvent = event as KeyboardEvent;\r\n let result = true;\r\n\r\n if (keyboardEvent.key === config['key']\r\n && keyboardEvent.ctrlKey === config['ctrl']\r\n && keyboardEvent.altKey === config['alt']\r\n && keyboardEvent.shiftKey === config['shift']\r\n && !keyboardEvent.repeat)\r\n {\r\n result = handler(keyboardEvent);\r\n\r\n if (!result)\r\n {\r\n keyboardEvent.stopPropagation();\r\n keyboardEvent.preventDefault();\r\n keyboardEvent.returnValue = false;\r\n keyboardEvent.cancelBubble = true;\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n Sys.keyListeners.set(JSON.stringify(config), listener);\r\n targetElement.addEventListener('keydown', listener);\r\n }\r\n }\r\n }\r\n\r\n private static clearWidgetErrors(\r\n dataId: string,\r\n name: string,\r\n rowKey: string\r\n ): void\r\n {\r\n const row = PaneRow.get(dataId, rowKey);\r\n\r\n if (!row)\r\n {\r\n return;\r\n }\r\n\r\n const widget = row.getWidget(name);\r\n widget.properties.businessErrors.length = 0;\r\n }\r\n\r\n private static createBusinessError(message: string): BusinessError\r\n {\r\n const businessError =\r\n {\r\n message,\r\n rows: [],\r\n widgets: [],\r\n };\r\n\r\n return businessError;\r\n }\r\n\r\n private static updateErrorDisplay(): void\r\n {\r\n if (Sys.businessErrors.length === 0)\r\n {\r\n Sys.hideToast();\r\n\r\n return;\r\n }\r\n\r\n const messages: string[] = [];\r\n const gridErrorCountByKey:\r\n { [key: string]: {count: number; description: string} } = {};\r\n\r\n for (const error of Sys.businessErrors)\r\n {\r\n const gridErrors:\r\n {\r\n description: string;\r\n key: string;\r\n }[] = [];\r\n\r\n for (const widget of error.widgets)\r\n {\r\n if (widget.isColumnWidget)\r\n {\r\n gridErrors.push(\r\n {\r\n description: widget.parentGridDescription!,\r\n key: widget.parentGridKey!,\r\n });\r\n }\r\n }\r\n\r\n for (const row of error.rows)\r\n {\r\n gridErrors.push(\r\n {\r\n description: row.parentGridDescription,\r\n key: row.parentGridKey,\r\n });\r\n }\r\n\r\n for (const gridError of gridErrors)\r\n {\r\n if (gridError.key in gridErrorCountByKey)\r\n {\r\n gridErrorCountByKey[gridError.key].count++;\r\n }\r\n else\r\n {\r\n gridErrorCountByKey[gridError.key] =\r\n {\r\n count: 1,\r\n description: gridError.description,\r\n };\r\n }\r\n }\r\n\r\n if (gridErrors.length === 0)\r\n {\r\n messages.push(error.message);\r\n }\r\n }\r\n\r\n for (const key in gridErrorCountByKey)\r\n {\r\n if (!gridErrorCountByKey.hasOwnProperty(key))\r\n {\r\n continue;\r\n }\r\n\r\n const translationArgs =\r\n {\r\n count: gridErrorCountByKey[key].count,\r\n description: gridErrorCountByKey[key].description,\r\n };\r\n\r\n const errorTemplate = translationArgs.count === 1\r\n ? '{count} error exists within the {description} table'\r\n : '{count} errors exist within the {description} table';\r\n\r\n const message = Sys.getTranslation(\r\n errorTemplate, 'Data Table', translationArgs);\r\n\r\n messages.push(message);\r\n }\r\n\r\n Sys.showToast(\r\n Presentation.create(\r\n {\r\n children: Api.getErrorMessages(messages),\r\n props:\r\n {\r\n color: 'error',\r\n component: 'div',\r\n variant: 'body2',\r\n },\r\n type: 'Typography',\r\n }),\r\n true,\r\n null,\r\n 'right',\r\n 'bottom',\r\n null,\r\n () => { Sys.clearErrors(); });\r\n }\r\n\r\n public static addRequestCacheItem(\r\n requestCacheKey: string,\r\n request: XMLHttpRequest\r\n ): void\r\n {\r\n switch (Sys.requestCacheStorage)\r\n {\r\n case 'InProcess':\r\n Sys.getRequestCache().set(requestCacheKey, request.responseText);\r\n break;\r\n case 'LocalStorage':\r\n try\r\n {\r\n Sys.getRequestCache().setItem(\r\n `${Sys.cookiePath}/${requestCacheKey}`,\r\n request.responseText);\r\n }\r\n catch (exception)\r\n {\r\n if (exception.name === 'QuotaExceededError')\r\n {\r\n Sys.clearRequestCache();\r\n Logging.log(\r\n 'Request cache quota exceeded, cache cleared.');\r\n Sys.addRequestCacheItem(requestCacheKey, request);\r\n }\r\n else\r\n {\r\n throw exception;\r\n }\r\n }\r\n break;\r\n default:\r\n Logging.log(\r\n `Invalid request cache type: ${Sys.requestCacheStorage}`);\r\n break;\r\n }\r\n }\r\n\r\n public static announce(message: string)\r\n {\r\n const announcer = document.getElementById('announcer');\r\n\r\n if (announcer)\r\n {\r\n announcer.innerText = message;\r\n\r\n // Allow dom to update before cleaning up.\r\n setTimeout(\r\n () =>\r\n {\r\n announcer.innerText = '';\r\n },\r\n 100);\r\n }\r\n }\r\n\r\n public static clearBusinessErrors(\r\n dataId?: string, name?: string, rowKey?: string)\r\n {\r\n if (dataId && name && rowKey)\r\n {\r\n let deleteCount: number = 0;\r\n let done: boolean = true;\r\n\r\n // Need to clone the array so we can delete items.\r\n [...Sys.businessErrors].forEach(\r\n (businessError: BusinessError, index: number) =>\r\n {\r\n if (businessError.widgets.some(widget =>\r\n widget.dataId === dataId\r\n && widget.widgetName === name\r\n && widget.rowKey === rowKey))\r\n {\r\n businessError.widgets.forEach((widget) =>\r\n {\r\n Sys.clearWidgetErrors(\r\n widget.dataId,\r\n widget.widgetName,\r\n widget.rowKey);\r\n });\r\n\r\n Sys.businessErrors.splice(index - deleteCount, 1);\r\n deleteCount++;\r\n done = false;\r\n }\r\n });\r\n\r\n if (!done)\r\n {\r\n Sys.updateErrorDisplay();\r\n }\r\n }\r\n else if (dataId && name)\r\n {\r\n let deleteCount: number = 0;\r\n let done: boolean = true;\r\n\r\n // Need to clone the array so we can delete items.\r\n [...Sys.businessErrors].forEach(\r\n (businessError: BusinessError, index: number) =>\r\n {\r\n if (businessError.widgets.some(widget =>\r\n widget.dataId === dataId\r\n && widget.widgetName === name))\r\n {\r\n businessError.widgets.forEach((widget) =>\r\n {\r\n Sys.clearWidgetErrors(\r\n widget.dataId,\r\n widget.widgetName,\r\n widget.rowKey);\r\n });\r\n\r\n Sys.businessErrors.splice(index - deleteCount, 1);\r\n deleteCount++;\r\n done = false;\r\n }\r\n });\r\n\r\n if (!done)\r\n {\r\n Sys.updateErrorDisplay();\r\n }\r\n }\r\n else if (dataId && rowKey)\r\n {\r\n let deleteCount: number = 0;\r\n let done: boolean = true;\r\n\r\n // Need to clone the array so we can delete items.\r\n [...Sys.businessErrors].forEach(\r\n (businessError: BusinessError, index: number) =>\r\n {\r\n if (businessError.widgets.some(widget =>\r\n widget.dataId === dataId\r\n && widget.rowKey === rowKey))\r\n {\r\n businessError.widgets.forEach((widget) =>\r\n {\r\n Sys.clearWidgetErrors(\r\n widget.dataId,\r\n widget.widgetName,\r\n widget.rowKey);\r\n });\r\n\r\n Sys.businessErrors.splice(index - deleteCount, 1);\r\n deleteCount++;\r\n done = false;\r\n }\r\n else if (businessError.rows.some(row =>\r\n row.dataId === dataId\r\n && row.rowKey === rowKey))\r\n {\r\n Sys.businessErrors.splice(index - deleteCount, 1);\r\n deleteCount++;\r\n done = false;\r\n }\r\n });\r\n\r\n if (!done)\r\n {\r\n Sys.updateErrorDisplay();\r\n }\r\n }\r\n else\r\n {\r\n Sys.clearErrors();\r\n }\r\n }\r\n\r\n public static clearErrors(): void\r\n {\r\n for (const error of Sys.businessErrors)\r\n {\r\n for (const widget of error.widgets)\r\n {\r\n Sys.clearWidgetErrors(\r\n widget.dataId, widget.widgetName, widget.rowKey);\r\n }\r\n }\r\n\r\n Sys.businessErrors.length = 0;\r\n Sys.updateErrorDisplay();\r\n }\r\n\r\n public static clearRequestCache(reload: boolean = true)\r\n {\r\n const requestCache = Sys.getRequestCache();\r\n\r\n switch (Sys.requestCacheStorage)\r\n {\r\n case 'InProcess':\r\n requestCache.clear();\r\n break;\r\n case 'LocalStorage':\r\n for (const key of Object.keys(requestCache))\r\n {\r\n if (key.startsWith(`${Sys.cookiePath}/`))\r\n {\r\n requestCache.removeItem(key);\r\n }\r\n }\r\n break;\r\n default:\r\n Logging.log(\r\n `Invalid request cache type: ${Sys.requestCacheStorage}`);\r\n break;\r\n }\r\n\r\n if (reload)\r\n {\r\n window.location.reload();\r\n }\r\n }\r\n // Prompts the user if outstanding changes exist.\r\n public static async confirmContinue(\r\n clearState: boolean = true\r\n ): Promise\r\n {\r\n const promise = new Promise((resolve, reject) =>\r\n {\r\n if (!Sys.ignoreChanges)\r\n {\r\n EmbeddedAddOnBase.instances.forEach(\r\n (embeddedAddOn: EmbeddedAddOnBase) =>\r\n {\r\n embeddedAddOn.roundTripStarting();\r\n });\r\n\r\n if (Sys.hasChanges())\r\n {\r\n ConfirmContinueStore.instance.openDialog(resolve, reject);\r\n }\r\n else\r\n {\r\n resolve(true);\r\n }\r\n }\r\n else\r\n {\r\n resolve(true);\r\n }\r\n });\r\n\r\n if (!Sys.ignoreChanges && Sys.hasChanges() && clearState)\r\n {\r\n promise.then(() =>\r\n {\r\n AppServer.clearState();\r\n }).catch(() => { /* Do nothing */ });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public static defer(\r\n method: Function,\r\n deferPeriod: number,\r\n scope: object,\r\n args: IArguments\r\n ): void\r\n {\r\n if (deferPeriod)\r\n {\r\n setTimeout(() => { method.call(scope, ...args); }, deferPeriod);\r\n }\r\n else\r\n {\r\n method.call(scope, ...args);\r\n }\r\n }\r\n\r\n public static deleteCookie(name: string): void\r\n {\r\n if (name)\r\n {\r\n // eslint-disable-next-line max-len\r\n document.cookie = `${encodeURIComponent(name)}=; path=${Sys.cookiePath}; expires==Thu, 01 Jan 1970 00:00:01 GMT`;\r\n }\r\n }\r\n\r\n public static formatDate(\r\n dateValue: number,\r\n format?: string | null\r\n ): string | null\r\n {\r\n if (dateValue <= 0)\r\n {\r\n return null;\r\n }\r\n\r\n const date: Date = new Date(dateValue);\r\n if (!format)\r\n {\r\n return date.toLocaleString();\r\n }\r\n\r\n const fraction = /f+/;\r\n const dayNames = Sys.settings.days;\r\n const dayAbbreviations = Sys.settings.dayAbbreviations;\r\n const monthNames = Sys.settings.months;\r\n const monthAbbreviations = Sys.settings.monthAbbreviations;\r\n\r\n let result = format;\r\n result = result.replace('yyyy', date.getFullYear().toString());\r\n result = result.replace('yy', date.getFullYear().toString().slice(-2));\r\n result = result.replace('MM', `0${date.getMonth() + 1}`.slice(-2));\r\n result = result.replace('M', (date.getMonth() + 1).toString());\r\n result = result.replace('dd', `0${date.getDate()}`.slice(-2));\r\n result = result.replace('d', date.getDate().toString());\r\n result = result.replace('HH', `0${date.getHours()}`.slice(-2));\r\n result = result.replace('H', date.getHours().toString());\r\n const hh = date.getHours() > 12 ? date.getHours() - 12 :\r\n date.getHours() < 1 ? 12 : date.getHours();\r\n result = result.replace('hh', `0${hh}`.slice(-2));\r\n result = result.replace('h', date.getHours() > 12 ?\r\n (date.getHours() - 12).toString() :\r\n date.getHours() < 1 ? '12' : date.getHours().toString());\r\n result = result.replace('mm', `0${date.getMinutes()}`.slice(-2));\r\n result = result.replace('m', date.getMinutes().toString());\r\n result = result.replace('ss', `0${date.getSeconds()}`.slice(-2));\r\n result = result.replace('s', date.getSeconds().toString());\r\n result = result.replace('ap', date.getHours() > 11 ? 'pm' : 'am');\r\n\r\n const match = fraction.exec(result);\r\n\r\n if (match)\r\n {\r\n result = result.replace(\r\n fraction,\r\n date.getMilliseconds().toString().substr(\r\n 0, match[0].length));\r\n }\r\n\r\n result = result.replace('NNNN', monthNames[date.getMonth()]);\r\n result = result.replace('NNN', monthAbbreviations[date.getMonth()]);\r\n result = result.replace('DDDD', dayNames[date.getDay()]);\r\n result = result.replace('DDD', dayAbbreviations[date.getDay()]);\r\n\r\n return result;\r\n }\r\n\r\n public static getCookie(name: string): string | null\r\n {\r\n let result: string | null = null;\r\n let cookies: string[];\r\n\r\n if (name && document.cookie)\r\n {\r\n cookies = document.cookie.split(';');\r\n\r\n cookies.forEach((cookie) =>\r\n {\r\n const cookieParts: string[] = cookie.split('=');\r\n\r\n if (cookieParts[0].trim() === encodeURIComponent(name))\r\n {\r\n result = decodeURIComponent(cookieParts[1]);\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Returns the current hash value.\r\n public static getHash(asObject: boolean = true): string | object | null\r\n {\r\n // Strip the trailing \"/\" from the hash\r\n const hash = window.location.hash.replace(/\\/$/, '');\r\n let result: string | object | null = null;\r\n if (hash.length > 1)\r\n {\r\n result = hash.substr(1);\r\n\r\n if (asObject)\r\n {\r\n result = Sys.queryStringToObject(result);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getObjectHandle(\r\n baseToken: string,\r\n hash: object | null = null\r\n ): string | null\r\n {\r\n return Sys.getRouteToken(baseToken, 1, hash);\r\n }\r\n\r\n public static getPresentation(\r\n baseToken: string,\r\n hash: object | null = null\r\n ): string | null\r\n {\r\n return Sys.getRouteToken(baseToken, 2, hash);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static getRequestCache(): any\r\n {\r\n if (!Sys.requestCache)\r\n {\r\n switch (Sys.requestCacheStorage)\r\n {\r\n case 'InProcess':\r\n Sys.requestCache = new Map();\r\n break;\r\n case 'LocalStorage':\r\n Sys.requestCache = window.localStorage;\r\n break;\r\n default:\r\n Logging.log(\r\n `Invalid request cache type: ${Sys.requestCacheStorage}`);\r\n break;\r\n }\r\n }\r\n\r\n return Sys.requestCache;\r\n }\r\n\r\n public static getRequestCacheItem(requestCacheKey: string): string | null\r\n {\r\n let result: string | null = null;\r\n\r\n switch (Sys.requestCacheStorage)\r\n {\r\n case 'InProcess':\r\n result = Sys.getRequestCache().get(requestCacheKey);\r\n break;\r\n case 'LocalStorage':\r\n result =\r\n Sys.getRequestCache()\r\n .getItem(`${Sys.cookiePath}/${requestCacheKey}`);\r\n break;\r\n default:\r\n Logging.log(\r\n `Invalid request cache type: ${Sys.requestCacheStorage}`);\r\n break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getRequestCacheKey(config: object)\r\n {\r\n const args = { ...config['args'] };\r\n\r\n delete args['cacheRequest'];\r\n\r\n return JSON.stringify(\r\n {\r\n args,\r\n authenticated: Sys.getCookie(Sys.sessionTokenCookie),\r\n url: config['url'],\r\n });\r\n }\r\n\r\n public static getRouteRootToken(hash: object | null = null)\r\n {\r\n let result: string | null = null;\r\n const currentHash: object | null = hash || Sys.getHash() as object;\r\n\r\n if (currentHash && '0' in currentHash)\r\n {\r\n const parts: string[] = currentHash['0'].split('/');\r\n result = parts.filter((p: string) => p.length > 0)[0].toLowerCase();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Return the specified token from a route with the indicated base token.\r\n public static getRouteToken(\r\n baseToken: string,\r\n offset: number,\r\n hash: object | null = null): string | null\r\n {\r\n let result: string | null = null;\r\n const currentHash: object | null = hash || Sys.getHash() as object;\r\n\r\n if (currentHash && '0' in currentHash)\r\n {\r\n const parts: string[] = currentHash['0'].split('/');\r\n const index: number = parts.indexOf(baseToken);\r\n\r\n if (index > -1)\r\n {\r\n result = parts[index + offset];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Method to prompt for and enable a trace key.\r\n public static getTraceKey(): void\r\n {\r\n const traceKey = prompt(\r\n 'Enter the key given to you by the help desk:', '');\r\n if (traceKey)\r\n {\r\n Sys.setTraceKey(traceKey);\r\n alert('Trace key has been set; execute the action you wish to trace');\r\n }\r\n else\r\n {\r\n alert('Blank trace keys are not set. Try again');\r\n }\r\n }\r\n\r\n public static getTranslation(\r\n text: string | null,\r\n context: string = 'Client Framework',\r\n args?: object): string\r\n {\r\n let result: string = text || '';\r\n\r\n if (context in Sys.settings.translations)\r\n {\r\n const contextTranslations: object = Sys.settings.translations[context];\r\n\r\n if (text && text in contextTranslations)\r\n {\r\n result = contextTranslations[text];\r\n }\r\n }\r\n\r\n if (args)\r\n {\r\n const regx = /\\{\\w+\\}/gi;\r\n const matches = result.match(regx);\r\n\r\n if (matches)\r\n {\r\n matches.forEach((match) =>\r\n {\r\n result = result.replace(\r\n match,\r\n args[match.substr(1, match.length - 2)]);\r\n });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // FUTURE\r\n // Replace with string templates: `${replaceThis}`\r\n public static getUrl(\r\n url: string,\r\n args?: object | null\r\n ): string\r\n {\r\n let result: string = url;\r\n\r\n if (args)\r\n {\r\n for (const arg of Object.keys(args))\r\n {\r\n if (result!.indexOf(`{${arg}}`) > -1)\r\n {\r\n result = result!.replace(`{${arg}}`, `${args[arg]}`);\r\n delete args[arg];\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Returns true if all properties in object2 match properties in object1.\r\n public static hasAll(object1: object | null, object2: object | null)\r\n {\r\n let result = false;\r\n\r\n if (object1 && object2)\r\n {\r\n for (const property of Object.keys(object2))\r\n {\r\n if (object2[property])\r\n {\r\n if (object1[property] === object2[property])\r\n {\r\n result = true;\r\n }\r\n else\r\n {\r\n result = false;\r\n break;\r\n }\r\n }\r\n else\r\n {\r\n result = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static hasBusinessErrors(topPaneUseKey: string): boolean\r\n {\r\n let result: boolean = false;\r\n\r\n for (const businessError of Sys.businessErrors)\r\n {\r\n result = businessError.widgets.some(\r\n widget => widget.topPaneUseKey === topPaneUseKey);\r\n\r\n if (result)\r\n {\r\n break;\r\n }\r\n }\r\n\r\n if (!result)\r\n {\r\n for (const businessError of Sys.businessErrors)\r\n {\r\n result = businessError.rows.some(\r\n row => row.topPaneUseKey === topPaneUseKey);\r\n\r\n if (result)\r\n {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Indicates if the application has any pending changes.\r\n public static hasChanges(): boolean\r\n {\r\n const items = Array.from(TrackableModel.models.values());\r\n\r\n if (items.length === 0)\r\n {\r\n return false;\r\n }\r\n\r\n if (AppServer.hasChanges())\r\n {\r\n return true;\r\n }\r\n\r\n return items.some(item => !item.ignoreChanges && item.hasChanges());\r\n }\r\n\r\n public static hasRequestCacheItem(requestCacheKey: string): boolean\r\n {\r\n let result: boolean = false;\r\n\r\n switch (Sys.requestCacheStorage)\r\n {\r\n case 'InProcess':\r\n result = Sys.getRequestCache().has(requestCacheKey);\r\n break;\r\n case 'LocalStorage':\r\n result = (Sys.getRequestCache().getItem(\r\n `${Sys.cookiePath}/${requestCacheKey}`) !== null);\r\n break;\r\n default:\r\n Logging.log(\r\n `Invalid request cache type: ${Sys.requestCacheStorage}`);\r\n break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static hideToast()\r\n {\r\n if (Toast.current)\r\n {\r\n Toast.current.close();\r\n }\r\n }\r\n\r\n public static async initialize()\r\n {\r\n if (!Sys.settings.useConfiguredAuthentication)\r\n {\r\n if (await Routing.isNonConfiguredAuthenticationSessionExpiredRoute())\r\n {\r\n return;\r\n }\r\n }\r\n\r\n Sys.businessErrors = [];\r\n Sys.sessionMessages = [];\r\n\r\n window['mustang'] =\r\n {\r\n BaseService,\r\n Logging,\r\n PaneRow,\r\n Sys,\r\n TrackableCollection,\r\n TrackableModel,\r\n };\r\n\r\n window.addEventListener('error', (event) =>\r\n {\r\n if (process.env.NODE_ENV === 'production'\r\n && Sys.getRouteRootToken() !== 'error')\r\n {\r\n Routing.goToErrorPage(Sys.getTranslation('Error'), null);\r\n }\r\n else\r\n {\r\n // Ensure loading animation is removed.\r\n RequestsStore.instance.clearAllProcessing();\r\n }\r\n });\r\n\r\n if (!Sys.isEdge)\r\n {\r\n window.addEventListener('dragover', (event) =>\r\n {\r\n if (event.dataTransfer)\r\n {\r\n event.dataTransfer.dropEffect = 'none';\r\n }\r\n\r\n event.preventDefault();\r\n\r\n return false;\r\n });\r\n }\r\n\r\n (document.body as HTMLBodyElement).onbeforeunload = Sys.onBeforeUnload;\r\n (document.body as HTMLBodyElement).onscroll = () =>\r\n {\r\n MenuBase.closeAll();\r\n ApiSelectBase.closeAll();\r\n SelectBase.closeAll();\r\n };\r\n (document.body as HTMLBodyElement).onresize = () =>\r\n {\r\n MenuBase.closeAll();\r\n ApiSelectBase.closeAll();\r\n };\r\n\r\n if (Sys.loadMonitor)\r\n {\r\n Sys.monitor = new Monitor();\r\n }\r\n\r\n if (Sys.monitorKey)\r\n {\r\n Sys.addKeyHandler(\r\n Sys.monitorKey,\r\n (event: KeyboardEvent) =>\r\n {\r\n if (!Sys.monitor)\r\n {\r\n Sys.monitor = new Monitor();\r\n }\r\n\r\n Sys.monitor.show();\r\n }\r\n );\r\n }\r\n\r\n if (Sys.requestCacheClearKey)\r\n {\r\n Sys.addKeyHandler(\r\n Sys.requestCacheClearKey,\r\n (event: KeyboardEvent) => { Sys.clearRequestCache(); });\r\n }\r\n\r\n let languageCode: string | null = null;\r\n const hash = Sys.getHash();\r\n\r\n if (hash)\r\n {\r\n languageCode = hash['languageCode'];\r\n if (languageCode)\r\n {\r\n delete hash['languageCode'];\r\n Sys.setHash(hash, false, true);\r\n\r\n Sys.clearRequestCache(false);\r\n }\r\n\r\n if (!!hash['PosseSessionToken'])\r\n {\r\n Sys.deleteCookie(Sys.guestSessionTokenCookie);\r\n Sys.setCookie(\r\n Sys.sessionTokenCookie,\r\n hash['PosseSessionToken']);\r\n delete hash['PosseSessionToken'];\r\n\r\n if (Object.keys(hash).length)\r\n {\r\n Sys.setHash(hash, false, true, true);\r\n }\r\n else\r\n {\r\n Sys.setHash('', false, true, true);\r\n }\r\n }\r\n }\r\n\r\n await SystemConfigService.loadConfig(languageCode);\r\n\r\n Sys.currentCredentials = new Credentials();\r\n TrackableModel.register(Sys.currentCredentials);\r\n\r\n await Routing.initialize();\r\n }\r\n\r\n public static loadScript(key: string, script: string): void\r\n {\r\n if (!Sys.scripts.has(key))\r\n {\r\n if (script)\r\n {\r\n try\r\n {\r\n Sys.scripts.add(key);\r\n\r\n // eslint-disable-next-line no-eval\r\n eval(script);\r\n\r\n if (Sys.monitor)\r\n {\r\n Sys.monitor.addScript(key, script);\r\n }\r\n }\r\n catch (exception)\r\n {\r\n Logging.error(exception);\r\n Routing.goToErrorPage(\r\n Sys.getTranslation('Script Error'),\r\n exception.message);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public static loadScripts(scripts: object): void\r\n {\r\n for (const dataId of Object.keys(scripts))\r\n {\r\n Sys.loadScript(dataId, scripts[dataId]);\r\n }\r\n }\r\n\r\n // Returns the specified object as an escaped query string.\r\n public static objectToQueryString(object: object): string\r\n {\r\n return Object.keys(object).map((key) =>\r\n {\r\n let result: string;\r\n\r\n if (isNaN(parseInt(key, 10)))\r\n {\r\n // eslint-disable-next-line max-len\r\n result = `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`;\r\n }\r\n else\r\n {\r\n result = object[key];\r\n }\r\n\r\n return result;\r\n }).join('&');\r\n }\r\n\r\n // Before unload event handler for the body.\r\n public static onBeforeUnload(event: BeforeUnloadEvent)\r\n {\r\n if (!Sys.ignoreChanges)\r\n {\r\n EmbeddedAddOnBase.instances.forEach(\r\n (embeddedAddOn: EmbeddedAddOnBase) =>\r\n {\r\n embeddedAddOn.roundTripStarting();\r\n });\r\n\r\n if (Sys.hasChanges())\r\n {\r\n event.returnValue =\r\n Sys.getTranslation('There are outstanding changes.');\r\n }\r\n }\r\n }\r\n\r\n // Determine when the document has been loaded.\r\n public static onReadyStateChange()\r\n {\r\n if (document.readyState === 'complete')\r\n {\r\n Sys.initialize();\r\n }\r\n }\r\n\r\n // Returns the specified object as an escaped query string.\r\n public static queryStringToObject(queryString: string | null): object\r\n {\r\n const result: object = Object.create({});\r\n\r\n if (queryString)\r\n {\r\n let parts: string[];\r\n\r\n queryString.split(/[&?]+/).forEach((item, index) =>\r\n {\r\n if (item)\r\n {\r\n if (item.includes('='))\r\n {\r\n parts = item.split('=');\r\n result[decodeURIComponent(parts[0]).replace('+', '%20')] =\r\n decodeURIComponent(parts[1].replace('+', '%20'));\r\n }\r\n else\r\n {\r\n result[index] =\r\n decodeURIComponent(item.replace('+', '%20'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Registers a request in the cache.\r\n public static registerRequest(request: XMLHttpRequest): void\r\n {\r\n let requestCacheKey;\r\n\r\n if (request['config']['args'] && request['config']['args']['cacheRequest'])\r\n {\r\n requestCacheKey = Sys.getRequestCacheKey(request['config']);\r\n\r\n if (!Sys.hasRequestCacheItem(requestCacheKey))\r\n {\r\n Sys.addRequestCacheItem(requestCacheKey, request);\r\n }\r\n }\r\n }\r\n\r\n public static removeKeyHandler(config: object): void\r\n {\r\n let targetElement: HTMLElement | Window | null;\r\n const key = JSON.stringify(config);\r\n\r\n if (Sys.keyListeners.has(key))\r\n {\r\n if (config['target'])\r\n {\r\n targetElement = document.getElementById(config['target']);\r\n }\r\n else\r\n {\r\n targetElement = window;\r\n }\r\n\r\n if (targetElement)\r\n {\r\n targetElement.removeEventListener(\r\n 'keydown', Sys.keyListeners.get(key)!);\r\n Sys.keyListeners.delete(key);\r\n }\r\n }\r\n }\r\n\r\n public static setBusinessErrors(\r\n businessErrors: BusinessError[] = [],\r\n clearMessages: boolean = true):\r\n boolean\r\n {\r\n let result: boolean = false;\r\n if (businessErrors.length > 0)\r\n {\r\n result = true;\r\n\r\n if (clearMessages)\r\n {\r\n // Must clear all existing messages because the round trip may\r\n // not refresh all the data.\r\n Sys.clearErrors();\r\n }\r\n\r\n Sys.businessErrors.push(...businessErrors);\r\n Sys.updateErrorDisplay();\r\n }\r\n else\r\n {\r\n Sys.businessErrors.forEach((businessError: BusinessError) =>\r\n {\r\n businessError.widgets.forEach((widget) =>\r\n {\r\n const row = PaneRow.get(widget.dataId, widget.rowKey);\r\n\r\n if (row)\r\n {\r\n const widgetErrors = row.getWidget(\r\n widget.widgetName!).properties.businessErrors;\r\n\r\n if (widgetErrors.indexOf(businessError.message) === -1)\r\n {\r\n widgetErrors.push(businessError.message);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static setCookie(\r\n name: string,\r\n value: string,\r\n days: number = 0): void\r\n {\r\n if (name)\r\n {\r\n let expires: string | null = null;\r\n\r\n if (days > 0)\r\n {\r\n const today = new Date();\r\n expires = new Date(\r\n today.getFullYear(),\r\n today.getMonth(),\r\n today.getDate() + days,\r\n 0, 0, 1).toUTCString();\r\n }\r\n\r\n document.cookie =\r\n // eslint-disable-next-line max-len\r\n `${encodeURIComponent(name)}=${encodeURIComponent(value)}; path=${Sys.cookiePath}; expires=${expires}`;\r\n }\r\n }\r\n\r\n // Sets the current hash value.\r\n public static setHash(\r\n value: string | object,\r\n merge: boolean = false,\r\n replaceHash: boolean = false,\r\n ignoreHashChanges: boolean = false\r\n )\r\n {\r\n const hash = Sys.getHash();\r\n let hashString: string;\r\n\r\n if (replaceHash)\r\n {\r\n const href = window.location.href.split('#')[0];\r\n\r\n if (typeof value === 'string')\r\n {\r\n window.history.replaceState(null, '', `${href}#${value}`);\r\n }\r\n else\r\n {\r\n if (merge)\r\n {\r\n window.history.replaceState(\r\n null,\r\n '',\r\n `${href}#${Sys.objectToQueryString(\r\n Object.assign(hash || Object.create(null), value))}`);\r\n }\r\n else\r\n {\r\n window.history.replaceState(\r\n null,\r\n '',\r\n `${href}#${Sys.objectToQueryString(value)}`);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n if (typeof value === 'string')\r\n {\r\n hashString = value;\r\n }\r\n else\r\n {\r\n if (merge)\r\n {\r\n hashString = Sys.objectToQueryString(\r\n Object.assign(hash || Object.create(null), value));\r\n }\r\n else\r\n {\r\n hashString = Sys.objectToQueryString(value);\r\n }\r\n }\r\n\r\n if (window.location.hash !== hashString)\r\n {\r\n if (ignoreHashChanges)\r\n {\r\n Sys.ignoreHashChanges = true;\r\n }\r\n\r\n window.location.hash = hashString;\r\n }\r\n }\r\n }\r\n\r\n // Method to enable / diable a trace key.\r\n public static setTraceKey(traceKey: string): void\r\n {\r\n Sys.setCookie(Sys.traceKeyCookie, traceKey);\r\n }\r\n\r\n public static showErrors(messages: string[] | null)\r\n {\r\n if (!messages)\r\n {\r\n return;\r\n }\r\n\r\n if (messages.length === 0)\r\n {\r\n return;\r\n }\r\n\r\n const errors = messages.map(m => Sys.createBusinessError(m));\r\n Sys.businessErrors.unshift(...errors);\r\n Sys.updateErrorDisplay();\r\n }\r\n\r\n public static showToast(\r\n message: React.ReactNode,\r\n light: boolean = false,\r\n icon?: string | null,\r\n horizontalPosition: string = 'center',\r\n verticalPosition: string = 'bottom',\r\n duration: number | null = 3000,\r\n closeHandler: Function | null = null)\r\n {\r\n Presentation.render(\r\n {\r\n props:\r\n {\r\n anchorOrigin:\r\n {\r\n horizontal: horizontalPosition,\r\n vertical: verticalPosition,\r\n },\r\n autoHideDuration: duration,\r\n closeHandler,\r\n icon,\r\n light,\r\n message,\r\n },\r\n type: 'Toast',\r\n },\r\n 'toast');\r\n }\r\n\r\n // API to enable / diable a trace key.\r\n public static toggleTraceKey(): void\r\n {\r\n const traceKey = Sys.getCookie(this.traceKeyCookie);\r\n if (traceKey)\r\n {\r\n if (confirm(`Turn off trace key \"${traceKey}\"?`))\r\n {\r\n Sys.setTraceKey('');\r\n }\r\n }\r\n else\r\n {\r\n Sys.getTraceKey();\r\n }\r\n }\r\n}\r\n","import { PropTypes } from '@material-ui/core';\r\nimport * as colors from '@material-ui/core/colors';\r\nimport { Variant } from '@material-ui/core/styles/createTypography';\r\nimport * as React from 'react';\r\nimport Logging from '../core/Logging';\r\nimport Sys from '../core/Sys';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Icon from '../coreui/Icon';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\n\r\nexport enum AccessLevel\r\n{\r\n hidden = 0,\r\n disabled = 1,\r\n readOnly = 2,\r\n actionable = 3,\r\n enterable = 4,\r\n}\r\n\r\nexport interface ConfigProps\r\n{\r\n dataId?: string;\r\n name?: string;\r\n node?: object;\r\n}\r\n\r\nexport interface ValueByBreakpoint\r\n{\r\n lg: T;\r\n md: T;\r\n sm: T;\r\n xl: T;\r\n xs: T;\r\n}\r\n\r\nexport default class Api\r\n{\r\n private static readonly materialUiColorNameMapping =\r\n {\r\n amber: 'amber',\r\n blue: 'blue',\r\n bluegrey: 'blueGrey',\r\n brown: 'brown',\r\n cyan: 'cyan',\r\n deeporange: 'deepOrange',\r\n deeppurple: 'deepPurple',\r\n green: 'green',\r\n grey: 'grey',\r\n indigo: 'indigo',\r\n lightblue: 'lightBlue',\r\n lightgreen: 'lightGreen',\r\n lime: 'lime',\r\n orange: 'orange',\r\n pink: 'pink',\r\n purple: 'purple',\r\n red: 'red',\r\n teal: 'teal',\r\n yellow: 'yellow',\r\n };\r\n\r\n public static getAlignment(justification: string): PropTypes.Alignment\r\n {\r\n let result: string;\r\n\r\n switch (justification)\r\n {\r\n case 'Centered':\r\n result = 'center';\r\n break;\r\n case 'Full':\r\n result = 'justify';\r\n break;\r\n default:\r\n result = justification.toLowerCase();\r\n break;\r\n }\r\n\r\n return result as PropTypes.Alignment;\r\n }\r\n\r\n public static getErrorMessage(message: string, style?: object): React.ReactNode\r\n {\r\n let result: React.ReactNode = null;\r\n\r\n if (message)\r\n {\r\n result =\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {message}\r\n
\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getErrorMessages(errors: string[]): React.ReactNode\r\n {\r\n let result: React.ReactNode = null;\r\n const list: React.ReactNode[] = [];\r\n\r\n if (errors.length > 0)\r\n {\r\n errors.forEach((item: string, index: number) =>\r\n {\r\n list.push(Api.getErrorMessage(\r\n item,\r\n index < errors.length - 1 ? { marginBottom: 8 } : undefined));\r\n });\r\n\r\n result =\r\n {list};\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getSystemColor(colorName: string): string\r\n {\r\n if (!Sys.settings.colorPalette)\r\n {\r\n return colors.grey[800];\r\n }\r\n\r\n let color: string;\r\n switch (colorName)\r\n {\r\n case 'danger':\r\n color = Sys.settings.colorPalette.danger;\r\n break;\r\n case 'dark':\r\n return colors.grey[800];\r\n case 'information':\r\n color = Sys.settings.colorPalette.information;\r\n break;\r\n case 'success':\r\n color = Sys.settings.colorPalette.success;\r\n break;\r\n case 'warning':\r\n color = Sys.settings.colorPalette.warning;\r\n break;\r\n default:\r\n Logging.warn(`Unknown color ${colorName}`);\r\n\r\n return '';\r\n }\r\n\r\n return color;\r\n }\r\n\r\n public static getTextStyle(textStyle: string): Variant\r\n {\r\n let result: string;\r\n\r\n switch (textStyle)\r\n {\r\n case 'Level 1':\r\n result = 'h1';\r\n break;\r\n case 'Level 2':\r\n result = 'h2';\r\n break;\r\n case 'Level 3':\r\n result = 'h3';\r\n break;\r\n case 'Level 4':\r\n result = 'h4';\r\n break;\r\n case 'Level 5':\r\n result = 'h5';\r\n break;\r\n case 'Level 6':\r\n result = 'h6';\r\n break;\r\n case 'Body 1':\r\n result = 'body1';\r\n break;\r\n case 'Body 2':\r\n result = 'body2';\r\n break;\r\n default:\r\n result = textStyle.toLowerCase();\r\n break;\r\n }\r\n\r\n return result as Variant;\r\n }\r\n\r\n // Get the current value from the widget properties.\r\n public static getWidgetProperties(\r\n props: ConfigProps,\r\n observable: object | null = null): object | null\r\n {\r\n let result: object | null = null;\r\n let widgetObservable: object | null = observable;\r\n\r\n if (!widgetObservable)\r\n {\r\n widgetObservable = Presentation.getObservable(props);\r\n }\r\n\r\n if (widgetObservable)\r\n {\r\n const row = widgetObservable as TrackableModel;\r\n result = row.getReadOnlyProperties(props['name']!);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static parseMaterialColor(color: string): string\r\n {\r\n const cleanColor: string = color.trim();\r\n\r\n try\r\n {\r\n const index: number = cleanColor.lastIndexOf(' ');\r\n if (index < 0)\r\n {\r\n Logging.warn(`Could not parse color '${cleanColor}'`);\r\n\r\n return colors.grey[800];\r\n }\r\n\r\n let colorName: string = cleanColor.substring(0, index);\r\n colorName = colorName.replace(/ /g, '').toLowerCase();\r\n colorName = Api.materialUiColorNameMapping[colorName];\r\n\r\n const colorShade: string = cleanColor.substring(index + 1);\r\n\r\n if (!colorName || !(colorShade in colors[colorName]))\r\n {\r\n Logging.warn(`Could not parse color '${cleanColor}'`);\r\n\r\n return colors.grey[800];\r\n }\r\n\r\n return colors[colorName][colorShade];\r\n }\r\n catch (error)\r\n {\r\n Logging.warn(`Could not parse color '${cleanColor}'`);\r\n Logging.warn(error.message);\r\n\r\n return colors.grey[800];\r\n }\r\n }\r\n\r\n // Obsolete. Use access level directly instead.\r\n public static setAccessLevel(\r\n props: ConfigProps,\r\n widgetProperties: object | null\r\n ): boolean\r\n {\r\n let result: boolean = true;\r\n let properties: object | null = widgetProperties;\r\n\r\n if (!properties)\r\n {\r\n properties = Api.getWidgetProperties(props);\r\n }\r\n\r\n if (properties && properties['accessLevel'])\r\n {\r\n switch (properties['accessLevel'])\r\n {\r\n case AccessLevel.hidden:\r\n result = false;\r\n break;\r\n case AccessLevel.disabled:\r\n props['disabled'] = true;\r\n break;\r\n case AccessLevel.readOnly:\r\n props['readOnly'] = true;\r\n break;\r\n case AccessLevel.actionable:\r\n break;\r\n case AccessLevel.enterable:\r\n break;\r\n default:\r\n throw new Error(\r\n `Unknown access level ${properties['accessLevel']}`);\r\n }\r\n }\r\n else\r\n {\r\n result = false;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static setHelperText(\r\n component: React.Component,\r\n errors: string[],\r\n props: object)\r\n {\r\n if (errors.length === 0)\r\n {\r\n props['error'] = false;\r\n props['helperText'] = component.props['helperText'];\r\n }\r\n else\r\n {\r\n const errorElement: React.ReactNode =\r\n
\r\n {Api.getErrorMessages(errors)}\r\n
;\r\n\r\n props['error'] = true;\r\n\r\n if (component.props['helperText'])\r\n {\r\n props['helperText'] =\r\n
\r\n \r\n {component.props['helperText']}\r\n \r\n {errorElement}\r\n
;\r\n }\r\n else\r\n {\r\n props['helperText'] = errorElement;\r\n }\r\n }\r\n }\r\n}\r\n","import { library as fontAwesomeLibrary, IconProp }\r\n from '@fortawesome/fontawesome-svg-core';\r\nimport { fab } from '@fortawesome/free-brands-svg-icons';\r\nimport { fad } from '@fortawesome/pro-duotone-svg-icons';\r\nimport { far } from '@fortawesome/pro-regular-svg-icons';\r\nimport { fas } from '@fortawesome/pro-solid-svg-icons';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport * as muiIcon from '@material-ui/core/Icon';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Logging from '../core/Logging';\r\nimport CustomIconStore from '../stores/CustomIconStore';\r\n\r\nexport interface IconProps extends muiIcon.IconProps\r\n{\r\n fixedWidth?: boolean;\r\n fullHeight?: boolean;\r\n icon?: string;\r\n}\r\n\r\ninterface State\r\n{\r\n customIconContents: string | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n adjustSvgWidth:\r\n {\r\n '& svg':\r\n {\r\n display: 'block',\r\n width: '100% !important',\r\n },\r\n },\r\n adjustWidth:\r\n {\r\n display: 'block',\r\n width: '100% !important',\r\n },\r\n customSvg:\r\n {\r\n '& svg':\r\n {\r\n fill: 'currentColor',\r\n height: '1em',\r\n pointerEvents: 'none',\r\n verticalAlign: '-.125em',\r\n width: '1em',\r\n },\r\n },\r\n fullHeight:\r\n {\r\n height: '100% !important',\r\n },\r\n fullHeightSvg:\r\n {\r\n '& svg':\r\n {\r\n height: '100% !important',\r\n },\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Icon extends\r\n React.PureComponent, State>\r\n{\r\n private static initialized = false;\r\n\r\n public constructor(props: IconProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n if (!Icon.initialized)\r\n {\r\n Icon.initialized = true;\r\n fontAwesomeLibrary.add(fab);\r\n fontAwesomeLibrary.add(fad);\r\n fontAwesomeLibrary.add(far);\r\n fontAwesomeLibrary.add(fas);\r\n }\r\n\r\n this.state =\r\n {\r\n customIconContents: null,\r\n };\r\n }\r\n\r\n private async updateCustomIconContents(): Promise\r\n {\r\n if (!this.props.icon)\r\n {\r\n this.setState({ customIconContents: null });\r\n\r\n return;\r\n }\r\n\r\n if (!this.props.icon.includes('.'))\r\n {\r\n this.setState({ customIconContents: null });\r\n\r\n return;\r\n }\r\n\r\n const icon = await CustomIconStore.iconForName(this.props.icon);\r\n if (icon === null)\r\n {\r\n this.setState({ customIconContents: null });\r\n\r\n return;\r\n }\r\n\r\n this.setState({ customIconContents: icon.contents });\r\n }\r\n\r\n public componentDidMount(): void\r\n {\r\n this.updateCustomIconContents();\r\n }\r\n\r\n public componentDidUpdate(prevProps: IconProps, prevState: State): void\r\n {\r\n if (prevProps.icon !== this.props.icon)\r\n {\r\n this.updateCustomIconContents();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const {\r\n classes,\r\n className,\r\n fixedWidth,\r\n fullHeight,\r\n icon,\r\n ...iconProps\r\n } = this.props;\r\n\r\n if (!icon)\r\n {\r\n return null;\r\n }\r\n\r\n let child: React.ReactNode | null = null;\r\n\r\n if (icon.includes('.'))\r\n {\r\n if (!this.state.customIconContents)\r\n {\r\n return null;\r\n }\r\n\r\n const childClasses: string[] = [];\r\n if (!fixedWidth)\r\n {\r\n childClasses.push(classes.adjustSvgWidth);\r\n }\r\n\r\n if (fullHeight)\r\n {\r\n childClasses.push(classes.fullHeightSvg);\r\n }\r\n\r\n childClasses.push(classes.customSvg);\r\n\r\n child = (\r\n \r\n );\r\n }\r\n else\r\n {\r\n const iconNameParts: string[] = icon.split(' ');\r\n\r\n if (iconNameParts.length !== 2)\r\n {\r\n Logging.warn(`Unknown icon '${icon}'`);\r\n return null;\r\n }\r\n\r\n const iconPrefix: string = iconNameParts[0];\r\n if (iconPrefix.length !== 3 || !iconPrefix.startsWith('fa'))\r\n {\r\n Logging.warn(`Unknown icon '${icon}'`);\r\n return null;\r\n }\r\n\r\n let iconName: string = iconNameParts[1];\r\n const childClasses: string[] = [];\r\n if (!fixedWidth)\r\n {\r\n childClasses.push(classes.adjustWidth);\r\n }\r\n\r\n if (fullHeight)\r\n {\r\n childClasses.push(classes.fullHeight);\r\n }\r\n\r\n iconName = iconName.replace('fa-', '');\r\n\r\n child = (\r\n \r\n );\r\n }\r\n\r\n const rootClasses: string[] = [classes.root];\r\n if (className)\r\n {\r\n rootClasses.push(className);\r\n }\r\n\r\n return (\r\n \r\n {child}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Icon);\r\n","import * as muiButton from '@material-ui/core/Button';\r\nimport * as muiFab from '@material-ui/core/Fab';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport Icon from './Icon';\r\n\r\nexport interface ButtonProps extends muiButton.ButtonProps\r\n{\r\n badge?: boolean;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n color?: any;\r\n component?: string;\r\n customSize?: 'tiny';\r\n endIcon?: string;\r\n fab?: boolean;\r\n fullWidth?: boolean;\r\n icon?: string;\r\n label?: string;\r\n target?: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n fontSize: 9,\r\n height: 16,\r\n minHeight: 16,\r\n width: 16,\r\n },\r\n danger:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('danger'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('danger'),\r\n color: theme.palette.getContrastText(Api.getSystemColor('danger')),\r\n },\r\n dark:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('dark'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('dark'),\r\n color: theme.palette.getContrastText(Api.getSystemColor('dark')),\r\n },\r\n fabIcon:\r\n {\r\n width: '100%',\r\n },\r\n fabIconMedium:\r\n {\r\n fontSize: 24,\r\n },\r\n fabIconTiny:\r\n {\r\n fontSize: 10,\r\n },\r\n fullWidth:\r\n {\r\n width: '100%',\r\n },\r\n label:\r\n {\r\n },\r\n root:\r\n {\r\n },\r\n success:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('success'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('success'),\r\n color: theme.palette.getContrastText(Api.getSystemColor('success')),\r\n },\r\n text:\r\n {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n tiny:\r\n {\r\n height: 16,\r\n minHeight: 16,\r\n minWidth: 16,\r\n width: 16,\r\n },\r\n });\r\n\r\nexport class Button extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n let isFab: boolean = !!_props.fab;\r\n let result: React.ReactNode = null;\r\n\r\n // Class name may be inherited.\r\n if (!_props.className)\r\n {\r\n _props.className = `${_props.classes.root} `;\r\n }\r\n else\r\n {\r\n _props.className += ' ';\r\n }\r\n\r\n if ('label' in _props)\r\n {\r\n if (_props.label)\r\n {\r\n _props.children = _props.label;\r\n }\r\n\r\n delete _props.label;\r\n }\r\n\r\n if ('color' in _props)\r\n {\r\n if (_props.color === 'danger' || _props.color === 'dark' ||\r\n _props.color === 'success')\r\n {\r\n _props.className += `${_props.classes[_props.color]} `;\r\n delete _props.color;\r\n }\r\n }\r\n\r\n if ('badge' in _props)\r\n {\r\n _props.className += `${_props.classes.badge} `;\r\n\r\n delete _props.badge;\r\n }\r\n\r\n if (!_props.variant)\r\n {\r\n _props.variant = 'contained';\r\n }\r\n\r\n if (_props.children && typeof _props.children === 'string')\r\n {\r\n _props.children = (\r\n \r\n {_props.children}\r\n \r\n );\r\n }\r\n\r\n if ('icon' in _props)\r\n {\r\n if (_props.icon)\r\n {\r\n if (_props.children)\r\n {\r\n _props.children =\r\n \r\n \r\n {_props.children}\r\n ;\r\n }\r\n else\r\n {\r\n isFab = true;\r\n\r\n let iconClass = _props.classes.fabIcon;\r\n if (_props.size === 'medium')\r\n {\r\n iconClass += ` ${_props.classes.fabIconMedium}`;\r\n }\r\n if (_props.customSize === 'tiny')\r\n {\r\n iconClass += ` ${_props.classes.fabIconTiny}`;\r\n _props.className += `${_props.classes.tiny} `;\r\n _props.size = 'small';\r\n }\r\n\r\n _props.children =\r\n ;\r\n }\r\n }\r\n\r\n delete _props.icon;\r\n }\r\n\r\n if ('endIcon' in _props)\r\n {\r\n if (_props.endIcon)\r\n {\r\n if (_props.children)\r\n {\r\n if (_props.children instanceof Array)\r\n {\r\n _props.children.push(\r\n );\r\n }\r\n else\r\n {\r\n _props.children =\r\n \r\n {_props.children}\r\n \r\n ;\r\n }\r\n }\r\n else\r\n {\r\n _props.children = ;\r\n }\r\n }\r\n\r\n delete _props.endIcon;\r\n }\r\n\r\n delete _props.classes;\r\n delete _props.customSize;\r\n delete _props.fullWidth;\r\n\r\n if ('fab' in _props)\r\n {\r\n delete _props.fab;\r\n }\r\n\r\n if (isFab)\r\n {\r\n const fabProps = { ..._props } as muiFab.FabProps;\r\n\r\n delete fabProps.variant;\r\n\r\n result =\r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Button);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport * as React from 'react';\r\n\r\n// VERSION_WARNING Material-UI 4.9.1\r\n// MaterialUI's new \"generic\" component prop injection infrastructure seems to\r\n// break typescript. Specifically, it does not appear to exist on the Props\r\n// exposed by MaterialUI even though TypeScript thinks the prop is valid when\r\n// using the raw MUI component. The work around to this is to simply re-expose\r\n// the component prop here and then manually pass it on to the MUI component.\r\ninterface Props extends muiTypography.TypographyProps\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n component?: React.ElementType;\r\n ellipsis?: boolean;\r\n flex?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n ellipsis:\r\n {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n width: '100%',\r\n },\r\n flex:\r\n {\r\n flex: 'auto',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Typography extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const {\r\n classes,\r\n component,\r\n ellipsis,\r\n flex,\r\n ...otherProps\r\n } = this.props;\r\n\r\n const {\r\n ellipsis: ellipsisClass,\r\n flex: flexClass,\r\n root: rootClass,\r\n ...otherClasses\r\n } = classes;\r\n\r\n const classNames = [rootClass];\r\n\r\n if (ellipsis)\r\n {\r\n classNames.push(ellipsisClass);\r\n }\r\n\r\n if (flex)\r\n {\r\n classNames.push(flexClass);\r\n }\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Typography);\r\n","export interface State\r\n{\r\n hasDataChanges: boolean;\r\n panes: string[];\r\n}\r\n\r\nexport default class AppServer\r\n{\r\n private static state: State | null = null;\r\n private static stateRecoveryPoint: State | null = null;\r\n private static stateRecoveryPointCreated: boolean = false;\r\n\r\n public static addPane(pane: string)\r\n {\r\n if (!AppServer.state)\r\n {\r\n throw Error(\r\n 'AppServer state must be set before a pane can be added');\r\n }\r\n\r\n AppServer.state.panes.push(pane);\r\n }\r\n\r\n public static clearState()\r\n {\r\n AppServer.state = null;\r\n AppServer.stateRecoveryPoint = null;\r\n AppServer.stateRecoveryPointCreated = false;\r\n }\r\n\r\n public static clearStateRecoveryPoint()\r\n {\r\n AppServer.stateRecoveryPoint = null;\r\n AppServer.stateRecoveryPointCreated = false;\r\n }\r\n\r\n public static createStateRecoveryPoint()\r\n {\r\n if (AppServer.stateRecoveryPointCreated)\r\n {\r\n throw Error('An AppServer state recovery point may not be '\r\n + 'created if one already exists.');\r\n }\r\n\r\n AppServer.stateRecoveryPoint = AppServer.state;\r\n AppServer.stateRecoveryPointCreated = true;\r\n }\r\n\r\n public static getState(): State | null\r\n {\r\n return AppServer.state;\r\n }\r\n\r\n public static hasChanges(): boolean\r\n {\r\n if (AppServer.state === null)\r\n {\r\n return false;\r\n }\r\n\r\n return AppServer.state.hasDataChanges;\r\n }\r\n\r\n public static recoverStateFromPoint()\r\n {\r\n if (!AppServer.stateRecoveryPointCreated)\r\n {\r\n throw Error('An AppServer state recovery point must be created '\r\n + 'before it can be recovered.');\r\n }\r\n\r\n AppServer.state = AppServer.stateRecoveryPoint;\r\n AppServer.stateRecoveryPoint = null;\r\n AppServer.stateRecoveryPointCreated = false;\r\n }\r\n\r\n public static setState(state: State)\r\n {\r\n AppServer.state = state;\r\n }\r\n}\r\n","import { observable } from 'mobx';\r\nimport * as moment from 'moment';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel, { ITrackable } from '../core/TrackableModel';\r\nimport PaneRow, { RuntimeWidget, WidgetValue } from '../models/PaneRow';\r\n\r\nclass DataChanges\r\n{\r\n changedRecords: RecordChange[];\r\n dataId: string;\r\n deletedRowKeys: string[];\r\n}\r\n\r\nexport type PaneData =\r\n{\r\n dataId: string;\r\n lastLoadingToMatchDate: Date | undefined;\r\n lastRetrieved: Date | undefined;\r\n paneUseKey: string;\r\n rows: PaneDataRow[];\r\n};\r\n\r\nexport type PaneDataByDataId =\r\n{\r\n [dataId: string]: PaneData;\r\n};\r\n\r\ninterface PaneDataRow\r\n{\r\n isNew: boolean;\r\n rowKey: string;\r\n widgets: { [id: string]: RuntimeWidget };\r\n}\r\n\r\nclass RecordChange\r\n{\r\n rowKey: string;\r\n values: { [id: string]: WidgetValue };\r\n}\r\n\r\nexport default class PaneDataStore\r\n{\r\n private static staticInstance: PaneDataStore;\r\n\r\n @observable private panesByDataId: Map = new Map();\r\n\r\n // Returns the pending changes for the model as json.\r\n private static getDataChanges(model: ITrackable): DataChanges\r\n {\r\n const result: DataChanges =\r\n {\r\n changedRecords: [],\r\n dataId: model.dataId!,\r\n deletedRowKeys: [],\r\n };\r\n\r\n const deleted = TrackableModel.getDeleted(model.dataId);\r\n deleted.forEach((m: TrackableModel) =>\r\n {\r\n result.deletedRowKeys.push(m.getPrimaryKey());\r\n });\r\n\r\n let allModels: TrackableModel[] = [];\r\n if (model instanceof Array)\r\n {\r\n allModels = model;\r\n }\r\n else\r\n {\r\n allModels = [model as TrackableModel];\r\n }\r\n\r\n allModels.forEach((m: TrackableModel) =>\r\n {\r\n if (result.deletedRowKeys.indexOf(m.dataId!) < 0)\r\n {\r\n if (m.isModified)\r\n {\r\n const record = new RecordChange();\r\n record.rowKey = m.getPrimaryKey();\r\n record.values = m.getModifiedPropertyValues();\r\n\r\n result.changedRecords.push(record);\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public static get instance()\r\n {\r\n if (!PaneDataStore.staticInstance)\r\n {\r\n PaneDataStore.staticInstance = new PaneDataStore();\r\n }\r\n\r\n return PaneDataStore.staticInstance;\r\n }\r\n\r\n public static clearAllDataChanges()\r\n {\r\n const itemsToCheck = Array.from(TrackableModel.models.values());\r\n\r\n for (const item of itemsToCheck)\r\n {\r\n if (item && !item.ignoreChanges && item.hasChanges())\r\n {\r\n item.clear();\r\n }\r\n }\r\n }\r\n\r\n // Called when changes were applied in a round trip and no data is being\r\n // loaded, but the deleted rows still need to be cleared since they were\r\n // handled in the round trip\r\n public static clearDeletedRows(): void\r\n {\r\n const trackables = Array.from(TrackableModel.models.values());\r\n for (const item of trackables)\r\n {\r\n if (item instanceof TrackableCollection)\r\n {\r\n item.clearDeleted();\r\n }\r\n }\r\n }\r\n\r\n // Returns the pending changes for the trackable objects as json.\r\n public static getChanges(): DataChanges[]\r\n {\r\n const result: DataChanges[] = [];\r\n\r\n const itemsToCheck = Array.from(TrackableModel.models.values());\r\n\r\n for (const item of itemsToCheck)\r\n {\r\n if (item && !item.ignoreChanges && item.hasChanges())\r\n {\r\n result.push(PaneDataStore.getDataChanges(item));\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getPaneCollection(dataId: string): PaneRow[]\r\n {\r\n let trackableCollection: TrackableCollection | undefined;\r\n\r\n if (TrackableModel.models.has(dataId))\r\n {\r\n trackableCollection =\r\n TrackableModel.models.get(dataId) as TrackableCollection;\r\n }\r\n\r\n if (!trackableCollection || !trackableCollection.observableCollection)\r\n {\r\n throw new Error(`Collection for ${dataId} not found`);\r\n }\r\n\r\n return trackableCollection.observableCollection as PaneRow[];\r\n }\r\n\r\n // Populates the models identified in the specified response.\r\n public static loadResponse(paneData: PaneDataByDataId): void\r\n {\r\n // If only a single pane on a presentation is being loaded, any\r\n // deletions from other panes were still processed in the round trip,\r\n // so clear them all\r\n PaneDataStore.clearDeletedRows();\r\n\r\n for (const key of Object.keys(paneData))\r\n {\r\n if (!TrackableModel.models.has(key))\r\n {\r\n throw Error(\r\n `No model has been created for pane data with key ${key}.`);\r\n }\r\n\r\n TrackableModel.models.get(key)!.load(paneData[key].rows);\r\n\r\n let existingPane: PaneData | undefined = undefined;\r\n if (PaneDataStore.instance.panesByDataId.has(key))\r\n {\r\n existingPane = PaneDataStore.instance.panesByDataId.get(key)!;\r\n }\r\n\r\n PaneDataStore.instance.panesByDataId.set(\r\n key,\r\n {\r\n dataId: paneData[key].dataId,\r\n lastLoadingToMatchDate: existingPane\r\n ? existingPane.lastLoadingToMatchDate : undefined,\r\n lastRetrieved: paneData[key].lastRetrieved\r\n ? moment(paneData[key].lastRetrieved).toDate()\r\n : undefined,\r\n paneUseKey: paneData[key].paneUseKey,\r\n // Future 7.4.1: load rows into here instead of TrackableModel\r\n rows: [],\r\n });\r\n }\r\n }\r\n\r\n public static loadWidgetData(\r\n dataId: string, data: { [id: string]: RuntimeWidget }): void\r\n {\r\n if (!TrackableModel.models.has(dataId))\r\n {\r\n throw Error(`Could not find collection with dataId ${dataId}`);\r\n }\r\n\r\n PaneDataStore.clearDeletedRows();\r\n\r\n const collection =\r\n TrackableModel.models.get(dataId) as TrackableCollection;\r\n\r\n const observableCollection = collection.observableCollection\r\n ? collection.observableCollection\r\n : collection;\r\n\r\n const paneRow = observableCollection[0] as PaneRow;\r\n\r\n for (const widgetName in data)\r\n {\r\n if (data.hasOwnProperty(widgetName))\r\n {\r\n paneRow.updateWidget(widgetName, data[widgetName]);\r\n }\r\n }\r\n }\r\n\r\n public addPane(dataId: string, toMatchDate: Date): PaneData | undefined\r\n {\r\n this.panesByDataId.set(\r\n dataId,\r\n {\r\n dataId,\r\n lastLoadingToMatchDate: toMatchDate,\r\n lastRetrieved: undefined,\r\n paneUseKey: '',\r\n rows: [],\r\n });\r\n\r\n return this.panesByDataId.get(dataId);\r\n }\r\n\r\n public getPane(dataId: string): PaneData | undefined\r\n {\r\n return this.panesByDataId.get(dataId);\r\n }\r\n\r\n public setLoadingToMatchDate(dataId: string, toMatchDate: Date): void\r\n {\r\n const paneData = this.panesByDataId.get(dataId)!;\r\n paneData.lastLoadingToMatchDate = toMatchDate;\r\n if (!paneData.lastRetrieved)\r\n {\r\n paneData.lastRetrieved = new Date('0001-01-01T00:00:00Z');\r\n }\r\n }\r\n}\r\n","import { computed, observable } from 'mobx';\r\n\r\nexport interface ProcessingInfo\r\n{\r\n disableRestoreFocus: boolean;\r\n isNew: boolean;\r\n isProcessing: boolean;\r\n message: string | null;\r\n}\r\n\r\nexport default class RequestsStore\r\n{\r\n private static staticInstance: RequestsStore;\r\n\r\n @observable private processing =\r\n {\r\n disableRestoreFocus: false,\r\n isNew: false,\r\n message: null as string | null,\r\n pendingRequestCount: 0,\r\n };\r\n\r\n public static get instance()\r\n {\r\n if (!RequestsStore.staticInstance)\r\n {\r\n RequestsStore.staticInstance = new RequestsStore();\r\n }\r\n\r\n return RequestsStore.staticInstance;\r\n }\r\n\r\n @computed public get processingInfo(): ProcessingInfo\r\n {\r\n return {\r\n disableRestoreFocus: this.processing.disableRestoreFocus,\r\n isNew: this.processing.isNew,\r\n isProcessing: this.processing.pendingRequestCount > 0,\r\n message: this.processing.message,\r\n };\r\n }\r\n\r\n public clearAllProcessing()\r\n {\r\n this.processing.pendingRequestCount = 0;\r\n }\r\n\r\n public processingStarted(\r\n message: string | null = null,\r\n isNewPage: boolean = false,\r\n disableRestoreFocus: boolean = false\r\n ): void\r\n {\r\n if (this.processing.pendingRequestCount === 0)\r\n {\r\n this.processing.disableRestoreFocus = disableRestoreFocus;\r\n this.processing.isNew = isNewPage;\r\n this.processing.message = message;\r\n }\r\n this.processing.pendingRequestCount++;\r\n }\r\n\r\n public processingStopped(): void\r\n {\r\n this.processing.pendingRequestCount--;\r\n\r\n if (this.processing.pendingRequestCount < 0)\r\n {\r\n // Reset count so the requests store does not enter an invalid\r\n // state if the thrown exception is handled.\r\n this.processing.pendingRequestCount = 0;\r\n\r\n if (process.env.NODE_ENV !== 'production')\r\n {\r\n throw 'Processing stopped when it was never started';\r\n }\r\n }\r\n }\r\n}\r\n","import Sys from './Sys';\r\nimport TrackableCollection from './TrackableCollection';\r\n\r\n// Inteface for trackable objects and collections.\r\nexport interface ITrackable\r\n{\r\n // Id for the data.\r\n dataId: string | null;\r\n // Indicates if pending changes should be ignored.\r\n ignoreChanges: boolean;\r\n // Indicates if the model has been loaded.\r\n isLoaded: boolean;\r\n // Indicates if only the first load request should be processed.\r\n loadOnce: boolean;\r\n // Name of the model.\r\n modelName: string | null;\r\n\r\n // Reset all state flags, discard deleted models and set initial values to the\r\n // current value of each trackable property.\r\n acceptChanges(): void;\r\n\r\n // Clear the contents of each trackable.\r\n clear(): void;\r\n\r\n // Indicates if this model/collection has pending changes.\r\n hasChanges(): boolean;\r\n\r\n // Populates the model with the specified data.\r\n load(data: object): ITrackable;\r\n}\r\n\r\nexport default abstract class TrackableModel implements ITrackable\r\n{\r\n // Dictionary of deleted models, keyed by model name.\r\n protected static deleted: Map> =\r\n new Map>();\r\n // Dictionary of models, keyed by dataId.\r\n public static models: Map =\r\n new Map();\r\n public static primaryKeyNames: Map =\r\n new Map();\r\n // Id for the data.\r\n public dataId: string | null = null;\r\n // Default property values.\r\n public defaultValues: object = Object.create(null);\r\n // Indicates if pending changes should be ignored.\r\n public ignoreChanges: boolean = false;\r\n // Initial property values.\r\n public initialValues: object = Object.create(null);\r\n // Indicates if the model has been loaded.\r\n public isLoaded: boolean = false;\r\n // Indicates if the model has been modified.\r\n public isModified: boolean = false;\r\n // Indicates if the model is new.\r\n public isNew: boolean = false;\r\n // Indicates if the model is new.\r\n public isTrackableNew: boolean = false;\r\n // Indicates if only the first load request should be processed.\r\n public loadOnce: boolean = false;\r\n // Name of the model.\r\n public modelName: string | null = null;\r\n // Indicates if the model should track changes that undo a property\r\n // value change.\r\n public trackUndo: boolean = true;\r\n\r\n // Reset all state flags, discard deleted models and set initial values to the\r\n // current value of each trackable property.\r\n public static acceptChanges(models: TrackableCollection): void\r\n {\r\n TrackableModel.clearDeleted(models.dataId);\r\n\r\n if (models)\r\n {\r\n models.forEach((model) =>\r\n {\r\n if (model)\r\n {\r\n model.acceptChanges();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Discard any deleted models of the specified type.\r\n public static clearDeleted(modelName: string | null): void\r\n {\r\n if (TrackableModel.deleted.has(modelName))\r\n {\r\n TrackableModel.deleted.delete(modelName);\r\n }\r\n }\r\n\r\n // Returns a new instance of the specified model populated with the given data.\r\n public static create(\r\n modelName: string | null,\r\n dataId: string | null,\r\n data?: object): TrackableModel\r\n {\r\n let model: TrackableModel;\r\n\r\n if (Sys.modelNameSpace)\r\n {\r\n // eslint-disable-next-line no-eval\r\n model = eval(`new ${Sys.modelNameSpace}.${modelName}('${dataId}')`);\r\n }\r\n else\r\n {\r\n // eslint-disable-next-line no-eval\r\n model = eval(`new ${modelName}('${dataId}')`);\r\n }\r\n\r\n if (data)\r\n {\r\n model.load(data);\r\n }\r\n\r\n return model;\r\n }\r\n\r\n // Returns a list of deleted models with the specified dataId.\r\n public static getDeleted(dataId: string | null): Set\r\n {\r\n let result: Set;\r\n\r\n if (TrackableModel.deleted.has(dataId))\r\n {\r\n result = TrackableModel.deleted.get(dataId)!;\r\n }\r\n else\r\n {\r\n result = new Set();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getPrimaryKeyName(modelName: string): string\r\n {\r\n if (!TrackableModel.primaryKeyNames.has(modelName))\r\n {\r\n throw Error(`${modelName} has no primary key`);\r\n }\r\n\r\n return TrackableModel.primaryKeyNames.get(modelName)!;\r\n }\r\n\r\n // Indicates if the specified collection contains models with pending changes.\r\n public static hasChanges(models: TrackableCollection): boolean\r\n {\r\n let result: boolean = false;\r\n\r\n if (models\r\n && !(result = TrackableModel.getDeleted(models.dataId).size > 0))\r\n {\r\n result = models.some(model => model && model.hasChanges());\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static register(trackable: ITrackable): ITrackable\r\n {\r\n if (!TrackableModel.models.has(trackable.dataId) ||\r\n TrackableModel.models.get(trackable.dataId) !== trackable)\r\n {\r\n TrackableModel.models.set(trackable.dataId, trackable);\r\n }\r\n\r\n return trackable;\r\n }\r\n\r\n // Reset IsModified, and set the value of each trackable property to\r\n // it's initial value.\r\n public static revertValues(models: TrackableCollection): void\r\n {\r\n if (models)\r\n {\r\n models.forEach((model) =>\r\n {\r\n if (model)\r\n {\r\n model.revertValues();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public static setPrimaryKeyName(modelName: string, name: string | null)\r\n {\r\n TrackableModel.primaryKeyNames.set(modelName, name);\r\n }\r\n\r\n constructor(dataId: string)\r\n {\r\n this.modelName = this.constructor.name;\r\n this.dataId = dataId;\r\n }\r\n\r\n protected abstract getPropertyNames(): string[];\r\n\r\n protected abstract loadData(data: TrackableModel): void;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n protected abstract setPropertyValue(propName: string, value: any): void;\r\n\r\n // Reset all state flags, discard deleted models and set initial values to the\r\n // current value of each trackable property.\r\n public acceptChanges(): void\r\n {\r\n TrackableModel.clearDeleted(this.dataId);\r\n\r\n if (this.isModified)\r\n {\r\n for (const propertyName of this.getPropertyNames())\r\n {\r\n if (propertyName in this.initialValues)\r\n {\r\n this.initialValues[propertyName] =\r\n this.getPropertyValue(propertyName);\r\n }\r\n }\r\n }\r\n\r\n this.isModified = false;\r\n this.isTrackableNew = false;\r\n }\r\n\r\n // Clear the contents of this model.\r\n public clear(revertValues: boolean = true): void\r\n {\r\n if (!this.loadOnce)\r\n {\r\n // If the model is registered then discard deletes.\r\n if (TrackableModel.models.has(this.dataId))\r\n {\r\n TrackableModel.clearDeleted(this.dataId);\r\n }\r\n\r\n if (revertValues)\r\n {\r\n this.revertToDefaultValues();\r\n }\r\n this.initialValues = Object.create(null);\r\n this.isModified = false;\r\n this.isTrackableNew = false;\r\n }\r\n }\r\n\r\n // Track this model in the deleted collection for this model name.\r\n // optionally remove it from the specified list.\r\n public delete(models?: TrackableCollection): void\r\n {\r\n if (!this.isTrackableNew)\r\n {\r\n if (TrackableModel.deleted.has(this.dataId))\r\n {\r\n if (!(TrackableModel.deleted.get(this.dataId)!.has(this)))\r\n {\r\n TrackableModel.deleted.get(this.dataId)!.add(this);\r\n }\r\n }\r\n else\r\n {\r\n TrackableModel.deleted.set(\r\n this.dataId, new Set([this]));\r\n }\r\n }\r\n\r\n // Remove the model from the specified collection.\r\n if (models && models.indexOf(this) > -1)\r\n {\r\n models.splice(models.indexOf(this), 1);\r\n\r\n // Remove the model from the observable collection.\r\n if (models.observableCollection\r\n && models.observableCollection.indexOf(this) > -1)\r\n {\r\n models.observableCollection.splice(\r\n models.observableCollection.indexOf(this), 1);\r\n }\r\n }\r\n }\r\n\r\n // Returns the default value for the specified property.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getDefaultValue(propertyName: string): any\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let result: any = null;\r\n\r\n if (propertyName in this.defaultValues)\r\n {\r\n result = this.defaultValues[propertyName];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Returns the initial value for the specified property.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getInitialValue(propertyName: string): any\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let result: any;\r\n\r\n if (propertyName in this.initialValues)\r\n {\r\n result = this.initialValues[propertyName];\r\n }\r\n else\r\n {\r\n result = this.getPropertyValue(propertyName);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getModifiedPropertyValues(): { [id: string]: any }\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const props: { [id: string]: any } = {};\r\n for (const propertyName of this.getPropertyNames())\r\n {\r\n if (this.hasChanges(propertyName))\r\n {\r\n props[propertyName] = this.getPropertyValue(propertyName);\r\n }\r\n }\r\n\r\n return props;\r\n }\r\n\r\n // Returns the primary key value for this model.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getPrimaryKey(): any\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let result: any = null;\r\n const primaryKeyName = this.getPrimaryKeyName();\r\n\r\n if (primaryKeyName)\r\n {\r\n result = this[primaryKeyName];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Returns the primary key name for this model.\r\n public getPrimaryKeyName()\r\n {\r\n let result: string | null = null;\r\n\r\n if (TrackableModel.primaryKeyNames.has(this.modelName))\r\n {\r\n result = TrackableModel.primaryKeyNames.get(this.modelName)!;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public abstract getPropertyValue(propName: string): any;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public abstract getReadOnlyProperties(propName: string): any;\r\n\r\n // Indicates if this model has pending changes or\r\n // if the specified property has pending changes.\r\n public hasChanges(propertyName?: string): boolean\r\n {\r\n let result: boolean = false;\r\n\r\n if (propertyName)\r\n {\r\n // If there is no initial value then the property has never been\r\n // set before or it is not a tracked property.\r\n // Either way it would be considered unchanged.\r\n if (propertyName in this.initialValues)\r\n {\r\n result = this.getPropertyValue(propertyName) !==\r\n this.initialValues[propertyName];\r\n }\r\n else\r\n {\r\n const propertyNameUnderscore: string = `_${propertyName}`;\r\n\r\n if (propertyNameUnderscore in this.initialValues)\r\n {\r\n result = this.getPropertyValue(propertyNameUnderscore)\r\n !== this.initialValues[propertyNameUnderscore];\r\n }\r\n }\r\n }\r\n else\r\n {\r\n result = this.isTrackableNew || this.isModified\r\n || TrackableModel.getDeleted(this.dataId).has(this);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Populates the model with the specified data.\r\n public load(data?: object): TrackableModel\r\n {\r\n if (!this.loadOnce || !this.isLoaded)\r\n {\r\n this.clear(false);\r\n\r\n if (data)\r\n {\r\n this.isLoaded = true;\r\n\r\n this.loadData(data as TrackableModel);\r\n\r\n for (const propertyName of this.getPropertyNames())\r\n {\r\n this.initialValues[propertyName] =\r\n this.getPropertyValue(propertyName);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public revertToDefaultValues(): void\r\n {\r\n for (const property of Object.keys(this.defaultValues))\r\n {\r\n this.setPropertyValue(property, this.defaultValues[property]);\r\n }\r\n }\r\n\r\n public revertValue(propertyName: string)\r\n {\r\n if (propertyName in this.initialValues)\r\n {\r\n this.setProperty(propertyName, this.initialValues[propertyName]);\r\n }\r\n }\r\n\r\n // Reset IsModified, and set the value of each trackable property to\r\n // it's initial value.\r\n public revertValues(): void\r\n {\r\n if (this.isModified)\r\n {\r\n for (const propertyName of this.getPropertyNames())\r\n {\r\n if (propertyName in this.initialValues)\r\n {\r\n this.setPropertyValue(\r\n propertyName, this.initialValues[propertyName]);\r\n }\r\n }\r\n }\r\n\r\n this.isModified = false;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public setDefaultValue(propertyName: string, value: any): void\r\n {\r\n this.defaultValues[propertyName] = value;\r\n }\r\n\r\n // Sets the name of the primary key for this model.\r\n public setPrimaryKeyName(name: string | null)\r\n {\r\n TrackableModel.primaryKeyNames.set(this.modelName, name);\r\n }\r\n\r\n // Sets the value of the specified property.\r\n // Tracks initial value and modified state.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public setProperty(propertyName: string, value: any): boolean\r\n {\r\n let result: boolean = false;\r\n let isModified: boolean = false;\r\n let initialValue: boolean = false;\r\n\r\n if (!(propertyName in this.initialValues))\r\n {\r\n this.setDefaultValue(\r\n propertyName, this.getPropertyValue(propertyName));\r\n this.initialValues[propertyName] = value;\r\n initialValue = true;\r\n }\r\n\r\n if (this.getPropertyValue(propertyName) !== value)\r\n {\r\n if (!initialValue)\r\n {\r\n if (this.initialValues[propertyName] === value && this.trackUndo)\r\n {\r\n // If this property has been reset to it's initial value,\r\n // check if any other property has been changed or is the\r\n // model now unmodified. If there is no initial value\r\n // then the property has never been\r\n // set before or it is not a tracked property.\r\n // Either way it would be considered unchanged.\r\n for (const propName of this.getPropertyNames())\r\n {\r\n if (propName !== propertyName &&\r\n propName in this.initialValues)\r\n {\r\n if (this.hasChanges(propName))\r\n {\r\n isModified = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.isModified = isModified;\r\n }\r\n else\r\n {\r\n this.isModified = true;\r\n }\r\n }\r\n\r\n this.setPropertyValue(propertyName, value);\r\n result = true;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import Sys from './Sys';\r\n\r\nexport default class Logging\r\n{\r\n private static getMembers(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n object: any,\r\n showFunctions: boolean = false,\r\n shallow: boolean = false,\r\n delimiter: string | null = null,\r\n limit: number | null = null\r\n ): string\r\n {\r\n let message = '';\r\n\r\n const delim = delimiter || ', ';\r\n\r\n if (typeof object === 'string' || typeof object === 'boolean'\r\n || typeof object === 'number')\r\n {\r\n message = object.toString();\r\n }\r\n else\r\n {\r\n for (const member of Object.keys(object))\r\n {\r\n if (!limit || message.length < limit)\r\n {\r\n try\r\n {\r\n if (typeof object[member] === 'string')\r\n {\r\n message +=\r\n `${member}: '${object[member]}'${delim}`;\r\n }\r\n else if (typeof object[member] === 'function')\r\n {\r\n if (showFunctions)\r\n {\r\n message += `${member}: function()${delim}`;\r\n }\r\n }\r\n else if (typeof object[member] === 'object' && !shallow)\r\n {\r\n if (object[member] === null)\r\n {\r\n message += `${member}: null${delim}`;\r\n }\r\n else\r\n {\r\n const members = Logging.getMembers(\r\n object[member], showFunctions,\r\n shallow, ', ', 200);\r\n message += `${member}: {${members}}${delim}`;\r\n }\r\n }\r\n else\r\n {\r\n message += `${member}: ${object[member]}${delim}`;\r\n }\r\n }\r\n catch (exception)\r\n {\r\n message += `${member}: [Not Accessible]${delim}`;\r\n }\r\n }\r\n else\r\n {\r\n message += '...';\r\n break;\r\n }\r\n }\r\n\r\n if (message.substr(message.length - delim.length) === delim)\r\n {\r\n message = message.substr(0, message.length - delim.length);\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n\r\n public static error(error: Error | string)\r\n {\r\n if (Sys.monitor)\r\n {\r\n if (error instanceof Error)\r\n {\r\n Sys.monitor.addMessage(error.message);\r\n }\r\n else\r\n {\r\n Sys.monitor.addMessage(error);\r\n }\r\n }\r\n\r\n if (window.console)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static log(message: any, group: string | undefined = undefined): void\r\n {\r\n if (message instanceof Error)\r\n {\r\n Logging.error(message);\r\n if (window.console)\r\n {\r\n console.warn(\r\n 'Logging.log call with Error, call Logging.error instead');\r\n }\r\n\r\n return;\r\n }\r\n\r\n let logMessage: string = message;\r\n\r\n if (typeof message === 'object')\r\n {\r\n logMessage = Logging.getMembers(message);\r\n }\r\n else\r\n {\r\n for (let index = 1; index < arguments.length; index++)\r\n {\r\n logMessage = message.replace(`{${index - 1}}`, arguments[index]);\r\n }\r\n }\r\n\r\n if (logMessage.length > 0)\r\n {\r\n if (Sys.monitor)\r\n {\r\n if (group)\r\n {\r\n Sys.monitor.addMessage(`${group} ${logMessage}`);\r\n }\r\n else\r\n {\r\n Sys.monitor.addMessage(logMessage);\r\n }\r\n }\r\n\r\n if (window.console)\r\n {\r\n if (group)\r\n {\r\n console.groupCollapsed(group);\r\n }\r\n\r\n console.log(logMessage);\r\n\r\n if (group)\r\n {\r\n console.groupEnd();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public static warn(\r\n message: string,\r\n group: string | undefined = undefined\r\n ): void\r\n {\r\n if (Sys.monitor)\r\n {\r\n if (group)\r\n {\r\n Sys.monitor.addMessage(`${group} ${message}`);\r\n }\r\n else\r\n {\r\n Sys.monitor.addMessage(message);\r\n }\r\n }\r\n\r\n if (window.console)\r\n {\r\n if (group)\r\n {\r\n console.groupCollapsed(group);\r\n }\r\n\r\n console.warn(message);\r\n\r\n if (group)\r\n {\r\n console.groupEnd();\r\n }\r\n }\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observable } from 'mobx';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\n\r\ninterface Props\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class CaptchaControl extends\r\n React.PureComponent>\r\n{\r\n @observable\r\n public static responseToken: string = '';\r\n private isGuest: boolean = false;\r\n\r\n public static isValid()\r\n {\r\n return CaptchaControl.responseToken !== '';\r\n }\r\n\r\n public static reset()\r\n {\r\n CaptchaControl.responseToken = '';\r\n window['grecaptcha'].reset();\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.isGuest = Sys.getCookie(Sys.guestSessionTokenCookie) !== null;\r\n\r\n if (this.isGuest)\r\n {\r\n const languageCode: string = Sys.settings.currentLanguageCode;\r\n const reCaptcha: HTMLScriptElement = document.createElement('script');\r\n\r\n reCaptcha.setAttribute('type', 'text/javascript');\r\n reCaptcha.setAttribute(\r\n 'src',\r\n `https://www.google.com/recaptcha/api.js?hl=${languageCode}`);\r\n\r\n document.head.appendChild(reCaptcha);\r\n window['mustangReCaptchaCallBack'] =\r\n (token: string) =>\r\n {\r\n CaptchaControl.responseToken = token;\r\n };\r\n window['mustangReCaptchaExpiredCallBack'] =\r\n (token: string) =>\r\n {\r\n CaptchaControl.responseToken = '';\r\n };\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n const scripts = document.head.querySelectorAll(\r\n 'script[src*=\"recaptcha\"]');\r\n scripts.forEach(script => script.remove());\r\n\r\n const iframes = document.querySelectorAll('iframe[src*=\"recaptcha\"]');\r\n iframes.forEach(iframe => iframe.remove());\r\n }\r\n\r\n public render()\r\n {\r\n const siteKey: string = Sys.settings.reCaptchaSiteKey;\r\n let result: React.ReactNode = null;\r\n\r\n if (this.isGuest)\r\n {\r\n result =\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(CaptchaControl);\r\n","import AppServer, { State } from '../core/AppServer';\r\nimport Logging from '../core/Logging';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys, { BusinessError, SessionMessage } from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport { CaptchaControl as CaptchaControlBase }\r\n from '../mustangui/CaptchaControl';\r\nimport RoundTripService, { RoundTripResponse }\r\n from '../services/RoundTripService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport NewObjectService from './NewObjectService';\r\n\r\nexport interface OnRoundTripResponse extends RoundTripResponse\r\n{\r\n newSessionMessages: SessionMessage[];\r\n saved: boolean;\r\n}\r\n\r\ninterface OnNewRowResponse\r\n{\r\n appServerState: State;\r\n businessErrors: BusinessError[];\r\n newRowPaneDataByDataId: PaneDataByDataId;\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\nexport interface RoundTripProps\r\n{\r\n dataId: string;\r\n name: string;\r\n}\r\n\r\nexport default class ActionButtonService\r\n{\r\n public static onNewRow(\r\n rowKey: string,\r\n dataId: string,\r\n widgetName: string,\r\n propagated: TableChildProps\r\n ): RequestPromise\r\n {\r\n RequestsStore.instance.processingStarted();\r\n\r\n if (propagated.parentTable.hasRelatedEditDialog)\r\n {\r\n AppServer.createStateRecoveryPoint();\r\n }\r\n\r\n return RoundTripService.customRoundTrip(\r\n 'ActionButton/OnNewRow/{rowKey}/{dataId}/{widgetName}',\r\n { dataId, rowKey, widgetName }\r\n ).then((response: OnNewRowResponse) =>\r\n {\r\n if (response.validationErrors.length > 0)\r\n {\r\n Sys.showErrors(response.validationErrors);\r\n if (propagated.parentTable.hasRelatedEditDialog)\r\n {\r\n AppServer.clearStateRecoveryPoint();\r\n }\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n if (response.businessErrors.length > 0)\r\n {\r\n AppServer.setState(response.appServerState);\r\n Sys.clearBusinessErrors();\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n Sys.setBusinessErrors(response.businessErrors, false);\r\n if (propagated.parentTable.hasRelatedEditDialog)\r\n {\r\n AppServer.clearStateRecoveryPoint();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const newRowData = response.newRowPaneDataByDataId;\r\n const newRowDataId = Object.keys(newRowData)[0];\r\n const row = newRowData[newRowDataId].rows[0];\r\n\r\n PaneDataStore.clearDeletedRows();\r\n const collection = TrackableModel.models.get(newRowDataId) as\r\n TrackableCollection;\r\n collection.insert(row, false);\r\n propagated.parentTable.populateData();\r\n\r\n if (propagated.parentTable.hasRelatedEditDialog)\r\n {\r\n propagated.parentTable.openRowEditDialog(\r\n row['rowKey'], true);\r\n }\r\n else\r\n {\r\n propagated.parentTable.scrollToRow(row['rowKey']);\r\n }\r\n }).finally(() => RequestsStore.instance.processingStopped());\r\n }\r\n\r\n public static onRoundTrip(\r\n props: RoundTripProps,\r\n selectedRowKeys: string[] | null = null\r\n ): RequestPromise\r\n {\r\n const captchaResponseToken = CaptchaControlBase.responseToken;\r\n\r\n return RoundTripService.standardRoundTrip(\r\n 'ActionButton/OnRoundTrip',\r\n props,\r\n { captchaResponseToken, selectedRowKeys }\r\n ).then((response: OnRoundTripResponse) =>\r\n {\r\n if (response.newSessionMessages.length)\r\n {\r\n Sys.sessionMessages.push(...response.newSessionMessages);\r\n }\r\n\r\n if (response.validationErrors\r\n && response.validationErrors.length > 0)\r\n {\r\n return response;\r\n }\r\n\r\n if (response.businessErrors\r\n && response.businessErrors.length > 0)\r\n {\r\n return response;\r\n }\r\n\r\n if ('newObjectId' in response && response.newObjectId)\r\n {\r\n NewObjectService.navigateToNewObject(\r\n response.newObjectId, response.layoutId!);\r\n }\r\n\r\n return response;\r\n }).catch((response) =>\r\n {\r\n Logging.error(response);\r\n return response;\r\n });\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Button, { ButtonProps } from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Link from '../coreui/Link';\r\nimport Api, { AccessLevel, ValueByBreakpoint } from './Api';\r\n\r\nexport interface ApiButtonProps\r\n{\r\n alternateText?: string;\r\n buttonColor: 'Danger' | 'Dark' | 'Default' | 'Success';\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n buttonRef?: React.Ref | React.RefObject;\r\n component?: 'span' | 'button';\r\n dataId: string;\r\n disabled?: boolean;\r\n disabledHelpText: string;\r\n endIcon?: string;\r\n href?: string;\r\n iconName?: string;\r\n label?: string;\r\n name: string;\r\n onClick?: (event: React.MouseEvent) => void;\r\n renderAsLink?: boolean;\r\n size: 'large' | 'medium' | 'small' | undefined\r\n | ValueByBreakpoint<'large' | 'medium' | 'small'>;\r\n tabIndex?: number;\r\n target?: string;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ApiButton extends\r\n React.Component>\r\n{\r\n protected muiProps: ButtonProps;\r\n\r\n public constructor(\r\n props: ApiButtonProps & WithWidth & WithStyles\r\n )\r\n {\r\n super(props);\r\n\r\n this.state = { anchorElement: null };\r\n\r\n this.muiProps =\r\n {\r\n buttonRef: props.buttonRef,\r\n component: props.component || 'button',\r\n endIcon: props.endIcon,\r\n href: props.href,\r\n icon: props.iconName,\r\n onClick: props['onClick'],\r\n style: props['style'],\r\n tabIndex: props.tabIndex,\r\n target: props.target,\r\n variant: props['variant'],\r\n };\r\n\r\n if (props.buttonColor !== 'Default')\r\n {\r\n this.muiProps.color = props.buttonColor.toLowerCase();\r\n }\r\n\r\n if (props.alternateText)\r\n {\r\n this.muiProps['aria-label'] = props.alternateText;\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.label = _props.label;\r\n this.muiProps.className = `${_props.classes.root} `;\r\n this.muiProps['children'] = _props['children'];\r\n delete _props.size;\r\n\r\n const renderLink = _props.renderAsLink\r\n && (_props.label || this.muiProps['children']);\r\n\r\n const renderButtonOrLink = (buttonProps: ButtonProps) =>\r\n {\r\n if (renderLink)\r\n {\r\n const children: React.ReactNode[] = [];\r\n if (this.muiProps['children'])\r\n {\r\n children.push(this.muiProps['children'] as React.ReactNode);\r\n }\r\n else\r\n {\r\n children.push({_props.label});\r\n }\r\n\r\n if (_props['endIcon'])\r\n {\r\n children.push(\r\n );\r\n }\r\n\r\n return (\r\n );\r\n }\r\n\r\n let size: 'large' | 'medium' | 'small' | undefined = undefined;\r\n if (!this.props.size || typeof this.props.size === 'string')\r\n {\r\n size = this.props.size;\r\n }\r\n else if (this.props.width in this.props.size)\r\n {\r\n size = this.props.size[this.props.width];\r\n }\r\n\r\n return (\r\n );\r\n };\r\n\r\n if (Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n\r\n if (widgetProperties['showDisabledHelp'])\r\n {\r\n result =\r\n \r\n {renderButtonOrLink(this.muiProps)}\r\n ;\r\n }\r\n else\r\n {\r\n result = renderButtonOrLink(this.muiProps);\r\n }\r\n }\r\n else\r\n {\r\n this.muiProps.disabled = false;\r\n\r\n result = renderButtonOrLink(this.muiProps);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(ApiButton));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport * as React from 'react';\r\nimport Button from '../../coreui/Button';\r\nimport Dialog from '../../coreui/Dialog';\r\nimport DialogActions from '../../coreui/DialogActions';\r\nimport DialogContent from '../../coreui/DialogContent';\r\nimport Icon from '../../coreui/Icon';\r\nimport Grid from '../../mustangui/Grid';\r\nimport GridItem from '../../mustangui/GridItem';\r\nimport { ButtonColor } from '../ActionButton';\r\nimport Api from '../Api';\r\n\r\ninterface Props\r\n{\r\n cancelButtonText: string;\r\n continueButtonColor: ButtonColor;\r\n continueButtonIcon?: string;\r\n continueButtonText: string;\r\n isOpen: boolean;\r\n message: string;\r\n onCancel: () => void;\r\n onContinue: () => void;\r\n title: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class ConfirmationDialog extends\r\n React.Component>\r\n{\r\n private readonly dangerColor: string;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.dangerColor = Api.getSystemColor('danger');\r\n }\r\n\r\n public render()\r\n {\r\n const isDanger: boolean = this.props.continueButtonColor === 'Danger';\r\n\r\n return (\r\n this.props.onCancel()}\r\n open={this.props.isOpen}\r\n >\r\n \r\n \r\n \r\n \r\n {isDanger ? (\r\n \r\n \r\n \r\n \r\n ) : null}\r\n {this.props.title}\r\n \r\n \r\n \r\n \r\n {this.props.message}\r\n \r\n \r\n \r\n \r\n \r\n this.props.onContinue()}\r\n >\r\n {this.props.continueButtonText}\r\n \r\n this.props.onCancel()}\r\n style={{ marginLeft: 40 }}\r\n >\r\n {this.props.cancelButtonText}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ConfirmationDialog);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer, useObserver } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport RequestPromise from '../../core/RequestPromise';\r\nimport Sys from '../../core/Sys';\r\nimport { Drawer } from '../../coreui/Drawer';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport ActionButtonService, { OnRoundTripResponse }\r\n from '../../services/ActionButtonService';\r\nimport { ActionButton, ActionButtonProps, ActionButtonRuntimeProps }\r\n from '../ActionButton';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { CaptchaControl as CaptchaControlBase } from '../CaptchaControl';\r\nimport { MenuItemProps } from '../MenuItem';\r\nimport ConfirmationDialog from './ConfirmationDialog';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\ninterface State\r\n{\r\n isConfirmDialogOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class CustomActionButton extends\r\n React.Component, State>\r\n{\r\n private onClickPromise: RequestPromise;\r\n\r\n private static onClick(\r\n config: {\r\n dataId: string;\r\n iconName?: string;\r\n name: string;\r\n propagated?: TableChildProps;\r\n }\r\n ): RequestPromise\r\n {\r\n let selectedRowKeys: string[] | null = null;\r\n if (config.propagated && config.propagated.parentTable)\r\n {\r\n selectedRowKeys = [];\r\n\r\n if (config.propagated.parentRowKey)\r\n {\r\n selectedRowKeys.push(config.propagated.parentRowKey);\r\n }\r\n else\r\n {\r\n const gridApi = config.propagated.parentTable.getApi();\r\n\r\n const rows =\r\n config.propagated.parentTable.selection.getSelectedRows();\r\n if (rows.length <= 0)\r\n {\r\n gridApi.forEachNode(r => rows.push(r.data));\r\n for (let i = 0; i < gridApi.getPinnedTopRowCount(); i++)\r\n {\r\n rows.push(gridApi.getPinnedTopRow(i).data);\r\n }\r\n }\r\n\r\n for (const row of rows)\r\n {\r\n selectedRowKeys!.push(row.rowKey);\r\n }\r\n }\r\n }\r\n\r\n return ActionButtonService.onRoundTrip(\r\n config,\r\n selectedRowKeys\r\n ).then((response) =>\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(config) as ActionButtonRuntimeProps;\r\n\r\n if (response.saved && !response.url)\r\n {\r\n Sys.clearBusinessErrors();\r\n ActionButton.showSavedToast(config.iconName);\r\n }\r\n\r\n if (runtimeProperties.validateCaptcha)\r\n {\r\n CaptchaControlBase.reset();\r\n }\r\n\r\n return response;\r\n });\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n\r\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] =\r\n React.useState(false);\r\n\r\n const onClick = () =>\r\n {\r\n if (runtimeProps.accessLevel >= AccessLevel.actionable)\r\n {\r\n if (runtimeProps.confirmMessage)\r\n {\r\n setIsConfirmDialogOpen(true);\r\n }\r\n else\r\n {\r\n CustomActionButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n Drawer.closeAll();\r\n }\r\n }\r\n };\r\n\r\n const onAcceptConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n CustomActionButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n };\r\n\r\n const onCancelConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n };\r\n\r\n return useObserver(() => (\r\n \r\n {runtimeProps.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n {runtimeProps.label}\r\n \r\n \r\n ));\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isConfirmDialogOpen: false };\r\n }\r\n\r\n private onAcceptConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n CustomActionButton.onClick(this.props);\r\n };\r\n\r\n private onCancelConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n };\r\n\r\n private onClick = () =>\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n\r\n if (runtimeProperties.confirmMessage)\r\n {\r\n this.setState({ isConfirmDialogOpen: true });\r\n }\r\n else\r\n {\r\n this.onClickPromise = CustomActionButton.onClick(this.props);\r\n }\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.onClickPromise)\r\n {\r\n this.onClickPromise.abort();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n const disabled: boolean = runtimeProperties.validateCaptcha\r\n && !CaptchaControlBase.isValid();\r\n\r\n return (\r\n \r\n {runtimeProperties.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(CustomActionButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer, useObserver } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport RequestPromise from '../../core/RequestPromise';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport ActionButtonService, { OnRoundTripResponse, RoundTripProps }\r\n from '../../services/ActionButtonService';\r\nimport { ActionButtonProps, ActionButtonRuntimeProps } from '../ActionButton';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { CaptchaControl as CaptchaControlBase } from '../CaptchaControl';\r\nimport { MenuItemProps } from '../MenuItem';\r\nimport ConfirmationDialog from './ConfirmationDialog';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\ninterface State\r\n{\r\n isConfirmDialogOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class DeletePresentationButton extends\r\n React.Component, State>\r\n{\r\n private onClickPromise: RequestPromise;\r\n\r\n private static onClick(\r\n props: RoundTripProps\r\n ): RequestPromise\r\n {\r\n return ActionButtonService.onRoundTrip(props).then((response) =>\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(props) as ActionButtonRuntimeProps;\r\n\r\n if (runtimeProperties.validateCaptcha)\r\n {\r\n CaptchaControlBase.reset();\r\n }\r\n\r\n return response;\r\n });\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n\r\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] =\r\n React.useState(false);\r\n\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n if (runtimeProps.confirmMessage)\r\n {\r\n setIsConfirmDialogOpen(true);\r\n }\r\n else\r\n {\r\n DeletePresentationButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n }\r\n }\r\n };\r\n\r\n const onAcceptConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n DeletePresentationButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n };\r\n\r\n const onCancelConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n };\r\n\r\n return useObserver(() => (\r\n \r\n {runtimeProps.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n {runtimeProps.label}\r\n \r\n \r\n ));\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isConfirmDialogOpen: false };\r\n }\r\n\r\n private onAcceptConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n this.onClickPromise = DeletePresentationButton.onClick(this.props);\r\n };\r\n\r\n private onCancelConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n };\r\n\r\n private onClick = () =>\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n\r\n if (runtimeProperties.confirmMessage)\r\n {\r\n this.setState({ isConfirmDialogOpen: true });\r\n }\r\n else\r\n {\r\n this.onClickPromise = DeletePresentationButton.onClick(this.props);\r\n }\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.onClickPromise)\r\n {\r\n this.onClickPromise.abort();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as ActionButtonRuntimeProps;\r\n const disabled: boolean = runtimeProperties.validateCaptcha\r\n && !CaptchaControlBase.isValid();\r\n\r\n return (\r\n \r\n {runtimeProperties.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DeletePresentationButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport TrackableCollection from '../../core/TrackableCollection';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport { RoundTripProps } from '../../services/ActionButtonService';\r\nimport { ActionButtonProps, ActionButtonRuntimeProps } from '../ActionButton';\r\nimport { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { MenuItemProps } from '../MenuItem';\r\nimport { SelectChildProps } from '../SelectControl';\r\nimport ConfirmationDialog from './ConfirmationDialog';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\ninterface State\r\n{\r\n isConfirmDialogOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class DeleteRowButton extends\r\n React.PureComponent, State>\r\n{\r\n private static onClick(\r\n props: RoundTripProps & {\r\n propagated: TableChildProps & SelectChildProps;\r\n }\r\n ): void\r\n {\r\n const parentTable = props.propagated.parentTable;\r\n\r\n if (props.propagated.parentSelect)\r\n {\r\n let objectHandles: string[];\r\n if (parentTable.isVerticalLayout)\r\n {\r\n objectHandles = [props.propagated.parentRowObjectHandle!];\r\n }\r\n else\r\n {\r\n objectHandles = parentTable.selection.getSelectedRows().map(\r\n r => r.objectHandle);\r\n }\r\n\r\n props.propagated.parentSelect.onRowsRemoved(objectHandles);\r\n\r\n return;\r\n }\r\n\r\n if (parentTable.isVerticalLayout)\r\n {\r\n TrackableCollection.deleteRow(\r\n parentTable.configProps.contentDataId!,\r\n props.propagated.parentRowKey!);\r\n }\r\n else\r\n {\r\n const collection = TrackableModel.models.get(\r\n parentTable.configProps.contentDataId!) as TrackableCollection;\r\n\r\n collection.delete(parentTable.selection.getSelectedRows());\r\n }\r\n\r\n parentTable.populateData();\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n\r\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] =\r\n React.useState(false);\r\n\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n if (runtimeProps.confirmMessage)\r\n {\r\n setIsConfirmDialogOpen(true);\r\n }\r\n else\r\n {\r\n DeleteRowButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n }\r\n }\r\n };\r\n\r\n const onAcceptConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n DeleteRowButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n };\r\n\r\n const onCancelConfirm = () =>\r\n {\r\n setIsConfirmDialogOpen(false);\r\n };\r\n\r\n return (\r\n \r\n {runtimeProps.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n {runtimeProps.label}\r\n \r\n \r\n );\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isConfirmDialogOpen: false };\r\n }\r\n\r\n private onAcceptConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n DeleteRowButton.onClick(this.props);\r\n };\r\n\r\n private onCancelConfirm = () =>\r\n {\r\n this.setState({ isConfirmDialogOpen: false });\r\n };\r\n\r\n private onClick = () =>\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n\r\n if (runtimeProperties.confirmMessage)\r\n {\r\n this.setState({ isConfirmDialogOpen: true });\r\n }\r\n else\r\n {\r\n DeleteRowButton.onClick(this.props);\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n\r\n return (\r\n \r\n {runtimeProperties.confirmMessage ? (\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DeleteRowButton);\r\n","import { createStyles, makeStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport RequestPromise from '../../core/RequestPromise';\r\nimport Sys from '../../core/Sys';\r\nimport Button from '../../coreui/Button';\r\nimport Icon from '../../coreui/Icon';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport Presentation from '../../coreui/Presentation';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport { AccessLevel } from '../../mustangui/Api';\r\nimport ActionButtonService, { RoundTripProps }\r\n from '../../services/ActionButtonService';\r\nimport { ActionButtonProps, ActionButtonRuntimeProps } from '../ActionButton';\r\nimport ApiButton from '../ApiButton';\r\nimport { MenuItemProps } from '../MenuItem';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n fabIcon:\r\n {\r\n width: '100%',\r\n },\r\n input:\r\n {\r\n cursor: 'pointer',\r\n height: '100%',\r\n left: 0,\r\n opacity: 0,\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n },\r\n });\r\n\r\nconst menuStyles = makeStyles((theme: Theme) => (\r\n{\r\n input:\r\n {\r\n cursor: 'pointer',\r\n height: '100%',\r\n left: 0,\r\n opacity: 0,\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n } as CSSProperties,\r\n}));\r\n\r\n@observer\r\nexport class NewRowButton extends\r\n React.Component>\r\n{\r\n private onClickPromise: RequestPromise;\r\n\r\n private static onChange(\r\n propagated: TableChildProps,\r\n input: HTMLInputElement\r\n )\r\n {\r\n if (!input.files || input.files.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n propagated.parentTable.uploadFiles(input.files).then(() =>\r\n {\r\n input.value = '';\r\n });\r\n }\r\n\r\n private static onClick(\r\n config: RoundTripProps & { propagated: TableChildProps }\r\n ): RequestPromise\r\n {\r\n if (config.propagated.parentTable.isVerticalLayout)\r\n {\r\n config.propagated.parentTable.getApi().paginationGoToFirstPage();\r\n }\r\n\r\n const observable = Presentation.getObservable(config)! as PaneRow;\r\n return ActionButtonService.onNewRow(\r\n observable.rowKey,\r\n config.dataId,\r\n config.name,\r\n config.propagated);\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n\r\n if (props.runtime.accessLevel <= AccessLevel.readOnly)\r\n {\r\n return (\r\n \r\n {runtimeProps.label}\r\n \r\n );\r\n }\r\n\r\n if (configProps.uploadOnNew)\r\n {\r\n const classes = menuStyles();\r\n\r\n const onChange = (\r\n event: React.ChangeEvent) =>\r\n {\r\n NewRowButton.onChange(configProps.propagated, event.target);\r\n MenuBase.closeAll();\r\n };\r\n\r\n const extensions: string | undefined =\r\n configProps.propagated.parentTable.validExtensions?.\r\n map(extension => `.${extension}`).join(',');\r\n\r\n return (\r\n ) =>\r\n {\r\n if (e.target.nodeName !== 'INPUT')\r\n {\r\n const input: HTMLInputElement =\r\n e.target.querySelector('input')!;\r\n input.focus();\r\n }\r\n }}\r\n tabIndex={-1}\r\n >\r\n \r\n {runtimeProps.label}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {\r\n NewRowButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n }}\r\n >\r\n {runtimeProps.label}\r\n \r\n );\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n NewRowButton.onChange(this.props.propagated, event.target);\r\n };\r\n\r\n private onClick = () =>\r\n {\r\n this.onClickPromise = NewRowButton.onClick(this.props);\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.onClickPromise)\r\n {\r\n this.onClickPromise.abort();\r\n }\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n\r\n if (runtimeProperties.accessLevel === undefined)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (this.props.uploadOnNew\r\n && runtimeProperties.accessLevel >= AccessLevel.actionable)\r\n {\r\n const extensions: string | undefined =\r\n this.props.propagated.parentTable.validExtensions?.\r\n map(extension => `.${extension}`).join(',');\r\n\r\n let buttonColor = undefined;\r\n if (this.props.buttonColor !== 'Default')\r\n {\r\n buttonColor = this.props.buttonColor.toLowerCase();\r\n }\r\n\r\n const uploadInput = (\r\n \r\n );\r\n\r\n if (runtimeProperties.label)\r\n {\r\n return (\r\n \r\n {runtimeProperties.label}\r\n {uploadInput}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {uploadInput}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(NewRowButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer, useObserver } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport RequestPromise from '../../core/RequestPromise';\r\nimport Sys from '../../core/Sys';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport ActionButtonService, { OnRoundTripResponse }\r\n from '../../services/ActionButtonService';\r\nimport { ActionButton, ActionButtonProps, ActionButtonRuntimeProps }\r\n from '../ActionButton';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { CaptchaControl as CaptchaControlBase } from '../CaptchaControl';\r\nimport { MenuItemProps } from '../MenuItem';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class SavePresentationButton extends\r\n React.Component>\r\n{\r\n private onClickPromise: RequestPromise;\r\n\r\n private static onClick(\r\n props: {\r\n dataId: string;\r\n iconName?: string;\r\n name: string;\r\n }\r\n ): RequestPromise\r\n {\r\n return ActionButtonService.onRoundTrip(props).then((response) =>\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(props) as ActionButtonRuntimeProps;\r\n\r\n if (response.saved && !response.url)\r\n {\r\n Sys.clearBusinessErrors();\r\n ActionButton.showSavedToast(props.iconName);\r\n }\r\n\r\n if (runtimeProperties.validateCaptcha)\r\n {\r\n CaptchaControlBase.reset();\r\n }\r\n\r\n return response;\r\n });\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n SavePresentationButton.onClick(configProps);\r\n MenuBase.closeAll();\r\n }\r\n };\r\n\r\n return useObserver(() => (\r\n \r\n {runtimeProps.label}\r\n \r\n ));\r\n }\r\n\r\n private onClick = () =>\r\n {\r\n this.onClickPromise = SavePresentationButton.onClick(this.props);\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.onClickPromise)\r\n {\r\n this.onClickPromise.abort();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as ActionButtonRuntimeProps;\r\n const disabled: boolean = runtimeProperties.validateCaptcha\r\n && !CaptchaControlBase.isValid();\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SavePresentationButton);\r\n","import * as muiCollapse from '@material-ui/core/Collapse';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\n\r\ninterface Props\r\n{\r\n children: React.ReactNode;\r\n in: boolean;\r\n name?: string | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n container:\r\n {\r\n transition: theme.transitions.create(['height', 'margin-top']),\r\n },\r\n });\r\n\r\nexport class Collapse extends\r\n React.PureComponent>\r\n{\r\n // Dictionary of collapse components, keyed by name.\r\n public static instances = new Map>();\r\n private hasExpanded: boolean = false;\r\n\r\n private static addInstance(instance: Collapse, name: string)\r\n {\r\n if (!Collapse.instances.has(name))\r\n {\r\n Collapse.instances.set(name, new Set());\r\n }\r\n\r\n Collapse.instances.get(name)!.add(instance);\r\n }\r\n\r\n public static close(name?: string | null)\r\n {\r\n if (!name || !Collapse.instances.has(name))\r\n {\r\n return;\r\n }\r\n\r\n Collapse.instances.get(name)!.forEach((collapse) =>\r\n {\r\n collapse.close();\r\n });\r\n }\r\n\r\n public static open(name?: string | null)\r\n {\r\n if (!name || !Collapse.instances.has(name))\r\n {\r\n return;\r\n }\r\n\r\n Collapse.instances.get(name)!.forEach((collapse) =>\r\n {\r\n collapse.open();\r\n });\r\n }\r\n\r\n public static toggle(name?: string | null)\r\n {\r\n if (!name || !Collapse.instances.has(name))\r\n {\r\n return;\r\n }\r\n\r\n Collapse.instances.get(name)!.forEach((collapse) =>\r\n {\r\n collapse.toggle();\r\n });\r\n }\r\n\r\n constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n if ('in' in props)\r\n {\r\n this.state = { open: props.in };\r\n }\r\n else\r\n {\r\n this.state = { open: true };\r\n }\r\n\r\n if (props.name)\r\n {\r\n Collapse.addInstance(this, props.name);\r\n }\r\n }\r\n\r\n private onCollapse = (node: HTMLElement): void =>\r\n {\r\n node.style.marginTop = '0px';\r\n };\r\n\r\n private onCollapseEnd = (node: HTMLElement): void =>\r\n {\r\n node.style.display = 'none';\r\n };\r\n\r\n private onExpand = (node: HTMLElement, isAppearing?: boolean): void =>\r\n {\r\n node.style.marginTop = '';\r\n };\r\n\r\n private onExpandStart = (node: HTMLElement, isAppearing?: boolean): void =>\r\n {\r\n node.style.display = '';\r\n };\r\n\r\n public close()\r\n {\r\n if (!this.state['open'])\r\n {\r\n return;\r\n }\r\n\r\n this.setState({ open: false });\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n if (this.state['open'])\r\n {\r\n return;\r\n }\r\n\r\n // Ensure the element is in 'collapsed' state if it starts collapsed.\r\n const node = ReactDOM.findDOMNode(this)! as HTMLElement;\r\n node.style['display'] = 'none';\r\n node.style['marginTop'] = '0px';\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (!this.props.name || !Collapse.instances.has(this.props.name))\r\n {\r\n return;\r\n }\r\n\r\n Collapse.instances.get(this.props.name)!.delete(this);\r\n\r\n if (Collapse.instances.get(this.props.name)!.size === 0)\r\n {\r\n Collapse.instances.delete(this.props.name);\r\n }\r\n }\r\n\r\n public open()\r\n {\r\n if (this.state['open'])\r\n {\r\n return;\r\n }\r\n\r\n this.setState({ open: true });\r\n }\r\n\r\n public render()\r\n {\r\n if (this.state['open'])\r\n {\r\n this.hasExpanded = true;\r\n }\r\n\r\n return (\r\n \r\n {this.hasExpanded ? this.props.children : null}\r\n \r\n );\r\n }\r\n\r\n public toggle()\r\n {\r\n this.setState({ open: !this.state['open'] });\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Collapse);\r\n","import * as muiPaper from '@material-ui/core/Paper';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Logging from '../core/Logging';\r\nimport Sys from '../core/Sys';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport Collapse, { Collapse as CollapseBase } from './Collapse';\r\nimport Fade from './Fade';\r\n\r\nexport interface PaperProps extends muiPaper.PaperProps\r\n{\r\n blended?: boolean;\r\n card?: boolean;\r\n cardDepth?: number;\r\n collapse?: boolean;\r\n dataId?: string;\r\n fade?: number;\r\n group?: string | null;\r\n hidden?: boolean;\r\n margin?: boolean;\r\n name?: string | null;\r\n}\r\n\r\ninterface State\r\n{\r\n isSwitching?: boolean;\r\n visible?: boolean;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n blended:\r\n {\r\n backgroundColor: 'transparent',\r\n },\r\n card:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n cardAlternate:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n margin:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n padding: theme.paper.padding.xs,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n padding: theme.paper.padding.sm,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n padding: theme.paper.padding.md,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n padding: theme.paper.padding.lg,\r\n },\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Paper extends\r\n React.PureComponent, State>\r\n{\r\n // Dictionary of paper name lists, keyed by group.\r\n public static groups = new Map>();\r\n // Dictionary of paper components, keyed by name.\r\n public static instances = new Map>();\r\n\r\n private static addInstance(instance: Paper, name: string, group: string | null)\r\n {\r\n if (!Paper.instances.has(name))\r\n {\r\n Paper.instances.set(name, new Set());\r\n }\r\n\r\n Paper.instances.get(name)!.add(instance);\r\n\r\n if (!group)\r\n {\r\n return;\r\n }\r\n\r\n if (!Paper.groups.get(group))\r\n {\r\n Paper.groups.set(group, new Set());\r\n }\r\n\r\n Paper.groups.get(group)!.add(name);\r\n }\r\n\r\n public static hide(name?: string | null, switching: boolean = false): boolean\r\n {\r\n if (!name || !Paper.instances.has(name))\r\n {\r\n return false;\r\n }\r\n\r\n let result = false;\r\n Paper.instances.get(name)!.forEach((paper) =>\r\n {\r\n const hidden = paper.hide(switching);\r\n if (hidden)\r\n {\r\n result = true;\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public static hideGroup(group?: string | null)\r\n {\r\n if (!group || !Paper.groups.has(group))\r\n {\r\n return;\r\n }\r\n\r\n Paper.groups.get(group)!.forEach((name) =>\r\n {\r\n Paper.hide(name, false);\r\n });\r\n }\r\n\r\n public static show(name?: string | null)\r\n {\r\n if (!name || !Paper.instances.has(name))\r\n {\r\n return;\r\n }\r\n\r\n Paper.instances.get(name)!.forEach((paper) =>\r\n {\r\n paper.show();\r\n });\r\n }\r\n\r\n public static toggle(name?: string | null)\r\n {\r\n if (!name || !Paper.instances.has(name))\r\n {\r\n return;\r\n }\r\n\r\n Paper.instances.get(name)!.forEach((paper) =>\r\n {\r\n paper.toggle();\r\n });\r\n }\r\n\r\n constructor(props: PaperProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n if ('hidden' in props)\r\n {\r\n this.state = { visible: !props.hidden };\r\n }\r\n else if (props.collapse || props.group)\r\n {\r\n this.state = { visible: false };\r\n }\r\n else\r\n {\r\n this.state = { visible: true };\r\n }\r\n\r\n if (props.name)\r\n {\r\n Paper.addInstance(this, props.name, props.group || null);\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (!this.props.name || !Paper.instances.has(this.props.name))\r\n {\r\n return;\r\n }\r\n\r\n Paper.instances.get(this.props.name)!.delete(this);\r\n\r\n if (Paper.instances.get(this.props.name)!.size === 0)\r\n {\r\n Paper.instances.delete(this.props.name);\r\n }\r\n\r\n if (!this.props.group || !Paper.groups.has(this.props.group))\r\n {\r\n return;\r\n }\r\n\r\n const group: Set = Paper.groups.get(this.props.group)!;\r\n\r\n if (group.has(this.props.name))\r\n {\r\n group.delete(this.props.name);\r\n\r\n if (group.size === 0)\r\n {\r\n Paper.groups.delete(this.props.group);\r\n }\r\n }\r\n }\r\n\r\n public hide(switching: boolean = false): boolean\r\n {\r\n if (!this.state.visible)\r\n {\r\n return false;\r\n }\r\n\r\n this.setState({ isSwitching: switching }, () =>\r\n {\r\n this.setState({ visible: false });\r\n\r\n if (this.props.collapse || this.props.fade)\r\n {\r\n CollapseBase.close(this.props.name);\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const {\r\n blended,\r\n card,\r\n cardDepth,\r\n children,\r\n classes,\r\n collapse,\r\n dataId,\r\n fade,\r\n group,\r\n hidden,\r\n margin,\r\n name,\r\n ...paperProps\r\n } = this.props;\r\n\r\n let paperChildren = children;\r\n if (dataId)\r\n {\r\n // FUTURE\r\n // This is in place for the custom pane display on the sub-pane\r\n // control because all sub-panes are rendered, but in the case of\r\n // the custom pane display, not all will have their data loaded.\r\n // This mechanism needs to be in Paper rather than in SubPane\r\n // because Paper is dynamically hidden and shown, which does not\r\n // cause the parent component to re-render when the Paper is shown.\r\n //\r\n // A better approach that is more in line with how React and Mob-X\r\n // is intended to work would be to have the sub-pane control use its\r\n // props to determine which sub-pane to render and then render only\r\n // that one; rather than using static methods on Paper to manually\r\n // hide or show a sub-pane as is currently the case.\r\n const row = PaneRow.get(dataId);\r\n\r\n if (!row)\r\n {\r\n paperChildren = null;\r\n }\r\n else if (!row.isLoaded)\r\n {\r\n paperChildren = null;\r\n }\r\n }\r\n\r\n paperProps.className = `${classes.root} `\r\n + `${paperProps.className ? paperProps.className : ''} `;\r\n\r\n if (blended)\r\n {\r\n paperProps.className += `${classes.blended} `;\r\n }\r\n\r\n if (card)\r\n {\r\n if (cardDepth === undefined)\r\n {\r\n Logging.log(this.props);\r\n throw new Error(`Card depth is required on ${name}`);\r\n }\r\n\r\n if (cardDepth % 2 === 0)\r\n {\r\n paperProps.className += `${classes.card} `;\r\n }\r\n else\r\n {\r\n paperProps.className += `${classes.cardAlternate} `;\r\n }\r\n }\r\n\r\n if (margin)\r\n {\r\n paperProps.className += `${classes.margin} `;\r\n }\r\n else\r\n {\r\n paperProps.elevation = 0;\r\n }\r\n\r\n if (collapse)\r\n {\r\n return (\r\n \r\n \r\n {paperChildren}\r\n \r\n \r\n );\r\n }\r\n\r\n if (fade && fade > 0)\r\n {\r\n if (this.state.isSwitching)\r\n {\r\n if (this.state.visible)\r\n {\r\n return (\r\n \r\n \r\n {paperChildren}\r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {paperChildren}\r\n \r\n \r\n );\r\n }\r\n\r\n let displayStyle = 'none';\r\n if (this.state.visible)\r\n {\r\n displayStyle = 'inherit';\r\n if (!this.props.blended)\r\n {\r\n displayStyle = 'block';\r\n }\r\n }\r\n\r\n return (\r\n \r\n {paperChildren}\r\n );\r\n }\r\n\r\n public show()\r\n {\r\n if (this.state.visible)\r\n {\r\n return;\r\n }\r\n\r\n if (this.props.collapse)\r\n {\r\n CollapseBase.open(this.props.name);\r\n }\r\n else if (this.props.group && Paper.groups.has(this.props.group))\r\n {\r\n let paperHidden = false;\r\n Paper.groups.get(this.props.group)!.forEach((name) =>\r\n {\r\n if (name !== this.props.name)\r\n {\r\n const hidden = Paper.hide(name, true);\r\n if (hidden)\r\n {\r\n paperHidden = true;\r\n }\r\n }\r\n });\r\n\r\n if (!paperHidden)\r\n {\r\n CollapseBase.open(this.props.name);\r\n }\r\n\r\n this.setState({ isSwitching: paperHidden });\r\n }\r\n\r\n this.setState({ visible: true });\r\n }\r\n\r\n public toggle()\r\n {\r\n if (!this.state.visible)\r\n {\r\n this.show();\r\n }\r\n else\r\n {\r\n this.hide();\r\n }\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Paper);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { autorun, IReactionDisposer, observable } from 'mobx';\r\nimport * as React from 'react';\r\nimport Logging from '../core/Logging';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys from '../core/Sys';\r\nimport Paper from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport NewObjectService from '../services/NewObjectService';\r\nimport RoundTripService, { RoundTripResponse }\r\n from '../services/RoundTripService';\r\nimport LayoutStateStore from '../stores/LayoutStateStore';\r\nimport PaneDataStore, { PaneData, PaneDataByDataId }\r\n from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport { ActionButton as ActionButtonBase } from './ActionButton';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ErrorBoundary from './ErrorBoundary';\r\n\r\ninterface GetDataResponse\r\n{\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface OnNavigateResponse extends RoundTripResponse\r\n{\r\n layoutId?: string;\r\n newObjectId?: string;\r\n}\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n steps: StepProps[];\r\n}\r\n\r\ninterface State\r\n{\r\n selectedPaneUseKey?: string;\r\n}\r\n\r\nexport interface StepProps\r\n{\r\n dataId: string;\r\n label: string;\r\n paneUse: object;\r\n paneUseKey: string;\r\n}\r\n\r\nexport interface StepWidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n paneUseKey: string;\r\n rowKey: string;\r\n stepComplete: boolean;\r\n}\r\n\r\nexport interface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n selectedPaneUseKey: string | null;\r\n steps: StepWidgetProperties[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n paper:\r\n {\r\n boxSizing: 'border-box',\r\n minHeight: 80 + 8 * 2, // Loading animation + padding\r\n position: 'relative',\r\n },\r\n });\r\n\r\nexport class WizardControl extends\r\n React.PureComponent, State>\r\n{\r\n @observable\r\n private static widgetProperties: WidgetProperties | null = null;\r\n public static instance: WizardControl | null = null;\r\n private dataMonitorDisposer: IReactionDisposer;\r\n private lastRetrievedPaneDate: Date | undefined;\r\n private loadedPaneUseKeys: string[] = [];\r\n private retrieveDataPromises: RequestPromise[] = [];\r\n\r\n private static finishNavigate(\r\n response: RoundTripResponse,\r\n scrollToPageTop: boolean)\r\n {\r\n if (response\r\n && (!response.businessErrors\r\n || response.businessErrors.length <= 0)\r\n && (!response.validationErrors\r\n || response.validationErrors.length <= 0))\r\n {\r\n // Future 7.4.1: This should be moved to a more appropriate place\r\n PaneDataStore.clearAllDataChanges();\r\n\r\n if (WizardControl.isOnLastStep())\r\n {\r\n if (response.newObjectId)\r\n {\r\n NewObjectService.navigateToNewObject(\r\n response.newObjectId, response.layoutId!);\r\n }\r\n\r\n Sys.clearBusinessErrors();\r\n ActionButtonBase.showSavedToast('fas fa-save');\r\n }\r\n\r\n if (scrollToPageTop)\r\n {\r\n window.scrollTo(0, 0);\r\n }\r\n }\r\n }\r\n\r\n public static getStepCount(): number\r\n {\r\n let result: number = 0;\r\n\r\n if (WizardControl.widgetProperties)\r\n {\r\n result = WizardControl.widgetProperties.steps.length - 1;\r\n\r\n for (const step of WizardControl.widgetProperties.steps)\r\n {\r\n if (step.accessLevel === AccessLevel.hidden)\r\n {\r\n result--;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getStepNumber(step: number): number\r\n {\r\n let result: number = step + 1;\r\n\r\n if (WizardControl.widgetProperties)\r\n {\r\n for (let index = 0; index <= step; index++)\r\n {\r\n if (WizardControl.widgetProperties.steps[index].accessLevel ===\r\n AccessLevel.hidden)\r\n {\r\n result--;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getSteps(): StepProps[] | null\r\n {\r\n const instance = WizardControl.instance;\r\n let result: StepProps[] | null = null;\r\n\r\n if (instance)\r\n {\r\n result = instance.props.steps;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getWidgetProperties(): WidgetProperties | null\r\n {\r\n let result: WidgetProperties | null = null;\r\n\r\n if (WizardControl.widgetProperties)\r\n {\r\n result = WizardControl.widgetProperties;\r\n }\r\n else\r\n {\r\n result =\r\n {\r\n accessLevel: AccessLevel.enterable,\r\n selectedPaneUseKey: null,\r\n steps: [],\r\n };\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static async gotoNextStep(): Promise\r\n {\r\n const instance = WizardControl.instance;\r\n if (!instance)\r\n {\r\n return null;\r\n }\r\n\r\n RequestsStore.instance.processingStarted(null, false, true);\r\n\r\n const response: RoundTripResponse =\r\n await RoundTripService.standardRoundTrip(\r\n 'WizardControl/OnNavigate',\r\n instance.props,\r\n { navigationDirection: 'next' },\r\n true)\r\n .catch((_response) =>\r\n {\r\n Logging.error(_response);\r\n return _response;\r\n });\r\n\r\n RequestsStore.instance.processingStopped();\r\n\r\n WizardControl.finishNavigate(response, true);\r\n\r\n return response;\r\n }\r\n\r\n public static async gotoPreviousStep(): Promise\r\n {\r\n const instance = WizardControl.instance;\r\n if (!instance)\r\n {\r\n return null;\r\n }\r\n\r\n RequestsStore.instance.processingStarted(null, false, true);\r\n\r\n const response: RoundTripResponse =\r\n await RoundTripService.standardRoundTrip(\r\n 'WizardControl/OnNavigate',\r\n instance.props,\r\n { navigationDirection: 'previous' },\r\n true)\r\n .catch((_response) =>\r\n {\r\n Logging.error(_response);\r\n return _response;\r\n });\r\n\r\n RequestsStore.instance.processingStopped();\r\n\r\n WizardControl.finishNavigate(response, true);\r\n\r\n return response;\r\n }\r\n\r\n public static async gotoStep(\r\n navigationPaneUseKey: string\r\n ): Promise\r\n {\r\n const instance = WizardControl.instance;\r\n if (!instance)\r\n {\r\n return null;\r\n }\r\n\r\n const response: RoundTripResponse =\r\n await RoundTripService.standardRoundTrip(\r\n 'WizardControl/OnNavigate',\r\n instance.props,\r\n { navigationPaneUseKey })\r\n .catch((_response) =>\r\n {\r\n Logging.error(_response);\r\n return _response;\r\n });\r\n\r\n WizardControl.finishNavigate(response, false);\r\n\r\n return response;\r\n }\r\n\r\n public static isOnLastStep(): boolean\r\n {\r\n const instance = WizardControl.instance;\r\n\r\n if (instance)\r\n {\r\n const index = instance.props.steps.findIndex(\r\n s => s.paneUseKey === instance.state.selectedPaneUseKey);\r\n\r\n return index === instance.props.steps.length - 1;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {\r\n selectedPaneUseKey: undefined,\r\n };\r\n\r\n WizardControl.instance = this;\r\n }\r\n\r\n private dataMonitor = () =>\r\n {\r\n const parentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.dataId)!;\r\n\r\n if (!parentPane.lastRetrieved)\r\n {\r\n return;\r\n }\r\n\r\n if (this.lastRetrievedPaneDate\r\n && this.lastRetrievedPaneDate >= parentPane.lastRetrieved)\r\n {\r\n return;\r\n }\r\n\r\n for (const retrievePromise of this.retrieveDataPromises)\r\n {\r\n retrievePromise.abort();\r\n }\r\n\r\n WizardControl.widgetProperties =\r\n Api.getWidgetProperties(this.props) as WidgetProperties;\r\n\r\n const paneUseKey: string | null =\r\n WizardControl.widgetProperties.selectedPaneUseKey;\r\n\r\n LayoutStateStore.setSelectedStep(paneUseKey);\r\n\r\n if (paneUseKey)\r\n {\r\n const activeStep: StepWidgetProperties | undefined =\r\n WizardControl.widgetProperties.steps.find(\r\n t => t.paneUseKey === paneUseKey);\r\n\r\n if (!activeStep)\r\n {\r\n throw new Error(\r\n `No step with pane use key of ${paneUseKey} found`);\r\n }\r\n\r\n this.loadedPaneUseKeys = [activeStep.paneUseKey];\r\n\r\n this.setState({\r\n selectedPaneUseKey: activeStep.paneUseKey,\r\n });\r\n }\r\n else\r\n {\r\n this.loadedPaneUseKeys = [];\r\n this.setState({\r\n selectedPaneUseKey: undefined,\r\n });\r\n }\r\n\r\n this.lastRetrievedPaneDate = parentPane.lastRetrieved;\r\n };\r\n\r\n private renderSelectedStepPane(\r\n widgetProperties: WidgetProperties): React.ReactNode\r\n {\r\n if (widgetProperties.accessLevel <= AccessLevel.disabled)\r\n {\r\n return null;\r\n }\r\n\r\n const selectedStep: StepProps = this.props.steps.find(s =>\r\n s.paneUseKey === this.state.selectedPaneUseKey)!;\r\n\r\n let stepContents: React.ReactNode = null;\r\n if (this.loadedPaneUseKeys.indexOf(selectedStep.paneUseKey) >= 0)\r\n {\r\n // Key attribute tells React to recreate the component from\r\n // scratch when the selected step changes. Without this child\r\n // components are reused and constructors are not called\r\n stepContents = (\r\n
\r\n {Presentation.create(selectedStep.paneUse)}\r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n {stepContents}\r\n
);\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n this.dataMonitorDisposer = autorun(this.dataMonitor);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n WizardControl.instance = null;\r\n\r\n for (const retrievePromise of this.retrieveDataPromises)\r\n {\r\n retrievePromise.abort();\r\n }\r\n\r\n this.dataMonitorDisposer();\r\n\r\n LayoutStateStore.setSelectedStep(null);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.state.selectedPaneUseKey || this.props.steps.length <= 0)\r\n {\r\n return null;\r\n }\r\n\r\n if (!WizardControl.widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (WizardControl.widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {this.renderSelectedStepPane(WizardControl.widgetProperties)}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(WizardControl);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Hidden from '../../coreui/Hidden';\r\nimport Icon from '../../coreui/Icon';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport { ActionButtonProps, ActionButtonRuntimeProps }\r\n from '../ActionButton';\r\nimport { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { MenuItemProps } from '../MenuItem';\r\nimport { StepProps, WizardControl as WizardControlBase }\r\n from '../WizardControl';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class WizardNextButton extends\r\n React.Component>\r\n{\r\n private static onClick()\r\n {\r\n WizardControlBase.gotoNextStep();\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n WizardNextButton.onClick();\r\n MenuBase.closeAll();\r\n }\r\n };\r\n\r\n const configProps = props.config as Props;\r\n\r\n return (\r\n \r\n {runtimeProps.label}\r\n \r\n );\r\n }\r\n\r\n private onClick = () =>\r\n {\r\n WizardNextButton.onClick();\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n const widgetProperties = WizardControlBase.getWidgetProperties();\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n const count: number = WizardControlBase.getStepCount();\r\n const last: number = widgetProperties.steps.length - 1;\r\n const selectedStep: number = widgetProperties.steps.findIndex(s =>\r\n s.paneUseKey === widgetProperties.selectedPaneUseKey)!;\r\n const step: number = WizardControlBase.getStepNumber(selectedStep);\r\n const steps: StepProps[] | null = WizardControlBase.getSteps();\r\n let result: React.ReactNode = null;\r\n\r\n if (selectedStep < last)\r\n {\r\n let label: string = runtimeProperties.label;\r\n let iconName: string = 'fas fa-arrow-right';\r\n\r\n if (step === count && steps)\r\n {\r\n label = steps[last].label;\r\n iconName = 'fas fa-check';\r\n }\r\n\r\n result =\r\n \r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n \r\n \r\n \r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(WizardNextButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Hidden from '../../coreui/Hidden';\r\nimport { Menu as MenuBase } from '../../coreui/Menu';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport { ActionButtonProps, ActionButtonRuntimeProps }\r\n from '../ActionButton';\r\nimport { AccessLevel } from '../Api';\r\nimport ApiButton from '../ApiButton';\r\nimport { MenuItemProps } from '../MenuItem';\r\nimport { WizardControl as WizardControlBase } from '../WizardControl';\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class WizardPreviousButton extends\r\n React.Component>\r\n{\r\n private static onClick(): void\r\n {\r\n WizardControlBase.gotoPreviousStep();\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const runtimeProps = props.runtime as ActionButtonRuntimeProps;\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n WizardPreviousButton.onClick();\r\n MenuBase.closeAll();\r\n }\r\n };\r\n\r\n const configProps = props.config as Props;\r\n\r\n return (\r\n \r\n {runtimeProps.label}\r\n \r\n );\r\n }\r\n\r\n private onClick = () =>\r\n {\r\n WizardPreviousButton.onClick();\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as ActionButtonRuntimeProps;\r\n const widgetProperties = WizardControlBase.getWidgetProperties();\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n const selectedStep: number = widgetProperties.steps.findIndex(s =>\r\n s.paneUseKey === widgetProperties.selectedPaneUseKey)!;\r\n const step: number = WizardControlBase.getStepNumber(selectedStep);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(WizardPreviousButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Icon from '../coreui/Icon';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport CustomActionButton, { CustomActionButton as CustomActionButtonBase }\r\n from './ActionButtons/CustomActionButton';\r\nimport DeletePresentationButton,\r\n { DeletePresentationButton as DeletePresentationButtonBase }\r\n from './ActionButtons/DeletePresentationButton';\r\nimport DeleteRowButton, { DeleteRowButton as DeleteRowButtonBase }\r\n from './ActionButtons/DeleteRowButton';\r\nimport NewRowButton, { NewRowButton as NewRowButtonBase }\r\n from './ActionButtons/NewRowButton';\r\nimport SavePresentationButton,\r\n { SavePresentationButton as SavePresentationButtonBase }\r\n from './ActionButtons/SavePresentationButton';\r\nimport WizardNextButton, { WizardNextButton as WizardNextButtonBase }\r\n from './ActionButtons/WizardNextButton';\r\nimport WizardPreviousButton,\r\n { WizardPreviousButton as WizardPreviousButtonBase }\r\n from './ActionButtons/WizardPreviousButton';\r\nimport { AccessLevel, ValueByBreakpoint } from './Api';\r\nimport { MenuItemProps } from './MenuItem';\r\nimport { SelectChildProps } from './SelectControl';\r\nimport { ToolbarChildProps } from './Toolbar';\r\n\r\nexport interface ActionButtonProps\r\n{\r\n alternateText: string;\r\n buttonColor: ButtonColor;\r\n dataId: string;\r\n disabledHelpText: string;\r\n iconName: string;\r\n name: string;\r\n propagated: TableChildProps & SelectChildProps & ToolbarChildProps;\r\n size: ButtonSize;\r\n uploadOnNew?: boolean;\r\n}\r\n\r\nexport type ButtonAction = 'Delete Presentation' | 'Delete Row' | 'New Row'\r\n | 'Save Presentation' | 'Wizard Next' | 'Wizard Previous';\r\n\r\nexport type ButtonColor = 'Danger' | 'Dark' | 'Default' | 'Success';\r\n\r\nexport interface ButtonSize\r\n extends ValueByBreakpoint<'large' | 'medium' | 'small'>\r\n{\r\n}\r\n\r\nexport interface ActionButtonRuntimeProps\r\n{\r\n accessLevel: AccessLevel;\r\n cancelButtonText: string;\r\n confirmMessage: string;\r\n continueButtonText: string;\r\n label: string;\r\n showDisabledHelp: boolean;\r\n validateCaptcha: boolean;\r\n}\r\n\r\ninterface Props extends ActionButtonProps\r\n{\r\n buttonAction?: ButtonAction;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class ActionButton extends\r\n React.PureComponent>\r\n{\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as { buttonAction: ButtonAction };\r\n\r\n if (configProps.buttonAction === null)\r\n {\r\n return ;\r\n }\r\n\r\n switch (configProps.buttonAction)\r\n {\r\n case 'Delete Presentation':\r\n return ;\r\n case 'Delete Row':\r\n return ;\r\n case 'New Row':\r\n return ;\r\n case 'Save Presentation':\r\n return ;\r\n case 'Wizard Next':\r\n return ;\r\n case 'Wizard Previous':\r\n return ;\r\n default:\r\n throw new Error(\r\n `Unknown button action ${configProps.buttonAction}`);\r\n }\r\n }\r\n\r\n public static showSavedToast(iconName?: string)\r\n {\r\n Sys.showToast(\r\n
\r\n {iconName ? (\r\n \r\n ) : null}\r\n Saved\r\n
,\r\n true,\r\n undefined,\r\n 'right',\r\n undefined,\r\n 5000);\r\n }\r\n\r\n public render()\r\n {\r\n const { buttonAction, classes, ...buttonProps } = this.props;\r\n\r\n if (this.props.buttonAction === null)\r\n {\r\n return ;\r\n }\r\n\r\n switch (this.props.buttonAction)\r\n {\r\n case 'Delete Presentation':\r\n return ;\r\n case 'Delete Row':\r\n return ;\r\n case 'New Row':\r\n return ;\r\n case 'Save Presentation':\r\n return ;\r\n case 'Wizard Next':\r\n return ;\r\n case 'Wizard Previous':\r\n return ;\r\n default:\r\n throw new Error(\r\n `Unknown button action ${this.props.buttonAction}`);\r\n }\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ActionButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Icon, { IconProps } from '../coreui/Icon';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Size\r\n{\r\n lg: number | undefined;\r\n md: number | undefined;\r\n sm: number | undefined;\r\n xl: number | undefined;\r\n xs: number | undefined;\r\n}\r\n\r\ninterface ConfigProperties\r\n{\r\n alternateText: string;\r\n dataId: string;\r\n imageHeight: Size;\r\n imageUrl: string;\r\n imageWidth: Size;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n display: 'block',\r\n maxWidth: '100%',\r\n },\r\n });\r\n\r\n@observer\r\nexport class BrandingImageDisplay extends\r\n React.Component & WithWidth>\r\n{\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n const height = this.props.imageHeight[this.props.width];\r\n const width = this.props.imageWidth[this.props.width];\r\n\r\n if (!height && !width)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(BrandingImageDisplay));\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Paper from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport PaneRow from '../models/PaneRow';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport Grid from './Grid';\r\nimport GridItem from './GridItem';\r\n\r\ninterface Props\r\n{\r\n cardDepth: number;\r\n content: object;\r\n contentDataId: string;\r\n dataId: string;\r\n headerToolbar?: object;\r\n name: string;\r\n selectionToolbar?: object;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\n@observer\r\nexport class CardControl extends React.Component\r\n{\r\n private headerToolbar: React.ReactNode = null;\r\n\r\n public constructor(props: Props)\r\n {\r\n super(props);\r\n\r\n if (props.headerToolbar)\r\n {\r\n this.headerToolbar = Presentation.create(\r\n this.props.headerToolbar,\r\n {\r\n verticalLayout: true,\r\n });\r\n }\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n const cards: React.ReactNode[] = [];\r\n for (const model of rows)\r\n {\r\n const paneRow = model as PaneRow;\r\n cards.push(\r\n \r\n \r\n {\r\n this.props.selectionToolbar ?\r\n Presentation.create(\r\n this.props.selectionToolbar,\r\n {\r\n contentDataId: this.props.contentDataId,\r\n parentRowKey: paneRow.rowKey,\r\n })\r\n : null\r\n }\r\n {\r\n Presentation.create(\r\n this.props.content,\r\n {\r\n rowKey: paneRow.rowKey,\r\n })\r\n }\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n {this.headerToolbar}\r\n \r\n {cards}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default CardControl;\r\n","import * as muiFormHelperText from '@material-ui/core/FormHelperText';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiFormHelperText.FormHelperTextProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class FormHelperText extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n _props.component = 'div';\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FormHelperText);\r\n","import * as muiFormControl from '@material-ui/core/FormControl';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport FormHelperText from './FormHelperText';\r\n\r\nexport interface FormControlProps extends muiFormControl.FormControlProps\r\n{\r\n FormHelperTextProps?: object;\r\n helperText?: React.ReactNode;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class FormControl extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const formHelperTextProps = _props.FormHelperTextProps;\r\n\r\n if ('FormHelperTextProps' in _props)\r\n {\r\n delete _props.FormHelperTextProps;\r\n }\r\n\r\n if ('helperText' in _props)\r\n {\r\n if (_props.helperText)\r\n {\r\n _props.children =\r\n \r\n {_props.children}\r\n \r\n {_props.helperText}\r\n \r\n ;\r\n }\r\n\r\n delete _props.helperText;\r\n }\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FormControl);\r\n","import * as muiFormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiFormControlLabel.FormControlLabelProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class FormControlLabel extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FormControlLabel);\r\n","import * as muiCheckbox from '@material-ui/core/Checkbox';\r\nimport { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport FormControl, { FormControlProps } from '../coreui/FormControl';\r\nimport FormControlLabel from '../coreui/FormControlLabel';\r\nimport Icon from '../coreui/Icon';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport { Paper as PaperBase } from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n controlledPaneName: string | null;\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n isPaneController: boolean;\r\n label: string;\r\n name: string;\r\n roundTripOnChange: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n roundTripOnChange: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n ripple:\r\n {\r\n overflow: 'visible',\r\n },\r\n root:\r\n {\r\n '&:hover': { backgroundColor: 'transparent' },\r\n backgroundColor: 'transparent',\r\n display: 'inline-block',\r\n },\r\n });\r\n\r\n@observer\r\nexport class Checkbox extends\r\n React.Component>\r\n{\r\n protected checkboxProps: muiCheckbox.CheckboxProps;\r\n protected muiProps: FormControlProps;\r\n\r\n public constructor(props: Props & WithTheme & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps = {};\r\n\r\n this.muiProps.fullWidth = true;\r\n\r\n this.checkboxProps =\r\n {\r\n checkedIcon: ,\r\n color: 'default',\r\n icon: ,\r\n TouchRippleProps: { className: props.classes.ripple },\r\n };\r\n }\r\n\r\n protected showSubPane()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!_props.isPaneController)\r\n {\r\n return;\r\n }\r\n\r\n const rowKey =\r\n _props['propagated'] ? _props['propagated']['rowKey'] : null;\r\n let paneName = _props.controlledPaneName;\r\n\r\n if (rowKey)\r\n {\r\n paneName += `_${rowKey}`;\r\n }\r\n\r\n if (Presentation.getValue(_props, false))\r\n {\r\n PaperBase.show(paneName);\r\n }\r\n else\r\n {\r\n PaperBase.hide(paneName);\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n this.showSubPane();\r\n }\r\n\r\n public componentDidUpdate()\r\n {\r\n this.showSubPane();\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n\r\n if (Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.helperText = null;\r\n this.checkboxProps.checked = undefined;\r\n\r\n if (widgetProperties['showDisabledHelp'])\r\n {\r\n result =\r\n \r\n \r\n }\r\n label={_props.label}\r\n />\r\n \r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n \r\n }\r\n label={_props.label}\r\n />\r\n ;\r\n }\r\n }\r\n else if (_props['readOnly'])\r\n {\r\n Presentation.setBinding(this, this.checkboxProps);\r\n\r\n result =\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {this.checkboxProps.checked ? 'Yes' : '-'}\r\n \r\n
;\r\n }\r\n else\r\n {\r\n this.muiProps.disabled = false;\r\n\r\n Presentation.setBinding(this, this.checkboxProps);\r\n Api.setHelperText(\r\n this,\r\n widgetProperties['businessErrors'],\r\n this.muiProps);\r\n\r\n if (_props.roundTripOnChange)\r\n {\r\n this.checkboxProps.onChange = (\r\n event: React.ChangeEvent,\r\n checked: boolean) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, checked);\r\n\r\n RoundTripService.standardRoundTrip(\r\n 'CheckBox/OnChange', this.props\r\n ).catch(() =>\r\n {\r\n // If the round trip fails, undo the value change.\r\n Presentation.setValue(this.props, !checked);\r\n });\r\n };\r\n }\r\n\r\n result =\r\n \r\n }\r\n label={_props.label}\r\n />\r\n ;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(Checkbox));\r\n","export default class SubscribeEvent\r\n{\r\n callbacks: (() => void)[] = [];\r\n\r\n public addEventListener(callback: () => void)\r\n {\r\n this.callbacks.push(callback);\r\n }\r\n\r\n public dispatchEvent()\r\n {\r\n this.callbacks.forEach((callback) =>\r\n {\r\n callback();\r\n });\r\n }\r\n\r\n public removeEventListener(callback: () => void)\r\n {\r\n this.callbacks.splice(this.callbacks.indexOf(callback), 1);\r\n }\r\n}\r\n","import * as muiChip from '@material-ui/core/Chip';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiChip.ChipProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Chip extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Chip);\r\n","import * as muiChip from '@material-ui/core/Chip';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Chip from '../coreui/Chip';\r\nimport Api from './Api';\r\n\r\ninterface Props\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n borderColor: Api.getSystemColor('success'),\r\n borderStyle: 'solid',\r\n borderWidth: 2,\r\n zIndex: 1,\r\n },\r\n });\r\n\r\nexport class GridNewRowChip extends\r\n React.PureComponent>\r\n{\r\n protected muiProps: muiChip.ChipProps;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n classes: props.classes,\r\n label: Sys.getTranslation('New', 'DataTable'),\r\n };\r\n }\r\n\r\n public render()\r\n {\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridNewRowChip);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTooltip from '@material-ui/core/Tooltip';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\n\r\ninterface Props extends muiTooltip.TooltipProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n tooltip:\r\n {\r\n backgroundColor: theme.palette.grey['100'],\r\n color: Api.getSystemColor('danger'),\r\n },\r\n tooltipPlacementBottom:\r\n {\r\n '@media(min-width:601px)':\r\n {\r\n marginTop: 16,\r\n },\r\n },\r\n });\r\n\r\nexport class ErrorTooltip extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ErrorTooltip);\r\n","import ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport Button from './Button';\r\nimport ErrorTooltip from './ErrorTooltip';\r\n\r\n// This props does not extend badge properties because badgeContent is\r\n// required and we don't want to have to pass a value for this type of badge.\r\ninterface Props\r\n{\r\n message?: React.ReactNode;\r\n}\r\n\r\ninterface State\r\n{\r\n open: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n ripple:\r\n {\r\n '& > span > span':\r\n {\r\n backgroundColor: Api.getSystemColor('danger'),\r\n },\r\n },\r\n root:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('danger'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('danger'),\r\n color: theme.palette.getContrastText(Api.getSystemColor('danger')),\r\n marginBottom: 8,\r\n marginRight: 8,\r\n pointerEvents: 'auto',\r\n },\r\n });\r\n\r\nexport class RowErrorBadge extends\r\n React.PureComponent, State>\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private buttonRef: any;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { open: false };\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const message = _props.message;\r\n let result: React.ReactNode = null;\r\n\r\n if (message)\r\n {\r\n result =\r\n this.setState({ open: false })}\r\n >\r\n \r\n this.buttonRef = r}\r\n classes={{ root: this.props.classes.root }}\r\n icon=\"fas fa-exclamation\"\r\n onClick={() =>\r\n {\r\n // Fix for Safari not opening tooltip\r\n this.buttonRef.focus();\r\n this.setState({ open: true });\r\n }}\r\n TouchRippleProps={{\r\n className: this.props.classes.ripple,\r\n }}\r\n />\r\n \r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(RowErrorBadge);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport SubscribeEvent from '../../core/SubscribeEvent';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport GridNewRowChip from '../../mustangui/GridNewRowChip';\r\nimport Paper from '../Paper';\r\nimport Presentation from '../Presentation';\r\nimport { TableChildProps, TableVerticalLayoutProps } from '../Table';\r\n\r\nexport interface Props\r\n{\r\n cardDepth: number;\r\n child: object;\r\n data: PaneRow;\r\n onTableReady: SubscribeEvent;\r\n propagated: TableChildProps;\r\n selectToolbarChild?: object | null;\r\n}\r\n\r\ninterface State\r\n{\r\n isTableReady?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n print:\r\n {\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n },\r\n root:\r\n {\r\n whiteSpace: 'normal',\r\n },\r\n });\r\n\r\nexport class FullWidthRenderer extends\r\n React.Component, State>\r\n{\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n isTableReady: props.propagated.parentTable.isTableReady(),\r\n };\r\n\r\n props.onTableReady.addEventListener(this.onTableReady);\r\n }\r\n\r\n private onTableReady = () =>\r\n {\r\n this.setState({ isTableReady: true });\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n this.props.onTableReady.removeEventListener(this.onTableReady);\r\n }\r\n\r\n public render()\r\n {\r\n const tableProps = this.props.propagated.parentTable.configProps;\r\n\r\n let newChip: React.ReactNode = null;\r\n\r\n if (this.props.data.isNew)\r\n {\r\n newChip =\r\n \r\n
\r\n
\r\n \r\n
\r\n ;\r\n }\r\n\r\n return (\r\n \r\n {newChip}\r\n
\r\n {this.state.isTableReady && this.props.selectToolbarChild\r\n ? Presentation.create(\r\n this.props.selectToolbarChild,\r\n {\r\n ...this.props.propagated,\r\n data: this.props.data,\r\n parentRowKey: this.props.data.rowKey,\r\n parentRowObjectHandle:\r\n this.props.data.objectHandle,\r\n })\r\n : null}\r\n
\r\n {Presentation.create(\r\n this.props.child,\r\n {\r\n parentTable: this.props.propagated.parentTable,\r\n rowKey: this.props.data.rowKey,\r\n } as TableVerticalLayoutProps)}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FullWidthRenderer);\r\n","import * as muiCheckbox from '@material-ui/core/Checkbox';\r\nimport { IHeaderParams } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport FormControlLabel from '../FormControlLabel';\r\nimport Icon from '../Icon';\r\nimport { TableChildProps } from '../Table';\r\n\r\ninterface Props extends IHeaderParams {\r\n propagated: TableChildProps;\r\n}\r\n\r\nclass SelectionHeader extends React.Component\r\n{\r\n protected muiProps: muiCheckbox.CheckboxProps;\r\n\r\n public constructor(props: Props)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n checkedIcon: ,\r\n color: 'default',\r\n onChange: (\r\n event: React.ChangeEvent,\r\n checked: boolean) =>\r\n {\r\n this.props.propagated.parentTable.selection.setAllSelected(\r\n checked);\r\n },\r\n tabIndex: -1,\r\n };\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.props.propagated.parentTable.selection.isSelectAllEnabled)\r\n {\r\n return null;\r\n }\r\n\r\n const selectedCount =\r\n this.props.propagated.parentTable.selection.getSelectedCount();\r\n const icon = selectedCount === 0 ? 'far fa-square' :\r\n 'fas fa-minus-square';\r\n const { api } = this.props;\r\n const rowCount = api.getModel().getRowCount()\r\n + api.getPinnedTopRowCount();\r\n\r\n if (rowCount <= 0)\r\n {\r\n return
;\r\n }\r\n\r\n this.muiProps.checked = selectedCount === rowCount;\r\n this.muiProps.icon = ;\r\n\r\n return (\r\n \r\n }\r\n label=\"\"\r\n style={{ maxWidth: 'none' }}\r\n />\r\n
);\r\n }\r\n}\r\n\r\nexport default SelectionHeader;\r\n","import { ICellRendererParams } from 'ag-grid-community';\r\n\r\nexport class CellUtil\r\n{\r\n private static customNavigationKeys = [\r\n 'End', 'Home', 'PageDown', 'PageUp'];\r\n\r\n private static disableNavigationKeys = [\r\n 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'End', 'Home'];\r\n\r\n private static disableCellNavigation(event: KeyboardEvent): void\r\n {\r\n if (CellUtil.disableNavigationKeys.indexOf(event.key) >= 0)\r\n {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n public static customizeGridNavigation(\r\n event: KeyboardEvent,\r\n params: ICellRendererParams\r\n ): void\r\n {\r\n if (!CellUtil.customNavigationKeys.includes(event.key))\r\n {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const currentPage: number = params.api.paginationGetCurrentPage();\r\n\r\n switch (event.key)\r\n {\r\n case 'End':\r\n case 'Home':\r\n // Disable default ag-grid behaviour\r\n break;\r\n\r\n case 'PageDown':\r\n if (currentPage < params.api.paginationGetTotalPages() - 1)\r\n {\r\n params.api.paginationGoToNextPage();\r\n\r\n const firstRow = params.api.getFirstDisplayedRow();\r\n params.api.setFocusedCell(firstRow, params.column);\r\n }\r\n break;\r\n\r\n case 'PageUp':\r\n if (currentPage > 0)\r\n {\r\n params.api.paginationGoToPreviousPage();\r\n\r\n const lastRow = params.api.getLastDisplayedRow();\r\n params.api.setFocusedCell(lastRow, params.column);\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(`Unknown key ${event.key}`);\r\n }\r\n }\r\n\r\n public static disableGridNavigation(\r\n cell: HTMLElement,\r\n input: HTMLInputElement): void\r\n {\r\n cell.addEventListener('keydown', CellUtil.disableCellNavigation);\r\n\r\n input.addEventListener('keydown', (event: KeyboardEvent) =>\r\n {\r\n if (CellUtil.disableNavigationKeys.indexOf(event.key) >= 0)\r\n {\r\n event.stopPropagation();\r\n }\r\n });\r\n }\r\n\r\n public static enableGridNavigation(cell: HTMLElement): void\r\n {\r\n cell.removeEventListener('keydown', CellUtil.disableCellNavigation);\r\n }\r\n\r\n public static runOnAction(\r\n cell: HTMLElement,\r\n action: (event: KeyboardEvent) => void): void\r\n {\r\n cell.addEventListener('keydown', (event: KeyboardEvent) =>\r\n {\r\n if (event.key === 'Enter')\r\n {\r\n action(event);\r\n }\r\n });\r\n }\r\n\r\n public static setInitialFocus(input: HTMLInputElement): void\r\n {\r\n // AutoFocus does not work for initial render.\r\n window.setTimeout(() => input.focus(), 10);\r\n }\r\n\r\n public static setReadOnlyAttribute(\r\n cell: HTMLElement,\r\n readOnly: boolean): void\r\n {\r\n cell.setAttribute('aria-readonly', readOnly ? 'true' : 'false');\r\n }\r\n}\r\n","import * as muiCheckbox from '@material-ui/core/Checkbox';\r\nimport { ICellRendererParams } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport FormControlLabel from '../FormControlLabel';\r\nimport Icon from '../Icon';\r\nimport { TableChildProps } from '../Table';\r\nimport { CellUtil } from './CellUtil';\r\n\r\ninterface Props extends ICellRendererParams {\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isChecked?: boolean;\r\n}\r\n\r\nclass SelectionRenderer extends React.Component\r\n{\r\n protected muiProps: muiCheckbox.CheckboxProps;\r\n\r\n public constructor(props: Props)\r\n {\r\n super(props);\r\n\r\n this.state = { isChecked: false };\r\n\r\n this.muiProps =\r\n {\r\n checkedIcon: ,\r\n color: 'default',\r\n icon: ,\r\n onChange: (\r\n event: React.ChangeEvent,\r\n checked: boolean) =>\r\n {\r\n this.props.propagated.parentTable.selection.setRowsSelected(\r\n [this.props.node], checked);\r\n this.setState({ isChecked: checked });\r\n },\r\n tabIndex: -1,\r\n };\r\n\r\n CellUtil.runOnAction(props.eGridCell, () =>\r\n {\r\n this.setState(\r\n (prevState) =>\r\n {\r\n return { isChecked: !prevState.isChecked };\r\n },\r\n () =>\r\n {\r\n this.props.propagated.parentTable.selection.setRowsSelected(\r\n [this.props.node], this.state.isChecked!);\r\n });\r\n });\r\n\r\n CellUtil.setReadOnlyAttribute(props.eGridCell, false);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n\r\n props.eGridCell.setAttribute('aria-label', 'Select Row');\r\n }\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public refresh(): boolean\r\n {\r\n this.forceUpdate();\r\n\r\n return true;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n\r\n this.muiProps.checked =\r\n this.props.propagated.parentTable.selection.isRowSelected(\r\n _props.node);\r\n\r\n return (\r\n \r\n }\r\n label=\"\"\r\n style={{ maxWidth: 'none' }}\r\n />\r\n
);\r\n }\r\n}\r\n\r\nexport default SelectionRenderer;\r\n","import Paper from '@material-ui/core/Paper/Paper';\r\nimport { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport\r\n{\r\n CellFocusedEvent,\r\n CellPosition,\r\n ColDef,\r\n Column,\r\n ColumnApi,\r\n ColumnResizedEvent,\r\n FilterChangedEvent,\r\n GridApi,\r\n GridReadyEvent,\r\n GridSizeChangedEvent,\r\n PaginationChangedEvent,\r\n RowNode,\r\n SelectionChangedEvent,\r\n} from 'ag-grid-community';\r\n\r\nimport { AgGridReact, AgGridReactProps } from 'ag-grid-react';\r\nimport { autorun, IReactionDisposer, toJS } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport '../agGridTheme/agGridTheme.scss';\r\nimport SubscribeEvent from '../core/SubscribeEvent';\r\nimport Sys, { BusinessError } from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport PaneRow from '../models/PaneRow';\r\nimport Api, { AccessLevel, ValueByBreakpoint } from '../mustangui/Api';\r\nimport GridNewRowChip from '../mustangui/GridNewRowChip';\r\nimport { FileInfo, ProgressStatus } from '../stores/DocumentStore';\r\nimport ComboBoxOption from './ComboBoxOption';\r\nimport Fade from './Fade';\r\nimport Hidden from './Hidden';\r\nimport Icon from './Icon';\r\nimport Presentation from './Presentation';\r\nimport RowErrorBadge from './RowErrorBadge';\r\nimport FullWidthRenderer, { Props as FullWidthProps }\r\n from './table/FullWidthRenderer';\r\nimport SelectionHeader from './table/SelectionHeader';\r\nimport SelectionRenderer from './table/SelectionRenderer';\r\nimport Typography from './Typography';\r\n\r\nexport interface TableProps\r\n{\r\n cardDepth: number;\r\n cellEdit?: boolean;\r\n columns: ColDef[];\r\n contentDataId: string;\r\n dataId: string;\r\n disableScrollOnPageChange?: boolean;\r\n disableSelectAll?: boolean;\r\n dropAreaChild?: React.ReactNode;\r\n footerToolbarChild?: object;\r\n fullWidthChild?: object;\r\n getSelectedRowKeys?: () => string[];\r\n headerToolbarChild?: object;\r\n hideEmptyDocument?: boolean;\r\n ignoreBusinessErrors?: boolean;\r\n // FUTURE\r\n // It would be preferrable to move initial page size props into the Grid\r\n // Pager widget. However layout only widgets are not set up to handle\r\n // props, so Table is the best place for now.\r\n initialPageSize?: ValueByBreakpoint;\r\n isColumnFlex: (colId: string) => boolean;\r\n isColumnVisible: (colId: string, breakpoint: string) => boolean;\r\n isDocumentGrid?: boolean;\r\n keepHeaderOnSelect?: boolean;\r\n minRowHeight: number;\r\n name: string;\r\n onRowSelected?: (rowKey: string) => void;\r\n onRowUnselected?: (rowKey: string) => void;\r\n propagated: TableChildProps;\r\n resetPageOnPopulate?: boolean;\r\n rowSelection?: 'multiple' | 'single';\r\n selectToolbarChild?: object;\r\n setPopulate: (populate: ((rows: TrackableModel[]) => void) | null) => void;\r\n setRestoreLostFocus?: (restoreLostFocus: (() => void) | null) => void;\r\n setScrollToRow?: (scrollToRow: ((rowKey: string) => void) | null) => void;\r\n showNoData?: boolean;\r\n summaryToolbarChild?: object;\r\n uploadFiles?: FileInfo[];\r\n}\r\n\r\ninterface Props extends TableProps, WithWidth\r\n{\r\n tableKey: string;\r\n}\r\n\r\ninterface State\r\n{\r\n isEmpty?: boolean;\r\n isFocused?: boolean;\r\n isGridReady?: boolean;\r\n selectionToolbarVisible?: boolean;\r\n}\r\n\r\ninterface ParentTableChildProps\r\n{\r\n cardDepth: number;\r\n columns: object[];\r\n configProps: {\r\n contentDataId: string;\r\n data?: object;\r\n dataId: string;\r\n name: string;\r\n tableKey: string;\r\n };\r\n getRelationshipComboBoxOptions: (\r\n widgetName: string,\r\n selectedOption: ComboBoxOption\r\n ) => ComboBoxOption[];\r\n hasRelatedEditDialog?: boolean;\r\n isDocumentGrid: boolean;\r\n openRowEditDialog: (rowKey: string, isFirstOpenOfNewRow: boolean) => void;\r\n populateData: () => void;\r\n uploadFiles: (files: FileList) => Promise;\r\n validExtensions: string[] | null;\r\n}\r\n\r\nexport interface TableVerticalLayoutProps\r\n{\r\n parentTable: ParentTableChildProps;\r\n rowKey: string;\r\n}\r\n\r\nexport interface TableChildProps\r\n{\r\n data?: object;\r\n parentRowKey?: string;\r\n parentTable: ParentTableChildProps & {\r\n getApi: () => GridApi;\r\n initialPageSize: ValueByBreakpoint;\r\n isTableReady: () => boolean;\r\n isVerticalLayout: boolean;\r\n scrollToRow: (rowKey: string) => void;\r\n scrollToTop: () => void;\r\n selection: {\r\n getSelectedCount: () => number;\r\n getSelectedRows: () => PaneRow[];\r\n isMultiSelect: boolean;\r\n isRowSelected: (row: RowNode) => boolean;\r\n isSelectAllEnabled: boolean;\r\n setAllSelected: (selected: boolean) => void;\r\n setRowsSelected: (rows: RowNode[], selected: boolean) => void;\r\n };\r\n setStopEditingWhenGridLosesFocus: (stopEditing: boolean) => void;\r\n updateRowHeight: () => void;\r\n };\r\n}\r\n\r\nexport interface TableContext\r\n{\r\n getColumnApi: () => ColumnApi;\r\n hasHorizontalScrollBar: () => boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n print:\r\n {\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n },\r\n root:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n verticalLayout:\r\n {\r\n '& .ag-body-viewport.ag-layout-auto-height':\r\n {\r\n overflow: 'hidden',\r\n },\r\n },\r\n });\r\n\r\n@observer\r\nexport class Table extends\r\n React.Component, State>\r\n{\r\n private readonly allPageSize = 999999;\r\n private columnResizedTimeout: number;\r\n private componentDidUpdateTimeout: number;\r\n private footerToolbar: React.ReactNode | null = null;\r\n private gridContainerRef: HTMLDivElement | null;\r\n private gridSizeChangedTimeout: number;\r\n private headerToolbar: React.ReactNode | null = null;\r\n private isKeyboardNavigatingCells = false;\r\n private lastRowErrors: string | null = null;\r\n private lastRowsData: string = '[]';\r\n private lastUploadFilesCount = 0;\r\n private noData: HTMLDivElement | null = null;\r\n private onTableReady = new SubscribeEvent();\r\n private populateDataTimeout: number;\r\n private populateDataWaitRenderTimeout: number;\r\n // Dictionary of upload progress components, keyed by upload file.\r\n private progressBars: Map =\r\n new Map();\r\n private removeRowErrorsTimeout: number;\r\n // Dictionary of row error components, keyed by upload file.\r\n private rowErrors: Map =\r\n new Map();\r\n private selectedRows = new Set();\r\n private selectToolbar: React.ReactNode | null = null;\r\n private summaryToolbar: React.ReactNode | null = null;\r\n private updateLayoutTimeout: number;\r\n private updateRowHeightTimeout: number;\r\n private uploadFilesDisposer: IReactionDisposer;\r\n protected agProps: AgGridReactProps;\r\n protected gridWidth: number;\r\n protected lastSelectedRows: TrackableModel[] | null = null;\r\n protected minRowHeight: number = 0;\r\n protected trackableCollection: TrackableCollection;\r\n public columnApi: ColumnApi;\r\n public gridApi: GridApi;\r\n public stopEditingWhenGridLosesFocus = true;\r\n\r\n public constructor(props: Props & WithTheme & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n isEmpty: true,\r\n isFocused: false,\r\n selectionToolbarVisible: false,\r\n };\r\n\r\n props.setPopulate(r => this.populateData(r));\r\n\r\n if (props.uploadFiles)\r\n {\r\n this.uploadFilesDisposer = autorun(() =>\r\n {\r\n const uploadFiles: FileInfo[] = props.uploadFiles!;\r\n for (const fileInfo of uploadFiles)\r\n {\r\n this.uploadProgress(\r\n fileInfo.file, fileInfo.status, fileInfo.event);\r\n }\r\n\r\n if (props.fullWidthChild)\r\n {\r\n const finalizedFiles: FileInfo[] =\r\n uploadFiles.filter(f => f.status === 'Finalized');\r\n\r\n if (finalizedFiles.length > this.lastUploadFilesCount)\r\n {\r\n const newestFile: FileInfo =\r\n finalizedFiles[finalizedFiles.length - 1];\r\n this.scrollToRow(newestFile.file['rowKey']);\r\n }\r\n this.lastUploadFilesCount = finalizedFiles.length;\r\n }\r\n else\r\n {\r\n if (uploadFiles.length > this.lastUploadFilesCount)\r\n {\r\n const newestFile: FileInfo =\r\n uploadFiles[uploadFiles.length - 1];\r\n this.scrollToRow(newestFile.file['rowKey']);\r\n }\r\n this.lastUploadFilesCount = uploadFiles.length;\r\n }\r\n });\r\n }\r\n\r\n if (props.setRestoreLostFocus)\r\n {\r\n props.setRestoreLostFocus(() => this.restoreLostFocus());\r\n }\r\n\r\n if (props.setScrollToRow)\r\n {\r\n props.setScrollToRow(rowKey => this.scrollToRow(rowKey));\r\n }\r\n\r\n const initialPageSize = props.initialPageSize || {\r\n lg: 10,\r\n md: 10,\r\n sm: 5,\r\n xl: 10,\r\n xs: 5,\r\n };\r\n\r\n props.propagated.parentTable =\r\n {\r\n ...props.propagated.parentTable,\r\n getApi: () => this.gridApi,\r\n initialPageSize,\r\n isTableReady: () => !!this.gridApi,\r\n isVerticalLayout: !!props.fullWidthChild,\r\n scrollToRow: rowKey => this.scrollToRow(rowKey),\r\n scrollToTop: () => this.scrollToTop(),\r\n selection:\r\n {\r\n getSelectedCount: () => this.getSelectedCount(),\r\n getSelectedRows: () => this.getSelectedRows(),\r\n isMultiSelect: props.rowSelection === 'multiple',\r\n isRowSelected: r => this.isRowSelected(r),\r\n isSelectAllEnabled: props.rowSelection === 'multiple'\r\n && !props.disableSelectAll,\r\n setAllSelected: s => this.setAllSelected(s, true),\r\n setRowsSelected: (r, s) => this.setRowsSelected(r, s, true),\r\n },\r\n setStopEditingWhenGridLosesFocus:\r\n s => this.setStopEditingWhenGridLosesFocus(s),\r\n updateRowHeight: () => this.updateRowHeight(),\r\n };\r\n props.propagated.parentTable.configProps.tableKey = props.tableKey;\r\n\r\n this.agProps = {};\r\n\r\n this.agProps.animateRows = true;\r\n this.agProps.cacheQuickFilter = false;\r\n this.agProps.columnDefs = [];\r\n this.agProps.rowHeight = props.minRowHeight;\r\n this.agProps.context = {\r\n getColumnApi: () => this.columnApi,\r\n hasHorizontalScrollBar: () =>\r\n {\r\n const body: Element = this.gridContainerRef!.querySelector(\r\n '.ag-body-viewport')!;\r\n\r\n return body.clientWidth < body.scrollWidth;\r\n },\r\n } as TableContext;\r\n\r\n if (props.columns.length)\r\n {\r\n for (const column of props.columns)\r\n {\r\n column.cellEditorParams =\r\n {\r\n ...column.cellEditorParams,\r\n propagated: props.propagated,\r\n };\r\n column.cellRendererParams =\r\n {\r\n ...column.cellRendererParams,\r\n propagated: props.propagated,\r\n };\r\n\r\n this.agProps.columnDefs.push(column);\r\n }\r\n\r\n // Add flex column to fill remaining space.\r\n this.agProps.columnDefs.push(\r\n {\r\n cellClass: 'cx-cell cx-cell-last',\r\n colId: '_filler',\r\n headerClass: 'cx-header-filler cx-header-last',\r\n hide: true,\r\n minWidth: 1,\r\n resizable: false,\r\n sortable: false,\r\n suppressMovable: true,\r\n suppressNavigable: true,\r\n suppressSizeToFit: false,\r\n width: 1,\r\n });\r\n }\r\n\r\n // FUTURE 7.4.1: delta row data mode has performance benefits\r\n // However, this requires the data store to be immutable which causes\r\n // problems with how updates are handled which presume in-place\r\n // mutable data\r\n // this.agProps.deltaRowDataMode = true;\r\n this.agProps.domLayout = 'autoHeight';\r\n // https://www.ag-grid.com/javascript-grid-accessibility/#dom-order\r\n this.agProps.ensureDomOrder = true;\r\n this.agProps.getRowNodeId = (row) => { return row.rowKey; };\r\n this.agProps.headerHeight = 48;\r\n\r\n if (props.fullWidthChild)\r\n {\r\n this.agProps.animateRows = false;\r\n this.agProps.fullWidthCellRendererFramework = FullWidthRenderer;\r\n this.agProps.fullWidthCellRendererParams = {\r\n cardDepth: props.cardDepth,\r\n child: props.fullWidthChild,\r\n onTableReady: this.onTableReady,\r\n propagated: props.propagated,\r\n selectToolbarChild: props.selectToolbarChild,\r\n } as FullWidthProps;\r\n this.agProps.headerHeight = 0;\r\n this.agProps.isFullWidthCell = () => true;\r\n this.agProps.rowStyle = { border: 'none' };\r\n this.agProps.scrollbarWidth = 0;\r\n }\r\n\r\n this.agProps.pagination = true;\r\n // If paging is not configured we will display at most 999999 rows.\r\n this.agProps.paginationPageSize = this.allPageSize;\r\n this.agProps.rowClassRules = {\r\n 'ag-row-selected': (row: RowNode) =>\r\n {\r\n return this.isRowSelected(row);\r\n },\r\n };\r\n this.agProps.singleClickEdit = props.cellEdit;\r\n this.agProps.sortingOrder = ['asc', 'desc'];\r\n this.agProps.stopEditingWhenGridLosesFocus = false;\r\n this.agProps.suppressClickEdit = !props.cellEdit;\r\n this.agProps.suppressColumnVirtualisation = true;\r\n this.agProps.suppressDragLeaveHidesColumns = true;\r\n this.agProps.suppressLoadingOverlay = true;\r\n this.agProps.suppressNoRowsOverlay = true;\r\n this.agProps.suppressPaginationPanel = true;\r\n this.agProps.suppressRowHoverHighlight = true;\r\n this.agProps.unSortIcon = true;\r\n this.agProps.suppressKeyboardEvent = (params) =>\r\n {\r\n const tab = 9;\r\n\r\n return params.event.which === tab;\r\n };\r\n\r\n if (props.columns.length && props.rowSelection)\r\n {\r\n if (!props.fullWidthChild)\r\n {\r\n const params = { propagated: props.propagated };\r\n\r\n this.agProps.columnDefs = ([{\r\n cellRendererFramework: SelectionRenderer,\r\n cellRendererParams: params,\r\n cellStyle:\r\n {\r\n 'border-bottom-color': props.theme.palette.grey[300],\r\n },\r\n colId: '_checkboxSelection',\r\n headerComponentFramework: SelectionHeader,\r\n headerComponentParams: params,\r\n hide: true,\r\n lockPosition: true,\r\n pinned: 'left',\r\n resizable: false,\r\n suppressMovable: true,\r\n suppressNavigable: false,\r\n suppressSizeToFit: true,\r\n width: 72,\r\n }] as ColDef[]).concat(this.agProps.columnDefs!);\r\n }\r\n\r\n this.agProps.rowDeselection = props.rowSelection === 'multiple';\r\n this.agProps.rowSelection = props.rowSelection;\r\n this.agProps.rowMultiSelectWithClick =\r\n props.rowSelection === 'multiple';\r\n this.agProps.suppressRowClickSelection = true;\r\n }\r\n\r\n this.agProps.onBodyScroll = () =>\r\n {\r\n // Fix for bug where focus is lost on horizontal scroll\r\n if (this.isKeyboardNavigatingCells)\r\n {\r\n this.restoreLostFocus();\r\n }\r\n };\r\n\r\n this.agProps.onCellFocused = (event: CellFocusedEvent) =>\r\n {\r\n if (event.forceBrowserFocus)\r\n {\r\n this.isKeyboardNavigatingCells = true;\r\n setTimeout(() => this.isKeyboardNavigatingCells = false);\r\n }\r\n };\r\n\r\n this.agProps.onColumnResized = (event: ColumnResizedEvent) =>\r\n {\r\n if (!event.column || !event.column.getColDef().suppressSizeToFit\r\n || !event.finished)\r\n {\r\n return;\r\n }\r\n\r\n this.columnApi.sizeColumnsToFit(this.gridWidth);\r\n // Must be deferred to calculate table height after the columns\r\n // are adjusted.\r\n window.clearTimeout(this.columnResizedTimeout);\r\n this.columnResizedTimeout = window.setTimeout(\r\n () => this.gridApi.doLayout(),\r\n 200);\r\n };\r\n\r\n this.agProps.onDragStopped = () =>\r\n {\r\n this.gridApi.refreshCells({ force: true });\r\n this.gridApi.refreshHeader();\r\n };\r\n\r\n this.agProps.onFilterChanged = (event: FilterChangedEvent) =>\r\n {\r\n this.updateRowHeight();\r\n this.gridApi.refreshHeader();\r\n this.updateNoData(this.gridApi.getDisplayedRowCount());\r\n };\r\n\r\n this.agProps.onGridReady = (event: GridReadyEvent) =>\r\n {\r\n this.columnApi = event.columnApi;\r\n this.gridApi = event.api;\r\n\r\n this.createToolbars();\r\n\r\n this.setState(\r\n { isGridReady: true },\r\n () =>\r\n {\r\n this.updateClasses();\r\n\r\n // This must only run for card views with exactly one row.\r\n if (this.props.fullWidthChild\r\n && this.gridApi.getDisplayedRowCount() === 1)\r\n {\r\n this.updateRowHeightTimeout = window.setTimeout(\r\n () => this.updateRowHeight(),\r\n 100);\r\n }\r\n\r\n this.onTableReady.dispatchEvent();\r\n });\r\n };\r\n\r\n this.agProps.onGridSizeChanged = (event: GridSizeChangedEvent) =>\r\n {\r\n // Future 7.4.1\r\n // Event is sometimes fired after component is unmounted\r\n // Log a bug with ag-Grid\r\n if (!this.gridContainerRef)\r\n {\r\n return;\r\n }\r\n\r\n window.clearTimeout(this.gridSizeChangedTimeout);\r\n this.gridSizeChangedTimeout = window.setTimeout(\r\n () =>\r\n {\r\n // Chrome sometimes is off by 1px due to OS scaling\r\n this.updateLayout(event.clientHeight, event.clientWidth - 1);\r\n },\r\n 100);\r\n };\r\n\r\n this.agProps.onPaginationChanged = (event: PaginationChangedEvent) =>\r\n {\r\n if (event.newPage)\r\n {\r\n this.updateRowHeight();\r\n\r\n // Fix for bug where focus is lost on page change\r\n this.restoreLostFocus();\r\n }\r\n };\r\n\r\n this.agProps.onSelectionChanged = (event: SelectionChangedEvent) =>\r\n {\r\n this.updateSelection();\r\n };\r\n }\r\n\r\n private addNewIndicator()\r\n {\r\n const pinnedTop = this.gridApi['gridPanel'].eTop;\r\n const count: number = this.gridApi.getPinnedTopRowCount();\r\n\r\n if (count && !pinnedTop.querySelector('.cx-new-container'))\r\n {\r\n const container: HTMLDivElement = document.createElement('div');\r\n const rowNode: RowNode = this.gridApi.getPinnedTopRow(0);\r\n const propagated =\r\n {\r\n contentDataId: this.props.contentDataId,\r\n data: rowNode.data,\r\n ...this.props.propagated,\r\n };\r\n const chip = Presentation.createWithTheme(\r\n (\r\n \r\n \r\n \r\n \r\n ),\r\n 'grey',\r\n false);\r\n\r\n container.className = 'cx-new-container';\r\n pinnedTop.appendChild(container);\r\n\r\n ReactDOM.render(chip, container);\r\n }\r\n }\r\n\r\n private addProgressBar(file: File)\r\n {\r\n if (this.props.fullWidthChild)\r\n {\r\n return;\r\n }\r\n\r\n const pinnedTop = this.gridContainerRef!.querySelector(\r\n '.cx-floating-top')! as HTMLElement;\r\n const container: HTMLDivElement = document.createElement('div');\r\n container.className = 'cx-progress-container';\r\n pinnedTop.appendChild(container);\r\n\r\n const content = Presentation.createWithTheme(\r\n (\r\n
\r\n
\r\n \r\n
\r\n ),\r\n 'grey',\r\n false);\r\n\r\n ReactDOM.render(content, container, () =>\r\n {\r\n const progressBar = container.querySelector(\r\n `[id='${file['rowKey']}']`) as HTMLElement;\r\n\r\n this.positionProgressBar(progressBar);\r\n this.progressBars.set(file, progressBar);\r\n });\r\n }\r\n\r\n private addRowError(rowNode: RowNode, messages: string[])\r\n {\r\n if (this.props.fullWidthChild)\r\n {\r\n return;\r\n }\r\n\r\n const container: HTMLDivElement = document.createElement('div');\r\n const centerColumns = this.gridApi['gridPanel'].eBodyViewport;\r\n const pinnedTop = this.gridApi['gridPanel'].eTop;\r\n const rowKey = rowNode.data.rowKey;\r\n\r\n if (rowNode.data.isNew)\r\n {\r\n container.className = 'cx-row-error-pinned-top-container';\r\n pinnedTop.appendChild(container);\r\n }\r\n else\r\n {\r\n container.className = 'cx-row-error-container';\r\n centerColumns.appendChild(container);\r\n }\r\n\r\n const content = Presentation.createWithTheme(\r\n (\r\n
\r\n \r\n
\r\n ),\r\n 'grey',\r\n false);\r\n\r\n ReactDOM.render(content, container, () =>\r\n {\r\n const rowError = container.querySelector(\r\n `[id='${rowKey}']`) as HTMLElement;\r\n\r\n this.positionRowError(rowError);\r\n this.rowErrors.set(rowKey, rowError);\r\n });\r\n }\r\n\r\n private createToolbars()\r\n {\r\n const propagatedProps: TableChildProps = this.props.propagated;\r\n\r\n if (this.props.headerToolbarChild)\r\n {\r\n this.headerToolbar = Presentation.create(\r\n this.props.headerToolbarChild, propagatedProps);\r\n }\r\n\r\n if (this.props.selectToolbarChild && this.props.rowSelection\r\n && !this.props.fullWidthChild)\r\n {\r\n this.selectToolbar = Presentation.create(\r\n this.props.selectToolbarChild, propagatedProps);\r\n }\r\n\r\n if (this.props.footerToolbarChild)\r\n {\r\n this.footerToolbar = Presentation.create(\r\n this.props.footerToolbarChild, propagatedProps);\r\n }\r\n\r\n if (this.props.summaryToolbarChild)\r\n {\r\n this.summaryToolbar = Presentation.create(\r\n this.props.summaryToolbarChild, propagatedProps);\r\n }\r\n }\r\n\r\n private getErrorCount()\r\n {\r\n let result: number = 0;\r\n\r\n Sys.businessErrors.forEach((businessError: BusinessError) =>\r\n {\r\n result += businessError.widgets.filter(widget =>\r\n widget.dataId === this.props.contentDataId).length;\r\n result += businessError.rows.filter(row =>\r\n row.dataId === this.props.contentDataId).length;\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private getSelectedCount()\r\n {\r\n return this.selectedRows.size;\r\n }\r\n\r\n private getSelectedRows(): PaneRow[]\r\n {\r\n if (!this.gridApi)\r\n {\r\n throw 'Grid is not ready';\r\n }\r\n\r\n const rows: PaneRow[] = [];\r\n this.gridApi.getModel().forEachNode((node) =>\r\n {\r\n if (this.selectedRows.has(node.data.rowKey))\r\n {\r\n rows.push(node.data);\r\n }\r\n });\r\n\r\n for (let i = 0; i < this.gridApi.getPinnedTopRowCount(); i++)\r\n {\r\n const row = this.gridApi.getPinnedTopRow(i);\r\n if (this.selectedRows.has(row.data.rowKey))\r\n {\r\n rows.push(row.data);\r\n }\r\n }\r\n\r\n return rows;\r\n }\r\n\r\n private getTableErrors()\r\n {\r\n const widgetProperties =\r\n Api.getWidgetProperties(this.props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n // Required because businessErrors are not provided for all tables.\r\n if (!this.props.ignoreBusinessErrors && widgetProperties.businessErrors)\r\n {\r\n result = Api.getErrorMessages(widgetProperties.businessErrors);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private isRowSelected(row: RowNode)\r\n {\r\n return this.selectedRows.has(row.data.rowKey);\r\n }\r\n\r\n private onBlur = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node)\r\n && event.target instanceof HTMLElement\r\n && event.currentTarget.contains(event.target as Node))\r\n {\r\n if (this.stopEditingWhenGridLosesFocus)\r\n {\r\n this.gridApi.stopEditing();\r\n }\r\n\r\n this.setState({ isFocused: false });\r\n }\r\n };\r\n\r\n private onFocus = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node)\r\n && event.currentTarget.contains(event.target as Node))\r\n {\r\n this.setState({ isFocused: true });\r\n }\r\n };\r\n\r\n private onFocusTabbableElement = () =>\r\n {\r\n const lastFocusedCell: CellPosition = this.gridApi.getFocusedCell();\r\n const pinnedRowCount: number = this.gridApi.getPinnedTopRowCount();\r\n\r\n let minRow = 0;\r\n let maxRow = pinnedRowCount - 1;\r\n if (lastFocusedCell && !lastFocusedCell.rowPinned)\r\n {\r\n minRow = this.gridApi.getFirstDisplayedRow();\r\n maxRow = this.gridApi.getLastDisplayedRow();\r\n }\r\n\r\n if (lastFocusedCell\r\n && lastFocusedCell.rowIndex >= minRow\r\n && lastFocusedCell.rowIndex <= maxRow)\r\n {\r\n this.gridApi.setFocusedCell(\r\n lastFocusedCell.rowIndex,\r\n lastFocusedCell.column,\r\n lastFocusedCell.rowPinned);\r\n }\r\n else\r\n {\r\n const firstRowIndex: number =\r\n pinnedRowCount > 0 ? 0 : this.gridApi.getFirstDisplayedRow();\r\n const firstColumn: Column =\r\n this.columnApi.getAllDisplayedColumns()[0];\r\n\r\n this.gridApi.setFocusedCell(\r\n firstRowIndex,\r\n firstColumn,\r\n pinnedRowCount > 0 ? 'top' : undefined);\r\n }\r\n };\r\n\r\n private onKeyDown = (event: React.KeyboardEvent) =>\r\n {\r\n if (event.key === ' ' && this.gridApi.getEditingCells().length <= 0)\r\n {\r\n event.preventDefault();\r\n\r\n const cell = this.gridApi.getFocusedCell();\r\n let row: RowNode;\r\n if (cell.rowPinned)\r\n {\r\n row = this.gridApi.getPinnedTopRow(cell.rowIndex);\r\n }\r\n else\r\n {\r\n row = this.gridApi.getDisplayedRowAtIndex(cell.rowIndex);\r\n }\r\n\r\n this.setRowsSelected([row], !this.isRowSelected(row), true);\r\n\r\n this.gridApi.setFocusedCell(\r\n cell.rowIndex, cell.column, cell.rowPinned);\r\n }\r\n };\r\n\r\n private populateData(data: TrackableModel[])\r\n {\r\n window.clearTimeout(this.populateDataWaitRenderTimeout);\r\n window.clearTimeout(this.updateRowHeightTimeout);\r\n\r\n // Always access the data to trigger any mobx observers\r\n const dataSerialized = JSON.stringify(toJS(data));\r\n\r\n if (!this.gridApi)\r\n {\r\n // Wait until rendering is complete to make sure any paging widget\r\n // is rendered\r\n this.populateDataWaitRenderTimeout =\r\n window.setTimeout(() => this.populateData(data));\r\n\r\n return;\r\n }\r\n\r\n if (this.props.showNoData)\r\n {\r\n this.updateNoData(data.length);\r\n }\r\n\r\n if (this.props.resetPageOnPopulate)\r\n {\r\n this.gridApi.paginationGoToFirstPage();\r\n }\r\n\r\n // Only populate if the data has changed since the last time\r\n // we accessed it\r\n if (this.lastRowsData === dataSerialized)\r\n {\r\n return;\r\n }\r\n\r\n this.lastRowsData = dataSerialized;\r\n\r\n this.setState({ isEmpty: data.length === 0 });\r\n\r\n if (this.getSelectedRows().length > 0)\r\n {\r\n this.lastSelectedRows = this.getSelectedRows();\r\n }\r\n\r\n if (this.props.fullWidthChild)\r\n {\r\n this.gridApi.setRowData(data);\r\n\r\n this.updateRowHeightTimeout =\r\n window.setTimeout(() => this.updateRowHeight(), 100);\r\n }\r\n else\r\n {\r\n this.gridApi.setRowData(\r\n data.filter(value => !value.isNew));\r\n this.gridApi.setPinnedTopRowData(\r\n data.filter(value => value.isNew));\r\n\r\n if (this.props.showNoData)\r\n {\r\n this.updateNoData(data.length);\r\n }\r\n\r\n if (this.props.getSelectedRowKeys !== undefined)\r\n {\r\n this.selectedRows.clear();\r\n for (const rowId of this.props.getSelectedRowKeys())\r\n {\r\n this.selectedRows.add(rowId);\r\n }\r\n }\r\n else\r\n {\r\n // Prune the selected state for any deleted rows\r\n const rowKeys = new Set(\r\n data.map(i => i['rowKey']));\r\n for (const key of this.selectedRows)\r\n {\r\n if (!rowKeys.has(key))\r\n {\r\n this.selectedRows.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (data.length > 0 && this.lastSelectedRows)\r\n {\r\n const rows: RowNode[] = [];\r\n this.gridApi.getModel().forEachNode((node) =>\r\n {\r\n if (this.lastSelectedRows!.some(selected =>\r\n node.data.getPrimaryKey() === selected.getPrimaryKey()))\r\n {\r\n rows.push(node);\r\n }\r\n });\r\n\r\n for (let i = 0;\r\n i < this.gridApi.getPinnedTopRowCount(); i++)\r\n {\r\n const row = this.gridApi.getPinnedTopRow(i);\r\n if (this.lastSelectedRows.some(selected =>\r\n row.data.getPrimaryKey() === selected.getPrimaryKey()))\r\n {\r\n rows.push(row);\r\n }\r\n }\r\n this.setRowsSelected(rows, true, false);\r\n }\r\n this.lastSelectedRows = null;\r\n\r\n this.updateClasses();\r\n\r\n // Must be deferred so it occurs after re-render.\r\n window.clearTimeout(this.populateDataTimeout);\r\n this.populateDataTimeout = window.setTimeout(\r\n () =>\r\n {\r\n this.gridApi.refreshHeader();\r\n this.updateSelection();\r\n this.removeProgressBars();\r\n this.updateRowErrors();\r\n this.rowErrors.forEach((rowError: HTMLDivElement) =>\r\n {\r\n this.positionRowError(rowError);\r\n });\r\n this.addNewIndicator();\r\n },\r\n 10);\r\n }\r\n }\r\n\r\n private positionAllProgressBars()\r\n {\r\n this.progressBars.forEach((_progressBar: HTMLDivElement) =>\r\n {\r\n this.positionProgressBar(_progressBar);\r\n });\r\n }\r\n\r\n private positionProgressBar(progressBar: HTMLElement)\r\n {\r\n for (let index = 0; index < this.gridApi.getPinnedTopRowCount();\r\n index++)\r\n {\r\n const rowNode: RowNode = this.gridApi.getPinnedTopRow(index);\r\n\r\n if (rowNode.data.rowKey === progressBar.id)\r\n {\r\n progressBar.style.top =\r\n `${((index + 1) * rowNode.rowHeight) - 6}px`;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private positionRowError(rowError: HTMLElement)\r\n {\r\n for (let index = 0; index < this.gridApi.getPinnedTopRowCount();\r\n index++)\r\n {\r\n const rowNode: RowNode = this.gridApi.getPinnedTopRow(index);\r\n\r\n if (rowNode.data.rowKey === rowError.id)\r\n {\r\n rowError.style.top =\r\n `${(index * rowNode.rowHeight - 3)}px`;\r\n rowError.style.height = `${rowNode.rowHeight - 3}px`;\r\n break;\r\n }\r\n }\r\n\r\n this.gridApi.forEachNode((rowNode: RowNode) =>\r\n {\r\n if (rowNode.data.rowKey === rowError.id)\r\n {\r\n // Adjust the position if the error is on the first row of a page.\r\n const offset: number = rowNode.childIndex === 0\r\n || !(rowNode.childIndex\r\n % this.gridApi.paginationGetPageSize() + 1)\r\n ? 0 : 1;\r\n rowError.style.top =\r\n `${(rowNode.childIndex * rowNode.rowHeight) + offset}px`;\r\n rowError.style.height = `${rowNode.rowHeight - offset}px`;\r\n }\r\n });\r\n }\r\n\r\n private refreshCellRenderer(column: string, rows?: RowNode[])\r\n {\r\n this.gridApi.getCellRendererInstances({\r\n columns: [column],\r\n rowNodes: rows,\r\n }).forEach(cell => cell.refresh({}));\r\n }\r\n\r\n private removeProgressBars()\r\n {\r\n const count = this.gridApi.getPinnedTopRowCount();\r\n const files = this.props.uploadFiles;\r\n if (files === undefined)\r\n {\r\n return;\r\n }\r\n\r\n if (count)\r\n {\r\n this.progressBars.forEach((progressBar: HTMLDivElement) =>\r\n {\r\n let done: boolean = false;\r\n\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (this.gridApi.getPinnedTopRow(index).data.rowKey ===\r\n progressBar.id)\r\n {\r\n done = true;\r\n }\r\n }\r\n\r\n if (!done)\r\n {\r\n ReactDOM.unmountComponentAtNode(\r\n progressBar.parentElement!);\r\n\r\n const file: FileInfo | undefined =\r\n files.find(f => f.file['rowKey'] === progressBar.id);\r\n if (file)\r\n {\r\n this.progressBars.delete(file);\r\n files.splice(files.indexOf(file), 1);\r\n this.positionAllProgressBars();\r\n }\r\n }\r\n });\r\n }\r\n else\r\n {\r\n this.progressBars.forEach((progressBar: HTMLDivElement) =>\r\n {\r\n ReactDOM.unmountComponentAtNode(\r\n progressBar.parentElement!);\r\n });\r\n\r\n this.progressBars.clear();\r\n files.length = 0;\r\n }\r\n }\r\n\r\n private removeRowErrors()\r\n {\r\n const errorContainers: HTMLElement[] = [];\r\n\r\n this.rowErrors.forEach((rowError: HTMLDivElement) =>\r\n {\r\n errorContainers.push(rowError.parentElement!);\r\n\r\n ReactDOM.unmountComponentAtNode(\r\n rowError.parentElement!);\r\n });\r\n\r\n if (errorContainers.length > 0)\r\n {\r\n window.clearTimeout(this.removeRowErrorsTimeout);\r\n this.removeRowErrorsTimeout = window.setTimeout(\r\n () =>\r\n {\r\n errorContainers.forEach((errorContainer: HTMLDivElement) =>\r\n {\r\n const centerColumns =\r\n this.gridApi['gridPanel'].eBodyViewport;\r\n const pinnedTop = this.gridApi['gridPanel'].eTop;\r\n\r\n try\r\n {\r\n centerColumns.removeChild(errorContainer);\r\n pinnedTop.removeChild(errorContainer);\r\n }\r\n catch\r\n {\r\n // If the element does not exist anymore ignore it.\r\n }\r\n });\r\n });\r\n }\r\n\r\n this.rowErrors.clear();\r\n }\r\n\r\n private restoreLostFocus(): void\r\n {\r\n const cell = this.gridApi.getFocusedCell();\r\n if (cell)\r\n {\r\n this.gridApi.setFocusedCell(\r\n cell.rowIndex, cell.column, cell.rowPinned);\r\n }\r\n }\r\n\r\n private scrollToRow(rowKey: string): void\r\n {\r\n if (this.props.fullWidthChild)\r\n {\r\n this.scrollToRowVerticalLayout(rowKey);\r\n }\r\n else\r\n {\r\n this.scrollToRowHorizontalLayout(rowKey);\r\n }\r\n }\r\n\r\n private scrollToRowHorizontalLayout(rowKey: string): void\r\n {\r\n let rowNode: RowNode | null = null;\r\n const pinnedRowsCount: number = this.gridApi.getPinnedTopRowCount();\r\n let rowIndex = -1;\r\n for (let i = 0; i < pinnedRowsCount; i++)\r\n {\r\n rowNode = this.gridApi.getPinnedTopRow(i);\r\n if ((rowNode.data as PaneRow).rowKey === rowKey)\r\n {\r\n rowIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (rowIndex < 0 || !rowNode)\r\n {\r\n throw new Error(`Row ${rowKey} not found`);\r\n }\r\n\r\n const newRowContainer: Element = this.gridContainerRef!.querySelector(\r\n '.ag-floating-top-container')!;\r\n\r\n const containerOffset: number =\r\n newRowContainer.getBoundingClientRect().top;\r\n const rowBottomOffset: number =\r\n containerOffset + rowNode.rowHeight * (rowIndex + 1);\r\n const rowTopOffset: number =\r\n containerOffset + rowNode.rowHeight * rowIndex;\r\n\r\n if (rowBottomOffset + 10 > window.innerHeight)\r\n {\r\n window.scrollTo(\r\n 0,\r\n window.scrollY + rowBottomOffset + 10 - window.innerHeight);\r\n }\r\n else if (rowTopOffset < 10)\r\n {\r\n window.scrollTo(0, window.scrollY + rowTopOffset - 10);\r\n }\r\n }\r\n\r\n private scrollToRowVerticalLayout(rowKey: string): void\r\n {\r\n const newRowContainer: Element = this.gridContainerRef!.querySelector(\r\n '.ag-full-width-container')!;\r\n const rowNode: RowNode = this.gridApi.getRowNode(rowKey);\r\n\r\n const containerOffset: number =\r\n newRowContainer.getBoundingClientRect().top;\r\n const rowTopOffset: number =\r\n containerOffset + rowNode.rowHeight * rowNode.rowIndex;\r\n\r\n window.scrollTo(0, window.scrollY + rowTopOffset - 20);\r\n }\r\n\r\n private scrollToTop(): void\r\n {\r\n if (this.props.disableScrollOnPageChange)\r\n {\r\n return;\r\n }\r\n\r\n const tableOffset: number = document.getElementById(\r\n this.props.tableKey)!.getBoundingClientRect().top;\r\n\r\n if (tableOffset < 0)\r\n {\r\n window.scrollBy(0, -(Math.max((-1 * tableOffset / 10), 5)));\r\n requestAnimationFrame(() => this.scrollToTop());\r\n }\r\n }\r\n\r\n private setAllSelected(selected: boolean, userInitiated: boolean)\r\n {\r\n if (this.props.rowSelection === 'single')\r\n {\r\n throw 'Cannot select more than one row when rowSelection is single';\r\n }\r\n\r\n // Use built-in row selection to update the row style. For pinned rows\r\n // force a full redraw to trigger the classRules.\r\n if (selected)\r\n {\r\n this.gridApi.forEachNodeAfterFilter(\r\n node => this.selectedRows.add(node.data['rowKey']));\r\n this.gridApi.selectAllFiltered();\r\n }\r\n else\r\n {\r\n this.gridApi.forEachNodeAfterFilter(\r\n node => this.selectedRows.delete(node.data['rowKey']));\r\n this.gridApi.deselectAllFiltered();\r\n }\r\n\r\n const pinnedRows = [];\r\n for (let i = 0; i < this.gridApi.getPinnedTopRowCount(); i++)\r\n {\r\n const row = this.gridApi.getPinnedTopRow(i);\r\n if (selected)\r\n {\r\n this.selectedRows.add(row.data['rowKey']);\r\n }\r\n else\r\n {\r\n this.selectedRows.delete(row.data['rowKey']);\r\n }\r\n pinnedRows.push(row);\r\n\r\n if (userInitiated)\r\n {\r\n if (selected && this.props.onRowSelected)\r\n {\r\n this.props.onRowSelected(row.data['rowKey']);\r\n }\r\n else if (!selected && this.props.onRowUnselected)\r\n {\r\n this.props.onRowUnselected(row.data['rowKey']);\r\n }\r\n }\r\n }\r\n // Force a redraw to trigger the classRules\r\n this.gridApi.redrawRows({ rowNodes: pinnedRows });\r\n this.refreshCellRenderer('_checkboxSelection');\r\n this.gridApi.refreshHeader();\r\n this.gridApi.dispatchEvent({ type: 'selectionChanged' });\r\n }\r\n\r\n private setColumns(): boolean\r\n {\r\n if (!this.columnApi || !this.props.columns)\r\n {\r\n return false;\r\n }\r\n\r\n const flexColumns: string[] = [];\r\n let columnsChanged = false;\r\n\r\n for (const column of this.props.columns)\r\n {\r\n const agColumn: Column = this.columnApi.getColumn(column.colId);\r\n const wasVisible: boolean = agColumn.isVisible();\r\n const isVisible: boolean =\r\n this.props.isColumnVisible(column.colId!, this.props.width);\r\n\r\n if (wasVisible !== isVisible)\r\n {\r\n this.columnApi.setColumnVisible(column.colId!, isVisible);\r\n columnsChanged = true;\r\n }\r\n\r\n if (!column.width && isVisible && !wasVisible)\r\n {\r\n this.columnApi.autoSizeColumn(column.colId!);\r\n\r\n // Remove extra space to the right of the header that\r\n // Ag-grid leaves for tools which we don't use\r\n const minWidth = agColumn.getMinWidth();\r\n let width = agColumn.getActualWidth();\r\n if (width > minWidth)\r\n {\r\n width = Math.max(width * 0.83, minWidth);\r\n agColumn.setActualWidth(width);\r\n }\r\n }\r\n\r\n if (isVisible && this.props.isColumnFlex(column.colId!))\r\n {\r\n flexColumns.push(column.colId!);\r\n }\r\n }\r\n\r\n if (columnsChanged)\r\n {\r\n // Column is initially hidden and displayed here so that the first\r\n // load of the grid is cleaner.\r\n this.columnApi.setColumnVisible('_checkboxSelection', true);\r\n this.columnApi.setColumnVisible('_rowEdit', true);\r\n\r\n this.columnApi.setColumnVisible('_filler', !flexColumns.length);\r\n }\r\n\r\n this.columnApi.sizeColumnsToFit(this.gridWidth);\r\n\r\n if (flexColumns.length)\r\n {\r\n this.gridApi.refreshCells({ columns: flexColumns, force: true });\r\n }\r\n\r\n return columnsChanged;\r\n }\r\n\r\n private setRowsSelected(\r\n rows: RowNode[], selected: boolean, userInitiated: boolean)\r\n {\r\n if (this.props.rowSelection === 'single')\r\n {\r\n if (rows.length > 1)\r\n {\r\n throw new Error('Cannot select more than one row when '\r\n + 'rowSelection is single');\r\n }\r\n\r\n if (selected && this.selectedRows.size > 0)\r\n {\r\n const rowId: string = this.selectedRows.values().next().value;\r\n if (userInitiated && this.props.onRowUnselected)\r\n {\r\n this.props.onRowUnselected(rowId);\r\n }\r\n\r\n const row = this.gridApi.getRowNode(rowId);\r\n if (row)\r\n {\r\n this.refreshCellRenderer('_checkboxSelection', [row]);\r\n }\r\n this.selectedRows.clear();\r\n }\r\n }\r\n\r\n const pinnedRows: RowNode[] = [];\r\n for (const row of rows)\r\n {\r\n const rowKey = row.data.rowKey;\r\n if (selected)\r\n {\r\n this.selectedRows.add(rowKey);\r\n }\r\n else\r\n {\r\n this.selectedRows.delete(rowKey);\r\n }\r\n // Use built-in row selection to update the row style. For pinned rows\r\n // force a full redraw to trigger the classRules.\r\n if (row.isRowPinned())\r\n {\r\n pinnedRows.push(row);\r\n }\r\n else\r\n {\r\n row.setSelected(selected);\r\n }\r\n\r\n if (userInitiated)\r\n {\r\n if (selected && this.props.onRowSelected)\r\n {\r\n this.props.onRowSelected(rowKey);\r\n }\r\n else if (!selected && this.props.onRowUnselected)\r\n {\r\n this.props.onRowUnselected(rowKey);\r\n }\r\n }\r\n }\r\n this.gridApi.redrawRows({ rowNodes: pinnedRows });\r\n this.refreshCellRenderer('_checkboxSelection', rows);\r\n this.gridApi.refreshHeader();\r\n this.gridApi.dispatchEvent({ type: 'selectionChanged' });\r\n }\r\n\r\n private setStopEditingWhenGridLosesFocus(stopEditing: boolean): void\r\n {\r\n this.stopEditingWhenGridLosesFocus = stopEditing;\r\n }\r\n\r\n private updateClasses()\r\n {\r\n if (!this.gridApi)\r\n {\r\n return;\r\n }\r\n\r\n const body: Element = this.gridApi['gridPanel'].eBodyViewport;\r\n const pinnedTop: Element = this.gridApi['gridPanel'].eTop;\r\n\r\n if (body)\r\n {\r\n if (pinnedTop)\r\n {\r\n if (this.gridApi.getPinnedTopRowCount())\r\n {\r\n pinnedTop.classList.add('cx-floating-top');\r\n\r\n if (this.props.isDocumentGrid)\r\n {\r\n pinnedTop.classList.add('cx-floating-top-documentgrid');\r\n }\r\n }\r\n else\r\n {\r\n pinnedTop.classList.remove('cx-floating-top');\r\n\r\n if (this.props.isDocumentGrid)\r\n {\r\n pinnedTop.classList.remove('cx-floating-top-documentgrid');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private updateLayout(height: number, width: number)\r\n {\r\n this.gridWidth = width;\r\n\r\n if (this.props.columns.length)\r\n {\r\n const columnsChanged: boolean = this.setColumns();\r\n\r\n if (columnsChanged)\r\n {\r\n this.gridApi.refreshHeader();\r\n this.gridApi.refreshCells();\r\n this.updateRowErrors();\r\n\r\n // Must be deferred to calculate table height after the columns\r\n // are adjusted.\r\n window.clearTimeout(this.updateLayoutTimeout);\r\n this.updateLayoutTimeout = window.setTimeout(\r\n () =>\r\n {\r\n this.gridApi.doLayout();\r\n this.rowErrors.forEach((rowError: HTMLDivElement) =>\r\n {\r\n this.positionRowError(rowError);\r\n });\r\n },\r\n 200);\r\n }\r\n }\r\n\r\n this.updateRowHeight();\r\n }\r\n\r\n private updateNoData(count: number)\r\n {\r\n const container: HTMLDivElement = !!this.props.fullWidthChild\r\n ? this.gridApi['gridPanel'].eFullWidthContainer\r\n : this.gridApi['gridPanel'].eBodyViewport;\r\n\r\n if (!!count)\r\n {\r\n if (this.noData)\r\n {\r\n container.removeChild(this.noData);\r\n this.noData = null;\r\n }\r\n }\r\n else\r\n {\r\n if (!this.noData)\r\n {\r\n const depth: number =\r\n this.props.propagated.parentTable.cardDepth;\r\n\r\n this.noData = document.createElement('div');\r\n this.noData.className = !!this.props.fullWidthChild\r\n ? depth % 2 === 0\r\n ? 'cx-nodata-fullwidth' : 'cx-nodata-fullwidthtab'\r\n : 'cx-nodata';\r\n this.noData.innerText =\r\n Sys.getTranslation('0 Results', 'DataTable');\r\n container.appendChild(this.noData);\r\n }\r\n }\r\n }\r\n\r\n private updateRowErrors()\r\n {\r\n if (this.gridApi.getDisplayedRowCount() === 0\r\n && this.gridApi.getPinnedTopRowCount() === 0)\r\n {\r\n return;\r\n }\r\n\r\n const rowErrors: Map = new Map();\r\n\r\n Sys.businessErrors.forEach((businessError: BusinessError) =>\r\n {\r\n businessError.widgets.filter(\r\n widget => widget.dataId === this.props.contentDataId).\r\n forEach((widget) =>\r\n {\r\n if (!this.props.isColumnVisible(\r\n widget.widgetName, this.props.width))\r\n {\r\n const rowKey: string = widget.rowKey;\r\n\r\n if (rowErrors.has(rowKey))\r\n {\r\n rowErrors.get(rowKey)!.push(businessError.message);\r\n }\r\n else\r\n {\r\n rowErrors.set(rowKey, [businessError.message]);\r\n }\r\n }\r\n });\r\n\r\n businessError.rows.filter(\r\n row => row.dataId === this.props.contentDataId).\r\n forEach((row) =>\r\n {\r\n const rowKey: string = row.rowKey;\r\n\r\n if (rowErrors.has(rowKey))\r\n {\r\n rowErrors.get(rowKey)!.push(businessError.message);\r\n }\r\n else\r\n {\r\n rowErrors.set(rowKey, [businessError.message]);\r\n }\r\n });\r\n });\r\n\r\n const errorsSerialized = JSON.stringify(Array.from(rowErrors.entries()));\r\n\r\n if (this.lastRowErrors !== errorsSerialized)\r\n {\r\n this.lastRowErrors = errorsSerialized;\r\n this.removeRowErrors();\r\n\r\n rowErrors.forEach((messages, rowKey) =>\r\n {\r\n let rowNode = this.gridApi.getRowNode(rowKey);\r\n\r\n if (!rowNode)\r\n {\r\n for (let index = 0;\r\n index < this.gridApi.getPinnedTopRowCount();\r\n index++)\r\n {\r\n const pinnedRow: RowNode =\r\n this.gridApi.getPinnedTopRow(index);\r\n\r\n if (pinnedRow.data.rowKey === rowKey)\r\n {\r\n rowNode = pinnedRow;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (rowNode)\r\n {\r\n this.addRowError(rowNode, messages);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private updateRowHeight()\r\n {\r\n if (!this.gridApi || !this.props.fullWidthChild)\r\n {\r\n return;\r\n }\r\n\r\n if (this.agProps.pinnedTopRowData)\r\n {\r\n // Required to force the pinned row height to be updated.\r\n this.gridApi.setPinnedTopRowData(this.agProps.pinnedTopRowData!);\r\n }\r\n\r\n this.gridApi.forEachNode((node: RowNode) =>\r\n {\r\n if (node.rowIndex >= this.gridApi.getFirstDisplayedRow() &&\r\n node.rowIndex <= this.gridApi.getLastDisplayedRow())\r\n {\r\n const element: HTMLElement | null =\r\n document.getElementById(\r\n `${this.props.contentDataId}.${this.props.name}`\r\n + `.${node.data.getPrimaryKey()}`);\r\n let height = this.minRowHeight;\r\n\r\n if (element && element.clientHeight)\r\n {\r\n height = element.clientHeight + 24;\r\n\r\n this.minRowHeight =\r\n Math.min(this.minRowHeight || height, height);\r\n }\r\n\r\n node.setRowHeight(height);\r\n }\r\n else\r\n {\r\n node.setRowHeight(this.minRowHeight);\r\n }\r\n });\r\n\r\n this.gridApi.onRowHeightChanged();\r\n }\r\n\r\n private updateSelection()\r\n {\r\n if (!this.gridApi || !this.props.rowSelection)\r\n {\r\n return;\r\n }\r\n\r\n const count = this.getSelectedRows().length;\r\n this.setState({ selectionToolbarVisible: count > 0 });\r\n }\r\n\r\n private uploadProgress(\r\n file: File, status: ProgressStatus, event?: ProgressEvent)\r\n {\r\n let progress: HTMLDivElement | undefined = undefined;\r\n if (this.progressBars.has(file))\r\n {\r\n progress =\r\n this.progressBars.get(file)!.firstChild as HTMLDivElement;\r\n }\r\n\r\n switch (status)\r\n {\r\n case 'Finalized':\r\n if (!progress)\r\n {\r\n return;\r\n }\r\n\r\n const progressBar = this.progressBars.get(file)!;\r\n const complete = progressBar.querySelector(\r\n '.cx-progress-complete')! as HTMLDivElement;\r\n complete.style.opacity = '1';\r\n break;\r\n\r\n case 'Ongoing':\r\n if (!progress || !event)\r\n {\r\n return;\r\n }\r\n\r\n if (event.loaded / event.total >= 1)\r\n {\r\n progress.classList.add('cx-progress-slow');\r\n progress.style.width = '98%';\r\n\r\n return;\r\n }\r\n\r\n // Only show 90% complete until the upload has finished\r\n const pct = Math.round((event.loaded / event.total) * 90);\r\n progress.style.width = `${pct}%`;\r\n break;\r\n\r\n case 'Started':\r\n // Adjusts the position of any existing progress bars.\r\n this.positionAllProgressBars();\r\n this.addProgressBar(file);\r\n break;\r\n\r\n case 'Uploaded':\r\n if (!progress)\r\n {\r\n return;\r\n }\r\n\r\n progress.classList.remove('cx-progress-slow');\r\n progress.style.width = '100%';\r\n break;\r\n\r\n default:\r\n }\r\n }\r\n\r\n public componentDidUpdate()\r\n {\r\n // Must give the grid a chance to render content.\r\n window.clearTimeout(this.componentDidUpdateTimeout);\r\n this.componentDidUpdateTimeout = window.setTimeout(\r\n () =>\r\n {\r\n this.updateRowErrors();\r\n this.rowErrors.forEach((rowError: HTMLDivElement) =>\r\n {\r\n this.positionRowError(rowError);\r\n });\r\n },\r\n 100);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n window.clearTimeout(this.columnResizedTimeout);\r\n window.clearTimeout(this.componentDidUpdateTimeout);\r\n window.clearTimeout(this.gridSizeChangedTimeout);\r\n window.clearTimeout(this.populateDataTimeout);\r\n window.clearTimeout(this.populateDataWaitRenderTimeout);\r\n window.clearTimeout(this.removeRowErrorsTimeout);\r\n window.clearTimeout(this.updateLayoutTimeout);\r\n window.clearTimeout(this.updateRowHeightTimeout);\r\n\r\n this.props.setPopulate(null);\r\n if (this.props.setRestoreLostFocus)\r\n {\r\n this.props.setRestoreLostFocus(null);\r\n }\r\n if (this.props.setScrollToRow)\r\n {\r\n this.props.setScrollToRow(null);\r\n }\r\n\r\n if (this.gridApi)\r\n {\r\n // Future 7.4.1: Log a bug with ag-Grid\r\n // Force removal of all custom column renderers\r\n this.gridApi.setColumnDefs([]);\r\n }\r\n\r\n if (this.uploadFilesDisposer)\r\n {\r\n this.uploadFilesDisposer();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const errorCount: number = this.getErrorCount();\r\n const tableErrors: React.ReactNode = this.getTableErrors();\r\n const hideTable = this.props.hideEmptyDocument && this.state.isEmpty;\r\n const isFocusable = !this.state.isEmpty && !this.state.isFocused;\r\n\r\n return (\r\n \r\n {!!errorCount || tableErrors ? (\r\n \r\n \r\n {tableErrors}\r\n {!!errorCount ? Api.getErrorMessage(\r\n // eslint-disable-next-line max-len\r\n `${errorCount} ${errorCount === 1 ? Sys.getTranslation('error exists within the table', 'Data Table') : Sys.getTranslation('errors exist within the table', 'Data Table')}`)\r\n : null}\r\n \r\n \r\n ) : null}\r\n\r\n {this.headerToolbar ? (\r\n \r\n \r\n
\r\n {this.headerToolbar}\r\n
\r\n \r\n \r\n ) : null}\r\n\r\n {this.selectToolbar ? (\r\n \r\n \r\n
\r\n {this.selectToolbar}\r\n
\r\n \r\n \r\n ) : null}\r\n\r\n {this.state.isGridReady ? (\r\n
\r\n {this.props.dropAreaChild}\r\n
) : null}\r\n\r\n
\r\n this.gridContainerRef = r}\r\n >\r\n \r\n \r\n
\r\n {this.summaryToolbar ? (\r\n \r\n {this.summaryToolbar}\r\n
\r\n ) : null}\r\n
\r\n {this.footerToolbar ? this.footerToolbar : null}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(withWidth()(Table)));\r\n","import { autorun, IReactionDisposer } from 'mobx';\r\nimport * as React from 'react';\r\nimport AppServer from '../../core/AppServer';\r\nimport RequestPromise from '../../core/RequestPromise';\r\nimport Sys from '../../core/Sys';\r\nimport TrackableCollection from '../../core/TrackableCollection';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport BaseService from '../../services/BaseService';\r\nimport PaneDataStore, { PaneData, PaneDataByDataId }\r\n from '../../stores/PaneDataStore';\r\nimport ProcessingMask from '../ProcessingMask';\r\n\r\nexport interface GetDataResponse\r\n{\r\n paneDataByDataId: PaneDataByDataId;\r\n paneStates: string[];\r\n}\r\n\r\ninterface Props\r\n{\r\n contentDataId: string;\r\n dataId: string;\r\n getData: () => RequestPromise;\r\n populateData: () => void;\r\n}\r\n\r\ninterface State\r\n{\r\n isLoadingData?: boolean;\r\n isPopulatingData?: boolean;\r\n}\r\n\r\nexport class AsyncData extends\r\n React.PureComponent\r\n{\r\n private dataMonitorDisposer: IReactionDisposer;\r\n private initializeDataTimeout: number;\r\n private lastPopulatedContentPaneDate: Date | undefined = undefined;\r\n private retrieveDataPromise: RequestPromise;\r\n\r\n public static async processResponse(\r\n promise: RequestPromise\r\n ): Promise\r\n {\r\n try\r\n {\r\n const response: GetDataResponse = await promise;\r\n\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n for (const paneState of response.paneStates)\r\n {\r\n AppServer.addPane(paneState);\r\n }\r\n\r\n Sys.setBusinessErrors();\r\n\r\n return false;\r\n }\r\n catch (request)\r\n {\r\n if (request?.config?.aborted)\r\n {\r\n return true;\r\n }\r\n\r\n const message: string | null =\r\n BaseService.getRequestExceptionMessage(request);\r\n if (message)\r\n {\r\n Sys.showErrors([message]);\r\n }\r\n\r\n throw request;\r\n }\r\n }\r\n\r\n public constructor(props: Props)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n isLoadingData: false,\r\n isPopulatingData: true,\r\n };\r\n }\r\n\r\n private dataMonitor = () =>\r\n {\r\n const contentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.contentDataId)!;\r\n const parentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.dataId)!;\r\n\r\n if (!contentPane.lastRetrieved || !parentPane.lastRetrieved)\r\n {\r\n this.setState({ isPopulatingData: false });\r\n return;\r\n }\r\n\r\n if (contentPane.lastRetrieved < parentPane.lastRetrieved)\r\n {\r\n if (contentPane.lastLoadingToMatchDate! < parentPane.lastRetrieved)\r\n {\r\n this.retrieveData(parentPane.lastRetrieved);\r\n }\r\n else\r\n {\r\n this.setState({ isPopulatingData: true });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (!this.lastPopulatedContentPaneDate\r\n || this.lastPopulatedContentPaneDate < contentPane.lastRetrieved)\r\n {\r\n this.populateData();\r\n }\r\n };\r\n\r\n private initializeData()\r\n {\r\n let contentPane: PaneData | undefined =\r\n PaneDataStore.instance.getPane(this.props.contentDataId);\r\n const parentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.dataId)!;\r\n\r\n if (!contentPane)\r\n {\r\n if (!TrackableModel.models.has(this.props.contentDataId))\r\n {\r\n TrackableModel.register(new TrackableCollection(\r\n 'PaneRow', this.props.contentDataId));\r\n }\r\n contentPane = PaneDataStore.instance.addPane(\r\n this.props.contentDataId, parentPane.lastRetrieved!);\r\n\r\n this.retrieveData(parentPane.lastRetrieved!);\r\n }\r\n else if (contentPane.lastRetrieved && parentPane.lastRetrieved\r\n && contentPane.lastRetrieved >= parentPane.lastRetrieved)\r\n {\r\n this.populateData();\r\n }\r\n\r\n this.dataMonitorDisposer = autorun(this.dataMonitor);\r\n }\r\n\r\n private populateData(): void\r\n {\r\n const contentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.contentDataId)!;\r\n\r\n this.lastPopulatedContentPaneDate = contentPane.lastRetrieved;\r\n\r\n this.setState({ isPopulatingData: false });\r\n\r\n this.props.populateData();\r\n }\r\n\r\n private async retrieveData(toMatchDate: Date): Promise\r\n {\r\n if (this.retrieveDataPromise)\r\n {\r\n this.retrieveDataPromise.abort();\r\n }\r\n\r\n PaneDataStore.instance.setLoadingToMatchDate(\r\n this.props.contentDataId, toMatchDate);\r\n\r\n this.setState({ isLoadingData: true });\r\n\r\n this.retrieveDataPromise = this.props.getData();\r\n\r\n try\r\n {\r\n const wasAborted: boolean =\r\n await AsyncData.processResponse(this.retrieveDataPromise);\r\n\r\n if (wasAborted)\r\n {\r\n const contentPane: PaneData | undefined =\r\n PaneDataStore.instance.getPane(this.props.contentDataId);\r\n if (contentPane)\r\n {\r\n contentPane.lastRetrieved = new Date('0001-01-01T00:00:00Z');\r\n contentPane.lastLoadingToMatchDate =\r\n contentPane.lastRetrieved;\r\n }\r\n }\r\n else\r\n {\r\n this.setState({ isLoadingData: false });\r\n }\r\n }\r\n catch\r\n {\r\n this.setState({ isLoadingData: false, isPopulatingData: false });\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n // Separate the initial page load from the data table rows load by\r\n // waiting for the grid to render first\r\n this.initializeDataTimeout = setTimeout(() => this.initializeData());\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n window.clearTimeout(this.initializeDataTimeout);\r\n\r\n if (this.dataMonitorDisposer)\r\n {\r\n this.dataMonitorDisposer();\r\n }\r\n\r\n if (this.retrieveDataPromise)\r\n {\r\n this.retrieveDataPromise.abort();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default AsyncData;\r\n","import * as muiBadge from '@material-ui/core/Badge';\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport GridColumn from '../mustangui/Columns/GridColumn';\r\nimport Button from './Button';\r\nimport ErrorTooltip from './ErrorTooltip';\r\n\r\n// This props does not extend badge properties because badgeContent is\r\n// required and we don't want to have to pass a value for this type of badge.\r\ninterface Props\r\n{\r\n isShort?: boolean;\r\n message?: React.ReactNode;\r\n onClose?: () => void;\r\n onOpen?: () => void;\r\n open?: boolean;\r\n style?: React.CSSProperties;\r\n suppressEdit?: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n open: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n right: 16,\r\n top: 'calc(100% - 16px)',\r\n },\r\n button:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('danger'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('danger'),\r\n color: theme.palette.getContrastText(Api.getSystemColor('danger')),\r\n },\r\n error:\r\n {\r\n borderColor: Api.getSystemColor('danger'),\r\n },\r\n normal:\r\n {\r\n borderColor: 'transparent',\r\n },\r\n ripple:\r\n {\r\n '& > span > span':\r\n {\r\n backgroundColor: Api.getSystemColor('danger'),\r\n },\r\n },\r\n root:\r\n {\r\n alignItems: 'center',\r\n borderStyle: 'solid',\r\n borderWidth: 1,\r\n height: 'calc(100% - 2px)',\r\n marginLeft: -2,\r\n marginTop: 1,\r\n width: 'calc(100% + 2px)',\r\n zIndex: 1,\r\n },\r\n short:\r\n {\r\n borderColor: 'transparent',\r\n height: 'calc(100% - 3px)',\r\n marginTop: 2,\r\n },\r\n shortError:\r\n {\r\n borderColor: Api.getSystemColor('danger'),\r\n height: 'calc(100% - 3px)',\r\n marginTop: 2,\r\n },\r\n });\r\n\r\nexport class ErrorBadge extends\r\n React.PureComponent, State>\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private buttonRef: any;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { open: false };\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const message = _props.message;\r\n const suppressEdit = _props.suppressEdit;\r\n const children = _props.children;\r\n let content: React.ReactNode =
;\r\n\r\n delete _props.children;\r\n delete _props.classes;\r\n delete _props.message;\r\n delete _props.onClose;\r\n delete _props.onOpen;\r\n delete _props.open;\r\n delete _props.suppressEdit;\r\n\r\n if (message)\r\n {\r\n content =\r\n this.setState({ open: false })}\r\n >\r\n \r\n this.buttonRef = r}\r\n classes={{ root: this.props.classes.button }}\r\n icon=\"fas fa-exclamation\"\r\n onClick={() =>\r\n {\r\n // Fix for Safari not opening tooltip\r\n this.buttonRef.focus();\r\n this.setState({ open: true });\r\n }}\r\n onMouseDown={suppressEdit\r\n ? () => { GridColumn.suppressEdit = true; }\r\n : undefined}\r\n TouchRippleProps={{\r\n className: this.props.classes.ripple,\r\n }}\r\n />\r\n \r\n ;\r\n }\r\n\r\n let className = `${this.props.classes.root} `;\r\n if (_props.isShort)\r\n {\r\n className += message\r\n ? this.props.classes.shortError : this.props.classes.short;\r\n }\r\n else\r\n {\r\n className += message\r\n ? this.props.classes.error : this.props.classes.normal;\r\n }\r\n\r\n delete _props.isShort;\r\n\r\n return (\r\n \r\n {children}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ErrorBadge);\r\n","import { CellFocusedEvent, ICellRendererComp, ICellRendererParams, RowNode }\r\n from 'ag-grid-community';\r\nimport { TableChildProps } from '../Table';\r\n\r\ninterface CellRenderer extends ICellRendererComp\r\n{\r\n getFrameworkComponentInstance: () => { props: FocusCellRendererParams };\r\n}\r\n\r\nexport interface FocusCellRendererParams extends ICellRendererParams\r\n{\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface FocusSubscriber\r\n{\r\n columnId: string;\r\n onBlur: () => void;\r\n onFocus: () => void;\r\n rowIndex: number;\r\n rowPinned: string | null;\r\n}\r\n\r\nexport class CellFocusUtil\r\n{\r\n private static focusSubscribers:\r\n { [tableKey: string]: FocusSubscriber[] } = {};\r\n\r\n private static lastFocusedSubscriber: FocusSubscriber | null = null;\r\n\r\n private static onCellEditingStarted()\r\n {\r\n if (CellFocusUtil.lastFocusedSubscriber)\r\n {\r\n CellFocusUtil.lastFocusedSubscriber.onBlur();\r\n }\r\n }\r\n\r\n private static onCellFocused(event: CellFocusedEvent)\r\n {\r\n if (event.column === null || event.rowIndex === null)\r\n {\r\n return;\r\n }\r\n\r\n if (CellFocusUtil.lastFocusedSubscriber)\r\n {\r\n CellFocusUtil.lastFocusedSubscriber.onBlur();\r\n }\r\n\r\n // Exclude mouse focus events\r\n if (!event.forceBrowserFocus)\r\n {\r\n return;\r\n }\r\n\r\n let row: RowNode;\r\n if (event.rowPinned)\r\n {\r\n row = event.api.getPinnedTopRow(event.rowIndex);\r\n }\r\n else\r\n {\r\n row = event.api.getDisplayedRowAtIndex(event.rowIndex);\r\n }\r\n if (!row)\r\n {\r\n return;\r\n }\r\n\r\n const instances = event.api.getCellRendererInstances(\r\n { columns: [event.column], rowNodes: [row] });\r\n\r\n const renderer = instances[0] as CellRenderer;\r\n if (!renderer)\r\n {\r\n return;\r\n }\r\n\r\n const rendererProps = renderer.getFrameworkComponentInstance().props;\r\n const parentTableKey =\r\n rendererProps.propagated.parentTable.configProps.tableKey;\r\n\r\n const subscribers = CellFocusUtil.focusSubscribers[parentTableKey];\r\n for (const subscriber of subscribers)\r\n {\r\n if (subscriber.columnId === event.column.getColId()\r\n && subscriber.rowIndex === event.rowIndex\r\n && subscriber.rowPinned === event.rowPinned)\r\n {\r\n subscriber.onFocus();\r\n CellFocusUtil.lastFocusedSubscriber = subscriber;\r\n }\r\n }\r\n }\r\n\r\n public static subscribeToCellKeyboardFocusedEvent(\r\n params: FocusCellRendererParams,\r\n onFocus: () => void,\r\n onBlur: () => void)\r\n {\r\n const parentTableKey =\r\n params.propagated.parentTable.configProps.tableKey;\r\n\r\n if (!(parentTableKey in CellFocusUtil.focusSubscribers))\r\n {\r\n CellFocusUtil.focusSubscribers[parentTableKey] = [];\r\n\r\n params.api.addEventListener(\r\n 'cellFocused', CellFocusUtil.onCellFocused);\r\n params.api.addEventListener(\r\n 'cellEditingStarted', CellFocusUtil.onCellEditingStarted);\r\n }\r\n\r\n CellFocusUtil.focusSubscribers[parentTableKey].push(\r\n {\r\n columnId: params.column.getColId(),\r\n onBlur,\r\n onFocus,\r\n rowIndex: params.rowIndex,\r\n rowPinned: params.data.isNew ? 'top' : null,\r\n });\r\n }\r\n\r\n public static unsubscribeToCellKeyboardFocusedEvent(\r\n params: FocusCellRendererParams,\r\n onFocus: () => void,\r\n onBlur: () => void)\r\n {\r\n const parentTableKey =\r\n params.propagated.parentTable.configProps.tableKey;\r\n\r\n CellFocusUtil.focusSubscribers[parentTableKey] =\r\n CellFocusUtil.focusSubscribers[parentTableKey].filter(\r\n s => s.onBlur !== onBlur);\r\n\r\n if (CellFocusUtil.lastFocusedSubscriber\r\n && CellFocusUtil.lastFocusedSubscriber.onBlur === onBlur)\r\n {\r\n CellFocusUtil.lastFocusedSubscriber = null;\r\n }\r\n\r\n if (CellFocusUtil.focusSubscribers[parentTableKey].length <= 0)\r\n {\r\n delete CellFocusUtil.focusSubscribers[parentTableKey];\r\n\r\n params.api.removeEventListener(\r\n 'cellFocused', CellFocusUtil.onCellFocused);\r\n params.api.removeEventListener(\r\n 'cellEditingStarted', CellFocusUtil.onCellEditingStarted);\r\n }\r\n }\r\n}\r\n","import * as muiCheckbox from '@material-ui/core/Checkbox';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { GetQuickFilterTextParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Icon from '../../coreui/Icon';\r\nimport Presentation from '../../coreui/Presentation';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellFocusUtil, FocusCellRendererParams }\r\n from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../../mustangui/Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isErrorBadgeOpen?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n height: '100%',\r\n justifyContent: 'center',\r\n marginLeft: -2,\r\n padding: '0 24px',\r\n },\r\n });\r\n\r\n@observer\r\nexport class CheckBoxColumn extends\r\n React.Component, State>\r\n{\r\n protected muiProps: muiCheckbox.CheckboxProps;\r\n\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n return '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n return runtimeData.filter(d => d.value).length.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isErrorBadgeOpen: false };\r\n\r\n this.muiProps =\r\n {\r\n checkedIcon: ,\r\n color: 'default',\r\n icon: ,\r\n onChange: (\r\n event: React.ChangeEvent,\r\n checked: boolean) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n Presentation.setValue(props, checked);\r\n },\r\n tabIndex: -1,\r\n };\r\n\r\n CellUtil.runOnAction(props.eGridCell, () =>\r\n {\r\n const value: boolean = Presentation.getValue(props, false);\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n Presentation.setValue(props, !value);\r\n });\r\n\r\n CellFocusUtil.subscribeToCellKeyboardFocusedEvent(\r\n props, this.onCellFocus, this.onCellBlur);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellBlur = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n private onCloseErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onOpenErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n CellFocusUtil.unsubscribeToCellKeyboardFocusedEvent(\r\n this.props, this.onCellFocus, this.onCellBlur);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public refresh(): boolean\r\n {\r\n this.forceUpdate();\r\n\r\n return true;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties = Api.getWidgetProperties(\r\n this.props, this.props.data) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(\r\n this.props.eGridCell,\r\n runtimeProperties.accessLevel <= AccessLevel.actionable);\r\n\r\n const errors: string[] = this.props.data.hasChanges(this.props.name)\r\n ? [] : [...runtimeProperties.businessErrors];\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.enterable)\r\n {\r\n this.muiProps.checked =\r\n Presentation.getValue(this.props, false);\r\n\r\n if (errors.length)\r\n {\r\n return (\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n
);\r\n }\r\n\r\n return (\r\n \r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(CheckBoxColumn);\r\n","import { GetQuickFilterTextParams } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport Icon from '../../coreui/Icon';\r\nimport { FocusCellRendererParams } from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport PaneRow, { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n iconName: string;\r\n label: string;\r\n}\r\n\r\nexport class ComponentTypeDisplayColumn extends\r\n React.PureComponent\r\n{\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const row = params.data as PaneRow;\r\n return row.getReadOnlyProperties(\r\n params.colDef.field!).label;\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.readOnly)\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties = Api.getWidgetProperties(\r\n this.props, this.props.data) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(this.props.eGridCell, true);\r\n if (runtimeProperties.accessLevel <= AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {runtimeProperties.label}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ComponentTypeDisplayColumn;\r\n","import { ButtonBase } from '@material-ui/core';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Button from './Button';\r\nimport Icon from './Icon';\r\n\r\ninterface Props\r\n{\r\n alternateText: string;\r\n disableFocusRipple?: boolean;\r\n height?: number;\r\n href: string;\r\n icon: string;\r\n linkRef?: (r: HTMLElement | null) => void;\r\n tabIndex?: number;\r\n width?: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n button:\r\n {\r\n bottom: 4,\r\n pointerEvents: 'none',\r\n position: 'absolute',\r\n right: 4,\r\n },\r\n icon:\r\n {\r\n color: theme.palette.grey[500],\r\n height: '75%',\r\n width: '75%',\r\n },\r\n ripple:\r\n {\r\n height: 'calc(100% + 30px)',\r\n margin: '-15px',\r\n width: 'calc(100% + 30px)',\r\n },\r\n root:\r\n {\r\n background: theme.palette.grey[200],\r\n display: 'flex',\r\n height: 96,\r\n outline: 'none',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n width: 96,\r\n },\r\n });\r\n\r\nexport class IconWithLink extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n return (\r\n this.props.linkRef\r\n ? this.props.linkRef(r as HTMLElement) : null\r\n }\r\n className={this.props.classes.root}\r\n focusRipple={!this.props.disableFocusRipple}\r\n href={this.props.href}\r\n style={\r\n this.props.height\r\n ? { height: this.props.height, width: this.props.width }\r\n : {}}\r\n tabIndex={this.props.tabIndex}\r\n target=\"_blank\"\r\n TouchRippleProps={{ className: this.props.classes.ripple }}\r\n >\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(IconWithLink);\r\n","import { ButtonBase } from '@material-ui/core';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Button from './Button';\r\n\r\ninterface Props\r\n{\r\n alternateText: string;\r\n disableFocusRipple?: boolean;\r\n fit: 'cover' | 'contain';\r\n height: number;\r\n href: string;\r\n imgSrc: string;\r\n linkRef?: (r: HTMLElement | null) => void;\r\n tabIndex?: number;\r\n width: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n button:\r\n {\r\n bottom: 4,\r\n pointerEvents: 'none',\r\n position: 'absolute',\r\n right: 4,\r\n },\r\n image:\r\n {\r\n height: '100%',\r\n width: '100%',\r\n },\r\n ripple:\r\n {\r\n height: 'calc(100% + 30px)',\r\n margin: '-15px',\r\n width: 'calc(100% + 30px)',\r\n },\r\n root:\r\n {\r\n display: 'inline-block',\r\n outline: 'none',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n maxWidth: '100%',\r\n },\r\n },\r\n });\r\n\r\nexport class ImageWithLink extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n return (\r\n this.props.linkRef\r\n ? this.props.linkRef(r as HTMLElement) : null\r\n }\r\n className={this.props.classes.root}\r\n focusRipple={!this.props.disableFocusRipple}\r\n href={this.props.href}\r\n style={{ height: this.props.height }}\r\n tabIndex={this.props.tabIndex}\r\n target=\"_blank\"\r\n TouchRippleProps={{ className: this.props.classes.ripple }}\r\n >\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ImageWithLink);\r\n","import * as React from 'react';\r\nimport Button from './Button';\r\nimport IconWithLink from './IconWithLink';\r\nimport ImageWithLink from './ImageWithLink';\r\n\r\ninterface Props\r\n{\r\n alternateText: string;\r\n disableFocusRipple?: boolean;\r\n downloadUrl: string;\r\n hasImage: boolean;\r\n imageHeight: number;\r\n imageWidth: number;\r\n iconName: string;\r\n imgSrc: string;\r\n inGrid?: boolean;\r\n linkRef?: (r: HTMLElement | null) => void;\r\n tabIndex?: number;\r\n thumbnailType: ThumbnailTypes;\r\n}\r\n\r\nexport type ThumbnailTypes =\r\n 'Download Link Only'\r\n | 'Large Thumbnail'\r\n | 'Medium Thumbnail';\r\n\r\nexport class Thumbnail extends\r\n React.PureComponent\r\n{\r\n private setLinkRef = (ref: HTMLLinkElement | null) =>\r\n {\r\n if (this.props.linkRef)\r\n {\r\n this.props.linkRef(ref);\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n switch (this.props.thumbnailType)\r\n {\r\n case 'Download Link Only':\r\n const additionalDownloadLinkProps = {};\r\n if (this.props.inGrid)\r\n {\r\n additionalDownloadLinkProps['customSize'] = 'tiny';\r\n }\r\n\r\n return (\r\n \r\n );\r\n\r\n case 'Large Thumbnail':\r\n if (this.props.hasImage)\r\n {\r\n return (\r\n \r\n );\r\n }\r\n\r\n if (!this.props.iconName)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n case 'Medium Thumbnail':\r\n if (this.props.hasImage)\r\n {\r\n return (\r\n \r\n );\r\n }\r\n\r\n if (!this.props.iconName)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n default:\r\n throw new Error(\r\n `Unknown thumbnail type ${this.props.thumbnailType}`);\r\n }\r\n }\r\n}\r\n\r\nexport default Thumbnail;\r\n","import Logging from '../core/Logging';\r\nimport Sys from '../core/Sys';\r\nimport BaseService, { Response } from './BaseService';\r\n\r\nexport interface DocumentUploadResponse\r\n{\r\n clientKey: string;\r\n pendingDocumentId: number;\r\n pendingThumbnailId: number;\r\n uploadErrors: string[];\r\n}\r\n\r\nexport default class DocumentService\r\n{\r\n public static getDocumentUrl(\r\n documentHandle: string | null,\r\n pendingDocumentId: number | null,\r\n documentName: string\r\n ): string\r\n {\r\n // DocumentName is only passed to make the url more human readable\r\n return 'dynamic/Document/GetDocument'\r\n + `/${documentHandle}`\r\n + `/${pendingDocumentId}`\r\n + `/${documentName}`;\r\n }\r\n\r\n public static getThumbnailUrl(\r\n documentHandle: string | null,\r\n pendingDocumentId: number | null,\r\n pendingThumbnailId: number | null,\r\n thumbnailType: string\r\n ): string\r\n {\r\n // Future 7.4.1: the defeat cache (dc) parameter is currently required\r\n // to make sure the latest thumbnail is displayed (prevent browser\r\n // from caching it). This will probably change once we implement\r\n // image caching via the logical transaction id\r\n return 'dynamic/Document/GetThumbnail'\r\n + `/${documentHandle}`\r\n + `/${pendingDocumentId}/${pendingThumbnailId}`\r\n + `/${thumbnailType}?_dc=${new Date().getTime()}`;\r\n }\r\n\r\n public static uploadFiles(\r\n dataId: string,\r\n widgetName: string,\r\n files: File[],\r\n progress?: Function,\r\n error?: Function\r\n ): Promise[]\r\n {\r\n const batch: Promise[] = [];\r\n\r\n for (const file of files)\r\n {\r\n if (file['hasError'])\r\n {\r\n continue;\r\n }\r\n\r\n const formData: FormData | null = new FormData();\r\n const request: XMLHttpRequest = new XMLHttpRequest();\r\n\r\n formData.append('file', file);\r\n request.upload.onprogress = (event: ProgressEvent) =>\r\n {\r\n if (progress)\r\n {\r\n progress(file, event);\r\n }\r\n };\r\n\r\n // Because the form data is binary the args can only be\r\n // appended to the url.\r\n const result: Promise = BaseService.request(\r\n `Document/Upload/${dataId}/${widgetName}/${file['rowKey']}`,\r\n { formData },\r\n 'POST',\r\n true,\r\n request\r\n ).then((response: Response) =>\r\n {\r\n const responseData = JSON.parse(\r\n response.responseText) as DocumentUploadResponse;\r\n const errors: string[] = responseData.uploadErrors;\r\n\r\n if (errors.length)\r\n {\r\n if (error)\r\n {\r\n error(file, errors);\r\n }\r\n\r\n Logging.log(`${file.name} upload failed ${errors}`);\r\n }\r\n else\r\n {\r\n const duration: number =\r\n response['config']['duration'];\r\n }\r\n\r\n return responseData;\r\n }).catch(() =>\r\n {\r\n const message = 'A unexpected error occured';\r\n if (error)\r\n {\r\n error(file, [Sys.getTranslation(message)]);\r\n }\r\n\r\n Logging.log(`${file.name} upload failed ${message}`);\r\n\r\n return {\r\n clientKey: file['rowKey'],\r\n pendingDocumentId: -1,\r\n pendingThumbnailId: -1,\r\n uploadErrors: [Sys.getTranslation(message)],\r\n } as DocumentUploadResponse;\r\n });\r\n\r\n batch.push(result);\r\n }\r\n\r\n return batch;\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { ICellRendererParams } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport Thumbnail, { ThumbnailTypes } from '../../coreui/Thumbnail';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport DocumentService from '../../services/DocumentService';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n dataId: string;\r\n imageHeight: number;\r\n imageWidth: number;\r\n name: string;\r\n thumbnailType: ThumbnailTypes;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n documentHandle: string | null;\r\n fileName: string;\r\n hasThumbnailImage: boolean;\r\n iconName: string;\r\n pendingDocumentId: number | null;\r\n pendingThumbnailId: number | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n height: '100%',\r\n justifyContent: 'center',\r\n marginLeft: -1,\r\n width: '100%',\r\n },\r\n });\r\n\r\nexport class DataImageDisplayColumn extends\r\n React.PureComponent>\r\n{\r\n private linkRef: HTMLElement | null;\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.readOnly\r\n && (runtimeProperties.documentHandle\r\n || runtimeProperties.pendingDocumentId))\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n CellUtil.setReadOnlyAttribute(props.eGridCell, true);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n props.eGridCell.addEventListener('focus', this.onCellFocus);\r\n }\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n if (this.linkRef)\r\n {\r\n this.linkRef.focus();\r\n }\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('focus', this.onCellFocus);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties = Api.getWidgetProperties(\r\n this.props, this.props.data) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (!runtimeProperties.documentHandle\r\n && !runtimeProperties.pendingDocumentId)\r\n {\r\n return null;\r\n }\r\n\r\n const imgSrc: string = DocumentService.getThumbnailUrl(\r\n runtimeProperties.documentHandle,\r\n runtimeProperties.pendingDocumentId,\r\n runtimeProperties.pendingThumbnailId,\r\n this.props.thumbnailType);\r\n\r\n const downloadUrl: string = DocumentService.getDocumentUrl(\r\n runtimeProperties.documentHandle,\r\n runtimeProperties.pendingDocumentId,\r\n runtimeProperties.fileName);\r\n\r\n return (\r\n
\r\n this.linkRef = r}\r\n tabIndex={-1}\r\n thumbnailType={this.props.thumbnailType}\r\n />\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DataImageDisplayColumn);\r\n","import { GetQuickFilterTextParams, ICellRendererParams }\r\n from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport * as Link from '../../coreui/Link';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n dataId: string;\r\n iconName: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n anchorText: string;\r\n objectId: number;\r\n presentationId: number;\r\n}\r\n\r\nexport class DataLinkColumn extends\r\n React.PureComponent\r\n{\r\n private linkRef: HTMLLinkElement;\r\n protected muiProps: Link.LinkProps;\r\n\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const runtimeProperties: object | null =\r\n Api.getWidgetProperties(\r\n { name: params.colDef.field! },\r\n params.data);\r\n\r\n return runtimeProperties ? runtimeProperties['text'] : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.readOnly\r\n && runtimeProperties.anchorText)\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n buttonRef: r => this.linkRef = r as HTMLLinkElement,\r\n focusRipple: false,\r\n iconName: props.iconName,\r\n tabIndex: -1,\r\n target: '_self',\r\n };\r\n\r\n CellUtil.setReadOnlyAttribute(props.eGridCell, true);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n props.eGridCell.addEventListener('focus', this.onCellFocus);\r\n }\r\n\r\n private buildUrl(runtimeProperties: RuntimeProperties): string\r\n {\r\n return `#/object/${runtimeProperties.objectId}`\r\n + `/${runtimeProperties.presentationId}`;\r\n }\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n if (this.linkRef)\r\n {\r\n this.linkRef.focus();\r\n }\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('focus', this.onCellFocus);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props, _props.data) as RuntimeProperties;\r\n let text: React.ReactNode =
;\r\n let result: React.ReactNode = null;\r\n\r\n if (runtimeProperties.anchorText)\r\n {\r\n text =\r\n \r\n {runtimeProperties.anchorText}\r\n
;\r\n }\r\n\r\n switch (runtimeProperties.accessLevel)\r\n {\r\n case AccessLevel.actionable:\r\n this.muiProps.href = this.buildUrl(runtimeProperties);\r\n this.muiProps.children = text;\r\n\r\n result = ;\r\n break;\r\n case AccessLevel.readOnly:\r\n result = text;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n if (result)\r\n {\r\n result =\r\n \r\n {result}\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default DataLinkColumn;\r\n","import * as muiDialogContent from '@material-ui/core/DialogContent';\r\nimport * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport { observer } from 'mobx-react';\r\nimport * as moment from 'moment';\r\nimport * as React from 'react';\r\nimport * as DayPicker from 'react-day-picker';\r\n// @ts-ignore\r\nimport { LocaleUtils } from 'react-day-picker/moment';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Dialog from '../coreui/Dialog';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n dateFormatError: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n label: string;\r\n name: string;\r\n}\r\n\r\ninterface State\r\n{\r\n calendarSelectedDate?: Date;\r\n calendarVisibleMonth?: Date;\r\n isDialogOpen?: boolean;\r\n isFocused?: boolean;\r\n rawValue?: string | null;\r\n showYearsView?: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n calendar:\r\n {\r\n [theme.breakpoints.down('xs')]:\r\n {\r\n padding: 16,\r\n },\r\n\r\n '& .DayPicker-Body':\r\n {\r\n display: 'table-row-group',\r\n },\r\n\r\n '& .DayPicker-Caption':\r\n {\r\n display: 'table-caption',\r\n marginBottom: '0.5rem',\r\n maxHeight: 40,\r\n padding: '0 42px',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Caption button':\r\n {\r\n justifyContent: 'flex-start',\r\n maxWidth: 215,\r\n textTransform: 'none',\r\n },\r\n '& .DayPicker-Caption button span':\r\n {\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: '0.01071em',\r\n lineHeight: '20px',\r\n whiteSpace: 'normal',\r\n },\r\n\r\n '& .DayPicker-Day':\r\n {\r\n display: 'table-cell',\r\n outline: 'none',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Day button':\r\n {\r\n borderRadius: '50%',\r\n fontWeight: 400,\r\n minWidth: '40px',\r\n padding: '0.5rem',\r\n },\r\n '& .DayPicker-Day--outside button':\r\n {\r\n color: theme.palette.grey['300'],\r\n },\r\n '& .DayPicker-Day--selected button':\r\n {\r\n background: `${theme.palette.grey['800']} !important`,\r\n color: theme.palette.getContrastText(theme.palette.grey['800']),\r\n },\r\n '& .DayPicker-Day--selected button:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .DayPicker-Day--selected:focus button':\r\n {\r\n background: theme.palette.grey['800'],\r\n },\r\n '& .DayPicker-Day--selected:focus button:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .DayPicker-Day:focus button':\r\n {\r\n background: theme.palette.grey['400'],\r\n },\r\n '& .DayPicker-Day:focus button:hover':\r\n {\r\n background: darken(theme.palette.grey['400'], 0.1),\r\n },\r\n\r\n '& .DayPicker-Month':\r\n {\r\n display: 'table',\r\n width: '100%',\r\n },\r\n\r\n '& .DayPicker-NavButton':\r\n {\r\n position: 'absolute',\r\n top: '5px',\r\n },\r\n '& .DayPicker-NavButton > button':\r\n {\r\n height: 24,\r\n padding: 0,\r\n width: 24,\r\n },\r\n '& .DayPicker-NavButton--next':\r\n {\r\n right: '0.5rem',\r\n },\r\n '& .DayPicker-NavButton--prev':\r\n {\r\n left: '0.5rem',\r\n },\r\n\r\n '& .DayPicker-Week':\r\n {\r\n display: 'table-row',\r\n },\r\n '& .DayPicker-Weekday':\r\n {\r\n color: theme.palette.grey['500'],\r\n display: 'table-cell',\r\n fontSize: 12,\r\n lineHeight: '1.42857',\r\n padding: '0.5rem',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Weekdays':\r\n {\r\n display: 'table-header-group',\r\n },\r\n '& .DayPicker-WeekdaysRow':\r\n {\r\n display: 'table-row',\r\n },\r\n\r\n '& .DayPicker-wrapper':\r\n {\r\n outline: 'none',\r\n position: 'relative',\r\n },\r\n\r\n padding: 40,\r\n },\r\n\r\n dialogContainer:\r\n {\r\n '& .CancelButton':\r\n {\r\n bottom: 16,\r\n display: 'none',\r\n position: 'absolute',\r\n right: 16,\r\n\r\n [theme.breakpoints.down('xs')]:\r\n {\r\n display: 'inline-block',\r\n },\r\n },\r\n '&:first-child':\r\n {\r\n paddingTop: 0,\r\n },\r\n\r\n height: 405,\r\n margin: '0 auto',\r\n maxWidth: '100%',\r\n padding: 0,\r\n width: 380,\r\n },\r\n\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 67px)',\r\n },\r\n\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 67px) * 1.333)',\r\n },\r\n\r\n switchYearBtn:\r\n {\r\n justifyContent: 'center !important',\r\n minWidth: 150,\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n position: 'static', // Fix for Safari not firing click event\r\n },\r\n\r\n switchYearBtnRipple:\r\n {\r\n background: 'transparent',\r\n margin: '0 auto',\r\n maxHeight: 40,\r\n maxWidth: 150,\r\n },\r\n\r\n yearSelector:\r\n {\r\n '& .YearSelector-Year':\r\n {\r\n fontSize: 16,\r\n fontWeight: 400,\r\n padding: '12, 40',\r\n width: '100%',\r\n },\r\n '& .YearSelector-Year span':\r\n {\r\n justifyContent: 'flex-start',\r\n },\r\n '& .YearSelector-Year--selected':\r\n {\r\n background: theme.palette.grey['800'],\r\n color: theme.palette.getContrastText(theme.palette.grey['800']),\r\n },\r\n '& .YearSelector-Year--selected:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .YearSelector-Year:hover':\r\n {\r\n background: darken(theme.palette.common.white, 0.1),\r\n },\r\n padding: '8px 0',\r\n },\r\n });\r\n\r\n@observer\r\nexport class DateEdit extends\r\n React.Component, State>\r\n{\r\n private dialogContentRef?: HTMLDivElement | null;\r\n private lastValidDate: Date | null = null;\r\n private readonly localeName = 'current';\r\n private muiProps: muiTextField.TextFieldProps;\r\n\r\n public static formatValue(\r\n value: Date | null | string,\r\n userFormatted: boolean)\r\n {\r\n if (value && typeof value !== 'string')\r\n {\r\n return moment(value).format(DateEdit.getDateFormat(userFormatted));\r\n }\r\n\r\n return value;\r\n }\r\n\r\n public static getDateFormat(userFormatted: boolean)\r\n {\r\n let format = '';\r\n\r\n if (userFormatted)\r\n {\r\n format = Sys.settings.dateFormat;\r\n }\r\n else\r\n {\r\n format = 'yyyy-mm-dd';\r\n }\r\n\r\n // Set case of date formatter to match moment format\r\n // https://momentjs.com/docs/#/parsing/string-format/\r\n format = format.replace(/d/gi, 'D');\r\n format = format.replace(/m/gi, 'M');\r\n format = format.replace(/y/gi, 'Y');\r\n\r\n return format;\r\n }\r\n\r\n // Copied from posse\\Outrider\\Resources\\posseglobal.js\r\n // and updated to use the month names from the current language\r\n public static parseDate(input: string, format: string)\r\n {\r\n let aDateVal = input;\r\n let aFormat = format;\r\n\r\n /* eslint-disable */\r\n let c, f, d = 0, m = 0, y = 0, i = 0, l;\r\n let p, pts, parts: string[];\r\n let prevGood = false;\r\n let newString = '';\r\n const badChars = '., -/\\\\';\r\n l = aDateVal.length;\r\n let str;\r\n while (i < l)\r\n {\r\n str = aDateVal.substr(i, 1);\r\n if (badChars.indexOf(str) > -1)\r\n {\r\n if (prevGood)\r\n {\r\n newString += '/';\r\n prevGood = false;\r\n }\r\n }\r\n else\r\n {\r\n prevGood = true;\r\n newString += str;\r\n }\r\n i++;\r\n }\r\n while (newString.substr(newString.length - 1) === '/')\r\n {\r\n newString = newString.substr(0, newString.length - 1);\r\n }\r\n aDateVal = newString;\r\n\r\n const months = Sys.settings.months.map(month => month.toUpperCase());\r\n const monthAbbreviations = Sys.settings.monthAbbreviations.map(\r\n a => a.toUpperCase());\r\n\r\n parts = aDateVal.split('/');\r\n for (i = 0; i < parts.length; i++)\r\n {\r\n if (m === 0)\r\n {\r\n const search = parts[i].toUpperCase();\r\n let pos = monthAbbreviations.findIndex(a => a === search);\r\n if (pos < 0)\r\n {\r\n pos = months.findIndex(month => month.startsWith(search));\r\n }\r\n if (pos >= 0)\r\n {\r\n m = pos + 1;\r\n }\r\n }\r\n }\r\n\r\n i = 0;\r\n pts = [];\r\n for (p = 0; p < parts.length; p++)\r\n {\r\n const part = parseInt(parts[p], 0);\r\n if (!isNaN(Number(part)))\r\n {\r\n if (part === 0)\r\n {\r\n // User explicitly set a year of \"00\" with no century.\r\n y = 2000;\r\n }\r\n else if (part > 31)\r\n {\r\n y = part;\r\n }\r\n else\r\n {\r\n pts[i] = part;\r\n i++;\r\n }\r\n }\r\n }\r\n aFormat = aFormat.toUpperCase();\r\n\r\n p = 0;\r\n f = 0;\r\n c = '';\r\n if (pts.length === 1 || m > 0 && y > 0)\r\n {\r\n d = pts[p];\r\n }\r\n else\r\n {\r\n while (f < aFormat.length)\r\n {\r\n c = aFormat.charAt(f);\r\n if (p >= pts.length)\r\n {\r\n break;\r\n }\r\n if (c === 'Y' && y === 0)\r\n {\r\n y = pts[p]; p++;\r\n }\r\n else if (c === 'M' && m === 0)\r\n {\r\n m = pts[p]; p++;\r\n }\r\n else if (c === 'D' && d === 0)\r\n {\r\n d = pts[p]; p++;\r\n }\r\n f++;\r\n }\r\n }\r\n\r\n const today = new Date();\r\n if (y === 0)\r\n {\r\n y = today.getFullYear();\r\n }\r\n else if (y < 1000)\r\n {\r\n y = 2000 + (y * 1);\r\n }\r\n else if (y > 3999)\r\n {\r\n return null;\r\n }\r\n if (m === 0)\r\n {\r\n m = today.getMonth() + 1;\r\n }\r\n\r\n let rDate: Date | null = new Date(y, m - 1, d);\r\n if (rDate.getFullYear() !== y || rDate.getMonth() !== m - 1\r\n || rDate.getDate() !== d)\r\n {\r\n rDate = null;\r\n }\r\n /* eslint-enable */\r\n\r\n return rDate;\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n calendarSelectedDate: new Date(),\r\n calendarVisibleMonth: new Date(),\r\n isDialogOpen: false,\r\n isFocused: false,\r\n showYearsView: false,\r\n };\r\n\r\n this.muiProps = {};\r\n\r\n this.muiProps.fullWidth = true;\r\n this.muiProps.id = `date-field-${Sys.nextId}`;\r\n this.muiProps.label = props.label;\r\n this.muiProps.name = props.name;\r\n this.muiProps.autoFocus = props['autoFocus'];\r\n this.muiProps.InputProps = props['InputProps'] || {};\r\n this.muiProps.InputProps!.placeholder = Sys.settings.dateFormat;\r\n\r\n // Required so that when the help is an ul the dom is valid.\r\n this.muiProps.FormHelperTextProps =\r\n {\r\n component: 'div',\r\n style:\r\n {\r\n marginLeft: 16,\r\n marginRight: 16,\r\n },\r\n };\r\n\r\n this.muiProps.onBlur = () =>\r\n {\r\n this.setState({ isFocused: false });\r\n this.formatCurrentValueAndSetErrors(true);\r\n };\r\n this.muiProps.onChange = (e) =>\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n this.setState({ rawValue: e.target.value });\r\n };\r\n this.muiProps.onFocus = () =>\r\n {\r\n const currentValue = this.getCurrentValueParsed(false);\r\n this.setState({\r\n isFocused: true,\r\n rawValue: DateEdit.formatValue(currentValue, true),\r\n });\r\n if (typeof currentValue !== 'string')\r\n {\r\n this.lastValidDate = currentValue;\r\n }\r\n };\r\n this.muiProps.onKeyDown = (e) =>\r\n {\r\n if (e.key === 'Enter')\r\n {\r\n this.formatCurrentValueAndSetErrors(true);\r\n this.setState({\r\n rawValue: DateEdit.formatValue(\r\n this.getCurrentValueParsed(false), true),\r\n });\r\n }\r\n };\r\n\r\n if (moment.locale() !== this.localeName)\r\n {\r\n moment.defineLocale(this.localeName, {\r\n months: Sys.settings.months,\r\n monthsShort: Sys.settings.monthAbbreviations,\r\n weekdays: Sys.settings.days,\r\n weekdaysMin: Sys.settings.dayAbbreviations,\r\n weekdaysShort: Sys.settings.dayAbbreviations,\r\n });\r\n }\r\n }\r\n\r\n private closeCalendar = () =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private focusCalendarSelectedDay = () =>\r\n {\r\n let selected = this.dialogContentRef!.querySelector(\r\n '.DayPicker-Day--selected') as HTMLLinkElement;\r\n if (!selected)\r\n {\r\n selected = this.dialogContentRef!.querySelector(\r\n '.DayPicker-Day[tabindex=\"0\"]') as HTMLLinkElement;\r\n }\r\n if (selected)\r\n {\r\n selected.focus();\r\n }\r\n };\r\n\r\n private formatCurrentValueAndSetErrors(raw: boolean)\r\n {\r\n const widgetProperties = Api.getWidgetProperties(this.props);\r\n\r\n if (!widgetProperties)\r\n {\r\n return;\r\n }\r\n\r\n const businessErrors = widgetProperties['businessErrors'];\r\n const errorIndex = businessErrors.indexOf(this.props.dateFormatError);\r\n\r\n const date = this.getCurrentValueParsed(raw);\r\n if (typeof date === 'string')\r\n {\r\n this.setValue(this.state.rawValue!);\r\n\r\n if (errorIndex < 0)\r\n {\r\n businessErrors.push(this.props.dateFormatError);\r\n }\r\n }\r\n else\r\n {\r\n this.setFormattedValue(date);\r\n\r\n if (errorIndex >= 0)\r\n {\r\n businessErrors.splice(errorIndex, 1);\r\n }\r\n }\r\n }\r\n\r\n private getCalendarContent()\r\n {\r\n return (\r\n \r\n {\r\n this.setFormattedValue(date);\r\n this.formatCurrentValueAndSetErrors(false);\r\n this.closeCalendar();\r\n }}\r\n captionElement={(props) =>\r\n {\r\n const classes = this.props.classes;\r\n\r\n return (\r\n
\r\n \r\n {props.localeUtils.formatMonthTitle(\r\n props.date, props.locale)}\r\n \r\n
);\r\n }}\r\n navbarElement={(props) =>\r\n {\r\n return (\r\n
\r\n \r\n props.onPreviousClick()}\r\n />\r\n \r\n \r\n props.onNextClick()}\r\n />\r\n \r\n
\r\n );\r\n }}\r\n renderDay={(day, modifiers) =>\r\n {\r\n return (\r\n );\r\n }}\r\n weekdayElement={(props) =>\r\n {\r\n return (\r\n \r\n {props.localeUtils.formatWeekdayShort(\r\n props.weekday, props.locale)}\r\n \r\n );\r\n }}\r\n />\r\n );\r\n }\r\n\r\n private getCurrentValueParsed(raw: boolean)\r\n {\r\n const value = raw\r\n ? this.state.rawValue\r\n : Presentation.getValue(this.props);\r\n\r\n let parsed: Date | null | string = null;\r\n if (value)\r\n {\r\n const format = DateEdit.getDateFormat(raw);\r\n const date = moment(value, format, raw ? this.localeName : 'en', true);\r\n if (date.isValid())\r\n {\r\n parsed = date.toDate();\r\n }\r\n else\r\n {\r\n if (raw)\r\n {\r\n parsed = DateEdit.parseDate(value, format);\r\n if (!parsed)\r\n {\r\n parsed = value;\r\n }\r\n }\r\n else\r\n {\r\n parsed = value;\r\n }\r\n }\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n private getYearClass(year: number)\r\n {\r\n return `YearSelector-Year\r\n ${year === this.state.calendarVisibleMonth!.getFullYear() ?\r\n ' YearSelector-Year--selected' : ''}`;\r\n }\r\n\r\n private getYearTabIndex(year: number)\r\n {\r\n return year === this.state.calendarVisibleMonth!.getFullYear() ? 0 : -1;\r\n }\r\n\r\n private navigateYears = (event: React.KeyboardEvent) =>\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const targetElement = event.target as any;\r\n\r\n switch (event.key)\r\n {\r\n case 'ArrowDown':\r\n if (targetElement.nextSibling)\r\n {\r\n targetElement.nextSibling.focus();\r\n event.preventDefault();\r\n }\r\n break;\r\n case 'ArrowUp':\r\n if (targetElement.previousSibling)\r\n {\r\n targetElement.previousSibling.focus();\r\n event.preventDefault();\r\n }\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private openCalendar = () =>\r\n {\r\n let currentDate = this.getCurrentValueParsed(false);\r\n if (!currentDate)\r\n {\r\n currentDate = new Date();\r\n }\r\n else if (typeof currentDate === 'string')\r\n {\r\n currentDate = this.lastValidDate ? this.lastValidDate : new Date();\r\n }\r\n\r\n this.setState({\r\n calendarSelectedDate: currentDate,\r\n calendarVisibleMonth: currentDate,\r\n isDialogOpen: true,\r\n showYearsView: false,\r\n });\r\n };\r\n\r\n private selectYear(year: number, event: React.MouseEvent)\r\n {\r\n if (event.clientX === 0) // Only focus when using keyboard\r\n {\r\n setTimeout(this.focusCalendarSelectedDay);\r\n }\r\n\r\n this.setState((lastState) =>\r\n {\r\n const currentMonth = lastState.calendarVisibleMonth!.getMonth();\r\n\r\n return {\r\n calendarVisibleMonth: new Date(year, currentMonth, 1),\r\n showYearsView: false,\r\n };\r\n });\r\n }\r\n\r\n private setFormattedValue(value: Date | null)\r\n {\r\n this.setValue(DateEdit.formatValue(value, false));\r\n }\r\n\r\n private setValue(value: string | null)\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, value);\r\n }\r\n\r\n private switchToYearsView = () =>\r\n {\r\n this.setState({ showYearsView: true });\r\n setTimeout(() =>\r\n {\r\n const container = this.dialogContentRef!.parentElement!;\r\n const item = container.querySelector(\r\n '.YearSelector-Year--selected')! as HTMLLinkElement;\r\n const top = item.offsetTop + item.offsetHeight / 2\r\n - container.offsetHeight / 2;\r\n\r\n container.scrollTop = top;\r\n item.focus();\r\n });\r\n };\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (!Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n return result;\r\n }\r\n\r\n this.muiProps.disabled = false;\r\n this.muiProps.InputProps!.endAdornment = undefined;\r\n this.muiProps.required = false;\r\n this.muiProps.style = undefined;\r\n this.muiProps.variant = 'filled';\r\n\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.helperText = null;\r\n this.muiProps.value = '';\r\n\r\n if (widgetProperties.showDisabledHelp)\r\n {\r\n result =\r\n \r\n \r\n ;\r\n }\r\n else\r\n {\r\n result = ;\r\n }\r\n }\r\n else if (_props['readOnly'])\r\n {\r\n const value =\r\n DateEdit.formatValue(this.getCurrentValueParsed(false), true);\r\n\r\n result =\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {value ? value : '-'}\r\n \r\n
;\r\n }\r\n else\r\n {\r\n this.muiProps.InputProps!.endAdornment =\r\n (\r\n \r\n \r\n \r\n );\r\n\r\n this.muiProps.required = widgetProperties.showAsMandatory;\r\n\r\n Api.setHelperText(\r\n this,\r\n widgetProperties['businessErrors'],\r\n this.muiProps);\r\n\r\n let formatted: string | null;\r\n if (this.state.isFocused)\r\n {\r\n formatted = this.state.rawValue!;\r\n }\r\n else\r\n {\r\n formatted = DateEdit.formatValue(\r\n this.getCurrentValueParsed(false), true);\r\n }\r\n this.muiProps.value = formatted === null ? '' : formatted;\r\n\r\n const years: number[] = [];\r\n const currentYear = this.state.calendarVisibleMonth!.getFullYear();\r\n for (let i = currentYear - 50; i <= currentYear + 50; i += 1)\r\n {\r\n years.push(i);\r\n }\r\n\r\n result =\r\n \r\n \r\n\r\n \r\n \r\n this.dialogContentRef = r}\r\n style={{ margin: '0 auto' }}\r\n >\r\n {this.state.showYearsView ?\r\n \r\n {years.map(year => (\r\n \r\n this.selectYear(year, e)}\r\n onKeyDown={this.navigateYears}\r\n tabIndex={\r\n this.getYearTabIndex(year)\r\n }\r\n variant=\"text\"\r\n >\r\n {year}\r\n \r\n ))}\r\n \r\n :\r\n this.getCalendarContent()\r\n }\r\n {!this.state.showYearsView ? (\r\n \r\n Cancel\r\n \r\n ) : null}\r\n \r\n \r\n \r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DateEdit);\r\n","import * as muiInput from '@material-ui/core/Input';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport InputAdornment from './InputAdornment';\r\n\r\nexport interface InputProps extends muiInput.InputProps\r\n{\r\n icon?: string;\r\n iconColor?: string;\r\n justification?: 'Left' | 'Right';\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n input:\r\n {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Input extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if ('icon' in _props)\r\n {\r\n if (_props.icon)\r\n {\r\n _props.startAdornment =\r\n ;\r\n }\r\n\r\n const style =\r\n {\r\n height: 40,\r\n marginTop: 3,\r\n textAlign: _props.justification,\r\n } as React.CSSProperties;\r\n\r\n if (!_props.endAdornment)\r\n {\r\n style.marginRight = 24;\r\n }\r\n\r\n if (_props.inputProps)\r\n {\r\n if (_props.inputProps.style)\r\n {\r\n _props.inputProps.style =\r\n {\r\n ...style,\r\n ..._props.inputProps.style,\r\n };\r\n }\r\n else\r\n {\r\n _props.inputProps.style = style;\r\n }\r\n }\r\n else\r\n {\r\n _props.inputProps = { style };\r\n }\r\n\r\n delete _props.icon;\r\n }\r\n\r\n if ('iconColor' in _props)\r\n {\r\n delete _props.iconColor;\r\n }\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Input);\r\n","import * as muiDialogContent from '@material-ui/core/DialogContent';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport * as DayPicker from 'react-day-picker';\r\n// @ts-ignore\r\nimport { LocaleUtils } from 'react-day-picker/moment';\r\nimport Sys from '../../core/Sys';\r\nimport Button from '../../coreui/Button';\r\nimport Dialog from '../../coreui/Dialog';\r\nimport Typography from '../../coreui/Typography';\r\nimport DateEditColumnEdit, { DateEditColumnEdit as DateEditColumnEditBase } from\r\n './DateEditColumnEdit';\r\n\r\ninterface ConfigProperties\r\n{\r\n currentDate: Date;\r\n editor: DateEditColumnEdit;\r\n open: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n showYearsView?: boolean;\r\n yearSelected?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n calendar:\r\n {\r\n [theme.breakpoints.down('xs')]:\r\n {\r\n padding: 16,\r\n },\r\n\r\n '& .DayPicker-Body':\r\n {\r\n display: 'table-row-group',\r\n },\r\n\r\n '& .DayPicker-Caption':\r\n {\r\n display: 'table-caption',\r\n marginBottom: '0.5rem',\r\n maxHeight: 40,\r\n padding: '0 42px',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Caption button':\r\n {\r\n justifyContent: 'flex-start',\r\n maxWidth: 215,\r\n textTransform: 'none',\r\n },\r\n '& .DayPicker-Caption button span':\r\n {\r\n fontSize: 16,\r\n fontWeight: 700,\r\n letterSpacing: '0.01071em',\r\n lineHeight: '20px',\r\n whiteSpace: 'normal',\r\n },\r\n\r\n '& .DayPicker-Day':\r\n {\r\n display: 'table-cell',\r\n outline: 'none',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Day button':\r\n {\r\n borderRadius: '50%',\r\n fontWeight: 400,\r\n minWidth: '40px',\r\n padding: '0.5rem',\r\n },\r\n '& .DayPicker-Day--outside button':\r\n {\r\n color: theme.palette.grey['300'],\r\n },\r\n '& .DayPicker-Day--selected button':\r\n {\r\n background: `${theme.palette.grey['800']} !important`,\r\n color: theme.palette.getContrastText(theme.palette.grey['800']),\r\n },\r\n '& .DayPicker-Day--selected button:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .DayPicker-Day--selected:focus button':\r\n {\r\n background: theme.palette.grey['800'],\r\n },\r\n '& .DayPicker-Day--selected:focus button:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .DayPicker-Day:focus button':\r\n {\r\n background: theme.palette.grey['400'],\r\n },\r\n '& .DayPicker-Day:focus button:hover':\r\n {\r\n background: darken(theme.palette.grey['400'], 0.1),\r\n },\r\n\r\n '& .DayPicker-Month':\r\n {\r\n display: 'table',\r\n width: '100%',\r\n },\r\n\r\n '& .DayPicker-NavButton':\r\n {\r\n position: 'absolute',\r\n top: '5px',\r\n },\r\n '& .DayPicker-NavButton > button':\r\n {\r\n height: 24,\r\n padding: 0,\r\n width: 24,\r\n },\r\n '& .DayPicker-NavButton--next':\r\n {\r\n right: '0.5rem',\r\n },\r\n '& .DayPicker-NavButton--prev':\r\n {\r\n left: '0.5rem',\r\n },\r\n\r\n '& .DayPicker-Week':\r\n {\r\n display: 'table-row',\r\n },\r\n '& .DayPicker-Weekday':\r\n {\r\n color: theme.palette.grey['500'],\r\n display: 'table-cell',\r\n fontSize: 12,\r\n lineHeight: '1.42857',\r\n padding: '0.5rem',\r\n textAlign: 'center',\r\n },\r\n '& .DayPicker-Weekdays':\r\n {\r\n display: 'table-header-group',\r\n },\r\n '& .DayPicker-WeekdaysRow':\r\n {\r\n display: 'table-row',\r\n },\r\n\r\n '& .DayPicker-wrapper':\r\n {\r\n outline: 'none',\r\n position: 'relative',\r\n },\r\n\r\n padding: 40,\r\n },\r\n\r\n dialogContainer:\r\n {\r\n '& .CancelButton':\r\n {\r\n bottom: 16,\r\n display: 'none',\r\n position: 'absolute',\r\n right: 16,\r\n\r\n [theme.breakpoints.down('xs')]:\r\n {\r\n display: 'inline-block',\r\n },\r\n },\r\n '&:first-child':\r\n {\r\n paddingTop: 0,\r\n },\r\n\r\n height: 405,\r\n margin: '0 auto',\r\n maxWidth: '100%',\r\n padding: 0,\r\n width: 380,\r\n },\r\n\r\n switchYearBtn:\r\n {\r\n justifyContent: 'center !important',\r\n minWidth: 150,\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n position: 'static', // Fix for Safari not firing click event\r\n },\r\n\r\n switchYearBtnRipple:\r\n {\r\n background: 'transparent',\r\n margin: '0 auto',\r\n maxHeight: 40,\r\n maxWidth: 150,\r\n },\r\n\r\n yearSelector:\r\n {\r\n '& .YearSelector-Year':\r\n {\r\n fontSize: 16,\r\n fontWeight: 400,\r\n padding: '12, 40',\r\n width: '100%',\r\n },\r\n '& .YearSelector-Year span':\r\n {\r\n justifyContent: 'flex-start',\r\n },\r\n '& .YearSelector-Year--selected':\r\n {\r\n background: theme.palette.grey['800'],\r\n color: theme.palette.getContrastText(theme.palette.grey['800']),\r\n },\r\n '& .YearSelector-Year--selected:hover':\r\n {\r\n background: darken(theme.palette.grey['800'], 0.1),\r\n },\r\n '& .YearSelector-Year:hover':\r\n {\r\n background: darken(theme.palette.common.white, 0.1),\r\n },\r\n\r\n padding: '8px 0',\r\n },\r\n });\r\n\r\n@observer\r\nexport class DateEditColumnDialog extends\r\n React.Component, State>\r\n{\r\n private calendarVisibleMonth?: Date;\r\n private currentDate: Date;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private dialogContentRef?: any;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n showYearsView: false,\r\n yearSelected: false,\r\n };\r\n }\r\n\r\n private closeCalendar = () =>\r\n {\r\n this.setState({ showYearsView: false, yearSelected: false });\r\n this.props.editor.closeCalendar();\r\n };\r\n\r\n private focusCalendarSelectedDay = () =>\r\n {\r\n const selected = this.dialogContentRef.querySelector(\r\n '.DayPicker-Day--selected');\r\n\r\n if (selected)\r\n {\r\n selected.focus();\r\n }\r\n else\r\n {\r\n this.dialogContentRef.querySelector(\r\n '.DayPicker-Day[tabindex=\"0\"]').focus();\r\n }\r\n };\r\n\r\n private getCalendarContent()\r\n {\r\n const editor = this.props.editor;\r\n\r\n return (\r\n \r\n {\r\n editor.setFormattedValue(date);\r\n this.closeCalendar();\r\n }}\r\n captionElement={(props) =>\r\n {\r\n const classes = this.props.classes;\r\n\r\n return (\r\n
\r\n \r\n {props.localeUtils.formatMonthTitle(\r\n props.date, props.locale)}\r\n \r\n
);\r\n }}\r\n navbarElement={(props) =>\r\n {\r\n return (\r\n
\r\n \r\n props.onPreviousClick()}\r\n />\r\n \r\n \r\n props.onNextClick()}\r\n />\r\n \r\n
\r\n );\r\n }}\r\n renderDay={(day, modifiers) =>\r\n {\r\n return (\r\n );\r\n }}\r\n weekdayElement={(props) =>\r\n {\r\n return (\r\n \r\n {props.localeUtils.formatWeekdayShort(\r\n props.weekday, props.locale)}\r\n \r\n );\r\n }}\r\n />\r\n );\r\n }\r\n\r\n private getYearClass(year: number)\r\n {\r\n return `YearSelector-Year\r\n ${year === this.calendarVisibleMonth!.getFullYear() ?\r\n ' YearSelector-Year--selected' : ''}`;\r\n }\r\n\r\n private getYearTabIndex(year: number)\r\n {\r\n return year === this.calendarVisibleMonth!.getFullYear() ? 0 : -1;\r\n }\r\n\r\n private navigateYears = (event: React.KeyboardEvent) =>\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const targetElement = event.target as any;\r\n\r\n switch (event.key)\r\n {\r\n case 'ArrowDown':\r\n if (targetElement.nextSibling)\r\n {\r\n targetElement.nextSibling.focus();\r\n event.preventDefault();\r\n }\r\n break;\r\n case 'ArrowUp':\r\n if (targetElement.previousSibling)\r\n {\r\n targetElement.previousSibling.focus();\r\n event.preventDefault();\r\n }\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private onEntered = () =>\r\n {\r\n this.focusCalendarSelectedDay();\r\n };\r\n\r\n private selectYear(year: number, event: React.MouseEvent)\r\n {\r\n const currentMonth = this.calendarVisibleMonth!.getMonth();\r\n\r\n if (event.clientX === 0) // Only focus when using keyboard\r\n {\r\n setTimeout(this.focusCalendarSelectedDay);\r\n }\r\n\r\n this.calendarVisibleMonth = new Date(year, currentMonth, 1);\r\n this.currentDate = this.calendarVisibleMonth;\r\n\r\n this.setState(\r\n {\r\n showYearsView: false,\r\n yearSelected: this.currentDate.getFullYear()\r\n !== this.props.currentDate.getFullYear(),\r\n });\r\n }\r\n\r\n private switchToYearsView = () =>\r\n {\r\n this.setState({ showYearsView: true });\r\n setTimeout(() =>\r\n {\r\n const container = this.dialogContentRef.parentElement;\r\n const item = container.querySelector('.YearSelector-Year--selected');\r\n const top = item.offsetTop + item.offsetHeight / 2\r\n - container.offsetHeight / 2;\r\n\r\n container.scrollTop = top;\r\n item.focus();\r\n });\r\n };\r\n\r\n public render()\r\n {\r\n const editor = this.props.editor;\r\n const years: number[] = [];\r\n\r\n if (!this.state.yearSelected)\r\n {\r\n this.currentDate = this.props.currentDate;\r\n }\r\n\r\n this.calendarVisibleMonth = this.currentDate;\r\n const currentYear: number = this.currentDate!.getFullYear();\r\n for (let i = currentYear - 50; i <= currentYear + 50; i += 1)\r\n {\r\n years.push(i);\r\n }\r\n\r\n return (\r\n editor.restoreFocus()}\r\n open={this.props.open}\r\n >\r\n \r\n this.dialogContentRef = r}\r\n style={{ margin: '0 auto' }}\r\n >\r\n {this.state.showYearsView ?\r\n \r\n {years.map(year => (\r\n \r\n this.selectYear(year, e)}\r\n onKeyDown={this.navigateYears}\r\n tabIndex={\r\n this.getYearTabIndex(year)\r\n }\r\n variant=\"text\"\r\n >\r\n {year}\r\n \r\n ))}\r\n \r\n :\r\n this.getCalendarContent()\r\n }\r\n {!this.state.showYearsView ? (\r\n \r\n Cancel\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DateEditColumnDialog);\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { GetQuickFilterTextParams, ICellEditorParams }\r\n from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as moment from 'moment';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport Button from '../../coreui/Button';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Input, { InputProps } from '../../coreui/Input';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport Api from '../../mustangui/Api';\r\nimport { DateEdit } from '../DateEdit';\r\nimport DateEditColumnDialog from './DateEditColumnDialog';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataId: string;\r\n dateFormatError: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isDialogOpen: boolean;\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n businessErrors: string[];\r\n}\r\n\r\n@observer\r\nexport class DateEditColumnEdit extends\r\n React.Component\r\n{\r\n public static readonly localeName = 'current';\r\n private inputElement: HTMLInputElement;\r\n private lastValidDate: Date | null = null;\r\n protected muiProps: InputProps;\r\n\r\n private static getErrors(\r\n props: ConfigProperties,\r\n data: TrackableModel,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any): string[]\r\n {\r\n const widgetProperties =\r\n Api.getWidgetProperties(props, data) as RuntimeProperties;\r\n let result: string[];\r\n\r\n if (!widgetProperties)\r\n {\r\n return [];\r\n }\r\n\r\n if (data.hasChanges(props.name))\r\n {\r\n result = [];\r\n }\r\n else\r\n {\r\n result = [...widgetProperties.businessErrors];\r\n }\r\n\r\n const parsedValue =\r\n DateEditColumnEdit.getCurrentValueParsed(true, value);\r\n\r\n if (typeof parsedValue === 'string')\r\n {\r\n result.push(props.dateFormatError);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getCurrentValueParsed(\r\n userFormatted: boolean,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any\r\n ): Date | null\r\n {\r\n let parsed: Date | null = null;\r\n\r\n if (value)\r\n {\r\n const format = DateEdit.getDateFormat(userFormatted);\r\n const date = moment(\r\n value,\r\n format,\r\n userFormatted ? DateEditColumnEdit.localeName : 'en',\r\n true);\r\n\r\n if (date.isValid())\r\n {\r\n parsed = date.toDate();\r\n }\r\n else\r\n {\r\n if (userFormatted)\r\n {\r\n parsed = DateEdit.parseDate(value, format);\r\n if (!parsed)\r\n {\r\n parsed = value;\r\n }\r\n }\r\n else\r\n {\r\n parsed = value;\r\n }\r\n }\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n if (!params.value)\r\n {\r\n return '';\r\n }\r\n\r\n const parsed =\r\n DateEditColumnEdit.getCurrentValueParsed(false, params.value);\r\n const formatted = DateEdit.formatValue(parsed, true);\r\n\r\n return formatted ? formatted : '';\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n const currentDate =\r\n DateEditColumnEdit.getCurrentValueParsed(false, props.value);\r\n let formattedValue = DateEdit.formatValue(currentDate, true);\r\n\r\n // Backspace.\r\n if (props.keyPress === 8 && formattedValue)\r\n {\r\n formattedValue = formattedValue.substr(0, formattedValue.length - 1);\r\n }\r\n else if (props.charPress)\r\n {\r\n if (formattedValue)\r\n {\r\n formattedValue += props.charPress;\r\n }\r\n else\r\n {\r\n formattedValue = props.charPress;\r\n }\r\n }\r\n\r\n this.state =\r\n {\r\n isDialogOpen: false,\r\n value: formattedValue,\r\n };\r\n\r\n if (typeof currentDate !== 'string')\r\n {\r\n this.lastValidDate = currentDate;\r\n }\r\n\r\n this.muiProps =\r\n {\r\n autoFocus: true,\r\n fullWidth: true,\r\n icon: 'fas fa-pencil',\r\n iconColor: grey[300],\r\n inputRef: (element) => { this.inputElement = element; },\r\n onChange: e => this.setValue(e.target.value),\r\n style: { height: 'calc(100% + 2px)', paddingLeft: 2 },\r\n };\r\n }\r\n\r\n private openCalendar = () =>\r\n {\r\n this.setState({ isDialogOpen: true });\r\n };\r\n\r\n private setValue(value: string | null)\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value });\r\n }\r\n\r\n public closeCalendar = () =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n CellUtil.disableGridNavigation(\r\n this.props.eGridCell, this.inputElement);\r\n\r\n CellUtil.setInitialFocus(this.inputElement);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n CellUtil.enableGridNavigation(this.props.eGridCell);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n return DateEdit.formatValue(\r\n DateEditColumnEdit.getCurrentValueParsed(true, this.state.value),\r\n false);\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n let currentDate: string | Date | null;\r\n let errors: string[] = [];\r\n\r\n const parentTable = this.props.propagated.parentTable;\r\n if (this.state.isDialogOpen)\r\n {\r\n parentTable.setStopEditingWhenGridLosesFocus(false);\r\n }\r\n else\r\n {\r\n parentTable.setStopEditingWhenGridLosesFocus(true);\r\n }\r\n\r\n this.muiProps.value = this.state.value || '';\r\n\r\n currentDate =\r\n DateEditColumnEdit.getCurrentValueParsed(true, this.muiProps.value);\r\n\r\n if (!currentDate)\r\n {\r\n currentDate = new Date();\r\n }\r\n else if (typeof currentDate === 'string')\r\n {\r\n currentDate = this.lastValidDate ? this.lastValidDate : new Date();\r\n }\r\n\r\n errors = DateEditColumnEdit.getErrors(\r\n _props, _props.node.data, this.muiProps.value);\r\n\r\n this.muiProps.error = errors.length > 0;\r\n this.muiProps.endAdornment =\r\n (\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n public restoreFocus()\r\n {\r\n if (this.inputElement)\r\n {\r\n this.inputElement.focus();\r\n }\r\n }\r\n\r\n public setFormattedValue(value: Date | null)\r\n {\r\n this.setValue(DateEdit.formatValue(value, true));\r\n }\r\n}\r\n\r\nexport default DateEditColumnEdit;\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Api from '../mustangui/Api';\r\nimport FormControl from './FormControl';\r\nimport Icon from './Icon';\r\nimport InputAdornment from './InputAdornment';\r\nimport Typography from './Typography';\r\n\r\nexport interface TextFieldProps extends muiTextField.FilledTextFieldProps\r\n{\r\n getErrors?: (value: string) => string[];\r\n icon?: string;\r\n onValueChange?: (value: string) => void;\r\n readOnly?: boolean;\r\n readOnlyProps?:\r\n {\r\n classes?:\r\n {\r\n content?: string;\r\n root?: string;\r\n };\r\n contentRef?: React.Ref | React.RefObject;\r\n };\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 33px)',\r\n },\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 33px) * 1.333)',\r\n },\r\n readOnlyContentMultiline:\r\n {\r\n whiteSpace: 'pre-wrap',\r\n },\r\n readOnlyLabel:\r\n {\r\n color: theme.palette.grey[700],\r\n flexShrink: 0,\r\n marginBottom: 8,\r\n },\r\n readOnlyRoot:\r\n {\r\n '&:hover': { backgroundColor: 'transparent' },\r\n backgroundColor: 'transparent',\r\n },\r\n root:\r\n {\r\n },\r\n rootWithStartIcon:\r\n {\r\n '& label, & input':\r\n {\r\n marginLeft: 22,\r\n },\r\n },\r\n startIcon:\r\n {\r\n color: theme.palette.text.primary,\r\n left: 16,\r\n position: 'absolute',\r\n },\r\n });\r\n\r\n@observer\r\nexport class TextField extends\r\n React.Component>\r\n{\r\n private readonly defaultId: string;\r\n\r\n public constructor(props: TextFieldProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.defaultId = `text-field-${Sys.nextId}`;\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n if (!this.props.onValueChange)\r\n {\r\n return;\r\n }\r\n\r\n this.props.onValueChange(event.target.value as string);\r\n };\r\n\r\n public render(): React.ReactNode\r\n {\r\n const {\r\n classes,\r\n className,\r\n getErrors,\r\n helperText,\r\n icon,\r\n id,\r\n inputProps,\r\n InputProps,\r\n onValueChange,\r\n readOnly,\r\n readOnlyProps: readOnlyPropOverrides,\r\n ...otherProps\r\n } = this.props;\r\n\r\n if (readOnly)\r\n {\r\n const {\r\n label,\r\n multiline,\r\n value,\r\n } = otherProps;\r\n\r\n let contentClassName = '';\r\n if (multiline)\r\n {\r\n contentClassName = classes.readOnlyContentMultiline;\r\n }\r\n\r\n const readOnlyProps =\r\n {\r\n classes:\r\n {\r\n content: '',\r\n root: '',\r\n },\r\n contentRef: undefined,\r\n ...readOnlyPropOverrides,\r\n };\r\n\r\n const readOnlyClassNames: string[] =\r\n [\r\n readOnlyProps.classes.root || '',\r\n classes.readOnlyRoot,\r\n ];\r\n\r\n return (\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n {value as React.ReactNode}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const classNames: string[] =\r\n [\r\n className ? className : '',\r\n classes.root,\r\n ];\r\n\r\n let endAdornment: React.ReactNode = null;\r\n if (icon !== undefined)\r\n {\r\n // End adornment is used instead of start since when start is set\r\n // the field moves the label above the input\r\n endAdornment = (\r\n \r\n }\r\n />\r\n );\r\n\r\n classNames.push(classes.rootWithStartIcon);\r\n }\r\n\r\n let muiHelperText = helperText;\r\n let hasErrors = false;\r\n\r\n if (getErrors)\r\n {\r\n const errors = getErrors(otherProps.value as string);\r\n if (errors.length > 0)\r\n {\r\n hasErrors = true;\r\n\r\n const errorMessages = Api.getErrorMessages(errors!);\r\n if (helperText)\r\n {\r\n muiHelperText = (\r\n
\r\n \r\n {helperText}\r\n \r\n {errorMessages}\r\n
\r\n );\r\n }\r\n else\r\n {\r\n muiHelperText = errorMessages;\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TextField);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Button from './Button';\r\nimport Dialog from './Dialog';\r\nimport DialogActions from './DialogActions';\r\nimport DialogContent from './DialogContent';\r\nimport TextField from './TextField';\r\n\r\ninterface Props\r\n{\r\n getErrors?: (value: string) => string[];\r\n helperText?: React.ReactNode;\r\n label: React.ReactNode;\r\n onAccept?: (value: string) => void;\r\n onCancel: () => void;\r\n onExited?: () => void;\r\n open: boolean;\r\n readOnly?: boolean;\r\n value: string;\r\n}\r\n\r\ninterface State\r\n{\r\n value: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n contentRoot:\r\n {\r\n display: 'flex',\r\n // Set flex such that it agressively allocates vertical space, but\r\n // then shrinks down to what is available.\r\n flex: '0 1 100vh',\r\n },\r\n contentRootReadOnly:\r\n {\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n contentWrapper:\r\n {\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n width: 600,\r\n },\r\n contentWrapperReadOnly:\r\n {\r\n width: 600,\r\n },\r\n inputElement:\r\n {\r\n height: '100%',\r\n marginLeft: -16,\r\n marginRight: -16,\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n },\r\n inputRoot:\r\n {\r\n flex: '1 1 auto',\r\n paddingBottom: 22,\r\n },\r\n readOnlyContent:\r\n {\r\n overflow: 'auto',\r\n },\r\n readOnlyRoot:\r\n {\r\n height: '100%',\r\n },\r\n });\r\n\r\n@observer\r\nexport class MultilineTextFieldDialog extends\r\n React.Component, State>\r\n{\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { value: props.value };\r\n }\r\n\r\n private onAccept = () =>\r\n {\r\n if (this.props.onAccept)\r\n {\r\n this.props.onAccept(this.state.value);\r\n }\r\n };\r\n\r\n private onCancel = () =>\r\n {\r\n this.props.onCancel();\r\n };\r\n\r\n private onExited = () =>\r\n {\r\n if (this.props.onExited)\r\n {\r\n this.props.onExited();\r\n }\r\n };\r\n\r\n private onValueChange = (value: string) =>\r\n {\r\n this.setState({ value });\r\n };\r\n\r\n public componentDidUpdate(prevProps: Props, prevState: State)\r\n {\r\n if (!prevProps.open && this.props.open)\r\n {\r\n this.setState({ value: this.props.value });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const contentRootClassName = this.props.readOnly\r\n ? this.props.classes.contentRootReadOnly\r\n : this.props.classes.contentRoot;\r\n\r\n const contentWrapperClassName = this.props.readOnly\r\n ? this.props.classes.contentWrapperReadOnly\r\n : this.props.classes.contentWrapper;\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {\r\n !this.props.readOnly\r\n ? \r\n : null\r\n }\r\n \r\n {this.props.readOnly ? 'Close' : 'Cancel'}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(MultilineTextFieldDialog);\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { GetQuickFilterTextParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport Button from '../../coreui/Button';\r\nimport { EditMask as EditMaskBase } from '../../coreui/EditMask';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Icon from '../../coreui/Icon';\r\nimport MultilineTextFieldDialog from '../../coreui/MultilineTextFieldDialog';\r\nimport Presentation from '../../coreui/Presentation';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellFocusUtil, FocusCellRendererParams }\r\n from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport PaneRow, { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n editMask?: string;\r\n justification?: 'Left' | 'Right';\r\n name: string;\r\n propagated: TableChildProps;\r\n showEllipsis?: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isDialogOpen: boolean;\r\n isErrorBadgeOpen?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n bodyText: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n edit:\r\n {\r\n color: theme.palette.grey[300],\r\n textAlign: 'left',\r\n },\r\n expandButton:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n });\r\n\r\n@observer\r\nexport class TextColumn extends\r\n React.Component, State>\r\n{\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const row = params.data as PaneRow;\r\n const bodyText = row.getReadOnlyProperties(\r\n params.colDef.field!).bodyText;\r\n\r\n if (bodyText)\r\n {\r\n return bodyText.join(' ');\r\n }\r\n\r\n return params.value ? params.value : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n if (data.value !== null && typeof (data.value) !== 'string')\r\n {\r\n throw new Error(`Unexpected data type ${typeof (data.value)}`);\r\n }\r\n\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n const value: string | null = runtimeProperties.bodyText\r\n ? runtimeProperties.bodyText.join('\\n') : data.value;\r\n\r\n if (value)\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isDialogOpen: false, isErrorBadgeOpen: false };\r\n\r\n CellFocusUtil.subscribeToCellKeyboardFocusedEvent(\r\n props, this.onCellFocus, this.onCellBlur);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellBlur = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n if (event.key === 'Enter'\r\n && !this.props.column.isCellEditable(this.props.node))\r\n {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.setState({ isDialogOpen: true });\r\n\r\n return;\r\n }\r\n\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n private onCloseErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onDialogCancel = (): void =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private onOpenErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n private showDialog = (): void =>\r\n {\r\n this.setState({ isDialogOpen: true });\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n CellFocusUtil.unsubscribeToCellKeyboardFocusedEvent(\r\n this.props, this.onCellFocus, this.onCellBlur);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props, _props.data) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(\r\n _props.eGridCell,\r\n runtimeProperties.accessLevel <= AccessLevel.actionable);\r\n\r\n let expandButton: React.ReactNode = null;\r\n let expandButtonDialog: React.ReactNode = null;\r\n let value: string | null = runtimeProperties.bodyText\r\n ? runtimeProperties.bodyText.join('\\n') : _props.value;\r\n const errors: string[] = _props.colDef.cellEditorFramework ?\r\n _props.colDef.cellEditorFramework.getErrors(\r\n _props.colDef.cellEditorParams,\r\n _props.data,\r\n value) : [];\r\n\r\n value = _props.editMask && value\r\n ? EditMaskBase.formatValue(_props.editMask, value) : value;\r\n\r\n if (value && !_props.showEllipsis)\r\n {\r\n const columnWidth = _props.eGridCell.getBoundingClientRect().width;\r\n const textWidth: number = Presentation.measureText(value);\r\n\r\n // If its enterable we need to ajust the size for the pencil.\r\n if ((runtimeProperties.accessLevel >= AccessLevel.enterable\r\n && textWidth > (columnWidth - 67))\r\n || (runtimeProperties.accessLevel < AccessLevel.enterable\r\n && textWidth > (columnWidth - 50)))\r\n {\r\n expandButton = (\r\n );\r\n\r\n expandButtonDialog = (\r\n );\r\n }\r\n }\r\n\r\n let result: React.ReactNode = null;\r\n\r\n if (!_props.justification)\r\n {\r\n _props.justification = 'Left';\r\n }\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.enterable)\r\n {\r\n const edit: React.ReactNode =\r\n value ? null :\r\n
\r\n {Sys.getTranslation('Edit...', 'DataTable')}\r\n
;\r\n\r\n if (errors.length)\r\n {\r\n result =\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {value}\r\n {edit}\r\n \r\n {expandButton}\r\n {expandButtonDialog}\r\n \r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n \r\n
\r\n \r\n
\r\n \r\n {value}\r\n {edit}\r\n \r\n {expandButton}\r\n {expandButtonDialog}\r\n ;\r\n }\r\n }\r\n else\r\n {\r\n result =\r\n \r\n \r\n {value}\r\n \r\n {expandButton}\r\n {expandButtonDialog}\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TextColumn);\r\n","import { ICellRendererParams } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport { DateEdit } from '../DateEdit';\r\nimport { FunctionName } from '../TableSummary';\r\nimport { DateEditColumnEdit } from './DateEditColumnEdit';\r\nimport TextColumn from './TextColumn';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\nexport class DateEditColumn extends\r\n React.PureComponent\r\n{\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result: Date | null = null;\r\n let count: number = 0;\r\n for (const data of runtimeData)\r\n {\r\n if (data.value === null)\r\n {\r\n continue;\r\n }\r\n if (typeof (data.value) !== 'string')\r\n {\r\n throw new Error(`Unexpected data type ${typeof (data.value)}`);\r\n }\r\n\r\n const value: Date =\r\n DateEditColumnEdit.getCurrentValueParsed(false, data.value)!;\r\n\r\n switch (functionName)\r\n {\r\n case 'Count':\r\n count += 1;\r\n break;\r\n case 'Maximum':\r\n result = result === null || value > result ? value : result;\r\n break;\r\n case 'Minimum':\r\n result = result === null || value < result ? value : result;\r\n break;\r\n default:\r\n throw new Error(`Unknown summary function ${functionName}`);\r\n }\r\n }\r\n\r\n if (functionName === 'Count')\r\n {\r\n return count.toString();\r\n }\r\n\r\n return DateEdit.formatValue(result, true);\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n _props.value = DateEdit.formatValue(\r\n DateEditColumnEdit.getCurrentValueParsed(false, _props.value),\r\n true);\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default DateEditColumn;\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { autorun, Lambda } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport ComboBoxOption from '../coreui/ComboBoxOption';\r\nimport { Paper as PaperBase } from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { TableVerticalLayoutProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport { AccessLevel } from './Api';\r\nimport ApiSelect from './ApiSelect';\r\n\r\ninterface Props\r\n{\r\n controlledGroupName: string;\r\n controlledPaneKeysByValue: object | null;\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n isPaneController: boolean;\r\n label: string;\r\n name: string;\r\n options: ComboBoxOption[];\r\n propagated?: TableVerticalLayoutProps;\r\n roundTripOnChange: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n minWidth: 150,\r\n },\r\n });\r\n\r\n@observer\r\nexport class DomainComboBox extends\r\n React.Component>\r\n{\r\n protected disposeObserve: Lambda;\r\n\r\n public static getOptions(\r\n propOptions: ComboBoxOption[],\r\n selectedValue: string | null,\r\n selectedDisplayValue: string\r\n ): ComboBoxOption[]\r\n {\r\n const options = [...propOptions];\r\n\r\n if (selectedValue)\r\n {\r\n // Add the initially selected value as a historic option if is not\r\n // among the current candidates\r\n const optionInList = options.find(\r\n o => o.value === selectedValue);\r\n\r\n if (optionInList === undefined)\r\n {\r\n const historicOption: ComboBoxOption =\r\n {\r\n display: selectedDisplayValue,\r\n historic: true,\r\n value: selectedValue,\r\n };\r\n\r\n options.push(historicOption);\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private onSelect = (event: React.ChangeEvent) =>\r\n {\r\n const value = Presentation.getValue(this.props);\r\n\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, event.target.value);\r\n\r\n if (!this.props.roundTripOnChange)\r\n {\r\n return;\r\n }\r\n\r\n RoundTripService.standardRoundTrip(\r\n 'DomainComboBox/OnChange', this.props\r\n ).catch(() =>\r\n {\r\n // If the round trip fails, undo the value change.\r\n Presentation.setValue(this.props, value);\r\n });\r\n };\r\n\r\n protected showSubPane(): void\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!_props.isPaneController)\r\n {\r\n return;\r\n }\r\n\r\n const value = Presentation.getValue(_props, null);\r\n const controlledPaneName = _props.controlledPaneKeysByValue![value];\r\n\r\n if (controlledPaneName)\r\n {\r\n PaperBase.show(controlledPaneName);\r\n }\r\n else\r\n {\r\n PaperBase.hideGroup(_props.controlledGroupName);\r\n }\r\n }\r\n\r\n public componentDidMount(): void\r\n {\r\n this.disposeObserve = autorun(() =>\r\n {\r\n this.showSubPane();\r\n });\r\n }\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.disposeObserve();\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n let rowKey = null;\r\n if (this.props.propagated?.parentTable)\r\n {\r\n // Widget is rendered in the vertical layout of a grid.\r\n rowKey = this.props.propagated.rowKey;\r\n }\r\n\r\n const row = PaneRow.get(this.props.dataId, rowKey);\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options = DomainComboBox.getOptions(\r\n this.props.options,\r\n runtimeProps.selectedValue,\r\n runtimeProps.selectedDisplayValue);\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DomainComboBox);\r\n","import { GetQuickFilterTextParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport ComboBoxOption from '../../coreui/ComboBoxOption';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Icon from '../../coreui/Icon';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellFocusUtil, FocusCellRendererParams }\r\n from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport PaneRow, { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { DomainComboBox } from '../DomainComboBox';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n options: ComboBoxOption[];\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isErrorBadgeOpen?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n}\r\n\r\n@observer\r\nexport class DomainComboBoxColumnDisplay extends\r\n React.Component\r\n{\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const row = params.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return '';\r\n }\r\n\r\n const props = params.colDef.cellRendererParams as ConfigProperties;\r\n\r\n const widget = row.getWidget(props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options = DomainComboBox.getOptions(\r\n props.options,\r\n runtimeProps.selectedValue,\r\n runtimeProps.selectedDisplayValue);\r\n\r\n const currentOption = options.find(o => o.value === widget.value);\r\n\r\n return currentOption ? currentOption.display : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n return runtimeData.filter(d => d.value).length.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = { isErrorBadgeOpen: false };\r\n\r\n CellFocusUtil.subscribeToCellKeyboardFocusedEvent(\r\n props, this.onCellFocus, this.onCellBlur);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellBlur = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n private onCloseErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onOpenErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n CellFocusUtil.unsubscribeToCellKeyboardFocusedEvent(\r\n this.props, this.onCellFocus, this.onCellBlur);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const row = this.props.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options = DomainComboBox.getOptions(\r\n this.props.options,\r\n runtimeProps.selectedValue,\r\n runtimeProps.selectedDisplayValue);\r\n\r\n let value = null;\r\n if (widget.value)\r\n {\r\n const currentOption = options.find(\r\n o => o.value === widget.value);\r\n value = currentOption ? currentOption.display : null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(\r\n this.props.eGridCell,\r\n runtimeProps.accessLevel <= AccessLevel.actionable);\r\n\r\n const errors: string[] = row.hasChanges(this.props.name)\r\n ? []\r\n : [...runtimeProps.businessErrors];\r\n\r\n let result: React.ReactNode = null;\r\n\r\n if (runtimeProps.accessLevel >= AccessLevel.enterable)\r\n {\r\n if (errors.length)\r\n {\r\n const table = this.props.propagated.parentTable;\r\n result =\r\n \r\n \r\n \r\n {value}\r\n \r\n
\r\n \r\n
\r\n \r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n \r\n \r\n {value}\r\n \r\n
\r\n \r\n
\r\n ;\r\n }\r\n }\r\n else\r\n {\r\n result =\r\n \r\n \r\n {value}\r\n \r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default DomainComboBoxColumnDisplay;\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport { ICellEditorParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport ComboBoxOption from '../../coreui/ComboBoxOption';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport Select, { Select as SelectBase, SelectProps } from '../../coreui/Select';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { DomainComboBox } from '../DomainComboBox';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataId: string;\r\n name: string;\r\n options: ComboBoxOption[];\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n}\r\n\r\n@observer\r\nexport class DomainComboBoxColumnEdit extends\r\n React.Component\r\n{\r\n private select: SelectBase;\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = { value: props.value };\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value: event.target.value });\r\n };\r\n\r\n private onClose = () =>\r\n {\r\n // Must be deferred to run after focus.\r\n setTimeout(\r\n () =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n const focusedCell = this.props.api!.getFocusedCell();\r\n\r\n parentTable.setStopEditingWhenGridLosesFocus(true);\r\n this.props.api!['rowRenderer'].stopEditing();\r\n this.props.api!.setFocusedCell(\r\n focusedCell.rowIndex,\r\n focusedCell.column,\r\n focusedCell.rowPinned);\r\n },\r\n 500);\r\n };\r\n\r\n private onFocus = () =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n parentTable.setStopEditingWhenGridLosesFocus(false);\r\n };\r\n\r\n public componentDidMount(): void\r\n {\r\n if (this.select)\r\n {\r\n // AutoFocus does not work for initial render.\r\n window.setTimeout(\r\n () =>\r\n {\r\n if (this.select)\r\n {\r\n const input: HTMLInputElement | null =\r\n this.props.eGridCell.querySelector('input');\r\n\r\n if (input)\r\n {\r\n // This is the div that hosts the select markup.\r\n input.previousSibling!['focus']();\r\n }\r\n\r\n this.select.open();\r\n }\r\n },\r\n 10);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.propagated.parentTable.setStopEditingWhenGridLosesFocus(true);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n return this.state.value === '' ? null : this.state.value!;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const row = this.props.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options = DomainComboBox.getOptions(\r\n this.props.options,\r\n runtimeProps.selectedValue,\r\n runtimeProps.selectedDisplayValue);\r\n\r\n const errors: string[] = row.hasChanges(this.props.name)\r\n ? []\r\n : [...runtimeProps.businessErrors];\r\n\r\n const table = this.props.propagated.parentTable;\r\n return (\r\n \r\n 0}\r\n hasOptions={options.length > 0}\r\n innerRef={\r\n (component: SelectBase) =>\r\n {\r\n this.select = component;\r\n }}\r\n MenuProps={{\r\n anchorOrigin: { horizontal: 'left', vertical: 'bottom' },\r\n getContentAnchorEl: undefined,\r\n }}\r\n onChange={this.onChange}\r\n onClose={this.onClose}\r\n onFocus={this.onFocus}\r\n SelectDisplayProps={\r\n {\r\n style:\r\n {\r\n lineHeight: `${this.props.node.rowHeight}px`,\r\n paddingBottom: 0,\r\n paddingLeft: 24,\r\n paddingTop: 0,\r\n },\r\n }}\r\n style={{\r\n cursor: 'pointer',\r\n display: 'flex',\r\n height: 'calc(100% + 2px)',\r\n }}\r\n value={this.state.value || ''}\r\n >\r\n {\r\n options.map(o => (\r\n ))\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default DomainComboBoxColumnEdit;\r\n","import * as React from 'react';\r\nimport Icon from '../../coreui/Icon';\r\nimport { FocusCellRendererParams } from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport PaneRow, { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n iconName: string;\r\n}\r\n\r\nexport class IconDisplayColumn extends\r\n React.PureComponent\r\n{\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.readOnly)\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties = Api.getWidgetProperties(\r\n this.props, this.props.data) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(this.props.eGridCell, true);\r\n\r\n if (runtimeProperties.accessLevel <= AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default IconDisplayColumn;\r\n","import { GetQuickFilterTextParams, ICellRendererParams }\r\n from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport * as Link from '../../coreui/Link';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n alternateText: string;\r\n dataId: string;\r\n header: string;\r\n iconName: string;\r\n linkType: 'External' | 'Internal';\r\n name: string;\r\n sortDescending: boolean;\r\n sortEnabled: boolean;\r\n width: number;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n anchorText: string;\r\n sortIndex: number | null;\r\n url: string;\r\n}\r\n\r\nexport class ManualLinkColumn extends\r\n React.PureComponent\r\n{\r\n private linkRef: HTMLButtonElement;\r\n protected muiProps: Link.LinkProps;\r\n\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const widgetProperties: object | null =\r\n Api.getWidgetProperties(\r\n { name: params.colDef.field },\r\n params.data);\r\n\r\n return widgetProperties ? widgetProperties['anchorText'] : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n for (const data of runtimeData)\r\n {\r\n const runtimeProperties = data.properties as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.actionable)\r\n {\r\n result += 1;\r\n }\r\n }\r\n\r\n return result.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n 'aria-label': props.alternateText,\r\n buttonRef: r => this.linkRef = r as HTMLButtonElement,\r\n focusRipple: false,\r\n iconName: props.iconName,\r\n tabIndex: -1,\r\n target: props.linkType === 'Internal' ? '_self' : '_blank',\r\n };\r\n\r\n CellUtil.setReadOnlyAttribute(props.eGridCell, true);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n props.eGridCell.addEventListener('focus', this.onCellFocus);\r\n }\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n if (this.linkRef)\r\n {\r\n this.linkRef.focus();\r\n }\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.eGridCell.removeEventListener('focus', this.onCellFocus);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props, _props.data) as RuntimeProperties;\r\n let text: React.ReactNode = null;\r\n let result: React.ReactNode = null;\r\n\r\n if (widgetProperties.anchorText)\r\n {\r\n text =\r\n \r\n {widgetProperties.anchorText}\r\n ;\r\n }\r\n\r\n switch (widgetProperties.accessLevel)\r\n {\r\n case AccessLevel.actionable:\r\n this.muiProps.href = widgetProperties.url;\r\n this.muiProps.children = text;\r\n\r\n result = ;\r\n break;\r\n case AccessLevel.readOnly:\r\n result = text;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n if (result)\r\n {\r\n result =\r\n \r\n {result}\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default ManualLinkColumn;\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport { ICellEditorParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport EditMask, { EditMask as EditMaskBase } from '../../coreui/EditMask';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Input from '../../coreui/Input';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport Api from '../Api';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataCase: 'lower' | 'UPPER' | 'Any';\r\n dataId: string;\r\n dataSize: number;\r\n editMask: string;\r\n maxSizeError: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n businessErrors: string[];\r\n}\r\n\r\n@observer\r\nexport class SLTextEditColumnEdit extends\r\n React.Component\r\n{\r\n private originalValue: string | null;\r\n protected inputElement: HTMLInputElement;\r\n\r\n public static getErrors(\r\n props: ConfigProperties,\r\n data: TrackableModel,\r\n value: string | null,\r\n editingValueHasChanged: boolean = false\r\n ): string[]\r\n {\r\n const widgetProperties =\r\n Api.getWidgetProperties(props, data) as RuntimeProperties;\r\n let result: string[];\r\n\r\n if (!widgetProperties)\r\n {\r\n return [];\r\n }\r\n\r\n if (data.hasChanges(props.name))\r\n {\r\n result = [];\r\n }\r\n else\r\n {\r\n result = [...widgetProperties.businessErrors];\r\n }\r\n\r\n if (props.dataSize && value && value.length > props.dataSize)\r\n {\r\n result.push(props.maxSizeError);\r\n }\r\n\r\n if (!editingValueHasChanged && props.editMask)\r\n {\r\n result = result.concat(\r\n EditMaskBase.getErrors(props.editMask, value));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static getInitialValue(params: ICellEditorParams): string | null\r\n {\r\n let updatedValue: string | null = null;\r\n\r\n // Backspace.\r\n if (params.keyPress === 8 && params.value)\r\n {\r\n updatedValue = String(params.value);\r\n\r\n updatedValue =\r\n updatedValue.substr(0, updatedValue.length - 1);\r\n }\r\n else\r\n {\r\n if (params.charPress)\r\n {\r\n if (params.value)\r\n {\r\n updatedValue = params.value + params.charPress;\r\n }\r\n else\r\n {\r\n updatedValue = params.charPress;\r\n }\r\n }\r\n else\r\n {\r\n updatedValue = params.value;\r\n }\r\n }\r\n\r\n return updatedValue;\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = { value: SLTextEditColumnEdit.getInitialValue(props) };\r\n\r\n this.originalValue = this.state.value!;\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n let value: string = event.target.value;\r\n\r\n switch (this.props.dataCase)\r\n {\r\n case 'lower':\r\n value = value.toLowerCase();\r\n break;\r\n case 'UPPER':\r\n value = value.toUpperCase();\r\n break;\r\n case 'Any':\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value });\r\n };\r\n\r\n private onMaskValueChange = (value: string) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value });\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n CellUtil.disableGridNavigation(\r\n this.props.eGridCell, this.inputElement);\r\n\r\n CellUtil.setInitialFocus(this.inputElement);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n CellUtil.enableGridNavigation(this.props.eGridCell);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n return this.state.value === '' ? null : this.state.value!;\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const value = this.state.value || '';\r\n\r\n const errors: string[] = SLTextEditColumnEdit.getErrors(\r\n _props,\r\n _props.node.data,\r\n value,\r\n this.state.value !== this.originalValue);\r\n\r\n let input: React.ReactNode;\r\n if (_props.editMask)\r\n {\r\n input = (\r\n this.inputElement = r}\r\n mask={_props.editMask}\r\n name={_props.name}\r\n onChange={this.onMaskValueChange}\r\n style={{ height: 'calc(100% + 2px)' }}\r\n value={value}\r\n />);\r\n }\r\n else\r\n {\r\n input = (\r\n 0}\r\n fullWidth={true}\r\n icon=\"fas fa-pencil\"\r\n iconColor={grey[300]}\r\n inputRef={r => this.inputElement = r}\r\n onChange={this.onChange}\r\n style={{ height: 'calc(100% + 2px)', paddingLeft: 2 }}\r\n value={value}\r\n />);\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n );\r\n }\r\n}\r\n\r\nexport default SLTextEditColumnEdit;\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { ICellEditorParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport Button from '../../coreui/Button';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Input from '../../coreui/Input';\r\nimport MultilineTextFieldDialog from '../../coreui/MultilineTextFieldDialog';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport Api from '../Api';\r\nimport { SLTextEditColumnEdit } from './SLTextEditColumnEdit';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataId: string;\r\n dataSize: number;\r\n maxSizeError: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isDialogOpen?: boolean;\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n businessErrors: string[];\r\n}\r\n\r\n@observer\r\nexport class MLTextEditColumnEdit extends\r\n React.Component\r\n{\r\n private inputElement: HTMLInputElement;\r\n private originalValue: string | null;\r\n\r\n public static getErrors(\r\n props: ConfigProperties,\r\n data: TrackableModel,\r\n value: string | null,\r\n editingValueHasChanged: boolean = false\r\n ): string[]\r\n {\r\n const widgetProperties =\r\n Api.getWidgetProperties(props, data) as RuntimeProperties;\r\n let result: string[];\r\n\r\n if (!widgetProperties)\r\n {\r\n return [];\r\n }\r\n\r\n if (data.hasChanges(props.name))\r\n {\r\n result = [];\r\n }\r\n else\r\n {\r\n result = [...widgetProperties.businessErrors];\r\n }\r\n\r\n if (props.dataSize && value && value.length > props.dataSize)\r\n {\r\n result.push(props.maxSizeError);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = {\r\n isDialogOpen: false,\r\n value: SLTextEditColumnEdit.getInitialValue(props),\r\n };\r\n\r\n this.originalValue = this.state.value!;\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent): void =>\r\n {\r\n this.setValue(event.target.value);\r\n };\r\n\r\n private onDialogAccept = (value: string): void =>\r\n {\r\n this.setValue(value);\r\n\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private onDialogCancel = (): void =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private onDialogExited = (): void =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n parentTable.setStopEditingWhenGridLosesFocus(true);\r\n };\r\n\r\n private onFocus = (event: React.FocusEvent): void =>\r\n {\r\n const textarea = event.target;\r\n textarea.setSelectionRange(\r\n textarea.value.length,\r\n textarea.value.length);\r\n textarea.scrollTop = textarea.scrollHeight;\r\n };\r\n\r\n private openDialog = (): void =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n parentTable.setStopEditingWhenGridLosesFocus(false);\r\n\r\n this.setState({ isDialogOpen: true });\r\n };\r\n\r\n private setValue(value: string): void\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value });\r\n }\r\n\r\n public componentDidMount(): void\r\n {\r\n CellUtil.disableGridNavigation(\r\n this.props.eGridCell,\r\n this.inputElement);\r\n\r\n CellUtil.setInitialFocus(this.inputElement);\r\n }\r\n\r\n public componentWillUnmount(): void\r\n {\r\n CellUtil.enableGridNavigation(this.props.eGridCell);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n return this.state.value === '' ? null : this.state.value!;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const value = this.state.value || '';\r\n\r\n const errors: string[] = MLTextEditColumnEdit.getErrors(\r\n this.props,\r\n this.props.node.data,\r\n value,\r\n this.state.value !== this.originalValue);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n error={errors.length > 0}\r\n fullWidth={true}\r\n icon=\"fas fa-pencil\"\r\n iconColor={grey[300]}\r\n inputProps={{\r\n onFocus: this.onFocus,\r\n style: { height: 23 },\r\n }}\r\n inputRef={r => this.inputElement = r}\r\n multiline\r\n onChange={this.onChange}\r\n style={{ height: 'calc(100% + 2px)', paddingLeft: 1 }}\r\n value={value}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default MLTextEditColumnEdit;\r\n","import * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n increment: number | null;\r\n justification: 'Left' | 'Right';\r\n label: string;\r\n maximum: number | null;\r\n maximumError: string | null;\r\n minimum: number | null;\r\n minimumError: string | null;\r\n name: string;\r\n scale: number | null;\r\n scaleError: string | null;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 33px)',\r\n },\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 33px) * 1.333)',\r\n },\r\n labelRootWithIncrementors:\r\n {\r\n width: 'calc(100% - 102px)',\r\n },\r\n labelShrinkWithIncrementors:\r\n {\r\n width: 'calc((100% - 102px) * 1.333)',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class NumericEdit extends\r\n React.Component>\r\n{\r\n public static readonly systemDecimalCharacter = '.';\r\n\r\n @observable private isFocused = false;\r\n private isFocusing = false;\r\n private muiProps: muiTextField.TextFieldProps;\r\n private updateValueInterval: number;\r\n\r\n private static addThousandsSeparators(value: string)\r\n {\r\n const parts = value.split(Sys.settings.decimalSeparator);\r\n let part1 = parts[0];\r\n const part2 = parts.length > 1 ? Sys.settings.decimalSeparator\r\n + parts[1] : '';\r\n const rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(part1))\r\n {\r\n part1 = part1.replace(rgx, `$1${Sys.settings.thousandsSeparator}$2`);\r\n }\r\n\r\n return part1 + part2;\r\n }\r\n\r\n private static round(value: number, decimals: number): string\r\n {\r\n // Use exponential notation to avoid rounding issues\r\n // https://stackoverflow.com/a/32178833\r\n const rounded = Math.round(Number(`${value}e${decimals}`));\r\n\r\n return Number(`${rounded}e-${decimals}`).toFixed(decimals);\r\n }\r\n\r\n public static formatNumericValue(\r\n value: number | null,\r\n userFormatted: boolean,\r\n scale: number | null)\r\n {\r\n if (value === null)\r\n {\r\n return null;\r\n }\r\n\r\n let formattedValue = scale !== null\r\n ? NumericEdit.round(value, scale)\r\n : value.toString();\r\n\r\n if (userFormatted)\r\n {\r\n formattedValue = formattedValue.replace(\r\n NumericEdit.systemDecimalCharacter,\r\n Sys.settings.decimalSeparator);\r\n formattedValue =\r\n NumericEdit.addThousandsSeparators(formattedValue);\r\n }\r\n\r\n return formattedValue;\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n autoFocus: props['autoFocus'],\r\n fullWidth: true,\r\n id: `numeric-edit-${Sys.nextId}`,\r\n InputProps: props['InputProps'] || {},\r\n label: props.label,\r\n name: props.name,\r\n variant: 'filled',\r\n };\r\n\r\n // Required so that when the help is an ul the dom is valid.\r\n this.muiProps.FormHelperTextProps =\r\n {\r\n component: 'div',\r\n style:\r\n {\r\n marginLeft: 16,\r\n marginRight: 16,\r\n },\r\n };\r\n\r\n this.muiProps.inputProps =\r\n {\r\n max: props.maximum,\r\n min: props.minimum,\r\n };\r\n\r\n this.muiProps.onChange = e => this.setValue(e);\r\n this.muiProps.onKeyDown = e => this.validateKeyPress(e);\r\n this.muiProps.onFocus = (e: React.FocusEvent) =>\r\n {\r\n if (this.isFocusing)\r\n {\r\n return;\r\n }\r\n\r\n const target = e.target;\r\n this.isFocused = true;\r\n this.isFocusing = true;\r\n\r\n // Firefox loses focus when re-rendering element, so re-focus it\r\n setTimeout(\r\n () =>\r\n {\r\n if (document.activeElement !== target)\r\n {\r\n target.focus();\r\n target.select();\r\n }\r\n this.isFocusing = false;\r\n },\r\n 100);\r\n };\r\n this.muiProps.onBlur = () =>\r\n {\r\n if (!this.isFocusing)\r\n {\r\n this.isFocused = false;\r\n this.setFormattedValue(this.getCurrentValueParsed());\r\n this.updateErrors();\r\n }\r\n };\r\n }\r\n\r\n private formatValue(value: number | null, userFormatted: boolean)\r\n {\r\n const scale: number = this.props.scale === null ? 0 : this.props.scale;\r\n return NumericEdit.formatNumericValue(value, userFormatted, scale);\r\n }\r\n\r\n private getCurrentValueParsed()\r\n {\r\n let value = Presentation.getValue(this.props);\r\n let parsed: number | null = null;\r\n\r\n if (value)\r\n {\r\n switch (typeof value)\r\n {\r\n case 'string':\r\n value = value.replace(\r\n Sys.settings.decimalSeparator,\r\n NumericEdit.systemDecimalCharacter);\r\n\r\n const regex = new RegExp(\r\n `\\\\${Sys.settings.thousandsSeparator}`, 'g');\r\n parsed = parseFloat(value.replace(regex, ''));\r\n if (isNaN(parsed))\r\n {\r\n parsed = null;\r\n }\r\n break;\r\n case 'number':\r\n parsed = value as number;\r\n break;\r\n default:\r\n throw new Error('Unexpected numeric edit value type '\r\n + `${typeof value}`);\r\n }\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n private increaseOrDecreaseValue(increase: boolean)\r\n {\r\n if (this.props.increment === null)\r\n {\r\n return;\r\n }\r\n\r\n let currentValue = this.getCurrentValueParsed();\r\n\r\n if (this.props.minimum !== null\r\n && (currentValue === null || currentValue < this.props.minimum))\r\n {\r\n currentValue = this.props.minimum;\r\n }\r\n else if (this.props.maximum !== null\r\n && (currentValue === null || currentValue > this.props.maximum))\r\n {\r\n currentValue = this.props.maximum;\r\n }\r\n else\r\n {\r\n currentValue = currentValue === null ? 0 : currentValue;\r\n currentValue =\r\n currentValue + this.props.increment * (increase ? 1 : -1);\r\n }\r\n\r\n if ((increase\r\n || this.props.minimum === null\r\n || currentValue >= this.props.minimum)\r\n &&\r\n (!increase\r\n || this.props.maximum === null\r\n || currentValue <= this.props.maximum))\r\n {\r\n this.setFormattedValue(currentValue);\r\n this.updateErrors();\r\n }\r\n }\r\n\r\n private setFormattedValue(value: number | null)\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, this.formatValue(value, false));\r\n }\r\n\r\n private setValue(event: React.ChangeEvent)\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, event.target.value);\r\n }\r\n\r\n private startIncreaseOrDecreaseValue(increase: boolean)\r\n {\r\n document.addEventListener(\r\n 'mouseup', this.stopIncreaseOrDecreaseValue);\r\n\r\n this.updateValueInterval = window.setInterval(\r\n () => this.increaseOrDecreaseValue(increase),\r\n 250);\r\n }\r\n\r\n private stopIncreaseOrDecreaseValue = () =>\r\n {\r\n document.removeEventListener('mouseup', this.stopIncreaseOrDecreaseValue);\r\n clearInterval(this.updateValueInterval);\r\n };\r\n\r\n private updateErrors()\r\n {\r\n const currentValue = this.getCurrentValueParsed();\r\n const widgetProperties = Api.getWidgetProperties(this.props);\r\n\r\n if (!widgetProperties)\r\n {\r\n return;\r\n }\r\n\r\n const businessErrors = widgetProperties['businessErrors'];\r\n\r\n let index = businessErrors.indexOf(this.props.minimumError!);\r\n if (this.props.minimum !== null\r\n && currentValue !== null && currentValue < this.props.minimum)\r\n {\r\n if (index < 0)\r\n {\r\n businessErrors.push(this.props.minimumError!);\r\n }\r\n }\r\n else if (index >= 0)\r\n {\r\n businessErrors.splice(index, 1);\r\n }\r\n\r\n index = businessErrors.indexOf(this.props.maximumError!);\r\n if (this.props.maximum !== null\r\n && currentValue !== null && currentValue > this.props.maximum)\r\n {\r\n if (index < 0)\r\n {\r\n businessErrors.push(this.props.maximumError!);\r\n }\r\n }\r\n else if (index >= 0)\r\n {\r\n businessErrors.splice(index, 1);\r\n }\r\n\r\n index = businessErrors.indexOf(this.props.scaleError!);\r\n if (this.props.increment !== null)\r\n {\r\n const scale = this.props.scale !== null ?\r\n Math.pow(10, this.props.scale) : 1;\r\n\r\n if (currentValue !== null\r\n && (Math.round(currentValue * scale) %\r\n (this.props.increment * scale)) / scale !== 0)\r\n {\r\n if (index < 0)\r\n {\r\n businessErrors.push(this.props.scaleError!);\r\n }\r\n }\r\n else if (index >= 0)\r\n {\r\n businessErrors.splice(index, 1);\r\n }\r\n }\r\n\r\n widgetProperties['businessErrors'] = businessErrors;\r\n }\r\n\r\n private validateKeyPress(event: React.KeyboardEvent)\r\n {\r\n if (!event.key\r\n || (event.target as HTMLElement).tagName !== 'INPUT')\r\n {\r\n return;\r\n }\r\n\r\n const validCharacters = [\r\n Sys.settings.thousandsSeparator, Sys.settings.decimalSeparator, '-'];\r\n for (let i = 0; i <= 9; i++)\r\n {\r\n validCharacters.push(i.toString());\r\n }\r\n\r\n const isControlChar = event.key.length > 1;\r\n if (!event.ctrlKey && !isControlChar\r\n && validCharacters.indexOf(event.key) < 0)\r\n {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.disabled = false;\r\n this.muiProps.InputProps!.endAdornment = undefined;\r\n this.muiProps.required = false;\r\n this.muiProps.style = undefined;\r\n\r\n // Number type doesn't support international number characters (space\r\n // and comma), tel type iphone keypad doesn't support the decimal character\r\n this.muiProps.type = 'text';\r\n\r\n this.muiProps.inputProps!.style =\r\n {\r\n textAlign: Api.getAlignment(_props.justification),\r\n };\r\n\r\n if (Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.helperText = null;\r\n this.muiProps.value = '';\r\n\r\n if (widgetProperties.showDisabledHelp)\r\n {\r\n result =\r\n \r\n \r\n ;\r\n }\r\n else\r\n {\r\n result = ;\r\n }\r\n }\r\n else if (_props['readOnly'])\r\n {\r\n const value = this.formatValue(this.getCurrentValueParsed(), true);\r\n\r\n result =\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {value ? value : '-'}\r\n \r\n
;\r\n }\r\n else\r\n {\r\n const parsedValue = this.getCurrentValueParsed();\r\n\r\n if (_props.increment !== null)\r\n {\r\n const canDecrement = parsedValue === null\r\n || _props.minimum === null\r\n || parsedValue - _props.increment >= _props.minimum;\r\n const canIncrement = parsedValue === null\r\n || _props.maximum === null\r\n || parsedValue + _props.increment <= _props.maximum;\r\n\r\n this.muiProps.InputProps!.endAdornment =\r\n (\r\n \r\n \r\n \r\n this.increaseOrDecreaseValue(false)}\r\n onMouseDown={() =>\r\n this.startIncreaseOrDecreaseValue(false)}\r\n size=\"small\"\r\n />\r\n \r\n this.increaseOrDecreaseValue(true)}\r\n onMouseDown={() =>\r\n this.startIncreaseOrDecreaseValue(true)}\r\n size=\"small\"\r\n style={{ marginLeft: 8 }}\r\n />\r\n \r\n \r\n );\r\n }\r\n\r\n this.muiProps.required = widgetProperties.showAsMandatory;\r\n\r\n const businessErrors: string[] =\r\n [...widgetProperties.businessErrors];\r\n Api.setHelperText(this, businessErrors, this.muiProps);\r\n\r\n let formatted: string | null;\r\n if (this.isFocused)\r\n {\r\n formatted = Presentation.getValue(this.props).replace(\r\n NumericEdit.systemDecimalCharacter,\r\n Sys.settings.decimalSeparator);\r\n }\r\n else\r\n {\r\n formatted = this.formatValue(parsedValue, true);\r\n }\r\n this.muiProps.value = formatted === null ? '' : formatted;\r\n\r\n result =\r\n ;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(NumericEdit);\r\n","import { GetQuickFilterTextParams, ICellRendererParams }\r\n from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { RuntimeWidget } from '../../models/PaneRow';\r\nimport { NumericEdit } from '../NumericEdit';\r\nimport { FunctionName } from '../TableSummary';\r\nimport TextColumn from './TextColumn';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n dataId: string;\r\n justification: 'Left' | 'Right';\r\n name: string;\r\n propagated: TableChildProps;\r\n scale: number | null;\r\n}\r\n\r\nexport class NumericEditColumn extends\r\n React.PureComponent\r\n{\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n if (!params.value)\r\n {\r\n return '';\r\n }\r\n\r\n const parsed = parseFloat(params.value);\r\n const scale = params.colDef.cellRendererParams.scale || null;\r\n const filter = NumericEdit.formatNumericValue(parsed, true, scale);\r\n\r\n return filter !== null ? filter : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n let result = 0;\r\n let count = 0;\r\n let isFirst = true;\r\n for (const data of runtimeData)\r\n {\r\n if (data.value === null)\r\n {\r\n continue;\r\n }\r\n if (typeof (data.value) !== 'string')\r\n {\r\n throw new Error(`Unexpected data type ${typeof (data.value)}`);\r\n }\r\n\r\n const value: number = parseFloat(data.value);\r\n\r\n switch (functionName)\r\n {\r\n case 'Average':\r\n result += value;\r\n count += 1;\r\n break;\r\n case 'Count':\r\n count += 1;\r\n break;\r\n case 'Maximum':\r\n result = isFirst || value > result ? value : result;\r\n isFirst = false;\r\n break;\r\n case 'Minimum':\r\n result = isFirst || value < result ? value : result;\r\n isFirst = false;\r\n break;\r\n case 'Sum':\r\n result += value;\r\n break;\r\n default:\r\n throw new Error(`Unknown summary function ${functionName}`);\r\n }\r\n }\r\n\r\n if (functionName === 'Count')\r\n {\r\n return count.toString();\r\n }\r\n\r\n if (functionName === 'Average' && count > 0)\r\n {\r\n result = result / count;\r\n }\r\n\r\n return NumericEdit.formatNumericValue(\r\n result,\r\n true,\r\n configProperties.scale);\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n _props.value = NumericEdit.formatNumericValue(\r\n _props.value ? parseFloat(_props.value) : null,\r\n true,\r\n _props.scale);\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default NumericEditColumn;\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { ICellEditorParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport Button from '../../coreui/Button';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Input, { InputProps } from '../../coreui/Input';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport Api from '../Api';\r\nimport { NumericEdit } from '../NumericEdit';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataId: string;\r\n increment: number | null;\r\n justification: 'Left' | 'Right';\r\n maximum: number | null;\r\n maximumError: string | null;\r\n minimum: number | null;\r\n minimumError: string | null;\r\n name: string;\r\n propagated: TableChildProps;\r\n scale: number | null;\r\n scaleError: string | null;\r\n}\r\n\r\ninterface State\r\n{\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n businessErrors: string[];\r\n}\r\n\r\n@observer\r\nexport class NumericEditColumnEdit extends\r\n React.Component\r\n{\r\n private updateValue: boolean;\r\n protected inputElement: HTMLInputElement;\r\n protected muiProps: InputProps;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private static getCurrentValueParsed(value: any)\r\n {\r\n let parsed: number | null = null;\r\n\r\n if (value)\r\n {\r\n switch (typeof value)\r\n {\r\n case 'string':\r\n const cleaned = value.replace(\r\n Sys.settings.decimalSeparator,\r\n NumericEdit.systemDecimalCharacter);\r\n\r\n const regex = new RegExp(\r\n `\\\\${Sys.settings.thousandsSeparator}`, 'g');\r\n parsed = parseFloat(cleaned.replace(regex, ''));\r\n if (isNaN(parsed))\r\n {\r\n parsed = null;\r\n }\r\n break;\r\n case 'number':\r\n parsed = value as number;\r\n break;\r\n default:\r\n throw new Error('Unexpected numeric edit value type '\r\n + `${typeof value}`);\r\n }\r\n }\r\n\r\n return parsed;\r\n }\r\n\r\n public static getErrors(\r\n props: ConfigProperties,\r\n data: TrackableModel,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any): string[]\r\n {\r\n const widgetProperties =\r\n Api.getWidgetProperties(props, data) as RuntimeProperties;\r\n let result: string[];\r\n\r\n if (!widgetProperties)\r\n {\r\n return [];\r\n }\r\n\r\n if (data.hasChanges(props.name))\r\n {\r\n result = [];\r\n }\r\n else\r\n {\r\n result = [...widgetProperties.businessErrors];\r\n }\r\n\r\n const parsedValue = NumericEditColumnEdit.getCurrentValueParsed(value);\r\n\r\n if (parsedValue !== null)\r\n {\r\n if (props.minimum !== null && parsedValue < props.minimum)\r\n {\r\n result.push(props.minimumError!);\r\n }\r\n\r\n if (props.maximum !== null && parsedValue > props.maximum)\r\n {\r\n result.push(props.maximumError!);\r\n }\r\n\r\n if (props.increment !== null)\r\n {\r\n const scale = props.scale !== null ?\r\n Math.pow(10, props.scale) : 1;\r\n if ((Math.round(parsedValue * scale) %\r\n (props.increment * scale)) / scale !== 0)\r\n {\r\n result.push(props.scaleError!);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n // Backspace.\r\n if (props.keyPress === 8 && props.value)\r\n {\r\n let value = String(props.value);\r\n\r\n value = value.substr(0, value.length - 1);\r\n this.state = { value };\r\n }\r\n else\r\n {\r\n const regex = new RegExp(\r\n // eslint-disable-next-line max-len\r\n `[\\\\${Sys.settings.decimalSeparator}\\\\${Sys.settings.thousandsSeparator}\\\\-0-9]`, 'g');\r\n\r\n if (props.charPress && regex.test(props.charPress))\r\n {\r\n if (props.value)\r\n {\r\n this.state = { value: props.value + props.charPress };\r\n }\r\n else\r\n {\r\n this.state = { value: props.charPress };\r\n }\r\n }\r\n else\r\n {\r\n this.state = { value: props.value };\r\n }\r\n }\r\n\r\n this.muiProps =\r\n {\r\n autoFocus: true,\r\n fullWidth: true,\r\n icon: 'fas fa-pencil',\r\n iconColor: grey[300],\r\n inputProps:\r\n {\r\n max: props.maximum,\r\n min: props.minimum,\r\n },\r\n justification: props.justification,\r\n };\r\n\r\n this.muiProps.inputRef = (element) =>\r\n {\r\n this.inputElement = element;\r\n };\r\n\r\n this.muiProps.onChange = (e) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value: e.target.value });\r\n };\r\n this.muiProps.onKeyDown = e => this.validateKeyPress(e);\r\n this.muiProps.style = { height: 'calc(100% + 2px)', paddingLeft: 2 };\r\n }\r\n\r\n private formatValue(value: number | null, userFormatted: boolean)\r\n {\r\n return NumericEdit.formatNumericValue(\r\n value,\r\n userFormatted,\r\n this.props.scale);\r\n }\r\n\r\n private handleIncreaseOrDecreaseValue(increase: boolean)\r\n {\r\n if (this.updateValue)\r\n {\r\n this.increaseOrDecreaseValue(increase);\r\n\r\n setTimeout(\r\n () =>\r\n {\r\n this.handleIncreaseOrDecreaseValue(increase);\r\n },\r\n 150);\r\n }\r\n }\r\n\r\n private increaseOrDecreaseValue(increase: boolean)\r\n {\r\n if (this.props.increment === null)\r\n {\r\n return;\r\n }\r\n\r\n let currentValue =\r\n NumericEditColumnEdit.getCurrentValueParsed(this.muiProps.value);\r\n\r\n if (this.props.minimum !== null && (currentValue === null\r\n || currentValue < this.props.minimum))\r\n {\r\n currentValue = this.props.minimum;\r\n }\r\n else if (this.props.maximum !== null && (currentValue === null\r\n || currentValue > this.props.maximum))\r\n {\r\n currentValue = this.props.maximum;\r\n }\r\n else\r\n {\r\n currentValue = currentValue || 0;\r\n currentValue =\r\n currentValue + this.props.increment * (increase ? 1 : -1);\r\n }\r\n\r\n if ((increase\r\n || this.props.minimum === null\r\n || currentValue >= this.props.minimum)\r\n &&\r\n (!increase\r\n || this.props.maximum === null\r\n || currentValue <= this.props.maximum))\r\n {\r\n this.setFormattedValue(currentValue);\r\n }\r\n\r\n if ((this.props.minimum !== null\r\n && currentValue !== undefined\r\n && currentValue\r\n < this.props.minimum + this.props.increment!)\r\n || (this.props.maximum !== null\r\n && currentValue !== undefined\r\n && currentValue\r\n > this.props.maximum - this.props.increment!))\r\n {\r\n this.updateValue = false;\r\n\r\n if (this.inputElement)\r\n {\r\n this.inputElement.focus();\r\n }\r\n else\r\n {\r\n this.props.api!.startEditingCell(\r\n {\r\n colKey: this.props.column.getColId(),\r\n rowIndex: this.props.rowIndex,\r\n });\r\n }\r\n }\r\n }\r\n\r\n private onMouseUp = () =>\r\n {\r\n this.updateValue = false;\r\n window.removeEventListener('mouseup', this.onMouseUp);\r\n };\r\n\r\n private setFormattedValue(value: number | null)\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value: this.formatValue(value, false) });\r\n }\r\n\r\n private startIncreaseOrDecreaseValue(increase: boolean)\r\n {\r\n this.updateValue = true;\r\n\r\n window.addEventListener('mouseup', this.onMouseUp);\r\n\r\n setTimeout(\r\n () =>\r\n {\r\n this.handleIncreaseOrDecreaseValue(increase);\r\n },\r\n 250);\r\n }\r\n\r\n private validateKeyPress(event: React.KeyboardEvent)\r\n {\r\n if (!event.key)\r\n {\r\n return;\r\n }\r\n\r\n const validCharacters = [\r\n Sys.settings.thousandsSeparator, Sys.settings.decimalSeparator, '-'];\r\n for (let i = 0; i <= 9; i++)\r\n {\r\n validCharacters.push(i.toString());\r\n }\r\n\r\n const isControlChar = event.key.length > 1;\r\n if (!event.ctrlKey && !isControlChar\r\n && validCharacters.indexOf(event.key) < 0)\r\n {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n CellUtil.disableGridNavigation(\r\n this.props.eGridCell, this.inputElement);\r\n\r\n CellUtil.setInitialFocus(this.inputElement);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n CellUtil.enableGridNavigation(this.props.eGridCell);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n this.updateValue = false;\r\n\r\n return this.formatValue(\r\n NumericEditColumnEdit.getCurrentValueParsed(this.state.value), false);\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n this.muiProps.value = this.state.value || '';\r\n\r\n const errors: string[] = NumericEditColumnEdit.getErrors(\r\n _props, _props.node.data, this.muiProps.value);\r\n\r\n this.muiProps.error = errors.length > 0;\r\n\r\n const parsedValue = NumericEditColumnEdit.getCurrentValueParsed(\r\n this.muiProps.value);\r\n\r\n if (_props.increment !== null)\r\n {\r\n const canDecrement = parsedValue === null\r\n || _props.minimum === null\r\n || parsedValue - _props.increment >= _props.minimum;\r\n const canIncrement = parsedValue === null\r\n || _props.maximum === null\r\n || parsedValue + _props.increment <= _props.maximum;\r\n\r\n this.muiProps.endAdornment =\r\n (\r\n \r\n \r\n \r\n this.increaseOrDecreaseValue(false)}\r\n onMouseDown={() =>\r\n this.startIncreaseOrDecreaseValue(false)}\r\n />\r\n \r\n this.increaseOrDecreaseValue(true)}\r\n onMouseDown={() =>\r\n this.startIncreaseOrDecreaseValue(true)}\r\n />\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default NumericEditColumnEdit;\r\n","import { GetQuickFilterTextParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport ComboBoxOption from '../../coreui/ComboBoxOption';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport Icon from '../../coreui/Icon';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport { CellFocusUtil, FocusCellRendererParams }\r\n from '../../coreui/table/CellFocusUtil';\r\nimport { CellUtil } from '../../coreui/table/CellUtil';\r\nimport PaneRow, { RuntimeWidget } from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\nimport { FunctionName } from '../TableSummary';\r\n\r\ninterface ConfigProperties extends FocusCellRendererParams\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n isErrorBadgeOpen?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n}\r\n\r\n@observer\r\nexport class RelationshipComboBoxColumnDisplay extends\r\n React.Component\r\n{\r\n public static getQuickFilterText(params: GetQuickFilterTextParams): string\r\n {\r\n const row = params.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return '';\r\n }\r\n\r\n const props = params.colDef.cellRendererParams as ConfigProperties;\r\n\r\n const widget = row.getWidget(props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const selectedOption: ComboBoxOption =\r\n {\r\n display: runtimeProps.selectedDisplayValue,\r\n value: runtimeProps.selectedValue,\r\n };\r\n\r\n const table = props.propagated.parentTable;\r\n const options = table.getRelationshipComboBoxOptions(\r\n props.name,\r\n selectedOption);\r\n\r\n const currentOption = options.find(o => o.value === widget.value);\r\n\r\n return currentOption ? currentOption.display : '';\r\n }\r\n\r\n public static getSummaryValue(\r\n runtimeData: RuntimeWidget[],\r\n configProperties: ConfigProperties,\r\n functionName: FunctionName\r\n ): string | null\r\n {\r\n return runtimeData.filter(d => d.value).length.toString();\r\n }\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = { isErrorBadgeOpen: false };\r\n\r\n CellFocusUtil.subscribeToCellKeyboardFocusedEvent(\r\n props, this.onCellFocus, this.onCellBlur);\r\n props.eGridCell.addEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n private onCellBlur = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onCellFocus = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n private onCellKeyDown = (event: KeyboardEvent): void =>\r\n {\r\n CellUtil.customizeGridNavigation(event, this.props);\r\n };\r\n\r\n private onCloseErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: false });\r\n };\r\n\r\n private onOpenErrorBadge = (): void =>\r\n {\r\n this.setState({ isErrorBadgeOpen: true });\r\n };\r\n\r\n public componentWillUnmount(): void\r\n {\r\n CellFocusUtil.unsubscribeToCellKeyboardFocusedEvent(\r\n this.props, this.onCellFocus, this.onCellBlur);\r\n this.props.eGridCell.removeEventListener('keydown', this.onCellKeyDown);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const row = this.props.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const selectedOption: ComboBoxOption =\r\n {\r\n display: runtimeProps.selectedDisplayValue,\r\n value: runtimeProps.selectedValue,\r\n };\r\n\r\n const table = this.props.propagated.parentTable;\r\n const options = table.getRelationshipComboBoxOptions(\r\n this.props.name,\r\n selectedOption);\r\n\r\n let value = null;\r\n if (widget.value)\r\n {\r\n const currentOption = options.find(o => o.value === widget.value);\r\n value = currentOption ? currentOption.display : null;\r\n }\r\n\r\n CellUtil.setReadOnlyAttribute(\r\n this.props.eGridCell,\r\n runtimeProps.accessLevel <= AccessLevel.actionable);\r\n\r\n const errors: string[] = row.hasChanges(this.props.name)\r\n ? []\r\n : [...runtimeProps.businessErrors];\r\n\r\n let result: React.ReactNode = null;\r\n\r\n if (runtimeProps.accessLevel >= AccessLevel.enterable)\r\n {\r\n if (errors.length)\r\n {\r\n result =\r\n \r\n \r\n \r\n {value}\r\n \r\n
\r\n \r\n
\r\n \r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n \r\n \r\n {value}\r\n \r\n
\r\n \r\n
\r\n ;\r\n }\r\n }\r\n else\r\n {\r\n result =\r\n \r\n \r\n {value}\r\n \r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default RelationshipComboBoxColumnDisplay;\r\n","import { ICellEditorParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport ComboBoxOption from '../../coreui/ComboBoxOption';\r\nimport ErrorBadge from '../../coreui/ErrorBadge';\r\nimport MenuItem from '../../coreui/MenuItem';\r\nimport Select, { Select as SelectBase } from '../../coreui/Select';\r\nimport { TableChildProps } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport Api, { AccessLevel } from '../Api';\r\n\r\ninterface ConfigProperties extends ICellEditorParams\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n value?: string | null;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n}\r\n\r\n@observer\r\nexport class RelationshipComboBoxColumnEdit extends\r\n React.Component\r\n{\r\n private select: SelectBase;\r\n\r\n public constructor(props: ConfigProperties)\r\n {\r\n super(props);\r\n\r\n this.state = { value: props.value };\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name, this.props.data.rowKey);\r\n this.setState({ value: event.target.value });\r\n };\r\n\r\n private onClose = () =>\r\n {\r\n // Must be deferred to run after focus.\r\n setTimeout(\r\n () =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n const focusedCell = this.props.api!.getFocusedCell();\r\n\r\n parentTable.setStopEditingWhenGridLosesFocus(true);\r\n this.props.api!['rowRenderer'].stopEditing();\r\n this.props.api!.setFocusedCell(\r\n focusedCell.rowIndex,\r\n focusedCell.column,\r\n focusedCell.rowPinned);\r\n },\r\n 500);\r\n };\r\n\r\n private onFocus = () =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n parentTable.setStopEditingWhenGridLosesFocus(false);\r\n };\r\n\r\n public componentDidMount(): void\r\n {\r\n if (this.select)\r\n {\r\n // AutoFocus does not work for initial render.\r\n window.setTimeout(\r\n () =>\r\n {\r\n if (this.select)\r\n {\r\n const input: HTMLInputElement | null =\r\n this.props.eGridCell.querySelector('input');\r\n\r\n if (input)\r\n {\r\n // This is the div that hosts the select markup.\r\n input.previousSibling!['focus']();\r\n }\r\n\r\n this.select.open();\r\n }\r\n },\r\n 10);\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void\r\n {\r\n this.props.propagated.parentTable.setStopEditingWhenGridLosesFocus(true);\r\n }\r\n\r\n public getValue(): string | null\r\n {\r\n return this.state.value === '' ? null : this.state.value!;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const row = this.props.node.data as PaneRow | null;\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const selectedOption: ComboBoxOption =\r\n {\r\n display: runtimeProps.selectedDisplayValue,\r\n value: runtimeProps.selectedValue,\r\n };\r\n\r\n const table = this.props.propagated.parentTable;\r\n const options = table.getRelationshipComboBoxOptions(\r\n this.props.name,\r\n selectedOption);\r\n\r\n const errors: string[] = row.hasChanges(this.props.name)\r\n ? []\r\n : [...runtimeProps.businessErrors];\r\n\r\n return (\r\n \r\n 0}\r\n hasOptions={options.length > 0}\r\n innerRef={\r\n (component: SelectBase) =>\r\n {\r\n this.select = component;\r\n }}\r\n MenuProps={{\r\n anchorOrigin: { horizontal: 'left', vertical: 'bottom' },\r\n getContentAnchorEl: undefined,\r\n }}\r\n onChange={this.onChange}\r\n onClose={this.onClose}\r\n onFocus={this.onFocus}\r\n SelectDisplayProps={\r\n {\r\n style:\r\n {\r\n lineHeight: `${this.props.node.rowHeight}px`,\r\n paddingBottom: 0,\r\n paddingLeft: 24,\r\n paddingTop: 0,\r\n },\r\n }}\r\n style={{\r\n cursor: 'pointer',\r\n display: 'flex',\r\n height: 'calc(100% + 2px)',\r\n }}\r\n value={this.state.value || ''}\r\n >\r\n {\r\n options.map(o => (\r\n ))\r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default RelationshipComboBoxColumnEdit;\r\n","import { ColDef, Column, ColumnApi, RowNode } from 'ag-grid-community';\r\n\r\nimport\r\n{\r\n CellClassParams,\r\n GetQuickFilterTextParams,\r\n IsColumnFuncParams,\r\n ValueGetterParams,\r\n ValueSetterParams,\r\n} from 'ag-grid-community/dist/lib/entities/colDef';\r\n\r\nimport { TableChildProps, TableContext } from '../../coreui/Table';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport Api, { AccessLevel, ConfigProps } from '../Api';\r\nimport CheckBoxColumn, { CheckBoxColumn as CheckBoxColumnBase }\r\n from './CheckBoxColumn';\r\nimport ComponentTypeDisplayColumn from './ComponentTypeDisplayColumn';\r\nimport DataImageDisplayColumn from './DataImageDisplayColumn';\r\nimport DataLinkColumn from './DataLinkColumn';\r\nimport DateEditColumn from './DateEditColumn';\r\nimport DateEditColumnEdit from './DateEditColumnEdit';\r\nimport DomainComboBoxColumnDisplay from './DomainComboBoxColumnDisplay';\r\nimport DomainComboBoxColumnEdit from './DomainComboBoxColumnEdit';\r\nimport IconDisplayColumn from './IconDisplayColumn';\r\nimport ManualLinkColumn from './ManualLinkColumn';\r\nimport MLTextEditColumnEdit from './MLTextEditColumnEdit';\r\nimport NumericEditColumn from './NumericEditColumn';\r\nimport NumericEditColumnEdit from './NumericEditColumnEdit';\r\nimport RelationshipComboBoxColumnDisplay\r\n from './RelationshipComboBoxColumnDisplay';\r\nimport RelationshipComboBoxColumnEdit from './RelationshipComboBoxColumnEdit';\r\nimport SLTextEditColumnEdit from './SLTextEditColumnEdit';\r\nimport TextColumn, { TextColumn as TextColumnBase } from './TextColumn';\r\n\r\ninterface CellWidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\nexport interface GridColumnConfigProperties\r\n{\r\n flex: boolean;\r\n header: string;\r\n lg: boolean;\r\n md: boolean;\r\n name: string;\r\n required: boolean;\r\n sm: boolean;\r\n sortDescending: boolean;\r\n sortEnabled: boolean;\r\n widgetProps: object;\r\n widgetType: string;\r\n width?: number;\r\n xs: boolean;\r\n}\r\n\r\nexport default class GridColumn\r\n{\r\n public static suppressEdit: boolean = false;\r\n\r\n private static comparator(\r\n column: GridColumnConfigProperties,\r\n rowA: PaneRow,\r\n rowB: PaneRow): number\r\n {\r\n const widgetPropertiesA = rowA.getWidget(column.name).properties;\r\n const sortIndexA = widgetPropertiesA['sortIndex'] as number;\r\n\r\n const widgetPropertiesB = rowB.getWidget(column.name).properties;\r\n const sortIndexB = widgetPropertiesB['sortIndex'] as number;\r\n\r\n return sortIndexA - sortIndexB;\r\n }\r\n\r\n private static getColumnHeaderClass = (\r\n params: CellClassParams,\r\n columns: GridColumnConfigProperties[],\r\n configProps: ConfigProps\r\n ): string =>\r\n {\r\n const column: GridColumnConfigProperties | undefined =\r\n columns.find(c => c.name === params.colDef.colId);\r\n const showRightBorder: boolean =\r\n GridColumn.shouldShowRightBorderOnColumn(params);\r\n const isRight: boolean =\r\n !!column && column.widgetProps['justification'] === 'Right';\r\n\r\n const runtimeProperties =\r\n Api.getWidgetProperties(configProps) as {accessLevel: AccessLevel};\r\n\r\n const parentGridIsReadOnly =\r\n runtimeProperties.accessLevel <= AccessLevel.readOnly;\r\n const required = column && column.required && !parentGridIsReadOnly;\r\n return (required ? 'cx-header-required ' : '')\r\n + (showRightBorder ? '' : 'cx-header-last ')\r\n + (isRight ? 'cx-header-right ' : '');\r\n };\r\n\r\n private static isColumnEditable(\r\n params: IsColumnFuncParams, column: GridColumnConfigProperties)\r\n {\r\n // Error badge must suppress editing on click.\r\n if (!params.colDef.field\r\n || column.widgetType === 'CheckBoxColumn'\r\n || GridColumn.suppressEdit)\r\n {\r\n GridColumn.suppressEdit = false;\r\n\r\n return false;\r\n }\r\n\r\n const props = column.widgetProps;\r\n const runtimeProperties =\r\n Api.getWidgetProperties(props, params.data) as CellWidgetProperties;\r\n\r\n return runtimeProperties.accessLevel >= AccessLevel.enterable;\r\n }\r\n\r\n private static shouldShowRightBorderOnColumn(\r\n params: CellClassParams\r\n ): boolean\r\n {\r\n const context = params.context as TableContext;\r\n let visibleCols = context.getColumnApi().getDisplayedCenterColumns(\r\n ).filter(c => c.getColId() !== '_fillerFixed');\r\n\r\n // If there is a horizontal scroll bar on the table, don't show the\r\n // filler column border\r\n if (context.hasHorizontalScrollBar())\r\n {\r\n visibleCols = visibleCols.filter(c => c.getColId() !== '_filler');\r\n }\r\n\r\n const lastColumn: Column | null =\r\n visibleCols.length > 0 ? visibleCols[visibleCols.length - 1] : null;\r\n\r\n return !!lastColumn && lastColumn.getColId() !== params.colDef.colId!;\r\n }\r\n\r\n public static getColumnDef(\r\n column: GridColumnConfigProperties,\r\n allColumns: GridColumnConfigProperties[],\r\n propagated: TableChildProps\r\n ): ColDef\r\n {\r\n const cellHorizontalPadding: number = 48;\r\n let editorComponent: object | null = null;\r\n let minWidth = 60;\r\n let getQuickFilterText: (params: GetQuickFilterTextParams) => string;\r\n let rendererComponent: object | null = null;\r\n\r\n switch (column.widgetType)\r\n {\r\n case 'CheckBoxColumn':\r\n rendererComponent = CheckBoxColumn;\r\n getQuickFilterText = CheckBoxColumnBase.getQuickFilterText;\r\n break;\r\n case 'ComponentTypeDisplayColumn':\r\n rendererComponent = ComponentTypeDisplayColumn;\r\n getQuickFilterText = ComponentTypeDisplayColumn.getQuickFilterText;\r\n break;\r\n case 'DataImageDisplayColumn':\r\n rendererComponent = DataImageDisplayColumn;\r\n getQuickFilterText = () => { return ''; };\r\n minWidth = column.widgetProps['imageWidth']\r\n + cellHorizontalPadding;\r\n break;\r\n case 'DataLinkColumn':\r\n rendererComponent = DataLinkColumn;\r\n getQuickFilterText = DataLinkColumn.getQuickFilterText;\r\n break;\r\n case 'DateEditColumn':\r\n rendererComponent = DateEditColumn;\r\n editorComponent = DateEditColumnEdit;\r\n getQuickFilterText = DateEditColumnEdit.getQuickFilterText;\r\n break;\r\n case 'DomainComboBoxColumn':\r\n rendererComponent = DomainComboBoxColumnDisplay;\r\n editorComponent = DomainComboBoxColumnEdit;\r\n getQuickFilterText =\r\n DomainComboBoxColumnDisplay.getQuickFilterText;\r\n break;\r\n case 'IconDisplayColumn':\r\n rendererComponent = IconDisplayColumn;\r\n getQuickFilterText = () => { return ''; };\r\n minWidth = cellHorizontalPadding + 16;\r\n break;\r\n case 'ManualLinkColumn':\r\n rendererComponent = ManualLinkColumn;\r\n getQuickFilterText = ManualLinkColumn.getQuickFilterText;\r\n break;\r\n case 'MLTextEditColumn':\r\n rendererComponent = TextColumn;\r\n editorComponent = MLTextEditColumnEdit;\r\n getQuickFilterText = TextColumnBase.getQuickFilterText;\r\n break;\r\n case 'NumericEditColumn':\r\n rendererComponent = NumericEditColumn;\r\n editorComponent = NumericEditColumnEdit;\r\n getQuickFilterText = NumericEditColumn.getQuickFilterText;\r\n break;\r\n case 'RelationshipComboBoxColumn':\r\n rendererComponent = RelationshipComboBoxColumnDisplay;\r\n editorComponent = RelationshipComboBoxColumnEdit;\r\n getQuickFilterText =\r\n RelationshipComboBoxColumnDisplay.getQuickFilterText;\r\n break;\r\n case 'SLTextEditColumn':\r\n rendererComponent = TextColumn;\r\n editorComponent = SLTextEditColumnEdit;\r\n getQuickFilterText = TextColumnBase.getQuickFilterText;\r\n break;\r\n case 'TextDisplayColumn':\r\n rendererComponent = TextColumn;\r\n getQuickFilterText = TextColumnBase.getQuickFilterText;\r\n break;\r\n default:\r\n throw new Error('Unable to create column with widgetType '\r\n + `${column.widgetType}.`);\r\n }\r\n\r\n const getVisibleQuickFilterText = (params: GetQuickFilterTextParams) =>\r\n {\r\n if (!params.column.isVisible())\r\n {\r\n return '';\r\n }\r\n\r\n return getQuickFilterText(params);\r\n };\r\n\r\n const sortingOrder =\r\n column.sortDescending\r\n ? ['desc', 'asc']\r\n : ['asc', 'desc'];\r\n\r\n if (column.flex && column.width\r\n && column.width + cellHorizontalPadding > minWidth)\r\n {\r\n minWidth = column.width + cellHorizontalPadding;\r\n }\r\n\r\n const result: ColDef =\r\n {\r\n autoHeight: false,\r\n cellClass: 'cx-cell',\r\n cellClassRules: {\r\n 'cx-cell-last': (params: CellClassParams) =>\r\n !GridColumn.shouldShowRightBorderOnColumn(params),\r\n },\r\n cellEditorFramework: editorComponent,\r\n cellEditorParams: { ...column.widgetProps, propagated },\r\n cellRendererFramework: rendererComponent,\r\n cellRendererParams: { ...column.widgetProps, propagated },\r\n cellStyle:\r\n {\r\n overflow: 'visible',\r\n padding: '0px',\r\n },\r\n colId: column.name,\r\n comparator: (\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n valueA: any,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n valueB: any,\r\n nodeA?: RowNode,\r\n nodeB?: RowNode,\r\n isInverted?: boolean): number =>\r\n {\r\n const rowA = nodeA!.data as PaneRow;\r\n const rowB = nodeB!.data as PaneRow;\r\n\r\n return GridColumn.comparator(column, rowA, rowB);\r\n },\r\n editable: p => GridColumn.isColumnEditable(p, column),\r\n field: column.name,\r\n getQuickFilterText: getVisibleQuickFilterText,\r\n headerClass: params => GridColumn.getColumnHeaderClass(\r\n params,\r\n allColumns,\r\n propagated.parentTable.configProps),\r\n headerName: column.header || '',\r\n hide: true,\r\n lockPinned: true,\r\n minWidth,\r\n resizable: !column.flex,\r\n sortable: column.sortEnabled,\r\n sortingOrder,\r\n suppressSizeToFit: !column.flex || !column.width,\r\n valueGetter: (v: ValueGetterParams) =>\r\n {\r\n const row = v.data as PaneRow;\r\n\r\n return row.getWidget(v.colDef.field!).value;\r\n },\r\n valueSetter: (v: ValueSetterParams) =>\r\n {\r\n const row = v.data as PaneRow;\r\n row.setProperty(v.colDef.field!, v.newValue);\r\n\r\n return true;\r\n },\r\n width: column.width\r\n ? column.width + cellHorizontalPadding\r\n : undefined,\r\n };\r\n\r\n return result;\r\n }\r\n\r\n public static getColumnsMinRowHeight(\r\n columns: GridColumnConfigProperties[]): number\r\n {\r\n const cellVerticalPadding = 24;\r\n\r\n let rowHeight = 48;\r\n\r\n for (const column of columns)\r\n {\r\n let colRowHeight = 0;\r\n switch (column.widgetType)\r\n {\r\n case 'DataImageDisplayColumn':\r\n colRowHeight = column.widgetProps['imageHeight']\r\n + cellVerticalPadding;\r\n break;\r\n default:\r\n colRowHeight = 0;\r\n }\r\n\r\n if (colRowHeight > rowHeight)\r\n {\r\n rowHeight = colRowHeight;\r\n }\r\n }\r\n\r\n return rowHeight;\r\n }\r\n\r\n public static isColumnFlex(\r\n columns: GridColumnConfigProperties[],\r\n colId: string\r\n ): boolean\r\n {\r\n const column = columns.find(c => c.name === colId);\r\n return column !== undefined && column.flex;\r\n }\r\n\r\n public static isColumnVisible(\r\n columns: GridColumnConfigProperties[],\r\n colId: string,\r\n breakpoint: string\r\n ): boolean\r\n {\r\n const column = columns.find(c => c.name === colId);\r\n return column !== undefined && column[breakpoint];\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport AppServer, { State as AppServerState } from '../../core/AppServer';\r\nimport Sys, { BusinessError } from '../../core/Sys';\r\nimport TrackableCollection from '../../core/TrackableCollection';\r\nimport TrackableModel from '../../core/TrackableModel';\r\nimport Button from '../../coreui/Button';\r\nimport Dialog, { BreakPointColumn } from '../../coreui/Dialog';\r\nimport DialogActions from '../../coreui/DialogActions';\r\nimport DialogContent from '../../coreui/DialogContent';\r\nimport Presentation, { CreatedReactElement } from '../../coreui/Presentation';\r\nimport ProcessingMask from '../../coreui/ProcessingMask';\r\nimport PaneRow from '../../models/PaneRow';\r\nimport { ConfigForDialogResponse } from '../../services/PresentationService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../../stores/PaneDataStore';\r\nimport RequestsStore from '../../stores/RequestsStore';\r\nimport { AccessLevel } from '../Api';\r\n\r\nexport interface AcceptResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\nexport interface OpenResponse extends ConfigForDialogResponse\r\n{\r\n appServerState: AppServerState;\r\n layoutId: string;\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface ConfigProperties\r\n{\r\n contentDataId: string;\r\n dataId: string;\r\n isFirstOpenOfNewRow?: boolean;\r\n name: string;\r\n onAccept?: (parentRowKey: string) => Promise;\r\n onClose: (accepted: boolean) => void;\r\n onDeleteRow: () => void;\r\n onExited?: () => void;\r\n onOpen: (parentRowKey: string) => Promise;\r\n parentRowKey?: string;\r\n}\r\n\r\ninterface State\r\n{\r\n breakPointColumns?: BreakPointColumn[];\r\n isDialogOpen?: boolean;\r\n isProcessing?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n dialogContent:\r\n {\r\n '& > div':\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n },\r\n },\r\n });\r\n\r\n@observer\r\nexport class TableEditDialog extends\r\n React.Component, State>\r\n{\r\n private dialogContents: CreatedReactElement;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isDialogOpen: false, isProcessing: false };\r\n }\r\n\r\n private onAccept = () =>\r\n {\r\n if (!this.props.onAccept)\r\n {\r\n throw 'onAccept is required to accept the dialog';\r\n }\r\n\r\n this.setState({ isProcessing: true });\r\n\r\n this.props.onAccept(this.props.parentRowKey!).then((\r\n response: AcceptResponse) =>\r\n {\r\n if (response.validationErrors\r\n && response.validationErrors.length > 0)\r\n {\r\n Sys.showErrors(response.validationErrors);\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n if (response.businessErrors.length > 0)\r\n {\r\n Sys.clearBusinessErrors();\r\n }\r\n else\r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.contentDataId, undefined, this.props.parentRowKey);\r\n }\r\n\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n\r\n if (!Sys.setBusinessErrors(response.businessErrors, false))\r\n {\r\n AppServer.clearStateRecoveryPoint();\r\n this.closeDialog(true);\r\n }\r\n }).finally(() => this.setState({ isProcessing: false }));\r\n };\r\n\r\n private onCancel = () =>\r\n {\r\n if (this.props.isFirstOpenOfNewRow)\r\n {\r\n const collection = TrackableModel.models.get(\r\n this.props.contentDataId) as TrackableCollection;\r\n\r\n const model: TrackableModel = collection.find(\r\n m => m.getPrimaryKey() === this.props.parentRowKey)!;\r\n\r\n collection.delete(model);\r\n\r\n // Remove from the deleted collection as we're restoring the\r\n // app server state to before the new row was added\r\n collection.getDeleted().delete(model);\r\n this.props.onDeleteRow();\r\n }\r\n\r\n Sys.clearBusinessErrors(\r\n this.props.contentDataId, undefined, this.props.parentRowKey);\r\n\r\n AppServer.recoverStateFromPoint();\r\n this.closeDialog(false);\r\n };\r\n\r\n private openDialog = () =>\r\n {\r\n RequestsStore.instance.processingStarted();\r\n\r\n this.props.onOpen(\r\n this.props.parentRowKey!\r\n ).then((dialogOpenResponse) =>\r\n {\r\n const validationErrors = dialogOpenResponse.validationErrors;\r\n if (validationErrors && validationErrors.length > 0)\r\n {\r\n Sys.showErrors(validationErrors);\r\n AppServer.clearStateRecoveryPoint();\r\n this.props.onClose(false);\r\n\r\n return;\r\n }\r\n\r\n const scripts: object = dialogOpenResponse.scriptsByDataId;\r\n\r\n Presentation.setPanes(dialogOpenResponse.layoutId, scripts);\r\n Sys.loadScripts(scripts);\r\n\r\n this.dialogContents = Presentation.create(\r\n dialogOpenResponse.presentationConfig)!;\r\n\r\n AppServer.setState(dialogOpenResponse.appServerState);\r\n PaneDataStore.loadResponse(dialogOpenResponse.paneDataByDataId);\r\n\r\n if (!this.props.isFirstOpenOfNewRow)\r\n {\r\n AppServer.createStateRecoveryPoint();\r\n }\r\n\r\n this.setState({\r\n breakPointColumns: dialogOpenResponse.breakPoints,\r\n isDialogOpen: true,\r\n });\r\n }\r\n ).finally(() => RequestsStore.instance.processingStopped());\r\n };\r\n\r\n public closeDialog = (accepted: boolean) =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n this.props.onClose(accepted);\r\n };\r\n\r\n public componentDidUpdate(prevProps: ConfigProperties)\r\n {\r\n if (this.props.parentRowKey !== prevProps.parentRowKey\r\n && this.props.parentRowKey && !this.state.isDialogOpen)\r\n {\r\n this.openDialog();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const parentTableWidgetProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.name) as RuntimeProperties;\r\n\r\n if (!parentTableWidgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n const isEnterable =\r\n parentTableWidgetProperties.accessLevel >= AccessLevel.enterable;\r\n\r\n return (\r\n \r\n \r\n
\r\n {this.dialogContents}\r\n
\r\n \r\n \r\n {isEnterable ? (\r\n \r\n ) : null}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TableEditDialog);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { ICellRendererParams } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport { CellUtil } from '../coreui/table/CellUtil';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties extends ICellRendererParams\r\n{\r\n data: PaneRow;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n rowKeys?: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n height: '100%',\r\n justifyContent: 'center',\r\n },\r\n });\r\n\r\n@observer\r\nexport class GridRelatedEditButton extends\r\n React.Component>\r\n{\r\n public static createColDef(propagated: TableChildProps)\r\n {\r\n return {\r\n cellClass: 'cx-cell cx-cell-last',\r\n cellRendererFramework: withStyles(styles)(GridRelatedEditButton),\r\n cellRendererParams: { propagated },\r\n cellStyle: { textAlign: 'center' },\r\n colId: '_rowEdit',\r\n headerClass: 'cx-header-last',\r\n hide: true,\r\n pinned: 'right',\r\n resizable: false,\r\n sortable: false,\r\n suppressMovable: true,\r\n suppressNavigable: false,\r\n suppressSizeToFit: true,\r\n width: 50,\r\n };\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n if (props.eGridCell)\r\n {\r\n CellUtil.runOnAction(props.eGridCell, () =>\r\n {\r\n this.openDialog();\r\n });\r\n }\r\n }\r\n\r\n public openDialog = () =>\r\n {\r\n const data = this.props.data || this.props.propagated.data;\r\n\r\n this.props.propagated.parentTable.openRowEditDialog(\r\n data.rowKey!, false);\r\n };\r\n\r\n public render()\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n\r\n const parentTableWidgetProperties =\r\n PaneRow.getWidgetProperties(\r\n parentTable.configProps.dataId,\r\n parentTable.configProps.name) as RuntimeProperties;\r\n\r\n if (!parentTableWidgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n const data = this.props.data || this.props.propagated.data;\r\n const rowKeys = parentTableWidgetProperties.rowKeys;\r\n if (rowKeys && rowKeys.indexOf(data.rowKey) === -1)\r\n {\r\n return null;\r\n }\r\n\r\n const isEnterable =\r\n parentTableWidgetProperties.accessLevel >= AccessLevel.enterable;\r\n\r\n const altText = Sys.getTranslation(\r\n isEnterable ? 'Edit Details' : 'View Details', 'DataTable');\r\n\r\n return (\r\n
\r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridRelatedEditButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { State as AppServerState } from '../core/AppServer';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Table, { TableChildProps, TableProps } from '../coreui/Table';\r\nimport AsyncData, { GetDataResponse } from '../coreui/table/AsyncData';\r\nimport PaneRow from '../models/PaneRow';\r\nimport PresentationService from '../services/PresentationService';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport GridColumn, { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport TableEditDialog from './Columns/TableEditDialog';\r\nimport ErrorBoundary from './ErrorBoundary';\r\nimport { GridRelatedEditButton } from './GridRelatedEditButton';\r\n\r\ninterface ConfigProperties extends WithWidth\r\n{\r\n cardDepth: number;\r\n columns: GridColumnConfigProperties[];\r\n contentDataId: string;\r\n data?: object;\r\n dataId: string;\r\n footerToolbar?: object;\r\n headerToolbar?: object;\r\n name: string;\r\n relatedEditLayoutIds:\r\n {\r\n RelatedEditLayoutId: number;\r\n RowTypeId: number;\r\n }[];\r\n rowSelection: boolean;\r\n selectionToolbar?: object;\r\n summaryToolbar?: object;\r\n tableKey: string;\r\n verticalLayout?: object;\r\n}\r\n\r\ninterface DialogOpenResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n relatedEditLayoutId: number;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n rowKeys: string[];\r\n}\r\n\r\ninterface State\r\n{\r\n editDialogInfo?: { isFirstOpenOfNewRow: boolean; rowKey: string };\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class ComplexGridControl extends\r\n React.Component<\r\n ConfigProperties & WithWidth & WithStyles, State>\r\n{\r\n private populate: ((rows: TrackableModel[]) => void) | null = null;\r\n private propagated: TableChildProps;\r\n private restoreLostFocus: (() => void) | null;\r\n private tableProps: TableProps;\r\n\r\n public constructor(\r\n props: ConfigProperties & WithWidth & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.propagated = {\r\n parentTable:\r\n {\r\n cardDepth: props.cardDepth,\r\n columns: props.columns,\r\n configProps:\r\n {\r\n contentDataId: props.contentDataId,\r\n data: props.data,\r\n dataId: props.dataId,\r\n name: props.name,\r\n },\r\n hasRelatedEditDialog: props.relatedEditLayoutIds ? true : false,\r\n isDocumentGrid: false,\r\n openRowEditDialog: (r, i) => this.openRowEditDialog(r, i),\r\n populateData: () => this.populateData(),\r\n },\r\n } as TableChildProps;\r\n\r\n this.tableProps = {\r\n cardDepth: props.cardDepth,\r\n cellEdit: false,\r\n columns: [],\r\n contentDataId: props.contentDataId,\r\n dataId: props.dataId,\r\n footerToolbarChild: props.footerToolbar,\r\n headerToolbarChild: props.headerToolbar,\r\n isColumnFlex: (colId: string) =>\r\n GridColumn.isColumnFlex(props.columns, colId),\r\n isColumnVisible: (colId: string, breakpoint: string) =>\r\n GridColumn.isColumnVisible(props.columns, colId, breakpoint),\r\n minRowHeight:\r\n GridColumn.getColumnsMinRowHeight(props.columns),\r\n name: props.name,\r\n propagated: this.propagated,\r\n rowSelection: props.rowSelection ? 'multiple' : undefined,\r\n selectToolbarChild: props.selectionToolbar,\r\n setPopulate: populate => this.populate = populate,\r\n setRestoreLostFocus:\r\n restoreFocus => this.restoreLostFocus = restoreFocus,\r\n summaryToolbarChild: props.summaryToolbar,\r\n };\r\n }\r\n\r\n private getData = () =>\r\n {\r\n return RoundTripService.partialDataRetrevial(\r\n `ComplexGridControl/GetRowsData/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`\r\n );\r\n };\r\n\r\n private getRowKey(): string\r\n {\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n return observable.rowKey;\r\n }\r\n\r\n private onDialogOpen = async (parentRowKey: string) =>\r\n {\r\n const dialogOpenResponse =\r\n await RoundTripService.customRoundTrip(\r\n `ComplexGridControl/OnDialogOpen/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { dialogRowKey: parentRowKey }\r\n );\r\n\r\n const layoutId = dialogOpenResponse.relatedEditLayoutId.toString();\r\n\r\n return PresentationService.getConfigForDialog(\r\n layoutId\r\n ).then((configResponse) =>\r\n {\r\n return { ...dialogOpenResponse, ...configResponse, layoutId };\r\n });\r\n };\r\n\r\n private openRowEditDialog(rowKey: string, isFirstOpenOfNewRow: boolean)\r\n {\r\n this.setState({ editDialogInfo: { isFirstOpenOfNewRow, rowKey } });\r\n }\r\n\r\n private populateData = () =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n if (this.populate !== null)\r\n {\r\n this.populate(rows);\r\n }\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n for (const column of this.props.columns)\r\n {\r\n this.tableProps.columns.push(GridColumn.getColumnDef(\r\n column,\r\n this.props.columns,\r\n this.propagated));\r\n }\r\n\r\n if (this.props.relatedEditLayoutIds)\r\n {\r\n this.tableProps.columns.push(GridRelatedEditButton.createColDef(\r\n this.propagated));\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ConfigProperties)\r\n {\r\n if (prevProps.width !== this.props.width)\r\n {\r\n setTimeout(() => this.populateData());\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n this.setState({ editDialogInfo: undefined })}\r\n onDeleteRow={() => this.populateData()}\r\n onExited={() => this.restoreLostFocus!()}\r\n onOpen={this.onDialogOpen}\r\n parentRowKey={this.state.editDialogInfo\r\n ? this.state.editDialogInfo.rowKey : undefined}\r\n />\r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(ComplexGridControl));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Api, { ConfigProps } from './Api';\r\n\r\ninterface ConfigProperties extends ConfigProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n blockHeader:\r\n {\r\n fontSize: '14px',\r\n fontWeight: 900,\r\n },\r\n propertyBlock:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n borderColor: theme.palette.grey[300],\r\n color: theme.palette.grey[800],\r\n fontSize: '12px',\r\n padding: '8px',\r\n whiteSpace: 'pre-wrap',\r\n },\r\n root:\r\n {\r\n borderColor: theme.palette.common.black,\r\n fontFamily: 'monospace',\r\n padding: '16px',\r\n },\r\n });\r\n\r\nexport class ComponentTest extends\r\n React.PureComponent>\r\n{\r\n public render(): React.ReactNode\r\n {\r\n let runtimePropsStr: string = 'Component does not define dataId and name.';\r\n\r\n if (this.props['dataId'] && this.props['name'])\r\n {\r\n const widgetProperties = Api.getWidgetProperties(this.props);\r\n if (widgetProperties)\r\n {\r\n runtimePropsStr = JSON.stringify(widgetProperties, null, 2);\r\n }\r\n else\r\n {\r\n runtimePropsStr = 'No widget properties exist for component.';\r\n }\r\n }\r\n\r\n return (\r\n
\r\n
\r\n Configured Props (Props)\r\n
\r\n
\r\n {JSON.stringify(this.props, null, 2)}\r\n
\r\n
\r\n Runtime Properties (WidgetProperties)\r\n
\r\n
\r\n {runtimePropsStr}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ComponentTest);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport FormControl from './FormControl';\r\nimport Presentation, { TextFieldProps } from './Presentation';\r\nimport Typography from './Typography';\r\n\r\ninterface Props extends TextFieldProps\r\n{\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n label:\r\n {\r\n color: theme.palette.grey[700],\r\n marginBottom: 8,\r\n },\r\n root:\r\n {\r\n '&:hover': { backgroundColor: 'transparent' },\r\n backgroundColor: 'transparent',\r\n },\r\n });\r\n\r\n@observer\r\nexport class FormData extends\r\n React.Component>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (_props.dataId)\r\n {\r\n if (_props.name && !_props.children)\r\n {\r\n _props.children = Presentation.getValue(_props);\r\n }\r\n\r\n delete _props.dataId;\r\n delete _props.name;\r\n }\r\n\r\n return (\r\n \r\n \r\n {_props.label}\r\n \r\n \r\n {_props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FormData);\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport FormData from '../coreui/FormData';\r\nimport Icon from '../coreui/Icon';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n header: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n iconName: string;\r\n label: string;\r\n}\r\n\r\n@observer\r\nexport class ComponentTypeDisplay extends\r\n React.Component\r\n{\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n {runtimeProperties.label}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default (ComponentTypeDisplay);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport Typography from '../coreui/Typography';\r\nimport { DashboardChildProps, Search } from './DashboardGridControl';\r\n\r\ninterface Props\r\n{\r\n propagated: TableChildProps & DashboardChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n buttonRef?: HTMLButtonElement;\r\n value?: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n button:\r\n {\r\n '&:focus':\r\n {\r\n boxShadow: 'none',\r\n },\r\n\r\n background: 'none',\r\n boxShadow: 'none',\r\n padding: 8,\r\n textAlign: 'left',\r\n textTransform: 'none',\r\n },\r\n });\r\n\r\nexport class DashboardCriteria extends\r\n React.PureComponent, State>\r\n{\r\n public static values: Map = new Map();\r\n private readonly key: string;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.key = this.props.propagated.parentTable.configProps.contentDataId;\r\n\r\n let value: string = props.propagated.parentDashboard.initialSearch;\r\n\r\n if (DashboardCriteria.values.has(this.key))\r\n {\r\n value = DashboardCriteria.values.get(this.key)!;\r\n }\r\n else\r\n {\r\n DashboardCriteria.values.set(this.key, value);\r\n }\r\n\r\n this.state = { value };\r\n }\r\n\r\n private async onChange(value: string)\r\n {\r\n if (value === DashboardCriteria.values.get(this.key))\r\n {\r\n return;\r\n }\r\n\r\n MenuBase.closeAll();\r\n this.setState({ value });\r\n\r\n try\r\n {\r\n await this.props.propagated.parentDashboard.search(value);\r\n DashboardCriteria.values.set(this.key, value);\r\n }\r\n catch\r\n {\r\n this.setState(\r\n {\r\n value: DashboardCriteria.values.get(this.key)!,\r\n });\r\n }\r\n }\r\n\r\n private openMenu = (event: React.MouseEvent) =>\r\n {\r\n const button: HTMLButtonElement = event.currentTarget;\r\n\r\n this.setState({ buttonRef: button }, () =>\r\n {\r\n MenuBase.open(this.key, button);\r\n });\r\n };\r\n\r\n public render()\r\n {\r\n const searches: Search[] =\r\n this.props.propagated.parentDashboard.searches;\r\n const selected: Search =\r\n searches.find(s => s.name === this.state.value)!;\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n {Sys.getTranslation('Filter By')}\r\n \r\n \r\n {selected.description}\r\n \r\n
\r\n \r\n \r\n this.state.buttonRef!.focus()}\r\n open={false}\r\n >\r\n {searches.map(l => (\r\n this.onChange(l.name)}\r\n selected={l.name === this.state.value}\r\n value={l.name}\r\n />\r\n ))}\r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DashboardCriteria);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Presentation from '../coreui/Presentation';\r\nimport ProcessingMask from '../coreui/ProcessingMask';\r\nimport Table, { TableChildProps, TableProps } from '../coreui/Table';\r\nimport AsyncData, { AsyncData as AsyncDataBase, GetDataResponse }\r\n from '../coreui/table/AsyncData';\r\nimport PaneRow from '../models/PaneRow';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport GridColumn, { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport { DashboardCriteria as DashboardCriteriaBase } from './DashboardCriteria';\r\nimport ErrorBoundary from './ErrorBoundary';\r\n\r\ninterface ConfigProperties extends WithWidth\r\n{\r\n cardDepth: number;\r\n columns: GridColumnConfigProperties[];\r\n contentDataId: string;\r\n data?: object;\r\n dataId: string;\r\n footerToolbar?: object;\r\n headerToolbar?: object;\r\n name: string;\r\n searches: { description: string; name: string }[];\r\n summaryToolbar?: object;\r\n tableKey: string;\r\n verticalLayout?: object;\r\n}\r\n\r\nexport interface DashboardChildProps\r\n{\r\n parentDashboard:\r\n {\r\n initialSearch: string;\r\n search: (search: string) => Promise;\r\n searches: Search[];\r\n };\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n initialSearch: string;\r\n}\r\n\r\nexport interface Search\r\n{\r\n description: string;\r\n name: string;\r\n}\r\n\r\ninterface State\r\n{\r\n isSearching?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class DashboardGridControl extends\r\n React.Component<\r\n ConfigProperties & WithWidth & WithStyles, State>\r\n{\r\n private currentSearchName: string;\r\n private populate: ((rows: TrackableModel[]) => void) | null = null;\r\n private propagated: TableChildProps & DashboardChildProps;\r\n private tableProps: TableProps;\r\n\r\n public constructor(\r\n props: ConfigProperties & WithWidth & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isSearching: false };\r\n\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (DashboardCriteriaBase.values.has(this.props.contentDataId))\r\n {\r\n this.currentSearchName =\r\n DashboardCriteriaBase.values.get(this.props.contentDataId)!;\r\n }\r\n else\r\n {\r\n this.currentSearchName = runtimeProperties.initialSearch;\r\n }\r\n\r\n const tableChildProps =\r\n {\r\n parentTable:\r\n {\r\n cardDepth: props.cardDepth,\r\n columns: props.columns,\r\n configProps:\r\n {\r\n contentDataId: props.contentDataId,\r\n data: props.data,\r\n dataId: props.dataId,\r\n name: props.name,\r\n tableKey: props.tableKey,\r\n },\r\n hasRelatedEditDialog: false,\r\n isDocumentGrid: false,\r\n populateData: () => this.populateData(),\r\n },\r\n } as TableChildProps;\r\n\r\n this.propagated =\r\n {\r\n parentDashboard:\r\n {\r\n initialSearch: runtimeProperties.initialSearch,\r\n search: this.search,\r\n searches: props.searches,\r\n },\r\n ...tableChildProps,\r\n };\r\n\r\n this.tableProps = {\r\n cardDepth: props.cardDepth,\r\n cellEdit: false,\r\n columns: [],\r\n contentDataId: props.contentDataId,\r\n dataId: props.dataId,\r\n footerToolbarChild: props.footerToolbar,\r\n headerToolbarChild: props.headerToolbar,\r\n isColumnFlex: (colId: string) =>\r\n GridColumn.isColumnFlex(props.columns, colId),\r\n isColumnVisible: (colId: string, breakpoint: string) =>\r\n GridColumn.isColumnVisible(props.columns, colId, breakpoint),\r\n minRowHeight:\r\n GridColumn.getColumnsMinRowHeight(props.columns),\r\n name: props.name,\r\n propagated: this.propagated,\r\n resetPageOnPopulate: true,\r\n setPopulate: populate => this.populate = populate,\r\n showNoData: true,\r\n summaryToolbarChild: props.summaryToolbar,\r\n };\r\n }\r\n\r\n private getData = (searchName?: string) =>\r\n {\r\n return RoundTripService.partialDataRetrevial(\r\n `DashboardGridControl/GetRowsData/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { SearchName: searchName ? searchName : this.currentSearchName });\r\n };\r\n\r\n private getRowKey(): string\r\n {\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n return observable.rowKey;\r\n }\r\n\r\n private populateData = () =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n if (this.populate !== null)\r\n {\r\n this.populate(rows);\r\n }\r\n };\r\n\r\n private search = async (search: string) =>\r\n {\r\n this.setState({ isSearching: true });\r\n\r\n try\r\n {\r\n await AsyncDataBase.processResponse(this.getData(search));\r\n this.currentSearchName = search;\r\n }\r\n finally\r\n {\r\n this.setState({ isSearching: false });\r\n }\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n for (const column of this.props.columns)\r\n {\r\n this.tableProps.columns.push(GridColumn.getColumnDef(\r\n column,\r\n this.props.columns,\r\n this.propagated));\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ConfigProperties)\r\n {\r\n if (prevProps.width !== this.props.width)\r\n {\r\n setTimeout(() => this.populateData());\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(DashboardGridControl));\r\n","import { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Icon from '../coreui/Icon';\r\nimport ImageWithLink from '../coreui/ImageWithLink';\r\nimport Thumbnail from '../coreui/Thumbnail';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface SizeByBreakpoint\r\n{\r\n lg: number | undefined;\r\n md: number | undefined;\r\n sm: number | undefined;\r\n xs: number | undefined;\r\n}\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n imageHeight: SizeByBreakpoint;\r\n imageRender: 'Fit to Size' | 'Mask to Size';\r\n imageType:\r\n 'Download Link Only'\r\n | 'Full Size'\r\n | 'Large Thumbnail'\r\n | 'Medium Thumbnail';\r\n imageWidth: SizeByBreakpoint;\r\n name: string;\r\n suppressDownloadLink: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n documentHandle: string | null;\r\n fileName: string;\r\n iconName: string;\r\n pendingDocumentId: number | null;\r\n pendingThumbnailId: number | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n image:\r\n {\r\n overflow: 'hidden',\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n maxWidth: '100%',\r\n },\r\n },\r\n noImage:\r\n {\r\n '& > svg':\r\n {\r\n height: '100% !important',\r\n width: '100% !important',\r\n },\r\n color: theme.palette.grey[500],\r\n height: '75% !important',\r\n left: '50%',\r\n maxHeight: '96px',\r\n maxWidth: '96px',\r\n position: 'absolute',\r\n top: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: '75% !important',\r\n },\r\n });\r\n\r\n@observer\r\nexport class DataImageDisplay extends\r\n React.Component>\r\n{\r\n public static getUrl(\r\n documentHandle: string | null,\r\n pendingDocumentId: number | null,\r\n pendingThumbnailId: number | null,\r\n thumbnailType: string,\r\n documentName: string\r\n ): string\r\n {\r\n // DocumentName is only passed to make the url more human readable\r\n return 'dynamic/DataImageDisplay/GetImage'\r\n + `/${documentHandle}`\r\n + `/${pendingDocumentId}/${pendingThumbnailId}`\r\n + `/${thumbnailType}`\r\n + `/${documentName}`;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n let height: number | undefined = undefined;\r\n if (this.props.width in this.props.imageHeight)\r\n {\r\n height = this.props.imageHeight[this.props.width];\r\n }\r\n let width: number | undefined = undefined;\r\n if (this.props.width in this.props.imageWidth)\r\n {\r\n width = this.props.imageWidth[this.props.width];\r\n }\r\n\r\n if (!width || !height)\r\n {\r\n return null;\r\n }\r\n\r\n if (!widgetProperties.documentHandle\r\n && !widgetProperties.pendingDocumentId)\r\n {\r\n if (_props.imageType === 'Download Link Only')\r\n {\r\n return null;\r\n }\r\n\r\n const background = this.props.theme.palette.grey[200];\r\n // If there *could be* an image (rel with cardinality\r\n // of 0) but there isn't an image, display the 'no image'\r\n // default, as per the ux standards\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const imgSrc: string = DataImageDisplay.getUrl(\r\n widgetProperties.documentHandle,\r\n widgetProperties.pendingDocumentId,\r\n widgetProperties.pendingThumbnailId,\r\n _props.imageType,\r\n widgetProperties.fileName);\r\n\r\n const downloadUrl: string = DataImageDisplay.getUrl(\r\n widgetProperties.documentHandle,\r\n widgetProperties.pendingDocumentId,\r\n widgetProperties.pendingThumbnailId,\r\n 'Full Size',\r\n widgetProperties.fileName);\r\n\r\n if (_props.imageType === 'Full Size')\r\n {\r\n const fit = _props.imageRender === 'Mask to Size'\r\n ? 'cover' : 'contain';\r\n\r\n if (!this.props.suppressDownloadLink)\r\n {\r\n return (\r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()((withTheme(DataImageDisplay))));\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport FormData from '../coreui/FormData';\r\nimport Link from '../coreui/Link';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n label: string;\r\n name: string;\r\n presentationId?: number;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n anchorText: string;\r\n objectId: number;\r\n presentationId?: number;\r\n}\r\n\r\n@observer\r\nexport class DataLink extends\r\n React.Component\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as RuntimeProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n let url = `#/object/${runtimeProperties.objectId}/`;\r\n if (_props.presentationId)\r\n {\r\n url += _props.presentationId;\r\n }\r\n else\r\n {\r\n // Used when in a data grid vertical layout for DataLinkColumns\r\n url += runtimeProperties.presentationId;\r\n }\r\n\r\n if (Api.setAccessLevel(_props, runtimeProperties))\r\n {\r\n if (!_props['readOnly'])\r\n {\r\n _props.children =\r\n ;\r\n }\r\n else\r\n {\r\n _props.children = runtimeProperties.anchorText;\r\n }\r\n\r\n result = ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default DataLink;\r\n","import * as muiDivider from '@material-ui/core/Divider';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiDivider.DividerProps\r\n{\r\n}\r\n\r\nexport class DividerDisplay extends React.PureComponent\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default DividerDisplay;\r\n","import lightGreen from '@material-ui/core/colors/lightGreen';\r\nimport * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { InputBaseComponentProps } from '@material-ui/core/InputBase';\r\nimport * as muiLinearProgress from '@material-ui/core/LinearProgress';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { autorun, IReactionDisposer } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n// @ts-ignore\r\nimport { IMaskInput } from 'react-imask';\r\nimport AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport FormHelperText from '../coreui/FormHelperText';\r\nimport Icon from '../coreui/Icon';\r\nimport IconWithLink from '../coreui/IconWithLink';\r\nimport ImageWithLink from '../coreui/ImageWithLink';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Presentation from '../coreui/Presentation';\r\nimport TextField from '../coreui/TextField';\r\nimport Typography from '../coreui/Typography';\r\nimport PaneRow, { WidgetData } from '../models/PaneRow';\r\nimport DocumentService, { DocumentUploadResponse }\r\n from '../services/DocumentService';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n label: string;\r\n maxFileBytes: number | null;\r\n maxFileBytesError: string;\r\n name: string;\r\n nameRequiredError: string;\r\n validExtensions: string[];\r\n validExtensionsError: string;\r\n}\r\n\r\ninterface CompleteDocumentUploadResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n uploadErrors: string[];\r\n widgetData: WidgetData | null;\r\n}\r\n\r\ninterface DeleteResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n widgetData: WidgetData | null;\r\n}\r\n\r\ninterface State\r\n{\r\n isDocumentUploadFinished?: boolean;\r\n isDocumentUploading?: boolean;\r\n isDragging?: boolean;\r\n isFocused?: boolean;\r\n localErrors?: string[];\r\n newDocumentExtension?: string;\r\n newDocumentFileName?: string;\r\n uploadPercentComplete?: number;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n canDelete: boolean;\r\n documentExtension: string | null;\r\n documentHandle: string | null;\r\n extensionIconName: string | null;\r\n pendingDocumentId: number | null;\r\n pendingThumbnailId: number | null;\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n thumbnailType: 'Medium' | 'ExtensionIcon' | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n cellLeft:\r\n {\r\n width: 64,\r\n },\r\n cellRight:\r\n {\r\n flex: 1,\r\n },\r\n dropArea:\r\n {\r\n alignItems: 'center',\r\n },\r\n editableRoot:\r\n {\r\n outline: 'none',\r\n position: 'relative',\r\n width: '100%',\r\n },\r\n fileInput:\r\n {\r\n cursor: 'pointer',\r\n height: '100%',\r\n left: 0,\r\n opacity: 0,\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n },\r\n input:\r\n {\r\n backgroundColor: `${theme.palette.grey[200]} !important`,\r\n },\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 72px)',\r\n },\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 72px) * 1.333)',\r\n },\r\n label:\r\n {\r\n width: 'calc(100% - 72px)',\r\n },\r\n previewButton:\r\n {\r\n marginRight: 16,\r\n },\r\n progressBar:\r\n {\r\n backgroundColor: lightGreen[100],\r\n bottom: 0,\r\n height: 4,\r\n position: 'absolute',\r\n width: '100%',\r\n },\r\n progressBarFilled:\r\n {\r\n backgroundColor: lightGreen[500],\r\n transitionDuration: '0.1s',\r\n },\r\n progressBarFilledSlow:\r\n {\r\n backgroundColor: lightGreen[500],\r\n transitionDuration: '5s',\r\n },\r\n readOnlyRoot:\r\n {\r\n display: 'flex',\r\n },\r\n row:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n },\r\n uploadCompleteIcon:\r\n {\r\n bottom: 0,\r\n fontSize: 16,\r\n right: -16 - 8,\r\n },\r\n });\r\n\r\n@observer\r\nexport class DocumentEdit extends\r\n React.Component, State>\r\n{\r\n private readonly componentId: string;\r\n private customInputRef: { maskValue: string };\r\n private dragEnterStack = 0;\r\n private readonly helperTextId: string;\r\n private lastDocumentHandle: string | null;\r\n private rootRef = React.createRef();\r\n private saveMonitorDisposer: IReactionDisposer;\r\n private readonly validExtensions: string;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.componentId = `document-edit-${Sys.nextId}`;\r\n this.helperTextId = `${this.componentId}-helper-text`;\r\n\r\n this.state =\r\n {\r\n isDocumentUploadFinished: false,\r\n isDocumentUploading: false,\r\n isFocused: false,\r\n localErrors: [],\r\n uploadPercentComplete: 0,\r\n };\r\n\r\n this.validExtensions = this.props.validExtensions\r\n .map(extension => `.${extension}`).join(',');\r\n }\r\n\r\n private completeDocumentUpload(\r\n uploadResponse: DocumentUploadResponse, file: File): Promise\r\n {\r\n RequestsStore.instance.processingStarted(\r\n Sys.getTranslation('Finalizing upload'));\r\n\r\n this.setState({ uploadPercentComplete: 100 });\r\n\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n\r\n return RoundTripService.customRoundTrip(\r\n 'DocumentEdit/CompleteDocumentUpload/{rowKey}/{dataId}/{widgetName}',\r\n {\r\n dataId: this.props.dataId,\r\n rowKey: observable.rowKey,\r\n widgetName: this.props.name,\r\n },\r\n {\r\n file: { fileName: file.name, size: file.size },\r\n pendingDocumentId: uploadResponse.pendingDocumentId,\r\n pendingThumbnailId: uploadResponse.pendingThumbnailId,\r\n }\r\n ).then((response: CompleteDocumentUploadResponse) =>\r\n {\r\n AppServer.setState(response.appServerState);\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n if (response.widgetData)\r\n {\r\n PaneDataStore.loadWidgetData(\r\n this.props.dataId, response.widgetData);\r\n }\r\n\r\n if (response.uploadErrors.length > 0)\r\n {\r\n this.uploadError(file, response.uploadErrors);\r\n }\r\n else\r\n {\r\n Presentation.setValue(\r\n this.props, this.state.newDocumentFileName);\r\n this.setState({\r\n isDocumentUploadFinished: true,\r\n isDocumentUploading: false,\r\n uploadPercentComplete: 100,\r\n });\r\n }\r\n }).finally(() => RequestsStore.instance.processingStopped());\r\n }\r\n\r\n private createCustomInput = (\r\n props: InputBaseComponentProps\r\n ): JSX.Element =>\r\n {\r\n const { extension, onChange, ...other } = props;\r\n\r\n const showExtension: boolean =\r\n !!extension && (!!props.value || this.state.isFocused!);\r\n\r\n return (\r\n \r\n {\r\n this.customInputRef = ref;\r\n }}\r\n unmask={true}\r\n />\r\n );\r\n };\r\n\r\n private deleteDocument = () =>\r\n {\r\n RequestsStore.instance.processingStarted();\r\n\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n\r\n // Reset any changes to the file name\r\n observable.revertValue(this.props.name);\r\n\r\n this.setState({ isDocumentUploadFinished: false });\r\n\r\n RoundTripService.customRoundTrip(\r\n 'DocumentEdit/DeleteDocument/{rowKey}/{dataId}/{widgetName}',\r\n {\r\n dataId: this.props.dataId,\r\n rowKey: observable.rowKey,\r\n widgetName: this.props.name,\r\n }\r\n ).then((response: DeleteResponse) =>\r\n {\r\n const validationErrors = response['validationErrors'];\r\n if (validationErrors && validationErrors.length > 0)\r\n {\r\n Sys.showErrors(validationErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n if (response.widgetData)\r\n {\r\n PaneDataStore.loadWidgetData(\r\n this.props.dataId, response.widgetData);\r\n }\r\n this.setLocalErrors();\r\n }).finally(() => RequestsStore.instance.processingStopped());\r\n };\r\n\r\n private getCurrentValue(): string | null\r\n {\r\n let documentBaseName = Presentation.getValue(this.props);\r\n if (this.state.isDocumentUploading)\r\n {\r\n documentBaseName = this.state.newDocumentFileName!;\r\n }\r\n\r\n return documentBaseName;\r\n }\r\n\r\n private getErrors(businessErrors: string[]): string[]\r\n {\r\n let result: string[];\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n\r\n if (observable.hasChanges(this.props.name))\r\n {\r\n result = [];\r\n }\r\n else\r\n {\r\n result = [...businessErrors];\r\n }\r\n\r\n result = result.concat(this.state.localErrors!);\r\n\r\n return result;\r\n }\r\n\r\n private isDocumentSelected(runtimeProperties: RuntimeProperties): boolean\r\n {\r\n return !!runtimeProperties.documentHandle;\r\n }\r\n\r\n private onBlur = () =>\r\n {\r\n this.setLocalErrors();\r\n this.setState({ isFocused: false });\r\n };\r\n\r\n private onChange = () =>\r\n {\r\n const value: string = this.customInputRef.maskValue;\r\n\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n\r\n if (this.state.isDocumentUploading)\r\n {\r\n this.setState({ newDocumentFileName: value });\r\n }\r\n else\r\n {\r\n Presentation.setValue(this.props, value);\r\n }\r\n };\r\n\r\n private onClickFileUpload = () =>\r\n {\r\n this.setState(\r\n {\r\n isDocumentUploadFinished: false,\r\n uploadPercentComplete: 0,\r\n });\r\n };\r\n\r\n private onDragEnterIntoDocument = () =>\r\n {\r\n this.dragEnterStack++;\r\n\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.enterable\r\n && !runtimeProperties.canDelete\r\n && !this.state.isDocumentUploading)\r\n {\r\n this.setState({ isDragging: true });\r\n }\r\n };\r\n\r\n private onDragLeaveOutOfDocument = () =>\r\n {\r\n this.dragEnterStack--;\r\n\r\n if (this.dragEnterStack < 1)\r\n {\r\n this.setState({ isDragging: false });\r\n }\r\n };\r\n\r\n private onDragOverIntoWidget = (event: React.DragEvent) =>\r\n {\r\n event.dataTransfer.dropEffect = 'copy';\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n return false;\r\n };\r\n\r\n private onDropIntoDocument = (event: DragEvent) =>\r\n {\r\n // Delay so the widget drop event fires (delay the re-render)\r\n setTimeout(() =>\r\n {\r\n this.dragEnterStack = 0;\r\n this.setState({\r\n isDocumentUploadFinished: false,\r\n isDragging: false,\r\n uploadPercentComplete: 0,\r\n });\r\n });\r\n\r\n event.preventDefault();\r\n\r\n return false;\r\n };\r\n\r\n private onDropIntoWidget = (event: React.DragEvent) =>\r\n {\r\n this.uploadFile(event.dataTransfer.files);\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n return false;\r\n };\r\n\r\n private onFileSelected = (event: React.ChangeEvent) =>\r\n {\r\n const input = event.target;\r\n\r\n if (!input.files || input.files.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n this.uploadFile(input.files);\r\n };\r\n\r\n private onFocus = () =>\r\n {\r\n this.setState({ isFocused: true });\r\n };\r\n\r\n private setLocalErrors()\r\n {\r\n const localErrors: string[] = [];\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!this.getCurrentValue()\r\n && (this.isDocumentSelected(runtimeProperties)\r\n || this.state.isDocumentUploading))\r\n {\r\n localErrors.push(this.props.nameRequiredError);\r\n }\r\n\r\n this.setState({ localErrors });\r\n }\r\n\r\n private updateProgress = (file: File, event: ProgressEvent) =>\r\n {\r\n // Only show 90% complete until the upload has finished\r\n const percent = Math.round((event.loaded / event.total) * 90);\r\n this.setState((prevState) =>\r\n {\r\n if (event.loaded / event.total >= 1)\r\n {\r\n return { uploadPercentComplete: 98 };\r\n }\r\n\r\n if (percent > prevState.uploadPercentComplete! && percent <= 90)\r\n {\r\n return { uploadPercentComplete: percent };\r\n }\r\n\r\n return {};\r\n });\r\n };\r\n\r\n private uploadError = (file: File | null, errors: string[]) =>\r\n {\r\n if (file)\r\n {\r\n Sys.showErrors(errors.map(error => `${file.name} - ${error}`));\r\n }\r\n else\r\n {\r\n Sys.showErrors(errors);\r\n }\r\n this.setState({ isDocumentUploading: false });\r\n };\r\n\r\n private uploadFile(files: FileList)\r\n {\r\n if (files.length !== 1)\r\n {\r\n this.uploadError(\r\n null,\r\n [Sys.getTranslation('Only a single file can be uploaded')]\r\n );\r\n\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n const fullFileName = file.name;\r\n const index = fullFileName.lastIndexOf('.');\r\n const extension = index > 0 ? fullFileName.substring(index + 1) : '';\r\n\r\n if (this.props.validExtensions.length > 0\r\n && this.props.validExtensions.indexOf(extension.toLowerCase()) < 0)\r\n {\r\n const error = this.props.validExtensionsError.replace(\r\n '{extension}', extension);\r\n this.uploadError(file, [error]);\r\n\r\n return;\r\n }\r\n\r\n if (this.props.maxFileBytes !== null\r\n && file.size > this.props.maxFileBytes)\r\n {\r\n this.uploadError(file, [this.props.maxFileBytesError]);\r\n\r\n return;\r\n }\r\n\r\n this.setState(\r\n {\r\n isDocumentUploading: true,\r\n newDocumentExtension: extension,\r\n newDocumentFileName: index > 0\r\n ? fullFileName.substring(0, index) : fullFileName,\r\n },\r\n () =>\r\n {\r\n this.setLocalErrors();\r\n this.rootRef.current!.focus();\r\n });\r\n\r\n const batch = DocumentService.uploadFiles(\r\n this.props.dataId,\r\n this.props.name,\r\n [file],\r\n this.updateProgress,\r\n this.uploadError);\r\n\r\n Promise.all(batch).then((responses: DocumentUploadResponse[]) =>\r\n {\r\n if (responses[0].uploadErrors.length <= 0)\r\n {\r\n this.completeDocumentUpload(responses[0], file);\r\n }\r\n });\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n document.body.addEventListener(\r\n 'dragenter', this.onDragEnterIntoDocument);\r\n document.body.addEventListener(\r\n 'dragleave', this.onDragLeaveOutOfDocument);\r\n document.body.addEventListener('drop', this.onDropIntoDocument);\r\n\r\n // Monitor for when the presentation is saved after a document upload\r\n this.saveMonitorDisposer = autorun(() =>\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (runtimeProperties\r\n && this.lastDocumentHandle !== runtimeProperties.documentHandle)\r\n {\r\n this.lastDocumentHandle = runtimeProperties.documentHandle;\r\n this.setState({ isDocumentUploadFinished: false });\r\n }\r\n });\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n document.body.removeEventListener(\r\n 'dragenter', this.onDragEnterIntoDocument);\r\n document.body.removeEventListener(\r\n 'dragleave', this.onDragLeaveOutOfDocument);\r\n document.body.removeEventListener('drop', this.onDropIntoDocument);\r\n\r\n this.saveMonitorDisposer();\r\n }\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.disabled)\r\n {\r\n const disabled =\r\n ;\r\n\r\n if (runtimeProperties.showDisabledHelp)\r\n {\r\n return (\r\n \r\n {disabled}\r\n );\r\n }\r\n\r\n return disabled;\r\n }\r\n\r\n let documentExtension = runtimeProperties.documentExtension;\r\n if (this.state.isDocumentUploading)\r\n {\r\n documentExtension = this.state.newDocumentExtension!;\r\n }\r\n const documentBaseName = this.getCurrentValue();\r\n\r\n const documentUrl = DocumentService.getDocumentUrl(\r\n runtimeProperties.documentHandle,\r\n runtimeProperties.pendingDocumentId,\r\n documentBaseName ? `${documentBaseName}.${documentExtension}` : '');\r\n\r\n let previewButton: React.ReactNode | null = null;\r\n\r\n switch (runtimeProperties.thumbnailType)\r\n {\r\n case 'Medium':\r\n previewButton =\r\n ;\r\n break;\r\n case 'ExtensionIcon':\r\n previewButton =\r\n ;\r\n break;\r\n default:\r\n }\r\n\r\n const { classes, ..._props } = this.props;\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.readOnly)\r\n {\r\n const formattedDocumentName: string | null = documentBaseName\r\n ? `${documentBaseName}.${documentExtension}`\r\n : '-';\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {previewButton}\r\n
\r\n
\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {formattedDocumentName}\r\n \r\n
\r\n
\r\n
\r\n
);\r\n }\r\n\r\n const helperTextProps = { error: false, helperText: '' };\r\n const errors: string[] = this.getErrors(\r\n runtimeProperties.businessErrors);\r\n Api.setHelperText(this, errors, helperTextProps);\r\n\r\n let actionButton: React.ReactNode;\r\n if (runtimeProperties.canDelete)\r\n {\r\n actionButton =\r\n ;\r\n }\r\n else\r\n {\r\n actionButton =\r\n \r\n \r\n \r\n ;\r\n }\r\n\r\n const showProgress: boolean = this.state.isDocumentUploading\r\n || this.state.isDocumentUploadFinished!;\r\n const uploadPercentComplete = this.state.uploadPercentComplete!;\r\n const progressBarStyle: string =\r\n uploadPercentComplete > 90 && uploadPercentComplete < 100\r\n ? classes.progressBarFilledSlow : classes.progressBarFilled;\r\n\r\n const textField = (\r\n
\r\n \r\n {actionButton}\r\n ,\r\n inputComponent: this.createCustomInput,\r\n inputProps: { extension: documentExtension },\r\n }}\r\n label={this.props.label}\r\n name={this.props.name}\r\n onBlur={this.onBlur}\r\n onChange={this.onChange}\r\n onFocus={this.onFocus}\r\n required={runtimeProperties.showAsMandatory}\r\n value={documentBaseName || ''}\r\n variant=\"filled\"\r\n />\r\n {showProgress ? (\r\n \r\n \r\n \r\n \r\n ) : null}\r\n {this.state.isDragging ? (\r\n \r\n \r\n \r\n \r\n \r\n {Sys.getTranslation('Drop')}\r\n \r\n \r\n  {Sys.getTranslation('File to Upload')}\r\n \r\n
\r\n ) : null}\r\n \r\n );\r\n\r\n return (\r\n \r\n
\r\n {previewButton && !this.state.isDocumentUploading ? (\r\n
\r\n {previewButton}\r\n
\r\n ) : null}\r\n
\r\n {textField}\r\n
\r\n
\r\n {helperTextProps.helperText ? (\r\n
\r\n {previewButton && !this.state.isDocumentUploading ? (\r\n
\r\n ) : null}\r\n
\r\n \r\n
\r\n
\r\n ) : null}\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DocumentEdit);\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Presentation from '../coreui/Presentation';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel, ValueByBreakpoint } from '../mustangui/Api';\r\n\r\nexport interface ConfigProperties\r\n{\r\n childWidget: object;\r\n childWidgetName: string;\r\n isLayoutOnlyWidget: boolean;\r\n isVisible: ValueByBreakpoint;\r\n}\r\n\r\ninterface Props extends ConfigProperties\r\n{\r\n dataId: string;\r\n propagated: object;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`root-visible-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'block',\r\n },\r\n };\r\n }\r\n\r\n const itemSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const itemSpacing = theme.freeflow.item.spacing[breakPoint];\r\n\r\n itemSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n paddingBottom: itemSpacing.vertical * 0.5,\r\n paddingLeft: itemSpacing.horizontal * 0.5,\r\n paddingRight: itemSpacing.horizontal * 0.5,\r\n paddingTop: itemSpacing.vertical * 0.5,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n root:\r\n {\r\n display: 'none',\r\n minWidth: 0,\r\n width: 'auto',\r\n ...itemSpaceStyle,\r\n },\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class FreeflowContainerItem extends\r\n React.Component & WithTheme>\r\n{\r\n public static isVisible(\r\n dataId: string,\r\n item: ConfigProperties,\r\n breakPoint: Breakpoint\r\n ): boolean\r\n {\r\n if (!item.isVisible[breakPoint])\r\n {\r\n return false;\r\n }\r\n\r\n if (item.isLayoutOnlyWidget)\r\n {\r\n return true;\r\n }\r\n\r\n const widgetProperties = PaneRow.getWidgetProperties(\r\n dataId, item.childWidgetName) as RuntimeProperties;\r\n\r\n if (widgetProperties.accessLevel === undefined)\r\n {\r\n return true;\r\n }\r\n\r\n return widgetProperties.accessLevel >= AccessLevel.disabled;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const classes: string[] = [this.props.classes.root];\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (FreeflowContainerItem.isVisible(\r\n this.props.dataId, this.props, breakPoint))\r\n {\r\n const className = `root-visible-${breakPoint}`;\r\n classes.push(this.props.classes[className]);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {\r\n Presentation.create(\r\n this.props.childWidget,\r\n this.props.propagated)\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(FreeflowContainerItem));\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel, ValueByBreakpoint } from '../mustangui/Api';\r\nimport\r\n FreeflowContainerItem,\r\n {\r\n FreeflowContainerItem as FreeflowContainerItemBase,\r\n ConfigProperties as ItemConfig,\r\n }\r\n from './FreeflowContainerItem';\r\n\r\nexport interface ConfigProperties\r\n{\r\n items: ItemConfig[];\r\n}\r\n\r\ninterface Props extends ConfigProperties\r\n{\r\n dataId: string;\r\n propagated: object;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`root-visible-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'flex',\r\n },\r\n };\r\n }\r\n\r\n const groupSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const itemSpacing = theme.freeflow.item.spacing[breakPoint];\r\n const groupSpacing = theme.freeflow.group.spacing[breakPoint];\r\n\r\n groupSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n marginBottom: -itemSpacing.vertical * 0.5,\r\n marginLeft: -itemSpacing.horizontal * 0.5,\r\n marginRight: -itemSpacing.horizontal * 0.5,\r\n marginTop: -itemSpacing.vertical * 0.5,\r\n\r\n paddingBottom: groupSpacing.vertical * 0.5,\r\n paddingLeft: groupSpacing.horizontal * 0.5,\r\n paddingRight: groupSpacing.horizontal * 0.5,\r\n paddingTop: groupSpacing.vertical * 0.5,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'none',\r\n flexWrap: 'wrap',\r\n justifyContent: 'inherit',\r\n ...groupSpaceStyle,\r\n } as CSSProperties,\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class FreeflowContainerGroup extends\r\n React.Component & WithTheme>\r\n{\r\n public static isVisible(\r\n dataId: string,\r\n group: ConfigProperties,\r\n breakPoint: Breakpoint\r\n ): boolean\r\n {\r\n return group.items.some(\r\n i => FreeflowContainerItemBase.isVisible(dataId, i, breakPoint));\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const classes: string[] = [this.props.classes.root];\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (FreeflowContainerGroup.isVisible(\r\n this.props.dataId, this.props, breakPoint))\r\n {\r\n const className = `root-visible-${breakPoint}`;\r\n classes.push(this.props.classes[className]);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {\r\n this.props.items.map((item: ItemConfig, index: number) => (\r\n ))\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(FreeflowContainerGroup));\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel, ValueByBreakpoint } from '../mustangui/Api';\r\nimport\r\n FreeflowContainerGroup,\r\n {\r\n FreeflowContainerGroup as FreeflowContainerGroupBase,\r\n ConfigProperties as GroupConfig,\r\n }\r\n from './FreeflowContainerGroup';\r\n\r\nexport interface ConfigProperties\r\n{\r\n groups: GroupConfig[];\r\n}\r\n\r\ninterface Props extends ConfigProperties\r\n{\r\n dataId: string;\r\n justify: 'start' | 'middle' | 'end';\r\n propagated: object;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`root-visible-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'flex',\r\n },\r\n };\r\n }\r\n\r\n const sectionSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const groupSpacing = theme.freeflow.group.spacing[breakPoint];\r\n const sectionSpacing = theme.freeflow.section.spacing[breakPoint];\r\n\r\n sectionSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n marginBottom: -groupSpacing.vertical * 0.5,\r\n marginLeft: -groupSpacing.horizontal * 0.5,\r\n marginRight: -groupSpacing.horizontal * 0.5,\r\n marginTop: -groupSpacing.vertical * 0.5,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n 'justify-end':\r\n {\r\n justifyContent: 'flex-end',\r\n },\r\n 'justify-middle':\r\n {\r\n justifyContent: 'center',\r\n },\r\n 'justify-start':\r\n {\r\n justifyContent: 'flex-start',\r\n },\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'none',\r\n flexWrap: 'wrap',\r\n ...sectionSpaceStyle,\r\n } as CSSProperties,\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class FreeflowContainerSection extends\r\n React.Component & WithTheme>\r\n{\r\n public static isVisible(\r\n dataId: string,\r\n section: ConfigProperties,\r\n breakPoint: Breakpoint\r\n ): boolean\r\n {\r\n return section.groups.some(\r\n g => FreeflowContainerGroupBase.isVisible(dataId, g, breakPoint));\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const classes: string[] = [this.props.classes.root];\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (FreeflowContainerSection.isVisible(\r\n this.props.dataId, this.props, breakPoint))\r\n {\r\n const className = `root-visible-${breakPoint}`;\r\n classes.push(this.props.classes[className]);\r\n }\r\n }\r\n\r\n classes.push(this.props.classes[`justify-${this.props.justify}`]);\r\n\r\n return (\r\n
\r\n {\r\n this.props.groups.map(\r\n (group: GroupConfig, index: number) => (\r\n ))\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(FreeflowContainerSection));\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Presentation from '../coreui/Presentation';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel } from '../mustangui/Api';\r\nimport\r\n FreeflowContainerSection,\r\n {\r\n FreeflowContainerSection as FreeflowContainerSectionBase,\r\n ConfigProperties as SectionConfig,\r\n }\r\n from './FreeflowContainerSection';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n end: SectionConfig;\r\n middle: SectionConfig;\r\n propagated: object;\r\n start: SectionConfig;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const responsiveStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n responsiveStyles[`grid-1-column-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n gridTemplateColumns: '1fr',\r\n },\r\n };\r\n responsiveStyles[`grid-2-column-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n gridTemplateColumns: 'auto auto',\r\n },\r\n };\r\n responsiveStyles[`grid-3-column-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n gridTemplateColumns: '1fr auto 1fr',\r\n },\r\n };\r\n responsiveStyles[`spacer-visible-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'block',\r\n },\r\n };\r\n responsiveStyles[`root-visible-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'grid',\r\n },\r\n };\r\n }\r\n\r\n const sectionSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const sectionSpacing = theme.freeflow.section.spacing[breakPoint];\r\n\r\n sectionSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n gridColumnGap: `${sectionSpacing.horizontal}px`,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'none',\r\n ...sectionSpaceStyle,\r\n } as CSSProperties,\r\n spacer:\r\n {\r\n display: 'none',\r\n },\r\n ...responsiveStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nclass Freeflow extends\r\n React.Component & WithTheme>\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const rootClasses: string[] = [this.props.classes.root];\r\n const startSpacerClasses: string[] = [this.props.classes.spacer];\r\n const endSpacerClasses: string[] = [this.props.classes.spacer];\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n const startVisible = FreeflowContainerSectionBase.isVisible(\r\n this.props.dataId, this.props.start, breakPoint);\r\n const middleVisible = FreeflowContainerSectionBase.isVisible(\r\n this.props.dataId, this.props.middle, breakPoint);\r\n const endVisible = FreeflowContainerSectionBase.isVisible(\r\n this.props.dataId, this.props.end, breakPoint);\r\n\r\n const numberVisible = (startVisible ? 1 : 0)\r\n + (middleVisible ? 1 : 0)\r\n + (endVisible ? 1 : 0);\r\n\r\n if (numberVisible === 0)\r\n {\r\n continue;\r\n }\r\n\r\n rootClasses.push(this.props.classes[`root-visible-${breakPoint}`]);\r\n\r\n if (numberVisible === 1)\r\n {\r\n const grid1Column = `grid-1-column-${breakPoint}`;\r\n rootClasses.push(this.props.classes[grid1Column]);\r\n\r\n continue;\r\n }\r\n\r\n if (!middleVisible)\r\n {\r\n const grid2Column = `grid-2-column-${breakPoint}`;\r\n rootClasses.push(this.props.classes[grid2Column]);\r\n\r\n continue;\r\n }\r\n\r\n const grid3Column = `grid-3-column-${breakPoint}`;\r\n rootClasses.push(this.props.classes[grid3Column]);\r\n\r\n const spacerVisible = `spacer-visible-${breakPoint}`;\r\n if (!startVisible)\r\n {\r\n startSpacerClasses.push(this.props.classes[spacerVisible]);\r\n }\r\n\r\n if (!endVisible)\r\n {\r\n endSpacerClasses.push(this.props.classes[spacerVisible]);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(Freeflow));\r\n","import * as muiGrow from '@material-ui/core/Grow';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiGrow.GrowProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Grow extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!('in' in _props))\r\n {\r\n _props.in = true;\r\n }\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Grow);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props\r\n{\r\n inputElement: HTMLInputElement;\r\n onClose?: () => void;\r\n style?: React.CSSProperties;\r\n}\r\n\r\ninterface State\r\n{\r\n isFocused?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n focused:\r\n {\r\n '& > div > div:after': {\r\n transform: 'scaleX(1)',\r\n },\r\n },\r\n root:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n outline: 'none',\r\n position: 'absolute',\r\n right: 32,\r\n },\r\n });\r\n\r\nexport class ToolbarInputWrapper extends\r\n React.PureComponent, State>\r\n{\r\n public static className = 'input-wrapper';\r\n private rootElement: HTMLDivElement | null;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isFocused: false };\r\n }\r\n\r\n private onBlur = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node))\r\n {\r\n this.setState({ isFocused: false });\r\n }\r\n };\r\n\r\n private onFocus = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node))\r\n {\r\n this.setState({ isFocused: true });\r\n }\r\n };\r\n\r\n private onKeyUp = (event: React.KeyboardEvent) =>\r\n {\r\n if (event.keyCode === 13) // Enter\r\n {\r\n if (event.target === this.rootElement)\r\n {\r\n this.props.inputElement.focus();\r\n }\r\n else\r\n {\r\n this.rootElement!.focus();\r\n }\r\n }\r\n\r\n if (event.keyCode === 27 // Escape\r\n && event.target !== this.rootElement\r\n && this.props.onClose)\r\n {\r\n this.props.onClose();\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n return (\r\n this.rootElement = r}\r\n style={this.props.style}\r\n tabIndex={-1}\r\n >\r\n {this.props.children}\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ToolbarInputWrapper);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { GridApi, GridSizeChangedEvent } from 'ag-grid-community';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Grow from '../coreui/Grow';\r\nimport Icon from '../coreui/Icon';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport TextField from '../coreui/TextField';\r\nimport ToolbarInputWrapper from './ToolbarInputWrapper';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n filterValue: string;\r\n filterVisible: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class GridFilter extends\r\n React.PureComponent, State>\r\n{\r\n private buttonRef: HTMLButtonElement;\r\n private readonly gridApi: GridApi;\r\n private inputElement: HTMLInputElement;\r\n private lastTableWidth: number = 0;\r\n private setFilterTimeout: number;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.gridApi = props.propagated.parentTable.getApi();\r\n\r\n this.state =\r\n {\r\n filterValue: '',\r\n filterVisible: false,\r\n };\r\n\r\n if (!props.propagated.parentTable.isVerticalLayout)\r\n {\r\n this.gridApi.addEventListener(\r\n 'gridSizeChanged',\r\n this.onGridSizeChanged);\r\n }\r\n }\r\n\r\n private buttonOnClick = () =>\r\n {\r\n if (this.state.filterVisible)\r\n {\r\n this.close();\r\n }\r\n else\r\n {\r\n this.setState({ filterVisible: true });\r\n }\r\n };\r\n\r\n private close()\r\n {\r\n this.gridApi.setQuickFilter('');\r\n this.setState({ filterValue: '' });\r\n this.setState({ filterVisible: false });\r\n }\r\n\r\n private onGridSizeChanged = (event: GridSizeChangedEvent) =>\r\n {\r\n if (!this.state.filterVisible\r\n || this.lastTableWidth === event.clientWidth)\r\n {\r\n return;\r\n }\r\n\r\n this.lastTableWidth = event.clientWidth;\r\n\r\n // Filter processing is deferred so that the visible columns are up to\r\n // date before the filter is reapplied.\r\n setTimeout(\r\n () =>\r\n {\r\n // Must filter on a different value to force the filter to\r\n // reevaluate the value. Using a value to exclude\r\n // all rows for a cleaner display.\r\n this.gridApi.setQuickFilter('$does_not_exist$');\r\n this.gridApi.setQuickFilter(this.state.filterValue);\r\n });\r\n };\r\n\r\n private onGrowEnd = (node: HTMLElement): void =>\r\n {\r\n this.inputElement.focus();\r\n };\r\n\r\n private onGrowStart = (node: HTMLElement, isAppearing?: boolean): void =>\r\n {\r\n node.style.visibility = 'visible';\r\n this.inputElement.focus();\r\n };\r\n\r\n private onShrinkEnd = (node: HTMLElement): void =>\r\n {\r\n node.style.visibility = 'hidden';\r\n };\r\n\r\n private textFieldOnChange = (\r\n event: React.ChangeEvent) =>\r\n {\r\n const value: string = event.currentTarget.value;\r\n\r\n this.setState({ filterValue: value });\r\n\r\n window.clearTimeout(this.setFilterTimeout);\r\n this.setFilterTimeout = window.setTimeout(\r\n () =>\r\n {\r\n this.gridApi.setQuickFilter(value);\r\n },\r\n 300);\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n if (!this.props.propagated.parentTable.isVerticalLayout)\r\n {\r\n this.gridApi.removeEventListener(\r\n 'gridSizeChanged',\r\n this.onGridSizeChanged);\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const depth: number = this.props.propagated.parentTable.cardDepth;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n this.close();\r\n\r\n if (this.buttonRef)\r\n {\r\n this.buttonRef.focus();\r\n }\r\n }}\r\n >\r\n this.inputElement = element}\r\n label={Sys.getTranslation('Filter', 'DataTable')}\r\n onChange={this.textFieldOnChange}\r\n style={\r\n {\r\n width: this.props.propagated.parentTable.\r\n isVerticalLayout\r\n ? `calc(100vw - ${(depth * 32) + 64}px)`\r\n : 272,\r\n }}\r\n value={this.state.filterValue}\r\n variant=\"filled\"\r\n />\r\n \r\n \r\n this.buttonRef = r as HTMLButtonElement}\r\n fab\r\n onClick={this.buttonOnClick}\r\n size=\"small\"\r\n tabIndex={-1}\r\n >\r\n \r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridFilter);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { GridApi } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport Typography from '../coreui/Typography';\r\n\r\ninterface Props extends WithWidth\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n menuButtonRef?: HTMLButtonElement;\r\n pageMessage?: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n menuButton:\r\n {\r\n fontSize: 12,\r\n fontWeight: 400,\r\n letterSpacing: 'normal',\r\n marginLeft: 20,\r\n marginRight: 20,\r\n minWidth: 0,\r\n paddingLeft: 4,\r\n paddingRight: 4,\r\n textTransform: 'none',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class GridPager extends\r\n React.Component, State>\r\n{\r\n private readonly allPageSize = 999999;\r\n private currentPageCount = 0;\r\n private currentPageNumber = 0;\r\n private readonly gridApi: GridApi;\r\n private mounted: boolean = false;\r\n private nextButtonRef: HTMLButtonElement;\r\n private pageSizes: { label: string; onClick: () => void; size: number }[];\r\n private prevButtonRef: HTMLButtonElement;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.gridApi = props.propagated.parentTable.getApi();\r\n\r\n this.gridApi.paginationSetPageSize(\r\n props.propagated.parentTable.initialPageSize[props.width]);\r\n this.setPageSizes();\r\n\r\n this.gridApi.addEventListener(\r\n 'paginationChanged',\r\n this.setCurrentPageInfo);\r\n }\r\n\r\n private changePage(next: boolean)\r\n {\r\n if (next)\r\n {\r\n this.gridApi.paginationGoToNextPage();\r\n }\r\n else\r\n {\r\n this.gridApi.paginationGoToPreviousPage();\r\n }\r\n\r\n setTimeout(() =>\r\n {\r\n // If the button that was clicked is now disabled, focus the other\r\n // button. If this isn't done the control loses focus altogether\r\n const currentPage = this.gridApi.paginationGetCurrentPage();\r\n if (currentPage <= 0 && this.nextButtonRef)\r\n {\r\n this.nextButtonRef.focus();\r\n }\r\n if (currentPage >= this.gridApi.paginationGetTotalPages() - 1\r\n && this.prevButtonRef)\r\n {\r\n this.prevButtonRef.focus();\r\n }\r\n\r\n this.props.propagated.parentTable.scrollToTop();\r\n });\r\n }\r\n\r\n private setCurrentPageInfo = () =>\r\n {\r\n const count = this.gridApi.paginationGetRowCount();\r\n const first = Math.min(count, this.gridApi.getFirstDisplayedRow() + 1);\r\n const last = this.gridApi.getLastDisplayedRow() + 1;\r\n let pageMessage: string;\r\n\r\n this.currentPageNumber = this.gridApi.paginationGetCurrentPage();\r\n this.currentPageCount = this.gridApi.paginationGetTotalPages();\r\n\r\n if (this.gridApi.paginationGetPageSize() === 1)\r\n {\r\n pageMessage = Sys.getTranslation(\r\n '{currentRow} of {totalRows}', 'DataTable');\r\n pageMessage = pageMessage.replace(\r\n '{currentRow}', first.toString());\r\n pageMessage = pageMessage.replace(\r\n '{totalRows}', count.toString());\r\n }\r\n else\r\n {\r\n pageMessage = Sys.getTranslation(\r\n '{currentPageFirstRow}-{currentPageLastRow} of {totalRows}',\r\n 'DataTable');\r\n pageMessage = pageMessage.replace(\r\n '{currentPageFirstRow}', first.toString());\r\n pageMessage = pageMessage.replace(\r\n '{currentPageLastRow}', last.toString());\r\n pageMessage = pageMessage.replace(\r\n '{totalRows}', count.toString());\r\n }\r\n\r\n if (this.mounted)\r\n {\r\n this.setState({ pageMessage });\r\n }\r\n };\r\n\r\n private setMenuButtonRef = (ref: HTMLButtonElement) =>\r\n {\r\n this.setState((prevState) =>\r\n {\r\n if (prevState.menuButtonRef !== ref)\r\n {\r\n return { menuButtonRef: ref };\r\n }\r\n\r\n return {};\r\n });\r\n };\r\n\r\n private setPageSizes = () =>\r\n {\r\n this.pageSizes = [];\r\n let sizes: number[];\r\n\r\n if (this.props.propagated.parentTable.isVerticalLayout)\r\n {\r\n sizes = [1, 5, 10, 20, this.allPageSize];\r\n }\r\n else\r\n {\r\n sizes = [5, 10, 20, this.allPageSize];\r\n }\r\n\r\n sizes.forEach((size: number) =>\r\n {\r\n this.pageSizes.push(\r\n {\r\n label: size === this.allPageSize ? 'All' : size.toString(),\r\n onClick: () =>\r\n {\r\n const focusedCell = this.gridApi.getFocusedCell();\r\n\r\n this.gridApi.paginationSetPageSize(size);\r\n this.gridApi.paginationGoToFirstPage();\r\n\r\n if (focusedCell && focusedCell.rowIndex > (size - 1))\r\n {\r\n this.gridApi.clearFocusedCell();\r\n }\r\n\r\n MenuBase.closeAll();\r\n },\r\n size,\r\n });\r\n });\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n this.mounted = true;\r\n this.setCurrentPageInfo();\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n this.mounted = false;\r\n this.gridApi.removeEventListener(\r\n 'paginationChanged',\r\n this.setCurrentPageInfo);\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n const menuName = `${this.props.dataId}.${this.props.name}`;\r\n const pageSize = this.gridApi.paginationGetPageSize();\r\n const isFullWidth = this.props.propagated.parentTable.isVerticalLayout;\r\n\r\n const leftButton = (\r\n this.prevButtonRef = r as HTMLButtonElement}\r\n disabled={this.currentPageNumber === 0}\r\n icon=\"fas fa-chevron-left\"\r\n onClick={() => this.changePage(false)}\r\n size=\"small\"\r\n style={\r\n {\r\n marginLeft: isFullWidth ? 0 : 24,\r\n marginRight: isFullWidth ? 24 : 8,\r\n }}\r\n tabIndex={-1}\r\n />);\r\n\r\n return (\r\n \r\n {isFullWidth ? leftButton : null}\r\n \r\n \r\n {Sys.getTranslation('Rows per page:', 'DataTable')}\r\n \r\n \r\n MenuBase.open(menuName, this.state.menuButtonRef)}\r\n size=\"small\"\r\n tabIndex={-1}\r\n variant=\"text\"\r\n >\r\n {pageSize === this.allPageSize ? 'All' : pageSize}\r\n \r\n \r\n this.state.menuButtonRef!.focus()}\r\n open={false}\r\n >\r\n {this.pageSizes.map((p) =>\r\n {\r\n return (\r\n \r\n {p.label}\r\n );\r\n })}\r\n \r\n \r\n {this.state.pageMessage}\r\n \r\n \r\n {!isFullWidth ? leftButton : null}\r\n this.nextButtonRef = r as HTMLButtonElement}\r\n disabled={\r\n this.currentPageNumber >= (this.currentPageCount - 1)}\r\n icon=\"fas fa-chevron-right\"\r\n onClick={() => this.changePage(true)}\r\n size=\"small\"\r\n style={\r\n {\r\n marginLeft: isFullWidth ? 24 : 0,\r\n }}\r\n tabIndex={-1}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(GridPager));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport Typography from '../coreui/Typography';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n selectedRowCount: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class GridSelectedCount extends\r\n React.Component, State>\r\n{\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { selectedRowCount: 0 };\r\n }\r\n\r\n private updateSelectedRowCount = () =>\r\n {\r\n const parentTable = this.props.propagated.parentTable;\r\n this.setState(\r\n {\r\n selectedRowCount: parentTable.selection.getSelectedRows().length,\r\n });\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n this.props.propagated.parentTable.getApi().addEventListener(\r\n 'selectionChanged',\r\n this.updateSelectedRowCount);\r\n\r\n this.updateSelectedRowCount();\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n const tableApi = this.props.propagated.parentTable.getApi();\r\n if (tableApi)\r\n {\r\n tableApi.removeEventListener(\r\n 'selectionChanged',\r\n this.updateSelectedRowCount);\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n return (\r\n \r\n {Sys.getTranslation('{0} Selected', 'DataTable').replace(\r\n '{0}', this.state.selectedRowCount.toString())}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridSelectedCount);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Grid from '../coreui/Grid';\r\nimport GridItem from '../coreui/GridItem';\r\nimport Icon from '../coreui/Icon';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n headingSize:\r\n 'Level 1' | 'Level 2' | 'Level 3' | 'Level 4' | 'Level 5' | 'Level 6';\r\n iconName: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n headingText: string;\r\n helperText: string;\r\n showAsMandatory: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n goToTopBtn:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n marginRight: 8,\r\n\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n marginLeft: Sys.settings.baselineGridSize * 4,\r\n marginTop: Sys.settings.baselineGridSize * 1,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n marginLeft: Sys.settings.baselineGridSize * 6,\r\n marginTop: Sys.settings.baselineGridSize * 2,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginLeft: Sys.settings.baselineGridSize * 10,\r\n marginTop: Sys.settings.baselineGridSize * 4,\r\n },\r\n },\r\n helperText:\r\n {\r\n marginTop: 8,\r\n maxWidth: 580,\r\n },\r\n required:\r\n {\r\n '&:after':\r\n {\r\n color: Api.getSystemColor('danger'),\r\n content: '\" *\"',\r\n },\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class GroupHeading extends\r\n React.Component>\r\n{\r\n private readonly componentId: string;\r\n private readonly helperTextId: string;\r\n protected muiProps: muiTypography.TypographyProps;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.componentId = `group-heading-${Sys.nextId}`;\r\n this.helperTextId = `${this.componentId}-helper-text`;\r\n\r\n this.muiProps = {};\r\n\r\n if ('headingSize' in props)\r\n {\r\n this.muiProps.variant =\r\n Api.getTextStyle(props.headingSize);\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as RuntimeProperties;\r\n let icon: React.ReactNode = null;\r\n const button: React.ReactNode = null;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n\r\n this.muiProps.children = runtimeProperties.headingText;\r\n\r\n if (!Api.setAccessLevel(_props, runtimeProperties))\r\n {\r\n return null;\r\n }\r\n\r\n if ('iconName' in _props && _props.iconName)\r\n {\r\n icon =\r\n \r\n \r\n \r\n \r\n ;\r\n }\r\n\r\n const _muiProps = { ...this.muiProps };\r\n if (runtimeProperties.showAsMandatory)\r\n {\r\n _muiProps.className += `${_props.classes.required} `;\r\n }\r\n\r\n return (\r\n
\r\n \r\n {icon}\r\n \r\n \r\n \r\n {button}\r\n \r\n {runtimeProperties.helperText ? (\r\n \r\n {runtimeProperties.helperText}\r\n \r\n ) : null}\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GroupHeading);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Icon, { IconProps } from '../coreui/Icon';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface IconHeight\r\n{\r\n lg: number | undefined;\r\n md: number | undefined;\r\n sm: number | undefined;\r\n xs: number | undefined;\r\n}\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n iconHeight: IconHeight;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n iconName: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class IconDisplay extends\r\n React.Component>\r\n{\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n const muiProps =\r\n {\r\n icon: runtimeProperties.iconName,\r\n };\r\n\r\n if (runtimeProperties.alternateText)\r\n {\r\n muiProps['aria-label'] = runtimeProperties.alternateText;\r\n }\r\n\r\n let height: number | undefined = undefined;\r\n if (this.props.width in this.props.iconHeight)\r\n {\r\n height = this.props.iconHeight[this.props.width];\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(IconDisplay));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport FormData from '../coreui/FormData';\r\nimport Icon from '../coreui/Icon';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n label?: string;\r\n name: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n iconName: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n container:\r\n {\r\n alignItems: 'left',\r\n display: 'flex',\r\n width: '16px',\r\n },\r\n icon:\r\n {\r\n fontSize: 16,\r\n height: 'auto',\r\n },\r\n });\r\n\r\n@observer\r\nexport class IconDisplayVerticalLayout extends\r\n React.Component>\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel <= AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n const icon = (\r\n
\r\n \r\n
);\r\n\r\n if (this.props.label)\r\n {\r\n return (\r\n \r\n {icon}\r\n );\r\n }\r\n\r\n return icon;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(IconDisplayVerticalLayout);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport WithForwardedRef, { WithForwardedRefProps }\r\n from '../core/WithForwardedRef';\r\n\r\ninterface Props extends WithForwardedRefProps\r\n{\r\n className?: string;\r\n indent?: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n ...theme.overrides?.MuiMenuItem?.gutters,\r\n boxSizing: 'border-box',\r\n },\r\n });\r\n\r\nexport class MenuItemDisplay extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const rootClasses: string[] = [this.props.classes.root];\r\n if (this.props.className)\r\n {\r\n rootClasses.push(this.props.className);\r\n }\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(WithForwardedRef(MenuItemDisplay));\r\n","import { PopoverOrigin } from '@material-ui/core/Popover';\r\nimport\r\n {\r\n createStyles,\r\n makeStyles,\r\n Theme,\r\n useTheme,\r\n WithStyles,\r\n withStyles,\r\n withTheme,\r\n } from '@material-ui/core/styles';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Icon from '../coreui/Icon';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport MenuItemDisplay from '../coreui/MenuItemDisplay';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport { ButtonSize } from './ActionButton';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ApiButton from './ApiButton';\r\nimport { MenuItemProps } from './MenuItem';\r\nimport { ToolbarChildProps } from './Toolbar';\r\nimport { ToolbarOverflowChild } from './ToolbarContainerOverflowSection';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n iconName?: string;\r\n menuPane: object;\r\n name: string;\r\n propagated: { indent?: number } & ToolbarChildProps & object;\r\n renderAsLink: boolean;\r\n size: ButtonSize;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n label: string;\r\n}\r\n\r\ninterface State\r\n{\r\n buttonRef?: HTMLElement;\r\n}\r\n\r\nconst menuStyles = makeStyles((theme: Theme) => (\r\n{\r\n subMenuHeader: (props: { isDisabled: boolean }) => (\r\n {\r\n color: theme.palette.grey[props.isDisabled ? 300 : 800],\r\n cursor: 'default',\r\n }),\r\n}));\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class MenuButton extends\r\n React.Component, State>\r\n{\r\n private readonly menuName: string;\r\n\r\n public static renderFlatMenu(\r\n props:\r\n {\r\n children: React.ReactNode;\r\n header: string;\r\n iconName: string | undefined;\r\n indent: number;\r\n isDisabled: boolean;\r\n }\r\n )\r\n {\r\n const classes = menuStyles({ isDisabled: props.isDisabled });\r\n\r\n return (\r\n \r\n \r\n \r\n {props.iconName ? (\r\n \r\n ) : null}\r\n {props.header}\r\n \r\n \r\n {!props.isDisabled ? props.children : null}\r\n \r\n );\r\n }\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as ConfigProperties;\r\n const runtimeProps = props.runtime as RuntimeProperties;\r\n const propagated =\r\n configProps.propagated as ToolbarOverflowChild & { indent?: number };\r\n\r\n const indent = propagated && propagated.indent ? propagated.indent : 0;\r\n const isDrawerMenu = propagated ? propagated.isDrawerMenu : false;\r\n const gridSize = Sys.settings.baselineGridSize;\r\n const isDisabled: boolean =\r\n runtimeProps.accessLevel === AccessLevel.disabled;\r\n const [menuItemRef, setMenuItemRef] = React.useState();\r\n const menuName = `${configProps.dataId}.${configProps.name}`;\r\n\r\n const openMenu = () =>\r\n {\r\n if (runtimeProps.accessLevel >= AccessLevel.actionable)\r\n {\r\n MenuBase.open(menuName, menuItemRef);\r\n }\r\n };\r\n\r\n function setItemRef(ref: HTMLElement | null)\r\n {\r\n if (ref && ref !== menuItemRef)\r\n {\r\n setMenuItemRef(ref);\r\n }\r\n }\r\n\r\n const theme: Theme = useTheme();\r\n const isLargeBreakPoint: boolean =\r\n useMediaQuery(theme.breakpoints.up('lg'));\r\n\r\n if (isDrawerMenu || !isLargeBreakPoint)\r\n {\r\n return (\r\n \r\n {Presentation.create(\r\n configProps.menuPane,\r\n {\r\n ...propagated,\r\n indent: indent + gridSize * 6,\r\n }\r\n )}\r\n );\r\n }\r\n\r\n return (\r\n \r\n setItemRef(r)}\r\n >\r\n
\r\n
\r\n {runtimeProps.label}\r\n
\r\n \r\n
\r\n \r\n \r\n {Presentation.create(\r\n configProps.menuPane, { ...propagated, indent: 0 })}\r\n \r\n
);\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n this.menuName = `${props.dataId}.${props.name}`;\r\n }\r\n\r\n private openMenu = () =>\r\n {\r\n MenuBase.open(this.menuName, this.state.buttonRef);\r\n };\r\n\r\n private setButtonRef(ref: HTMLElement | null)\r\n {\r\n if (ref && ref !== this.state.buttonRef)\r\n {\r\n this.setState({ buttonRef: ref });\r\n }\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n\r\n let anchorOrigin: PopoverOrigin =\r\n { horizontal: 'left', vertical: 'bottom' };\r\n let ariaLabel: string | undefined = undefined;\r\n let iconName: string | undefined = this.props.iconName;\r\n let endIcon: string | undefined = 'fas fa-caret-down';\r\n\r\n if (runtimeProperties.label === null)\r\n {\r\n anchorOrigin = { horizontal: 'left', vertical: 48 };\r\n ariaLabel = Sys.getTranslation('Menu');\r\n iconName = 'fas fa-caret-down';\r\n endIcon = undefined;\r\n }\r\n\r\n return (\r\n \r\n this.setButtonRef(r)}\r\n label={runtimeProperties.label}\r\n endIcon={endIcon}\r\n iconName={iconName}\r\n name={this.props.name}\r\n onClick={this.openMenu}\r\n renderAsLink={this.props.renderAsLink}\r\n size={this.props.size}\r\n tabIndex={this.props.propagated\r\n && this.props.propagated.hasParentToolbar ? -1 : 0}\r\n />\r\n this.state.buttonRef!.focus()}\r\n open={false}\r\n >\r\n {Presentation.create(\r\n this.props.menuPane, this.props.propagated)}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(MenuButton));\r\n","import { createStyles, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport Link from '../coreui/Link';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport BaseService from '../services/BaseService';\r\nimport { MenuButton } from './MenuButton';\r\nimport { MenuItemProps } from './MenuItem';\r\nimport { ToolbarOverflowChild } from './ToolbarContainerOverflowSection';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: { indent?: number } & ToolbarOverflowChild;\r\n}\r\n\r\ninterface State\r\n{\r\n rootRef?: HTMLDivElement;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n largeVersion:\r\n {\r\n [theme.breakpoints.down('md')]:\r\n {\r\n display: 'none',\r\n },\r\n },\r\n smallVersion:\r\n {\r\n display: 'none',\r\n [theme.breakpoints.down('md')]:\r\n {\r\n display: 'inline-block',\r\n },\r\n },\r\n });\r\n\r\n@observer\r\nexport class LanguageSelect extends\r\n React.Component, State>\r\n{\r\n private currentLanguageCode: string;\r\n private menuName: string;\r\n\r\n private static changeLanguage = (languageCode: string) =>\r\n {\r\n BaseService.request(\r\n `LanguageSelect/OnChange/${languageCode}`\r\n ).then(() =>\r\n {\r\n Sys.clearRequestCache();\r\n });\r\n };\r\n\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as ConfigProperties;\r\n\r\n const indent: number = configProps.propagated\r\n && configProps.propagated.indent ? configProps.propagated.indent : 0;\r\n const gridSize: number = Sys.settings.baselineGridSize;\r\n\r\n return (\r\n \r\n {Sys.settings.availableLanguages.map(l => (\r\n LanguageSelect.changeLanguage(l.code)}\r\n />\r\n ))}\r\n );\r\n }\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.currentLanguageCode = Sys.settings.currentLanguageCode;\r\n this.menuName = `${props.dataId}.${props.name}`;\r\n }\r\n\r\n private openMenu = () =>\r\n {\r\n MenuBase.open(this.menuName, this.state.rootRef);\r\n };\r\n\r\n private setRootRef(ref: HTMLDivElement | null)\r\n {\r\n if (ref && ref !== this.state.rootRef)\r\n {\r\n this.setState({ rootRef: ref });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const languages = Sys.settings.availableLanguages;\r\n\r\n const currentLanuage = languages.find(\r\n l => l.code === this.currentLanguageCode);\r\n const ariaLabel: string = Sys.getTranslation('Change language');\r\n\r\n return (\r\n
this.setRootRef(r)}>\r\n
\r\n \r\n \r\n {currentLanuage!.description}\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n {languages.map(l => (\r\n LanguageSelect.changeLanguage(l.code)}\r\n selected={l.code === this.currentLanguageCode}\r\n />\r\n ))}\r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(LanguageSelect);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { LayoutChildProps } from '../config/Layout';\r\nimport { Drawer } from '../coreui/Drawer';\r\nimport FormData from '../coreui/FormData';\r\nimport Link from '../coreui/Link';\r\nimport { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ApiButton from './ApiButton';\r\nimport { MenuItemProps } from './MenuItem';\r\nimport { ToolbarChildProps } from './Toolbar';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n displayType: {\r\n lg: 'Link' | 'Small Button' | 'Medium Button' | 'Large Button';\r\n md: 'Link' | 'Small Button' | 'Medium Button' | 'Large Button';\r\n sm: 'Link' | 'Small Button' | 'Medium Button' | 'Large Button';\r\n xl: 'Link' | 'Small Button' | 'Medium Button' | 'Large Button';\r\n xs: 'Link' | 'Small Button' | 'Medium Button' | 'Large Button';\r\n };\r\n iconName: string;\r\n label?: string;\r\n linkType: 'External' | 'Internal';\r\n name: string;\r\n propagated?: ToolbarChildProps & LayoutChildProps;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n anchorText: string;\r\n url: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ManualLink extends\r\n React.Component>\r\n{\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProps = props.runtime as RuntimeProperties;\r\n\r\n const onClick = () =>\r\n {\r\n if (runtimeProps.accessLevel >= AccessLevel.actionable)\r\n {\r\n window.open(\r\n runtimeProps.url,\r\n configProps.linkType === 'Internal' ? '_self' : '_blank'\r\n );\r\n MenuBase.closeAll();\r\n Drawer.closeAll();\r\n }\r\n };\r\n\r\n return (\r\n \r\n {runtimeProps.anchorText}\r\n \r\n );\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as RuntimeProperties;\r\n\r\n const tabIndex: number = _props.propagated\r\n && (_props.propagated.hasParentToolbar\r\n || _props.propagated.isInPageFooter) ? -1 : 0;\r\n\r\n if (_props.displayType[this.props.width] === 'Link')\r\n {\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n let result: React.ReactNode = null;\r\n const link =\r\n ;\r\n\r\n if (_props.label)\r\n {\r\n result = {link};\r\n }\r\n else\r\n {\r\n result = link;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n let displayType: 'large' | 'medium' | 'small' | undefined = undefined;\r\n if (this.props.width in _props.displayType)\r\n {\r\n switch (_props.displayType[this.props.width])\r\n {\r\n case 'Small Button':\r\n displayType = 'small';\r\n break;\r\n case 'Medium Button':\r\n displayType = 'medium';\r\n break;\r\n case 'Large Button':\r\n displayType = 'large';\r\n break;\r\n default:\r\n throw new Error('Unknown manual link display type'\r\n + `${_props.displayType[this.props.width]}`);\r\n }\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(ManualLink));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Grid from '../coreui/Grid';\r\nimport GridItem from '../coreui/GridItem';\r\nimport Presentation from '../coreui/Presentation';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { AccessLevel, ValueByBreakpoint } from './Api';\r\nimport MustangGrid from './Grid';\r\n\r\ninterface Props\r\n{\r\n contentsGridWidth: ValueByBreakpoint;\r\n items: object[];\r\n media: MediaWidgetProps;\r\n mediaGrouping: MediaGrouping;\r\n orientation: Orientation;\r\n propagated: object;\r\n}\r\n\r\ninterface Orientation\r\n{\r\n lg: 'Left' | 'Top' | null;\r\n md: 'Left' | 'Top' | null;\r\n sm: 'Left' | 'Top' | null;\r\n xs: 'Left' | 'Top' | null;\r\n}\r\n\r\ninterface MediaGrouping\r\n{\r\n lg: 'Normal' | 'Tight' | null;\r\n md: 'Normal' | 'Tight' | null;\r\n sm: 'Normal' | 'Tight' | null;\r\n xs: 'Normal' | 'Tight' | null;\r\n}\r\n\r\ninterface MediaWidgetProps\r\n{\r\n props: RuntimeProperties;\r\n type: string;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n dataId: string;\r\n name: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n content:\r\n {\r\n minWidth: '100px',\r\n },\r\n lgleft:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n flexDirection: 'row',\r\n flexWrap: 'nowrap',\r\n },\r\n },\r\n lgleftcontent:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n alignSelf: 'center',\r\n marginLeft: Sys.settings.baselineGridSize * 10,\r\n },\r\n },\r\n lgtop:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n },\r\n },\r\n lgtopcontent:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginTop: Sys.settings.baselineGridSize * 10,\r\n },\r\n },\r\n mdleft:\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n flexDirection: 'row',\r\n flexWrap: 'nowrap',\r\n },\r\n },\r\n mdleftcontent:\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n alignSelf: 'center',\r\n marginLeft: Sys.settings.baselineGridSize * 6,\r\n },\r\n },\r\n mdtop:\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n },\r\n },\r\n mdtopcontent:\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginTop: Sys.settings.baselineGridSize * 6,\r\n },\r\n },\r\n root:\r\n {\r\n maxWidth: '100%',\r\n },\r\n smleft:\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n flexDirection: 'row',\r\n flexWrap: 'nowrap',\r\n },\r\n },\r\n smleftcontent:\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n alignSelf: 'center',\r\n marginLeft: Sys.settings.baselineGridSize * 6,\r\n },\r\n },\r\n smtop:\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n },\r\n },\r\n smtopcontent:\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n marginTop: Sys.settings.baselineGridSize * 6,\r\n },\r\n },\r\n xsleft:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n flexDirection: 'row',\r\n flexWrap: 'nowrap',\r\n },\r\n },\r\n xsleftcontent:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n alignSelf: 'center',\r\n marginLeft: Sys.settings.baselineGridSize * 4,\r\n },\r\n },\r\n xstop:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n },\r\n },\r\n xstopcontent:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginTop: Sys.settings.baselineGridSize * 4,\r\n },\r\n },\r\n });\r\n\r\n@observer\r\nexport class Media extends\r\n React.PureComponent & WithWidth>\r\n{\r\n private shouldRender(): boolean\r\n {\r\n const mediaWidgetProperties = this.props.media;\r\n\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n mediaWidgetProperties.props.dataId,\r\n mediaWidgetProperties.props.name) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return true;\r\n }\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.disabled)\r\n {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public render()\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n const rootClasses: string[] = [this.props.classes.root];\r\n const contentClasses: string[] = [this.props.classes.content];\r\n\r\n const breakPoints: Breakpoint[] = ['xs', 'sm', 'md', 'lg'];\r\n for (const breakPoint of breakPoints)\r\n {\r\n const orientation = this.props.orientation[breakPoint];\r\n if (orientation)\r\n {\r\n const className = `${breakPoint}${orientation.toLowerCase()}`;\r\n\r\n rootClasses.push(this.props.classes[className]);\r\n contentClasses.push(this.props.classes[`${className}content`]);\r\n }\r\n }\r\n\r\n const media: React.ReactNode = Presentation.create(\r\n this.props.media,\r\n this.props.propagated);\r\n const items: React.ReactNode[] = [];\r\n for (let i = 0; i < this.props.items.length; i++)\r\n {\r\n const item = this.props.items[i];\r\n items.push(\r\n
\r\n {Presentation.create(item, this.props.propagated)}\r\n
);\r\n }\r\n\r\n const gridGrouping =\r\n this.props.mediaGrouping[this.props.width] === 'Normal'\r\n ? 'Closely Related'\r\n : this.props.mediaGrouping[this.props.width];\r\n\r\n return (\r\n \r\n \r\n {media}\r\n \r\n \r\n \r\n {items}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(Media));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport { Drawer } from '../coreui/Drawer';\r\nimport { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ApiButton from './ApiButton';\r\nimport { MenuItemProps } from './MenuItem';\r\nimport { ToolbarChildProps } from './Toolbar';\r\n\r\ninterface Props\r\n{\r\n alternateText: string;\r\n buttonColor: 'Default' | 'Dark' | 'Danger' | 'Success';\r\n dataId: string;\r\n disabledHelpText: string;\r\n href: string;\r\n iconName: string;\r\n name: string;\r\n navigationType:\r\n 'New Component' |\r\n 'New Related Component' |\r\n 'New Process' |\r\n 'Existing Component' |\r\n 'Web Account';\r\n onClick: object;\r\n propagated?: ToolbarChildProps;\r\n renderAsLink: boolean;\r\n size:\r\n {\r\n lg: 'large' | 'medium' | 'small';\r\n md: 'large' | 'medium' | 'small';\r\n sm: 'large' | 'medium' | 'small';\r\n xl: 'large' | 'medium' | 'small';\r\n xs: 'large' | 'medium' | 'small';\r\n };\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n label: string;\r\n showDisabledHelp?: boolean;\r\n targetLayoutId?: number;\r\n targetObjectId?: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\nfunction generateUrl(runtimeProperties: RuntimeProperties)\r\n{\r\n const url = '#/object'\r\n + `/${runtimeProperties.targetObjectId}`\r\n + `/${runtimeProperties.targetLayoutId}`;\r\n return url;\r\n}\r\n\r\nfunction shouldGenerateUrl(navigationType: string)\r\n{\r\n if (navigationType === 'New Related Component'\r\n || navigationType === 'New Component'\r\n || navigationType === 'New Process')\r\n {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n@observer\r\nexport class PresentationButton extends\r\n React.PureComponent>\r\n{\r\n public static renderMenuItem(props: MenuItemProps): JSX.Element\r\n {\r\n const configProps = props.config as Props;\r\n const runtimeProperties =\r\n Api.getWidgetProperties(configProps) as RuntimeProperties;\r\n\r\n const onClick = () =>\r\n {\r\n if (props.runtime.accessLevel >= AccessLevel.actionable)\r\n {\r\n if (shouldGenerateUrl(configProps.navigationType))\r\n {\r\n window.open(generateUrl(runtimeProperties), '_self');\r\n }\r\n else\r\n {\r\n PresentationButton.requestNewRelatedObject(configProps);\r\n }\r\n MenuBase.closeAll();\r\n Drawer.closeAll();\r\n }\r\n };\r\n\r\n return (\r\n \r\n {runtimeProperties.label}\r\n \r\n );\r\n }\r\n\r\n public static requestNewRelatedObject(\r\n props: { dataId?: string; name?: string }\r\n ): void\r\n {\r\n Sys.confirmContinue(false).then(() =>\r\n {\r\n return RoundTripService.standardRoundTrip(\r\n 'PresentationButton/OnClick', props);\r\n }).catch(() =>\r\n {\r\n // User cancelled dialog, do nothing\r\n });\r\n }\r\n\r\n private onClick = () =>\r\n {\r\n PresentationButton.requestNewRelatedObject(this.props);\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n let size: 'large' | 'medium' | 'small' | undefined = undefined;\r\n if (this.props.width in this.props.size)\r\n {\r\n size = this.props.size[this.props.width];\r\n }\r\n\r\n let url: string | undefined = undefined;\r\n if (shouldGenerateUrl(this.props.navigationType))\r\n {\r\n url = generateUrl(runtimeProperties);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(PresentationButton));\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { ActionButton } from './ActionButton';\r\nimport Api, { AccessLevel } from './Api';\r\nimport { LanguageSelect } from './LanguageSelect';\r\nimport { ManualLink } from './ManualLink';\r\nimport { MenuButton } from './MenuButton';\r\nimport { PresentationButton } from './PresentationButton';\r\n\r\ninterface ConfigProperties\r\n{\r\n child: { props: MenuItemConfig; type: string };\r\n propagated: object;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\nexport interface MenuItemConfig\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: { indent?: number };\r\n type: string;\r\n}\r\n\r\nexport interface MenuItemProps\r\n{\r\n config: MenuItemConfig & object;\r\n runtime: { accessLevel: AccessLevel; validateCaptcha?: boolean } & object;\r\n}\r\n\r\n@observer\r\nexport class MenuItem extends\r\n React.Component\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const configProps =\r\n {\r\n ...this.props.child.props,\r\n propagated: this.props.propagated,\r\n };\r\n\r\n switch (this.props.child.type)\r\n {\r\n case 'LanguageSelect':\r\n return (\r\n );\r\n default:\r\n }\r\n\r\n const runtimeProperties = Api.getWidgetProperties(\r\n this.props.child.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n switch (this.props.child.type)\r\n {\r\n case 'ActionButton':\r\n return (\r\n );\r\n\r\n case 'ManualLink':\r\n return (\r\n );\r\n\r\n case 'MenuButton':\r\n return (\r\n );\r\n\r\n case 'PresentationButton':\r\n return (\r\n );\r\n\r\n default:\r\n throw new Error(\r\n `Unknown menu item type ${this.props.child.type}`);\r\n }\r\n }\r\n}\r\n\r\nexport default MenuItem;\r\n","import { createStyles, Theme, WithStyles, withStyles, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport MenuItem, { MenuItemConfig } from './MenuItem';\r\n\r\ninterface ConfigProperties\r\n{\r\n indent?: number;\r\n menuItems: { props: MenuItemConfig; type: string }[];\r\n propagated: object;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class MenuPane extends\r\n React.Component>\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const children: React.ReactNode[] = [];\r\n\r\n for (const childConfig of this.props.menuItems)\r\n {\r\n children.push(\r\n \r\n );\r\n }\r\n\r\n return {children};\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(MenuPane));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from './Button';\r\nimport MultilineTextFieldDialog from './MultilineTextFieldDialog';\r\nimport TextField, { TextFieldProps } from './TextField';\r\n\r\ninterface Props extends TextFieldProps\r\n{\r\n}\r\n\r\ninterface State\r\n{\r\n isDialogOpen: boolean;\r\n isFocused: boolean;\r\n isOverflowing: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n displayButton:\r\n {\r\n position: 'absolute',\r\n right: 8,\r\n\r\n // Bottom includes the helper text so it is simpler to set the top\r\n // property such that the button ends up 8 pixels above the bottom\r\n // of the field. This assumes that the field will have a fixed\r\n // height.\r\n top: 100,\r\n },\r\n displayButtonReadOnly:\r\n {\r\n bottom: 0,\r\n position: 'absolute',\r\n right: 0,\r\n },\r\n inputElement:\r\n {\r\n height: '100%',\r\n overflow: 'hidden',\r\n },\r\n inputRoot:\r\n {\r\n // If this height is changed, the editButton.top value also needs\r\n // to change to ensure the edit button is always 8px off the bottom\r\n // of the field.\r\n height: 132,\r\n },\r\n readOnlyContent:\r\n {\r\n overflow: 'hidden',\r\n },\r\n readOnlyRoot:\r\n {\r\n maxHeight: 132,\r\n },\r\n root:\r\n {\r\n position: 'relative',\r\n width: '100%',\r\n },\r\n });\r\n\r\n@observer\r\nexport class MultilineTextField extends\r\n React.Component, State>\r\n{\r\n private rawField: HTMLElement | null;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n isDialogOpen: false,\r\n isFocused: false,\r\n isOverflowing: false,\r\n };\r\n }\r\n\r\n private checkForOverflow()\r\n {\r\n const field = this.rawField!;\r\n\r\n this.setState(\r\n {\r\n isOverflowing: field.clientHeight < field.scrollHeight,\r\n });\r\n }\r\n\r\n private onBlur = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node)\r\n && event.currentTarget.contains(event.target as Node)\r\n && !this.state.isDialogOpen)\r\n {\r\n this.setState({ isFocused: false });\r\n }\r\n };\r\n\r\n private onDialogAccept = (value: string) =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n\r\n if (this.props.onValueChange)\r\n {\r\n this.props.onValueChange(value);\r\n }\r\n };\r\n\r\n private onDialogCancel = () =>\r\n {\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private onExpandButtonClick = () =>\r\n {\r\n this.setState({ isDialogOpen: true });\r\n };\r\n\r\n private onTextFieldFocus = (\r\n event: React.FocusEvent) =>\r\n {\r\n this.setState({ isFocused: true });\r\n };\r\n\r\n private onWindowResize = () =>\r\n {\r\n this.checkForOverflow();\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n this.checkForOverflow();\r\n window.addEventListener('resize', this.onWindowResize);\r\n }\r\n\r\n public componentDidUpdate(prevProps: Props, prevState: State)\r\n {\r\n if (prevProps.value !== this.props.value)\r\n {\r\n this.checkForOverflow();\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n window.removeEventListener('resize', this.onWindowResize);\r\n }\r\n\r\n public render()\r\n {\r\n const {\r\n classes,\r\n inputProps,\r\n InputProps,\r\n readOnly,\r\n readOnlyProps,\r\n ...otherProps\r\n } = this.props;\r\n\r\n let expandButton: React.ReactNode = null;\r\n if (this.state.isOverflowing || this.state.isFocused)\r\n {\r\n const className = readOnly\r\n ? classes.displayButtonReadOnly\r\n : classes.displayButton;\r\n\r\n const icon = this.state.isFocused && !readOnly\r\n ? 'fas fa-edit'\r\n : 'fas fa-ellipsis-h';\r\n\r\n expandButton = (\r\n );\r\n }\r\n\r\n if (readOnly)\r\n {\r\n otherProps.value = otherProps.value ? otherProps.value as string : '-';\r\n }\r\n\r\n return (\r\n
\r\n this.rawField = r,\r\n ...inputProps,\r\n }}\r\n InputProps={{\r\n classes:\r\n {\r\n input: classes.inputElement,\r\n root: classes.inputRoot,\r\n },\r\n ...InputProps,\r\n }}\r\n multiline={true}\r\n onFocus={this.onTextFieldFocus}\r\n readOnly={readOnly}\r\n readOnlyProps={{\r\n classes:\r\n {\r\n content: classes.readOnlyContent,\r\n root: classes.readOnlyRoot,\r\n },\r\n contentRef: (r: HTMLDivElement) => this.rawField = r,\r\n ...readOnlyProps,\r\n }}\r\n rows={1}\r\n type=\"text\"\r\n {...otherProps}\r\n />\r\n {expandButton}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(MultilineTextField);\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport MultilineTextField from '../coreui/MultilineTextField';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n dataSize: number;\r\n disabledHelpText: string;\r\n helperText: string;\r\n label: string;\r\n maxSizeError: string;\r\n name: string;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\n@observer\r\nexport class MLTextEdit extends React.Component\r\n{\r\n private getErrors = (value: string): string[] =>\r\n {\r\n const widgetProperties: WidgetProperties =\r\n Api.getWidgetProperties(this.props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return [];\r\n }\r\n\r\n const errors: string[] = [...widgetProperties.businessErrors];\r\n if (this.props.dataSize && value && value.length > this.props.dataSize)\r\n {\r\n errors.push(this.props.maxSizeError);\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n private onValueChange = (value: string) =>\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, value);\r\n };\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties: WidgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.disabled)\r\n {\r\n const disabledField: React.ReactNode = (\r\n \r\n );\r\n\r\n return widgetProperties.showDisabledHelp\r\n ? (\r\n \r\n {disabledField}\r\n \r\n )\r\n : disabledField;\r\n }\r\n\r\n const value = Presentation.getValue(_props) as string;\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default MLTextEdit;\r\n","import * as muiFormLabel from '@material-ui/core/FormLabel';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Presentation from './Presentation';\r\n\r\n// VERSION_WARNING Material-UI 4.9.1\r\n// MaterialUI's new \"generic\" component prop injection infrastructure seems to\r\n// break typescript. Specifically, it does not appear to exist on the Props\r\n// exposed by MaterialUI even though TypeScript thinks the prop is valid when\r\n// using the raw MUI component. The work around to this is to simply re-expose\r\n// the component prop here and then manually pass it on to the MUI component.\r\ninterface Props extends muiFormLabel.FormLabelProps\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n component?: React.ElementType;\r\n dataId?: string;\r\n name?: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class FormLabel extends\r\n React.Component>\r\n{\r\n public render()\r\n {\r\n const {\r\n children: childrenProp,\r\n component,\r\n dataId,\r\n name,\r\n ...otherProps\r\n } = this.props;\r\n\r\n let children = childrenProp;\r\n\r\n if (dataId && name)\r\n {\r\n children = Presentation.getValue(this.props);\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(FormLabel);\r\n","import * as muiRadioGroup from '@material-ui/core/RadioGroup';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiRadioGroup.RadioGroupProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class RadioGroup extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(RadioGroup);\r\n","import * as muiRadio from '@material-ui/core/Radio';\r\nimport { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport FormControlLabel from '../coreui/FormControlLabel';\r\nimport Icon from '../coreui/Icon';\r\nimport { Paper as PaperBase } from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n controlledGroupName: string;\r\n controlledPaneKeysByValue: object | null;\r\n dataId: string;\r\n isPaneController: boolean;\r\n label: string;\r\n margin: boolean;\r\n name: string;\r\n roundTripOnChange: boolean;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n value: any;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n icon:\r\n {\r\n // Makes the icon square\r\n marginRight: -1.1,\r\n },\r\n ripple:\r\n {\r\n overflow: 'visible',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ApiRadio extends\r\n React.Component>\r\n{\r\n protected muiProps: muiRadio.RadioProps;\r\n\r\n public constructor(props: Props & WithTheme & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n checkedIcon:\r\n ,\r\n color: 'default',\r\n icon:\r\n ,\r\n TouchRippleProps: { className: props.classes.ripple },\r\n };\r\n }\r\n\r\n private setBinding()\r\n {\r\n this.muiProps.onChange = () =>\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, this.props.value);\r\n };\r\n\r\n this.muiProps.checked = (\r\n Presentation.getValue(this.props) ===\r\n (this.props.value || ''));\r\n\r\n this.muiProps.value = Presentation.getValue(this.props);\r\n }\r\n\r\n protected showSubPane()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!_props.isPaneController)\r\n {\r\n return;\r\n }\r\n\r\n const value = Presentation.getValue(_props);\r\n const controlledPaneKey = _props.controlledPaneKeysByValue![value];\r\n\r\n const rowKey =\r\n _props['propagated'] ? _props['propagated']['rowKey'] : null;\r\n\r\n if (controlledPaneKey)\r\n {\r\n let paneKey = controlledPaneKey;\r\n if (rowKey)\r\n {\r\n paneKey += `_${rowKey}`;\r\n }\r\n\r\n PaperBase.show(paneKey);\r\n }\r\n else\r\n {\r\n let groupName = _props.controlledGroupName;\r\n if (rowKey)\r\n {\r\n groupName += `_${rowKey}`;\r\n }\r\n\r\n PaperBase.hideGroup(groupName);\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n this.showSubPane();\r\n }\r\n\r\n public componentDidUpdate()\r\n {\r\n this.showSubPane();\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (!Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n\r\n let style: React.CSSProperties = _props.margin ? { marginRight: 24 } : {};\r\n\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.checked = undefined;\r\n this.muiProps.value = '';\r\n\r\n return (\r\n }\r\n label={_props.label}\r\n style={style}\r\n />);\r\n }\r\n\r\n if (_props['readOnly'])\r\n {\r\n this.setBinding();\r\n\r\n style =\r\n {\r\n ...style,\r\n display: 'inline-flex',\r\n fontSize: 24,\r\n lineHeight: '24px',\r\n marginBottom: 8,\r\n marginTop: 8,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {_props.label}\r\n \r\n );\r\n }\r\n\r\n this.muiProps.disabled = false;\r\n this.setBinding();\r\n\r\n if (_props.roundTripOnChange)\r\n {\r\n this.muiProps.onChange = () =>\r\n {\r\n const value = Presentation.getValue(this.props);\r\n\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, this.props.value);\r\n\r\n RoundTripService.standardRoundTrip(\r\n 'RadioSelect/OnChange', this.props\r\n ).catch(() =>\r\n {\r\n // If the round trip fails, undo the value change.\r\n Presentation.setValue(this.props, value);\r\n });\r\n };\r\n }\r\n\r\n return (\r\n }\r\n label={_props.label}\r\n style={style}\r\n />);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(ApiRadio));\r\n","import { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport ComboBoxOption from '../coreui/ComboBoxOption';\r\nimport FormControl, { FormControlProps } from '../coreui/FormControl';\r\nimport FormLabel from '../coreui/FormLabel';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Presentation from '../coreui/Presentation';\r\nimport RadioGroup from '../coreui/RadioGroup';\r\nimport Typography from '../coreui/Typography';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ApiRadio from './ApiRadio';\r\n\r\ninterface Props\r\n{\r\n controlledGroupName: string;\r\n controlledPaneKeysByValue: object | null;\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n isPaneController: boolean;\r\n label: string;\r\n name: string;\r\n roundTripOnChange: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n options: ComboBoxOption[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n '&:hover': { backgroundColor: 'transparent' },\r\n backgroundColor: 'transparent',\r\n },\r\n });\r\n\r\n@observer\r\nexport class RadioSelect extends\r\n React.Component & WithWidth>\r\n{\r\n private readonly componentId: string;\r\n private readonly helperTextId: string;\r\n private readonly labelId: string;\r\n protected muiProps: FormControlProps;\r\n\r\n public constructor(\r\n props: Props & WithTheme & WithStyles & WithWidth)\r\n {\r\n super(props);\r\n\r\n this.componentId = `radio-select-${Sys.nextId}`;\r\n this.helperTextId = `${this.componentId}-helper-text`;\r\n this.labelId = `${this.componentId}-label`;\r\n\r\n this.muiProps = {};\r\n this.muiProps.FormHelperTextProps =\r\n {\r\n id: this.helperTextId,\r\n };\r\n this.muiProps.fullWidth = true;\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties: WidgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n\r\n if (Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n const options = [...widgetProperties.options];\r\n if (widgetProperties.selectedValue)\r\n {\r\n // Add the initially selected value as a historic option if is\r\n // not among the current candidates\r\n const optionInList = options.find(\r\n o => o.value === widgetProperties.selectedValue);\r\n\r\n if (optionInList === undefined)\r\n {\r\n const historicOption: ComboBoxOption =\r\n {\r\n display: widgetProperties.selectedDisplayValue,\r\n historic: true,\r\n value: widgetProperties.selectedValue,\r\n };\r\n\r\n options.push(historicOption);\r\n }\r\n }\r\n\r\n let label: React.ReactNode = null;\r\n if (_props.label)\r\n {\r\n label = (\r\n \r\n {_props.label}\r\n );\r\n }\r\n\r\n let radioGroup: React.ReactNode = (\r\n \r\n {\r\n options.map((o, index) =>(\r\n ))\r\n }\r\n );\r\n\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.required = false;\r\n this.muiProps.helperText = null;\r\n\r\n if (widgetProperties['showDisabledHelp'])\r\n {\r\n result =\r\n \r\n \r\n {label}\r\n \r\n {radioGroup}\r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n \r\n {label}\r\n {radioGroup}\r\n ;\r\n }\r\n }\r\n else\r\n {\r\n this.muiProps.disabled = false;\r\n this.muiProps.required = widgetProperties.showAsMandatory;\r\n\r\n Api.setHelperText(\r\n this,\r\n widgetProperties.businessErrors,\r\n this.muiProps);\r\n\r\n if (_props['readOnly'])\r\n {\r\n const value = Presentation.getValue(_props, null);\r\n const item = widgetProperties.options.find(_item =>\r\n _item.value === value);\r\n\r\n label = null;\r\n\r\n radioGroup =\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {item ? item.display : '-'}\r\n \r\n
;\r\n }\r\n\r\n result =\r\n \r\n {label}\r\n {radioGroup}\r\n ;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(withWidth()(RadioSelect)));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport ComboBoxOption from '../coreui/ComboBoxOption';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { TableVerticalLayoutProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport { AccessLevel } from './Api';\r\nimport ApiSelect from './ApiSelect';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n label: string;\r\n name: string;\r\n propagated?: TableVerticalLayoutProps;\r\n roundTripOnChange: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n options: ComboBoxOption[];\r\n selectedDisplayValue: string;\r\n selectedValue: string | null;\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n minWidth: 150,\r\n },\r\n });\r\n\r\n@observer\r\nexport class RelationshipComboBox extends\r\n React.Component>\r\n{\r\n private getOptions(runtimeProps: RuntimeProperties)\r\n {\r\n // Check if Widget is rendered in the vertical layout of a grid\r\n if (this.props.propagated?.parentTable)\r\n {\r\n const selectedOption: ComboBoxOption =\r\n {\r\n display: runtimeProps.selectedDisplayValue,\r\n value: runtimeProps.selectedValue,\r\n };\r\n\r\n const table = this.props.propagated.parentTable;\r\n return table.getRelationshipComboBoxOptions(\r\n this.props.name,\r\n selectedOption);\r\n }\r\n\r\n const options = [...runtimeProps.options];\r\n\r\n if (runtimeProps.selectedValue)\r\n {\r\n // Add the initially selected value as a historic option if is not\r\n // among the current candidates\r\n const optionInList = options.find(\r\n o => o.value === runtimeProps.selectedValue);\r\n\r\n if (optionInList === undefined)\r\n {\r\n const historicOption: ComboBoxOption =\r\n {\r\n display: runtimeProps.selectedDisplayValue,\r\n historic: true,\r\n value: runtimeProps.selectedValue,\r\n };\r\n\r\n options.push(historicOption);\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private onSelect = (event: React.ChangeEvent) =>\r\n {\r\n const value = Presentation.getValue(this.props);\r\n\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, event.target.value);\r\n\r\n if (!this.props.roundTripOnChange)\r\n {\r\n return;\r\n }\r\n\r\n RoundTripService.standardRoundTrip(\r\n 'RelationshipComboBox/OnChange', this.props\r\n ).catch(() =>\r\n {\r\n // If the round trip fails, undo the value change.\r\n Presentation.setValue(this.props, value);\r\n });\r\n };\r\n\r\n public render(): React.ReactNode\r\n {\r\n let rowKey = null;\r\n if (this.props.propagated?.parentTable)\r\n {\r\n // Widget is rendered in the vertical layout of a grid.\r\n rowKey = this.props.propagated.rowKey;\r\n }\r\n\r\n const row = PaneRow.get(this.props.dataId, rowKey);\r\n if (!row)\r\n {\r\n return null;\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options = this.getOptions(runtimeProps);\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(RelationshipComboBox);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Presentation from '../coreui/Presentation';\r\n\r\ninterface ConfigProperties\r\n{\r\n horizontalLayout: object;\r\n propagated: object;\r\n verticalLayout: object;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class ResponsiveGrid extends\r\n React.Component>\r\n{\r\n private horizontalLayout: React.ReactNode | null = null;\r\n private verticalLayout: React.ReactNode | null = null;\r\n\r\n public constructor(\r\n props: ConfigProperties & WithWidth & WithStyles)\r\n {\r\n super(props);\r\n\r\n if (props.horizontalLayout)\r\n {\r\n this.horizontalLayout = Presentation.create(\r\n props.horizontalLayout,\r\n props.propagated);\r\n }\r\n if (props.verticalLayout)\r\n {\r\n this.verticalLayout = Presentation.create(\r\n props.verticalLayout,\r\n props.propagated);\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n // The key attribute tells React to recreate the component from\r\n // scratch when the break point changes. Without this child\r\n // components are reused and constructors are not called\r\n\r\n if (this.props.verticalLayout && this.props.width === 'xs')\r\n {\r\n return (\r\n \r\n {this.verticalLayout}\r\n \r\n );\r\n }\r\n if (this.props.horizontalLayout && this.props.width !== 'xs')\r\n {\r\n return (\r\n \r\n {this.horizontalLayout}\r\n \r\n );\r\n }\r\n\r\n // If a grid is moved between break points so the presentation server\r\n // can't combine them, multiple responsive grids will be rendered\r\n // causing them to trigger this code path at some break points\r\n return null;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(ResponsiveGrid));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Api, { AccessLevel } from './Api';\r\nimport { RuntimeProperties, SelectChildProps } from './SelectControl';\r\n\r\ninterface ConfigProperties\r\n{\r\n propagated: SelectChildProps;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class SearchButton extends\r\n React.Component>\r\n{\r\n private onClick = () =>\r\n {\r\n this.props.propagated.parentSelect.search(null);\r\n };\r\n\r\n public render()\r\n {\r\n const selectProps = this.props.propagated.parentSelect.configProps;\r\n const runtimeProperties =\r\n Api.getWidgetProperties(selectProps) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.readOnly)\r\n {\r\n return null;\r\n }\r\n\r\n if (!runtimeProperties.canAddRemoveRows)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SearchButton);\r\n","import { createStyles, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withMobileDialog, { WithMobileDialog }\r\n from '@material-ui/core/withMobileDialog';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport Logging from '../core/Logging';\r\nimport Sys, { BusinessError } from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Dialog, { BreakPointColumn } from '../coreui/Dialog';\r\nimport DialogActions from '../coreui/DialogActions';\r\nimport DialogContent from '../coreui/DialogContent';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport Presentation, { CreatedReactElement } from '../coreui/Presentation';\r\nimport ProcessingMask from '../coreui/ProcessingMask';\r\nimport Typography from '../coreui/Typography';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport PresentationService from '../services/PresentationService';\r\nimport RoundTripService, { RoundTripResponse }\r\n from '../services/RoundTripService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport Grid from './Grid';\r\nimport GridItem from './GridItem';\r\n\r\ninterface ConfigProperties extends WithMobileDialog\r\n{\r\n criteriaPane: object;\r\n dataId: string;\r\n dialogTitle: string;\r\n disabledHelpText: string;\r\n isSingleSelect: boolean;\r\n name: string;\r\n selectDialogId: number;\r\n selectedDataId: string;\r\n selectedGrid: object;\r\n}\r\n\r\ninterface DialogOpenResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\nexport interface SelectChildProps\r\n{\r\n parentRowObjectHandle?: string;\r\n parentSelect: {\r\n configProps: {\r\n dataId: string;\r\n isSingleSelect: boolean;\r\n name: string;\r\n };\r\n getSelectedRowObjectHandles: () => string[];\r\n onRowSelected: (rowKey: string) => void;\r\n onRowsRemoved: (rowKeys: string[]) => void;\r\n onRowUnselected: (rowKey: string) => void;\r\n search: (criteriaWidgetName: string | null) => void;\r\n };\r\n}\r\n\r\nexport interface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n canAddRemoveRows: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\ninterface SearchResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n paneDataByDataId: PaneDataByDataId;\r\n}\r\n\r\ninterface State\r\n{\r\n breakPointColumns?: BreakPointColumn[];\r\n dialogContents?: CreatedReactElement;\r\n isDialogOpen?: boolean;\r\n isLoadingData?: boolean;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const dialogWidths = {};\r\n for (const breakPoint of theme.spacingBreakPoints.filter(b => b !== 'xs'))\r\n {\r\n const maxWidth = theme.panel.maxWidths[breakPoint];\r\n\r\n dialogWidths[`dialog-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.up(breakPoint)]:\r\n {\r\n width: maxWidth,\r\n },\r\n };\r\n }\r\n\r\n return createStyles(\r\n {\r\n ...dialogWidths,\r\n errorText:\r\n {\r\n color: Api.getSystemColor('danger'),\r\n },\r\n });\r\n};\r\n\r\n@observer\r\nexport class SelectControl extends\r\n React.Component, State>\r\n{\r\n private criteriaPane: React.ReactNode | null = null;\r\n private propagated: SelectChildProps;\r\n private lastElementFocused: HTMLElement | null = null;\r\n private selectedGrid: React.ReactNode | null = null;\r\n private selectionChanges:\r\n { addedRowKeys: string[]; removedRowKeys: string[] };\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isDialogOpen: false, isLoadingData: false };\r\n\r\n this.selectionChanges = { addedRowKeys: [], removedRowKeys: [] };\r\n\r\n this.propagated = {\r\n parentSelect: {\r\n configProps: {\r\n dataId: this.props.dataId,\r\n isSingleSelect: this.props.isSingleSelect,\r\n name: this.props.name,\r\n },\r\n getSelectedRowObjectHandles:\r\n this.getCurrentlySelectedRowObjectHandles,\r\n onRowSelected: this.onRowSelected,\r\n onRowsRemoved: this.onRowsRemoved,\r\n onRowUnselected: this.onRowUnselected,\r\n search: this.search,\r\n },\r\n };\r\n\r\n this.criteriaPane =\r\n Presentation.create(props.criteriaPane, this.propagated);\r\n this.selectedGrid =\r\n Presentation.create(props.selectedGrid, this.propagated);\r\n }\r\n\r\n private acceptDialog = () =>\r\n {\r\n if (this.selectionChanges.addedRowKeys.length <= 0\r\n && this.selectionChanges.removedRowKeys.length <= 0)\r\n {\r\n this.cancelDialog();\r\n\r\n return;\r\n }\r\n\r\n this.setState({ isLoadingData: true });\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n RoundTripService.standardRoundTrip(\r\n 'SelectControl/OnDialogClose',\r\n this.props,\r\n {\r\n addedObjectIds: this.selectionChanges.addedRowKeys,\r\n removedObjectIds: this.selectionChanges.removedRowKeys,\r\n },\r\n true\r\n ).then((response: RoundTripResponse) =>\r\n {\r\n if (response.businessErrors && response.businessErrors.length > 0)\r\n {\r\n return;\r\n }\r\n\r\n AppServer.clearStateRecoveryPoint();\r\n this.setState({ isDialogOpen: false });\r\n })\r\n .catch((response) =>\r\n {\r\n Logging.error(response);\r\n return response;\r\n })\r\n .finally(() =>\r\n {\r\n this.setState({ isLoadingData: false });\r\n });\r\n };\r\n\r\n private cancelDialog = () =>\r\n {\r\n AppServer.recoverStateFromPoint();\r\n this.setState({ isDialogOpen: false });\r\n };\r\n\r\n private getCurrentlySelectedRowObjectHandles = (): string[] =>\r\n {\r\n let selectedObjectHandles: string[] =\r\n this.getInitiallySelectedRowObjectHandles();\r\n\r\n selectedObjectHandles = selectedObjectHandles.filter(\r\n h => !this.selectionChanges.removedRowKeys.includes(h));\r\n\r\n selectedObjectHandles =\r\n selectedObjectHandles.concat(this.selectionChanges.addedRowKeys);\r\n\r\n return selectedObjectHandles;\r\n };\r\n\r\n private getInitiallySelectedRowObjectHandles = (): string[] =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.selectedDataId);\r\n\r\n const selectedObjectHandles: string[] = [];\r\n for (const row of rows)\r\n {\r\n selectedObjectHandles.push(row.objectHandle);\r\n }\r\n\r\n return selectedObjectHandles;\r\n };\r\n\r\n private getRowKey(): string\r\n {\r\n const observable = Presentation.getObservable(\r\n this.props)! as PaneRow;\r\n\r\n return observable.rowKey;\r\n }\r\n\r\n private onDialogExited = () =>\r\n {\r\n Presentation.clearPaneData(this.props.selectDialogId.toString());\r\n this.setState({ dialogContents: undefined });\r\n\r\n // Manually focus the element since the processing animation interferes\r\n // with the dialog returning the focus\r\n this.lastElementFocused!.focus();\r\n };\r\n\r\n private onRowSelected = (rowKey: string) =>\r\n {\r\n const index = this.selectionChanges.removedRowKeys.indexOf(rowKey);\r\n if (index >= 0)\r\n {\r\n this.selectionChanges.removedRowKeys.splice(index, 1);\r\n }\r\n else if (this.selectionChanges.addedRowKeys.indexOf(rowKey) < 0)\r\n {\r\n if (this.props.isSingleSelect)\r\n {\r\n this.selectionChanges.addedRowKeys = [rowKey];\r\n\r\n const selectedRowKeys: string[] =\r\n this.getInitiallySelectedRowObjectHandles();\r\n if (selectedRowKeys.length > 0\r\n && !this.selectionChanges.removedRowKeys.includes(\r\n selectedRowKeys[0]))\r\n {\r\n this.selectionChanges.removedRowKeys.push(\r\n selectedRowKeys[0]);\r\n }\r\n }\r\n else\r\n {\r\n this.selectionChanges.addedRowKeys.push(rowKey);\r\n }\r\n }\r\n };\r\n\r\n private onRowsRemoved = (rowKeys: string[]) =>\r\n {\r\n RoundTripService.standardRoundTrip(\r\n 'SelectControl/OnRemoveRows',\r\n this.props,\r\n { removedObjectIds: rowKeys }\r\n ).catch((response) =>\r\n {\r\n Logging.error(response);\r\n return response;\r\n });\r\n };\r\n\r\n private onRowUnselected = (rowKey: string) =>\r\n {\r\n const index = this.selectionChanges.addedRowKeys.indexOf(rowKey);\r\n if (index >= 0)\r\n {\r\n this.selectionChanges.addedRowKeys.splice(index, 1);\r\n }\r\n else if (this.selectionChanges.removedRowKeys.indexOf(rowKey) < 0)\r\n {\r\n this.selectionChanges.removedRowKeys.push(rowKey);\r\n }\r\n };\r\n\r\n private openDialog(criteriaWidgetName: string | null)\r\n {\r\n this.lastElementFocused = document.activeElement as HTMLElement;\r\n RequestsStore.instance.processingStarted();\r\n\r\n this.selectionChanges.addedRowKeys = [];\r\n this.selectionChanges.removedRowKeys = [];\r\n\r\n const dialogOpenUrl = 'SelectControl/OnDialogOpen'\r\n + `/${this.getRowKey()}/${this.props.dataId}/${this.props.name}`;\r\n const dialogOpenPostArgs = { criteriaWidgetName };\r\n\r\n const dialogOpenRequest =\r\n RoundTripService.customRoundTrip(\r\n dialogOpenUrl, undefined, dialogOpenPostArgs);\r\n\r\n const selectDialogId: string = this.props.selectDialogId.toString();\r\n const configRequest = PresentationService.getConfigForSelectDialog(\r\n selectDialogId);\r\n\r\n AppServer.createStateRecoveryPoint();\r\n\r\n Promise.all([dialogOpenRequest, configRequest]).then(\r\n ([dialogOpenResponse, configResponse]) =>\r\n {\r\n const validationErrors = dialogOpenResponse.validationErrors;\r\n if (validationErrors && validationErrors.length > 0)\r\n {\r\n Sys.showErrors(validationErrors);\r\n AppServer.clearStateRecoveryPoint();\r\n\r\n return;\r\n }\r\n\r\n if (dialogOpenResponse.businessErrors.length > 0)\r\n {\r\n Sys.setBusinessErrors(\r\n dialogOpenResponse.businessErrors,\r\n true);\r\n }\r\n\r\n const scripts: object = configResponse.scriptsByDataId;\r\n\r\n Presentation.setPanes(selectDialogId, scripts);\r\n Sys.loadScripts(scripts);\r\n\r\n AppServer.setState(dialogOpenResponse.appServerState);\r\n PaneDataStore.loadResponse(dialogOpenResponse.paneDataByDataId);\r\n\r\n const dialogContents = Presentation.create(\r\n configResponse.presentationConfig, this.propagated)!;\r\n\r\n this.setState({\r\n breakPointColumns: configResponse.breakPoints,\r\n dialogContents,\r\n isDialogOpen: true,\r\n });\r\n }\r\n ).finally(() => RequestsStore.instance.processingStopped());\r\n }\r\n\r\n private search = (criteriaWidgetName: string | null) =>\r\n {\r\n if (!this.state.isDialogOpen)\r\n {\r\n this.openDialog(criteriaWidgetName);\r\n\r\n return;\r\n }\r\n\r\n const url = 'SelectControl/OnSearch'\r\n + `/${this.getRowKey()}/${this.props.dataId}/${this.props.name}`;\r\n const postArgs = { criteriaWidgetName };\r\n\r\n this.setState({ isLoadingData: true });\r\n RoundTripService.customRoundTrip(url, undefined, postArgs)\r\n .then((response: SearchResponse) =>\r\n {\r\n if (response.businessErrors.length > 0)\r\n {\r\n Sys.setBusinessErrors(response.businessErrors, true);\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n })\r\n .finally(() => this.setState({ isLoadingData: false }));\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.disabled)\r\n {\r\n if (runtimeProperties.showDisabledHelp)\r\n {\r\n return (\r\n \r\n {this.criteriaPane}\r\n \r\n );\r\n }\r\n\r\n return this.criteriaPane;\r\n }\r\n\r\n const selectedRows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.selectedDataId);\r\n const noRowsSelected: boolean = selectedRows.length === 0;\r\n\r\n // The wrapping divs are used to prevent the Grid margin from overriding\r\n // the parent GridItem margin\r\n return (\r\n
\r\n \r\n \r\n
{this.criteriaPane}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.dialogTitle}\r\n \r\n \r\n \r\n {this.state.dialogContents}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n {Sys.getTranslation('Cancel')}\r\n \r\n \r\n \r\n \r\n \r\n {this.selectedGrid}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withMobileDialog({ breakpoint: 'xs' })(\r\n withStyles(styles)(SelectControl));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Table, { TableChildProps, TableProps } from '../coreui/Table';\r\nimport AsyncData, { GetDataResponse } from '../coreui/table/AsyncData';\r\nimport PaneRow from '../models/PaneRow';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport GridColumn, { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport ErrorBoundary from './ErrorBoundary';\r\nimport { SelectChildProps } from './SelectControl';\r\n\r\ninterface ConfigProperties extends WithWidth\r\n{\r\n cardDepth: number;\r\n columns: GridColumnConfigProperties[];\r\n contentDataId: string;\r\n data?: object;\r\n dataId: string;\r\n footerToolbar?: object;\r\n headerToolbar?: object;\r\n name: string;\r\n propagated?: SelectChildProps;\r\n selectionToolbar?: object;\r\n tableKey: string;\r\n verticalLayout?: object;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class SelectControlSelectedGrid extends\r\n React.Component>\r\n{\r\n private populate: ((rows: TrackableModel[]) => void) | null = null;\r\n private propagated: TableChildProps & SelectChildProps;\r\n private tableProps: TableProps;\r\n\r\n public constructor(\r\n props: ConfigProperties & WithWidth & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.propagated = {\r\n parentTable:\r\n {\r\n cardDepth: props.cardDepth,\r\n columns: props.columns,\r\n configProps:\r\n {\r\n contentDataId: props.contentDataId,\r\n data: props.data,\r\n dataId: props.dataId,\r\n name: props.name,\r\n },\r\n isDocumentGrid: false,\r\n populateData: () => this.populateData(),\r\n },\r\n ...props.propagated,\r\n } as TableChildProps & SelectChildProps;\r\n\r\n this.tableProps = {\r\n cardDepth: props.cardDepth,\r\n cellEdit: true,\r\n columns: [],\r\n contentDataId: props.contentDataId,\r\n dataId: props.dataId,\r\n footerToolbarChild: props.footerToolbar,\r\n headerToolbarChild: props.headerToolbar,\r\n isColumnFlex: (colId: string) =>\r\n GridColumn.isColumnFlex(props.columns, colId),\r\n isColumnVisible: (colId: string, breakpoint: string) =>\r\n GridColumn.isColumnVisible(\r\n props.columns, colId, breakpoint),\r\n minRowHeight:\r\n GridColumn.getColumnsMinRowHeight(props.columns),\r\n name: props.name,\r\n propagated: this.propagated,\r\n rowSelection: 'multiple',\r\n selectToolbarChild: props.selectionToolbar,\r\n setPopulate: populate => this.populate = populate,\r\n };\r\n }\r\n\r\n private getData = () =>\r\n {\r\n return RoundTripService.partialDataRetrevial(\r\n `SelectControl/GetRowsData/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`\r\n );\r\n };\r\n\r\n private getRowKey(): string\r\n {\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n return observable.rowKey;\r\n }\r\n\r\n private populateData = () =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n if (this.populate !== null)\r\n {\r\n this.populate(rows);\r\n }\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n for (const column of this.props.columns)\r\n {\r\n this.tableProps.columns.push(GridColumn.getColumnDef(\r\n column,\r\n this.props.columns,\r\n this.propagated));\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ConfigProperties)\r\n {\r\n if (prevProps.width !== this.props.width)\r\n {\r\n setTimeout(() => this.populateData());\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(SelectControlSelectedGrid));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { autorun, IReactionDisposer } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Table, { TableChildProps, TableProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport GridColumn, { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport ErrorBoundary from './ErrorBoundary';\r\nimport { SelectChildProps } from './SelectControl';\r\n\r\ninterface ConfigProperties\r\n{\r\n columns: GridColumnConfigProperties[];\r\n contentDataId: string;\r\n data?: object;\r\n footerToolbar: object;\r\n headerToolbar: object;\r\n propagated: SelectChildProps;\r\n tableKey: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class SelectDialogResultsGrid extends\r\n React.Component>\r\n{\r\n private dataMonitorDisposer: IReactionDisposer;\r\n private populate: ((rows: TrackableModel[]) => void) | null = null;\r\n private propagated: TableChildProps;\r\n private tableProps: TableProps;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n const parentSelect = props.propagated.parentSelect;\r\n\r\n this.propagated = {\r\n parentTable:\r\n {\r\n cardDepth: 0,\r\n columns: props.columns,\r\n configProps:\r\n {\r\n contentDataId: props.contentDataId,\r\n data: props.data,\r\n dataId: parentSelect.configProps.dataId,\r\n name: parentSelect.configProps.name,\r\n },\r\n isDocumentGrid: false,\r\n populateData: () => this.populateData(),\r\n },\r\n } as TableChildProps;\r\n\r\n this.tableProps = {\r\n cardDepth: 0,\r\n cellEdit: true,\r\n columns: [],\r\n contentDataId: props.contentDataId,\r\n dataId: parentSelect.configProps.dataId,\r\n disableSelectAll: true,\r\n footerToolbarChild: props.footerToolbar,\r\n getSelectedRowKeys: parentSelect.getSelectedRowObjectHandles,\r\n headerToolbarChild: props.headerToolbar,\r\n ignoreBusinessErrors: true,\r\n initialPageSize: {\r\n lg: 5,\r\n md: 5,\r\n sm: 5,\r\n xl: 5,\r\n xs: 5,\r\n },\r\n isColumnFlex: (colId: string) =>\r\n GridColumn.isColumnFlex(props.columns, colId),\r\n isColumnVisible: (colId: string, breakpoint: string) =>\r\n GridColumn.isColumnVisible(\r\n props.columns, colId, breakpoint),\r\n minRowHeight:\r\n GridColumn.getColumnsMinRowHeight(props.columns),\r\n name: parentSelect.configProps.name,\r\n onRowSelected: parentSelect.onRowSelected,\r\n onRowUnselected: parentSelect.onRowUnselected,\r\n propagated: this.propagated,\r\n resetPageOnPopulate: true,\r\n rowSelection: parentSelect.configProps.isSingleSelect\r\n ? 'single' : 'multiple',\r\n setPopulate: populate => this.populate = populate,\r\n showNoData: true,\r\n };\r\n }\r\n\r\n private populateData = () =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n if (this.populate !== null)\r\n {\r\n this.populate(rows);\r\n }\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n for (const column of this.props.columns)\r\n {\r\n this.tableProps.columns.push(GridColumn.getColumnDef(\r\n column,\r\n this.props.columns,\r\n this.propagated));\r\n }\r\n\r\n setTimeout(() =>\r\n {\r\n this.dataMonitorDisposer = autorun(() => this.populateData());\r\n });\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.dataMonitorDisposer)\r\n {\r\n this.dataMonitorDisposer();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SelectDialogResultsGrid);\r\n","import lightGreen from '@material-ui/core/colors/lightGreen';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport Dialog from '../Dialog';\r\nimport DialogContent from '../DialogContent';\r\nimport Typography from '../Typography';\r\n\r\ninterface Props\r\n{\r\n onClose: () => void;\r\n open: boolean;\r\n percent: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n innerProgress:\r\n {\r\n backgroundColor: lightGreen[500],\r\n height: 8,\r\n transitionProperty: 'width',\r\n transitionTimingFunction: 'linear',\r\n },\r\n outerProgress:\r\n {\r\n backgroundColor: lightGreen[100],\r\n height: 8,\r\n marginTop: 24,\r\n width: '100%',\r\n },\r\n });\r\n\r\nexport class UploadDialog extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const duration: string =\r\n this.props.percent > 90 && this.props.percent < 100 ? '5s' : '.1s';\r\n\r\n return (\r\n \r\n \r\n \r\n {Sys.getTranslation('Uploading...')}\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(UploadDialog);\r\n","import { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { IReactionDisposer, reaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport { FileInfo, ProgressStatus } from '../../stores/DocumentStore';\r\nimport PaneDataStore from '../../stores/PaneDataStore';\r\nimport RequestsStore from '../../stores/RequestsStore';\r\nimport Icon from '../Icon';\r\nimport Typography from '../Typography';\r\nimport UploadDialog from './UploadDialog';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n enabled: boolean;\r\n files: FileInfo[];\r\n renderProgressDialog: boolean;\r\n uploadFiles: (files: FileList) => Promise;\r\n}\r\n\r\ninterface State\r\n{\r\n dialogPercent?: number;\r\n isDialogOpen?: boolean;\r\n isDragging?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class DocumentDropArea extends\r\n React.Component, State>\r\n{\r\n private dragEnterStack: number = 0;\r\n private filesDisposer: IReactionDisposer;\r\n private isFinalizing = false;\r\n private lastFilesNumber = 0;\r\n // Dictionary of upload progress, keyed by upload file.\r\n private progress: Map = new Map();\r\n private progressTotal: number = 0;\r\n\r\n public constructor(props: Props & WithTheme & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {\r\n dialogPercent: 0,\r\n isDialogOpen: false,\r\n isDragging: false,\r\n };\r\n\r\n this.filesDisposer = reaction(\r\n () => this.props.files.map((f) =>\r\n {\r\n return { event: f.event, file: f.file, status: f.status };\r\n }),\r\n (files: FileInfo[]) =>\r\n {\r\n if (files.length > 0 && this.lastFilesNumber === 0)\r\n {\r\n this.progress.clear();\r\n this.progressTotal = 0;\r\n if (this.props.renderProgressDialog)\r\n {\r\n this.setState({ isDialogOpen: true });\r\n }\r\n }\r\n else if (files.length === 0 && this.lastFilesNumber > 0)\r\n {\r\n if (this.props.renderProgressDialog)\r\n {\r\n this.setState({ isDialogOpen: false });\r\n }\r\n else\r\n {\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n this.isFinalizing = false;\r\n }\r\n\r\n for (const fileInfo of files)\r\n {\r\n this.uploadProgress(\r\n fileInfo.file, fileInfo.status, fileInfo.event);\r\n }\r\n\r\n this.lastFilesNumber = files.length;\r\n });\r\n }\r\n\r\n private onDragEnterIntoDocument = () =>\r\n {\r\n this.dragEnterStack++;\r\n\r\n if (this.props.enabled)\r\n {\r\n this.setState({ isDragging: true });\r\n }\r\n };\r\n\r\n private onDragLeaveOutOfDocument = () =>\r\n {\r\n this.dragEnterStack--;\r\n\r\n if (this.dragEnterStack < 1)\r\n {\r\n this.setState({ isDragging: false });\r\n }\r\n };\r\n\r\n private onDragOverIntoWidget = (event: React.DragEvent) =>\r\n {\r\n event.dataTransfer.dropEffect = 'copy';\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n return false;\r\n };\r\n\r\n private onDropIntoDocument = (event: DragEvent) =>\r\n {\r\n // Delay so the widget drop event fires (delay the re-render)\r\n setTimeout(() =>\r\n {\r\n this.dragEnterStack = 0;\r\n this.setState({ isDragging: false });\r\n });\r\n\r\n event.preventDefault();\r\n\r\n return false;\r\n };\r\n\r\n private onDropIntoWidget = (event: React.DragEvent) =>\r\n {\r\n this.props.uploadFiles(event.dataTransfer.files);\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n return false;\r\n };\r\n\r\n private updatePercent(percent: number)\r\n {\r\n if (percent >= this.state.dialogPercent!)\r\n {\r\n this.setState({ dialogPercent: percent });\r\n\r\n // When complete wait 1 second and then close the dialog.\r\n if (percent === 100)\r\n {\r\n setTimeout(() => this.setState({ isDialogOpen: false }), 1000);\r\n }\r\n }\r\n }\r\n\r\n private uploadProgress(\r\n file: File, status: ProgressStatus, event?: ProgressEvent)\r\n {\r\n switch (status)\r\n {\r\n case 'Finalized':\r\n break;\r\n\r\n case 'Ongoing':\r\n if (!this.props.renderProgressDialog || !event)\r\n {\r\n return;\r\n }\r\n\r\n let percent: number = 0;\r\n\r\n // Loaded may report more bytes than the file size.\r\n if (event.loaded < file.size)\r\n {\r\n this.progress.set(file, event.loaded);\r\n }\r\n\r\n this.progress.forEach((loaded) => { percent += loaded; });\r\n\r\n if (event.loaded / event.total >= 1)\r\n {\r\n percent = 98;\r\n }\r\n else\r\n {\r\n // Only show 90% complete until the upload has finished\r\n percent =\r\n Math.round(((percent / this.progressTotal) / 1.11) * 100);\r\n }\r\n\r\n this.updatePercent(percent);\r\n break;\r\n\r\n case 'Started':\r\n this.progress.set(file, 0);\r\n this.progressTotal += file.size;\r\n this.setState({ dialogPercent: 0 });\r\n break;\r\n\r\n case 'Uploaded':\r\n if (!this.isFinalizing)\r\n {\r\n if (this.props.renderProgressDialog)\r\n {\r\n this.updatePercent(100);\r\n }\r\n else\r\n {\r\n RequestsStore.instance.processingStarted(\r\n Sys.getTranslation('Finalizing upload'));\r\n }\r\n\r\n this.isFinalizing = true;\r\n }\r\n break;\r\n\r\n default:\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n document.body.addEventListener(\r\n 'dragenter', this.onDragEnterIntoDocument);\r\n document.body.addEventListener(\r\n 'dragleave', this.onDragLeaveOutOfDocument);\r\n document.body.addEventListener('drop', this.onDropIntoDocument);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n document.body.removeEventListener(\r\n 'dragenter', this.onDragEnterIntoDocument);\r\n document.body.removeEventListener(\r\n 'dragleave', this.onDragLeaveOutOfDocument);\r\n document.body.removeEventListener('drop', this.onDropIntoDocument);\r\n\r\n if (this.filesDisposer)\r\n {\r\n this.filesDisposer();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const borderColor = this.props.theme.palette.grey[300];\r\n const isDropable = this.props.enabled && !Sys.isMobile;\r\n const isEmpty =\r\n PaneDataStore.getPaneCollection(this.props.dataId).length === 0;\r\n\r\n return (\r\n \r\n {this.state.isDragging ? (\r\n \r\n \r\n \r\n \r\n \r\n {Sys.getTranslation('Drop Files to Upload')}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {Sys.getTranslation('Drag & Drop')}\r\n \r\n \r\n  {Sys.getTranslation('Files to Upload')}\r\n \r\n \r\n \r\n this.setState({ isDialogOpen: false })}\r\n open={this.state.isDialogOpen!}\r\n percent={this.state.dialogPercent!}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(DocumentDropArea));\r\n","import { observable } from 'mobx';\r\nimport AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport Sys from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport PaneRow from '../models/PaneRow';\r\nimport DocumentService, { DocumentUploadResponse }\r\n from '../services/DocumentService';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\n\r\nexport interface CompleteDocumentUploadResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n uploadErrorsByRowKey: object;\r\n}\r\n\r\nexport interface CreateDocumentRowsResponse\r\n{\r\n appServerState: AppServerState;\r\n newRows: PaneRow[];\r\n uploadErrorsByRowKey: object;\r\n validationErrors: string[];\r\n}\r\n\r\nexport interface FileInfo\r\n{\r\n event?: ProgressEvent;\r\n file: File;\r\n status: ProgressStatus;\r\n}\r\n\r\nexport type ProgressStatus = 'Started' | 'Ongoing' | 'Uploaded' | 'Finalized';\r\n\r\nexport default class DocumentStore\r\n{\r\n private completeUpload:\r\n (uploadedFiles: object[]) => Promise;\r\n private contentDataId: string;\r\n private createRows:\r\n (fileInfo: object[]) => Promise;\r\n private onModelChanged: () => void;\r\n\r\n @observable public documents: FileInfo[] = [];\r\n\r\n constructor(\r\n contentDataId: string,\r\n completeUpload:\r\n (uploadedFiles: object[]) => Promise,\r\n createRows: (fileInfo: object[]) => Promise,\r\n onModelChanged: () => void\r\n )\r\n {\r\n this.contentDataId = contentDataId;\r\n this.completeUpload = completeUpload;\r\n this.createRows = createRows;\r\n this.onModelChanged = onModelChanged;\r\n }\r\n\r\n private clearDocuments()\r\n {\r\n this.documents.length = 0;\r\n }\r\n\r\n private uploadError(file: File, errors: string[])\r\n {\r\n file['hasError'] = true;\r\n\r\n Sys.showErrors(errors.map(error => `${file.name} - ${error}`));\r\n\r\n TrackableCollection.deleteRow(this.contentDataId, file['rowKey']);\r\n\r\n this.onModelChanged();\r\n }\r\n\r\n private uploadProgress(file: File, event: ProgressEvent)\r\n {\r\n const uploaded = this.documents.find(f => f.file === file);\r\n if (uploaded)\r\n {\r\n uploaded.status = 'Ongoing';\r\n uploaded.event = event;\r\n }\r\n }\r\n\r\n public async uploadFiles(\r\n dataId: string,\r\n widgetName: string,\r\n files: File[]\r\n ): Promise\r\n {\r\n if (files.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n RequestsStore.instance.processingStarted();\r\n\r\n const fileInfo: object[] = [];\r\n\r\n for (const file of files)\r\n {\r\n fileInfo.push(\r\n {\r\n fileName: file.name,\r\n size: file.size,\r\n });\r\n }\r\n\r\n return this.createRows(fileInfo).then((\r\n createResponse: CreateDocumentRowsResponse) =>\r\n {\r\n RequestsStore.instance.processingStopped();\r\n\r\n if (createResponse.validationErrors.length > 0)\r\n {\r\n Sys.showErrors(createResponse.validationErrors);\r\n\r\n return;\r\n }\r\n\r\n const collection = TrackableModel.models.get(\r\n this.contentDataId) as TrackableCollection;\r\n const newModels: TrackableModel[] = [];\r\n const newRows: PaneRow[] = createResponse.newRows;\r\n const uploadErrors: object = createResponse['uploadErrorsByRowKey'];\r\n let newRow: PaneRow;\r\n\r\n AppServer.setState(createResponse.appServerState);\r\n PaneDataStore.clearDeletedRows();\r\n\r\n // Files must be inserted in reverse order to match the data\r\n // returned by the server.\r\n const filesMap = new Map();\r\n for (let index = files.length - 1; index >= 0; index--)\r\n {\r\n newModels.push(TrackableModel.create(\r\n collection.modelName, collection.dataId, newRows[index]));\r\n }\r\n\r\n collection.unshift(...newModels);\r\n collection.observableCollection!.unshift(...newModels);\r\n this.onModelChanged();\r\n\r\n files.forEach((file, index) =>\r\n {\r\n newRow = newRows[index] as PaneRow;\r\n filesMap.set(newRow.rowKey, file);\r\n file['rowKey'] = newRow.rowKey;\r\n });\r\n\r\n for (const rowKey of Object.keys(uploadErrors))\r\n {\r\n if (uploadErrors[rowKey].length && filesMap.has(rowKey))\r\n {\r\n this.uploadError(\r\n filesMap.get(rowKey)!,\r\n uploadErrors[rowKey]);\r\n }\r\n }\r\n\r\n if (files.every((file) => { return file['hasError']; }))\r\n {\r\n this.clearDocuments();\r\n\r\n return;\r\n }\r\n\r\n for (const file of files)\r\n {\r\n this.documents.push({ file, status: 'Started' });\r\n }\r\n\r\n const batch: Promise[] =\r\n DocumentService.uploadFiles(\r\n dataId,\r\n widgetName,\r\n files,\r\n (file: File, progressEvent: ProgressEvent) =>\r\n { this.uploadProgress(file, progressEvent); },\r\n (file: File, errors: string[]) =>\r\n { this.uploadError(file, errors); });\r\n\r\n return Promise.all(batch).then((uploadResponses) =>\r\n {\r\n const uploadedFiles: object[] = [];\r\n\r\n uploadResponses.forEach((responseData) =>\r\n {\r\n if (filesMap.has(responseData.clientKey)\r\n && !filesMap.get(responseData.clientKey)!['hasError'])\r\n {\r\n uploadedFiles.push(\r\n {\r\n pendingDocumentId:\r\n responseData.pendingDocumentId,\r\n pendingThumbnailId:\r\n responseData.pendingThumbnailId,\r\n rowKey: responseData.clientKey,\r\n });\r\n }\r\n });\r\n\r\n for (const file of files)\r\n {\r\n const uploaded = this.documents.find(f => f.file === file);\r\n if (uploaded)\r\n {\r\n uploaded.status = 'Uploaded';\r\n }\r\n }\r\n\r\n return this.completeUpload(uploadedFiles).then((\r\n completeResponse: CompleteDocumentUploadResponse) =>\r\n {\r\n const errors: object =\r\n completeResponse.uploadErrorsByRowKey;\r\n\r\n AppServer.setState(completeResponse.appServerState);\r\n\r\n PaneDataStore.loadResponse(completeResponse.paneDataByDataId);\r\n\r\n for (const file of files)\r\n {\r\n if (file['rowKey'] in errors\r\n && errors[file['rowKey']].length)\r\n {\r\n this.uploadError(file, errors[file['rowKey']]);\r\n }\r\n else if (!file['hasError'])\r\n {\r\n const uploaded =\r\n this.documents.find(f => f.file === file);\r\n if (uploaded)\r\n {\r\n uploaded.status = 'Finalized';\r\n }\r\n }\r\n }\r\n\r\n this.clearDocuments();\r\n }).catch(() =>\r\n {\r\n this.clearDocuments();\r\n });\r\n }).catch(() =>\r\n {\r\n this.clearDocuments();\r\n });\r\n }).catch(() =>\r\n {\r\n this.clearDocuments();\r\n });\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { State as AppServerState } from '../core/AppServer';\r\nimport Sys from '../core/Sys';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport ComboBoxOption from '../coreui/ComboBoxOption';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Table, { TableChildProps, TableProps } from '../coreui/Table';\r\nimport AsyncData, { GetDataResponse } from '../coreui/table/AsyncData';\r\nimport DocumentDropArea from '../coreui/table/DocumentDropArea';\r\nimport PaneRow from '../models/PaneRow';\r\nimport PresentationService from '../services/PresentationService';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport DocumentStore,\r\n{ CompleteDocumentUploadResponse, CreateDocumentRowsResponse }\r\n from '../stores/DocumentStore';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport GridColumn, { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport TableEditDialog, { AcceptResponse } from './Columns/TableEditDialog';\r\nimport ErrorBoundary from './ErrorBoundary';\r\nimport { GridRelatedEditButton } from './GridRelatedEditButton';\r\n\r\ninterface ConfigProperties extends WithWidth\r\n{\r\n cardDepth: number;\r\n columns: GridColumnConfigProperties[];\r\n contentDataId: string;\r\n data?: object;\r\n dataId: string;\r\n dialogLayoutId?: number;\r\n footerToolbar?: object;\r\n headerToolbar?: object;\r\n isDocumentGrid: boolean;\r\n maxFileBytes: number | null;\r\n maxFileBytesError: string;\r\n name: string;\r\n rowSelection: boolean;\r\n selectionToolbar?: object;\r\n summaryToolbar?: object;\r\n tableKey: string;\r\n validExtensions: string[];\r\n validExtensionsError: string;\r\n verticalLayout?: object;\r\n}\r\n\r\ninterface DialogCloseResponse extends AcceptResponse\r\n{\r\n}\r\n\r\ninterface DialogOpenResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n relationshipComboBoxOptions: { name: string; options: ComboBoxOption[] }[];\r\n}\r\n\r\ninterface State\r\n{\r\n editDialogInfo?: { isFirstOpenOfNewRow: boolean; rowKey: string };\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class SimpleGridControl extends\r\n React.Component<\r\n ConfigProperties & WithWidth & WithStyles, State>\r\n{\r\n private documentStore: DocumentStore;\r\n private populate: ((rows: TrackableModel[]) => void) | null = null;\r\n private propagated: TableChildProps;\r\n private restoreLostFocus: (() => void) | null;\r\n private scrollToRow: ((rowKey: string) => void) | null;\r\n private tableProps: TableProps;\r\n\r\n public constructor(\r\n props: ConfigProperties & WithWidth & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.propagated = {\r\n parentTable:\r\n {\r\n cardDepth: props.cardDepth,\r\n columns: props.columns,\r\n configProps:\r\n {\r\n contentDataId: props.contentDataId,\r\n data: props.data,\r\n dataId: props.dataId,\r\n name: props.name,\r\n },\r\n getRelationshipComboBoxOptions:\r\n this.getRelationshipComboBoxOptions,\r\n hasRelatedEditDialog: props.dialogLayoutId ? true : false,\r\n isDocumentGrid: props.isDocumentGrid,\r\n openRowEditDialog: (r, i) => this.openRowEditDialog(r, i),\r\n populateData: () => this.populateData(),\r\n uploadFiles: this.onUploadFiles,\r\n validExtensions: props.validExtensions,\r\n },\r\n } as TableChildProps;\r\n\r\n this.tableProps = {\r\n cardDepth: props.cardDepth,\r\n cellEdit: true,\r\n columns: [],\r\n contentDataId: props.contentDataId,\r\n dataId: props.dataId,\r\n footerToolbarChild: props.footerToolbar,\r\n headerToolbarChild: props.headerToolbar,\r\n isColumnFlex: (colId: string) =>\r\n GridColumn.isColumnFlex(props.columns, colId),\r\n isColumnVisible: (colId: string, breakpoint: string) =>\r\n GridColumn.isColumnVisible(\r\n props.columns, colId, breakpoint),\r\n isDocumentGrid: props.isDocumentGrid!,\r\n minRowHeight:\r\n GridColumn.getColumnsMinRowHeight(props.columns),\r\n name: props.name,\r\n propagated: this.propagated,\r\n rowSelection: props.rowSelection ? 'multiple' : undefined,\r\n selectToolbarChild: props.selectionToolbar,\r\n setPopulate: populate => this.populate = populate,\r\n setRestoreLostFocus:\r\n restoreFocus => this.restoreLostFocus = restoreFocus,\r\n setScrollToRow: scrollToRow => this.scrollToRow = scrollToRow,\r\n summaryToolbarChild: props.summaryToolbar,\r\n };\r\n\r\n this.documentStore = new DocumentStore(\r\n props.contentDataId,\r\n this.completeUpload,\r\n this.createRows,\r\n this.populateData\r\n );\r\n }\r\n\r\n private completeUpload = (uploadedFiles: object[]) =>\r\n {\r\n return RoundTripService.customRoundTrip(\r\n `SimpleGridControl/CompleteDocumentUpload/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { uploadedFiles }\r\n );\r\n };\r\n\r\n private createRows = (fileInfo: object[]) =>\r\n {\r\n return RoundTripService.customRoundTrip(\r\n `SimpleGridControl/CreateDocumentRows/${this.getRowKey()}/`\r\n + `${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { fileInfo }\r\n );\r\n };\r\n\r\n private getData = () =>\r\n {\r\n return RoundTripService.partialDataRetrevial(\r\n `SimpleGridControl/GetRowsData/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`\r\n );\r\n };\r\n\r\n private getRelationshipComboBoxOptions = (\r\n widgetName: string,\r\n selectedOption: ComboBoxOption\r\n ): ComboBoxOption[] =>\r\n {\r\n const row = PaneRow.get(this.props.dataId);\r\n if (!row)\r\n {\r\n return [];\r\n }\r\n\r\n const widget = row.getWidget(this.props.name);\r\n const runtimeProps = widget.properties as RuntimeProperties;\r\n\r\n const options =\r\n [\r\n ...runtimeProps.relationshipComboBoxOptions.find(\r\n o => o.name === widgetName)!.options,\r\n ];\r\n\r\n if (selectedOption.value)\r\n {\r\n const optionInList = options.find(\r\n o => o.value === selectedOption.value);\r\n\r\n if (optionInList === undefined)\r\n {\r\n const historicOption = { ...selectedOption };\r\n historicOption.historic = true;\r\n options.push(historicOption);\r\n }\r\n }\r\n\r\n return options;\r\n };\r\n\r\n private getRowKey(): string\r\n {\r\n const observable = Presentation.getObservable(this.props)! as PaneRow;\r\n return observable.rowKey;\r\n }\r\n\r\n private onDialogAccept = (parentRowKey: string) =>\r\n {\r\n return RoundTripService.customRoundTrip(\r\n `SimpleGridControl/OnDialogClose/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { dialogRowKey: parentRowKey }\r\n );\r\n };\r\n\r\n private onDialogClose = (accepted: boolean) =>\r\n {\r\n if (accepted && this.state.editDialogInfo!.isFirstOpenOfNewRow)\r\n {\r\n this.scrollToRow!(this.state.editDialogInfo!.rowKey);\r\n }\r\n\r\n this.setState({ editDialogInfo: undefined });\r\n };\r\n\r\n private onDialogOpen = (parentRowKey: string) =>\r\n {\r\n const layoutId = this.props.dialogLayoutId!.toString();\r\n\r\n const configRequest = PresentationService.getConfigForDialog(layoutId);\r\n\r\n const dialogOpenRequest =\r\n RoundTripService.customRoundTrip(\r\n `SimpleGridControl/OnDialogOpen/${this.getRowKey()}`\r\n + `/${this.props.dataId}/${this.props.name}`,\r\n undefined,\r\n { dialogRowKey: parentRowKey }\r\n );\r\n\r\n return Promise.all(\r\n [dialogOpenRequest, configRequest]\r\n ).then(([dialogOpenResponse, configResponse]) =>\r\n {\r\n return { ...dialogOpenResponse, ...configResponse, layoutId };\r\n });\r\n };\r\n\r\n private onUploadFiles = async (files: FileList): Promise =>\r\n {\r\n const validFiles: File[] = [];\r\n\r\n for (let i = 0; i < files.length; i++)\r\n {\r\n const file: File = files[i];\r\n const fullFileName: string = file.name;\r\n const index: number = fullFileName.lastIndexOf('.');\r\n const extension: string =\r\n index > 0 ? fullFileName.substring(index + 1) : '';\r\n\r\n const errors: string[] = [];\r\n\r\n if (this.props.validExtensions?.indexOf(\r\n extension.toLowerCase()) < 0)\r\n {\r\n errors.push(this.props.validExtensionsError.replace(\r\n '{extension}', extension));\r\n }\r\n\r\n if (this.props.maxFileBytes !== null\r\n && file.size > this.props.maxFileBytes)\r\n {\r\n errors.push(this.props.maxFileBytesError);\r\n }\r\n\r\n if (errors.length === 0)\r\n {\r\n validFiles.push(file);\r\n }\r\n else\r\n {\r\n Sys.showErrors(errors.map(error => `${file.name} - ${error}`));\r\n }\r\n }\r\n\r\n if (validFiles.length > 0)\r\n {\r\n await this.documentStore.uploadFiles(\r\n this.props.dataId,\r\n this.props.name,\r\n validFiles);\r\n }\r\n };\r\n\r\n private openRowEditDialog(rowKey: string, isFirstOpenOfNewRow: boolean)\r\n {\r\n this.setState({ editDialogInfo: { isFirstOpenOfNewRow, rowKey } });\r\n }\r\n\r\n private populateData = () =>\r\n {\r\n const rows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(this.props.contentDataId);\r\n\r\n if (this.populate !== null)\r\n {\r\n this.populate(rows);\r\n }\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n for (const column of this.props.columns)\r\n {\r\n this.tableProps.columns.push(GridColumn.getColumnDef(\r\n column,\r\n this.props.columns,\r\n this.propagated));\r\n }\r\n\r\n if (this.props.dialogLayoutId)\r\n {\r\n this.tableProps.columns.push(GridRelatedEditButton.createColDef(\r\n this.propagated));\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ConfigProperties)\r\n {\r\n if (prevProps.width !== this.props.width)\r\n {\r\n setTimeout(() => this.populateData());\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n this.tableProps.hideEmptyDocument = this.props.isDocumentGrid\r\n && runtimeProperties.accessLevel >= AccessLevel.enterable;\r\n\r\n const dropProps =\r\n {\r\n dataId: this.props.contentDataId,\r\n enabled: this.tableProps.hideEmptyDocument,\r\n files: this.documentStore.documents,\r\n uploadFiles: this.onUploadFiles,\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n }\r\n fullWidthChild={this.props.verticalLayout}\r\n tableKey={this.props.tableKey}\r\n uploadFiles={this.documentStore.documents}\r\n />\r\n this.populateData()}\r\n onExited={() => this.restoreLostFocus!()}\r\n onOpen={this.onDialogOpen}\r\n parentRowKey={this.state.editDialogInfo\r\n ? this.state.editDialogInfo.rowKey : undefined}\r\n />\r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(SimpleGridControl));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Paper, { PaperProps } from '../coreui/Paper';\r\nimport ErrorBoundary from './ErrorBoundary';\r\n\r\ninterface Props\r\n{\r\n cardDepth: number;\r\n containerStyle: 'Blended' | 'Visual';\r\n controlKey: string;\r\n controlType: 'Custom' | 'Expansion' | 'List' | 'Static';\r\n dataId: string;\r\n paneKey: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class SubPane extends\r\n React.PureComponent>\r\n{\r\n protected muiProps: PaperProps;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps =\r\n {\r\n blended: props.containerStyle === 'Blended',\r\n card: props.containerStyle === 'Visual',\r\n cardDepth: props.cardDepth,\r\n elevation: 0,\r\n group: null,\r\n margin: props.containerStyle === 'Visual',\r\n name: null,\r\n };\r\n\r\n const rowKey =\r\n props['propagated'] ? props['propagated']['rowKey'] : null;\r\n let controlKey = props.controlKey;\r\n let paneKey = props.paneKey;\r\n\r\n if (rowKey)\r\n {\r\n controlKey += `_${rowKey}`;\r\n paneKey += `_${rowKey}`;\r\n }\r\n\r\n if (props.controlType === 'Custom')\r\n {\r\n this.muiProps.dataId = props.dataId;\r\n this.muiProps.group = controlKey;\r\n this.muiProps.name = paneKey;\r\n }\r\n else if (props.controlType === 'Expansion')\r\n {\r\n this.muiProps.collapse = true;\r\n this.muiProps.name = paneKey;\r\n }\r\n else if (props.controlType === 'List')\r\n {\r\n this.muiProps.fade = 500;\r\n this.muiProps.group = controlKey;\r\n this.muiProps.name = paneKey;\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n this.muiProps.className = _props.classes.root;\r\n this.muiProps.children =\r\n \r\n {_props.children}\r\n ;\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SubPane);\r\n","import { autorun, Lambda } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { Paper as PaperBase } from '../coreui/Paper';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n controlledGroupName: string;\r\n dataId: string;\r\n isPaneController: boolean;\r\n name: string;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n visiblePaneName: string;\r\n}\r\n\r\n@observer\r\nexport class SubPaneControl extends\r\n React.Component\r\n{\r\n protected disposeObserve: Lambda;\r\n\r\n protected showSubPane()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!_props.isPaneController)\r\n {\r\n return;\r\n }\r\n\r\n const widgetProperties: WidgetProperties | null =\r\n Api.getWidgetProperties(_props) as WidgetProperties | null;\r\n\r\n const rowKey =\r\n _props['propagated'] ? _props['propagated']['rowKey'] : null;\r\n\r\n if (widgetProperties\r\n && widgetProperties.accessLevel !== AccessLevel.hidden\r\n && widgetProperties.visiblePaneName)\r\n {\r\n let paneName = widgetProperties.visiblePaneName;\r\n if (rowKey)\r\n {\r\n paneName += `_${rowKey}`;\r\n }\r\n\r\n PaperBase.show(paneName);\r\n }\r\n else\r\n {\r\n let groupName = _props.controlledGroupName;\r\n if (rowKey)\r\n {\r\n groupName += `_${rowKey}`;\r\n }\r\n\r\n PaperBase.hideGroup(groupName);\r\n }\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n this.disposeObserve = autorun(() =>\r\n {\r\n this.showSubPane();\r\n });\r\n }\r\n\r\n public componentDidUpdate()\r\n {\r\n this.showSubPane();\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.disposeObserve)\r\n {\r\n this.disposeObserve();\r\n }\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties: WidgetProperties | null =\r\n Api.getWidgetProperties(_props) as WidgetProperties | null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return _props.children;\r\n }\r\n}\r\n\r\nexport default SubPaneControl;\r\n","import * as muiBadge from '@material-ui/core/Badge';\r\nimport * as muiExpansionPanel from '@material-ui/core/ExpansionPanel';\r\nimport * as muiExpansionPanelSummary from\r\n '@material-ui/core/ExpansionPanelSummary';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Api from '../mustangui/Api';\r\nimport Icon from './Icon';\r\nimport InformationBadge from './InformationBadge';\r\nimport Link from './Link';\r\nimport Typography from './Typography';\r\n\r\ninterface Props\r\n{\r\n badge?: 'contents' | 'errors';\r\n children: React.ReactNode;\r\n disabled?: boolean;\r\n disabledHelpText?: string;\r\n expanded: boolean;\r\n label?: React.ReactNode;\r\n onChange: (event: React.ChangeEvent<{}>, value: string) => void;\r\n showDisabledHelp?: boolean;\r\n value: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n display: 'inline',\r\n right: -12,\r\n top: 4,\r\n },\r\n errorIcon:\r\n {\r\n color: theme.palette.error.main,\r\n fontSize: '16px',\r\n },\r\n expandIcon:\r\n {\r\n display: 'flex',\r\n flex: 'auto',\r\n justifyContent: 'flex-end',\r\n },\r\n label:\r\n {\r\n display: 'inline-block',\r\n fontSize: 14,\r\n letterSpacing: 1,\r\n textTransform: 'uppercase',\r\n },\r\n labelDisabled:\r\n {\r\n color: theme.palette.grey[300],\r\n },\r\n link:\r\n {\r\n justifyContent: 'flex-start',\r\n marginTop: 1,\r\n minHeight: 0,\r\n minWidth: 0,\r\n padding: 0,\r\n },\r\n linkLabel:\r\n {\r\n overflow: 'visible',\r\n },\r\n summary:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n paddingLeft: Sys.settings.baselineGridSize * 4,\r\n paddingRight: Sys.settings.baselineGridSize * 3,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n paddingLeft: Sys.settings.baselineGridSize * 6,\r\n paddingRight: Sys.settings.baselineGridSize * 5,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n paddingLeft: Sys.settings.baselineGridSize * 10,\r\n paddingRight: Sys.settings.baselineGridSize * 9,\r\n },\r\n },\r\n summaryDisabled:\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n opacity: '1 !important' as any,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n pointerEvents: 'auto !important' as any,\r\n },\r\n });\r\n\r\nexport class ExpansionPanel extends\r\n React.PureComponent>\r\n{\r\n private onChange = (event: React.ChangeEvent<{}>) =>\r\n {\r\n if (!this.props.disabled)\r\n {\r\n this.props.onChange(event, this.props.value);\r\n }\r\n };\r\n\r\n private onClickLink = (event: React.MouseEvent) =>\r\n {\r\n event.stopPropagation();\r\n\r\n if (!this.props.disabled)\r\n {\r\n this.props.onChange(event, this.props.value);\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n let labelClasses: string = this.props.classes.label;\r\n if (this.props.disabled)\r\n {\r\n labelClasses += ` ${this.props.classes.labelDisabled}`;\r\n }\r\n\r\n let label = this.props.label;\r\n if (this.props.disabled)\r\n {\r\n if (this.props.showDisabledHelp)\r\n {\r\n label = (\r\n \r\n {label}\r\n \r\n );\r\n }\r\n }\r\n else if (this.props.badge)\r\n {\r\n label = (\r\n \r\n ) : (\r\n
\r\n \r\n \r\n
\r\n )}\r\n classes={{\r\n badge: this.props.classes.badge,\r\n root: labelClasses,\r\n }}\r\n >\r\n {label}\r\n \r\n );\r\n }\r\n else\r\n {\r\n label =
{label}
;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.expanded ? this.props.children : null}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ExpansionPanel);\r\n","import * as muiBadge from '@material-ui/core/Badge';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTab from '@material-ui/core/Tab';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport Icon from './Icon';\r\nimport InformationBadge from './InformationBadge';\r\n\r\ninterface Props extends muiTab.TabProps\r\n{\r\n badge?: 'contents' | 'errors';\r\n disabledHelpText?: string;\r\n showDisabledHelp?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n right: -12,\r\n top: 5,\r\n },\r\n disabled:\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n opacity: '1 !important' as any,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n pointerEvents: 'auto !important' as any,\r\n },\r\n errorIcon:\r\n {\r\n color: theme.palette.error.main,\r\n fontSize: '16px',\r\n },\r\n labelDisabled:\r\n {\r\n color: theme.palette.grey[300],\r\n },\r\n root:\r\n {\r\n [theme.breakpoints.up('md')]:\r\n {\r\n paddingLeft: 40,\r\n paddingRight: 40,\r\n },\r\n boxSizing: 'border-box',\r\n display: 'inline-block',\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n padding: 0,\r\n paddingBottom: 16,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n paddingTop: 16,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n });\r\n\r\nexport class Tab extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const {\r\n badge,\r\n classes,\r\n className,\r\n disabledHelpText,\r\n onChange,\r\n onClick,\r\n showDisabledHelp,\r\n ...tabProps\r\n } = this.props;\r\n\r\n let labelClasses: string = '';\r\n if (tabProps.disabled)\r\n {\r\n labelClasses += ` ${classes.labelDisabled}`;\r\n }\r\n\r\n if (tabProps.disabled)\r\n {\r\n if (showDisabledHelp)\r\n {\r\n tabProps.label = (\r\n \r\n {tabProps.label}\r\n \r\n );\r\n }\r\n }\r\n else if (badge)\r\n {\r\n let badgeContent: React.ReactNode;\r\n if (badge === 'contents')\r\n {\r\n badgeContent = (\r\n );\r\n }\r\n else\r\n {\r\n badgeContent = (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n tabProps.label = (\r\n \r\n {tabProps.label}\r\n \r\n );\r\n }\r\n else\r\n {\r\n tabProps.label = (\r\n {tabProps.label}\r\n );\r\n }\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Tab);\r\n","import * as muiButton from '@material-ui/core/Button';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from './Button';\r\n\r\ninterface Props extends muiButton.ButtonProps\r\n{\r\n direction?: 'left' | 'right';\r\n visible?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n left:\r\n {\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n alignSelf: 'flex-end',\r\n flexShrink: 0,\r\n marginBottom: 8,\r\n marginLeft: 8,\r\n order: 1,\r\n zIndex: 1,\r\n },\r\n right:\r\n {\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n alignSelf: 'flex-end',\r\n flexShrink: 0,\r\n marginBottom: 8,\r\n marginLeft: 8,\r\n marginRight: 1,\r\n order: 2,\r\n zIndex: 1,\r\n },\r\n });\r\n\r\nexport class TabScrollButton extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const {\r\n classes,\r\n className,\r\n endIcon, // Removed so it can be ignored.\r\n direction,\r\n visible,\r\n ...buttonProps\r\n } = this.props;\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TabScrollButton);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTabs from '@material-ui/core/Tabs';\r\nimport * as React from 'react';\r\nimport KeyboardNavigationGroup from './KeyboardNavigationGroup';\r\nimport TabScrollButton from './TabScrollButton';\r\n\r\ninterface Props extends muiTabs.TabsProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n flexContainer:\r\n {\r\n outline: 'none',\r\n },\r\n });\r\n\r\nexport class Tabs extends\r\n React.PureComponent>\r\n{\r\n private readonly rootRef = React.createRef();\r\n\r\n public componentDidMount()\r\n {\r\n // Fix for Firefox focusing the tab scroller div & Safari showing it's\r\n // focus outline\r\n const tabScroller: HTMLElement = this.rootRef.current!.querySelector(\r\n '[role=\"tablist\"]')!.parentElement!;\r\n tabScroller.tabIndex = -1;\r\n tabScroller.style.outline = 'none';\r\n }\r\n\r\n public render()\r\n {\r\n const { classes, ...other } = this.props;\r\n\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Tabs);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { autorun, IReactionDisposer } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport AppServer from '../core/AppServer';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys from '../core/Sys';\r\nimport ExpansionPanel from '../coreui/ExpansionPanel';\r\nimport Hidden, { BreakpointRanges } from '../coreui/Hidden';\r\nimport Paper from '../coreui/Paper';\r\nimport Presentation from '../coreui/Presentation';\r\nimport ProcessingMask from '../coreui/ProcessingMask';\r\nimport Tab from '../coreui/Tab';\r\nimport Tabs from '../coreui/Tabs';\r\nimport BaseService from '../services/BaseService';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport LayoutStateStore from '../stores/LayoutStateStore';\r\nimport PaneDataStore, { PaneData, PaneDataByDataId }\r\n from '../stores/PaneDataStore';\r\nimport Api, { AccessLevel } from './Api';\r\nimport ErrorBoundary from './ErrorBoundary';\r\n\r\ninterface GetDataResponse\r\n{\r\n paneDataByDataId: PaneDataByDataId;\r\n paneState: string;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n name: string;\r\n tabs: TabProps[];\r\n uniqueId: string;\r\n}\r\n\r\ninterface State\r\n{\r\n accordianCollapsed?: boolean;\r\n loadingPaneUseKeys?: string[];\r\n selectedPaneUseKey?: string;\r\n switchingTab?: boolean;\r\n}\r\n\r\ninterface TabProps\r\n{\r\n dataId: string;\r\n disabledHelpText?: string;\r\n label: string;\r\n paneUse: object;\r\n paneUseKey: string;\r\n}\r\n\r\ninterface TabRuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n contentsExist: boolean;\r\n paneUseKey: string;\r\n rowKey: string;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n selectedPaneUseKey: string | null;\r\n tabs: TabRuntimeProperties[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n paper:\r\n {\r\n boxSizing: 'border-box',\r\n minHeight: 80 + 8 * 2, // Loading animation + padding\r\n position: 'relative',\r\n },\r\n });\r\n\r\n@observer\r\nexport class TabControl extends\r\n React.Component, State>\r\n{\r\n private dataMonitorDisposer: IReactionDisposer;\r\n private lastRetrievedPaneDate: Date | undefined;\r\n private loadedPaneUseKeys: string[] = [];\r\n private retrieveDataPromises: RequestPromise[] = [];\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {\r\n accordianCollapsed: false,\r\n loadingPaneUseKeys: [],\r\n switchingTab: false,\r\n };\r\n }\r\n\r\n private dataMonitor = () =>\r\n {\r\n const parentPane: PaneData =\r\n PaneDataStore.instance.getPane(this.props.dataId)!;\r\n\r\n if (!parentPane.lastRetrieved)\r\n {\r\n return;\r\n }\r\n\r\n if (this.lastRetrievedPaneDate\r\n && this.lastRetrievedPaneDate >= parentPane.lastRetrieved)\r\n {\r\n return;\r\n }\r\n\r\n for (const retrievePromise of this.retrieveDataPromises)\r\n {\r\n retrievePromise.abort();\r\n }\r\n\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n const paneUseKey: string | null =\r\n runtimeProperties.selectedPaneUseKey;\r\n\r\n if (paneUseKey)\r\n {\r\n const activeTab: TabRuntimeProperties | undefined =\r\n runtimeProperties.tabs.find(t => t.paneUseKey === paneUseKey);\r\n\r\n if (!activeTab)\r\n {\r\n throw new Error(\r\n `No tab with pane use key of ${paneUseKey} found`);\r\n }\r\n\r\n this.loadedPaneUseKeys = [activeTab.paneUseKey];\r\n\r\n this.setState({\r\n loadingPaneUseKeys: [],\r\n selectedPaneUseKey: activeTab.paneUseKey,\r\n });\r\n }\r\n else\r\n {\r\n this.loadedPaneUseKeys = [];\r\n this.setState({\r\n loadingPaneUseKeys: [],\r\n selectedPaneUseKey: undefined,\r\n });\r\n }\r\n\r\n // Future 7.4.1: This should be moved to a more appropriate place\r\n PaneDataStore.clearAllDataChanges();\r\n\r\n this.lastRetrievedPaneDate = parentPane.lastRetrieved;\r\n };\r\n\r\n private getTabId(tab: TabProps, content: boolean): string\r\n {\r\n return `${this.props.uniqueId}_${content ? 'content' : 'tab'}`\r\n + `_${tab.paneUseKey}`;\r\n }\r\n\r\n private loadSelectedTab(): void\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n const tabRuntimeProps: TabRuntimeProperties =\r\n runtimeProperties.tabs.find(\r\n t => t.paneUseKey === this.state.selectedPaneUseKey)!;\r\n const paneUseKey: string = this.state.selectedPaneUseKey!;\r\n\r\n this.setState((prevState) =>\r\n {\r\n const loadingPaneUseKeys: string[] =\r\n prevState.loadingPaneUseKeys!.slice();\r\n loadingPaneUseKeys.push(paneUseKey);\r\n\r\n return { loadingPaneUseKeys, switchingTab: false };\r\n });\r\n\r\n const requestPromise: RequestPromise =\r\n RoundTripService.partialDataRetrevial(\r\n 'TabControl/GetData/{rowKey}/{dataId}/{paneUseKey}',\r\n {\r\n dataId: this.props.dataId,\r\n paneUseKey,\r\n rowKey: tabRuntimeProps.rowKey,\r\n }\r\n );\r\n\r\n this.retrieveDataPromises.push(requestPromise);\r\n\r\n requestPromise.then((response: GetDataResponse) =>\r\n {\r\n this.retrieveDataPromises =\r\n this.retrieveDataPromises.filter(p => p !== requestPromise);\r\n\r\n if (response.validationErrors\r\n && response.validationErrors.length > 0)\r\n {\r\n Sys.showErrors(response.validationErrors);\r\n if (this.loadedPaneUseKeys.length > 0)\r\n {\r\n this.updateSelectedTab(null, this.loadedPaneUseKeys[0]);\r\n }\r\n }\r\n else\r\n {\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n Sys.setBusinessErrors();\r\n\r\n this.loadedPaneUseKeys.push(paneUseKey);\r\n AppServer.addPane(response.paneState);\r\n }\r\n\r\n this.setState((prevState) =>\r\n {\r\n const loadingPaneUseKeys: string[] =\r\n prevState.loadingPaneUseKeys!.filter(k => k !== paneUseKey);\r\n\r\n return { loadingPaneUseKeys, switchingTab: false };\r\n });\r\n }).catch((request) =>\r\n {\r\n const message: string | null =\r\n BaseService.getRequestExceptionMessage(request);\r\n if (message)\r\n {\r\n Sys.showErrors([message]);\r\n }\r\n if (this.loadedPaneUseKeys.length > 0)\r\n {\r\n this.updateSelectedTab(null, this.loadedPaneUseKeys[0]);\r\n }\r\n });\r\n }\r\n\r\n private renderExpansionPanel(\r\n tab: TabProps, runtimeProperties: RuntimeProperties): React.ReactNode\r\n {\r\n const tabRuntimeProps = runtimeProperties.tabs.find(\r\n t => t.paneUseKey === tab.paneUseKey)!;\r\n\r\n if (!tabRuntimeProps)\r\n {\r\n return null;\r\n }\r\n\r\n if (tabRuntimeProps.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n {tab.paneUseKey === this.state.selectedPaneUseKey\r\n ? this.renderSelectedTabPane(\r\n runtimeProperties, BreakpointRanges.smUp)\r\n : null}\r\n \r\n );\r\n }\r\n\r\n private renderSelectedTabPane(\r\n runtimeProperties: RuntimeProperties,\r\n nestedIn: BreakpointRanges\r\n ): React.ReactNode\r\n {\r\n if (runtimeProperties.accessLevel <= AccessLevel.disabled)\r\n {\r\n return null;\r\n }\r\n\r\n const selectedTab: TabProps = this.props.tabs.find(t =>\r\n t.paneUseKey === this.state.selectedPaneUseKey)!;\r\n const isLoadingTab: boolean = this.state.loadingPaneUseKeys!.indexOf(\r\n this.state.selectedPaneUseKey!) >= 0;\r\n\r\n let tabContents: React.ReactNode = null;\r\n if (this.loadedPaneUseKeys.indexOf(selectedTab.paneUseKey) >= 0)\r\n {\r\n // Key attribute tells React to recreate the component from\r\n // scratch when the selected tab changes. Without this child\r\n // components are reused and constructors are not called\r\n tabContents = (\r\n
\r\n {Presentation.create(selectedTab.paneUse, { nestedIn })}\r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n {!this.state.switchingTab || isLoadingTab ? (\r\n \r\n ) : null}\r\n {tabContents}\r\n
);\r\n }\r\n\r\n private renderTabButton(\r\n tab: TabProps, runtimeProperties: RuntimeProperties): React.ReactNode\r\n {\r\n const tabRuntimeProps = runtimeProperties.tabs.find(\r\n t => t.paneUseKey === tab.paneUseKey)!;\r\n\r\n if (!tabRuntimeProps)\r\n {\r\n return null;\r\n }\r\n\r\n if (tabRuntimeProps.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n );\r\n }\r\n\r\n private updateSelectedTab = (\r\n event: React.ChangeEvent<{}> | null,\r\n value: string\r\n ) =>\r\n {\r\n this.setState(\r\n (prevState) =>\r\n {\r\n return {\r\n accordianCollapsed: !prevState.accordianCollapsed\r\n && value === prevState.selectedPaneUseKey,\r\n selectedPaneUseKey: value,\r\n switchingTab: true,\r\n };\r\n },\r\n () =>\r\n {\r\n LayoutStateStore.setSelectedTab(\r\n this.props.dataId,\r\n this.props.name,\r\n this.state.selectedPaneUseKey!);\r\n\r\n if (this.loadedPaneUseKeys.indexOf(\r\n this.state.selectedPaneUseKey!) < 0)\r\n {\r\n this.loadSelectedTab();\r\n }\r\n });\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n this.dataMonitorDisposer = autorun(this.dataMonitor);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n for (const retrievePromise of this.retrieveDataPromises)\r\n {\r\n retrievePromise.abort();\r\n }\r\n\r\n if (this.dataMonitorDisposer)\r\n {\r\n this.dataMonitorDisposer();\r\n }\r\n\r\n LayoutStateStore.setSelectedTab(\r\n this.props.dataId,\r\n this.props.name,\r\n null);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.state.selectedPaneUseKey || this.props.tabs.length <= 0)\r\n {\r\n return null;\r\n }\r\n\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n \r\n , value: any) => void)\r\n & ((event: React.FormEvent) =>\r\n void))}\r\n value={this.state.selectedPaneUseKey}\r\n >\r\n {this.props.tabs.map(\r\n t => this.renderTabButton(t, runtimeProperties))}\r\n \r\n \r\n {this.renderSelectedTabPane(\r\n runtimeProperties, BreakpointRanges.xsDown)}\r\n \r\n \r\n \r\n {this.props.tabs.map(t =>\r\n this.renderExpansionPanel(t, runtimeProperties)\r\n )}\r\n \r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TabControl);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Button from '../coreui/Button';\r\nimport { TableChildProps } from '../coreui/Table';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class TableExport extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n return (\r\n ) =>\r\n {\r\n this.props.propagated.parentTable.getApi().exportDataAsCsv();\r\n }}\r\n />);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TableExport);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Button from '../coreui/Button';\r\nimport { TableChildProps } from '../coreui/Table';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class TablePrint extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const gridApi = this.props.propagated.parentTable.getApi();\r\n\r\n return (\r\n \r\n {\r\n const currentPageSize = gridApi.paginationGetPageSize();\r\n gridApi.paginationSetPageSize(\r\n gridApi.paginationGetTotalPages());\r\n\r\n setTimeout(() =>\r\n {\r\n window.print();\r\n gridApi.paginationSetPageSize(currentPageSize);\r\n });\r\n }}\r\n />);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TablePrint);\r\n","import { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport { GridColumnConfigProperties } from './Columns/GridColumn';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\ninterface State\r\n{\r\n anchorElement: HTMLElement | null;\r\n sortModel: { colId: string; sort: string };\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class TableSort extends\r\n React.PureComponent, State>\r\n{\r\n private readonly sortColumns: GridColumnConfigProperties[];\r\n\r\n public constructor(props: Props & WithTheme & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state =\r\n {\r\n anchorElement: null,\r\n sortModel: { colId: '', sort: '' },\r\n };\r\n\r\n this.sortColumns = [];\r\n for (const column of this.props.propagated.parentTable.columns)\r\n {\r\n const gridColumn = column as GridColumnConfigProperties;\r\n if (gridColumn.xs)\r\n {\r\n this.sortColumns.push(gridColumn);\r\n }\r\n }\r\n }\r\n\r\n private openMenu(event: React.MouseEvent, menuName: string)\r\n {\r\n const anchorElement = event.currentTarget;\r\n\r\n // The anchorElement must be applied before open\r\n // is called so we use a callback.\r\n this.setState(\r\n { anchorElement },\r\n () => { MenuBase.open(menuName, anchorElement); }\r\n );\r\n }\r\n\r\n private sort(colId: string, direction: string)\r\n {\r\n const sortModel = { colId, sort: direction };\r\n\r\n this.props.propagated.parentTable.getApi().setSortModel([sortModel]);\r\n this.setState({ sortModel });\r\n this.props.propagated.parentTable.updateRowHeight();\r\n\r\n MenuBase.closeAll();\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const menuItems: React.ReactNode[] = [];\r\n for (const column of this.sortColumns)\r\n {\r\n const sortModel = this.state.sortModel;\r\n const isSelected = sortModel.colId === column.name;\r\n\r\n let direction = column.sortDescending ? 'desc' : 'asc';\r\n let iconColor = this.props.theme.palette.grey[200];\r\n let icon = 'fas fa-sort';\r\n\r\n if (isSelected)\r\n {\r\n direction = sortModel.sort === 'asc' ? 'desc' : 'asc';\r\n iconColor = this.props.theme.palette.grey[800];\r\n icon = sortModel.sort === 'asc'\r\n ? 'fas fa-sort-up'\r\n : 'fas fa-sort-down';\r\n }\r\n\r\n menuItems.push(\r\n this.sort(column.name, direction)}\r\n selected={false}\r\n >\r\n \r\n {column.header}\r\n \r\n );\r\n }\r\n\r\n const menuName =\r\n `${this.props.propagated.parentTable.configProps.tableKey}`\r\n + `.${this.props.name}`;\r\n\r\n return (\r\n \r\n this.openMenu(e, menuName)}\r\n tabIndex={-1}\r\n />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(TableSort));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { FilterChangedEvent, GridApi } from 'ag-grid-community';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport Typography from '../coreui/Typography';\r\nimport PaneRow, { RuntimeWidget } from '../models/PaneRow';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport { CheckBoxColumn } from './Columns/CheckBoxColumn';\r\nimport { ComponentTypeDisplayColumn }\r\n from './Columns/ComponentTypeDisplayColumn';\r\nimport { DataImageDisplayColumn } from './Columns/DataImageDisplayColumn';\r\nimport { DataLinkColumn } from './Columns/DataLinkColumn';\r\nimport { DateEditColumn } from './Columns/DateEditColumn';\r\nimport { DomainComboBoxColumnDisplay }\r\n from './Columns/DomainComboBoxColumnDisplay';\r\nimport { GridColumnConfigProperties } from './Columns/GridColumn';\r\nimport { IconDisplayColumn } from './Columns/IconDisplayColumn';\r\nimport { ManualLinkColumn } from './Columns/ManualLinkColumn';\r\nimport { NumericEditColumn } from './Columns/NumericEditColumn';\r\nimport { RelationshipComboBoxColumnDisplay }\r\n from './Columns/RelationshipComboBoxColumnDisplay';\r\nimport { TextColumn } from './Columns/TextColumn';\r\n\r\ninterface ConfigProperties\r\n{\r\n columnWidgetName: string;\r\n dataId: string;\r\n functionName: FunctionName;\r\n label: string;\r\n name: string;\r\n propagated: TableChildProps;\r\n}\r\n\r\nexport type FunctionName = 'Average' | 'Count' | 'Maximum' | 'Minimum' | 'Sum';\r\n\r\ninterface State\r\n{\r\n visibleRowKeys?: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class TableSummary extends\r\n React.Component, State>\r\n{\r\n private readonly columnConfigProperties: GridColumnConfigProperties;\r\n private readonly gridApi: GridApi;\r\n\r\n public constructor(props: ConfigProperties & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n for (const column of this.props.propagated.parentTable.columns)\r\n {\r\n const gridColumn = column as GridColumnConfigProperties;\r\n if (gridColumn.name === this.props.columnWidgetName)\r\n {\r\n this.columnConfigProperties = gridColumn;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.columnConfigProperties)\r\n {\r\n throw new Error(`Column ${this.props.columnWidgetName} not found`);\r\n }\r\n\r\n this.gridApi = props.propagated.parentTable.getApi();\r\n\r\n this.gridApi.addEventListener(\r\n 'filterChanged',\r\n this.onGridFilterChanged);\r\n }\r\n\r\n private onGridFilterChanged = (event: FilterChangedEvent) =>\r\n {\r\n if (!event.api.isAnyFilterPresent())\r\n {\r\n this.setState({ visibleRowKeys: undefined });\r\n\r\n return;\r\n }\r\n\r\n const visibleRowKeys: string[] = [];\r\n event.api.forEachNodeAfterFilter((row, index) =>\r\n {\r\n visibleRowKeys.push(row.id);\r\n });\r\n\r\n this.setState({ visibleRowKeys });\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n this.gridApi.removeEventListener(\r\n 'filterChanged',\r\n this.onGridFilterChanged);\r\n }\r\n\r\n public render()\r\n {\r\n const contentDataId: string =\r\n this.props.propagated.parentTable.configProps.contentDataId;\r\n\r\n const parentGridRows: PaneRow[] =\r\n PaneDataStore.getPaneCollection(contentDataId);\r\n\r\n const runtimeData: RuntimeWidget[] = [];\r\n for (const row of parentGridRows)\r\n {\r\n const rowKey: string = row.getPrimaryKey();\r\n if (!this.state.visibleRowKeys\r\n || this.state.visibleRowKeys.some(k => k === rowKey))\r\n {\r\n runtimeData.push(row.getWidget(this.props.columnWidgetName));\r\n }\r\n }\r\n\r\n let getSummaryValue: (\r\n runtimeData: RuntimeWidget[],\r\n configProperties: object,\r\n functionName: FunctionName\r\n ) => string | null;\r\n\r\n const widgetType: string = this.columnConfigProperties.widgetType;\r\n switch (widgetType)\r\n {\r\n case 'CheckBoxColumn':\r\n getSummaryValue = CheckBoxColumn.getSummaryValue;\r\n break;\r\n case 'ComponentTypeDisplayColumn':\r\n getSummaryValue = ComponentTypeDisplayColumn.getSummaryValue;\r\n break;\r\n case 'DataImageDisplayColumn':\r\n getSummaryValue = DataImageDisplayColumn.getSummaryValue;\r\n break;\r\n case 'DataLinkColumn':\r\n getSummaryValue = DataLinkColumn.getSummaryValue;\r\n break;\r\n case 'DateEditColumn':\r\n getSummaryValue = DateEditColumn.getSummaryValue;\r\n break;\r\n case 'DomainComboBoxColumn':\r\n getSummaryValue = DomainComboBoxColumnDisplay.getSummaryValue;\r\n break;\r\n case 'IconDisplayColumn':\r\n getSummaryValue = IconDisplayColumn.getSummaryValue;\r\n break;\r\n case 'ManualLinkColumn':\r\n getSummaryValue = ManualLinkColumn.getSummaryValue;\r\n break;\r\n case 'MLTextEditColumn':\r\n getSummaryValue = TextColumn.getSummaryValue;\r\n break;\r\n case 'NumericEditColumn':\r\n getSummaryValue = NumericEditColumn.getSummaryValue;\r\n break;\r\n case 'RelationshipComboBoxColumn':\r\n getSummaryValue =\r\n RelationshipComboBoxColumnDisplay.getSummaryValue;\r\n break;\r\n case 'SLTextEditColumn':\r\n getSummaryValue = TextColumn.getSummaryValue;\r\n break;\r\n case 'TextDisplayColumn':\r\n getSummaryValue = TextColumn.getSummaryValue;\r\n break;\r\n default:\r\n throw new Error(`Unknown summary widget type ${widgetType}`);\r\n }\r\n\r\n const value: string | null = getSummaryValue(\r\n runtimeData,\r\n this.columnConfigProperties.widgetProps,\r\n this.props.functionName);\r\n\r\n return (\r\n \r\n {this.props.label}: {value === null ? '' : value}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TableSummary);\r\n","import * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Presentation from '../coreui/Presentation';\r\nimport TextField from '../coreui/TextField';\r\nimport Api, { AccessLevel } from './Api';\r\nimport { SelectChildProps } from './SelectControl';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n helperText: string;\r\n label: string;\r\n name: string;\r\n propagated: SelectChildProps;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n showAsMandatory: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n });\r\n\r\n@observer\r\nexport class TextCriteria extends\r\n React.Component>\r\n{\r\n private getErrors = (value: string): string[] =>\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return [];\r\n }\r\n\r\n return runtimeProperties.businessErrors;\r\n };\r\n\r\n private onClickSearchButton = () =>\r\n {\r\n this.props.propagated.parentSelect.search(this.props.name);\r\n };\r\n\r\n private onKeyPress = (event: React.KeyboardEvent) =>\r\n {\r\n if (event.key !== 'Enter')\r\n {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.props.propagated.parentSelect.search(this.props.name);\r\n };\r\n\r\n private onValueChange = (value: string) =>\r\n {\r\n Sys.clearBusinessErrors(this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, value);\r\n };\r\n\r\n public render()\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.disabled)\r\n {\r\n return (\r\n \r\n );\r\n }\r\n\r\n const value = Presentation.getValue(this.props) as string;\r\n\r\n return (\r\n \r\n \r\n \r\n ),\r\n }}\r\n label={this.props.label}\r\n name={this.props.name}\r\n onKeyPress={this.onKeyPress}\r\n onValueChange={this.onValueChange}\r\n readOnly={\r\n runtimeProperties.accessLevel === AccessLevel.readOnly}\r\n required={runtimeProperties.showAsMandatory}\r\n value={\r\n runtimeProperties.accessLevel === AccessLevel.readOnly\r\n ? value ? value : '-' : value}\r\n variant=\"filled\"\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(TextCriteria);\r\n","import { PropTypes } from '@material-ui/core';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { Variant } from '@material-ui/core/styles/createTypography';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Api, { AccessLevel, ValueByBreakpoint } from './Api';\r\n\r\ninterface ConfigProperties\r\n{\r\n dataId: string;\r\n justification?: Justification | ValueByBreakpoint;\r\n listStyle: boolean;\r\n name: string;\r\n textStyle: 'Body 1' | 'Body 2' | 'Caption';\r\n}\r\n\r\ntype Justification = 'Centered' | 'Full' | 'Left' | 'Right';\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n bodyText: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n list:\r\n {\r\n marginBottom: 0,\r\n marginTop: 0,\r\n paddingLeft: Sys.settings.baselineGridSize * 10,\r\n },\r\n root:\r\n {\r\n [theme.breakpoints.up('md')]:\r\n {\r\n maxWidth: '600px',\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n maxWidth: '580px',\r\n },\r\n },\r\n spacer:\r\n {\r\n marginTop: Sys.settings.baselineGridSize * 6,\r\n },\r\n });\r\n\r\n@observer\r\nexport class TextDisplay extends\r\n React.Component>\r\n{\r\n public render()\r\n {\r\n const runtimeProperties: RuntimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n const children: React.ReactNode[] = [];\r\n\r\n let align: PropTypes.Alignment = 'left';\r\n if (this.props.justification && !this.props.listStyle)\r\n {\r\n if (typeof this.props.justification === 'string')\r\n {\r\n align = Api.getAlignment(this.props.justification);\r\n }\r\n else if (this.props.width in this.props.justification)\r\n {\r\n align = Api.getAlignment(\r\n this.props.justification[this.props.width]);\r\n }\r\n }\r\n\r\n const variant: Variant = Api.getTextStyle(this.props.textStyle);\r\n\r\n runtimeProperties.bodyText.forEach((item: string, index: number) =>\r\n {\r\n children.push(\r\n 0 ? this.props.classes.spacer : ''}`}\r\n component={this.props.listStyle ? 'li' : undefined!}\r\n key={index}\r\n style={{\r\n display: this.props.listStyle ? 'list-item' : undefined,\r\n }}\r\n variant={variant}\r\n >\r\n {item}\r\n \r\n );\r\n });\r\n\r\n if (this.props.listStyle)\r\n {\r\n return
    {children}
;\r\n }\r\n\r\n return
{children}
;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(TextDisplay));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport FormData from '../coreui/FormData';\r\nimport Thumbnail, { ThumbnailTypes } from '../coreui/Thumbnail';\r\nimport DocumentService from '../services/DocumentService';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n dataId: string;\r\n imageHeight: number;\r\n imageWidth: number;\r\n name: string;\r\n parentColumnHeader?: string;\r\n thumbnailType: ThumbnailTypes;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n alternateText: string;\r\n documentHandle: string | null;\r\n fileName: string;\r\n hasThumbnailImage: boolean;\r\n iconName: string;\r\n pendingDocumentId: number | null;\r\n pendingThumbnailId: number | null;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ThumbnailDisplay extends\r\n React.Component>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n if (!widgetProperties.documentHandle\r\n && !widgetProperties.pendingDocumentId)\r\n {\r\n return null;\r\n }\r\n\r\n const imgSrc: string = DocumentService.getThumbnailUrl(\r\n widgetProperties.documentHandle,\r\n widgetProperties.pendingDocumentId,\r\n widgetProperties.pendingThumbnailId,\r\n _props.thumbnailType);\r\n\r\n const downloadUrl: string = DocumentService.getDocumentUrl(\r\n widgetProperties.documentHandle,\r\n widgetProperties.pendingDocumentId,\r\n widgetProperties.fileName);\r\n\r\n let content: React.ReactNode = (\r\n \r\n );\r\n\r\n if (_props.parentColumnHeader)\r\n {\r\n content = (\r\n \r\n {content}\r\n \r\n );\r\n }\r\n\r\n return
{content}
;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ThumbnailDisplay);\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { CSSProperties } from '@material-ui/core/styles/withStyles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport KeyboardNavigationGroup from '../coreui/KeyboardNavigationGroup';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel } from '../mustangui/Api';\r\nimport { ToolbarInputWrapper as ToolbarInputWrapperBase }\r\n from './ToolbarInputWrapper';\r\n\r\ninterface Props\r\n{\r\n childLayoutWidgetNames: string[];\r\n childWidgetNames: string[];\r\n dataId: string;\r\n endChild: object;\r\n lg: boolean;\r\n md: boolean;\r\n overflowChild: object;\r\n propagated: TableChildProps;\r\n sm: boolean;\r\n startChild: object;\r\n toolbarType: 'header' | 'footer' | 'selection' | 'summary';\r\n xl: boolean;\r\n xs: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isFocused?: boolean;\r\n}\r\n\r\nexport interface ToolbarChildProps\r\n{\r\n hasParentToolbar: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const containerSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const sectionSpacing = theme.freeflow.section.spacing[breakPoint];\r\n\r\n containerSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n marginBottom: -sectionSpacing.vertical * 0.5,\r\n marginLeft: -sectionSpacing.horizontal * 0.5,\r\n marginRight: -sectionSpacing.horizontal * 0.5,\r\n marginTop: -sectionSpacing.vertical * 0.5,\r\n };\r\n }\r\n\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`toolbar-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'flex',\r\n },\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n container:\r\n {\r\n ...containerSpaceStyle,\r\n alignItems: 'center',\r\n display: 'flex',\r\n flex: '1 1 auto',\r\n minWidth: 0,\r\n } as CSSProperties,\r\n footer:\r\n {\r\n alignItems: 'center',\r\n borderBottomColor: theme.palette.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderTopColor: 'transparent',\r\n height: 70,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n } as CSSProperties,\r\n header:\r\n {\r\n alignItems: 'center',\r\n borderBottomColor: 'transparent',\r\n borderTopColor: theme.palette.grey[300],\r\n borderTopStyle: 'solid',\r\n height: 70,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n } as CSSProperties,\r\n headerFooterVerticalLayout:\r\n {\r\n borderBottomColor: 'transparent',\r\n borderTopColor: 'transparent',\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n pageHeaderLayout:\r\n {\r\n borderBottomColor: 'transparent',\r\n borderTopColor: 'transparent',\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n root:\r\n {\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 1,\r\n borderTopStyle: 'solid',\r\n borderTopWidth: 1,\r\n display: 'none',\r\n flexWrap: 'nowrap',\r\n justifyContent: 'space-between',\r\n outline: 'none',\r\n } as CSSProperties,\r\n selection:\r\n {\r\n alignItems: 'center',\r\n backgroundColor: theme.palette.grey[200],\r\n borderBottomColor: 'transparent',\r\n borderTopColor: theme.palette.grey[300],\r\n height: 70,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n },\r\n selectionVerticalLayout:\r\n {\r\n borderBottomColor: 'transparent',\r\n borderTopColor: 'transparent',\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n summary:\r\n {\r\n alignItems: 'flex-start',\r\n borderBottomColor: theme.palette.grey[300],\r\n borderTopWidth: 0,\r\n height: 38,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n paddingTop: 8,\r\n } as CSSProperties,\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class Toolbar extends\r\n React.Component & WithTheme, State>\r\n{\r\n public constructor(props: Props & WithStyles & WithTheme)\r\n {\r\n super(props);\r\n\r\n this.state = { isFocused: false };\r\n }\r\n\r\n private shouldRender(): boolean\r\n {\r\n if (this.props.childLayoutWidgetNames.length > 0)\r\n {\r\n return true;\r\n }\r\n\r\n for (const widgetName of this.props.childWidgetNames)\r\n {\r\n const widgetProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, widgetName) as WidgetProperties;\r\n\r\n if (widgetProperties.accessLevel === undefined)\r\n {\r\n return true;\r\n }\r\n\r\n if (widgetProperties.accessLevel >= AccessLevel.disabled)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n const classes: string[] = [this.props.classes.root];\r\n let isVerticalLayout: boolean = false;\r\n\r\n if (this.props.propagated)\r\n {\r\n if (!this.props.propagated.parentTable)\r\n {\r\n return null;\r\n }\r\n\r\n if (this.props.propagated.parentRowKey)\r\n {\r\n classes.push(this.props.classes.selectionVerticalLayout);\r\n }\r\n else if (this.props.propagated.parentTable.isVerticalLayout)\r\n {\r\n isVerticalLayout = true;\r\n classes.push(this.props.classes.headerFooterVerticalLayout);\r\n }\r\n else\r\n {\r\n classes.push(this.props.classes[this.props.toolbarType]);\r\n }\r\n }\r\n else\r\n {\r\n classes.push(this.props.classes.pageHeaderLayout);\r\n }\r\n\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (this.props[breakPoint])\r\n {\r\n classes.push(this.props.classes[`toolbar-${breakPoint}`]);\r\n }\r\n }\r\n\r\n const propagated: ToolbarChildProps & TableChildProps =\r\n {\r\n ...this.props.propagated,\r\n hasParentToolbar: true,\r\n };\r\n\r\n // When table is in vertical layout the footer toolbar will not render\r\n // the start child toolbar container. This will allow end child toolbar\r\n // container to be rendered full width which can contain the grid pager.\r\n const isVerticalFooter = isVerticalLayout\r\n && this.props.toolbarType === 'footer';\r\n\r\n return (\r\n \r\n {this.props.startChild && !isVerticalFooter ?\r\n
\r\n {Presentation.create(this.props.startChild, propagated)}\r\n
\r\n : null}\r\n {this.props.endChild || this.props.overflowChild ?\r\n
\r\n {this.props.endChild ?\r\n Presentation.create(this.props.endChild, propagated)\r\n : null}\r\n {this.props.overflowChild ?\r\n Presentation.create(\r\n this.props.overflowChild, propagated)\r\n : null}\r\n
\r\n : null}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(Toolbar));\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel } from '../mustangui/Api';\r\n\r\ninterface Props\r\n{\r\n childLayoutWidgetNames: string[];\r\n children: React.ReactNode;\r\n childWidgetNames: string[];\r\n dataId: string;\r\n justify: 'start' | 'middle' | 'end';\r\n lg: boolean;\r\n md: boolean;\r\n propagated: TableChildProps;\r\n sm: boolean;\r\n toolbarType: 'header' | 'footer' | 'selection' | 'summary';\r\n xl: boolean;\r\n xs: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`toolbarcontainergroup-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'flex',\r\n },\r\n };\r\n }\r\n\r\n const groupSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const itemSpacing = theme.freeflow.item.spacing[breakPoint];\r\n const groupSpacing = theme.freeflow.group.spacing[breakPoint];\r\n\r\n groupSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n marginLeft: -itemSpacing.horizontal * 0.5,\r\n marginRight: -itemSpacing.horizontal * 0.5,\r\n\r\n paddingLeft: groupSpacing.horizontal * 0.5,\r\n paddingRight: groupSpacing.horizontal * 0.5,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n root:\r\n {\r\n alignItems: 'center',\r\n display: 'none',\r\n ...groupSpaceStyle,\r\n },\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class ToolbarContainerGroup extends\r\n React.Component & WithTheme>\r\n{\r\n private shouldRender(): boolean\r\n {\r\n if (this.props.childLayoutWidgetNames.length > 0)\r\n {\r\n return true;\r\n }\r\n\r\n for (const widgetName of this.props.childWidgetNames)\r\n {\r\n const widgetProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, widgetName) as WidgetProperties;\r\n\r\n if (widgetProperties.accessLevel === undefined)\r\n {\r\n return true;\r\n }\r\n\r\n if (widgetProperties.accessLevel >= AccessLevel.disabled)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n let justifyContent =\r\n {\r\n end: 'flex-end',\r\n middle: 'center',\r\n start: 'flex-start',\r\n }[this.props.justify];\r\n\r\n // When table is in vertical layout the footer toolbar container will\r\n // render centered justified for since there is only one full width\r\n // section instead of a start and end section.\r\n let flex = undefined;\r\n if (this.props.propagated.parentTable?.isVerticalLayout\r\n && this.props.toolbarType === 'footer')\r\n {\r\n justifyContent = 'center';\r\n flex = 'auto';\r\n }\r\n\r\n const flexWrap = justifyContent === 'center' ? 'nowrap' : 'wrap';\r\n const minWidth = justifyContent === 'center' ? 'auto' : 0;\r\n\r\n const classes: string[] = [this.props.classes.root];\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (this.props[breakPoint])\r\n {\r\n classes.push(\r\n this.props.classes[`toolbarcontainergroup-${breakPoint}`]);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(ToolbarContainerGroup));\r\n","import { createStyles, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel } from '../mustangui/Api';\r\n\r\ninterface Props\r\n{\r\n childLayoutWidgetName: string;\r\n children: React.ReactNode;\r\n childWidgetName: string;\r\n dataId: string;\r\n lg: boolean;\r\n md: boolean;\r\n propagated: TableChildProps;\r\n sm: boolean;\r\n toolbarType: 'header' | 'footer' | 'selection' | 'summary';\r\n xl: boolean;\r\n xs: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n visibilityStyles[`toolbarcontaineritem-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'block',\r\n },\r\n };\r\n }\r\n\r\n const itemSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const itemSpacing = theme.freeflow.item.spacing[breakPoint];\r\n\r\n itemSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n paddingLeft: itemSpacing.horizontal * 0.5,\r\n paddingRight: itemSpacing.horizontal * 0.5,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n footerVerticalLayout:\r\n {\r\n paddingBottom: 0,\r\n },\r\n headerVerticalLayout:\r\n {\r\n paddingBottom: 24,\r\n },\r\n root:\r\n {\r\n display: 'none',\r\n minWidth: 0,\r\n paddingTop: 0,\r\n width: 'auto',\r\n\r\n ...itemSpaceStyle,\r\n },\r\n selectionVerticalLayout:\r\n {\r\n paddingBottom: 24,\r\n paddingTop: 0,\r\n },\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\n@observer\r\nexport class ToolbarContainerItem extends\r\n React.Component & WithTheme>\r\n{\r\n private shouldRender(): boolean\r\n {\r\n if (this.props.childLayoutWidgetName || !this.props.dataId)\r\n {\r\n return true;\r\n }\r\n\r\n const widgetProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, this.props.childWidgetName) as WidgetProperties;\r\n\r\n if (widgetProperties.accessLevel === undefined)\r\n {\r\n return true;\r\n }\r\n\r\n return widgetProperties.accessLevel >= AccessLevel.disabled;\r\n }\r\n\r\n public render()\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n const classes: string[] = [this.props.classes.root];\r\n let flex = undefined;\r\n if (this.props.propagated)\r\n {\r\n if (this.props.propagated.parentRowKey)\r\n {\r\n classes.push(this.props.classes.selectionVerticalLayout);\r\n }\r\n else if (this.props.propagated.parentTable\r\n && this.props.propagated.parentTable.isVerticalLayout)\r\n {\r\n switch (this.props.toolbarType)\r\n {\r\n case 'footer':\r\n // When table is in vertical layout the footer toolbar\r\n // container will render full width since there is only\r\n // one full width section.\r\n flex = 'auto';\r\n classes.push(this.props.classes.footerVerticalLayout);\r\n break;\r\n case 'header':\r\n classes.push(this.props.classes.headerVerticalLayout);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n const theme = this.props.theme as CustomTheme;\r\n\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n if (this.props[breakPoint])\r\n {\r\n classes.push(\r\n this.props.classes[`toolbarcontaineritem-${breakPoint}`]);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(ToolbarContainerItem));\r\n","import { WithWidth } from '@material-ui/core/withWidth';\r\nimport * as React from 'react';\r\nimport MenuItem, { MenuItemConfig } from './MenuItem';\r\nimport { ToolbarOverflowChild } from './ToolbarContainerOverflowSection';\r\n\r\nexport interface ConfigProperties extends WithWidth\r\n{\r\n child: { props: MenuItemConfig; type: string };\r\n dataId: string;\r\n isLayoutOnly: boolean;\r\n lg: boolean;\r\n md: boolean;\r\n propagated: ToolbarOverflowChild;\r\n sm: boolean;\r\n xl: boolean;\r\n xs: boolean;\r\n}\r\n\r\nexport class ToolbarContainerOverflowItem extends\r\n React.PureComponent\r\n{\r\n public render()\r\n {\r\n if (this.props.propagated.hideIcons\r\n && this.props.child.props['iconName'])\r\n {\r\n this.props.child.props['iconName'] = undefined;\r\n }\r\n\r\n // Hidden via JavaScript instead of CSS to avoid wrapping MenuItem\r\n // which breaks keyboard navigation\r\n if (!this.props[this.props.width])\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ToolbarContainerOverflowItem;\r\n","import { WithTheme, withTheme } from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Menu, { Menu as MenuBase } from '../coreui/Menu';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { AccessLevel } from '../mustangui/Api';\r\nimport ToolbarContainerItem from './ToolbarContainerItem';\r\nimport ToolbarContainerOverflowItem, { ConfigProperties as ItemProps }\r\n from './ToolbarContainerOverflowItem';\r\n\r\ninterface ConfigProperties\r\n{\r\n childItems: { props: ItemProps }[];\r\n dataId: string;\r\n hideIcons: boolean;\r\n isPageHeader: boolean;\r\n propagated: TableChildProps;\r\n toolbarType: 'header' | 'footer' | 'selection' | 'summary';\r\n}\r\n\r\ninterface State\r\n{\r\n overflowButtonRef?: HTMLElement;\r\n}\r\n\r\nexport interface ToolbarOverflowChild\r\n{\r\n hideIcons: boolean;\r\n isDrawerMenu?: boolean;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n}\r\n\r\n@observer\r\nexport class ToolbarContainerOverflowSection extends\r\n React.Component\r\n{\r\n private readonly overflowMenuName: string;\r\n\r\n public constructor(props: ConfigProperties & WithTheme & WithWidth)\r\n {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.overflowMenuName = `${props.dataId}`;\r\n }\r\n\r\n private openOverflowMenu = () =>\r\n {\r\n MenuBase.open(this.overflowMenuName, this.state.overflowButtonRef);\r\n };\r\n\r\n private setOverflowButtonRef(ref: HTMLElement | null)\r\n {\r\n if (ref && ref !== this.state.overflowButtonRef)\r\n {\r\n this.setState({ overflowButtonRef: ref });\r\n }\r\n }\r\n\r\n private shouldRender(): boolean\r\n {\r\n for (const child of this.props.childItems)\r\n {\r\n if (!child.props[this.props.width])\r\n {\r\n continue;\r\n }\r\n\r\n if (child.props.isLayoutOnly)\r\n {\r\n return true;\r\n }\r\n\r\n const widgetName = child.props.child.props.name;\r\n\r\n const runtimeProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, widgetName) as RuntimeProperties;\r\n\r\n if (!runtimeProperties)\r\n {\r\n return true;\r\n }\r\n\r\n if (runtimeProperties.accessLevel >= AccessLevel.disabled)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public render()\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n const propagated: ToolbarOverflowChild =\r\n {\r\n ...this.props.propagated,\r\n hideIcons: this.props.hideIcons,\r\n isDrawerMenu: this.props.isPageHeader,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n this.setOverflowButtonRef(r)}\r\n icon={this.props.isPageHeader\r\n ? 'fas fa-bars'\r\n : 'fas fa-ellipsis-v'}\r\n onClick={this.openOverflowMenu}\r\n size={this.props.isPageHeader\r\n ? 'large'\r\n : 'small'}\r\n tabIndex={-1}\r\n />\r\n \r\n \r\n this.state.overflowButtonRef!.focus()}\r\n open={false}\r\n >\r\n {/* Pass in width instead of using withWidth in the item\r\n to avoid ref errors */}\r\n {this.props.childItems.map((child, index) =>\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withTheme(withWidth()(ToolbarContainerOverflowSection));\r\n","import { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport { TableChildProps } from '../coreui/Table';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport { AccessLevel } from '../mustangui/Api';\r\n\r\ninterface Props\r\n{\r\n childLayoutWidgetNames: string[];\r\n children: React.ReactNode;\r\n childWidgetNames: string[];\r\n dataId: string;\r\n justify: 'start' | 'end';\r\n propagated: TableChildProps;\r\n toolbarType: 'header' | 'footer' | 'selection' | 'summary';\r\n verticalLayout?: boolean;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel?: AccessLevel;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const sectionSpaceStyle = {};\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const groupSpacing = theme.freeflow.group.spacing[breakPoint];\r\n const sectionSpacing = theme.freeflow.section.spacing[breakPoint];\r\n\r\n sectionSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n marginLeft: -groupSpacing.horizontal * 0.5,\r\n marginRight: -groupSpacing.horizontal * 0.5,\r\n\r\n paddingLeft: sectionSpacing.horizontal * 0.5,\r\n paddingRight: sectionSpacing.horizontal * 0.5,\r\n };\r\n }\r\n\r\n return createStyles({\r\n container:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n flex: 1,\r\n flexWrap: 'wrap',\r\n ...sectionSpaceStyle,\r\n },\r\n });\r\n};\r\n\r\n@observer\r\nexport class ToolbarContainerSection extends\r\n React.Component>\r\n{\r\n private shouldRender(): boolean\r\n {\r\n if (this.props.childLayoutWidgetNames.length > 0)\r\n {\r\n return true;\r\n }\r\n\r\n for (const widgetName of this.props.childWidgetNames)\r\n {\r\n const widgetProperties = PaneRow.getWidgetProperties(\r\n this.props.dataId, widgetName) as WidgetProperties;\r\n\r\n if (widgetProperties.accessLevel === undefined)\r\n {\r\n return true;\r\n }\r\n\r\n if (widgetProperties.accessLevel >= AccessLevel.disabled)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n if (!this.shouldRender())\r\n {\r\n return null;\r\n }\r\n\r\n let justifyContent =\r\n {\r\n end: 'flex-end',\r\n start: 'flex-start',\r\n }[this.props.justify];\r\n\r\n // When table is in vertical layout the footer toolbar container will\r\n // render centered justified since there is only one full width section\r\n // instead of a start and end section.\r\n if (this.props.propagated.parentTable?.isVerticalLayout\r\n && this.props.toolbarType === 'footer')\r\n {\r\n justifyContent = 'center';\r\n }\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ToolbarContainerSection);\r\n","import * as muiTypography from '@material-ui/core/Typography';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport { AccessLevel } from './Api';\r\nimport { StepWidgetProperties, WizardControl as WizardControlBase }\r\n from './WizardControl';\r\n\r\ninterface Props\r\n{\r\n}\r\n\r\n@observer\r\nexport class WizardStepNumberDisplay extends\r\n React.Component\r\n{\r\n public render()\r\n {\r\n const widgetProperties = WizardControlBase.getWidgetProperties();\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n const count: number = WizardControlBase.getStepCount();\r\n const selectedStep: number = widgetProperties.steps.findIndex(s =>\r\n s.paneUseKey === widgetProperties.selectedPaneUseKey)!;\r\n const step: number = WizardControlBase.getStepNumber(selectedStep);\r\n let result: React.ReactNode = null;\r\n\r\n if (step <= count)\r\n {\r\n result =\r\n \r\n {Sys.getTranslation(\r\n 'Step {step} of {count}',\r\n 'Wizard',\r\n { count, step })}\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default WizardStepNumberDisplay;\r\n","import * as muiBadge from '@material-ui/core/Badge';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTab from '@material-ui/core/Tab';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport Button from './Button';\r\nimport Icon from './Icon';\r\n\r\ninterface Props extends muiTab.TabProps\r\n{\r\n complete?: boolean;\r\n hasBusinessErrors?: boolean;\r\n last?: boolean;\r\n required?: boolean;\r\n step?: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n left: '50%',\r\n },\r\n backgroundColor: theme.palette.error.main,\r\n left: 20,\r\n top: 10,\r\n width: 20,\r\n },\r\n badgeRoot:\r\n {\r\n width: '100%',\r\n },\r\n disabled:\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n opacity: '1 !important' as any,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n pointerEvents: 'auto !important' as any,\r\n },\r\n errorIcon:\r\n {\r\n color: theme.palette.common.white,\r\n marginTop: 8,\r\n },\r\n first:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: '46px !important',\r\n marginTop: '10px !important',\r\n },\r\n },\r\n label:\r\n {\r\n // Required because Chrome can't do math.\r\n [theme.breakpoints.up('lg')]: { maxWidth: 134, minWidth: 133.5 },\r\n [theme.breakpoints.only('md')]: { maxWidth: 136, minWidth: 136 },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n paddingLeft: 8,\r\n paddingTop: 24,\r\n textAlign: 'center',\r\n },\r\n [theme.breakpoints.only('sm')]: { maxWidth: 126, minWidth: 126 },\r\n [theme.breakpoints.only('xs')]: { maxWidth: '100%', minWidth: 300 },\r\n overflow: 'hidden',\r\n paddingLeft: 32,\r\n paddingRight: 8,\r\n textAlign: 'left',\r\n textOverflow: 'ellipsis',\r\n },\r\n labelDisabled:\r\n {\r\n color: theme.palette.grey[300],\r\n },\r\n last:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: '46px !important',\r\n marginBottom: 10,\r\n },\r\n },\r\n required:\r\n {\r\n '&:after':\r\n {\r\n color: Api.getSystemColor('danger'),\r\n content: '\" *\"',\r\n },\r\n },\r\n root:\r\n {\r\n alignItems: 'flex-start',\r\n flex: 'auto',\r\n height: '100%',\r\n maxWidth: '100%',\r\n },\r\n selected:\r\n {\r\n backgroundColor: 'transparent !important',\r\n },\r\n step:\r\n {\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n flexDirection: 'column',\r\n paddingTop: 8,\r\n },\r\n alignItems: 'center',\r\n display: 'flex',\r\n flex: 'auto',\r\n width: '100%',\r\n },\r\n stepbar:\r\n {\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n backgroundColor: theme.palette.grey[300],\r\n height: 8,\r\n marginBottom: 26,\r\n marginLeft: 0,\r\n marginTop: -34,\r\n width: '100%',\r\n },\r\n backgroundColor: theme.palette.grey[300],\r\n height: 56,\r\n marginLeft: -24,\r\n minWidth: 8,\r\n width: 8,\r\n },\r\n stepbutton:\r\n {\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n fontSize: 24,\r\n height: 60,\r\n width: 60,\r\n },\r\n minWidth: 40,\r\n },\r\n stepComplete:\r\n {\r\n backgroundColor: Api.getSystemColor('success'),\r\n },\r\n stepCompleteSelected:\r\n {\r\n borderColor: Api.getSystemColor('success'),\r\n borderStyle: 'solid',\r\n borderWidth: 4,\r\n },\r\n stepSelected:\r\n {\r\n backgroundColor: theme.palette.grey[800],\r\n },\r\n wrapped:\r\n {\r\n [theme.breakpoints.up('lg')]: { maxWidth: 150, minWidth: 150 },\r\n [theme.breakpoints.only('md')]: { maxWidth: 152, minWidth: 152 },\r\n [theme.breakpoints.only('sm')]: { maxWidth: 142, minWidth: 142 },\r\n [theme.breakpoints.only('xs')]: { maxWidth: '100%', minWidth: 300 },\r\n alignItems: 'flex-start',\r\n flex: 'auto',\r\n height: '100%',\r\n maxWidth: '100%',\r\n },\r\n });\r\n\r\nexport class Step extends\r\n React.PureComponent & WithWidth>\r\n{\r\n private onClick = (event: React.MouseEvent) =>\r\n {\r\n if (!this.props.disabled && this.props.onClick)\r\n {\r\n this.props.onClick(event);\r\n event.stopPropagation();\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n const {\r\n classes,\r\n className,\r\n complete,\r\n hasBusinessErrors,\r\n last,\r\n onChange,\r\n onClick,\r\n step,\r\n ...tabProps\r\n } = this.props;\r\n\r\n let barClasses: string = classes.stepbar;\r\n let buttonClasses: string = classes.stepbutton;\r\n\r\n if (tabProps.selected)\r\n {\r\n barClasses += ` ${classes.stepSelected}`;\r\n\r\n if (complete)\r\n {\r\n buttonClasses += ` ${classes.stepCompleteSelected}`;\r\n }\r\n }\r\n else if (complete)\r\n {\r\n barClasses += ` ${classes.stepComplete}`;\r\n }\r\n\r\n if (step === 1)\r\n {\r\n barClasses += ` ${classes.first}`;\r\n }\r\n\r\n if (last)\r\n {\r\n barClasses += ` ${classes.last}`;\r\n }\r\n\r\n let labelClasses: string = classes.label;\r\n\r\n if (tabProps.disabled)\r\n {\r\n labelClasses += ` ${classes.labelDisabled}`;\r\n }\r\n\r\n if (tabProps.required)\r\n {\r\n labelClasses += ` ${classes.required}`;\r\n }\r\n\r\n tabProps.label = (\r\n
\r\n \r\n {(complete && !tabProps.selected) || last ?\r\n null : step}\r\n \r\n
\r\n {tabProps.label}\r\n
\r\n );\r\n\r\n if (hasBusinessErrors)\r\n {\r\n tabProps.label = (\r\n }\r\n classes={{ badge: classes.badge, root: classes.badgeRoot }}\r\n >\r\n {tabProps.label}\r\n \r\n );\r\n }\r\n\r\n return (\r\n 8)\r\n || (this.props.width === 'md' && step! > 6)\r\n || (this.props.width === 'sm' && step! > 4)\r\n ? classes.wrapped : classes.root,\r\n selected: classes.selected,\r\n }}\r\n disableRipple={true}\r\n onClick={this.onClick}\r\n {...tabProps}\r\n />);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(Step));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport KeyboardNavigationGroup from '../coreui/KeyboardNavigationGroup';\r\nimport Step from '../coreui/Step';\r\nimport { AccessLevel } from './Api';\r\nimport { StepProps, WidgetProperties, WizardControl as WizardControlBase }\r\n from './WizardControl';\r\n\r\ninterface Props\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n });\r\n\r\n@observer\r\nexport class WizardStepsDisplay extends\r\n React.Component>\r\n{\r\n private renderStepButton(\r\n step: StepProps, index: number, widgetProperties: WidgetProperties):\r\n React.ReactNode\r\n {\r\n const stepWidgetProps = widgetProperties.steps.find(\r\n s => s.paneUseKey === step.paneUseKey)!;\r\n\r\n if (!stepWidgetProps)\r\n {\r\n return null;\r\n }\r\n\r\n if (stepWidgetProps.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n { WizardControlBase.gotoStep(step.paneUseKey); }}\r\n selected={step.paneUseKey === widgetProperties.selectedPaneUseKey}\r\n step={WizardControlBase.getStepNumber(index)}\r\n tabIndex={-1}\r\n value={step.paneUseKey}\r\n />);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties = WizardControlBase.getWidgetProperties();\r\n const steps = WizardControlBase.getSteps();\r\n\r\n if (!widgetProperties || !steps)\r\n {\r\n return null;\r\n }\r\n\r\n if (widgetProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {steps.map((step, index) =>\r\n this.renderStepButton(step, index, widgetProperties))}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(WizardStepsDisplay);\r\n","import { Theme } from '@material-ui/core/styles';\r\nimport { createGenerateClassName, StylesProvider, ThemeProvider }\r\n from '@material-ui/styles';\r\nimport { GenerateId } from 'jss';\r\nimport * as React from 'react';\r\nimport Presentation from '../../coreui/Presentation';\r\nimport muiTheme from '../../muiTheme';\r\n\r\ninterface Props\r\n{\r\n config: object;\r\n containerName: string;\r\n}\r\n\r\nclass ThemeWrapper extends\r\n React.PureComponent\r\n{\r\n private readonly generateClassName: GenerateId;\r\n private readonly rootTheme: Theme;\r\n\r\n public constructor(props: Props)\r\n {\r\n super(props);\r\n\r\n this.generateClassName = createGenerateClassName(\r\n {\r\n disableGlobal: true,\r\n seed: this.props.containerName,\r\n });\r\n this.rootTheme = muiTheme('grey', false);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n return (\r\n \r\n \r\n {React.isValidElement(this.props.config)\r\n ? this.props.config\r\n : Presentation.create(this.props.config)}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ThemeWrapper;\r\n","import { TextFieldProps as muiTextFieldProps }\r\n from '@material-ui/core/TextField';\r\nimport { ThemeProvider } from '@material-ui/styles';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport Logging from '../core/Logging';\r\nimport Routing from '../core/Routing';\r\nimport Sys from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel, { ITrackable } from '../core/TrackableModel';\r\nimport muiTheme from '../muiTheme';\r\nimport ActionButton from '../mustangui/ActionButton';\r\nimport BrandingImageDisplay from '../mustangui/BrandingImageDisplay';\r\nimport CaptchaControl from '../mustangui/CaptchaControl';\r\nimport CardControl from '../mustangui/CardControl';\r\nimport Checkbox, { Checkbox as CheckboxBase } from '../mustangui/Checkbox';\r\nimport ComplexGridControl from '../mustangui/ComplexGridControl';\r\nimport ComponentTest from '../mustangui/ComponentTest';\r\nimport ComponentTypeDisplay from '../mustangui/ComponentTypeDisplay';\r\nimport DashboardCriteria from '../mustangui/DashboardCriteria';\r\nimport DashboardGridControl from '../mustangui/DashboardGridControl';\r\nimport DataImageDisplay from '../mustangui/DataImageDisplay';\r\nimport DataLink from '../mustangui/DataLink';\r\nimport DateEdit from '../mustangui/DateEdit';\r\nimport DividerDisplay from '../mustangui/DividerDisplay';\r\nimport DocumentEdit from '../mustangui/DocumentEdit';\r\nimport DomainComboBox from '../mustangui/DomainComboBox';\r\nimport EmbeddedAddOn from '../mustangui/EmbeddedAddOn';\r\nimport Freeflow from '../mustangui/Freeflow';\r\nimport Grid from '../mustangui/Grid';\r\nimport GridFilter from '../mustangui/GridFilter';\r\nimport GridItem from '../mustangui/GridItem';\r\nimport GridNewRowChip from '../mustangui/GridNewRowChip';\r\nimport GridPager from '../mustangui/GridPager';\r\nimport GridRelatedEditButton from '../mustangui/GridRelatedEditButton';\r\nimport GridSelectedCount from '../mustangui/GridSelectedCount';\r\nimport GroupHeading from '../mustangui/GroupHeading';\r\nimport IconDisplay from '../mustangui/IconDisplay';\r\nimport IconDisplayVerticalLayout from '../mustangui/IconDisplayVerticalLayout';\r\nimport LanguageSelect from '../mustangui/LanguageSelect';\r\nimport ManualLink from '../mustangui/ManualLink';\r\nimport Media from '../mustangui/Media';\r\nimport MenuButton from '../mustangui/MenuButton';\r\nimport MenuItem from '../mustangui/MenuItem';\r\nimport MenuPane from '../mustangui/MenuPane';\r\nimport MLTextEdit from '../mustangui/MLTextEdit';\r\nimport NumericEdit from '../mustangui/NumericEdit';\r\nimport Panel from '../mustangui/Panel';\r\nimport PresentationButton from '../mustangui/PresentationButton';\r\nimport RadioSelect from '../mustangui/RadioSelect';\r\nimport RelationshipComboBox from '../mustangui/RelationshipComboBox';\r\nimport ResponsiveGrid from '../mustangui/ResponsiveGrid';\r\nimport SearchButton from '../mustangui/SearchButton';\r\nimport SelectControl from '../mustangui/SelectControl';\r\nimport SelectControlSelectedGrid from '../mustangui/SelectControlSelectedGrid';\r\nimport SelectDialogResultsGrid from '../mustangui/SelectDialogResultsGrid';\r\nimport SimpleGridControl from '../mustangui/SimpleGridControl';\r\nimport SLTextEdit from '../mustangui/SLTextEdit';\r\nimport SubPane from '../mustangui/SubPane';\r\nimport SubPaneControl from '../mustangui/SubPaneControl';\r\nimport TabControl from '../mustangui/TabControl';\r\nimport TableExport from '../mustangui/TableExport';\r\nimport TablePrint from '../mustangui/TablePrint';\r\nimport TableSort from '../mustangui/TableSort';\r\nimport TableSummary from '../mustangui/TableSummary';\r\nimport TextCriteria from '../mustangui/TextCriteria';\r\nimport TextDisplay from '../mustangui/TextDisplay';\r\nimport ThumbnailDisplay from '../mustangui/ThumbnailDisplay';\r\nimport Toolbar from '../mustangui/Toolbar';\r\nimport ToolbarContainerGroup from '../mustangui/ToolbarContainerGroup';\r\nimport ToolbarContainerItem from '../mustangui/ToolbarContainerItem';\r\nimport ToolbarContainerOverflowSection\r\n from '../mustangui/ToolbarContainerOverflowSection';\r\nimport ToolbarContainerSection from '../mustangui/ToolbarContainerSection';\r\nimport WizardControl from '../mustangui/WizardControl';\r\nimport WizardStepNumberDisplay from '../mustangui/WizardStepNumberDisplay';\r\nimport WizardStepsDisplay from '../mustangui/WizardStepsDisplay';\r\nimport ThemeWrapper from '../templates/components/ThemeWrapper';\r\nimport Button from './Button';\r\nimport Chip from './Chip';\r\nimport Collapse from './Collapse';\r\nimport ErrorTooltip from './ErrorTooltip';\r\nimport Fade from './Fade';\r\nimport FormControl from './FormControl';\r\nimport FormControlLabel from './FormControlLabel';\r\nimport FormData from './FormData';\r\nimport Grow from './Grow';\r\nimport Hidden from './Hidden';\r\nimport Icon from './Icon';\r\nimport IconButton from './IconButton';\r\nimport InformationBadge from './InformationBadge';\r\nimport InputAdornment from './InputAdornment';\r\nimport Link from './Link';\r\nimport Paper from './Paper';\r\nimport Snackbar from './Snackbar';\r\nimport SnackbarContent from './SnackbarContent';\r\nimport TextField from './TextField';\r\nimport Toast from './Toast';\r\nimport Tooltip from './Tooltip';\r\nimport Typography from './Typography';\r\n\r\nexport type Colors =\r\n | 'action'\r\n | 'default'\r\n | 'disabled'\r\n | 'error'\r\n | 'inherit'\r\n | 'primary'\r\n | 'secondary';\r\n\r\nexport type CreatedReactElement = React.DetailedReactHTMLElement<\r\n React.InputHTMLAttributes, HTMLInputElement>;\r\n\r\nexport interface TextFieldProps\r\n{\r\n autoFocus?: boolean;\r\n dataCase?: 'lower' | 'UPPER' | 'Any';\r\n dataId?: string;\r\n endIcon?: string;\r\n endIconColor?: Colors;\r\n icon?: string;\r\n iconColor?: Colors;\r\n label?: string;\r\n name?: string;\r\n type?: string;\r\n}\r\n\r\nexport default class Presentation\r\n{\r\n private static canvas: HTMLCanvasElement | null = null;\r\n public static currentComponent: React.Component | undefined;\r\n public static currentPresentationId: number | undefined;\r\n // Dictionary of panes, keyed by presentation.\r\n public static panes: Map> = new Map>();\r\n\r\n // Clear the contents of the models and collections for the specified\r\n // presentation.\r\n public static clearPaneData(presentation: string): void\r\n {\r\n if (Presentation.panes.has(presentation.toString()))\r\n {\r\n Presentation.panes.get(presentation.toString())!.forEach(\r\n (dataId) =>\r\n {\r\n if (TrackableModel.models.has(dataId))\r\n {\r\n TrackableModel.models.get(dataId)!.clear();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public static create(\r\n config: object | undefined,\r\n propagatedProps: {} | null = null): CreatedReactElement | null\r\n {\r\n if (!config)\r\n {\r\n return null;\r\n }\r\n\r\n let props: object | undefined = undefined;\r\n if ('props' in config)\r\n {\r\n props = { ...config['props'] };\r\n if (propagatedProps)\r\n {\r\n props!['propagated'] = propagatedProps;\r\n }\r\n }\r\n else if (propagatedProps)\r\n {\r\n props = { propagated: propagatedProps };\r\n }\r\n\r\n let result: CreatedReactElement | null = null;\r\n if ('children' in config)\r\n {\r\n // A list of child configurations or components.\r\n if (config['children'] instanceof Array)\r\n {\r\n const children: (CreatedReactElement | string | null)[] = [];\r\n\r\n (config['children'] as object[]).forEach((child) =>\r\n {\r\n if (typeof child === 'string')\r\n {\r\n children.push(child);\r\n }\r\n else\r\n {\r\n children.push(\r\n Presentation.create(child, propagatedProps));\r\n }\r\n });\r\n\r\n result = React.createElement(\r\n Presentation.getComponent(config['type']),\r\n props, ...children);\r\n }\r\n // A single child configuration.\r\n else if (config['children'] instanceof Object)\r\n {\r\n const child = Presentation.create(\r\n config['children'], propagatedProps);\r\n\r\n result = React.createElement(\r\n Presentation.getComponent(config['type']),\r\n props, child);\r\n }\r\n // A literal child such as text for a button.\r\n else\r\n {\r\n result = React.createElement(\r\n Presentation.getComponent(config['type']),\r\n props, config['children']);\r\n }\r\n }\r\n // Configuration without children.\r\n else\r\n {\r\n result = React.createElement(\r\n Presentation.getComponent(config['type']), props);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Wrap the specified config in the default theme.\r\n public static createWithTheme(\r\n config: object,\r\n baseForegroundColor: 'grey' | 'white',\r\n isHeaderOrFooter: boolean\r\n ): React.ReactElement\r\n {\r\n const isElement = React.isValidElement(config);\r\n const children = isElement ? config : Presentation.create(config);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n\r\n // Return the react component identified by the specified type.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static getComponent(type: string | React.ReactNode): any\r\n {\r\n if (typeof type !== 'string')\r\n {\r\n return type;\r\n }\r\n\r\n let result: string | React.ReactNode = null;\r\n\r\n switch (type)\r\n {\r\n case 'ActionButton':\r\n result = ActionButton;\r\n break;\r\n case 'BrandingImageDisplay':\r\n result = BrandingImageDisplay;\r\n break;\r\n case 'Button':\r\n result = Button;\r\n break;\r\n case 'CaptchaControl':\r\n result = CaptchaControl;\r\n break;\r\n case 'CardControl':\r\n result = CardControl;\r\n break;\r\n case 'CheckBox':\r\n result = Checkbox;\r\n break;\r\n case 'Chip':\r\n result = Chip;\r\n break;\r\n case 'Collapse':\r\n result = Collapse;\r\n break;\r\n case 'ComplexGridControl':\r\n result = ComplexGridControl;\r\n break;\r\n case 'ComponentTest':\r\n result = ComponentTest;\r\n break;\r\n case 'ComponentTypeDisplay':\r\n result = ComponentTypeDisplay;\r\n break;\r\n case 'DashboardCriteria':\r\n result = DashboardCriteria;\r\n break;\r\n case 'DashboardGridControl':\r\n result = DashboardGridControl;\r\n break;\r\n case 'DataImageDisplay':\r\n result = DataImageDisplay;\r\n break;\r\n case 'DataLink':\r\n result = DataLink;\r\n break;\r\n case 'DateEdit':\r\n result = DateEdit;\r\n break;\r\n case 'div':\r\n result = 'div';\r\n break;\r\n case 'DividerDisplay':\r\n result = DividerDisplay;\r\n break;\r\n case 'DocumentEdit':\r\n result = DocumentEdit;\r\n break;\r\n case 'DomainComboBox':\r\n result = DomainComboBox;\r\n break;\r\n case 'EmbeddedAddOn':\r\n result = EmbeddedAddOn;\r\n break;\r\n case 'ErrorTooltip':\r\n result = ErrorTooltip;\r\n break;\r\n case 'Fade':\r\n result = Fade;\r\n break;\r\n case 'FormControl':\r\n result = FormControl;\r\n break;\r\n case 'FormControlLabel':\r\n result = FormControlLabel;\r\n break;\r\n case 'FormData':\r\n result = FormData;\r\n break;\r\n case 'Fragment':\r\n result = React.Fragment;\r\n break;\r\n case 'Freeflow':\r\n result = Freeflow;\r\n break;\r\n case 'Grid':\r\n result = Grid;\r\n break;\r\n case 'GridFilter':\r\n result = GridFilter;\r\n break;\r\n case 'GridItem':\r\n result = GridItem;\r\n break;\r\n case 'GridNewRowChip':\r\n result = GridNewRowChip;\r\n break;\r\n case 'GridPager':\r\n result = GridPager;\r\n break;\r\n case 'GridRelatedEditButton':\r\n result = GridRelatedEditButton;\r\n break;\r\n case 'GridSelectedCount':\r\n result = GridSelectedCount;\r\n break;\r\n case 'Grow':\r\n result = Grow;\r\n break;\r\n case 'GroupHeading':\r\n result = GroupHeading;\r\n break;\r\n case 'Hidden':\r\n result = Hidden;\r\n break;\r\n case 'Icon':\r\n result = Icon;\r\n break;\r\n case 'IconDisplay':\r\n result = IconDisplay;\r\n break;\r\n case 'IconDisplayVerticalLayout':\r\n result = IconDisplayVerticalLayout;\r\n break;\r\n case 'IconButton':\r\n result = IconButton;\r\n break;\r\n case 'InformationBadge':\r\n result = InformationBadge;\r\n break;\r\n case 'InputAdornment':\r\n result = InputAdornment;\r\n break;\r\n case 'LanguageSelect':\r\n result = LanguageSelect;\r\n break;\r\n case 'Link':\r\n result = Link;\r\n break;\r\n case 'ManualLink':\r\n result = ManualLink;\r\n break;\r\n case 'Media':\r\n result = Media;\r\n break;\r\n case 'MenuButton':\r\n result = MenuButton;\r\n break;\r\n case 'MenuItem':\r\n result = MenuItem;\r\n break;\r\n case 'MenuPane':\r\n result = MenuPane;\r\n break;\r\n case 'MLTextEdit':\r\n result = MLTextEdit;\r\n break;\r\n case 'NumericEdit':\r\n result = NumericEdit;\r\n break;\r\n case 'Panel':\r\n result = Panel;\r\n break;\r\n case 'Paper':\r\n result = Paper;\r\n break;\r\n case 'PresentationButton':\r\n result = PresentationButton;\r\n break;\r\n case 'RadioSelect':\r\n result = RadioSelect;\r\n break;\r\n case 'RelationshipComboBox':\r\n result = RelationshipComboBox;\r\n break;\r\n case 'ResponsiveGrid':\r\n result = ResponsiveGrid;\r\n break;\r\n case 'SelectDialogResultsGrid':\r\n result = SelectDialogResultsGrid;\r\n break;\r\n case 'SearchButton':\r\n result = SearchButton;\r\n break;\r\n case 'SelectControl':\r\n result = SelectControl;\r\n break;\r\n case 'SelectControlSelectedGrid':\r\n result = SelectControlSelectedGrid;\r\n break;\r\n case 'SimpleGridControl':\r\n result = SimpleGridControl;\r\n break;\r\n case 'SLTextEdit':\r\n result = SLTextEdit;\r\n break;\r\n case 'Snackbar':\r\n result = Snackbar;\r\n break;\r\n case 'SnackbarContent':\r\n result = SnackbarContent;\r\n break;\r\n case 'SubPane':\r\n result = SubPane;\r\n break;\r\n case 'SubPaneControl':\r\n result = SubPaneControl;\r\n break;\r\n case 'TabControl':\r\n result = TabControl;\r\n break;\r\n case 'TableExport':\r\n result = TableExport;\r\n break;\r\n case 'TablePrint':\r\n result = TablePrint;\r\n break;\r\n case 'TableSort':\r\n result = TableSort;\r\n break;\r\n case 'TableSummary':\r\n result = TableSummary;\r\n break;\r\n case 'TextCriteria':\r\n result = TextCriteria;\r\n break;\r\n case 'TextDisplay':\r\n result = TextDisplay;\r\n break;\r\n case 'TextField':\r\n result = TextField;\r\n break;\r\n case 'ThumbnailDisplay':\r\n result = ThumbnailDisplay;\r\n break;\r\n case 'Toast':\r\n result = Toast;\r\n break;\r\n case 'Toolbar':\r\n result = Toolbar;\r\n break;\r\n case 'ToolbarContainerGroup':\r\n result = ToolbarContainerGroup;\r\n break;\r\n case 'ToolbarContainerItem':\r\n result = ToolbarContainerItem;\r\n break;\r\n case 'ToolbarContainerOverflowSection':\r\n result = ToolbarContainerOverflowSection;\r\n break;\r\n case 'ToolbarContainerSection':\r\n result = ToolbarContainerSection;\r\n break;\r\n case 'Tooltip':\r\n result = Tooltip;\r\n break;\r\n case 'Typography':\r\n result = Typography;\r\n break;\r\n case 'WizardControl':\r\n result = WizardControl;\r\n break;\r\n case 'WizardStepNumberDisplay':\r\n result = WizardStepNumberDisplay;\r\n break;\r\n case 'WizardStepsDisplay':\r\n result = WizardStepsDisplay;\r\n break;\r\n default:\r\n throw new Error(`Unknown widget type ${type}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Get the specified observable.\r\n public static getObservable(props: object): object | null\r\n {\r\n if (props['node'])\r\n {\r\n return props['node']['data'];\r\n }\r\n\r\n const trackable: ITrackable | undefined =\r\n Presentation.getTrackable(props);\r\n\r\n if (!trackable)\r\n {\r\n return null;\r\n }\r\n\r\n if (trackable instanceof TrackableCollection)\r\n {\r\n const collection = Presentation.getObservableCollection(\r\n props['dataId'],\r\n trackable);\r\n\r\n if (props['propagated'] && props['propagated']['rowKey'])\r\n {\r\n // FUTURE\r\n // This code is safe because of the way the row key is\r\n // structured - in that the section passed down through the\r\n // propagated props will always be a sub-set of any row-keys on\r\n // a sub-pane in a card.\r\n //\r\n // The problem is that the browser is now depending on the\r\n // structure of the row key (something defined by the\r\n // AppServer). If at all possible, we should try to devise a\r\n // way in which everything in the layout knows exactly which\r\n // row key it should use. At that point, we can compare row\r\n // keys with === and the browser will therefore be unaware of\r\n // the row key structure.\r\n return collection.find(\r\n o => o['rowKey'].startsWith(props['propagated']['rowKey']))!;\r\n }\r\n\r\n if (collection.length > 1)\r\n {\r\n throw new Error('TrackableCollection has more than one item, '\r\n + 'a rowKey is required');\r\n }\r\n\r\n return collection[0];\r\n }\r\n\r\n return trackable;\r\n }\r\n\r\n // Obsolete, replaced by PaneDataStore.getPaneCollection\r\n public static getObservableCollection(\r\n dataId: string,\r\n trackableCollection?: TrackableCollection): TrackableModel[]\r\n {\r\n let result: TrackableModel[];\r\n let collection: TrackableCollection | undefined =\r\n trackableCollection;\r\n\r\n if (!collection)\r\n {\r\n if (TrackableModel.models.has(dataId))\r\n {\r\n collection =\r\n TrackableModel.models.get(dataId) as\r\n TrackableCollection;\r\n }\r\n }\r\n\r\n if (collection)\r\n {\r\n if (collection.observableCollection)\r\n {\r\n result = collection.observableCollection;\r\n }\r\n else\r\n {\r\n result = collection;\r\n }\r\n }\r\n else\r\n {\r\n result = [];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Get the specified trackable.\r\n public static getTrackable(props: object): ITrackable | undefined\r\n {\r\n let result: ITrackable | undefined = undefined;\r\n\r\n if (props && props['dataId']\r\n && TrackableModel.models.has(props['dataId']))\r\n {\r\n result = TrackableModel.models.get(props['dataId']);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Get the current value from the specified model property.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static getValue(props: object, defaultValue: any = ''): any\r\n {\r\n const observable: object | null = Presentation.getObservable(props);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let result: any = defaultValue;\r\n\r\n if (observable)\r\n {\r\n const row = observable as TrackableModel;\r\n result = row.getPropertyValue(props['name']) || defaultValue;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public static measureText(text: string, font: string = '14px roboto'): number\r\n {\r\n let result: number = 0;\r\n\r\n if (text)\r\n {\r\n Presentation.canvas =\r\n Presentation.canvas || document.createElement('canvas');\r\n\r\n const context = Presentation.canvas.getContext('2d');\r\n\r\n if (context)\r\n {\r\n context.font = font;\r\n\r\n const textMetrics = context.measureText(text);\r\n\r\n result = textMetrics.width;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Create and inject the specified configuration into the given\r\n // container element.\r\n public static render(\r\n config: object,\r\n container: string | HTMLElement | null = 'root')\r\n {\r\n try\r\n {\r\n let injectContainer = container;\r\n let containerName: string = 'root';\r\n if (typeof injectContainer === 'string')\r\n {\r\n containerName = injectContainer;\r\n injectContainer = document.getElementById(injectContainer);\r\n }\r\n\r\n if (injectContainer && config)\r\n {\r\n ReactDOM.render(\r\n ,\r\n injectContainer);\r\n }\r\n }\r\n catch (error)\r\n {\r\n if (process.env.NODE_ENV === 'production')\r\n {\r\n const message: string = error instanceof String\r\n ? error : error['message'];\r\n\r\n Routing.goToErrorPage(Sys.getTranslation('Error'), message);\r\n }\r\n\r\n Logging.error(error);\r\n }\r\n }\r\n\r\n // Establish two way binding on the specified component with the given props.\r\n public static setBinding(component: React.Component, props: object): void\r\n {\r\n if (component.props['dataId'] && component.props['name'])\r\n {\r\n if (component instanceof CheckboxBase)\r\n {\r\n props['onChange'] = (\r\n event: React.ChangeEvent,\r\n checked: boolean) =>\r\n {\r\n Sys.clearBusinessErrors(\r\n component.props['dataId'],\r\n component.props['name']);\r\n Presentation.setValue(component.props, checked);\r\n };\r\n\r\n props['checked'] =\r\n Presentation.getValue(component.props, false);\r\n }\r\n else\r\n {\r\n props['onChange'] = (\r\n event: React.ChangeEvent) =>\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let value: any;\r\n\r\n value = event.target.value;\r\n\r\n if ('dataCase' in component.props)\r\n {\r\n switch (component.props['dataCase'])\r\n {\r\n case 'lower':\r\n value = value.toLowerCase();\r\n break;\r\n case 'UPPER':\r\n value = value.toUpperCase();\r\n break;\r\n case 'Any':\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n Sys.clearBusinessErrors(\r\n component.props['dataId'],\r\n component.props['name']);\r\n Presentation.setValue(component.props, value);\r\n };\r\n\r\n props['value'] = Presentation.getValue(component.props);\r\n }\r\n }\r\n }\r\n\r\n // Set common field properties on the specified component with the given props.\r\n public static setFieldProperties(\r\n component: React.Component,\r\n muiProps: muiTextFieldProps): void\r\n {\r\n const props: TextFieldProps = component.props as TextFieldProps;\r\n\r\n muiProps.autoFocus = props.autoFocus;\r\n muiProps.fullWidth = true;\r\n muiProps.label = props.label;\r\n muiProps.name = props.name;\r\n muiProps.type = props.type;\r\n\r\n if ('icon' in props)\r\n {\r\n if (!('InputProps' in props))\r\n {\r\n muiProps.InputProps = {};\r\n }\r\n\r\n muiProps.InputProps!.startAdornment =\r\n (\r\n \r\n );\r\n }\r\n\r\n if ('endIcon' in props)\r\n {\r\n if (!('InputProps' in props))\r\n {\r\n muiProps.InputProps = {};\r\n }\r\n\r\n muiProps.InputProps!.endAdornment =\r\n (\r\n \r\n );\r\n }\r\n }\r\n\r\n // Registers the panes for the specified presentation;\r\n public static setPanes(presentation: string, scripts: object): void\r\n {\r\n let panes = Presentation.panes.get(presentation);\r\n if (!panes)\r\n {\r\n panes = new Set();\r\n }\r\n\r\n for (const dataId of Object.keys(scripts))\r\n {\r\n if (!panes.has(dataId))\r\n {\r\n panes.add(dataId);\r\n }\r\n }\r\n\r\n Presentation.panes.set(presentation, panes);\r\n }\r\n\r\n // Set the specified model property to the given value.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public static setValue(props: object, value: any): void\r\n {\r\n let trackable: ITrackable | undefined;\r\n let cleanValue = value;\r\n\r\n if (props['node'])\r\n {\r\n trackable = props['node']['data'];\r\n }\r\n else\r\n {\r\n trackable = Presentation.getTrackable(props);\r\n }\r\n\r\n if (!trackable)\r\n {\r\n return;\r\n }\r\n\r\n if (cleanValue === '')\r\n {\r\n cleanValue = null;\r\n }\r\n\r\n if (trackable instanceof TrackableCollection)\r\n {\r\n let model: TrackableModel;\r\n\r\n if (props['propagated'] && props['propagated']['rowKey'])\r\n {\r\n // FUTURE\r\n // This code is safe because of the way the row key is\r\n // structured - in that the section passed down through the\r\n // propagated props will always be a sub-set of any row-keys on\r\n // a sub-pane in a card.\r\n //\r\n // The problem is that the browser is now depending on the\r\n // structure of the row key (something defined by the\r\n // AppServer). If at all possible, we should try to devise a\r\n // way in which everything in the layout knows exactly which\r\n // row key it should use. At that point, we can compare row\r\n // keys with === and the browser will therefore be unaware of\r\n // the row key structure.\r\n model = trackable.find(\r\n o => o['rowKey'].startsWith(props['propagated']['rowKey']))!;\r\n }\r\n else\r\n {\r\n model = trackable[0];\r\n }\r\n\r\n const row = model as TrackableModel;\r\n row.setProperty(props['name'], cleanValue);\r\n }\r\n else\r\n {\r\n const row = trackable as TrackableModel;\r\n row.setProperty(props['name'], cleanValue);\r\n }\r\n }\r\n\r\n // Force the specified component to be removed from memory.\r\n public static unmountComponent(component: React.Component | undefined)\r\n {\r\n try\r\n {\r\n if (component)\r\n {\r\n const node = ReactDOM.findDOMNode(component);\r\n\r\n if (node && node.parentElement)\r\n {\r\n ReactDOM.unmountComponentAtNode(node.parentElement);\r\n }\r\n }\r\n }\r\n catch (exception)\r\n {\r\n Logging.error(exception);\r\n }\r\n }\r\n}\r\n","import common from '@material-ui/core/colors/common';\r\nimport grey from '@material-ui/core/colors/grey';\r\nimport * as muiMenu from '@material-ui/core/Menu';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport * as React from 'react';\r\nimport Drawer, { Drawer as DrawerBase, DrawerProps } from './Drawer';\r\n\r\ninterface Props extends muiMenu.MenuProps\r\n{\r\n anchor?: 'left' | 'right';\r\n drawerMenu?: boolean;\r\n name?: string | null;\r\n}\r\n\r\nexport class Menu extends React.PureComponent\r\n{\r\n // Dictionary of menu components, keyed by name.\r\n public static instances: Map> =\r\n new Map>();\r\n\r\n protected muiDrawerProps: DrawerProps;\r\n protected muiProps: muiMenu.MenuProps;\r\n\r\n public static closeAll()\r\n {\r\n let done: boolean = false;\r\n\r\n Menu.instances.forEach((value: Set) =>\r\n {\r\n value.forEach((menu: Menu) =>\r\n {\r\n menu.close(true);\r\n done = true;\r\n });\r\n });\r\n\r\n if (!done)\r\n {\r\n DrawerBase.closeAll();\r\n }\r\n }\r\n\r\n public static open(name?: string | null, anchorElement?: HTMLElement)\r\n {\r\n let done: boolean = false;\r\n\r\n if (name && Menu.instances.has(name))\r\n {\r\n Menu.instances.get(name)!.forEach((menu) =>\r\n {\r\n if (!anchorElement || menu.props.anchorEl === anchorElement)\r\n {\r\n if (anchorElement && anchorElement.tagName === 'LI')\r\n {\r\n anchorElement.style.color = common.white;\r\n anchorElement.style.backgroundColor = grey[800];\r\n }\r\n\r\n menu.open();\r\n done = true;\r\n }\r\n });\r\n }\r\n\r\n if (!done)\r\n {\r\n DrawerBase.open(name, anchorElement);\r\n }\r\n }\r\n\r\n public static toggle(name?: string | null)\r\n {\r\n if (name && Menu.instances.has(name))\r\n {\r\n Menu.instances.get(name)!.forEach((menu) =>\r\n {\r\n menu.toggle();\r\n });\r\n }\r\n else\r\n {\r\n DrawerBase.toggle(name);\r\n }\r\n }\r\n\r\n constructor(props: Props & WithWidth)\r\n {\r\n super(props);\r\n\r\n if ('open' in props)\r\n {\r\n this.state = { open: props.open };\r\n }\r\n else\r\n {\r\n this.state = { open: false };\r\n }\r\n\r\n if (props.drawerMenu)\r\n {\r\n this.muiDrawerProps = { open: false };\r\n this.muiDrawerProps.anchor = props.anchor;\r\n this.muiDrawerProps.name = props.name;\r\n }\r\n else\r\n {\r\n this.muiProps =\r\n {\r\n getContentAnchorEl: undefined,\r\n onExited: props.onExited,\r\n open: false,\r\n };\r\n\r\n this.muiProps.onKeyDown = (event) =>\r\n {\r\n // Don't propagate keyboard events to parent menus\r\n event.stopPropagation();\r\n\r\n if (event.key === 'Escape')\r\n {\r\n this.close(false);\r\n }\r\n };\r\n\r\n if (props.name)\r\n {\r\n if (Menu.instances.has(props.name))\r\n {\r\n Menu.instances.get(props.name)!.add(this);\r\n }\r\n else\r\n {\r\n Menu.instances.set(props.name, new Set([this]));\r\n }\r\n }\r\n }\r\n }\r\n\r\n public close(disableRestoreFocus: boolean)\r\n {\r\n if (this.state['open'])\r\n {\r\n this.muiProps.disableRestoreFocus = disableRestoreFocus;\r\n\r\n if (this.props.anchorEl)\r\n {\r\n const anchorElement = this.props.anchorEl as HTMLElement;\r\n\r\n if (anchorElement.tagName === 'LI')\r\n {\r\n anchorElement.style.color = 'inherit';\r\n anchorElement.style.backgroundColor = 'transparent';\r\n }\r\n }\r\n\r\n this.setState({ open: false });\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.props.name && Menu.instances.has(this.props.name))\r\n {\r\n Menu.instances.get(this.props.name)!.delete(this);\r\n\r\n if (Menu.instances.get(this.props.name)!.size === 0)\r\n {\r\n Menu.instances.delete(this.props.name);\r\n }\r\n }\r\n }\r\n\r\n public open()\r\n {\r\n if (!this.state['open'])\r\n {\r\n this.setState({ open: true });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n let result: React.ReactNode = null;\r\n\r\n if (_props.drawerMenu)\r\n {\r\n result =\r\n \r\n {_props.children}\r\n ;\r\n }\r\n else\r\n {\r\n this.muiProps.anchorEl = _props.anchorEl;\r\n this.muiProps.children = _props.children;\r\n\r\n if (_props.width === 'xs')\r\n {\r\n this.muiProps.anchorOrigin =\r\n { horizontal: 'center', vertical: 'bottom' };\r\n this.muiProps.transformOrigin =\r\n { horizontal: 'center', vertical: 'top' };\r\n }\r\n else\r\n {\r\n if (_props.anchorOrigin)\r\n {\r\n this.muiProps.anchorOrigin = _props.anchorOrigin;\r\n }\r\n else\r\n {\r\n this.muiProps.anchorOrigin =\r\n { horizontal: 'left', vertical: 'bottom' };\r\n }\r\n\r\n this.muiProps.transformOrigin =\r\n { horizontal: 'left', vertical: 'top' };\r\n }\r\n\r\n result =\r\n { this.close(false); }}\r\n open={this.state['open']}\r\n />;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public toggle()\r\n {\r\n this.setState({ open: !this.state['open'] });\r\n }\r\n}\r\n\r\nexport default withWidth()(Menu);\r\n","import { observable, toJS } from 'mobx';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel from '../core/TrackableModel';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype RuntimeProperties = { [id: string]: any };\r\n\r\ntype Widgets = { [id: string]: RuntimeWidget };\r\n\r\nexport type WidgetValue = boolean | Date | number | string | null;\r\n\r\nexport interface RuntimeWidget\r\n{\r\n properties: RuntimeProperties;\r\n value: WidgetValue;\r\n}\r\n\r\nexport interface WidgetData\r\n{\r\n [id: string]: RuntimeWidget;\r\n}\r\n\r\nexport default class PaneRow extends TrackableModel\r\n{\r\n @observable private rowWidgets: Widgets = {};\r\n public isNew: boolean = false;\r\n public objectHandle: string;\r\n public rowKey: string;\r\n\r\n public get widgets(): Widgets\r\n {\r\n return this.rowWidgets;\r\n }\r\n\r\n public set widgets(value: Widgets)\r\n {\r\n for (const widgetName of Object.keys(value))\r\n {\r\n const newWidget = value[widgetName] as RuntimeWidget;\r\n if (widgetName in this.rowWidgets)\r\n {\r\n const widget = this.rowWidgets[widgetName] as RuntimeWidget;\r\n for (const prop of Object.keys(newWidget.properties))\r\n {\r\n // FUTURE\r\n // This check is used to detect if the property is an array\r\n // observable. It is safe right now because there are no\r\n // runtime properties on the widgets that are objects.\r\n //\r\n // We may want to add support for objects, though that would\r\n // essentially amount to implementing a recursive traversal,\r\n // which greatly increases the complexity of this method.\r\n const oldValue = widget.properties[prop];\r\n const newValue = newWidget.properties[prop];\r\n if (newValue instanceof Object)\r\n {\r\n if (typeof oldValue.replace !== 'function')\r\n {\r\n throw new Error('Observable arrays are the only'\r\n + ' objects supported in runtime data. '\r\n + `Widget: \"${widgetName}\" `\r\n + `Property: \"${prop}\"`);\r\n }\r\n\r\n if (JSON.stringify(oldValue)\r\n !== JSON.stringify(newValue))\r\n {\r\n // Clone object / array properties\r\n oldValue.replace(toJS(newValue));\r\n }\r\n }\r\n else\r\n {\r\n widget.properties[prop] = newValue;\r\n }\r\n }\r\n widget.value = value[widgetName].value;\r\n }\r\n else\r\n {\r\n this.rowWidgets[widgetName] = observable(newWidget);\r\n }\r\n }\r\n }\r\n\r\n public static get(\r\n dataId: string,\r\n rowKey: string | null = null\r\n ): PaneRow | null\r\n {\r\n if (!TrackableModel.models.has(dataId))\r\n {\r\n return null;\r\n }\r\n\r\n const collection =\r\n TrackableModel.models.get(dataId) as TrackableCollection;\r\n\r\n const observableCollection = collection.observableCollection\r\n ? collection.observableCollection\r\n : collection;\r\n\r\n if (observableCollection.length === 0)\r\n {\r\n return null;\r\n }\r\n\r\n if (!rowKey)\r\n {\r\n if (observableCollection.length > 1)\r\n {\r\n throw new Error(\r\n 'A rowKey is required if the TrackableCollection has more '\r\n + 'than one item');\r\n }\r\n\r\n return observableCollection[0] as PaneRow;\r\n }\r\n\r\n const model = observableCollection.find(\r\n m => m['rowKey'].startsWith(rowKey));\r\n\r\n if (!model)\r\n {\r\n return null;\r\n }\r\n\r\n return model as PaneRow;\r\n }\r\n\r\n public static getWidgetProperties(\r\n dataId: string,\r\n widgetName: string\r\n ): RuntimeProperties\r\n {\r\n if (!TrackableModel.models.has(dataId))\r\n {\r\n throw Error(`Could not find collection with dataId ${dataId}`);\r\n }\r\n\r\n const collection =\r\n TrackableModel.models.get(dataId) as TrackableCollection;\r\n\r\n if (!collection.isLoaded)\r\n {\r\n throw Error(\r\n `Collection with dataId ${dataId} has not yet been loaded`);\r\n }\r\n\r\n const observableCollection = collection.observableCollection\r\n ? collection.observableCollection\r\n : collection;\r\n\r\n const paneRow = observableCollection[0] as PaneRow;\r\n\r\n return paneRow.getWidget(widgetName).properties;\r\n }\r\n\r\n protected getPropertyNames(): string[]\r\n {\r\n return Object.keys(this.widgets);\r\n }\r\n\r\n protected loadData(data: TrackableModel)\r\n {\r\n const row = data as PaneRow;\r\n this.isNew = row.isNew;\r\n this.objectHandle = row.objectHandle;\r\n this.rowKey = row.rowKey;\r\n this.widgets = row.widgets;\r\n }\r\n\r\n protected setPropertyValue(propName: string, value: WidgetValue): void\r\n {\r\n this.widgets[propName].value = value;\r\n }\r\n\r\n public getPrimaryKey(): string\r\n {\r\n return this.rowKey;\r\n }\r\n\r\n public getPropertyValue(propName: string): WidgetValue\r\n {\r\n return this.widgets[propName].value;\r\n }\r\n\r\n public getReadOnlyProperties(propName: string): RuntimeProperties\r\n {\r\n return this.widgets[propName].properties;\r\n }\r\n\r\n public getWidget(widgetName: string): RuntimeWidget\r\n {\r\n return this.widgets[widgetName];\r\n }\r\n\r\n public updateWidget(widgetName: string, widgetData: RuntimeWidget): void\r\n {\r\n this.widgets[widgetName] = widgetData;\r\n }\r\n}\r\n\r\nTrackableModel.setPrimaryKeyName('PaneRow', 'rowKey');\r\n","import AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys, { BusinessError } from '../core/Sys';\r\nimport Presentation from '../coreui/Presentation';\r\nimport PaneRow from '../models/PaneRow';\r\nimport { EmbeddedAddOn as EmbeddedAddOnBase } from '../mustangui/EmbeddedAddOn';\r\nimport LayoutStateStore from '../stores/LayoutStateStore';\r\nimport PaneDataStore, { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport BaseService, { Response } from './BaseService';\r\n\r\nexport interface RoundTripResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n layoutId?: string;\r\n newObjectId?: string;\r\n paneDataByDataId: PaneDataByDataId;\r\n url?: string;\r\n validationErrors?: string[];\r\n}\r\n\r\nexport default class RoundTripService\r\n{\r\n public static customRoundTrip(\r\n url: string,\r\n urlParams?: object,\r\n postArgs?: object\r\n ): RequestPromise\r\n {\r\n EmbeddedAddOnBase.instances.forEach(\r\n (embeddedAddOn: EmbeddedAddOnBase) =>\r\n {\r\n embeddedAddOn.roundTripStarting();\r\n });\r\n\r\n const args = {\r\n jsonData: JSON.stringify(\r\n {\r\n appServerState: AppServer.getState(),\r\n dataChanges: PaneDataStore.getChanges(),\r\n layoutState: LayoutStateStore.getCurrentState(),\r\n ...postArgs,\r\n }),\r\n };\r\n\r\n Sys.clearErrors();\r\n\r\n let request: RequestPromise;\r\n\r\n return new RequestPromise(\r\n (resolve, reject) =>\r\n {\r\n request = BaseService.request(\r\n Sys.getUrl(url, urlParams), args, 'POST'\r\n );\r\n request.then(\r\n response => resolve(JSON.parse(response.responseText))\r\n ).catch(response => reject(response));\r\n },\r\n () =>\r\n {\r\n request.abort();\r\n });\r\n }\r\n\r\n public static partialDataRetrevial(\r\n url: string,\r\n urlParams?: object,\r\n postArgs?: object\r\n ): RequestPromise\r\n {\r\n const args = {\r\n jsonData: JSON.stringify(\r\n {\r\n appServerState: AppServer.getState(),\r\n dataChanges: PaneDataStore.getChanges(),\r\n ...postArgs,\r\n }),\r\n };\r\n\r\n let request: RequestPromise;\r\n\r\n return new RequestPromise(\r\n (resolve, reject) =>\r\n {\r\n request = BaseService.request(\r\n Sys.getUrl(url, urlParams), args, 'POST', false\r\n );\r\n request.then(\r\n response => resolve(JSON.parse(response.responseText))\r\n ).catch(response => reject(response));\r\n },\r\n () =>\r\n {\r\n request.abort();\r\n });\r\n }\r\n\r\n public static standardRoundTrip(\r\n url: string,\r\n props: {\r\n dataId?: string;\r\n name?: string;\r\n },\r\n jsonData?: object,\r\n disableMask: boolean = false\r\n ): RequestPromise\r\n {\r\n if (!props.dataId || !props.name)\r\n {\r\n throw new Error('Invalid round trip properties');\r\n }\r\n\r\n let request: RequestPromise;\r\n\r\n return new RequestPromise(\r\n (resolve, reject) =>\r\n {\r\n if (!disableMask)\r\n {\r\n RequestsStore.instance.processingStarted();\r\n }\r\n\r\n EmbeddedAddOnBase.instances.forEach(\r\n (embeddedAddOn: EmbeddedAddOnBase) =>\r\n {\r\n embeddedAddOn.roundTripStarting();\r\n });\r\n\r\n const paneRow = Presentation.getObservable(props)! as PaneRow;\r\n\r\n request = BaseService.request(\r\n `${url}/${paneRow.rowKey}/${props.dataId}/${props.name}`,\r\n {\r\n jsonData: JSON.stringify(\r\n {\r\n appServerState: AppServer.getState(),\r\n dataChanges: PaneDataStore.getChanges(),\r\n layoutState: LayoutStateStore.getCurrentState(),\r\n ...jsonData,\r\n }),\r\n },\r\n 'POST');\r\n\r\n request.then((response) =>\r\n {\r\n const parsedResponse =\r\n JSON.parse(response.responseText) as RoundTripResponse;\r\n\r\n if (parsedResponse.validationErrors\r\n && parsedResponse.validationErrors.length > 0)\r\n {\r\n Sys.clearErrors();\r\n Sys.showErrors(parsedResponse.validationErrors);\r\n reject(parsedResponse);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(parsedResponse.appServerState);\r\n\r\n if (parsedResponse.businessErrors.length > 0)\r\n {\r\n Sys.clearBusinessErrors();\r\n }\r\n\r\n PaneDataStore.loadResponse(parsedResponse.paneDataByDataId);\r\n\r\n if (Sys.setBusinessErrors(\r\n parsedResponse.businessErrors, false))\r\n {\r\n resolve(parsedResponse);\r\n return;\r\n }\r\n\r\n if ('url' in parsedResponse && parsedResponse.url)\r\n {\r\n Sys.ignoreChanges = true;\r\n\r\n if (window.location.hash === parsedResponse.url)\r\n {\r\n window.location.reload();\r\n }\r\n else if (!parsedResponse.url.startsWith('#'))\r\n {\r\n window.location.href = parsedResponse.url;\r\n }\r\n else if (paneRow.isNew)\r\n {\r\n Sys.setHash(parsedResponse.url.substr(1));\r\n }\r\n else\r\n {\r\n window.location.assign(parsedResponse.url);\r\n }\r\n }\r\n\r\n resolve(parsedResponse);\r\n }).catch(response => reject(response));\r\n },\r\n () =>\r\n {\r\n request.abort();\r\n }\r\n ).finally(() =>\r\n {\r\n if (!disableMask)\r\n {\r\n RequestsStore.instance.processingStopped();\r\n }\r\n });\r\n }\r\n}\r\n","import Logging from '../core/Logging';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Routing from '../core/Routing';\r\nimport Sys from '../core/Sys';\r\n\r\nexport interface Response\r\n{\r\n responseText: string;\r\n}\r\n\r\nexport default class BaseService\r\n{\r\n private static readonly errorMessageByStatus: { [status: number]: string } =\r\n {\r\n 408: 'Request Timeout',\r\n 413: 'Upload Limit Exceeded',\r\n };\r\n private static renderSignInAttempts: number = 0;\r\n\r\n // Dictionary of requests, keyed by id.\r\n public static requests: Map =\r\n new Map();\r\n public static requestTimeoutMilliseconds: number = 30000;\r\n\r\n private static abortRequest(args: object)\r\n {\r\n BaseService.requests.forEach((request) =>\r\n {\r\n if (request['config']['args'])\r\n {\r\n if (Sys.hasAll(request['config']['args'], args))\r\n {\r\n request.abort();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private static getRequestException(request: XMLHttpRequest): object | null\r\n {\r\n if (!request.responseText)\r\n {\r\n return null;\r\n }\r\n\r\n try\r\n {\r\n return JSON.parse(request.responseText);\r\n }\r\n catch\r\n {\r\n return null;\r\n }\r\n }\r\n\r\n private static handleRequestError(request: XMLHttpRequest)\r\n {\r\n Logging.log(`Request Error ${request['config']['url']}`\r\n + ` ${JSON.stringify(request['config']['args'])}`);\r\n\r\n Routing.goToErrorPage(\r\n request.status.toString(),\r\n `${request.status} Error`,\r\n request.status);\r\n }\r\n\r\n private static handleRequestException(request: XMLHttpRequest)\r\n {\r\n const response: object | null = BaseService.getRequestException(request);\r\n let handled = false;\r\n\r\n function handleMustangException()\r\n {\r\n if (!response)\r\n {\r\n return;\r\n }\r\n\r\n Logging.log(\r\n `${request.status} ${request['config']['url']} `\r\n + `${JSON.stringify(request['config']['args'])}`,\r\n `Request Exception ${response['errorMessage']}`);\r\n Logging.log(response['errorDetails'], 'Details');\r\n const status: string = request.status.toString();\r\n Routing.goToErrorPage(\r\n status,\r\n `${status} Error - ${response['errorMessage']}`,\r\n request.status);\r\n BaseService.renderSignInAttempts = 0;\r\n handled = true;\r\n }\r\n\r\n if (response)\r\n {\r\n switch (response['exceptionType'])\r\n {\r\n case 'AuthenticationRequiredException':\r\n Logging.log(\r\n `${request.status} ${request['config']['url']} `\r\n + `${JSON.stringify(request['config']['args'])}`,\r\n `Request Exception ${response['errorMessage']}`);\r\n Logging.log(response['errorDetails'], 'Details');\r\n Sys.currentCredentials.Message =\r\n response['errorMessage'];\r\n\r\n Routing.renderSignIn();\r\n handled = true;\r\n break;\r\n case 'SessionExpiredException':\r\n // Prevent infinite loops to sign-in if something\r\n // unexpected happens to sessions\r\n BaseService.renderSignInAttempts++;\r\n if (BaseService.renderSignInAttempts <= 3)\r\n {\r\n Sys.deleteCookie(Sys.guestSessionTokenCookie);\r\n Sys.deleteCookie(Sys.sessionTokenCookie);\r\n Sys.currentCredentials.Message = Sys.getTranslation(\r\n Routing.sessionExpiredErrorMessage);\r\n Routing.renderSignIn();\r\n }\r\n else\r\n {\r\n Logging.log(\r\n `${request.status} ${request['config']['url']} `\r\n + `${JSON.stringify(request['config']['args'])}`,\r\n `Request Exception ${response['errorMessage']}`);\r\n Logging.log('Expired Session Sign-In rendering stopped '\r\n + ' after 3 attempts - Try clearing cookies',\r\n 'Details');\r\n handleMustangException();\r\n }\r\n\r\n handled = true;\r\n break;\r\n case 'MustangException':\r\n handleMustangException();\r\n break;\r\n default:\r\n if ('errorMessage' in response)\r\n {\r\n handleMustangException();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n if (!handled)\r\n {\r\n Logging.log(`Request Exception ${request.status} `\r\n + `${request['config']['url']} `\r\n + `${JSON.stringify(request['config']['args'])}`);\r\n Logging.log(request.responseText, 'Details');\r\n\r\n let message: string | null = null;\r\n if (request.status in BaseService.errorMessageByStatus)\r\n {\r\n message = Sys.getTranslation(\r\n BaseService.errorMessageByStatus[request.status],\r\n 'Request Errors');\r\n }\r\n else if (request.statusText)\r\n {\r\n message = Sys.getTranslation(\r\n request.statusText,\r\n 'Request Errors');\r\n }\r\n\r\n Routing.goToErrorPage(\r\n request.status.toString(),\r\n `${request.status} Error${message ? ` - ${message}` : ''}`,\r\n request.status);\r\n }\r\n }\r\n\r\n private static handleRequestTimeout(request: XMLHttpRequest)\r\n {\r\n Logging.log(`Request Timeout 408 ${request['config']['url']} `\r\n + `${JSON.stringify(request['config']['args'])}`);\r\n Routing.goToErrorPage(\r\n '408',\r\n '408 Error - '\r\n + `${Sys.getTranslation(\r\n BaseService.errorMessageByStatus[408],\r\n 'Request Errors')}`,\r\n 408);\r\n }\r\n\r\n public static getRequestExceptionMessage(\r\n request: XMLHttpRequest\r\n ): string | null\r\n {\r\n if (!request)\r\n {\r\n return Sys.getTranslation(\r\n 'Unexpected error occurred', 'Request Errors');\r\n }\r\n\r\n if (request['config'] && request['config']['timeout'])\r\n {\r\n return Sys.getTranslation(\r\n BaseService.errorMessageByStatus[408],\r\n 'Request Errors');\r\n }\r\n\r\n const exception: object | null = BaseService.getRequestException(request);\r\n if (exception && exception['errorMessage'])\r\n {\r\n if (exception['errorDetails'])\r\n {\r\n Logging.log(`Request Exception ${exception['errorMessage']}`);\r\n Logging.log(exception['errorDetails'], 'Details');\r\n }\r\n\r\n return exception['errorMessage'];\r\n }\r\n\r\n if (request.status in BaseService.errorMessageByStatus)\r\n {\r\n return Sys.getTranslation(\r\n BaseService.errorMessageByStatus[request.status],\r\n 'Request Errors');\r\n }\r\n\r\n if (request.statusText)\r\n {\r\n return Sys.getTranslation(request.statusText, 'Request Errors');\r\n }\r\n\r\n return Sys.getTranslation('Unexpected error occurred', 'Request Errors');\r\n }\r\n\r\n public static request(\r\n url: string,\r\n args?: object,\r\n method: string = 'POST',\r\n redirect: boolean = true,\r\n request: XMLHttpRequest = new XMLHttpRequest()\r\n ): RequestPromise\r\n {\r\n return new RequestPromise(\r\n (resolve, reject) =>\r\n {\r\n let done: boolean = false;\r\n\r\n request.timeout = BaseService.requestTimeoutMilliseconds;\r\n\r\n request.onabort = () =>\r\n {\r\n BaseService.requests.delete(request['config']['id']);\r\n request['config']['duration'] =\r\n new Date().getTime() - request['config']['started'];\r\n request['config']['aborted'] = true;\r\n\r\n reject(request);\r\n };\r\n\r\n request.onerror = () =>\r\n {\r\n BaseService.requests.delete(request['config']['id']);\r\n request['config']['duration'] =\r\n new Date().getTime() - request['config']['started'];\r\n request['config']['error'] = true;\r\n\r\n if (redirect)\r\n {\r\n BaseService.handleRequestError(request);\r\n }\r\n reject(request);\r\n };\r\n\r\n request.ontimeout = () =>\r\n {\r\n BaseService.requests.delete(request['config']['id']);\r\n request['config']['duration'] =\r\n new Date().getTime() - request['config']['started'];\r\n request['config']['timeout'] = true;\r\n\r\n if (redirect)\r\n {\r\n BaseService.handleRequestTimeout(request);\r\n }\r\n reject(request);\r\n };\r\n\r\n request.onreadystatechange = (event: Event) =>\r\n {\r\n if (request.readyState === XMLHttpRequest.DONE)\r\n {\r\n BaseService.requests.delete(request['config']['id']);\r\n request['config']['duration'] =\r\n new Date().getTime() - request['config']['started'];\r\n request['config']['responseText'] = request.responseText;\r\n\r\n if (request.status === 200)\r\n {\r\n Sys.registerRequest(request);\r\n resolve(request);\r\n }\r\n else if (request.status > 0)\r\n {\r\n if (redirect)\r\n {\r\n BaseService.handleRequestException(request);\r\n }\r\n else\r\n {\r\n reject(request);\r\n }\r\n }\r\n }\r\n };\r\n\r\n request['config'] = Object.create(null);\r\n request['config']['started'] = new Date().getTime();\r\n request['config']['url'] = url;\r\n\r\n if (args)\r\n {\r\n request['config']['args'] = args;\r\n\r\n if (Sys.requestId && Sys.requestId in args)\r\n {\r\n request['config']['id'] = args[Sys.requestId];\r\n }\r\n else\r\n {\r\n request['config']['id'] = Sys.nextId;\r\n }\r\n }\r\n else\r\n {\r\n request['config']['id'] = Sys.nextId;\r\n }\r\n\r\n // If a pending request exists with the same id, abort it.\r\n if (BaseService.requests.has(request['config']['id'])\r\n && request['config']['args'])\r\n {\r\n BaseService.abortRequest(request['config']['args']);\r\n }\r\n\r\n if (args && args['cacheRequest'])\r\n {\r\n const requestCacheKey: string =\r\n Sys.getRequestCacheKey(request['config']);\r\n\r\n if (Sys.hasRequestCacheItem(requestCacheKey))\r\n {\r\n done = true;\r\n const response: Response = Object.create(null);\r\n\r\n response['config'] = request['config'];\r\n response['config']['duration'] =\r\n new Date().getTime() - request['config']['started'];\r\n response['config']['cached'] = true;\r\n response.responseText =\r\n Sys.getRequestCacheItem(requestCacheKey)!;\r\n request['config']['responseText'] = response.responseText;\r\n\r\n resolve(response);\r\n }\r\n }\r\n\r\n if (!done)\r\n {\r\n BaseService.requests.set(request['config']['id'], request);\r\n\r\n if (url && url.toLowerCase().startsWith('http'))\r\n {\r\n request.open(method, url, true);\r\n }\r\n else\r\n {\r\n request.open(method, `${Sys.baseUrl}${url}`, true);\r\n }\r\n\r\n if (args && (method === 'POST' || method === 'PUT'))\r\n {\r\n if ('jsonData' in args)\r\n {\r\n request.setRequestHeader(\r\n 'Content-type', 'application/json');\r\n request.send(args['jsonData']);\r\n }\r\n else if ('formData' in args)\r\n {\r\n // Content type must be set by send to get the boundary\r\n // value.\r\n request.send(args['formData']);\r\n }\r\n else\r\n {\r\n request.setRequestHeader(\r\n 'Content-type',\r\n 'application/x-www-form-urlencoded');\r\n request.send(Sys.objectToQueryString(args));\r\n }\r\n }\r\n else\r\n {\r\n request.send();\r\n }\r\n }\r\n\r\n if (Sys.monitor)\r\n {\r\n Sys.monitor.addRequest(request['config']);\r\n }\r\n },\r\n () =>\r\n {\r\n request.abort();\r\n });\r\n }\r\n\r\n public static requestObject(\r\n url: string,\r\n urlParams?: object | null,\r\n formData?: object | null,\r\n jsonData?: object | null,\r\n method: string = 'POST',\r\n redirect: boolean = true\r\n ): RequestPromise\r\n {\r\n let request: RequestPromise;\r\n\r\n const args = { ...formData };\r\n\r\n if (jsonData)\r\n {\r\n args['jsonData'] = JSON.stringify(jsonData);\r\n }\r\n\r\n return new RequestPromise(\r\n (resolve, reject) =>\r\n {\r\n request = BaseService.request(\r\n Sys.getUrl(url, urlParams), args, method, redirect\r\n );\r\n request.then((response) =>\r\n {\r\n resolve(JSON.parse(response.responseText));\r\n }\r\n ).catch(response => reject(response));\r\n },\r\n () =>\r\n {\r\n request.abort();\r\n });\r\n }\r\n}\r\n","import * as muiMenuItem from '@material-ui/core/MenuItem';\r\nimport { createStyles, Theme, WithStyles, withStyles, WithTheme, withTheme }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport WithForwardedRef, { WithForwardedRefProps }\r\n from '../core/WithForwardedRef';\r\nimport Typography from '../coreui/Typography';\r\nimport Icon from './Icon';\r\n\r\nexport interface MenuItemProps\r\n extends muiMenuItem.MenuItemProps, WithForwardedRefProps\r\n{\r\n button?: true;\r\n iconName?: string;\r\n indent?: number;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n disabled:\r\n {\r\n '& > p': { color: theme.palette.grey[300] },\r\n '& > span': { color: theme.palette.grey[300] },\r\n '&:hover': { backgroundColor: 'transparent' },\r\n cursor: 'default',\r\n },\r\n root:\r\n {\r\n '& > p': { color: theme.palette.grey[800] },\r\n color: theme.palette.grey[800],\r\n },\r\n });\r\n\r\nexport class MenuItem extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const { forwardedRef, ..._props } = this.props;\r\n\r\n if (!_props.className)\r\n {\r\n _props.className = `${_props.classes.root} `;\r\n }\r\n else\r\n {\r\n _props.className += ' ';\r\n }\r\n\r\n if (_props.disabled)\r\n {\r\n _props.className += `${_props.classes.disabled} `;\r\n }\r\n\r\n if (_props.indent)\r\n {\r\n _props.style = { marginLeft: _props.indent };\r\n }\r\n\r\n if (typeof _props.children === 'string')\r\n {\r\n _props.children =\r\n {_props.children};\r\n }\r\n\r\n if (_props.iconName)\r\n {\r\n _props.children =\r\n \r\n \r\n {_props.children}\r\n ;\r\n }\r\n\r\n delete _props.classes;\r\n delete _props.iconName;\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withTheme(WithForwardedRef(MenuItem)));\r\n","import Routing from '../core/Routing';\r\nimport Sys, { BusinessError, SessionMessage } from '../core/Sys';\r\nimport Credentials from '../models/Credentials';\r\nimport BaseService from './BaseService';\r\n\r\nexport interface AccountActivationResponse\r\n{\r\n succeeded: boolean;\r\n}\r\n\r\nexport interface CompleteAuthenticationResponse\r\n{\r\n businessErrors: BusinessError[];\r\n expirationSeconds?: number;\r\n sessionMessages?: SessionMessage[];\r\n userAccountObjectHandle?: string;\r\n}\r\n\r\nexport interface ExternalAuthenticator\r\n{\r\n description: string;\r\n iconName: string;\r\n providerName: string;\r\n url: string;\r\n}\r\n\r\nexport interface NewSessionResponse\r\n{\r\n expirationSeconds?: number;\r\n sessionMessages?: SessionMessage[];\r\n userAccountObjectHandle?: string;\r\n}\r\n\r\nexport interface PasswordResetResponse\r\n{\r\n succeeded: boolean;\r\n}\r\n\r\nexport interface UserInfoResponse\r\n{\r\n sessionMessages: SessionMessage[];\r\n userAccountObjectHandle: string;\r\n}\r\n\r\nexport default class UserService\r\n{\r\n public static accountObjectHandle: string;\r\n\r\n public static get isAuthenticated(): boolean\r\n {\r\n return !!Sys.getCookie(Sys.sessionTokenCookie);\r\n }\r\n\r\n public static get isGuest(): boolean\r\n {\r\n return !!Sys.getCookie(Sys.guestSessionTokenCookie);\r\n }\r\n\r\n public static async checkSession(): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n BaseService.requestObject(\r\n 'User/Session', null, null, null, 'GET'\r\n ).then((response) =>\r\n {\r\n if (response && response > 0)\r\n {\r\n resolve(response);\r\n }\r\n else\r\n {\r\n reject(null);\r\n }\r\n })\r\n .catch(() => reject(null));\r\n });\r\n }\r\n\r\n public static async completeAuthentication(\r\n parameters: string | null\r\n ): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n const providerName = Sys.getCookie('authenticatorProviderName');\r\n\r\n BaseService.requestObject(\r\n `User/CompleteAuthentication/${providerName}`,\r\n null,\r\n null,\r\n {\r\n parameters,\r\n },\r\n 'POST',\r\n true\r\n ).then((response: CompleteAuthenticationResponse) =>\r\n {\r\n if (response.businessErrors.length)\r\n {\r\n if (Sys.settings.useConfiguredAuthentication)\r\n {\r\n Routing.renderSignIn().then(() =>\r\n {\r\n Sys.deleteCookie('authenticatorProviderName');\r\n Sys.deleteCookie('authenticatorHref');\r\n setTimeout(\r\n () =>\r\n {\r\n Sys.setBusinessErrors(response.businessErrors);\r\n },\r\n 200);\r\n });\r\n }\r\n else\r\n {\r\n Sys.deleteCookie('authenticatorProviderName');\r\n Sys.deleteCookie('authenticatorHref');\r\n Routing.goToErrorPage(\r\n Sys.getTranslation('Error'),\r\n response.businessErrors[0].message);\r\n }\r\n }\r\n else\r\n {\r\n window.location.replace(\r\n Sys.getCookie('authenticatorHref')!);\r\n\r\n Sys.deleteCookie('authenticatorProviderName');\r\n Sys.deleteCookie('authenticatorHref');\r\n }\r\n\r\n if (response.userAccountObjectHandle)\r\n {\r\n UserService.accountObjectHandle =\r\n response.userAccountObjectHandle;\r\n Sys.sessionMessages = response.sessionMessages!;\r\n }\r\n\r\n resolve(response.expirationSeconds);\r\n }).catch((response) =>\r\n {\r\n Sys.deleteCookie('authenticatorProviderName');\r\n Sys.deleteCookie('authenticatorHref');\r\n\r\n reject(null);\r\n });\r\n });\r\n }\r\n\r\n public static async getExternalAuthenticators(\r\n ): Promise\r\n {\r\n return await BaseService.requestObject(\r\n 'User/GetExternalAuthenticators', null, null, null, 'GET');\r\n }\r\n\r\n public static async getUserInfo(): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n BaseService.requestObject(\r\n 'User/UserInfo', null, null, null, 'GET'\r\n ).then((response) =>\r\n {\r\n UserService.accountObjectHandle =\r\n response.userAccountObjectHandle;\r\n Sys.sessionMessages = response.sessionMessages;\r\n resolve();\r\n })\r\n .catch(() => reject());\r\n });\r\n }\r\n\r\n public static logonAsGuest(): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n BaseService.requestObject(\r\n 'User/GuestSession'\r\n ).then((response) =>\r\n {\r\n if (response.expirationSeconds\r\n && response.expirationSeconds > 0)\r\n {\r\n if (response.userAccountObjectHandle)\r\n {\r\n UserService.accountObjectHandle =\r\n response.userAccountObjectHandle;\r\n Sys.sessionMessages = response.sessionMessages!;\r\n }\r\n\r\n resolve(response.expirationSeconds);\r\n }\r\n else\r\n {\r\n reject(null);\r\n }\r\n })\r\n .catch(() =>\r\n {\r\n reject(null);\r\n });\r\n });\r\n }\r\n\r\n public static async logout(navigate: boolean = true): Promise\r\n {\r\n if (navigate)\r\n {\r\n Sys.setHash('', false, true);\r\n }\r\n\r\n await BaseService.request('User/Session', undefined, 'DELETE');\r\n\r\n Sys.clearRequestCache(navigate);\r\n }\r\n\r\n public static async validateCredentials(\r\n credentials: Credentials\r\n ): Promise\r\n {\r\n return new Promise((resolve, reject) =>\r\n {\r\n if (!(credentials.UserName && credentials.Password))\r\n {\r\n credentials.Message =\r\n Sys.getTranslation(\r\n 'Please provide an Email Address and Password');\r\n reject(false);\r\n }\r\n else\r\n {\r\n credentials.Message = null;\r\n\r\n BaseService.requestObject(\r\n 'User/Session',\r\n null,\r\n {\r\n password: credentials.Password,\r\n userName: credentials.UserName,\r\n },\r\n null,\r\n 'POST',\r\n false\r\n ).then((response: NewSessionResponse) =>\r\n {\r\n credentials.DisplayName = response['displayName'];\r\n\r\n if (response.userAccountObjectHandle)\r\n {\r\n UserService.accountObjectHandle =\r\n response.userAccountObjectHandle;\r\n Sys.sessionMessages = response.sessionMessages!;\r\n }\r\n\r\n resolve(true);\r\n })\r\n .catch((response) =>\r\n {\r\n credentials.Message =\r\n BaseService.getRequestExceptionMessage(response);\r\n\r\n reject(false);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n","import * as muiBadge from '@material-ui/core/Badge';\r\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as React from 'react';\r\nimport Api from '../mustangui/Api';\r\nimport Button from './Button';\r\nimport Tooltip from './Tooltip';\r\n\r\n// This props does not extend badge properties because badgeContent is\r\n// required and we don't want to have to pass a value for this type of badge.\r\ninterface Props\r\n{\r\n fullWidth?: boolean;\r\n message?: string;\r\n tabIndex?: number;\r\n}\r\n\r\ninterface State\r\n{\r\n open: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n badge:\r\n {\r\n },\r\n button:\r\n {\r\n '&:hover':\r\n {\r\n backgroundColor: darken(Api.getSystemColor('information'), 0.1),\r\n },\r\n backgroundColor: Api.getSystemColor('information'),\r\n color: theme.palette.getContrastText(\r\n Api.getSystemColor('information')),\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class InformationBadge extends\r\n React.PureComponent, State>\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private buttonRef: any;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { open: false };\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const message = _props.message;\r\n const children = _props.children;\r\n let width: string = '100%';\r\n\r\n delete _props.message;\r\n\r\n if ('fullWidth' in _props)\r\n {\r\n if (!_props.fullWidth)\r\n {\r\n width = 'auto';\r\n }\r\n\r\n delete _props.fullWidth;\r\n }\r\n\r\n delete _props.children;\r\n delete _props.classes;\r\n\r\n return (\r\n this.setState({ open: false })}\r\n >\r\n \r\n this.buttonRef = r}\r\n classes={{ root: this.props.classes.button }}\r\n component=\"div\"\r\n icon=\"fas fa-question\"\r\n onClick={() =>\r\n {\r\n // Fix for Safari not opening tooltip\r\n this.buttonRef.focus();\r\n this.setState({ open: true });\r\n }}\r\n tabIndex={_props.tabIndex}\r\n />\r\n \r\n }\r\n >\r\n {children}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(InformationBadge);\r\n","import AppServer from '../core/AppServer';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { AuthenticatedPage } from '../pages/AuthenticatedPage';\r\nimport { ErrorPage } from '../pages/ErrorPage';\r\nimport { GuestPage } from '../pages/GuestPage';\r\nimport { LandingPage } from '../pages/LandingPage';\r\nimport NewObjectService from '../services/NewObjectService';\r\nimport PresentationService from '../services/PresentationService';\r\nimport UserService from '../services/UserService';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport Logging from './Logging';\r\nimport Sys, { BusinessError } from './Sys';\r\n\r\nexport default class Routing\r\n{\r\n private static readonly nonConfiguredAuthSessionExpiredRoute: string =\r\n 'SessionExpired';\r\n public static readonly sessionExpiredErrorMessage: string =\r\n 'Your session has expired. Please sign in again.';\r\n\r\n private static extractHashParameters(hash: object): string | null\r\n {\r\n const parameters: string[] = [];\r\n\r\n for (const key in hash)\r\n {\r\n if (!hash.hasOwnProperty(key))\r\n {\r\n continue;\r\n }\r\n\r\n if (key === '0')\r\n {\r\n continue;\r\n }\r\n\r\n if (key.toLowerCase().includes('posse'))\r\n {\r\n continue;\r\n }\r\n\r\n parameters.push(`${key}=${hash[key]}`);\r\n }\r\n\r\n if (parameters.length === 0)\r\n {\r\n return null;\r\n }\r\n\r\n return parameters.join('&');\r\n }\r\n\r\n private static goToNewObjectErrorPage(\r\n validationErrors: string[],\r\n businessErrors: BusinessError[]\r\n ): void\r\n {\r\n let type = 'Validation';\r\n let errors = validationErrors;\r\n\r\n if (businessErrors?.length > 0)\r\n {\r\n errors = businessErrors.map(error => error.message);\r\n type = 'Business';\r\n }\r\n\r\n if (errors?.length > 0)\r\n {\r\n Logging.log(window.location.hash, 'Invalid New Object URL');\r\n Logging.log(errors.join('\\n'),\r\n `Invalid New Object ${type} Errors`);\r\n\r\n // Clear currentComponent so error page is rendered without\r\n // navigating so failed new object URL is not in back\r\n // history.\r\n Presentation.currentComponent = undefined;\r\n Routing.goToErrorPage('Error', 'Invalid New Object Configuration');\r\n }\r\n }\r\n\r\n private static goToNonConfiguredAuthenticationSessionExpiredRoute()\r\n {\r\n const hrefRoot = window.location.href.split('#')[0];\r\n let newHref =\r\n `${hrefRoot}${Routing.nonConfiguredAuthSessionExpiredRoute}`;\r\n\r\n // Set RedirectUrl query parameter to the hash portion so\r\n // non-configured authentication could redirect back to where user\r\n // requested.\r\n const hash = Sys.getHash(false);\r\n if (hash)\r\n {\r\n newHref = `${newHref}?RedirectUrl=${hash}`;\r\n }\r\n\r\n // Set new href without hash \"#\" so that request is sent to server/proxy\r\n // to capture and handle the non-configured authentication session\r\n // expired route\r\n window.location.href = newHref;\r\n }\r\n\r\n private static async goToRoute(\r\n hash: object,\r\n sessionValidated: boolean\r\n ): Promise\r\n {\r\n const routeRoot = Sys.getRouteRootToken(hash);\r\n\r\n if (routeRoot === 'error')\r\n {\r\n const infoToken = Sys.getRouteToken('error', 1, hash)!;\r\n const info = JSON.parse(atob(infoToken));\r\n const { title, status, message } = info;\r\n\r\n await ErrorPage.render(title, message, status);\r\n\r\n return true;\r\n }\r\n\r\n if (routeRoot === 'signin')\r\n {\r\n await Routing.renderSignIn();\r\n\r\n return true;\r\n }\r\n\r\n if (routeRoot === 'signout')\r\n {\r\n // Confirm continue has already been processed, ignore changes\r\n // on page reload\r\n Sys.ignoreChanges = true;\r\n\r\n await UserService.logout();\r\n\r\n return true;\r\n }\r\n\r\n if (routeRoot === 'completeauthentication')\r\n {\r\n const parameters = Routing.extractHashParameters(hash);\r\n await Routing.completeAuthentication(parameters);\r\n\r\n return true;\r\n }\r\n\r\n RequestsStore.instance.processingStarted();\r\n let routeIsValid: boolean = true;\r\n let sessionIsValid: boolean = true;\r\n\r\n if (!sessionValidated)\r\n {\r\n sessionIsValid = await Routing.validateUserSession();\r\n }\r\n\r\n if (sessionIsValid)\r\n {\r\n routeIsValid =\r\n await Routing.goToRoutesRequiringSession(hash, routeRoot);\r\n }\r\n\r\n RequestsStore.instance.processingStopped();\r\n\r\n // If no valid session return true since user will be routed to\r\n // login page.\r\n return routeIsValid;\r\n }\r\n\r\n private static async goToRoutesRequiringSession(\r\n hash: object,\r\n routeRoot: string | null\r\n ): Promise\r\n {\r\n if (!hash)\r\n {\r\n await Routing.renderHomePage();\r\n\r\n return true;\r\n }\r\n\r\n if (routeRoot === 'newobject')\r\n {\r\n const objectDefName = Sys.getRouteToken('newobject', 1, hash);\r\n\r\n if (objectDefName)\r\n {\r\n // The new object is specified using the query string API\r\n const presentationName = Sys.getRouteToken(\r\n 'newobject', 2, hash);\r\n\r\n if (!presentationName)\r\n {\r\n return false;\r\n }\r\n\r\n const parameters = Routing.extractHashParameters(hash);\r\n\r\n const fromObjectId = parseInt(hash['PosseFromObjectId'], 10);\r\n const jobId = parseInt(hash['PosseJobId'], 10);\r\n\r\n if (jobId)\r\n {\r\n // The new object is for a job process\r\n await Routing.renderNewObjectPresentationForJobProcessByName(\r\n objectDefName,\r\n presentationName,\r\n jobId,\r\n parameters);\r\n }\r\n else\r\n {\r\n await Routing.renderNewObjectPresentationForName(\r\n objectDefName,\r\n presentationName,\r\n isNaN(fromObjectId) ? null : fromObjectId,\r\n hash['PosseEndPoint'] || null,\r\n parameters);\r\n }\r\n }\r\n else if ('FromWidgetId' in hash)\r\n {\r\n // The new object is specified using a configured widget\r\n const fromPaneUseKey = hash['FromPaneUseKey'];\r\n const fromRowKey = hash['FromRowKey'];\r\n const fromWidgetId = parseInt(hash['FromWidgetId'], 10);\r\n const newObjectHandle = hash['NewObjectHandle'];\r\n const presentationId = parseInt(hash['PresentationId'], 10);\r\n\r\n if (!fromPaneUseKey\r\n || !fromRowKey\r\n || isNaN(fromWidgetId)\r\n || !newObjectHandle\r\n || isNaN(presentationId))\r\n {\r\n return false;\r\n }\r\n\r\n await Routing.renderNewObjectPresentationForIdInternal(\r\n presentationId,\r\n fromPaneUseKey,\r\n fromRowKey,\r\n fromWidgetId,\r\n newObjectHandle);\r\n }\r\n else\r\n {\r\n // A new object page from the query string API was refreshed\r\n const newObjectDefId = parseInt(hash['NewObjectDefId'], 10);\r\n const presentationId = parseInt(hash['PresentationId'], 10);\r\n\r\n if (isNaN(newObjectDefId) || isNaN(presentationId))\r\n {\r\n return false;\r\n }\r\n\r\n const endPointId = parseInt(hash['EndPointId'], 10);\r\n const fromObjectId = parseInt(hash['FromObjectId'], 10);\r\n\r\n if ('PosseJobId' in hash)\r\n {\r\n const jobId = parseInt(hash['PosseJobId'], 10);\r\n\r\n if (isNaN(jobId))\r\n {\r\n return false;\r\n }\r\n\r\n await Routing.renderNewObjectPresentationForJobProcessById(\r\n newObjectDefId,\r\n presentationId,\r\n jobId,\r\n hash['Parameters'] || null);\r\n }\r\n else\r\n {\r\n await Routing.renderNewObjectPresentationForIdExternal(\r\n newObjectDefId,\r\n presentationId,\r\n isNaN(fromObjectId) ? null : fromObjectId,\r\n isNaN(endPointId) ? null : endPointId,\r\n hash['Parameters'] || null);\r\n }\r\n }\r\n\r\n // Resetting application state to no changes to suppress the\r\n // Pending Changes warning if user tries to leave new object\r\n // presentation before interacting with the page\r\n const state = AppServer.getState();\r\n if (state)\r\n {\r\n state.hasDataChanges = false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (routeRoot === 'object')\r\n {\r\n const objectHandle = Sys.getRouteToken('object', 1, hash);\r\n const presentationNameOrId = Sys.getRouteToken('object', 2, hash);\r\n\r\n if (!objectHandle || !presentationNameOrId)\r\n {\r\n return false;\r\n }\r\n\r\n const parameters = Routing.extractHashParameters(hash);\r\n\r\n const presentationId = parseInt(presentationNameOrId, 10);\r\n if (isNaN(presentationId))\r\n {\r\n await Routing.renderPresentationForName(\r\n presentationNameOrId, objectHandle, parameters);\r\n }\r\n else\r\n {\r\n await Routing.renderPresentationForId(\r\n presentationId, objectHandle, parameters);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private static onHashChange()\r\n {\r\n Routing.processHash();\r\n }\r\n\r\n private static async renderHomePage(): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, false);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.renderHome();\r\n }\r\n else\r\n {\r\n await LandingPage.render();\r\n }\r\n\r\n Routing.setDocumentTitle();\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderNewObjectPresentationForIdExternal(\r\n newObjectDefId: number,\r\n presentationId: number,\r\n fromObjectId: number | null,\r\n endPointId: number | null,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, true);\r\n\r\n const response = await NewObjectService.forIdExternal(\r\n newObjectDefId,\r\n presentationId,\r\n fromObjectId,\r\n endPointId,\r\n parameters);\r\n\r\n if (response.validationErrors?.length > 0 ||\r\n response.businessErrors?.length > 0)\r\n {\r\n Routing.goToNewObjectErrorPage(\r\n response.validationErrors,\r\n response.businessErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderNewObjectPresentationForIdInternal(\r\n presentationId: number,\r\n fromPaneUseKey: string,\r\n fromRowKey: string,\r\n fromWidgetId: number,\r\n newObjectHandle: string\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, false);\r\n\r\n const response = await NewObjectService.forIdInternal(\r\n fromPaneUseKey,\r\n fromRowKey,\r\n fromWidgetId,\r\n newObjectHandle);\r\n\r\n if (response.validationErrors?.length > 0 ||\r\n response.businessErrors?.length > 0)\r\n {\r\n Routing.goToNewObjectErrorPage(\r\n response.validationErrors,\r\n response.businessErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderNewObjectPresentationForJobProcessById(\r\n processTypeId: number,\r\n presentationId: number,\r\n jobId: number,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, true);\r\n\r\n const response = await NewObjectService.forJobProcessById(\r\n processTypeId,\r\n presentationId,\r\n jobId,\r\n parameters);\r\n\r\n if (response.validationErrors?.length > 0 ||\r\n response.businessErrors?.length > 0)\r\n {\r\n Routing.goToNewObjectErrorPage(\r\n response.validationErrors,\r\n response.businessErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderNewObjectPresentationForJobProcessByName(\r\n processTypeName: string,\r\n presentationName: string,\r\n jobId: number,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, true);\r\n\r\n const response = await NewObjectService.forJobProcessByName(\r\n processTypeName,\r\n presentationName,\r\n jobId,\r\n parameters);\r\n\r\n if (response.validationErrors?.length > 0 ||\r\n response.businessErrors?.length > 0)\r\n {\r\n Routing.goToNewObjectErrorPage(\r\n response.validationErrors,\r\n response.businessErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n const urlParameters: string[] =\r\n [\r\n `PresentationId=${response.presentationId}`,\r\n `NewObjectDefId=${response.newObjectDefId}`,\r\n `PosseJobId=${jobId}`,\r\n ];\r\n\r\n if (parameters)\r\n {\r\n urlParameters.push(\r\n `Parameters=${encodeURIComponent(parameters)}`);\r\n }\r\n\r\n const url = `/newobject?${urlParameters.join('&')}`;\r\n Sys.setHash(url, false, true);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderNewObjectPresentationForName(\r\n objectDefName: string,\r\n presentationName: string,\r\n fromObjectId: number | null,\r\n endPointName: string | null,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, true);\r\n\r\n const response = await NewObjectService.forName(\r\n objectDefName,\r\n presentationName,\r\n fromObjectId,\r\n endPointName,\r\n parameters);\r\n\r\n if (response.validationErrors?.length > 0 ||\r\n response.businessErrors?.length > 0)\r\n {\r\n Routing.goToNewObjectErrorPage(\r\n response.validationErrors,\r\n response.businessErrors);\r\n\r\n return;\r\n }\r\n\r\n AppServer.setState(response.appServerState);\r\n\r\n const urlParameters: string[] =\r\n [\r\n `PresentationId=${response.presentationId}`,\r\n `NewObjectDefId=${response.newObjectDefId}`,\r\n ];\r\n\r\n if (fromObjectId)\r\n {\r\n urlParameters.push(`FromObjectId=${fromObjectId}`);\r\n }\r\n\r\n if (response.endPointId)\r\n {\r\n urlParameters.push(`EndPointId=${response.endPointId}`);\r\n }\r\n\r\n if (parameters)\r\n {\r\n urlParameters.push(\r\n `Parameters=${encodeURIComponent(parameters)}`);\r\n }\r\n\r\n const url = `/newobject?${urlParameters.join('&')}`;\r\n Sys.setHash(url, false, true);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n response.presentationId,\r\n response.newObjectHandle,\r\n null,\r\n AppServer.getState());\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderPresentationForId(\r\n presentationId: number,\r\n objectHandle: string,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, false);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n presentationId, objectHandle, parameters);\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n presentationId, objectHandle, parameters);\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static async renderPresentationForName(\r\n presentationName: string,\r\n objectHandle: string,\r\n parameters: string | null\r\n ): Promise\r\n {\r\n RequestsStore.instance.processingStarted(null, false);\r\n\r\n const presentationId =\r\n await PresentationService.getPresentationIdForName(\r\n presentationName,\r\n objectHandle);\r\n\r\n if (UserService.isAuthenticated)\r\n {\r\n await AuthenticatedPage.render(\r\n presentationId, objectHandle, parameters);\r\n }\r\n else\r\n {\r\n await GuestPage.render(\r\n presentationId, objectHandle, parameters);\r\n }\r\n RequestsStore.instance.processingStopped();\r\n }\r\n\r\n private static setSessionTimeoutWarning(expirationSeconds: number): void\r\n {\r\n clearTimeout(Sys.sessionExpirationTimeout);\r\n\r\n if (expirationSeconds <= 0)\r\n {\r\n const message: string =\r\n 'Expiration seconds must be greater than zero';\r\n Logging.warn(message);\r\n throw new Error(message);\r\n }\r\n\r\n const maxMilliseconds: number = Math.pow(2, 31);\r\n const expirationMilliseconds: number = expirationSeconds * 1000;\r\n if (expirationMilliseconds > maxMilliseconds)\r\n {\r\n const message: string = 'Expiration seconds must be less than '\r\n + `${Math.floor(maxMilliseconds / 1000).toFixed(0)}`;\r\n Logging.warn(message);\r\n throw new Error(message);\r\n }\r\n\r\n Sys.sessionExpirationTimeout = setTimeout(\r\n () =>\r\n {\r\n if (Sys.settings.useConfiguredAuthentication)\r\n {\r\n if (UserService.isAuthenticated)\r\n {\r\n Sys.currentCredentials.Message = Sys.getTranslation(\r\n Routing.sessionExpiredErrorMessage);\r\n Routing.renderSignIn();\r\n }\r\n else\r\n {\r\n UserService.logonAsGuest().then((result) =>\r\n {\r\n Routing.setSessionTimeoutWarning(result);\r\n });\r\n }\r\n }\r\n else\r\n {\r\n // Authentication is not handled by POSSE\r\n Routing.goToNonConfiguredAuthenticationSessionExpiredRoute();\r\n }\r\n },\r\n expirationMilliseconds);\r\n }\r\n\r\n private static async validateUserSession(): Promise\r\n {\r\n if (Sys.settings.useConfiguredAuthentication)\r\n {\r\n if (UserService.isAuthenticated)\r\n {\r\n try\r\n {\r\n const expirationSeconds = await UserService.checkSession();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n catch\r\n {\r\n // Session expired\r\n const expirationSeconds = await UserService.logonAsGuest();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n\r\n if (Sys.getHash())\r\n {\r\n Sys.currentCredentials.Message = Sys.getTranslation(\r\n Routing.sessionExpiredErrorMessage);\r\n await Routing.renderSignIn();\r\n }\r\n else\r\n {\r\n await LandingPage.render();\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n else if (UserService.isGuest)\r\n {\r\n try\r\n {\r\n const expirationSeconds = await UserService.checkSession();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n catch\r\n {\r\n const expirationSeconds = await UserService.logonAsGuest();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n }\r\n else\r\n {\r\n const expirationSeconds = await UserService.logonAsGuest();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n }\r\n else\r\n {\r\n try\r\n {\r\n const expirationSeconds = await UserService.checkSession();\r\n\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n catch\r\n {\r\n // Authentication is not handled by POSSE\r\n Routing.goToNonConfiguredAuthenticationSessionExpiredRoute();\r\n\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public static async completeAuthentication(\r\n parameters: string | null\r\n ): Promise\r\n {\r\n const expirationSeconds =\r\n await UserService.completeAuthentication(parameters);\r\n\r\n if (expirationSeconds)\r\n {\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n }\r\n\r\n public static goToErrorPage(\r\n title: string,\r\n message: string | null,\r\n status: number | null = null): void\r\n {\r\n const errorInfo = btoa(JSON.stringify({ message, status, title }));\r\n const errorHash = `/error/${encodeURIComponent(errorInfo)}`;\r\n\r\n if (Presentation.currentComponent)\r\n {\r\n // Navigate to the error page if a presentation is already loaded,\r\n // that way clicking the back button on the error page will go back\r\n // to the presentation that was loaded before the error occured.\r\n Sys.ignoreChanges = true;\r\n Sys.setHash(errorHash, false, false);\r\n }\r\n else\r\n {\r\n // Update the hash but go to the error page without a navigate if\r\n // a presentation is currently loading. That way clicking the back\r\n // button on the error page will go back to the presentation which\r\n // the user was navigating from, rather than the presentation that\r\n // caused the error on load.\r\n Sys.setHash(errorHash, false, true);\r\n ErrorPage.render(title, message, status);\r\n }\r\n }\r\n\r\n public static async initialize(): Promise\r\n {\r\n window.onhashchange = Routing.onHashChange;\r\n\r\n const sessionIsValid: boolean = await Routing.validateUserSession();\r\n\r\n if (!sessionIsValid)\r\n {\r\n return;\r\n }\r\n\r\n // Get user info if not already set. This is already set during login\r\n // or Guest Session creation.\r\n if (!UserService.accountObjectHandle)\r\n {\r\n await UserService.getUserInfo();\r\n }\r\n\r\n Routing.processHash(true);\r\n }\r\n\r\n public static async isNonConfiguredAuthenticationSessionExpiredRoute(\r\n ): Promise\r\n {\r\n // If route is non-configured authentication route then navigate to error\r\n // page since this route should not get back to WebUI. It is suppose\r\n // to be captured and redirected to the external non-configured\r\n // authentication mechanism where a valid Posse Session is to be created\r\n // and returned to WebUI using the RedirectUrl parameter or WebUI root.\r\n if (Sys.getRouteRootToken() ===\r\n Routing.nonConfiguredAuthSessionExpiredRoute.toLowerCase())\r\n {\r\n ErrorPage.render(\r\n Sys.getTranslation('Error'),\r\n Sys.getTranslation(\r\n 'No Non-Configured Authentication Session Handler'),\r\n 404);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static async processHash(\r\n sessionValidated: boolean = false\r\n ): Promise\r\n {\r\n if (Sys.ignoreHashChanges)\r\n {\r\n Sys.ignoreHashChanges = false;\r\n\r\n return;\r\n }\r\n\r\n try\r\n {\r\n await Sys.confirmContinue();\r\n }\r\n catch\r\n {\r\n Sys.ignoreChanges = false;\r\n Sys.setHash(\r\n Sys.lastHash || Object.create(null),\r\n false,\r\n false,\r\n true);\r\n\r\n return;\r\n }\r\n\r\n const hash: object | null = Sys.getHash() as object;\r\n Sys.lastHash = hash;\r\n Sys.ignoreChanges = false;\r\n Sys.clearBusinessErrors();\r\n\r\n const routeIsValid = await Routing.goToRoute(hash, sessionValidated);\r\n\r\n if (!routeIsValid)\r\n {\r\n ErrorPage.render(\r\n '404',\r\n `404 Error - ${Sys.getTranslation('Not Found')}`,\r\n 404);\r\n }\r\n }\r\n\r\n public static async renderSignIn(): Promise\r\n {\r\n if (Sys.settings.useConfiguredAuthentication)\r\n {\r\n if (UserService.isAuthenticated)\r\n {\r\n await UserService.logout(false);\r\n }\r\n\r\n // Ensure there is a Guest session\r\n if (!UserService.isGuest)\r\n {\r\n const expirationSeconds = await UserService.logonAsGuest();\r\n Routing.setSessionTimeoutWarning(expirationSeconds);\r\n }\r\n\r\n await GuestPage.renderSignIn();\r\n\r\n Routing.setDocumentTitle(Sys.getTranslation('Sign-in'));\r\n }\r\n else\r\n {\r\n // Authentication is not handled by POSSE\r\n Routing.goToNonConfiguredAuthenticationSessionExpiredRoute();\r\n }\r\n\r\n RequestsStore.instance.clearAllProcessing();\r\n }\r\n\r\n public static setDocumentTitle(\r\n objectTitle: string | null = null,\r\n objectDefDescription: string | null = null)\r\n {\r\n const components: string[] = [];\r\n\r\n if (Sys.settings.nonProdEnvironment)\r\n {\r\n components.push(Sys.settings.nonProdEnvironment);\r\n }\r\n\r\n const objectComponents: string[] = [];\r\n if (objectTitle)\r\n {\r\n objectComponents.push(objectTitle);\r\n }\r\n\r\n if (objectDefDescription)\r\n {\r\n objectComponents.push(`(${objectDefDescription})`);\r\n }\r\n\r\n if (objectComponents.length !== 0)\r\n {\r\n components.push(objectComponents.join(' '));\r\n }\r\n\r\n components.push(Sys.settings.siteName);\r\n\r\n document.title = components.join(' - ');\r\n\r\n setTimeout(() =>\r\n {\r\n Sys.announce(document.title);\r\n }, 3000);\r\n }\r\n}\r\n","import { action, observable } from 'mobx';\r\nimport TrackableModel, { ITrackable } from './TrackableModel';\r\n\r\nexport default class TrackableCollection extends Array\r\n implements ITrackable\r\n{\r\n // Id for the data.\r\n readonly dataId: string | null = null;\r\n // Indicates if pending changes should be ignored.\r\n public ignoreChanges: boolean = false;\r\n // Indicates if the model has been loaded.\r\n public isLoaded: boolean = false;\r\n // Indicates if only the first load request should be processed.\r\n public loadOnce: boolean = false;\r\n // Name of the models in the collection.\r\n readonly modelName: string | null = null;\r\n // Reference to the observableCollection wrapper.\r\n public observableCollection: TrackableModel[] | null = null;\r\n\r\n public static deleteRow(dataId: string, rowKey: string)\r\n {\r\n const collection = TrackableModel.models.get(dataId) as\r\n TrackableCollection;\r\n\r\n const model: TrackableModel = collection.find(\r\n m => m.getPrimaryKey() === rowKey)!;\r\n\r\n collection.delete(model);\r\n }\r\n\r\n constructor(modelName: string | null, dataId?: string | null)\r\n {\r\n super();\r\n\r\n // Only process if a model name is passed to the constructor.\r\n // Manipulating the collection creates a new instance.\r\n if (typeof modelName === 'string')\r\n {\r\n this.modelName = modelName;\r\n this.dataId = dataId || `${this.modelName}List`;\r\n this.observableCollection = observable.array(this);\r\n\r\n TrackableModel.register(this);\r\n }\r\n }\r\n\r\n // Reset all state flags, discard deleted models and set initial values to the\r\n // current value of each trackable property.\r\n public acceptChanges(): void\r\n {\r\n return TrackableModel.acceptChanges(this);\r\n }\r\n\r\n // Creates a model with the specified data and adds it to the collection.\r\n public add(data: object, isNew: boolean = true): void\r\n {\r\n const trackable = TrackableModel.create(\r\n this.modelName, this.dataId, data) as TrackableModel;\r\n\r\n trackable.isTrackableNew = isNew;\r\n\r\n // Add the model to the collection.\r\n this.push(trackable);\r\n\r\n if (this.observableCollection)\r\n {\r\n this.observableCollection.push(trackable);\r\n }\r\n }\r\n\r\n // Clear the contents of this collection.\r\n public clear(): void\r\n {\r\n if (!this.loadOnce)\r\n {\r\n this.clearDeleted();\r\n this.length = 0;\r\n\r\n // Clear the contents of the observable collection.\r\n if (this.observableCollection)\r\n {\r\n this.observableCollection.length = 0;\r\n }\r\n }\r\n }\r\n\r\n // Discard any deleted models of the type stored in this collection.\r\n public clearDeleted(): void\r\n {\r\n TrackableModel.clearDeleted(this.dataId);\r\n }\r\n\r\n // Track the specified model in the deleted collection for the model's type.\r\n // and remove it from this list.\r\n public delete(models: TrackableModel | TrackableModel[]): void\r\n {\r\n if (models instanceof TrackableModel)\r\n {\r\n models.delete(this);\r\n }\r\n else\r\n {\r\n models.forEach((model) =>\r\n {\r\n model.delete();\r\n\r\n // Remove the model from the specified collection.\r\n if (this.indexOf(model) > -1)\r\n {\r\n this.splice(this.indexOf(model), 1);\r\n }\r\n });\r\n\r\n // Remove the models from the observable collection.\r\n if (this.observableCollection)\r\n {\r\n this.observableCollection.length = 0;\r\n\r\n if (this.length > 0)\r\n {\r\n this.observableCollection.push(...this);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Returns a list of deleted models of the type stored in this collection.\r\n public getDeleted(): Set\r\n {\r\n return TrackableModel.getDeleted(this.dataId);\r\n }\r\n\r\n // Indicates if this model/collection has pending changes.\r\n public hasChanges(): boolean\r\n {\r\n return TrackableModel.hasChanges(this);\r\n }\r\n\r\n // Creates a model with the specified data and inserts it\r\n // at the start of the collection.\r\n public insert(data: object, isNew: boolean = true): void\r\n {\r\n const trackable = TrackableModel.create(\r\n this.modelName, this.dataId, data) as TrackableModel;\r\n\r\n trackable.isTrackableNew = isNew;\r\n\r\n // Insert the model at the start of the collection.\r\n this.unshift(trackable);\r\n\r\n if (this.observableCollection)\r\n {\r\n this.observableCollection.unshift(trackable);\r\n }\r\n }\r\n\r\n // Populates the model array with the specified data.\r\n @action\r\n public load(\r\n items?: object,\r\n clear: boolean = true\r\n ): TrackableCollection\r\n {\r\n if (!this.loadOnce || !this.isLoaded)\r\n {\r\n if (items)\r\n {\r\n if (clear)\r\n {\r\n this.clearDeleted();\r\n }\r\n\r\n this.isLoaded = true;\r\n\r\n const itemList = items as object[];\r\n\r\n if (this.observableCollection)\r\n {\r\n const primaryKeyName =\r\n TrackableModel.getPrimaryKeyName(this.modelName!);\r\n\r\n // If the same item exists at the same index, load the data\r\n // in place. Otherwise replace / add the item.\r\n // We are not attempting to find each item by key regardless\r\n // of position. We are only interested in the scenario where\r\n // the same rows are in the same position. This avoids\r\n // unnecessary renders when the sorted array items have\r\n // not changed.\r\n itemList.forEach((item, i) =>\r\n {\r\n if (this.observableCollection!.length > i &&\r\n this.observableCollection![i].getPrimaryKey() ===\r\n item[primaryKeyName])\r\n {\r\n this.observableCollection![i].load(item);\r\n }\r\n else\r\n {\r\n const trackable = TrackableModel.create(\r\n this.modelName, this.dataId, item) as\r\n TrackableModel;\r\n if (this.observableCollection!.length > i)\r\n {\r\n this[i] = trackable;\r\n this.observableCollection![i] = trackable;\r\n }\r\n else\r\n {\r\n this.push(trackable);\r\n this.observableCollection!.push(trackable);\r\n }\r\n }\r\n });\r\n\r\n // Remove any extra items from the collection\r\n this.observableCollection.length = itemList.length;\r\n }\r\n }\r\n else if (clear)\r\n {\r\n this.clear();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Reset IsModified, and set the value of each trackable property to\r\n // it's initial value.\r\n public revertValues(): void\r\n {\r\n return TrackableModel.revertValues(this);\r\n }\r\n}\r\n","import { PresentationConfig } from '../config/Presentation';\r\nimport AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys, { SessionMessage } from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport { BreakPointColumn } from '../coreui/Dialog';\r\nimport { PaneDataByDataId } from '../stores/PaneDataStore';\r\nimport BaseService from './BaseService';\r\n\r\nexport interface PresentationConfigResponse\r\n{\r\n objectDefDescription: string;\r\n presentationConfig: object;\r\n scriptsByDataId: object;\r\n}\r\n\r\nexport interface ConfigForDialogResponse\r\n{\r\n breakPoints: BreakPointColumn[];\r\n presentationConfig: object;\r\n scriptsByDataId: object;\r\n}\r\n\r\nexport interface PageDataResponse\r\n{\r\n appServerState: AppServerState;\r\n paneDataByDataId: PaneDataByDataId;\r\n}\r\n\r\nexport interface PresentationDataResponse\r\n{\r\n appServerState: AppServerState;\r\n layoutId: number | null;\r\n newSessionMessages: SessionMessage[];\r\n objectTitle: string | null;\r\n paneDataByDataId: PaneDataByDataId | null;\r\n shouldRedirectHome: boolean;\r\n validationErrors?: string[];\r\n}\r\n\r\nexport default class PresentationService\r\n{\r\n public static getAuthenticatedPageData(\r\n appServerState: AppServerState | null\r\n ): RequestPromise\r\n {\r\n\r\n return BaseService.requestObject(\r\n 'Presentation/AuthenticatedPageData',\r\n null,\r\n null,\r\n { appServerState },\r\n 'POST');\r\n }\r\n\r\n // FUTURE 7.4.1\r\n // Rename this method to \"getEditDialogConfig\"\r\n // Make corresponding changes through the stack\r\n public static getConfigForDialog(\r\n layoutId: string\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `Presentation/ConfigForDialog/${layoutId}`,\r\n null,\r\n null,\r\n null,\r\n 'GET');\r\n }\r\n\r\n // FUTURE 7.4.1\r\n // Rename this method to \"getSelectDialogConfig\"\r\n // Make corresponding changes through the stack\r\n public static getConfigForSelectDialog(\r\n layoutId: string\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `Presentation/ConfigForSelectDialog/${layoutId}`,\r\n null,\r\n null,\r\n null,\r\n 'GET');\r\n }\r\n\r\n public static getGuestPageData(\r\n appServerState: AppServerState | null\r\n ): RequestPromise\r\n {\r\n\r\n return BaseService.requestObject(\r\n 'Presentation/GuestPageData',\r\n null,\r\n null,\r\n { appServerState },\r\n 'POST');\r\n }\r\n\r\n public static getLandingPageData(): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n 'Presentation/LandingPageData',\r\n null,\r\n null,\r\n null,\r\n 'GET');\r\n }\r\n\r\n public static getPresentationConfig(\r\n layoutId: number\r\n ): RequestPromise\r\n {\r\n const request = BaseService.requestObject(\r\n `Presentation/PresentationConfig/${layoutId}`,\r\n null,\r\n null,\r\n null,\r\n 'GET');\r\n\r\n return request.then((config: PresentationConfig) =>\r\n {\r\n for (const dataId of config.dataIds)\r\n {\r\n if (!TrackableModel.models.has(dataId))\r\n {\r\n new TrackableCollection('PaneRow', dataId);\r\n }\r\n }\r\n\r\n return config;\r\n });\r\n }\r\n\r\n public static getPresentationData(\r\n layoutId: number,\r\n objectHandle: string,\r\n parameters: string | null = null\r\n ): RequestPromise\r\n {\r\n const result = BaseService.requestObject(\r\n `Presentation/PresentationData/${layoutId}/${objectHandle}`,\r\n null,\r\n null,\r\n {\r\n appServerState: AppServer.getState(),\r\n arguments: parameters,\r\n },\r\n 'POST');\r\n\r\n result.then((response: PresentationDataResponse) =>\r\n {\r\n if (response.newSessionMessages.length)\r\n {\r\n Sys.sessionMessages.push(...response.newSessionMessages);\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public static getPresentationIdForName(\r\n presentationName: string,\r\n objectHandle: string\r\n ): RequestPromise\r\n {\r\n const url = 'Presentation/GetPresentationIdForName'\r\n + `/${presentationName}`\r\n + `/${objectHandle}`;\r\n\r\n return BaseService.requestObject(\r\n url,\r\n null,\r\n null,\r\n null,\r\n 'GET');\r\n }\r\n}\r\n","import * as muiHidden from '@material-ui/core/Hidden';\r\nimport * as React from 'react';\r\n\r\nexport enum BreakpointRanges\r\n{\r\n smUp,\r\n xsDown,\r\n}\r\n\r\ninterface Props extends muiHidden.HiddenProps\r\n{\r\n nestedIn?: BreakpointRanges;\r\n}\r\n\r\nexport interface NestedInChild\r\n{\r\n nestedIn?: BreakpointRanges;\r\n}\r\n\r\nexport class Hidden extends\r\n React.PureComponent\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const { nestedIn, ...hiddenProps } = this.props;\r\n\r\n // When nesting Hidden components sometimes the children will trigger\r\n // before the parent, which can make the children mount, unmount\r\n // and then re-mount. This reduces performace and can cause events\r\n // to fire for components which are no longer mounted\r\n if (nestedIn !== undefined)\r\n {\r\n switch (nestedIn)\r\n {\r\n case BreakpointRanges.smUp:\r\n return this.props.smUp ? this.props.children : null;\r\n\r\n case BreakpointRanges.xsDown:\r\n return this.props.xsDown ? this.props.children : null;\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default Hidden;\r\n","import { createStyles, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport { CustomTheme } from '../muiTheme';\r\n\r\ninterface Props\r\n{\r\n children: React.ReactNode;\r\n lg: number;\r\n md: number;\r\n sm: number;\r\n style?: React.CSSProperties | null;\r\n xl: number;\r\n xs: number;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n for (let size = 1; size <= 12; size++)\r\n {\r\n visibilityStyles[`griditem-${breakPoint}-${size}`] =\r\n {\r\n [theme.breakpoints.up(breakPoint)]:\r\n {\r\n gridColumnEnd: `span ${size}`,\r\n },\r\n };\r\n }\r\n\r\n // Allow 0 to indicate hidden.\r\n visibilityStyles[`griditem-${breakPoint}-0`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n display: 'none !important',\r\n },\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n container:\r\n {\r\n minWidth: 0,\r\n },\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\nexport class GridItem extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const classes: string[] = [this.props.classes.container];\r\n\r\n classes.push(this.props.classes[`griditem-xs-${this.props.xs}`]);\r\n classes.push(this.props.classes[`griditem-sm-${this.props.sm}`]);\r\n classes.push(this.props.classes[`griditem-md-${this.props.md}`]);\r\n classes.push(this.props.classes[`griditem-lg-${this.props.lg}`]);\r\n classes.push(this.props.classes[`griditem-xl-${this.props.xl}`]);\r\n\r\n return (\r\n \r\n {this.props.children}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridItem);\r\n","import * as muiDialog from '@material-ui/core/Dialog';\r\nimport { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport withMobileDialog from '@material-ui/core/withMobileDialog';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport { CustomTheme, getPanelMeasurements, PanelMeasurements }\r\n from '../muiTheme';\r\nimport MaskingStore from '../stores/MaskingStore';\r\n\r\nexport interface BreakPointColumn\r\n{\r\n columns: number;\r\n size: 'lg' | 'md' | 'sm' | 'xs';\r\n}\r\n\r\ninterface Props extends muiDialog.DialogProps\r\n{\r\n breakPointColumns?: BreakPointColumn[];\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const minWidth = 345;\r\n const paperWidths = {};\r\n for (const breakPoint of theme.spacingBreakPoints.filter(b => b !== 'xs'))\r\n {\r\n const measurements: PanelMeasurements =\r\n getPanelMeasurements(theme, breakPoint);\r\n const maxColumns: number = theme.dialog.maxColumns[breakPoint];\r\n\r\n for (let size = 1; size <= maxColumns; size++)\r\n {\r\n const width: number = (size + 1) * measurements.gutterWidth\r\n + size * measurements.columnWidth;\r\n\r\n paperWidths[`dialogPaper-${breakPoint}-${size}`] =\r\n {\r\n [theme.breakpoints.up(breakPoint)]:\r\n {\r\n width: width < minWidth ? minWidth : width,\r\n },\r\n };\r\n }\r\n }\r\n\r\n return createStyles(\r\n {\r\n paper:\r\n {\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n maxWidth: theme.dialog.maxWidths.sm,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n maxWidth: theme.dialog.maxWidths.md,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n maxWidth: theme.dialog.maxWidths.lg,\r\n },\r\n },\r\n ...paperWidths,\r\n });\r\n};\r\n\r\nexport class Dialog extends\r\n React.PureComponent>\r\n{\r\n public static currentOpenInstance: Dialog | null;\r\n\r\n private rootRef: HTMLElement | null = null;\r\n\r\n private onEntering = (node: HTMLElement, isAppearing: boolean) =>\r\n {\r\n Dialog.currentOpenInstance = this;\r\n MaskingStore.maskOpened();\r\n if (this.props.onEntering)\r\n {\r\n this.props.onEntering(node, isAppearing);\r\n }\r\n };\r\n\r\n private onExited(node: HTMLElement, forced: boolean)\r\n {\r\n Dialog.currentOpenInstance = null;\r\n MaskingStore.maskClosed();\r\n if (this.props.onExited && !forced)\r\n {\r\n this.props.onExited(node);\r\n }\r\n };\r\n\r\n public componentWillUnmount()\r\n {\r\n this.forceClose();\r\n }\r\n\r\n public forceClose = () =>\r\n {\r\n if (!this.props.open)\r\n {\r\n return;\r\n }\r\n\r\n if (this.props.onClose)\r\n {\r\n this.props.onClose({}, 'escapeKeyDown');\r\n }\r\n this.onExited(this.rootRef!, true);\r\n };\r\n\r\n public render()\r\n {\r\n const {\r\n classes,\r\n breakPointColumns,\r\n onEntering,\r\n onExited,\r\n ...dialogProps\r\n } = this.props;\r\n\r\n const paperClasses = [classes.paper];\r\n if (breakPointColumns)\r\n {\r\n dialogProps.fullWidth = true;\r\n for (const breakPoint of breakPointColumns)\r\n {\r\n const className = this.props.classes[\r\n `dialogPaper-${breakPoint.size}-${breakPoint.columns}`];\r\n paperClasses.push(className);\r\n }\r\n }\r\n\r\n const paperMargin: number = !dialogProps.fullScreen\r\n ? Sys.settings.baselineGridSize * 4 : 0;\r\n\r\n return (\r\n this.rootRef = r}\r\n maxWidth={false}\r\n onEntering={this.onEntering}\r\n onExited={n => this.onExited(n, false)}\r\n PaperProps={{ style: { margin: paperMargin } }}\r\n {...dialogProps}\r\n />\r\n );\r\n }\r\n}\r\n\r\nexport default withMobileDialog({ breakpoint: 'xs' })(\r\n withStyles(styles)(Dialog));\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Typography from '../coreui/Typography';\r\nimport Api from './Api';\r\n\r\ninterface Props\r\n{\r\n title?: string;\r\n}\r\n\r\ninterface State\r\n{\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n error: any;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n borderColor: theme.palette.error.main,\r\n borderStyle: 'solid',\r\n borderWidth: 1,\r\n padding: 8,\r\n },\r\n });\r\n\r\nexport class ErrorBoundary extends\r\n React.PureComponent, State>\r\n{\r\n private childrenWithError: React.ReactNode;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static getDerivedStateFromError(error: any)\r\n {\r\n // Update state so the next render will show the fallback UI.\r\n return { error };\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { error: null };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public componentDidCatch(error: any, errorInfo: any)\r\n {\r\n this.childrenWithError = this.props.children;\r\n }\r\n\r\n public componentDidUpdate()\r\n {\r\n if (this.props.children !== this.childrenWithError)\r\n {\r\n this.childrenWithError = null;\r\n this.setState({ error: null });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n let result: React.ReactNode = _props.children;\r\n let title: React.ReactNode = null;\r\n\r\n if (!!this.state.error)\r\n {\r\n let message: string =\r\n Sys.getTranslation('An error has occurred', 'ErrorBoundary');\r\n\r\n if (process.env.NODE_ENV !== 'production')\r\n {\r\n if (_props.title)\r\n {\r\n title =\r\n \r\n {_props.title}\r\n ;\r\n }\r\n\r\n message = this.state.error instanceof Error\r\n ? this.state.error.message : this.state.error.toString();\r\n }\r\n\r\n result =\r\n
\r\n {title}\r\n \r\n {Api.getErrorMessage(message)}\r\n \r\n
;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ErrorBoundary);\r\n","import * as muiButton from '@material-ui/core/Button';\r\nimport { createStyles, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport * as React from 'react';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport Api from '../mustangui/Api';\r\nimport Icon from './Icon';\r\n\r\nexport interface LinkProps extends muiButton.ButtonProps\r\n{\r\n component?: string;\r\n iconName?: string;\r\n target?: string;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n label:\r\n {\r\n },\r\n ripple:\r\n {\r\n '& > span > span':\r\n {\r\n backgroundColor: theme.links.rippleColor,\r\n },\r\n height: 'calc(100% + 10px)',\r\n margin: '-5px -20px',\r\n width: 'calc(100% + 40px)',\r\n },\r\n root:\r\n {\r\n '& span':\r\n {\r\n overflow: 'hidden',\r\n textDecoration: theme.links.textDecoration,\r\n textOverflow: 'ellipsis',\r\n },\r\n '&:disabled':\r\n {\r\n color: theme.links.disabledColor,\r\n },\r\n '&:hover':\r\n {\r\n '& > span':\r\n {\r\n textDecoration: theme.links.hoverTextDecoration,\r\n },\r\n backgroundColor: 'transparent',\r\n color: theme.links.hoverColor ? theme.links.hoverColor :\r\n darken(Api.getSystemColor('information'), 0.1),\r\n },\r\n\r\n color: theme.links.color ?\r\n theme.links.color : Api.getSystemColor('information'),\r\n fontSize: 16,\r\n fontWeight: theme.links.fontWeight,\r\n justifyContent: 'left',\r\n letterSpacing: 'normal',\r\n lineHeight: '20px',\r\n minHeight: 0,\r\n minWidth: 0,\r\n padding: 0,\r\n textTransform: 'none',\r\n },\r\n });\r\n\r\nexport class Link extends\r\n React.PureComponent>\r\n{\r\n protected muiProps: muiButton.ButtonProps;\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n if (!_props.className)\r\n {\r\n _props.className = `${_props.classes.root} `;\r\n }\r\n _props.TouchRippleProps = { className: _props.classes.ripple };\r\n delete _props.classes;\r\n\r\n if (typeof _props.children === 'string')\r\n {\r\n _props.children = {_props.children};\r\n }\r\n\r\n if (_props.iconName)\r\n {\r\n _props.children =\r\n \r\n \r\n {_props.children}\r\n ;\r\n }\r\n delete _props.iconName;\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Link);\r\n","import { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport { CustomTheme } from '../muiTheme';\r\n\r\ninterface Props\r\n{\r\n children: React.ReactNode;\r\n grouping: 'Unrelated' | 'Related' | 'Closely Related' | 'Tight';\r\n lg?: number;\r\n md?: number;\r\n sm?: number;\r\n xs?: number;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibilityStyles = {};\r\n for (const breakPoint of theme.visibilityBreakPoints)\r\n {\r\n for (let size = 1; size <= 12; size++)\r\n {\r\n visibilityStyles[`grid-${breakPoint}-${size}`] =\r\n {\r\n [theme.breakpoints.up(breakPoint)]:\r\n {\r\n gridTemplateColumns: `repeat(${size}, 1fr)`,\r\n },\r\n };\r\n }\r\n }\r\n\r\n /*\r\n * Note: The row gap is accomplished using margins on the content to ensure\r\n * the gap is collapsed if the grid row no longer has any visible content.\r\n *\r\n * If grid-row-gap is used, the gap is effectively doubled between the\r\n * visible rows if the contents of the row between them are hidden. This is\r\n * because it is the contents of the grid items, not the grid items\r\n * themselves that are hidden if, for example, a widget's access level\r\n * dictates that it is hidden or an expansion sub-pane is collaped. Such\r\n * behaviour is desirable, however, since we still want the grid item to\r\n * occupy the space left behind by the hidden widget. Otherwise the layout\r\n * would reflow to take up that space if the grid item itself was hidden.\r\n */\r\n const closelyRelatedSpaceStyle = {};\r\n const columnSpaceStyle = {};\r\n const relatedSpaceStyle = {};\r\n const unrelatedSpaceStyle = {};\r\n const tightSpaceStyle = {};\r\n\r\n for (const breakPoint of theme.spacingBreakPoints)\r\n {\r\n const columnSpacing = theme.horizontalSpacing.related[breakPoint];\r\n columnSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n gridColumnGap: `${columnSpacing}px`,\r\n };\r\n\r\n const closelyRelatedSpacing =\r\n theme.verticalSpacing.closelyRelated[breakPoint];\r\n closelyRelatedSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n '& > div > *':\r\n {\r\n marginTop: closelyRelatedSpacing,\r\n },\r\n marginTop: -closelyRelatedSpacing,\r\n };\r\n\r\n const relatedSpacing = theme.verticalSpacing.related[breakPoint];\r\n relatedSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n '& > div > *':\r\n {\r\n marginTop: relatedSpacing,\r\n },\r\n '& > div > .mustangui-grid-closelyrelated':\r\n {\r\n marginTop: relatedSpacing - closelyRelatedSpacing,\r\n },\r\n marginTop: -relatedSpacing,\r\n };\r\n\r\n const unrelatedSpacing = theme.verticalSpacing.unrelated[breakPoint];\r\n unrelatedSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n '& > div > *':\r\n {\r\n marginTop: unrelatedSpacing,\r\n },\r\n '& > div > .mustangui-grid-closelyrelated':\r\n {\r\n marginTop: unrelatedSpacing - closelyRelatedSpacing,\r\n },\r\n '& > div > .mustangui-grid-related':\r\n {\r\n marginTop: unrelatedSpacing - relatedSpacing,\r\n },\r\n marginTop: -unrelatedSpacing,\r\n };\r\n\r\n const tightSpacing = theme.verticalSpacing.tight[breakPoint];\r\n tightSpaceStyle[theme.breakpoints.up(breakPoint)] =\r\n {\r\n '& > div > *':\r\n {\r\n marginTop: tightSpacing,\r\n },\r\n marginTop: -tightSpacing,\r\n };\r\n }\r\n\r\n const result =\r\n {\r\n closelyrelated:\r\n {\r\n ...closelyRelatedSpaceStyle,\r\n },\r\n container:\r\n {\r\n display: 'grid',\r\n ...columnSpaceStyle,\r\n },\r\n related:\r\n {\r\n ...relatedSpaceStyle,\r\n },\r\n tight:\r\n {\r\n ...tightSpaceStyle,\r\n },\r\n unrelated:\r\n {\r\n ...unrelatedSpaceStyle,\r\n },\r\n ...visibilityStyles,\r\n };\r\n\r\n return createStyles(result);\r\n};\r\n\r\nexport class Grid extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const groupingMapping =\r\n {\r\n 'Closely Related': 'closelyrelated',\r\n Related: 'related',\r\n Tight: 'tight',\r\n Unrelated: 'unrelated',\r\n };\r\n\r\n const groupingClassName = groupingMapping[this.props.grouping];\r\n const classes: string[] =\r\n [\r\n `mustangui-grid-${groupingClassName}`,\r\n this.props.classes.container,\r\n this.props.classes[groupingClassName],\r\n this.props.classes[`grid-xs-${this.props.xs || 12}`],\r\n ];\r\n\r\n if (this.props.sm !== undefined)\r\n {\r\n classes.push(this.props.classes[`grid-sm-${this.props.sm}`]);\r\n }\r\n\r\n if (this.props.md !== undefined)\r\n {\r\n classes.push(this.props.classes[`grid-md-${this.props.md}`]);\r\n }\r\n\r\n if (this.props.lg !== undefined)\r\n {\r\n classes.push(this.props.classes[`grid-lg-${this.props.lg}`]);\r\n }\r\n\r\n return (\r\n
\r\n {this.props.children}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Grid);\r\n","import * as colors from '@material-ui/core/colors';\r\n// VERSION_WARNING Material-UI 4.9.1\r\n// Currently a MaterialUI API break, there is a ticket to make\r\n// it public https://github.com/mui-org/material-ui/issues/13039\r\nimport { darken } from '@material-ui/core/styles/colorManipulator';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport createMuiTheme, { Theme, ThemeOptions }\r\n from '@material-ui/core/styles/createMuiTheme';\r\nimport { TypographyStyleOptions }\r\n from '@material-ui/core/styles/createTypography';\r\n\r\ninterface FreeflowBreakPointSpacing\r\n{\r\n lg: { horizontal: number; vertical: number };\r\n md: { horizontal: number; vertical: number };\r\n sm: { horizontal: number; vertical: number };\r\n xs: { horizontal: number; vertical: number };\r\n}\r\n\r\ninterface GridBreakPointSpacing\r\n{\r\n lg: number;\r\n md: number;\r\n sm: number;\r\n xs: number;\r\n}\r\n\r\ninterface CustomOptions\r\n{\r\n container:\r\n {\r\n maxWidth: { lg: number; md: number; sm: number };\r\n verticalSpacing: { lg: number; md: number; sm: number; xs: number };\r\n };\r\n dialog:\r\n {\r\n maxColumns: { lg: number; md: number; sm: number };\r\n maxWidths: { lg: number; md: number; sm: number };\r\n padding: { sm: number; xs: number };\r\n };\r\n freeflow:\r\n {\r\n group:\r\n {\r\n spacing: FreeflowBreakPointSpacing;\r\n };\r\n item:\r\n {\r\n spacing: FreeflowBreakPointSpacing;\r\n };\r\n section:\r\n {\r\n spacing: FreeflowBreakPointSpacing;\r\n };\r\n };\r\n horizontalSpacing:\r\n {\r\n closelyRelated: GridBreakPointSpacing;\r\n related: GridBreakPointSpacing;\r\n widget:\r\n {\r\n closelyRelated: number;\r\n related: number;\r\n };\r\n };\r\n isHeaderOrFooter: boolean;\r\n links:\r\n {\r\n color: string | null;\r\n disabledColor: string;\r\n fontWeight: number;\r\n hoverColor: string | null;\r\n hoverTextDecoration: string;\r\n rippleColor: string;\r\n textDecoration: string;\r\n };\r\n panel:\r\n {\r\n maxColumns: { lg: number; md: number; sm: number };\r\n maxWidths: { lg: number; md: number; sm: number };\r\n };\r\n paper:\r\n {\r\n padding: { lg: number; md: number; sm: number; xs: number };\r\n };\r\n spacingBreakPoints: Breakpoint[];\r\n verticalSpacing:\r\n {\r\n closelyRelated: GridBreakPointSpacing;\r\n related: GridBreakPointSpacing;\r\n unrelated: GridBreakPointSpacing;\r\n tight: GridBreakPointSpacing;\r\n };\r\n visibilityBreakPoints: Breakpoint[];\r\n widthBreakPoints: Breakpoint[];\r\n}\r\n\r\nexport interface CustomTheme extends Theme, CustomOptions\r\n{\r\n}\r\n\r\ninterface CustomThemeOptions extends ThemeOptions, CustomOptions\r\n{\r\n}\r\n\r\nexport enum ForegroundColorType\r\n{\r\n Grey,\r\n White,\r\n};\r\n\r\nexport interface PanelMeasurements\r\n{\r\n columnWidth: number;\r\n gutterWidth: number;\r\n}\r\n\r\nexport function getPanelMeasurements(\r\n theme: CustomTheme,\r\n breakPoint: Breakpoint\r\n ): PanelMeasurements\r\n{\r\n const maxColumns: number = theme.panel.maxColumns[breakPoint];\r\n const maxWidth: number = theme.panel.maxWidths[breakPoint];\r\n const gutterWidth: number = theme.horizontalSpacing.related[breakPoint];\r\n const columnWidth: number =\r\n (maxWidth - gutterWidth * (maxColumns - 1)) / maxColumns;\r\n\r\n return { columnWidth, gutterWidth };\r\n}\r\n\r\nexport default function createTheme(\r\n baseForegroundColor: ForegroundColorType | 'grey' | 'white',\r\n isHeaderOrFooter: boolean)\r\n{\r\n let buttonBackgroundColor: string;\r\n let lighterForegroundColor: string;\r\n let linkDisabledForegroundColor: string;\r\n let normalForegroundColor: string;\r\n\r\n if (baseForegroundColor === ForegroundColorType.Grey\r\n || baseForegroundColor === 'grey')\r\n {\r\n buttonBackgroundColor = colors.grey[300];\r\n lighterForegroundColor = colors.grey[300];\r\n linkDisabledForegroundColor = colors.grey[300];\r\n normalForegroundColor = colors.grey[800];\r\n }\r\n else if (baseForegroundColor === ForegroundColorType.White\r\n || baseForegroundColor === 'white')\r\n {\r\n buttonBackgroundColor = colors.common.white;\r\n lighterForegroundColor = colors.common.white;\r\n linkDisabledForegroundColor = 'rgba(255, 255, 255, 0.2)';\r\n normalForegroundColor = colors.common.white;\r\n }\r\n else\r\n {\r\n throw new Error(\r\n 'Base foreground color must be either \"grey\" or \"white\"');\r\n }\r\n\r\n const hoverForegroundColor = darken(normalForegroundColor, 0.1);\r\n const buttonHoverBackgroundColor = darken(buttonBackgroundColor, 0.1);\r\n\r\n const theme: CustomThemeOptions =\r\n {\r\n breakpoints:\r\n {\r\n values:\r\n {\r\n lg: 1281,\r\n md: 961,\r\n sm: 601,\r\n xl: 1920,\r\n xs: 0,\r\n },\r\n },\r\n container:\r\n {\r\n maxWidth: { lg: 1200, md: 912, sm: 568 },\r\n verticalSpacing: { lg: 80, md: 60, sm: 40, xs: 40 },\r\n },\r\n dialog:\r\n {\r\n maxColumns: { lg: 6, md: 8, sm: 8 },\r\n maxWidths: { lg: 660, md: 648, sm: 600 },\r\n padding: { sm: 40, xs: 16 },\r\n },\r\n freeflow:\r\n {\r\n group:\r\n {\r\n spacing:\r\n {\r\n lg: { horizontal: 40, vertical: 40 },\r\n md: { horizontal: 24, vertical: 24 },\r\n sm: { horizontal: 24, vertical: 16 },\r\n xs: { horizontal: 24, vertical: 16 },\r\n },\r\n },\r\n item:\r\n {\r\n spacing:\r\n {\r\n lg: { horizontal: 24, vertical: 24 },\r\n md: { horizontal: 24, vertical: 24 },\r\n sm: { horizontal: 16, vertical: 16 },\r\n xs: { horizontal: 16, vertical: 16 },\r\n },\r\n },\r\n section:\r\n {\r\n spacing:\r\n {\r\n lg: { horizontal: 40, vertical: 0 },\r\n md: { horizontal: 24, vertical: 0 },\r\n sm: { horizontal: 16, vertical: 0 },\r\n xs: { horizontal: 8, vertical: 0 },\r\n },\r\n },\r\n },\r\n horizontalSpacing:\r\n {\r\n closelyRelated: { lg: 24, md: 24, sm: 16, xs: 16 },\r\n related: { lg: 40, md: 24, sm: 16, xs: 16 },\r\n widget:\r\n {\r\n closelyRelated: 8,\r\n related: 16,\r\n },\r\n },\r\n isHeaderOrFooter,\r\n links:\r\n {\r\n color: isHeaderOrFooter ? normalForegroundColor : null,\r\n disabledColor: linkDisabledForegroundColor,\r\n fontWeight: isHeaderOrFooter ? 400 : 700,\r\n hoverColor: isHeaderOrFooter ? hoverForegroundColor : null,\r\n hoverTextDecoration: isHeaderOrFooter ? 'underline' : 'none',\r\n rippleColor: normalForegroundColor,\r\n textDecoration: isHeaderOrFooter ? 'none' : 'underline',\r\n },\r\n overrides:\r\n {\r\n MuiButton:\r\n {\r\n contained:\r\n {\r\n '&$disabled': { backgroundColor: colors.grey[100] },\r\n '&:hover': { backgroundColor: buttonHoverBackgroundColor },\r\n backgroundColor: buttonBackgroundColor,\r\n boxShadow: '0px 2px 2px rgba(0, 0, 0, 0.5)',\r\n color: colors.grey[800],\r\n },\r\n label:\r\n {\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n root:\r\n {\r\n '&:hover': { backgroundColor: buttonHoverBackgroundColor },\r\n borderRadius: 0,\r\n fontSize: 14,\r\n fontWeight: 900,\r\n letterSpacing: 1,\r\n maxWidth: '100%',\r\n minHeight: 40,\r\n paddingBottom: 10,\r\n paddingLeft: 40,\r\n paddingRight: 40,\r\n paddingTop: 10,\r\n },\r\n sizeLarge:\r\n {\r\n borderRadius: 0,\r\n fontSize: 18,\r\n fontWeight: 900,\r\n letterSpacing: 1,\r\n minHeight: 60,\r\n paddingBottom: 17,\r\n paddingLeft: 60,\r\n paddingRight: 60,\r\n paddingTop: 17,\r\n },\r\n sizeSmall:\r\n {\r\n borderRadius: 0,\r\n fontSize: 9,\r\n fontWeight: 900,\r\n letterSpacing: 1,\r\n minHeight: 24,\r\n paddingBottom: 3,\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n paddingTop: 3,\r\n },\r\n text:\r\n {\r\n paddingLeft: 40,\r\n paddingRight: 40,\r\n },\r\n },\r\n MuiCardContent:\r\n {\r\n root:\r\n {\r\n '&:last-child': { paddingBottom: 8 },\r\n paddingTop: 8,\r\n },\r\n },\r\n MuiCardHeader:\r\n {\r\n action:\r\n {\r\n marginRight: 0,\r\n marginTop: 4,\r\n },\r\n },\r\n MuiCheckbox:\r\n {\r\n root:\r\n {\r\n fontSize: 24,\r\n height: 40,\r\n marginLeft: -1,\r\n padding: 0,\r\n width: 40,\r\n },\r\n },\r\n MuiChip:\r\n {\r\n label:\r\n {\r\n paddingLeft: 8,\r\n paddingRight: 8,\r\n },\r\n root:\r\n {\r\n color: normalForegroundColor,\r\n fontSize: 16,\r\n height: 24,\r\n },\r\n },\r\n MuiCollapse:\r\n {\r\n entered:\r\n {\r\n overflow: 'visible',\r\n },\r\n },\r\n MuiDialog:\r\n {\r\n paperScrollPaper:\r\n {\r\n maxHeight: '88vh',\r\n },\r\n },\r\n MuiDialogActions:\r\n {\r\n root:\r\n {\r\n padding: 0,\r\n },\r\n },\r\n MuiDialogContent:\r\n {\r\n root:\r\n {\r\n overflow: 'hidden',\r\n },\r\n },\r\n MuiDivider:\r\n {\r\n root:\r\n {\r\n backgroundColor: colors.grey[300],\r\n },\r\n },\r\n MuiDrawer:\r\n {\r\n paper:\r\n {\r\n '@media(min-width:601px)':\r\n {\r\n minWidth: 320,\r\n },\r\n },\r\n },\r\n MuiExpansionPanel:\r\n {\r\n root:\r\n {\r\n '&:first-child':\r\n {\r\n borderTopLeftRadius: 0,\r\n borderTopRightRadius: 0,\r\n },\r\n backgroundColor: colors.grey[100],\r\n },\r\n },\r\n MuiExpansionPanelSummary:\r\n {\r\n content:\r\n {\r\n '& > :last-child': { paddingRight: 0 },\r\n '&$expanded': { margin: '12px 0px' },\r\n },\r\n root:\r\n {\r\n '&$expanded': { minHeight: 48 },\r\n '&$focused': { backgroundColor: 'transparent' },\r\n },\r\n },\r\n MuiFab:\r\n {\r\n root:\r\n {\r\n '&:hover': { backgroundColor: buttonHoverBackgroundColor },\r\n backgroundColor: buttonBackgroundColor,\r\n boxShadow: '0px 2px 2px rgba(0, 0, 0, 0.5)',\r\n fontSize: 24,\r\n height: 40,\r\n width: 40,\r\n },\r\n sizeMedium:\r\n {\r\n height: 40,\r\n width: 40,\r\n },\r\n sizeSmall:\r\n {\r\n fontSize: 14,\r\n height: 24,\r\n minHeight: 24,\r\n minWidth: 24,\r\n width: 24,\r\n },\r\n },\r\n MuiFilledInput:\r\n {\r\n adornedEnd:\r\n {\r\n paddingRight: 16,\r\n },\r\n adornedStart:\r\n {\r\n paddingLeft: 16,\r\n },\r\n input:\r\n {\r\n paddingBottom: 8,\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n paddingTop: 24,\r\n },\r\n multiline:\r\n {\r\n paddingBottom: 0,\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n paddingTop: 24,\r\n },\r\n root:\r\n {\r\n '&$disabled':\r\n {\r\n backgroundColor: colors.grey[100],\r\n color: colors.grey[300],\r\n },\r\n '&:hover':\r\n {\r\n backgroundColor: darken(colors.grey[200], 0.1),\r\n },\r\n backgroundColor: colors.grey[200],\r\n borderTopLeftRadius: 0,\r\n borderTopRightRadius: 0,\r\n boxSizing: 'border-box',\r\n color: colors.grey[800],\r\n fontSize: 16,\r\n height: 52,\r\n lineHeight: '20px',\r\n },\r\n underline:\r\n {\r\n '&$disabled:before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:after':\r\n {\r\n borderBottomColor: colors.grey[700],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:hover:not($disabled):not($focused):not($error):before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n },\r\n },\r\n MuiFormControlLabel:\r\n {\r\n label:\r\n {\r\n fontSize: 14,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n root:\r\n {\r\n marginLeft: -8,\r\n marginRight: 8,\r\n maxWidth: '100%',\r\n },\r\n },\r\n MuiFormHelperText:\r\n {\r\n root:\r\n {\r\n color: colors.grey[700],\r\n marginTop: 8,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n MuiFormLabel:\r\n {\r\n asterisk:\r\n {\r\n color: colors.red[900],\r\n },\r\n root:\r\n {\r\n '&$focused': { color: colors.grey[700] },\r\n color: colors.grey[700],\r\n fontSize: 16,\r\n lineHeight: '20px',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n MuiIcon:\r\n {\r\n colorPrimary:\r\n {\r\n color: lighterForegroundColor,\r\n },\r\n colorSecondary:\r\n {\r\n color: colors.red[800],\r\n },\r\n root:\r\n {\r\n fontSize: 'inherit',\r\n height: 'inherit',\r\n },\r\n },\r\n MuiIconButton:\r\n {\r\n root:\r\n {\r\n fontSize: 'inherit',\r\n height: 'inherit',\r\n },\r\n },\r\n MuiInput:\r\n {\r\n root:\r\n {\r\n fontSize: 16,\r\n lineHeight: '20px',\r\n },\r\n underline:\r\n {\r\n '&$disabled:before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:after':\r\n {\r\n borderBottomColor: colors.grey[700],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n '&:hover:not($disabled):not($focused):not($error):before':\r\n {\r\n borderBottomColor: colors.grey[300],\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 2,\r\n },\r\n left: -1,\r\n right: 1,\r\n },\r\n },\r\n MuiInputAdornment:\r\n {\r\n root:\r\n {\r\n '& button':\r\n {\r\n padding: 0,\r\n },\r\n\r\n height: 16,\r\n },\r\n },\r\n MuiInputBase:\r\n {\r\n root:\r\n {\r\n boxSizing: 'border-box',\r\n },\r\n },\r\n MuiInputLabel:\r\n {\r\n filled:\r\n {\r\n '&$shrink':\r\n {\r\n transform: 'translate(16px, 8px) scale(0.75)',\r\n },\r\n transform: 'translate(16px, 16px) scale(1)',\r\n },\r\n root:\r\n {\r\n pointerEvents: 'none',\r\n },\r\n },\r\n MuiMenuItem:\r\n {\r\n /* eslint-disable sort-keys */\r\n gutters:\r\n {\r\n '@media(min-width:1281px)':\r\n { paddingLeft: 40, paddingRight: 40 },\r\n '@media(max-width:1280px)':\r\n { paddingLeft: 24, paddingRight: 24 },\r\n '@media(max-width:960px)':\r\n { paddingLeft: 16, paddingRight: 16 },\r\n paddingBottom: 10,\r\n paddingTop: 10,\r\n },\r\n /* eslint-enable sort-keys */\r\n root:\r\n {\r\n '&$selected':\r\n {\r\n '& > p, & > span':\r\n {\r\n color: colors.common.white,\r\n },\r\n '&:hover':\r\n {\r\n backgroundColor: darken(colors.grey[800], 0.1),\r\n },\r\n backgroundColor: colors.grey[800],\r\n },\r\n '&:hover':\r\n {\r\n backgroundColor: darken(colors.common.white, 0.1),\r\n },\r\n '@media (min-width: 601px)':\r\n {\r\n minHeight: 40,\r\n },\r\n minHeight: 40,\r\n minWidth: 192,\r\n },\r\n },\r\n MuiRadio:\r\n {\r\n root:\r\n {\r\n fontSize: 24,\r\n padding: 8,\r\n },\r\n },\r\n MuiSelect:\r\n {\r\n icon:\r\n {\r\n color: 'inherit',\r\n paddingRight: 16,\r\n },\r\n select:\r\n {\r\n '&:focus': { backgroundColor: 'transparent' },\r\n color: normalForegroundColor,\r\n },\r\n },\r\n MuiSnackbar:\r\n {\r\n root:\r\n {\r\n justifyContent: 'initial',\r\n },\r\n },\r\n MuiSnackbarContent:\r\n {\r\n action:\r\n {\r\n alignSelf: 'flex-start',\r\n marginRight: 0,\r\n marginTop: 6,\r\n },\r\n root:\r\n {\r\n '@media (min-width: 601px)':\r\n {\r\n maxWidth: 520,\r\n minWidth: 240,\r\n },\r\n backgroundColor: colors.grey[800],\r\n borderRadius: 0,\r\n maxHeight: '95vh',\r\n overflow: 'hidden',\r\n paddingLeft: 24,\r\n paddingRight: 24,\r\n },\r\n },\r\n MuiTab:\r\n {\r\n root:\r\n {\r\n '&$selected':\r\n {\r\n backgroundColor: colors.grey[100],\r\n fontWeight: 900,\r\n },\r\n '@media(min-width:601px)':\r\n {\r\n minWidth: 'initial',\r\n },\r\n '@media(min-width:961px)':\r\n {\r\n fontSize: 14,\r\n minWidth: 'initial',\r\n },\r\n color: colors.grey[800],\r\n fontSize: 14,\r\n fontWeight: 400,\r\n letterSpacing: '1px',\r\n minHeight: 56,\r\n padding: 0,\r\n position: 'relative',\r\n zIndex: 1,\r\n },\r\n textColorInherit:\r\n {\r\n opacity: 1,\r\n },\r\n },\r\n MuiTabs:\r\n {\r\n indicator:\r\n {\r\n backgroundColor: colors.grey[800],\r\n top: 0,\r\n zIndex: 1,\r\n },\r\n root:\r\n {\r\n height: 56,\r\n },\r\n },\r\n MuiTooltip:\r\n {\r\n popper:\r\n {\r\n opacity: 1,\r\n },\r\n tooltip:\r\n {\r\n backgroundColor: colors.grey[800],\r\n borderRadius: 0,\r\n color: colors.common.white,\r\n fontSize: 12,\r\n fontWeight: 400,\r\n lineHeight: '16px',\r\n maxWidth: 320,\r\n overflow: 'hidden',\r\n },\r\n tooltipPlacementBottom:\r\n {\r\n '@media(min-width:601px)':\r\n {\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 8,\r\n },\r\n },\r\n tooltipPlacementTop:\r\n {\r\n '@media(min-width:601px)':\r\n {\r\n marginBottom: 8,\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 0,\r\n },\r\n },\r\n },\r\n MuiTouchRipple:\r\n {\r\n rippleVisible:\r\n {\r\n animation: 'cx-ripple-enter 550ms ease-in-out',\r\n opacity: 0.4,\r\n },\r\n },\r\n MuiTypography:\r\n {\r\n root:\r\n {\r\n color: normalForegroundColor,\r\n },\r\n },\r\n },\r\n palette:\r\n {\r\n action:\r\n {\r\n disabled: colors.grey[300],\r\n disabledBackground: colors.grey[100],\r\n },\r\n error: { main: colors.red[900] },\r\n primary: { main: colors.red[800] },\r\n secondary: { main: colors.blueGrey[900] },\r\n text:\r\n {\r\n disabled: colors.grey[300],\r\n primary: normalForegroundColor,\r\n secondary: normalForegroundColor,\r\n },\r\n },\r\n panel:\r\n {\r\n maxColumns: { lg: 12, md: 12, sm: 8 },\r\n maxWidths: { lg: 1200, md: 912, sm: 568 },\r\n },\r\n paper:\r\n {\r\n padding: { lg: 40, md: 24, sm: 24, xs: 16 },\r\n },\r\n props:\r\n {\r\n MuiPaper:\r\n {\r\n square: true,\r\n },\r\n MuiTypography:\r\n {\r\n variantMapping:\r\n {\r\n /* eslint-disable sort-keys */\r\n caption: 'p',\r\n srOnly: 'p',\r\n button: 'p',\r\n /* eslint-enable sort-keys */\r\n },\r\n },\r\n },\r\n spacingBreakPoints: ['xs', 'sm', 'md', 'lg'],\r\n typography:\r\n {\r\n fontSize: 16,\r\n /* eslint-disable sort-keys */\r\n h1:\r\n {\r\n '@media(min-width:1281px)':\r\n { fontSize: 56, lineHeight: '72px' },\r\n '@media(max-width:1280px)':\r\n { fontSize: 45, lineHeight: '60px' },\r\n '@media(max-width:600px)':\r\n { fontSize: 34, lineHeight: '44px' },\r\n fontWeight: 700,\r\n } as TypographyStyleOptions,\r\n h2:\r\n {\r\n '@media(min-width:1281px)':\r\n { fontSize: 45, lineHeight: '60px' },\r\n '@media(max-width:1280px)':\r\n { fontSize: 34, lineHeight: '44px' },\r\n '@media(max-width:600px)':\r\n { fontSize: 24, lineHeight: '32px' },\r\n fontWeight: 700,\r\n } as TypographyStyleOptions,\r\n h3:\r\n {\r\n '@media(min-width:1281px)':\r\n { fontSize: 34, lineHeight: '44px' },\r\n '@media(max-width:1280px)':\r\n { fontSize: 24, lineHeight: '32px' },\r\n '@media(max-width:600px)':\r\n { fontSize: 21, lineHeight: '28px' },\r\n fontWeight: 700,\r\n } as TypographyStyleOptions,\r\n h4:\r\n {\r\n '@media(min-width:1281px)':\r\n { fontSize: 24, lineHeight: '32px' },\r\n '@media(max-width:1280px)':\r\n { fontSize: 21, lineHeight: '28px' },\r\n '@media(max-width:600px)':\r\n { fontSize: 16, lineHeight: '20px' },\r\n fontWeight: 700,\r\n } as TypographyStyleOptions,\r\n h5:\r\n {\r\n '@media(min-width:1281px)':\r\n { fontSize: 21, lineHeight: '28px' },\r\n '@media(max-width:1280px)':\r\n { fontSize: 16, lineHeight: '20px' },\r\n fontWeight: 700,\r\n } as TypographyStyleOptions,\r\n h6:\r\n {\r\n fontSize: 16,\r\n fontWeight: 700,\r\n lineHeight: '20px',\r\n } as TypographyStyleOptions,\r\n caption:\r\n {\r\n fontSize: 12,\r\n fontWeight: 400,\r\n lineHeight: '16px',\r\n },\r\n body1:\r\n {\r\n fontSize: 16,\r\n fontWeight: 400,\r\n lineHeight: '20px',\r\n },\r\n body2:\r\n {\r\n fontSize: 16,\r\n fontWeight: 700,\r\n lineHeight: '20px',\r\n },\r\n button:\r\n {\r\n color: colors.grey[800],\r\n fontSize: 16,\r\n fontWeight: 700,\r\n },\r\n /* eslint-enable sort-keys */\r\n },\r\n verticalSpacing:\r\n {\r\n closelyRelated: { lg: 24, md: 24, sm: 24, xs: 24 },\r\n related: { lg: 40, md: 24, sm: 24, xs: 24 },\r\n tight: { lg: 8, md: 8, sm: 8, xs: 8 },\r\n unrelated: { lg: 60, md: 40, sm: 40, xs: 40 },\r\n },\r\n visibilityBreakPoints: ['xs', 'sm', 'md', 'lg', 'xl'],\r\n widthBreakPoints: ['sm', 'md', 'lg'],\r\n };\r\n\r\n return createMuiTheme(theme);\r\n}\r\n","import * as muiInputAdornment from '@material-ui/core/InputAdornment';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Icon from './Icon';\r\nimport IconButton from './IconButton';\r\nimport { Colors } from './Presentation';\r\n\r\ninterface Props extends muiInputAdornment.InputAdornmentProps\r\n{\r\n children?: React.ReactNode;\r\n icon?: string;\r\n iconButton?: object;\r\n iconColor?: Colors;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class InputAdornment extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if ('icon' in _props)\r\n {\r\n _props.children =\r\n ;\r\n\r\n delete _props.icon;\r\n delete _props.iconColor;\r\n }\r\n\r\n if ('iconButton' in _props)\r\n {\r\n _props.children = ;\r\n\r\n delete _props.iconButton;\r\n }\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(InputAdornment);\r\n","import { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { CustomTheme } from '../../muiTheme';\r\n\r\nexport default class CenteredContentClasses\r\n{\r\n public static create(theme: CustomTheme): {}\r\n {\r\n return (\r\n {\r\n 'container-all':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n width: theme.container.maxWidth.lg,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n width: theme.container.maxWidth.md,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n width: theme.container.maxWidth.sm,\r\n },\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.related.xs,\r\n marginRight: theme.horizontalSpacing.related.xs,\r\n },\r\n },\r\n 'container-lg':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n width: theme.container.maxWidth.lg,\r\n },\r\n },\r\n 'container-md':\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n width: theme.container.maxWidth.md,\r\n },\r\n },\r\n 'container-sm':\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n width: theme.container.maxWidth.sm,\r\n },\r\n },\r\n 'container-xs':\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.related.xs,\r\n marginRight: theme.horizontalSpacing.related.xs,\r\n },\r\n },\r\n });\r\n }\r\n\r\n public static get(breakPoint: Breakpoint | null, classes: {}): string\r\n {\r\n if (breakPoint === null)\r\n {\r\n return classes['container-all'];\r\n }\r\n\r\n if (breakPoint === 'xl')\r\n {\r\n return classes['container-lg'];\r\n }\r\n\r\n return classes[`container-${breakPoint}`];\r\n }\r\n}\r\n","import * as muiDialogContent from '@material-ui/core/DialogContent';\r\nimport { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport { CustomTheme } from '../muiTheme';\r\n\r\ninterface Props extends muiDialogContent.DialogContentProps\r\n{\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n root:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n '&:first-child':\r\n {\r\n paddingTop: theme.dialog.padding.xs,\r\n },\r\n\r\n paddingBottom: 4, // Space for button shadow\r\n paddingLeft: theme.dialog.padding.xs,\r\n paddingRight: theme.dialog.padding.xs,\r\n paddingTop: theme.dialog.padding.xs,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n '&:first-child':\r\n {\r\n paddingTop: theme.dialog.padding.sm,\r\n },\r\n\r\n paddingLeft: theme.dialog.padding.sm,\r\n paddingRight: theme.dialog.padding.sm,\r\n paddingTop: theme.dialog.padding.sm,\r\n },\r\n },\r\n });\r\n\r\nexport class DialogContent extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DialogContent);\r\n","import * as muiBackdrop from '@material-ui/core/Backdrop';\r\nimport * as muiModal from '@material-ui/core/Modal';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport MaskingStore from '../stores/MaskingStore';\r\nimport CircularProgress from './CircularProgress';\r\nimport Fade from './Fade';\r\nimport Typography from './Typography';\r\n\r\ninterface Props\r\n{\r\n disableBackground?: boolean;\r\n disableRestoreFocus?: boolean;\r\n isFixed?: boolean;\r\n isOpen: boolean;\r\n message?: string | null;\r\n shortFade?: boolean;\r\n style?: React.CSSProperties;\r\n trapFocus?: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n content:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n justifyContent: 'center',\r\n outline: 'none',\r\n textAlign: 'center',\r\n },\r\n root:\r\n {\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n zIndex: 9999,\r\n },\r\n rootAbsolute:\r\n {\r\n position: 'absolute',\r\n },\r\n rootClickThrough:\r\n {\r\n pointerEvents: 'none',\r\n },\r\n rootFixed:\r\n {\r\n position: 'fixed',\r\n },\r\n text:\r\n {\r\n color: theme.palette.common.white,\r\n marginTop: 12,\r\n },\r\n });\r\n\r\nexport class ProcessingMask extends\r\n React.PureComponent, State>\r\n{\r\n private closeTimeout: number;\r\n private isClosing: boolean = false;\r\n private readonly minMillisecondsOpen = 500;\r\n private openedOn: Date | null = null;\r\n private openTimeout: number;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isOpen: props.isOpen };\r\n }\r\n\r\n private onClose = () =>\r\n {\r\n if (this.props.trapFocus && this.openedOn !== null)\r\n {\r\n MaskingStore.maskClosed();\r\n }\r\n };\r\n\r\n private onOpen = () =>\r\n {\r\n if (this.props.trapFocus)\r\n {\r\n MaskingStore.maskOpened();\r\n }\r\n this.openedOn = new Date();\r\n };\r\n\r\n private restoreScrollPosition = () =>\r\n {\r\n if (!this.props.trapFocus)\r\n {\r\n return;\r\n }\r\n\r\n const position = document.documentElement!.scrollTop;\r\n // Setting a timeout to make sure to restore scroll position\r\n // after render finishes\r\n window.setTimeout(() => window.scrollTo(0, position));\r\n };\r\n\r\n public componentDidMount()\r\n {\r\n if (this.props.isOpen)\r\n {\r\n this.onOpen();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: Props)\r\n {\r\n if (this.props.isOpen === prevProps.isOpen)\r\n {\r\n return;\r\n }\r\n\r\n if (this.isClosing)\r\n {\r\n window.clearTimeout(this.closeTimeout);\r\n this.isClosing = false;\r\n\r\n return;\r\n }\r\n\r\n if (this.props.isOpen)\r\n {\r\n this.openedOn = null;\r\n this.setState(\r\n { isOpen: true },\r\n () => this.openTimeout = window.setTimeout(this.onOpen));\r\n\r\n return;\r\n }\r\n\r\n if (this.openedOn === null)\r\n {\r\n window.clearTimeout(this.openTimeout);\r\n this.setState({ isOpen: false });\r\n\r\n return;\r\n }\r\n\r\n const millisecondsOpen: number =\r\n new Date().getTime() - this.openedOn.getTime();\r\n\r\n if (millisecondsOpen > this.minMillisecondsOpen)\r\n {\r\n this.setState({ isOpen: false }, this.onClose);\r\n }\r\n else\r\n {\r\n this.isClosing = true;\r\n this.closeTimeout = window.setTimeout(\r\n () =>\r\n {\r\n this.setState({ isOpen: false }, this.onClose);\r\n this.isClosing = false;\r\n },\r\n this.minMillisecondsOpen - millisecondsOpen);\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n window.clearTimeout(this.openTimeout);\r\n window.clearTimeout(this.closeTimeout);\r\n if (this.state.isOpen)\r\n {\r\n this.onClose();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const classes: string[] = [this.props.classes.root];\r\n\r\n if (!this.state.isOpen)\r\n {\r\n classes.push(this.props.classes.rootClickThrough);\r\n }\r\n\r\n if (this.props.isFixed)\r\n {\r\n classes.push(this.props.classes.rootFixed);\r\n }\r\n else\r\n {\r\n classes.push(this.props.classes.rootAbsolute);\r\n }\r\n\r\n const content = (\r\n
\r\n \r\n {this.props.message ? (\r\n \r\n {this.props.message}\r\n \r\n ) : null}\r\n
\r\n );\r\n\r\n const transitionDuration =\r\n {\r\n enter: this.props.shortFade ? 0 : 500,\r\n exit: this.props.shortFade ? 500 : 1000,\r\n };\r\n\r\n if (!this.props.disableBackground)\r\n {\r\n return (\r\n \r\n {\r\n // VERSION_WARNING Material-UI 4.9.1\r\n // Fade child is required to make returning focus work\r\n // https://github.com/mui-org/material-ui/issues/19149\r\n }\r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {content}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ProcessingMask);\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport Presentation from '../coreui/Presentation';\r\n\r\nexport interface LayoutConfig\r\n{\r\n dataIds: string[];\r\n layoutId: number;\r\n paneUse: object;\r\n}\r\n\r\nexport interface LayoutChildProps\r\n{\r\n isInPageFooter?: boolean;\r\n}\r\n\r\ninterface Props\r\n{\r\n config: LayoutConfig;\r\n preventClear?: boolean;\r\n propagated?: LayoutChildProps;\r\n}\r\n\r\n@observer\r\nexport class Layout extends\r\n React.Component\r\n{\r\n public componentWillUnmount()\r\n {\r\n // FUTURE\r\n // This flag was added for the case when the same header or footer\r\n // layout is used between two different templates, such as the\r\n // BasePageTemplate and the LandingPageTemplate. If the clear occurs\r\n // when navigating between two templates which share a header or footer,\r\n // the new data ends up being removed because the clear will happen\r\n // after the new data is loaded. Simply preventing the clear from\r\n // occuring is acceptable because the point of clearing the data is to\r\n // reduce the memory footprint of the application, and the data involved\r\n // in a toolbar will be sufficiently small.\r\n if (this.props.preventClear)\r\n {\r\n return;\r\n }\r\n\r\n // Wait until presentation is fully unmounted before clearing data.\r\n // This prevents data changed handlers from firing during unmounting\r\n setTimeout(() =>\r\n {\r\n for (const dataId of this.props.config.dataIds)\r\n {\r\n if (TrackableModel.models.has(dataId))\r\n {\r\n TrackableModel.models.get(dataId)!.clear();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n return Presentation.create(\r\n this.props.config.paneUse,\r\n this.props.propagated);\r\n }\r\n}\r\n","import * as muiDrawer from '@material-ui/core/Drawer';\r\nimport * as muiMenuList from '@material-ui/core/MenuList';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport MaskingStore from '../stores/MaskingStore';\r\nimport Button from './Button';\r\n\r\nexport interface DrawerProps\r\n{\r\n anchor?: 'left' | 'right';\r\n anchorEl?: Element | ((element: Element) => Element) | null;\r\n name?: string | null;\r\n open?: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n closeButton:\r\n {\r\n position: 'relative',\r\n top: 'calc(50% - 20px)',\r\n },\r\n header:\r\n {\r\n borderBottom: 1,\r\n borderBottomColor: theme.palette.grey[300],\r\n borderBottomStyle: 'solid',\r\n marginBottom: 8,\r\n paddingLeft: 40,\r\n paddingRight: 40,\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n minHeight: 72,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n minHeight: 88,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n minHeight: 108,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n minHeight: 140,\r\n },\r\n },\r\n menuList:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n marginLeft: 24,\r\n marginRight: 24,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n marginLeft: 16,\r\n marginRight: 16,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginLeft: 0,\r\n marginRight: 0,\r\n },\r\n outline: 'none',\r\n padding: 0,\r\n },\r\n paper:\r\n {\r\n maxWidth: '100%',\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n width: '100%',\r\n },\r\n },\r\n });\r\n\r\nexport class Drawer extends\r\n React.PureComponent, State>\r\n{\r\n // Dictionary of drawer components, keyed by name.\r\n public static instances: Map> =\r\n new Map>();\r\n\r\n public static close(name?: string | null)\r\n {\r\n if (name && Drawer.instances.has(name))\r\n {\r\n Drawer.instances.get(name)!.forEach((drawer) =>\r\n {\r\n drawer.close();\r\n });\r\n }\r\n }\r\n\r\n public static closeAll()\r\n {\r\n Drawer.instances.forEach((value: Set) =>\r\n {\r\n value.forEach((drawer: Drawer) =>\r\n {\r\n drawer.close();\r\n });\r\n });\r\n }\r\n\r\n public static open(name?: string | null, anchorElement?: HTMLElement)\r\n {\r\n if (name && Drawer.instances.has(name))\r\n {\r\n Drawer.instances.get(name)!.forEach((drawer) =>\r\n {\r\n if (!anchorElement || drawer.props.anchorEl === anchorElement)\r\n {\r\n drawer.open();\r\n }\r\n });\r\n }\r\n }\r\n\r\n public static toggle(name?: string | null)\r\n {\r\n if (name && Drawer.instances.has(name))\r\n {\r\n Drawer.instances.get(name)!.forEach((drawer) =>\r\n {\r\n drawer.toggle();\r\n });\r\n }\r\n }\r\n\r\n constructor(props: DrawerProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isOpen: props.open || false };\r\n\r\n if (props.name)\r\n {\r\n if (Drawer.instances.has(props.name))\r\n {\r\n Drawer.instances.get(props.name)!.add(this);\r\n }\r\n else\r\n {\r\n Drawer.instances.set(props.name, new Set([this]));\r\n }\r\n }\r\n }\r\n\r\n public close()\r\n {\r\n if (this.state.isOpen)\r\n {\r\n this.setState({ isOpen: false });\r\n MaskingStore.maskClosed();\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.props.name && Drawer.instances.has(this.props.name))\r\n {\r\n Drawer.instances.get(this.props.name)!.delete(this);\r\n\r\n if (Drawer.instances.get(this.props.name)!.size === 0)\r\n {\r\n Drawer.instances.delete(this.props.name);\r\n }\r\n }\r\n if (this.state.isOpen)\r\n {\r\n MaskingStore.maskClosed();\r\n }\r\n }\r\n\r\n public open()\r\n {\r\n if (!this.state.isOpen)\r\n {\r\n this.setState(\r\n { isOpen: true },\r\n () => setTimeout(MaskingStore.maskOpened));\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const anchor: 'left' | 'right' = this.props.anchor || 'right';\r\n\r\n return (\r\n this.close()}\r\n open={this.state.isOpen}\r\n >\r\n
\r\n this.close()}\r\n style={{ float: anchor }}\r\n />\r\n
\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n\r\n public toggle()\r\n {\r\n this.setState((prevState) =>\r\n {\r\n return { isOpen: !prevState.isOpen };\r\n });\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Drawer);\r\n","import * as React from 'react';\r\nimport { Layout, LayoutConfig } from '../config/Layout';\r\nimport AppServer, { State } from '../core/AppServer';\r\nimport Routing from '../core/Routing';\r\nimport Sys from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { ValueByBreakpoint } from '../mustangui/Api';\r\nimport Panel from '../mustangui/Panel';\r\nimport PresentationService from '../services/PresentationService';\r\nimport UserService from '../services/UserService';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport BasePageTemplate, { BasePageTemplateConfig }\r\n from '../templates/BasePageTemplate';\r\n\r\nexport interface AuthenticatedPageConfig\r\n{\r\n homeLayout: LayoutConfig;\r\n template: BasePageTemplateConfig;\r\n}\r\n\r\nexport class AuthenticatedPage\r\n{\r\n private static config: AuthenticatedPageConfig | null = null;\r\n\r\n public static async render(\r\n presentationId: number,\r\n objectHandle: string,\r\n parameters: string | null,\r\n appServerState: State | null = null\r\n ): Promise\r\n {\r\n if (AuthenticatedPage.config === null)\r\n {\r\n throw new Error(\r\n 'Authenticated page config must be set before the '\r\n + 'authenticated page may be rendered');\r\n }\r\n\r\n const templateResponse =\r\n await PresentationService.getAuthenticatedPageData(\r\n appServerState);\r\n AppServer.setState(templateResponse.appServerState);\r\n PaneDataStore.loadResponse(templateResponse.paneDataByDataId);\r\n\r\n const templateConfig = AuthenticatedPage.config.template;\r\n\r\n const dataResponse = await PresentationService.getPresentationData(\r\n presentationId, objectHandle, parameters);\r\n\r\n if (dataResponse.shouldRedirectHome)\r\n {\r\n AppServer.setState(dataResponse.appServerState);\r\n Sys.setHash('');\r\n\r\n return;\r\n }\r\n\r\n // FUTURE 7.4.1\r\n // The presentation is first rendered without any children to give the\r\n // models a chance to be cleared without the new presentation reacting\r\n // to their on-change events.\r\n //\r\n // The components should be made tolerant of missing data, that way the\r\n // on-change events fired by changing the data will be benign. Then we\r\n // can take full advantage of React's architecture for making minimum\r\n // changes to the DOM (this approach effectively removes the entire\r\n // presentation from the DOM and re-renders the new one, which is not as\r\n // efficient as it could be).\r\n const navigatingToSamePresentation = Presentation.currentPresentationId\r\n && Presentation.currentPresentationId === dataResponse.layoutId!;\r\n // Avoiding clearing the presentation if navigating to the same\r\n // presentation helps this to be slightly more efficient.\r\n if (!navigatingToSamePresentation)\r\n {\r\n Presentation.render(\r\n );\r\n }\r\n\r\n const presentation = await PresentationService.getPresentationConfig(\r\n dataResponse.layoutId!);\r\n\r\n AppServer.setState(dataResponse.appServerState);\r\n PaneDataStore.loadResponse(dataResponse.paneDataByDataId!);\r\n\r\n Presentation.render(\r\n \r\n \r\n \r\n \r\n );\r\n\r\n Routing.setDocumentTitle(\r\n dataResponse.objectTitle, presentation.objectDefDescription);\r\n }\r\n\r\n public static async renderHome(): Promise\r\n {\r\n if (AuthenticatedPage.config === null)\r\n {\r\n throw new Error(\r\n 'Authenticated page config must be set before the '\r\n + 'authenticated page may be rendered');\r\n }\r\n\r\n await AuthenticatedPage.render(\r\n AuthenticatedPage.config.homeLayout.layoutId,\r\n UserService.accountObjectHandle,\r\n null);\r\n }\r\n\r\n public static setConfig(config: AuthenticatedPageConfig)\r\n {\r\n if (AuthenticatedPage.config !== null)\r\n {\r\n throw new Error('Authenticated page config is already set');\r\n }\r\n\r\n AuthenticatedPage.config = config;\r\n\r\n const templateConfig = AuthenticatedPage.config.template;\r\n const allDataIds =\r\n [\r\n ...templateConfig.footer.layout.dataIds,\r\n ...templateConfig.header.layout.dataIds,\r\n ...AuthenticatedPage.config.homeLayout.dataIds,\r\n ];\r\n\r\n for (const dataId of allDataIds)\r\n {\r\n new TrackableCollection('PaneRow', dataId);\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { Layout, LayoutConfig } from '../config/Layout';\r\nimport AppServer, { State } from '../core/AppServer';\r\nimport Routing from '../core/Routing';\r\nimport Sys from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { ValueByBreakpoint } from '../mustangui/Api';\r\nimport Panel from '../mustangui/Panel';\r\nimport PresentationService from '../services/PresentationService';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport BasePageTemplate, { BasePageTemplateConfig }\r\n from '../templates/BasePageTemplate';\r\nimport Logon from './Logon';\r\n\r\nexport interface GuestPageConfig\r\n{\r\n forgotPasswordUrl: string | null;\r\n signInTitle: string;\r\n template: BasePageTemplateConfig;\r\n}\r\n\r\nexport class GuestPage\r\n{\r\n private static config: GuestPageConfig | null = null;\r\n\r\n public static async render(\r\n presentationId: number,\r\n objectHandle: string,\r\n parameters: string | null,\r\n appServerState: State | null = null\r\n ): Promise\r\n {\r\n if (GuestPage.config === null)\r\n {\r\n throw new Error(\r\n 'Guest page config must be set before the guest page may be '\r\n + 'rendered');\r\n }\r\n\r\n const templateResponse = await PresentationService.getGuestPageData(\r\n appServerState);\r\n AppServer.setState(templateResponse.appServerState);\r\n PaneDataStore.loadResponse(templateResponse.paneDataByDataId);\r\n\r\n const templateConfig = GuestPage.config.template;\r\n\r\n const dataResponse = await PresentationService.getPresentationData(\r\n presentationId, objectHandle, parameters);\r\n\r\n if (dataResponse.shouldRedirectHome)\r\n {\r\n AppServer.setState(dataResponse.appServerState);\r\n Sys.setHash('');\r\n\r\n return;\r\n }\r\n\r\n // FUTURE 7.4.1\r\n // The presentation is first rendered without any children to give the\r\n // models a chance to be cleared without the new presentation reacting\r\n // to their on-change events.\r\n //\r\n // The components should be made tolerant of missing data, that way the\r\n // on-change events fired by changing the data will be benign. Then we\r\n // can take full advantage of React's architecture for making minimum\r\n // changes to the DOM (this approach effectively removes the entire\r\n // presentation from the DOM and re-renders the new one, which is not as\r\n // efficient as it could be).\r\n const navigatingToSamePresentation = Presentation.currentPresentationId\r\n && Presentation.currentPresentationId === dataResponse.layoutId!;\r\n // Avoiding clearing the presentation if navigating to the same\r\n // presentation helps this to be slightly more efficient.\r\n if (!navigatingToSamePresentation)\r\n {\r\n Presentation.render(\r\n );\r\n }\r\n\r\n const presentation = await PresentationService.getPresentationConfig(\r\n dataResponse.layoutId!);\r\n\r\n AppServer.setState(dataResponse.appServerState);\r\n PaneDataStore.loadResponse(dataResponse.paneDataByDataId!);\r\n\r\n Presentation.render(\r\n \r\n \r\n \r\n \r\n );\r\n\r\n Routing.setDocumentTitle(\r\n dataResponse.objectTitle, presentation.objectDefDescription);\r\n }\r\n\r\n public static async renderSignIn(): Promise\r\n {\r\n if (GuestPage.config === null)\r\n {\r\n throw new Error(\r\n 'Guest page config must be set before the sign-in page may be '\r\n + 'rendered');\r\n }\r\n\r\n const response = await PresentationService.getGuestPageData(null);\r\n\r\n AppServer.setState(response.appServerState);\r\n PaneDataStore.loadResponse(response.paneDataByDataId);\r\n\r\n const templateConfig = GuestPage.config.template;\r\n Presentation.render(\r\n \r\n \r\n );\r\n }\r\n\r\n public static setConfig(config: GuestPageConfig)\r\n {\r\n if (GuestPage.config !== null)\r\n {\r\n throw new Error('Guest page config is already set');\r\n }\r\n\r\n GuestPage.config = config;\r\n\r\n const templateConfig = GuestPage.config.template;\r\n const allDataIds =\r\n [\r\n ...templateConfig.footer.layout.dataIds,\r\n ...templateConfig.header.layout.dataIds,\r\n ];\r\n\r\n for (const dataId of allDataIds)\r\n {\r\n new TrackableCollection('PaneRow', dataId);\r\n }\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends React.HTMLAttributes\r\n{\r\n childSelector: string;\r\n rootSelector?: string;\r\n}\r\n\r\ninterface State\r\n{\r\n isFocusable?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n outline: 'none',\r\n },\r\n });\r\n\r\nexport class KeyboardNavigationGroup extends\r\n React.PureComponent, State>\r\n{\r\n private readonly domObserver: MutationObserver;\r\n private lastAriaSelectedChild: Element | null = null;\r\n private lastFocusedChild: Element | null = null;\r\n private readonly rootRef = React.createRef();\r\n private readonly visibilityObserver: IntersectionObserver;\r\n\r\n private get isFocusWithinRootElement(): boolean\r\n {\r\n return document.hasFocus()\r\n && document.activeElement !== null\r\n && this.rootElement.contains(document.activeElement);\r\n }\r\n\r\n private get rootElement(): HTMLElement\r\n {\r\n if (this.props.rootSelector !== undefined)\r\n {\r\n return this.rootRef.current!.querySelector(\r\n this.props.rootSelector)! as HTMLElement;\r\n }\r\n\r\n return this.rootRef.current!;\r\n }\r\n\r\n private static isElementHidden(element: HTMLElement)\r\n {\r\n return element.offsetParent === null\r\n || element.style.visibility === 'hidden';\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isFocusable: false };\r\n\r\n this.domObserver = new MutationObserver(this.onDomChange);\r\n this.visibilityObserver =\r\n new IntersectionObserver(this.onVisibilityChange);\r\n }\r\n\r\n private getAriaSelectedChild(children: Element[]): Element | undefined\r\n {\r\n const ariaSelectedElement: Element | null =\r\n this.rootElement.querySelector('[aria-selected=\"true\"]');\r\n\r\n if (ariaSelectedElement)\r\n {\r\n return children.find(c =>\r\n c === ariaSelectedElement || ariaSelectedElement.contains(c));\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private getFocusableChildren(): Element[]\r\n {\r\n const children = Array.from(\r\n this.rootElement.querySelectorAll(this.props.childSelector));\r\n\r\n return children.filter(c =>\r\n !c.hasAttribute('disabled')\r\n && !KeyboardNavigationGroup.isElementHidden(c as HTMLElement));\r\n }\r\n\r\n private onBlur = (event: FocusEvent) =>\r\n {\r\n const currentTarget: HTMLElement | null =\r\n event.currentTarget as HTMLElement;\r\n\r\n if (currentTarget\r\n && !currentTarget.contains(event.relatedTarget as Node)\r\n && currentTarget.contains(event.target as Node))\r\n {\r\n this.updateIsFocusable(true);\r\n }\r\n };\r\n\r\n private onDomChange = () =>\r\n {\r\n if (!this.isFocusWithinRootElement)\r\n {\r\n this.updateIsFocusable(true);\r\n }\r\n };\r\n\r\n private onFocus = (event: FocusEvent) =>\r\n {\r\n const currentTarget: HTMLElement | null =\r\n event.currentTarget as HTMLElement;\r\n\r\n if (!currentTarget || !currentTarget.contains(event.target as Node))\r\n {\r\n return;\r\n }\r\n\r\n if (!currentTarget.contains(event.relatedTarget as Node))\r\n {\r\n this.updateIsFocusable(false);\r\n }\r\n };\r\n\r\n private onFocusTabbableElement = (event: React.FocusEvent) =>\r\n {\r\n if (!event.currentTarget.contains(event.target as Node))\r\n {\r\n return;\r\n }\r\n\r\n if (!event.currentTarget.contains(event.relatedTarget as Node)\r\n || this.lastFocusedChild !== event.target)\r\n {\r\n this.updateIsFocusable(false);\r\n this.setFocus('current');\r\n }\r\n };\r\n\r\n private onKeyDown = (event: KeyboardEvent) =>\r\n {\r\n const currentTarget: HTMLElement | null =\r\n event.currentTarget as HTMLElement;\r\n\r\n const focusedElement = event.target as HTMLElement;\r\n if (!currentTarget || !currentTarget.contains(focusedElement))\r\n {\r\n return;\r\n }\r\n if (focusedElement.tagName === 'INPUT'\r\n && (focusedElement as HTMLInputElement).type !== 'file')\r\n {\r\n return;\r\n }\r\n\r\n switch (event.keyCode)\r\n {\r\n case 37: // Left arrow\r\n this.setFocus('prev');\r\n event.preventDefault();\r\n break;\r\n\r\n case 39: // Right arrow\r\n this.setFocus('next');\r\n event.preventDefault();\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n private onVisibilityChange = (entries: IntersectionObserverEntry[]) =>\r\n {\r\n if (entries.some(e => e.intersectionRatio > 0)\r\n && !this.isFocusWithinRootElement)\r\n {\r\n this.updateIsFocusable(true);\r\n this.visibilityObserver.disconnect();\r\n }\r\n };\r\n\r\n private setFocus(move: 'current' | 'prev' | 'next')\r\n {\r\n const children: Element[] = this.getFocusableChildren();\r\n\r\n if (children.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n const ariaSelectedChild: Element | undefined =\r\n this.getAriaSelectedChild(children);\r\n\r\n let selectedChild = this.lastFocusedChild;\r\n\r\n if (ariaSelectedChild)\r\n {\r\n if (ariaSelectedChild !== this.lastAriaSelectedChild)\r\n {\r\n selectedChild = ariaSelectedChild;\r\n }\r\n\r\n this.lastAriaSelectedChild = ariaSelectedChild;\r\n }\r\n\r\n let selectChildIndex = 0;\r\n if (selectedChild)\r\n {\r\n const childIndex = children.indexOf(selectedChild);\r\n if (childIndex >= 0)\r\n {\r\n switch (move)\r\n {\r\n case 'current':\r\n selectChildIndex = childIndex;\r\n break;\r\n case 'prev':\r\n selectChildIndex = childIndex - 1;\r\n break;\r\n case 'next':\r\n selectChildIndex = childIndex + 1;\r\n break;\r\n default:\r\n throw new Error(`Unexpected move ${move}`);\r\n }\r\n }\r\n }\r\n\r\n if (selectChildIndex >= 0 && selectChildIndex < children.length)\r\n {\r\n this.lastFocusedChild = children[selectChildIndex];\r\n (this.lastFocusedChild as HTMLElement).focus();\r\n }\r\n }\r\n\r\n private updateIsFocusable(isFocusable: boolean)\r\n {\r\n const hasFocusableChild: boolean =\r\n this.getFocusableChildren().length > 0;\r\n\r\n this.setState({ isFocusable: hasFocusableChild && isFocusable });\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n const rootElement: HTMLElement = this.rootElement;\r\n\r\n this.updateIsFocusable(true);\r\n this.domObserver.observe(\r\n rootElement,\r\n { childList: true, subtree: true });\r\n\r\n // Watch for when the root element is first made visible. For example,\r\n // after the select control finishes loading\r\n this.visibilityObserver.observe(rootElement);\r\n\r\n rootElement.addEventListener('focusin', this.onFocus);\r\n rootElement.addEventListener('focusout', this.onBlur);\r\n rootElement.addEventListener('keydown', this.onKeyDown);\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n this.domObserver.disconnect();\r\n this.visibilityObserver.disconnect();\r\n\r\n const rootElement: HTMLElement = this.rootElement;\r\n rootElement.removeEventListener('focusin', this.onFocus);\r\n rootElement.removeEventListener('focusout', this.onBlur);\r\n rootElement.removeEventListener('keydown', this.onKeyDown);\r\n }\r\n\r\n public render(): JSX.Element | null\r\n {\r\n const {\r\n children,\r\n childSelector,\r\n classes,\r\n className,\r\n rootSelector,\r\n ...divProps\r\n } = this.props;\r\n\r\n const rootClasses: string[] = [classes.root];\r\n if (className)\r\n {\r\n rootClasses.push(className);\r\n }\r\n\r\n return (\r\n \r\n \r\n {children}\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(KeyboardNavigationGroup);\r\n","import * as muiDialogActions from '@material-ui/core/DialogActions';\r\nimport { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport { CustomTheme } from '../muiTheme';\r\n\r\ninterface Props extends muiDialogActions.DialogActionsProps\r\n{\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n root:\r\n {\r\n '& > *':\r\n {\r\n '&:first-child':\r\n {\r\n marginLeft: 0,\r\n },\r\n\r\n marginRight: 0,\r\n\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.closelyRelated.xs,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.closelyRelated.sm,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.closelyRelated.md,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.closelyRelated.lg,\r\n },\r\n },\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n marginBottom: theme.dialog.padding.xs,\r\n marginLeft: theme.dialog.padding.xs,\r\n marginRight: theme.dialog.padding.xs,\r\n // Space for button shadow\r\n marginTop: theme.verticalSpacing.related.xs - 4,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n marginBottom: theme.dialog.padding.sm,\r\n marginLeft: theme.dialog.padding.sm,\r\n marginRight: theme.dialog.padding.sm,\r\n marginTop: theme.verticalSpacing.related.sm - 4,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n marginTop: theme.verticalSpacing.related.md - 4,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginTop: theme.verticalSpacing.related.lg - 4,\r\n },\r\n },\r\n });\r\n\r\nexport class DialogActions extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(DialogActions);\r\n","import * as muiFade from '@material-ui/core/Fade';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiFade.FadeProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Fade extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (!('in' in _props))\r\n {\r\n _props.in = true;\r\n }\r\n\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Fade);\r\n","export default class MaskingStore\r\n{\r\n private static numberOpen: number = 0;\r\n\r\n public static maskClosed()\r\n {\r\n MaskingStore.numberOpen--;\r\n\r\n if (MaskingStore.numberOpen < 0)\r\n {\r\n // Reset count so the store does not enter an invalid state if the\r\n // thrown exception is handled.\r\n MaskingStore.numberOpen = 0;\r\n\r\n if (process.env.NODE_ENV !== 'production')\r\n {\r\n throw 'Mask closed when it was never opened';\r\n }\r\n }\r\n\r\n if (MaskingStore.numberOpen === 0)\r\n {\r\n document.body.classList.add('disableDialogNoScroll');\r\n }\r\n }\r\n\r\n public static maskOpened()\r\n {\r\n if (MaskingStore.numberOpen === 0)\r\n {\r\n document.body.classList.remove('disableDialogNoScroll');\r\n }\r\n\r\n MaskingStore.numberOpen++;\r\n }\r\n}\r\n","import * as muiGrid from '@material-ui/core/Grid';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiGrid.GridProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n item:\r\n {\r\n },\r\n });\r\n\r\nexport class GridItem extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(GridItem);\r\n","import AppServer, { State as AppServerState } from '../core/AppServer';\r\nimport RequestPromise from '../core/RequestPromise';\r\nimport Sys, { BusinessError } from '../core/Sys';\r\nimport BaseService from './BaseService';\r\n\r\ninterface ForIdExternalResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n newObjectHandle: string;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface ForIdInternalResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n newObjectHandle: string;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface ForInContextEditNameResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n endPointId: number;\r\n layoutId: number;\r\n objectDefId: number;\r\n objectHandle: string;\r\n validationErrors: string[];\r\n}\r\n\r\ninterface ForJobProcessResponse {\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n newObjectDefId: number;\r\n newObjectHandle: string;\r\n presentationId: number;\r\n validationErrors: string[];\r\n}\r\n\r\nexport interface ForNameResponse\r\n{\r\n appServerState: AppServerState;\r\n businessErrors: BusinessError[];\r\n endPointId: number | null;\r\n newObjectDefId: number;\r\n newObjectHandle: string;\r\n presentationId: number;\r\n validationErrors: string[];\r\n}\r\n\r\nexport default class NewObjectService\r\n{\r\n public static forIdExternal(\r\n newObjectDefId: number,\r\n presentationId: number,\r\n fromObjectId: number | null,\r\n endPointId: number | null,\r\n parameters: string | null\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `NewObject/ForIdExternal/${newObjectDefId}/${presentationId}`,\r\n null,\r\n null,\r\n {\r\n endPointId,\r\n fromObjectId,\r\n parameters,\r\n },\r\n 'POST');\r\n }\r\n\r\n public static forIdInternal(\r\n fromPaneUseKey: string,\r\n fromRowKey: string,\r\n fromWidgetId: number,\r\n newObjectHandle: string\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n 'NewObject/ForIdInternal',\r\n null,\r\n null,\r\n {\r\n appServerState: AppServer.getState(),\r\n fromPaneUseKey,\r\n fromRowKey,\r\n fromWidgetId,\r\n newObjectHandle,\r\n },\r\n 'POST');\r\n }\r\n\r\n public static forJobProcessById(\r\n processTypeId: number,\r\n presentationId: number,\r\n jobId: number,\r\n parameters: string | null\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `NewObject/ForJobProcessById/${processTypeId}/${presentationId}`,\r\n null,\r\n null,\r\n {\r\n jobId,\r\n parameters,\r\n },\r\n 'POST');\r\n }\r\n\r\n public static forJobProcessByName(\r\n processTypeName: string,\r\n presentationName: string,\r\n jobId: number,\r\n parameters: string | null\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `NewObject/ForJobProcessByName/${processTypeName}/${presentationName}`,\r\n null,\r\n null,\r\n {\r\n jobId,\r\n parameters,\r\n },\r\n 'POST');\r\n }\r\n\r\n public static forName(\r\n objectDefName: string,\r\n presentationName: string,\r\n fromObjectId: number | null,\r\n endPointName: string | null,\r\n parameters: string | null\r\n ): RequestPromise\r\n {\r\n return BaseService.requestObject(\r\n `NewObject/ForName/${objectDefName}/${presentationName}`,\r\n null,\r\n null,\r\n {\r\n endPointName,\r\n fromObjectId,\r\n parameters,\r\n },\r\n 'POST');\r\n }\r\n\r\n public static navigateToNewObject(newObjectId: string, layoutId: string)\r\n {\r\n Sys.ignoreChanges = true;\r\n const url = `/object/${newObjectId}/${layoutId}`;\r\n\r\n // Don't refresh the page so state like current wizard step is preserved\r\n Sys.setHash(url, false, false, true);\r\n }\r\n}\r\n","export interface LayoutState\r\n{\r\n selectedTabs: { [tabControlKey: string]: string | null };\r\n selectedWizardStep: string | null;\r\n}\r\n\r\nexport default class LayoutStateStore\r\n{\r\n private static currentState: LayoutState =\r\n { selectedTabs: {}, selectedWizardStep: null };\r\n\r\n public static getCurrentState(): LayoutState\r\n {\r\n return LayoutStateStore.currentState;\r\n }\r\n\r\n public static setSelectedStep(\r\n selectedStepPaneUseKey: string | null)\r\n {\r\n LayoutStateStore.currentState.selectedWizardStep = selectedStepPaneUseKey;\r\n }\r\n\r\n public static setSelectedTab(\r\n dataId: string,\r\n controlName: string,\r\n selectedTabPaneUseKey: string | null)\r\n {\r\n LayoutStateStore.currentState.selectedTabs[\r\n `${dataId}_${controlName}`] = selectedTabPaneUseKey;\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport Presentation from '../coreui/Presentation';\r\nimport ErrorBoundary from './ErrorBoundary';\r\n\r\ninterface Props\r\n{\r\n presentationId?: number;\r\n}\r\n\r\nclass Panel extends\r\n React.PureComponent\r\n{\r\n public componentDidMount()\r\n {\r\n // Only track panels that are rendered for a presentation.\r\n if (this.props.presentationId)\r\n {\r\n Presentation.currentComponent = this;\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (this.props.presentationId)\r\n {\r\n Presentation.currentComponent = undefined;\r\n Presentation.currentPresentationId = undefined;\r\n\r\n // Wait until presentation is fully unmounted before clearing data.\r\n // This prevents data changed handlers from firing during unmounting\r\n const presentationId = this.props.presentationId.toString();\r\n setTimeout(() => Presentation.clearPaneData(presentationId));\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n if (this.props.presentationId)\r\n {\r\n Presentation.currentPresentationId = this.props.presentationId;\r\n }\r\n\r\n const result: React.ReactNode =
{this.props.children}
;\r\n\r\n if (process.env.NODE_ENV !== 'production')\r\n {\r\n return {result};\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default Panel;\r\n","import * as muiInput from '@material-ui/core/Input';\r\nimport { InputBaseComponentProps } from '@material-ui/core/InputBase';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\n// @ts-ignore\r\nimport imask from 'imask';\r\nimport * as React from 'react';\r\n// @ts-ignore\r\nimport { IMaskInput } from 'react-imask';\r\nimport Sys from '../core/Sys';\r\nimport Api from '../mustangui/Api';\r\nimport InputAdornment from './InputAdornment';\r\n\r\ninterface MaskedPattern\r\n{\r\n isComplete: boolean;\r\n mask: string;\r\n unmaskedValue: string;\r\n value: string;\r\n}\r\n\r\ninterface Props\r\n{\r\n dataCase: 'lower' | 'UPPER' | 'Any';\r\n errors?: string[];\r\n helperText?: string;\r\n icon?: string;\r\n iconColor?: string;\r\n InputProps?: Partial;\r\n inputRef?: (r: HTMLInputElement) => void;\r\n label?: string;\r\n mask: string;\r\n name?: string;\r\n onChange: (value: string) => void;\r\n required?: boolean;\r\n style?: React.CSSProperties;\r\n value: string;\r\n variant?: 'filled';\r\n}\r\n\r\ninterface State\r\n{\r\n lazy?: boolean;\r\n localErrors?: string[];\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n startAdornment:\r\n {\r\n fontSize: 12,\r\n height: 12,\r\n marginLeft: 24,\r\n marginRight: '.4em',\r\n },\r\n });\r\n\r\nexport class EditMask extends\r\n React.PureComponent, State>\r\n{\r\n private static readonly patternDefinitions =\r\n {\r\n '#': /\\d/,\r\n '@': /[A-Za-z]/,\r\n a: /[A-Za-z0-9]/,\r\n A: /[A-Za-z0-9]/,\r\n x: /\\S/,\r\n X: /\\S/,\r\n };\r\n private readonly componentId: string;\r\n private customInputRef: { maskValue: string } | null = null;\r\n private isFocused = false;\r\n private patternMask: MaskedPattern | null = null;\r\n private readonly placeholderChar = '_';\r\n\r\n private static createMaskedPattern(\r\n mask: string,\r\n placeholderChar: string\r\n ): MaskedPattern\r\n {\r\n return new imask.MaskedPattern({\r\n definitions: EditMask.patternDefinitions,\r\n lazy: false,\r\n mask,\r\n placeholderChar,\r\n });\r\n }\r\n\r\n public static formatValue(mask: string, value: string): string\r\n {\r\n const patternMask = EditMask.createMaskedPattern(mask, ' ');\r\n\r\n patternMask.unmaskedValue = value;\r\n\r\n return patternMask.value;\r\n }\r\n\r\n public static getErrors(\r\n mask: string,\r\n value: string | null,\r\n patternMask: MaskedPattern | null = null\r\n ): string[]\r\n {\r\n if (!value)\r\n {\r\n return [];\r\n }\r\n\r\n const result: string[] = [];\r\n\r\n let maskedPattern = patternMask;\r\n if (!maskedPattern)\r\n {\r\n maskedPattern = EditMask.createMaskedPattern(mask, ' ');\r\n }\r\n maskedPattern.unmaskedValue = value;\r\n\r\n if (!maskedPattern.isComplete)\r\n {\r\n result.push(Sys.getTranslation('Value must be completely filled'));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { lazy: true, localErrors: [] };\r\n this.componentId = `edit-mask-${Sys.nextId}`;\r\n }\r\n\r\n private createCustomInput = (\r\n props: InputBaseComponentProps\r\n ): JSX.Element =>\r\n {\r\n const { onChange, ...other } = props;\r\n\r\n return (\r\n \r\n {\r\n switch (this.props.dataCase)\r\n {\r\n case 'lower':\r\n return v.toLowerCase();\r\n case 'UPPER':\r\n return v.toUpperCase();\r\n default:\r\n return v;\r\n }\r\n }}\r\n ref={(ref: { maskValue: string }) =>\r\n {\r\n this.customInputRef = ref;\r\n }}\r\n unmask={true}\r\n />\r\n );\r\n };\r\n\r\n private onBlur = () =>\r\n {\r\n this.isFocused = false;\r\n this.setLocalErrors();\r\n this.setLazy();\r\n };\r\n\r\n private onChange = () =>\r\n {\r\n this.props.onChange(this.customInputRef!.maskValue);\r\n };\r\n\r\n private onFocus = () =>\r\n {\r\n this.isFocused = true;\r\n this.setLazy();\r\n };\r\n\r\n private setLazy()\r\n {\r\n this.setState({ lazy: this.isFocused ? false : !this.props.value });\r\n }\r\n\r\n private setLocalErrors()\r\n {\r\n const localErrors: string[] = EditMask.getErrors(\r\n this.props.mask, this.props.value, this.patternMask);\r\n\r\n this.setState({ localErrors });\r\n }\r\n\r\n public componentDidMount()\r\n {\r\n this.patternMask = EditMask.createMaskedPattern(\r\n this.props.mask, this.placeholderChar);\r\n\r\n this.setLazy();\r\n }\r\n\r\n public componentDidUpdate(prevProps: Props)\r\n {\r\n if (this.props.value !== prevProps.value)\r\n {\r\n this.setLazy();\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const helperTextProps = { error: false, helperText: '' };\r\n let result: React.ReactNode = null;\r\n\r\n if (this.props.errors)\r\n {\r\n let errors: string[] = [...this.props.errors];\r\n errors = errors.concat(this.state.localErrors!);\r\n\r\n Api.setHelperText(this, errors, helperTextProps);\r\n }\r\n\r\n let startAdornment: React.ReactNode;\r\n if (this.props.icon)\r\n {\r\n startAdornment =\r\n ;\r\n }\r\n\r\n // The following is required because setting the variant property\r\n // dynamically causes mui to cast the component to the wrong type.\r\n if (this.props.variant === 'filled')\r\n {\r\n result =\r\n ;\r\n }\r\n else\r\n {\r\n result =\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(EditMask);\r\n","import * as Modal from '@material-ui/core/Modal/Modal';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport withWidth, { WithWidth } from '@material-ui/core/withWidth';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Logging from '../core/Logging';\r\nimport Sys from '../core/Sys';\r\nimport Hidden from '../coreui/Hidden';\r\nimport Presentation from '../coreui/Presentation';\r\nimport RoundTripService from '../services/RoundTripService';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface ConfigurationProps\r\n{\r\n addOnConfiguration: string;\r\n addOnDescription: string;\r\n addOnName: string;\r\n breakPoints: BreakPoints;\r\n componentTypeName: string;\r\n dataId: string;\r\n expansionSize: 'Dialog' | 'Full';\r\n name: string;\r\n}\r\n\r\ninterface BreakPoints\r\n{\r\n lg: { height: number; visible: boolean };\r\n md: { height: number; visible: boolean };\r\n sm: { height: number; visible: boolean };\r\n xl: { height: number; visible: boolean };\r\n xs: { height: number; visible: boolean };\r\n}\r\n\r\ninterface PosseApi\r\n{\r\n _isLoaded: () => boolean;\r\n _refresh: () => void;\r\n _roundTripStarting: () => void;\r\n _setConfiguration: (name: string) => void;\r\n _setReadOnly: (readOnly: boolean) => void;\r\n _showData: () => void;\r\n}\r\n\r\ninterface RuntimeProperties\r\n{\r\n accessLevel: AccessLevel;\r\n addOnUrl: string;\r\n objectHandle: string;\r\n processHandle: string;\r\n}\r\n\r\ninterface State\r\n{\r\n expanded: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n addon:\r\n {\r\n borderWidth: 0,\r\n flex: 'auto',\r\n height: '100%',\r\n },\r\n dialog:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: '100vh !important',\r\n left: '0px !important',\r\n maxHeight: 'none',\r\n top: '0px !important',\r\n width: '100% !important',\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n // eslint-disable-next-line max-len\r\n boxShadow: '0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)',\r\n transform: 'translate(-50%, -50%)',\r\n transformStyle: 'preserve-3d',\r\n },\r\n left: '50vw !important',\r\n maxHeight: '88vh',\r\n top: '50vh !important',\r\n width: '600px !important',\r\n },\r\n fixed:\r\n {\r\n marginTop: '0px !important',\r\n position: 'fixed',\r\n zIndex: 1500,\r\n },\r\n full:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: '100vh !important',\r\n left: '0px !important',\r\n maxHeight: 'none',\r\n top: '0px !important',\r\n width: '100% !important',\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n // eslint-disable-next-line max-len\r\n boxShadow: '0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12)',\r\n },\r\n height: '88vh !important',\r\n left: '6vw !important',\r\n top: '6vh !important',\r\n width: '88vw !important',\r\n },\r\n root:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n // eslint-disable-next-line max-len\r\n transition: 'box-shadow 1500ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, height 500ms, left 500ms, top 500ms, transform 500ms, width 500ms',\r\n },\r\n });\r\n\r\n@observer\r\nexport class EmbeddedAddOn extends\r\n React.Component<\r\n ConfigurationProps & WithStyles & WithWidth, State>\r\n{\r\n public static instances = new Map();\r\n private addOnConfiguration: string;\r\n private addOnUrl: string;\r\n private api: PosseApi;\r\n private breakPoints: BreakPoints;\r\n private callDeferTimeout: number = 30000;\r\n private deferredCalls = new Map();\r\n private expanded: boolean = false;\r\n private hostId: string;\r\n private lastObjectHandle: string | null = null;\r\n private lastState: State;\r\n private queryArgs: string;\r\n private scrollTop: number;\r\n public callDeferPeriod: number = 100;\r\n public filler: React.RefObject;\r\n public host: React.RefObject;\r\n\r\n public constructor(\r\n props: ConfigurationProps & WithStyles & WithWidth)\r\n {\r\n super(props);\r\n this.state = { expanded: false };\r\n this.lastState = { ...this.state };\r\n this.breakPoints = { ...props.breakPoints };\r\n\r\n if (!window['mustang']['embeddedAddOns'])\r\n {\r\n window['mustang']['embeddedAddOns'] = EmbeddedAddOn.instances;\r\n }\r\n\r\n this.addOnConfiguration = props.addOnConfiguration;\r\n this.filler = React.createRef();\r\n this.host = React.createRef();\r\n\r\n this.hostId = `${props.dataId}:${props.name}`;\r\n this.queryArgs =\r\n `PosseAddOnName=${encodeURIComponent(props.addOnName)}`\r\n + '&PosseAddOnDescription='\r\n + `${encodeURIComponent(props.addOnDescription)}`\r\n + `&PosseAddOnHostId=${encodeURIComponent(this.hostId)}`;\r\n\r\n EmbeddedAddOn.instances.set(this.hostId, this);\r\n }\r\n\r\n private clearDefer(callName: string)\r\n {\r\n if (this.deferredCalls.has(callName))\r\n {\r\n this.deferredCalls.delete(callName);\r\n }\r\n }\r\n\r\n private getApi(): PosseApi | null\r\n {\r\n let result: PosseApi | null = null;\r\n\r\n // eslint-disable-next-line no-underscore-dangle\r\n if (this.api && this.api._isLoaded())\r\n {\r\n result = this.api;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private refresh()\r\n {\r\n const callName: string = `refresh for ${this.props.name}`;\r\n const api: PosseApi | null = this.getApi();\r\n\r\n if (api)\r\n {\r\n this.clearDefer(callName);\r\n // eslint-disable-next-line no-underscore-dangle\r\n api._refresh();\r\n }\r\n else\r\n {\r\n this.defer(this.refresh, arguments, callName);\r\n }\r\n }\r\n\r\n private setReadOnly(readOnly: boolean)\r\n {\r\n const callName: string = `setReadOnly for ${this.props.name}`;\r\n const api: PosseApi | null = this.getApi();\r\n\r\n if (api)\r\n {\r\n this.clearDefer(callName);\r\n // eslint-disable-next-line no-underscore-dangle\r\n api._setReadOnly(readOnly);\r\n }\r\n else\r\n {\r\n this.defer(this.setReadOnly, arguments, callName);\r\n }\r\n }\r\n\r\n private showData()\r\n {\r\n const callName: string = `showData for ${this.props.name}`;\r\n const api: PosseApi | null = this.getApi();\r\n\r\n if (api)\r\n {\r\n this.clearDefer(callName);\r\n // eslint-disable-next-line no-underscore-dangle\r\n api._showData();\r\n }\r\n else\r\n {\r\n this.defer(this.showData, arguments, callName);\r\n }\r\n }\r\n\r\n public addOnLoaded(api: PosseApi)\r\n {\r\n this.api = api;\r\n // eslint-disable-next-line no-underscore-dangle\r\n this.getApi()!._setConfiguration(this.addOnConfiguration);\r\n }\r\n\r\n public collapse()\r\n {\r\n if (!this.expanded)\r\n {\r\n return;\r\n }\r\n\r\n this.expanded = false;\r\n\r\n if (this.host.current && this.filler.current)\r\n {\r\n const rect = this.filler.current.getBoundingClientRect();\r\n const height = this.breakPoints[this.props.width].height;\r\n\r\n this.filler.current.style.height = `${height || rect.height}px`;\r\n this.host.current.style.height = `${rect.height}px`;\r\n this.host.current.style.left = `${this.filler.current.offsetLeft}px`;\r\n this.host.current.style.top =\r\n `${this.filler.current.offsetTop - this.scrollTop}px`;\r\n this.host.current.style.width = `${rect.width}px`;\r\n\r\n setTimeout(\r\n () =>\r\n {\r\n document.body.classList.add('disableDialogNoScroll');\r\n\r\n if (this.host.current)\r\n {\r\n if (this.props.expansionSize === 'Dialog')\r\n {\r\n this.host.current.classList.remove(\r\n this.props.classes.dialog);\r\n }\r\n else\r\n {\r\n this.host.current.classList.remove(\r\n this.props.classes.full);\r\n }\r\n\r\n // Must run after animation is complete.\r\n setTimeout(\r\n () =>\r\n {\r\n this.setState({ expanded: false });\r\n\r\n if (this.host.current)\r\n {\r\n this.host.current.classList.remove(\r\n this.props.classes.fixed);\r\n this.host.current.style.width = '';\r\n }\r\n },\r\n 600);\r\n }\r\n },\r\n 100);\r\n }\r\n }\r\n\r\n public componentWillUnmount()\r\n {\r\n if (EmbeddedAddOn.instances.has(this.hostId))\r\n {\r\n EmbeddedAddOn.instances.delete(this.hostId);\r\n }\r\n }\r\n\r\n public configurationChanged(configurationName: string)\r\n {\r\n this.addOnConfiguration = configurationName;\r\n }\r\n\r\n public defer(method: Function, args: IArguments, callName: string)\r\n {\r\n let ok: boolean = true;\r\n\r\n if (callName)\r\n {\r\n if (this.deferredCalls.has(callName))\r\n {\r\n if ((new Date().getTime() - this.deferredCalls.get(callName)!) >\r\n this.callDeferTimeout)\r\n {\r\n this.clearDefer(callName);\r\n ok = false;\r\n Sys.showErrors(\r\n [`Deferred function call ${callName} timed out`]);\r\n }\r\n }\r\n else\r\n {\r\n this.deferredCalls.set(callName, new Date().getTime());\r\n }\r\n }\r\n\r\n if (ok)\r\n {\r\n Sys.defer(method, this.callDeferPeriod, this, args);\r\n }\r\n }\r\n\r\n public expand()\r\n {\r\n if (this.expanded)\r\n {\r\n return;\r\n }\r\n\r\n this.expanded = true;\r\n\r\n if (this.host.current && this.filler.current)\r\n {\r\n const rect = this.host.current.getBoundingClientRect();\r\n\r\n this.scrollTop = document.body.scrollTop\r\n || document.documentElement!.scrollTop;\r\n this.filler.current.style.height = `${rect.height}px`;\r\n this.host.current.style.height = `${rect.height}px`;\r\n this.host.current.style.left = `${this.host.current.offsetLeft}px`;\r\n this.host.current.style.top =\r\n `${this.host.current.offsetTop - this.scrollTop}px`;\r\n this.host.current.style.width = `${rect.width}px`;\r\n\r\n setTimeout(\r\n () =>\r\n {\r\n document.body.classList.remove('disableDialogNoScroll');\r\n\r\n if (this.host.current)\r\n {\r\n this.setState({ expanded: true });\r\n\r\n if (this.props.expansionSize === 'Dialog')\r\n {\r\n this.host.current.classList.add(\r\n this.props.classes.dialog,\r\n this.props.classes.fixed);\r\n }\r\n else\r\n {\r\n this.host.current.classList.add(\r\n this.props.classes.full,\r\n this.props.classes.fixed);\r\n }\r\n }\r\n },\r\n 100);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getDataBuffer(): any\r\n {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n let result: any = Presentation.getValue(this.props);\r\n\r\n if (result && typeof result === 'string')\r\n {\r\n try\r\n {\r\n result = JSON.parse(result);\r\n }\r\n catch\r\n {\r\n /* Do nothing */\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getObjectBuffer(): object[] | null\r\n {\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n let result: object[] | null = null;\r\n if (runtimeProperties)\r\n {\r\n result =\r\n [\r\n {\r\n componentTypeName: this.props.componentTypeName,\r\n objectHandle: runtimeProperties.objectHandle,\r\n processHandle: runtimeProperties.processHandle,\r\n },\r\n ];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public isExpanded(): boolean\r\n {\r\n return this.expanded;\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const runtimeProperties =\r\n Api.getWidgetProperties(_props) as RuntimeProperties;\r\n\r\n if (runtimeProperties.addOnUrl.includes('?'))\r\n {\r\n this.addOnUrl = `${runtimeProperties.addOnUrl}&${this.queryArgs}`;\r\n }\r\n else\r\n {\r\n this.addOnUrl = `${runtimeProperties.addOnUrl}?${this.queryArgs}`;\r\n }\r\n\r\n if (!runtimeProperties)\r\n {\r\n return null;\r\n }\r\n\r\n if (runtimeProperties.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n // Force a render when the pane data is refreshed.\r\n Presentation.getValue(_props);\r\n\r\n if (this.lastState.expanded === this.state.expanded)\r\n {\r\n // Don't execute if we are changing the expanded state.\r\n this.setReadOnly(runtimeProperties.accessLevel\r\n === AccessLevel.readOnly);\r\n\r\n // Call showData the first time an object is rendered.\r\n if (this.lastObjectHandle === runtimeProperties.objectHandle)\r\n {\r\n this.refresh();\r\n }\r\n else\r\n {\r\n this.lastObjectHandle = runtimeProperties.objectHandle;\r\n this.showData();\r\n }\r\n }\r\n else\r\n {\r\n this.lastState = { ...this.state };\r\n }\r\n\r\n const height = this.breakPoints[this.props.width].height;\r\n const standbox = 'allow-forms allow-modals allow-popups '\r\n + 'allow-popups-to-escape-sandbox allow-same-origin allow-scripts '\r\n + 'allow-top-navigation-by-user-activation';\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n public roundTrip()\r\n {\r\n return RoundTripService.standardRoundTrip(\r\n 'EmbeddedAddOn/OnRoundTrip',\r\n this.props\r\n ).catch((response) =>\r\n {\r\n Logging.error(response);\r\n return response;\r\n });\r\n }\r\n\r\n public roundTripStarting()\r\n {\r\n const api: PosseApi | null = this.getApi();\r\n const runtimeProperties =\r\n Api.getWidgetProperties(this.props) as RuntimeProperties;\r\n\r\n // If the addon is not available then there won't be any pending changes.\r\n if (api && runtimeProperties.accessLevel >= AccessLevel.enterable)\r\n {\r\n // eslint-disable-next-line no-underscore-dangle\r\n api._roundTripStarting();\r\n }\r\n }\r\n\r\n public setBusy(busy: boolean)\r\n {\r\n if (busy)\r\n {\r\n setTimeout(() =>\r\n {\r\n RequestsStore.instance.processingStarted();\r\n });\r\n }\r\n else\r\n {\r\n setTimeout(() =>\r\n {\r\n if (RequestsStore.instance.processingInfo.isProcessing)\r\n {\r\n RequestsStore.instance.processingStopped();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public setDataBuffer(value: any)\r\n {\r\n Presentation.setValue(this.props, value ?\r\n JSON.stringify(value) : value);\r\n }\r\n\r\n public setHeight(height: number)\r\n {\r\n this.breakPoints.xl.height = height;\r\n this.breakPoints.lg.height = height;\r\n this.breakPoints.md.height = height;\r\n this.breakPoints.sm.height = height;\r\n this.breakPoints.xs.height = height;\r\n\r\n if (this.host.current)\r\n {\r\n this.host.current.style.height = `${height}px`;\r\n }\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(withWidth()(EmbeddedAddOn));\r\n","import * as muiGrid from '@material-ui/core/Grid';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiGrid.GridProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n container:\r\n {\r\n },\r\n });\r\n\r\nexport class Grid extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Grid);\r\n","import grey from '@material-ui/core/colors/grey';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport ComboBoxOption from '../coreui/ComboBoxOption';\r\nimport Icon from '../coreui/Icon';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport MenuItem from '../coreui/MenuItem';\r\nimport Presentation from '../coreui/Presentation';\r\nimport { TableVerticalLayoutProps } from '../coreui/Table';\r\nimport Typography from '../coreui/Typography';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\nexport interface ApiSelectProps\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n dataId: string;\r\n disabledHelpText: string;\r\n helperText: string;\r\n label: string;\r\n name: string;\r\n onSelect?: React.ChangeEventHandler<\r\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>;\r\n options: ComboBoxOption[];\r\n propagated?: TableVerticalLayoutProps;\r\n roundTripOnChange: boolean;\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 57px)',\r\n },\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 57px) * 1.333)',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ApiSelect extends\r\n React.Component, State>\r\n{\r\n private static openInstance: ApiSelect | null;\r\n protected muiProps: muiTextField.TextFieldProps;\r\n\r\n public static closeAll()\r\n {\r\n if (ApiSelect.openInstance)\r\n {\r\n ApiSelect.openInstance.close(true);\r\n }\r\n }\r\n\r\n public constructor(props: ApiSelectProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isOpen: false };\r\n\r\n this.muiProps =\r\n {\r\n autoFocus: props['autoFocus'],\r\n // Required so that when the help is an ul the dom is valid.\r\n FormHelperTextProps:\r\n {\r\n component: 'div',\r\n style:\r\n {\r\n marginLeft: 16,\r\n marginRight: 16,\r\n },\r\n },\r\n fullWidth: true,\r\n id: `select-${Sys.nextId}`,\r\n label: props.label,\r\n name: props.name,\r\n onChange: props.onSelect,\r\n select: true,\r\n variant: 'filled',\r\n };\r\n\r\n this.muiProps.SelectProps =\r\n {\r\n autoWidth: true,\r\n displayEmpty: true,\r\n IconComponent: () => (\r\n ),\r\n MenuProps:\r\n {\r\n anchorOrigin: { horizontal: 'left', vertical: 'bottom' },\r\n getContentAnchorEl: undefined,\r\n },\r\n onClose: () => this.close(false),\r\n onOpen: () => this.open(),\r\n };\r\n }\r\n\r\n public close(disableRestoreFocus: boolean)\r\n {\r\n this.muiProps.SelectProps!.MenuProps!.disableRestoreFocus =\r\n disableRestoreFocus;\r\n ApiSelect.openInstance = null;\r\n this.setState({ isOpen: false });\r\n }\r\n\r\n public open()\r\n {\r\n if (this.props.options.length > 0)\r\n {\r\n ApiSelect.openInstance = this;\r\n this.setState({ isOpen: true });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n if (this.props.accessLevel === AccessLevel.hidden)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n this.muiProps.SelectProps!.open = this.state.isOpen;\r\n\r\n this.muiProps.InputLabelProps = {\r\n classes:\r\n {\r\n root: _props.classes.inputLabelRoot,\r\n shrink: _props.classes.inputLabelShrink,\r\n },\r\n };\r\n\r\n if (this.props.accessLevel === AccessLevel.disabled)\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.required = false;\r\n this.muiProps.helperText = null;\r\n\r\n const _muiProps = { ...this.muiProps };\r\n _muiProps.SelectProps = { ..._muiProps.SelectProps };\r\n _muiProps.SelectProps.value = '';\r\n\r\n if (this.props.showDisabledHelp)\r\n {\r\n return (\r\n \r\n \r\n {[]}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {[]}\r\n );\r\n }\r\n\r\n const value = Presentation.getValue(_props);\r\n if (this.props.accessLevel === AccessLevel.readOnly)\r\n {\r\n const option = this.props.options.find(o => o.value === value);\r\n\r\n return (\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {option ? option.display : '-'}\r\n \r\n
);\r\n }\r\n\r\n this.muiProps.disabled = false;\r\n this.muiProps.required = this.props.showAsMandatory;\r\n this.muiProps.style = undefined;\r\n this.muiProps['value'] = value;\r\n\r\n Api.setHelperText(this, this.props.businessErrors, this.muiProps);\r\n\r\n return (\r\n \r\n {\r\n this.props.options.map(o => (\r\n \r\n {(o.value || this.state.isOpen) ? o.display : null}\r\n ))\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ApiSelect);\r\n","export default class RequestPromise extends Promise\r\n{\r\n private onAbort: () => void;\r\n\r\n public constructor(\r\n executor: (\r\n resolve: (value?: T | PromiseLike) => void,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n reject: (reason?: any) => void\r\n ) => void,\r\n onAbort: () => void)\r\n {\r\n super(executor);\r\n this.onAbort = onAbort;\r\n }\r\n\r\n public abort()\r\n {\r\n this.onAbort();\r\n }\r\n\r\n public catch(\r\n onrejected?:\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n ((reason: any) => TResult | PromiseLike) | undefined | null\r\n ): RequestPromise\r\n {\r\n const promise = super.catch(onrejected) as RequestPromise;\r\n promise.onAbort = this.onAbort;\r\n return promise;\r\n }\r\n\r\n public finally(onfinally?: (() => void) | undefined | null): RequestPromise\r\n {\r\n const promise = super.finally(onfinally) as RequestPromise;\r\n promise.onAbort = this.onAbort;\r\n return promise;\r\n }\r\n\r\n public then(\r\n onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n onrejected?: ((reason: any) => TResult2 | PromiseLike) | null\r\n ): RequestPromise\r\n {\r\n const promise = super.then(\r\n onfulfilled,\r\n onrejected\r\n ) as RequestPromise;\r\n\r\n promise.onAbort = this.onAbort;\r\n return promise;\r\n }\r\n}\r\n","import { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { CustomTheme, getPanelMeasurements, PanelMeasurements }\r\n from '../../muiTheme';\r\n\r\nexport default class PaperClasses\r\n{\r\n private static readonly supportedColumnWidths = [3, 4, 5, 6, 8];\r\n\r\n public static create(theme: CustomTheme): {}\r\n {\r\n const paperClasses =\r\n {\r\n 'paper-alt-color-lg':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n },\r\n 'paper-color-lg':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n },\r\n 'paper-lg':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n padding: theme.paper.padding.lg,\r\n },\r\n },\r\n 'paper-md':\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n padding: theme.paper.padding.md,\r\n },\r\n },\r\n 'paper-sm':\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n padding: theme.paper.padding.sm,\r\n },\r\n },\r\n 'paper-xs':\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginLeft: theme.horizontalSpacing.related.xs,\r\n marginRight: theme.horizontalSpacing.related.xs,\r\n padding: theme.paper.padding.xs,\r\n },\r\n },\r\n };\r\n\r\n for (const breakPoint of ['md', 'sm', 'xs'] as Breakpoint[])\r\n {\r\n paperClasses[`paper-color-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n };\r\n paperClasses[`paper-alt-color-${breakPoint}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]:\r\n {\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n };\r\n }\r\n\r\n for (const breakPoint of theme.widthBreakPoints)\r\n {\r\n const measurements: PanelMeasurements =\r\n getPanelMeasurements(theme, breakPoint);\r\n\r\n for (const columns of PaperClasses.supportedColumnWidths)\r\n {\r\n const gutters = columns - 1;\r\n const gutterWidth = gutters * measurements.gutterWidth;\r\n const columnWidth = columns * measurements.columnWidth;\r\n const width: number = columnWidth + gutterWidth;\r\n\r\n if (breakPoint === 'lg')\r\n {\r\n paperClasses[`paper-lg-${columns}`] =\r\n {\r\n [theme.breakpoints.up('lg')]: { width },\r\n };\r\n }\r\n else\r\n {\r\n paperClasses[`paper-${breakPoint}-${columns}`] =\r\n {\r\n [theme.breakpoints.only(breakPoint)]: { width },\r\n };\r\n }\r\n }\r\n }\r\n\r\n return paperClasses;\r\n }\r\n\r\n public static get(\r\n breakPoint: Breakpoint,\r\n columns: 4 | 5 | 6,\r\n useDefaultColor: boolean,\r\n classes: {}\r\n ): string\r\n {\r\n const breakPointToUse = (breakPoint === 'xl') ? 'lg' : breakPoint;\r\n const paperClasses =\r\n [\r\n `paper-${breakPointToUse}`,\r\n `paper-${breakPointToUse}-${columns}`,\r\n ];\r\n\r\n if (useDefaultColor)\r\n {\r\n paperClasses.push(`paper-color-${breakPointToUse}`);\r\n }\r\n else\r\n {\r\n paperClasses.push(`paper-alt-color-${breakPointToUse}`);\r\n }\r\n\r\n return paperClasses.map(c => classes[c]).join(' ');\r\n }\r\n}\r\n","import { createStyles, WithStyles, withStyles } from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Grid from '../coreui/Grid';\r\nimport GridItem from '../coreui/GridItem';\r\nimport Hidden from '../coreui/Hidden';\r\nimport Typography from '../coreui/Typography';\r\nimport { CustomTheme } from '../muiTheme';\r\nimport EnvironmentBanner from './components/EnvironmentBanner';\r\nimport Logo from './components/Logo';\r\nimport CenteredContentClasses from './styles/CenteredContentClasses';\r\n\r\ninterface FooterConfig\r\n{\r\n backgroundColor: string;\r\n}\r\n\r\ninterface HeaderConfig\r\n{\r\n backgroundColor: string;\r\n bottomBorderColor: string;\r\n logoUrl: string;\r\n}\r\n\r\nexport interface ErrorPageTemplateConfig\r\n{\r\n footer: FooterConfig;\r\n header: HeaderConfig;\r\n}\r\n\r\ninterface Props\r\n{\r\n backgroundImageUrl?: string;\r\n footer?: FooterConfig;\r\n header?: HeaderConfig;\r\n message: string | null;\r\n title: string;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n backgroundImage:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n backgroundRepeat: 'no-repeat',\r\n backgroundSize: 'cover',\r\n height: '100%',\r\n position: 'fixed',\r\n width: '100%',\r\n zIndex: -1,\r\n },\r\n },\r\n footer:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n height: 68,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n height: 100,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n },\r\n header:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n height: 72,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n height: 88,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n height: 108,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n height: 140,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 4,\r\n },\r\n headerContent:\r\n {\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n height: '100%',\r\n },\r\n main:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n },\r\n mainContent:\r\n {\r\n flexGrow: 1,\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n },\r\n root:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n },\r\n title:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n { fontSize: 45, lineHeight: '60px' },\r\n [theme.breakpoints.up('sm')]:\r\n { fontSize: 56, lineHeight: '72px' },\r\n [theme.breakpoints.up('lg')]:\r\n { fontSize: 112, lineHeight: '148px' },\r\n fontWeight: 700,\r\n },\r\n ...CenteredContentClasses.create(theme),\r\n });\r\n\r\nclass ErrorPageTemplate extends\r\n React.PureComponent>\r\n{\r\n private goHome = () =>\r\n {\r\n Sys.setHash('', false, true);\r\n window.location.assign(Sys.settings.rootUrl);\r\n };\r\n\r\n public render(): React.ReactNode\r\n {\r\n let backgroundImage: React.ReactNode = null;\r\n if (this.props.backgroundImageUrl)\r\n {\r\n backgroundImage = (\r\n );\r\n }\r\n\r\n let footer: React.ReactNode = null;\r\n if (this.props.footer)\r\n {\r\n footer = (\r\n );\r\n }\r\n\r\n let header: React.ReactNode = null;\r\n if (this.props.header)\r\n {\r\n const headerContentClasses =\r\n [\r\n this.props.classes.headerContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n header = (\r\n \r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n let message: React.ReactNode = null;\r\n if (this.props.message)\r\n {\r\n message = this.props.message\r\n .split('\\n')\r\n .map((line, index) => {line}
);\r\n }\r\n\r\n return (\r\n
\r\n {backgroundImage}\r\n \r\n {header}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.title}\r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n \r\n {Sys.getTranslation('Home')}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {footer}\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ErrorPageTemplate);\r\n","import * as React from 'react';\r\nimport AppServer from '../core/AppServer';\r\nimport Sys from '../core/Sys';\r\nimport { Dialog } from '../coreui/Dialog';\r\nimport Presentation from '../coreui/Presentation';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport ErrorPageTemplate, { ErrorPageTemplateConfig }\r\n from '../templates/ErrorPageTemplate';\r\n\r\nexport interface ErrorPageConfig\r\n{\r\n background404Url: string;\r\n background408Url: string;\r\n backgroundGeneralUrl: string;\r\n template: ErrorPageTemplateConfig;\r\n}\r\n\r\nexport class ErrorPage\r\n{\r\n private static config: ErrorPageConfig | null = null;\r\n\r\n public static render(\r\n title: string,\r\n message: string | null,\r\n status: number | null)\r\n {\r\n if (Dialog.currentOpenInstance)\r\n {\r\n Dialog.currentOpenInstance.forceClose();\r\n }\r\n\r\n AppServer.clearState();\r\n Sys.clearRequestCache(false);\r\n\r\n RequestsStore.instance.clearAllProcessing();\r\n\r\n if (ErrorPage.config !== null)\r\n {\r\n let backgroundImageUrl = ErrorPage.config.backgroundGeneralUrl;\r\n if (status === 404)\r\n {\r\n backgroundImageUrl = ErrorPage.config.background404Url;\r\n }\r\n else if (status === 408)\r\n {\r\n backgroundImageUrl = ErrorPage.config.background408Url;\r\n }\r\n\r\n Presentation.render(\r\n );\r\n }\r\n else\r\n {\r\n Presentation.render(\r\n );\r\n }\r\n }\r\n\r\n public static setConfig(config: ErrorPageConfig)\r\n {\r\n if (ErrorPage.config !== null)\r\n {\r\n throw new Error('Error page config is already set');\r\n }\r\n\r\n ErrorPage.config = config;\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport Button from '../../coreui/Button';\r\nimport Dialog from '../../coreui/Dialog';\r\nimport DialogActions from '../../coreui/DialogActions';\r\nimport DialogContent from '../../coreui/DialogContent';\r\nimport Icon from '../../coreui/Icon';\r\nimport Typography from '../../coreui/Typography';\r\nimport Api from '../../mustangui/Api';\r\nimport Grid from '../../mustangui/Grid';\r\nimport GridItem from '../../mustangui/GridItem';\r\nimport ConfirmContinueStore from '../../stores/ConfirmContinueStore';\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class ConfirmContinueDialog extends\r\n React.Component>\r\n{\r\n private cancel = () =>\r\n {\r\n ConfirmContinueStore.instance.closeDialog(false);\r\n };\r\n\r\n private continue = () =>\r\n {\r\n ConfirmContinueStore.instance.closeDialog(true);\r\n };\r\n\r\n private onKeyDown = (event: React.KeyboardEvent) =>\r\n {\r\n switch (event.key)\r\n {\r\n case 'Enter':\r\n if (!('nodeName' in event.target)\r\n || event.target['nodeName'] !== 'BUTTON')\r\n {\r\n this.continue();\r\n }\r\n break;\r\n case 'Escape':\r\n this.cancel();\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n public render()\r\n {\r\n const isOpen: boolean = ConfirmContinueStore.instance.isDialogOpen;\r\n\r\n const message = Sys.getTranslation(\r\n 'All of your unsaved changes will be lost. '\r\n + 'Are your sure you want to leave this page?',\r\n 'ConfirmContinue');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {Sys.getTranslation(\r\n 'Unsaved Changes',\r\n 'ConfirmContinue')}\r\n \r\n \r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ConfirmContinueDialog);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { Breakpoint } from '@material-ui/core/styles/createBreakpoints';\r\nimport { ThemeProvider } from '@material-ui/styles';\r\nimport * as React from 'react';\r\nimport { Layout, LayoutConfig } from '../config/Layout';\r\nimport Sys from '../core/Sys';\r\nimport KeyboardNavigationGroup from '../coreui/KeyboardNavigationGroup';\r\nimport muiTheme, { CustomTheme, ForegroundColorType } from '../muiTheme';\r\nimport { ValueByBreakpoint } from '../mustangui/Api';\r\nimport SessionMessageDisplay from '../mustangui/SessionMessageDisplay';\r\nimport BackgroundImage from './components/BackgroundImage';\r\nimport ConfirmContinueDialog from './components/ConfirmContinueDialog';\r\nimport EnvironmentBanner from './components/EnvironmentBanner';\r\nimport Logo from './components/Logo';\r\nimport PageProcessing from './components/PageProcessing';\r\nimport CenteredContentClasses from './styles/CenteredContentClasses';\r\nimport PaperClasses from './styles/PaperClasses';\r\n\r\ninterface FooterConfig\r\n{\r\n backgroundColor: string;\r\n foreground: ForegroundColorType;\r\n layout: LayoutConfig;\r\n}\r\n\r\ninterface HeaderConfig\r\n{\r\n backgroundColor: string;\r\n bottomBorderColor: string;\r\n foreground: ForegroundColorType;\r\n logoUrl: string;\r\n layout: LayoutConfig;\r\n}\r\n\r\nexport interface BasePageTemplateConfig\r\n{\r\n backgroundImageUrl: string | null;\r\n footer: FooterConfig;\r\n header: HeaderConfig;\r\n}\r\n\r\ninterface Props\r\n{\r\n backgroundImageUrl: string | null;\r\n footer: FooterConfig;\r\n header: HeaderConfig;\r\n paperWidth: ValueByBreakpoint<4 | 6 | null>;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n footer:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n paddingBottom: theme.paper.padding.lg,\r\n paddingTop: theme.paper.padding.lg,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n paddingBottom: theme.paper.padding.md,\r\n paddingTop: theme.paper.padding.md,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n paddingBottom: theme.paper.padding.sm,\r\n paddingTop: theme.paper.padding.sm,\r\n },\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n paddingBottom: theme.paper.padding.xs,\r\n paddingTop: theme.paper.padding.xs,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n alignItems: 'center',\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n footerContent:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n flexBasis: '100%',\r\n },\r\n },\r\n header:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: 72,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n height: 88,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n height: 108,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n height: 140,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 4,\r\n },\r\n headerContent:\r\n {\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n height: '100%',\r\n },\r\n main:\r\n {\r\n flexGrow: 1,\r\n position: 'relative',\r\n },\r\n mainContent:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.lg,\r\n marginTop: theme.container.verticalSpacing.lg,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.md,\r\n marginTop: theme.container.verticalSpacing.md,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.sm,\r\n marginTop: theme.container.verticalSpacing.sm,\r\n },\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.xs,\r\n marginTop: theme.container.verticalSpacing.xs,\r\n },\r\n },\r\n 'paper-container-lg':\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n },\r\n 'paper-container-md':\r\n {\r\n [theme.breakpoints.only('md')]:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n },\r\n 'paper-container-sm':\r\n {\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n },\r\n 'paper-container-xs':\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n },\r\n root:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n },\r\n ...CenteredContentClasses.create(theme),\r\n ...PaperClasses.create(theme),\r\n });\r\n\r\nclass BasePageTemplate extends\r\n React.PureComponent>\r\n{\r\n private readonly footerTheme: Theme;\r\n private readonly headerTheme: Theme;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.footerTheme = muiTheme(this.props.footer.foreground, true);\r\n this.headerTheme = muiTheme(this.props.header.foreground, true);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const footerContentClasses =\r\n [\r\n this.props.classes.footerContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n const headerContentClasses =\r\n [\r\n this.props.classes.headerContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n let backgroundImage: React.ReactNode = null;\r\n if (this.props.backgroundImageUrl)\r\n {\r\n backgroundImage = (\r\n }\r\n />);\r\n }\r\n\r\n const mainClasses = [this.props.classes.main];\r\n const mainContentClasses = [this.props.classes.mainContent];\r\n\r\n for (const breakPoint of ['lg', 'md', 'sm', 'xs'] as Breakpoint[])\r\n {\r\n const width = this.props.paperWidth[breakPoint];\r\n if (width === null)\r\n {\r\n mainContentClasses.push(\r\n CenteredContentClasses.get(breakPoint, this.props.classes));\r\n }\r\n else\r\n {\r\n mainClasses.push(\r\n this.props.classes[`paper-container-${breakPoint}`]);\r\n\r\n const useDefaultColor = !this.props.backgroundImageUrl;\r\n mainContentClasses.push(\r\n PaperClasses.get(\r\n breakPoint,\r\n width,\r\n useDefaultColor,\r\n this.props.classes));\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n {backgroundImage}\r\n
\r\n {this.props.children}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(BasePageTemplate);\r\n","import * as muiSnackbarContent from '@material-ui/core/SnackbarContent';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiSnackbarContent.SnackbarContentProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n message:\r\n {\r\n width: 'calc(100% - 48px)',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class SnackbarContent extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SnackbarContent);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n svg:\r\n {\r\n color: theme.palette.grey[800],\r\n height: 'calc(100% + 1px)',\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n },\r\n title:\r\n {\r\n boxSizing: 'border-box',\r\n display: 'inline-block',\r\n fontFamily: 'SegoeScript-Bold, Segoe Script',\r\n fontSize: '19.47px',\r\n fontWeight: 700,\r\n height: 40,\r\n maxWidth: '100%',\r\n overflow: 'hidden',\r\n paddingLeft: 24,\r\n paddingRight: 36,\r\n paddingTop: 6,\r\n position: 'relative',\r\n textOverflow: 'ellipsis',\r\n textTransform: 'uppercase',\r\n whiteSpace: 'nowrap',\r\n },\r\n titleBackground:\r\n {\r\n backgroundColor: theme.palette.grey[800],\r\n height: '100%',\r\n left: 0,\r\n position: 'absolute',\r\n right: 15,\r\n top: 0,\r\n },\r\n wrapper:\r\n {\r\n display: 'flex',\r\n maxWidth: '100%',\r\n position: 'relative',\r\n },\r\n });\r\n\r\nexport class EnvironmentBanner extends\r\n React.PureComponent>\r\n{\r\n private readonly bannerColor: string | null = null;\r\n private readonly bannerTitle: string | null = null;\r\n\r\n public constructor(props: WithStyles)\r\n {\r\n super(props);\r\n\r\n this.bannerColor = Sys.settings.environmentBannerColor;\r\n this.bannerTitle = Sys.settings.nonProdEnvironment;\r\n }\r\n\r\n public render()\r\n {\r\n if (!this.bannerColor || !this.bannerTitle)\r\n {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.bannerTitle}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(EnvironmentBanner);\r\n","import * as muiButtonBase from '@material-ui/core/ButtonBase';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\n\r\ninterface Props\r\n{\r\n href?: string;\r\n imageSrc: string;\r\n onClick?: () => void;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n ripple:\r\n {\r\n height: 'calc(100% + 30px)',\r\n margin: '-15px',\r\n width: 'calc(100% + 30px)',\r\n },\r\n root:\r\n {\r\n '& > img':\r\n {\r\n maxHeight: '100%',\r\n maxWidth: '100%',\r\n },\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n height: 40,\r\n marginRight: 16,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n height: 60,\r\n marginRight: 24,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginRight: 40,\r\n },\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n maxWidth: '25%',\r\n outline: 'none',\r\n overflow: 'hidden',\r\n },\r\n });\r\n\r\nexport class Logo extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Logo);\r\n","import * as muiIconButton from '@material-ui/core/IconButton';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Icon from './Icon';\r\n\r\ninterface Props extends muiIconButton.IconButtonProps\r\n{\r\n disableFocusRipple?: boolean;\r\n icon?: string;\r\n small?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n ripple:\r\n {\r\n '& > span > span':\r\n {\r\n backgroundColor: theme.palette.grey[800],\r\n },\r\n overflow: 'visible',\r\n },\r\n root:\r\n {\r\n color: theme.palette.text.primary,\r\n },\r\n small:\r\n {\r\n fontSize: 12,\r\n height: 24,\r\n width: 24,\r\n },\r\n });\r\n\r\nexport class IconButton extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const icon = _props.icon;\r\n\r\n // Required to suppress the warning:\r\n // the key `root` provided to the classes property is not\r\n // implemented in IconButton.\r\n _props.className = `${_props.classes.root} `;\r\n _props.TouchRippleProps = { className: _props.classes.ripple };\r\n\r\n if ('small' in _props)\r\n {\r\n if (_props.small)\r\n {\r\n _props.className += `${_props.classes.small} `;\r\n }\r\n\r\n delete _props.small;\r\n }\r\n\r\n if ('icon' in _props)\r\n {\r\n delete _props.icon;\r\n }\r\n\r\n if (!('color' in _props))\r\n {\r\n _props.color = 'inherit';\r\n }\r\n\r\n if (_props.disableFocusRipple)\r\n {\r\n _props.focusRipple = false;\r\n }\r\n delete _props.disableFocusRipple;\r\n\r\n delete _props.classes;\r\n\r\n return (\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(IconButton);\r\n","import * as muiSelect from '@material-ui/core/Select';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Icon from './Icon';\r\n\r\nexport interface SelectProps extends muiSelect.SelectProps\r\n{\r\n hasOptions: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n isOpen?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Select extends\r\n React.PureComponent, State>\r\n{\r\n private static openInstance: Select | null;\r\n protected muiProps: muiSelect.SelectProps;\r\n\r\n public static closeAll()\r\n {\r\n if (Select.openInstance)\r\n {\r\n Select.openInstance.close(true);\r\n }\r\n }\r\n\r\n public constructor(props: SelectProps & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { isOpen: false };\r\n\r\n this.muiProps =\r\n {\r\n autoFocus: props.autoFocus,\r\n autoWidth: true,\r\n children: props.children,\r\n displayEmpty: true,\r\n fullWidth: props.fullWidth,\r\n IconComponent: () => (\r\n ),\r\n MenuProps: props.MenuProps,\r\n onChange: props.onChange,\r\n onFocus: props.onFocus,\r\n onOpen: () => this.open(),\r\n SelectDisplayProps: props.SelectDisplayProps,\r\n style: props.style,\r\n };\r\n\r\n if (props.onClose)\r\n {\r\n this.muiProps.onClose = (event) =>\r\n {\r\n this.close(false);\r\n props.onClose!(event);\r\n };\r\n }\r\n else\r\n {\r\n this.muiProps.onClose = () => this.close(false);\r\n }\r\n }\r\n\r\n public close(disableRestoreFocus: boolean)\r\n {\r\n this.muiProps.MenuProps!.disableRestoreFocus =\r\n disableRestoreFocus;\r\n Select.openInstance = null;\r\n this.setState({ isOpen: false });\r\n\r\n if (this.props.onClose)\r\n {\r\n this.props.onClose({} as React.ChangeEvent<{}>);\r\n }\r\n }\r\n\r\n public open()\r\n {\r\n if (this.props.hasOptions)\r\n {\r\n Select.openInstance = this;\r\n this.setState({ isOpen: true });\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n this.muiProps.error = _props.error;\r\n this.muiProps.open = this.state.isOpen;\r\n this.muiProps.value = _props.value;\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Select);\r\n","import { computed, observable } from 'mobx';\r\n\r\nexport default class ConfirmContinueStore\r\n{\r\n private static staticInstance: ConfirmContinueStore;\r\n\r\n @observable private isOpen = false;\r\n private promise: { reject?: Function; resolve?: Function } = {};\r\n\r\n public static get instance()\r\n {\r\n if (!ConfirmContinueStore.staticInstance)\r\n {\r\n ConfirmContinueStore.staticInstance = new ConfirmContinueStore();\r\n }\r\n\r\n return ConfirmContinueStore.staticInstance;\r\n }\r\n\r\n @computed public get isDialogOpen(): boolean\r\n {\r\n return this.isOpen;\r\n }\r\n\r\n public closeDialog(accepted: boolean)\r\n {\r\n this.isOpen = false;\r\n\r\n if (accepted && this.promise.resolve)\r\n {\r\n this.promise.resolve();\r\n }\r\n else if (!accepted && this.promise.reject)\r\n {\r\n this.promise.reject();\r\n }\r\n }\r\n\r\n public openDialog(resolve: Function, reject: Function): void\r\n {\r\n this.isOpen = true;\r\n this.promise = { reject, resolve };\r\n }\r\n}\r\n","import * as muiSnackbar from '@material-ui/core/Snackbar';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Button from './Button';\r\nimport Icon from './Icon';\r\nimport Presentation from './Presentation';\r\nimport Snackbar from './Snackbar';\r\nimport SnackbarContent from './SnackbarContent';\r\n\r\ninterface Props extends muiSnackbar.SnackbarProps\r\n{\r\n closeHandler: Function;\r\n icon?: string;\r\n light?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n light:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n color: theme.palette.grey[800],\r\n },\r\n root:\r\n {\r\n zIndex: 1500,\r\n },\r\n });\r\n\r\nexport class Toast extends\r\n React.PureComponent>\r\n{\r\n static current: Toast | null;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { open: true };\r\n }\r\n\r\n public close()\r\n {\r\n if (Toast.current && this.state['open'])\r\n {\r\n this.setState({ open: false });\r\n Toast.current = null;\r\n Presentation.unmountComponent(this);\r\n }\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n let action: React.ReactNode = undefined;\r\n let contentClassName: string | undefined = undefined;\r\n\r\n _props.className = `${_props.classes.root} `;\r\n\r\n if ('light' in _props)\r\n {\r\n if (_props.light)\r\n {\r\n contentClassName = `${_props.classes.light}`;\r\n }\r\n\r\n delete _props.light;\r\n }\r\n\r\n if (this.state['open'])\r\n {\r\n Toast.current = this;\r\n }\r\n else\r\n {\r\n Toast.current = null;\r\n }\r\n\r\n if (!_props.autoHideDuration)\r\n {\r\n action =\r\n \r\n {\r\n if (this.props.closeHandler)\r\n {\r\n this.props.closeHandler();\r\n }\r\n\r\n this.close();\r\n }}\r\n size=\"small\"\r\n />;\r\n\r\n _props.ClickAwayListenerProps =\r\n {\r\n mouseEvent: false,\r\n touchEvent: false,\r\n };\r\n }\r\n\r\n if ('icon' in _props)\r\n {\r\n if (_props.icon)\r\n {\r\n action =\r\n ;\r\n }\r\n\r\n delete _props.icon;\r\n }\r\n\r\n if ('closeHandler' in _props)\r\n {\r\n delete _props.closeHandler;\r\n }\r\n\r\n delete _props.classes;\r\n\r\n return (\r\n { this.close(); }}\r\n >\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Toast);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTypography from '@material-ui/core/Typography';\r\nimport { ThemeProvider } from '@material-ui/styles';\r\nimport * as React from 'react';\r\nimport { Layout, LayoutConfig } from '../config/Layout';\r\nimport KeyboardNavigationGroup from '../coreui/KeyboardNavigationGroup';\r\nimport muiTheme, { CustomTheme, ForegroundColorType } from '../muiTheme';\r\nimport SessionMessageDisplay from '../mustangui/SessionMessageDisplay';\r\nimport Logon from '../pages/Logon';\r\nimport BackgroundImage from './components/BackgroundImage';\r\nimport EnvironmentBanner from './components/EnvironmentBanner';\r\nimport Logo from './components/Logo';\r\nimport PageProcessing from './components/PageProcessing';\r\nimport CenteredContentClasses from './styles/CenteredContentClasses';\r\nimport PaperClasses from './styles/PaperClasses';\r\n\r\ninterface FooterConfig\r\n{\r\n backgroundColor: string;\r\n foreground: ForegroundColorType;\r\n layout: LayoutConfig;\r\n}\r\n\r\ninterface HeaderConfig\r\n{\r\n backgroundColor: string;\r\n bottomBorderColor: string;\r\n foreground: ForegroundColorType;\r\n logoUrl: string;\r\n layout: LayoutConfig;\r\n}\r\n\r\nexport interface LandingPageTemplateConfig\r\n{\r\n backgroundImageUrl: string;\r\n footer: FooterConfig;\r\n header: HeaderConfig;\r\n signInTitle: string;\r\n welcomeTitle1: string;\r\n welcomeTitle2: string;\r\n}\r\n\r\ninterface Props\r\n{\r\n backgroundImageUrl: string;\r\n footer: FooterConfig;\r\n forgotPasswordUrl: string | null;\r\n header: HeaderConfig;\r\n signInTitle: string;\r\n welcomeTitle1: string;\r\n welcomeTitle2: string;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) => createStyles(\r\n {\r\n footer:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n paddingBottom: theme.paper.padding.lg,\r\n paddingTop: theme.paper.padding.lg,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n paddingBottom: theme.paper.padding.md,\r\n paddingTop: theme.paper.padding.md,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n paddingBottom: theme.paper.padding.sm,\r\n paddingTop: theme.paper.padding.sm,\r\n },\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n paddingBottom: theme.paper.padding.xs,\r\n paddingTop: theme.paper.padding.xs,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n alignItems: 'center',\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n footerContent:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n flexBasis: '100%',\r\n },\r\n },\r\n header:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n height: 72,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n height: 88,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n height: 108,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n height: 140,\r\n },\r\n '@media print':\r\n {\r\n display: 'none',\r\n },\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 4,\r\n },\r\n headerContent:\r\n {\r\n alignItems: 'center',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n height: '100%',\r\n },\r\n main:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n },\r\n mainContent:\r\n {\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.xs,\r\n marginTop: theme.container.verticalSpacing.xs,\r\n },\r\n [theme.breakpoints.only('sm')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.sm,\r\n marginTop: theme.container.verticalSpacing.sm,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.md,\r\n marginTop: theme.container.verticalSpacing.md,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginBottom: theme.container.verticalSpacing.lg,\r\n marginTop: theme.container.verticalSpacing.lg,\r\n },\r\n flexGrow: 1,\r\n },\r\n root:\r\n {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n },\r\n signIn:\r\n {\r\n [theme.breakpoints.up('md')]:\r\n {\r\n display: 'block',\r\n },\r\n display: 'none',\r\n },\r\n titleLight:\r\n {\r\n fontWeight: 400,\r\n },\r\n top:\r\n {\r\n position: 'relative',\r\n\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n height: 212,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n height: 300,\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n height: 'auto',\r\n },\r\n },\r\n topContent:\r\n {\r\n [theme.breakpoints.down('sm')]:\r\n {\r\n height: '100%',\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n marginBottom: 24,\r\n marginTop: 24,\r\n },\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginBottom: 40,\r\n marginTop: 40,\r\n },\r\n alignItems: 'center',\r\n display: 'flex',\r\n },\r\n welcome:\r\n {\r\n [theme.breakpoints.up('lg')]:\r\n {\r\n marginRight: theme.horizontalSpacing.related.lg,\r\n },\r\n [theme.breakpoints.only('md')]:\r\n {\r\n marginRight: theme.horizontalSpacing.related.md,\r\n },\r\n flexGrow: 1,\r\n },\r\n welcomeTitle:\r\n {\r\n [theme.breakpoints.up('xs')]:\r\n {\r\n textAlign: 'center',\r\n },\r\n [theme.breakpoints.up('md')]:\r\n {\r\n textAlign: 'left',\r\n },\r\n color: theme.palette.common.white,\r\n },\r\n ...CenteredContentClasses.create(theme),\r\n ...PaperClasses.create(theme),\r\n });\r\n\r\nclass LandingPageTemplate extends\r\n React.PureComponent>\r\n{\r\n private readonly footerTheme: Theme;\r\n private readonly headerTheme: Theme;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.footerTheme = muiTheme(this.props.footer.foreground, true);\r\n this.headerTheme = muiTheme(this.props.header.foreground, true);\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const footerContentClasses =\r\n [\r\n this.props.classes.footerContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n const headerContentClasses =\r\n [\r\n this.props.classes.headerContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n const mainContentClasses =\r\n [\r\n this.props.classes.mainContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n const signInClasses =\r\n [\r\n this.props.classes.signIn,\r\n PaperClasses.get('lg', 4, false, this.props.classes),\r\n PaperClasses.get('md', 5, false, this.props.classes),\r\n ];\r\n\r\n const topContentClasses =\r\n [\r\n this.props.classes.topContent,\r\n CenteredContentClasses.get(null, this.props.classes),\r\n ];\r\n\r\n const welcomeTitle1Classes =\r\n [\r\n this.props.classes.titleLight,\r\n this.props.classes.welcomeTitle,\r\n ];\r\n\r\n const welcomeMessage =\r\n `${this.props.welcomeTitle1} ${this.props.welcomeTitle2}`;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n {this.props.welcomeTitle1}\r\n \r\n \r\n {this.props.welcomeTitle2}\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {this.props.children}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(LandingPageTemplate);\r\n","import * as React from 'react';\r\nimport { Layout, LayoutConfig } from '../config/Layout';\r\nimport AppServer from '../core/AppServer';\r\nimport Sys from '../core/Sys';\r\nimport TrackableCollection from '../core/TrackableCollection';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Panel from '../mustangui/Panel';\r\nimport PresentationService from '../services/PresentationService';\r\nimport UserService from '../services/UserService';\r\nimport PaneDataStore from '../stores/PaneDataStore';\r\nimport LandingPageTemplate, { LandingPageTemplateConfig }\r\n from '../templates/LandingPageTemplate';\r\n\r\nexport interface LandingPageConfig\r\n{\r\n forgotPasswordUrl: string | null;\r\n homeLayout: LayoutConfig;\r\n signInTitle: string;\r\n template: LandingPageTemplateConfig;\r\n}\r\n\r\nexport class LandingPage\r\n{\r\n private static config: LandingPageConfig | null = null;\r\n\r\n public static async render()\r\n {\r\n if (LandingPage.config === null)\r\n {\r\n throw new Error(\r\n 'Landing page config must be set before the landing page '\r\n + 'may be rendered');\r\n }\r\n\r\n const templateResponse =\r\n await PresentationService.getLandingPageData();\r\n AppServer.setState(templateResponse.appServerState);\r\n PaneDataStore.loadResponse(templateResponse.paneDataByDataId);\r\n\r\n const templateConfig = LandingPage.config.template;\r\n\r\n const dataResponse = await PresentationService.getPresentationData(\r\n LandingPage.config.homeLayout.layoutId,\r\n UserService.accountObjectHandle);\r\n\r\n if (dataResponse.shouldRedirectHome)\r\n {\r\n AppServer.setState(dataResponse.appServerState);\r\n Sys.setHash('');\r\n\r\n return;\r\n }\r\n\r\n // FUTURE 7.4.1\r\n // The presentation is first rendered without any children to give the\r\n // models a chance to be cleared without the new presentation reacting\r\n // to their on-change events.\r\n //\r\n // The components should be made tolerant of missing data, that way the\r\n // on-change events fired by changing the data will be benign. Then we\r\n // can take full advantage of React's architecture for making minimum\r\n // changes to the DOM (this approach effectively removes the entire\r\n // presentation from the DOM and re-renders the new one, which is not as\r\n // efficient as it could be).\r\n const navigatingToSamePresentation = Presentation.currentPresentationId\r\n && Presentation.currentPresentationId === dataResponse.layoutId!;\r\n // Avoiding clearing the presentation if navigating to the same\r\n // presentation helps this to be slightly more efficient.\r\n if (!navigatingToSamePresentation)\r\n {\r\n Presentation.render(\r\n );\r\n }\r\n\r\n let presentation = LandingPage.config.homeLayout;\r\n if (presentation.layoutId !== dataResponse.layoutId)\r\n {\r\n // The preload script performed a redirect\r\n presentation = await PresentationService.getPresentationConfig(\r\n dataResponse.layoutId!);\r\n }\r\n\r\n AppServer.setState(dataResponse.appServerState);\r\n PaneDataStore.loadResponse(dataResponse.paneDataByDataId!);\r\n\r\n Presentation.render(\r\n \r\n \r\n \r\n \r\n );\r\n\r\n Sys.ignoreChanges = true;\r\n }\r\n\r\n public static setConfig(config: LandingPageConfig)\r\n {\r\n if (LandingPage.config !== null)\r\n {\r\n throw new Error('Landing page config is already set');\r\n }\r\n\r\n LandingPage.config = config;\r\n\r\n const templateConfig = LandingPage.config.template;\r\n const allDataIds =\r\n [\r\n ...templateConfig.footer.layout.dataIds,\r\n ...templateConfig.header.layout.dataIds,\r\n ...LandingPage.config.homeLayout.dataIds,\r\n ];\r\n\r\n for (const dataId of allDataIds)\r\n {\r\n new TrackableCollection('PaneRow', dataId);\r\n }\r\n }\r\n}\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys, { SessionMessage } from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport Icon from '../coreui/Icon';\r\nimport SnackbarContent from '../coreui/SnackbarContent';\r\nimport Api from './Api';\r\n\r\ninterface Props\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n caution:\r\n {\r\n '& > svg':\r\n {\r\n top: '2px !important',\r\n },\r\n },\r\n content:\r\n {\r\n '& > div':\r\n {\r\n [theme.breakpoints.up('sm')]: { width: 568 },\r\n [theme.breakpoints.up('md')]: { width: 912 },\r\n [theme.breakpoints.up('lg')]: { width: 1200 },\r\n },\r\n [theme.breakpoints.only('xs')]:\r\n {\r\n marginLeft: -16,\r\n marginRight: -16,\r\n },\r\n [theme.breakpoints.up('sm')]:\r\n {\r\n maxWidth: 'none',\r\n },\r\n justifyContent: 'center',\r\n },\r\n light:\r\n {\r\n backgroundColor: theme.palette.grey[100],\r\n color: theme.palette.grey[800],\r\n },\r\n message:\r\n {\r\n alignItems: 'center',\r\n display: 'flex',\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class SessionMessageDisplay extends\r\n React.Component>\r\n{\r\n private removeMessage(message: SessionMessage)\r\n {\r\n const index = Sys.sessionMessages.indexOf(message);\r\n\r\n if (index > -1)\r\n {\r\n Sys.sessionMessages.splice(index, 1);\r\n }\r\n\r\n const request: XMLHttpRequest = new XMLHttpRequest();\r\n\r\n request.open(\r\n 'DELETE',\r\n `${Sys.baseUrl}User/SessionMessage/${message.messageId}`);\r\n request.send();\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const content: React.ReactNode[] = [];\r\n let action: React.ReactNode = undefined;\r\n let messageNode: React.ReactNode = null;\r\n\r\n for (const message of Sys.sessionMessages)\r\n {\r\n action =\r\n \r\n {\r\n this.removeMessage(message);\r\n }}\r\n size=\"small\"\r\n />;\r\n\r\n switch (message.messageType)\r\n {\r\n case 'Caution':\r\n messageNode =\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {message.message}\r\n
\r\n {action}\r\n ;\r\n break;\r\n case 'Danger':\r\n messageNode =\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {message.message}\r\n
\r\n {action}\r\n ;\r\n break;\r\n case 'Info':\r\n messageNode =\r\n
\r\n \r\n
\r\n {message.message}\r\n
\r\n {action}\r\n
;\r\n break;\r\n case 'Success':\r\n messageNode =\r\n
\r\n \r\n
\r\n {message.message}\r\n
\r\n {action}\r\n
;\r\n break;\r\n default:\r\n throw new Error(\r\n `Unknown message type ${message.messageType}`);\r\n }\r\n\r\n content.push(\r\n );\r\n }\r\n\r\n delete _props.classes;\r\n\r\n let result: React.ReactNode = null;\r\n\r\n if (Sys.sessionMessages.length)\r\n {\r\n result =\r\n
\r\n {content}\r\n
;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SessionMessageDisplay);\r\n","import { createStyles, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport Sys from '../../core/Sys';\r\nimport { CustomTheme } from '../../muiTheme';\r\nimport { ValueByBreakpoint } from '../../mustangui/Api';\r\n\r\ninterface Props\r\n{\r\n url: string;\r\n visible?: boolean | ValueByBreakpoint;\r\n}\r\n\r\nconst styles = (theme: CustomTheme) =>\r\n{\r\n const visibleStyle =\r\n {\r\n display: 'block',\r\n };\r\n\r\n return createStyles(\r\n {\r\n content:\r\n {\r\n height: '100%',\r\n position: 'absolute',\r\n width: '100%',\r\n },\r\n image:\r\n {\r\n objectFit: 'cover',\r\n objectPosition: '0 86%',\r\n },\r\n mask:\r\n {\r\n background: 'linear-gradient(to right, rgba(33,33,33,0.9) 0%, '\r\n + 'rgba(33,33,33,0.5) 50%, rgba(33,33,33,0.9) 100%)',\r\n },\r\n root:\r\n {\r\n bottom: 0,\r\n display: 'none',\r\n left: 0,\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n zIndex: -1,\r\n },\r\n 'visible-all': visibleStyle,\r\n 'visible-lg': { [theme.breakpoints.up('lg')]: visibleStyle },\r\n 'visible-md': { [theme.breakpoints.only('md')]: visibleStyle },\r\n 'visible-sm': { [theme.breakpoints.only('sm')]: visibleStyle },\r\n 'visible-xs': { [theme.breakpoints.only('xs')]: visibleStyle },\r\n });\r\n};\r\n\r\nclass BackgroundImage extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const imageClasses =\r\n [\r\n this.props.classes.content,\r\n this.props.classes.image,\r\n ];\r\n\r\n const maskClasses =\r\n [\r\n this.props.classes.content,\r\n this.props.classes.mask,\r\n ];\r\n\r\n const visible = (this.props.visible !== undefined)\r\n ? this.props.visible\r\n : true;\r\n\r\n const rootClasses = [this.props.classes.root];\r\n if (typeof(visible) === 'boolean')\r\n {\r\n if (visible)\r\n {\r\n rootClasses.push(this.props.classes['visible-all']);\r\n }\r\n }\r\n else\r\n {\r\n for (const breakPoint of ['lg', 'md', 'sm', 'xs'])\r\n {\r\n if (visible[breakPoint])\r\n {\r\n rootClasses.push(\r\n this.props.classes[`visible-${breakPoint}`]);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(BackgroundImage);\r\n","import { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport ProcessingMask from '../../coreui/ProcessingMask';\r\nimport RequestsStore, { ProcessingInfo } from '../../stores/RequestsStore';\r\n\r\ninterface Props\r\n{\r\n enableBackground?: boolean;\r\n}\r\n\r\n@observer\r\nexport class PageProcessing extends\r\n React.Component\r\n{\r\n public render(): React.ReactNode\r\n {\r\n const info: ProcessingInfo = RequestsStore.instance.processingInfo;\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default PageProcessing;\r\n","import * as muiCircularProgress from '@material-ui/core/CircularProgress';\r\nimport lightGreen from '@material-ui/core/colors/lightGreen';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiCircularProgress.CircularProgressProps\r\n{\r\n size?: 'standard' | 'mini';\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n color: lightGreen[500],\r\n },\r\n });\r\n\r\nexport class CircularProgress extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const { classes, size, ...other } = this.props;\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(CircularProgress);\r\n","import Divider from '@material-ui/core/Divider';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Routing from '../core/Routing';\r\nimport Sys from '../core/Sys';\r\nimport Button from '../coreui/Button';\r\nimport CircularProgress from '../coreui/CircularProgress';\r\nimport Link from '../coreui/Link';\r\nimport PasswordField from '../coreui/PasswordField';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport Grid from '../mustangui/Grid';\r\nimport GridItem from '../mustangui/GridItem';\r\nimport SLTextEdit from '../mustangui/SLTextEdit';\r\nimport UserService, { ExternalAuthenticator } from '../services/UserService';\r\nimport RequestsStore from '../stores/RequestsStore';\r\n\r\ninterface Props\r\n{\r\n forgotPasswordUrl: string | null;\r\n title: string;\r\n}\r\n\r\ninterface State\r\n{\r\n externalAuthenticators?: ExternalAuthenticator[];\r\n isLoadingExternalAuthenticators?: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n divider:\r\n {\r\n backgroundColor: theme.palette.grey[300],\r\n border: 'none',\r\n height: 1,\r\n marginBottom: 24,\r\n marginTop: 24,\r\n },\r\n root:\r\n {\r\n },\r\n });\r\n\r\n@observer\r\nexport class Logon extends\r\n React.Component, State>\r\n{\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = {\r\n externalAuthenticators: [],\r\n isLoadingExternalAuthenticators: true,\r\n };\r\n\r\n UserService.getExternalAuthenticators().then((response) =>\r\n {\r\n this.setState({\r\n externalAuthenticators: response,\r\n isLoadingExternalAuthenticators: false,\r\n });\r\n });\r\n }\r\n\r\n private handleCredentialMessages = (): void =>\r\n {\r\n if (Sys.currentCredentials.Message)\r\n {\r\n Sys.showErrors([Sys.currentCredentials.Message!]);\r\n Sys.currentCredentials.Message = null;\r\n }\r\n };\r\n\r\n private logon = (): void =>\r\n {\r\n Sys.clearErrors();\r\n RequestsStore.instance.processingStarted();\r\n\r\n if (Sys.getRouteToken('signin', 0) === 'signin')\r\n {\r\n Sys.setHash('', false, true);\r\n }\r\n\r\n UserService.validateCredentials(Sys.currentCredentials)\r\n .then(() =>\r\n {\r\n Routing.processHash();\r\n\r\n setTimeout(() =>\r\n {\r\n RequestsStore.instance.processingStopped();\r\n\r\n Sys.currentCredentials.UserName = null;\r\n Sys.currentCredentials.Password = null;\r\n });\r\n }).catch(() =>\r\n {\r\n this.handleCredentialMessages();\r\n RequestsStore.instance.processingStopped();\r\n });\r\n };\r\n\r\n private onAuthenticatorClick = (name: string): void =>\r\n {\r\n if (Sys.getRouteToken('signin', 0) === 'signin')\r\n {\r\n Sys.setHash('', false, true);\r\n }\r\n\r\n Sys.setCookie('authenticatorProviderName', name);\r\n Sys.setCookie('authenticatorHref', window.location.href);\r\n };\r\n\r\n private onKeyDown = (event: React.KeyboardEvent): void =>\r\n {\r\n if ('nodeName' in event.target && event.target['nodeName'] === 'BUTTON')\r\n {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter')\r\n {\r\n this.logon();\r\n }\r\n };\r\n\r\n public componentDidUpdate(prevProps: Props, prevState: State): void\r\n {\r\n this.handleCredentialMessages();\r\n }\r\n\r\n public render(): React.ReactNode\r\n {\r\n const _props = { ...this.props };\r\n const enableEmailAuthentication: boolean =\r\n Sys.settings.enableEmailAuthentication;\r\n let emailAuthentication: React.ReactNode = null;\r\n let externalAuthentication: React.ReactNode = null;\r\n let focusUserName: boolean = false;\r\n let focusPassword: boolean = false;\r\n let title: React.ReactNode = null;\r\n\r\n title =\r\n \r\n \r\n {this.props.title}\r\n \r\n ;\r\n\r\n if (Sys.currentCredentials.UserName)\r\n {\r\n focusPassword = true;\r\n }\r\n else\r\n {\r\n focusUserName = true;\r\n }\r\n\r\n if (enableEmailAuthentication)\r\n {\r\n // FUTURE 7.4.1\r\n // Should use a lower level component so the interface of the\r\n // SLTextEdit component may remain specific to the requirements of the\r\n // configured widget.\r\n const emailAddressField: React.ReactNode = (\r\n );\r\n\r\n const passwordField: React.ReactNode = (\r\n \r\n {\r\n const props =\r\n { dataId: 'Credentials', name: 'Password' };\r\n\r\n Sys.clearBusinessErrors(props.dataId, props.name);\r\n Presentation.setValue(props, value);\r\n }}\r\n />);\r\n\r\n let forgotPasswordLink: React.ReactNode = null;\r\n\r\n if (this.props.forgotPasswordUrl)\r\n {\r\n forgotPasswordLink = (\r\n \r\n {Sys.getTranslation('Forgot Password?', 'Logon')}\r\n );\r\n }\r\n\r\n emailAuthentication =\r\n \r\n \r\n {emailAddressField}\r\n \r\n \r\n
\r\n {passwordField}\r\n {forgotPasswordLink}\r\n
\r\n
\r\n \r\n \r\n {Sys.getTranslation('Sign In', 'Logon')}\r\n \r\n \r\n
;\r\n }\r\n\r\n if (this.state.externalAuthenticators!.length)\r\n {\r\n const authenticators = this.state.externalAuthenticators!;\r\n const buttons: [React.ReactNode] = [null];\r\n\r\n authenticators.forEach((authenticator, index: number) =>\r\n {\r\n buttons.push(\r\n ) =>\r\n {\r\n this.onAuthenticatorClick(authenticator.providerName);\r\n }}\r\n style={{\r\n marginBottom: !enableEmailAuthentication\r\n && index < authenticators.length - 1 ? 24 : 0,\r\n marginRight: enableEmailAuthentication\r\n && index < authenticators.length - 1\r\n && ((index + 1) % 5 !== 0) ? 24 : 0,\r\n marginTop: enableEmailAuthentication\r\n && index >= 5 ? 24 : 0,\r\n }}\r\n />\r\n );\r\n });\r\n\r\n if (enableEmailAuthentication)\r\n {\r\n externalAuthentication =\r\n \r\n \r\n \r\n {Sys.getTranslation('Or sign in with', 'Logon')}\r\n \r\n
\r\n
\r\n {buttons}\r\n
\r\n
\r\n
;\r\n }\r\n else\r\n {\r\n externalAuthentication =\r\n
\r\n {buttons}\r\n
;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n {title}\r\n {emailAuthentication}\r\n \r\n {externalAuthentication}\r\n {this.state.isLoadingExternalAuthenticators\r\n ? (\r\n \r\n )\r\n : null}\r\n
);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Logon);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport Api from '../mustangui/Api';\r\nimport Icon from './Icon';\r\nimport IconButton from './IconButton';\r\nimport InputAdornment from './InputAdornment';\r\n\r\ninterface Props\r\n{\r\n autoComplete: string;\r\n autoFocus?: boolean;\r\n errors?: string[];\r\n helperText?: string;\r\n label?: string;\r\n name?: string;\r\n onChange: (value: string) => void;\r\n required?: boolean;\r\n}\r\n\r\ninterface State\r\n{\r\n showValue?: boolean;\r\n value?: string;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n '& label, & input':\r\n {\r\n marginLeft: 22,\r\n },\r\n },\r\n startIcon:\r\n {\r\n color: theme.palette.text.primary,\r\n left: 16,\r\n position: 'absolute',\r\n },\r\n });\r\n\r\nexport class PasswordField extends\r\n React.PureComponent, State>\r\n{\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.state = { showValue: false, value: '' };\r\n }\r\n\r\n private onChange = (event: React.ChangeEvent) =>\r\n {\r\n this.setState({ value: event.target.value });\r\n this.props.onChange(event.target.value);\r\n };\r\n\r\n private onToggleShowValue = () =>\r\n {\r\n this.setState((prevState: State) =>\r\n {\r\n return { showValue: !prevState.showValue };\r\n });\r\n };\r\n\r\n public render(): React.ReactNode\r\n {\r\n const helperTextProps = { error: false, helperText: '' };\r\n if (this.props.errors)\r\n {\r\n Api.setHelperText(this, this.props.errors, helperTextProps);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n ),\r\n }}\r\n label={this.props.label}\r\n name={this.props.name}\r\n onChange={this.onChange}\r\n required={this.props.required}\r\n type={this.state.showValue ? 'text' : 'password'}\r\n value={this.state.value}\r\n variant=\"filled\"\r\n />);\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(PasswordField);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTextField from '@material-ui/core/TextField';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport Sys from '../core/Sys';\r\nimport EditMask, { EditMask as EditMaskBase } from '../coreui/EditMask';\r\nimport Icon from '../coreui/Icon';\r\nimport InformationBadge from '../coreui/InformationBadge';\r\nimport InputAdornment from '../coreui/InputAdornment';\r\nimport PasswordField from '../coreui/PasswordField';\r\nimport Presentation from '../coreui/Presentation';\r\nimport Typography from '../coreui/Typography';\r\nimport Api, { AccessLevel } from './Api';\r\n\r\ninterface Props\r\n{\r\n dataCase: 'lower' | 'UPPER' | 'Any';\r\n dataId: string;\r\n dataSize: number;\r\n disabledHelpText: string;\r\n editMask?: string;\r\n helperText: string;\r\n isPassword: boolean;\r\n label: string;\r\n maxSizeError: string;\r\n name: string;\r\n}\r\n\r\ninterface WidgetProperties\r\n{\r\n accessLevel: AccessLevel;\r\n businessErrors: string[];\r\n showAsMandatory: boolean;\r\n showDisabledHelp: boolean;\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n inputLabelRoot:\r\n {\r\n width: 'calc(100% - 32px)',\r\n },\r\n inputLabelShrink:\r\n {\r\n width: 'calc((100% - 32px) * 1.333)',\r\n },\r\n root:\r\n {\r\n },\r\n rootWithStartIcon:\r\n {\r\n '& label, & input':\r\n {\r\n marginLeft: 22,\r\n },\r\n },\r\n startIcon:\r\n {\r\n color: theme.palette.text.primary,\r\n left: 16,\r\n position: 'absolute',\r\n },\r\n });\r\n\r\n@observer\r\nexport class SLTextEdit extends\r\n React.Component>\r\n{\r\n private startIcon: string;\r\n protected iconButton: React.Component;\r\n protected muiProps: muiTextField.TextFieldProps;\r\n\r\n public constructor(props: Props & WithStyles)\r\n {\r\n super(props);\r\n\r\n this.muiProps = {} as muiTextField.FilledTextFieldProps;\r\n\r\n this.muiProps.fullWidth = true;\r\n this.muiProps.id = `sl-text-edit-${Sys.nextId}`;\r\n this.muiProps.name = props.name;\r\n this.muiProps.label = props.label;\r\n this.muiProps.autoFocus = props['autoFocus'];\r\n this.muiProps.InputProps = props['InputProps'] || {};\r\n this.muiProps.inputProps = props['inputProps'];\r\n this.muiProps.type = 'text';\r\n this.muiProps.variant = 'filled';\r\n this.startIcon = props['startIcon'];\r\n\r\n // FUTURE 7.4.1\r\n // AutoComplete is only used by the logon form. That form should use a\r\n // different component to render its fields so the SLTextEdit can\r\n // contain only items that are relevant to the configured widget\r\n this.muiProps.autoComplete = props['autoComplete'];\r\n\r\n // Required so that when the help is an ul the dom is valid.\r\n this.muiProps.FormHelperTextProps =\r\n {\r\n component: 'div',\r\n style:\r\n {\r\n marginLeft: 16,\r\n marginRight: 16,\r\n },\r\n };\r\n }\r\n\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n const widgetProperties =\r\n Api.getWidgetProperties(_props) as WidgetProperties;\r\n let result: React.ReactNode = null;\r\n let endAdornment: React.ReactNode = null;\r\n\r\n if (!widgetProperties)\r\n {\r\n return null;\r\n }\r\n\r\n this.muiProps.className = `${_props.classes.root} `;\r\n\r\n this.muiProps.placeholder = undefined;\r\n\r\n const businessErrors: string[] =\r\n [...widgetProperties.businessErrors];\r\n\r\n if (Api.setAccessLevel(_props, widgetProperties))\r\n {\r\n if (_props['disabled'])\r\n {\r\n this.muiProps.disabled = true;\r\n this.muiProps.required = false;\r\n this.muiProps.helperText = null;\r\n this.muiProps.value = '';\r\n\r\n if (widgetProperties.showDisabledHelp)\r\n {\r\n result =\r\n \r\n \r\n ;\r\n }\r\n else\r\n {\r\n result = ;\r\n }\r\n }\r\n else if (_props['readOnly'])\r\n {\r\n let value = Presentation.getValue(_props);\r\n\r\n value = _props.editMask && value\r\n ? EditMaskBase.formatValue(_props.editMask, value) : value;\r\n\r\n result =\r\n
\r\n \r\n {_props.label}\r\n \r\n \r\n {value ? value : '-'}\r\n \r\n
;\r\n }\r\n else if (_props.editMask)\r\n {\r\n result = (\r\n \r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, value);\r\n }}\r\n required={widgetProperties.showAsMandatory}\r\n value={Presentation.getValue(_props)}\r\n variant=\"filled\"\r\n />);\r\n }\r\n else if (_props.isPassword)\r\n {\r\n result = (\r\n \r\n {\r\n Sys.clearBusinessErrors(\r\n this.props.dataId, this.props.name);\r\n Presentation.setValue(this.props, value);\r\n }}\r\n required={widgetProperties.showAsMandatory}\r\n />);\r\n }\r\n else\r\n {\r\n this.muiProps.disabled = false;\r\n this.muiProps.required = widgetProperties.showAsMandatory;\r\n this.muiProps.style = undefined;\r\n\r\n Presentation.setBinding(this, this.muiProps);\r\n\r\n if (_props.dataSize &&\r\n this.muiProps.value &&\r\n (this.muiProps.value as string).length > _props.dataSize)\r\n {\r\n businessErrors.push(_props.maxSizeError);\r\n }\r\n\r\n Api.setHelperText(this, businessErrors, this.muiProps);\r\n\r\n if (this.startIcon)\r\n {\r\n // End adornment is used instead of start since when start\r\n // is set the field moves the label above the input\r\n endAdornment =\r\n \r\n \r\n {endAdornment}\r\n ;\r\n\r\n this.muiProps.className +=\r\n `${this.props.classes.rootWithStartIcon} `;\r\n }\r\n\r\n result = (\r\n \r\n );\r\n }\r\n }\r\n\r\n if (endAdornment)\r\n {\r\n this.muiProps.InputProps!.endAdornment =\r\n ;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SLTextEdit);\r\n","import { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as muiTooltip from '@material-ui/core/Tooltip';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiTooltip.TooltipProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n tooltip:\r\n {\r\n },\r\n });\r\n\r\nexport class Tooltip extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Tooltip);\r\n","import * as React from 'react';\r\n\r\nexport interface WithForwardedRefProps\r\n{\r\n forwardedRef?: (r: HTMLElement | null) => void;\r\n}\r\n\r\nconst withForwardedRef =\r\n // eslint-disable-next-line arrow-parens\r\n (Component: React.ComponentType) =>\r\n {\r\n const handle = (props: T, ref: React.Ref) =>\r\n ;\r\n\r\n const name = Component.displayName || Component.name;\r\n handle.displayName = `withForwardedRef(${name})`;\r\n\r\n return React.forwardRef(handle);\r\n };\r\n\r\nexport default withForwardedRef;\r\n","import * as muiSnackbar from '@material-ui/core/Snackbar';\r\nimport { createStyles, Theme, WithStyles, withStyles }\r\n from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\n\r\ninterface Props extends muiSnackbar.SnackbarProps\r\n{\r\n}\r\n\r\nconst styles = (theme: Theme) => createStyles(\r\n {\r\n root:\r\n {\r\n },\r\n });\r\n\r\nexport class Snackbar extends\r\n React.PureComponent>\r\n{\r\n public render()\r\n {\r\n const _props = { ...this.props };\r\n\r\n return ;\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(Snackbar);\r\n","import Logging from '../core/Logging';\r\nimport CustomIconService from '../services/CustomIconService';\r\n\r\ninterface CustomIcon\r\n{\r\n contents: string;\r\n name: string;\r\n}\r\n\r\nexport default class CustomIconStore\r\n{\r\n private static iconsByName: { [name: string]: CustomIcon };\r\n\r\n public static async iconForName(name: string): Promise\r\n {\r\n const normalizedName = name.toLowerCase();\r\n\r\n if (this.iconsByName && normalizedName in this.iconsByName)\r\n {\r\n return this.iconsByName[normalizedName];\r\n }\r\n\r\n const iconContent = await CustomIconService.getIcon(name);\r\n if (iconContent !== null)\r\n {\r\n const icon =\r\n {\r\n contents: iconContent,\r\n name: normalizedName,\r\n };\r\n\r\n this.iconsByName[icon.name] = icon;\r\n\r\n return icon;\r\n }\r\n\r\n Logging.warn(`Custom icon not found: ${name}`);\r\n\r\n return null;\r\n }\r\n\r\n public static load(contentsByName: { [name: string]: string })\r\n {\r\n this.iconsByName = {};\r\n for (const name in contentsByName)\r\n {\r\n if (!contentsByName.hasOwnProperty(name))\r\n {\r\n continue;\r\n }\r\n\r\n const icon =\r\n {\r\n contents: contentsByName[name],\r\n name: name.toLowerCase(),\r\n };\r\n\r\n this.iconsByName[icon.name] = icon;\r\n }\r\n }\r\n}\r\n","import Logging from '../core/Logging';\r\n\r\nexport default class CustomIconService\r\n{\r\n public static async getIcon(name: string): Promise\r\n {\r\n let response: Response | null = null;\r\n try\r\n {\r\n response = await fetch(`CustomIcons/${name}`);\r\n }\r\n catch (error)\r\n {\r\n Logging.error(error);\r\n }\r\n\r\n if (response === null || response.status === 404)\r\n {\r\n return null;\r\n }\r\n\r\n return await response.text();\r\n }\r\n}\r\n","import PaneDataStore from '../stores/PaneDataStore';\r\nimport RequestsStore from '../stores/RequestsStore';\r\nimport Routing from './Routing';\r\nimport Sys from './Sys';\r\nimport TrackableModel, { ITrackable } from './TrackableModel';\r\n\r\nexport default class Monitor\r\n{\r\n // Collection of messages written to the console log.\r\n public logMessages: Set = new Set();\r\n // Collection of requests.\r\n public requests: Set = new Set();\r\n public scriptErrors: Set = new Set();\r\n // Dictionary of scripts, keyed by request cache key.\r\n public scripts: Map = new Map();\r\n\r\n constructor()\r\n {\r\n // Traps javascript errors.\r\n window.addEventListener('error', (\r\n event: Event | string,\r\n source?: string,\r\n lineNumber?: number,\r\n colno?: number,\r\n error?: Error) =>\r\n {\r\n const scriptError: object =\r\n {\r\n callStack: null,\r\n event,\r\n exceptionType: 'javascript',\r\n };\r\n\r\n if (error && error.stack)\r\n {\r\n scriptError['callStack'] = error.stack;\r\n }\r\n else\r\n {\r\n scriptError['callStack'] = `${source} at line ${lineNumber}`;\r\n }\r\n\r\n if (Sys.monitor)\r\n {\r\n Sys.monitor.addScriptError(scriptError);\r\n }\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event) =>\r\n {\r\n if (process.env.NODE_ENV === 'production'\r\n && Sys.getRouteRootToken() !== 'error')\r\n {\r\n Routing.goToErrorPage(Sys.getTranslation('Error'), null);\r\n }\r\n else\r\n {\r\n // Ensure loading animation is removed.\r\n RequestsStore.instance.clearAllProcessing();\r\n }\r\n });\r\n }\r\n\r\n public addMessage(message: string)\r\n {\r\n this.logMessages.add(\r\n {\r\n message,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n public addRequest(requestConfig: object)\r\n {\r\n this.requests.add(requestConfig);\r\n }\r\n\r\n public addScript(key: string, script: string)\r\n {\r\n this.scripts.set(key, script);\r\n }\r\n\r\n public addScriptError(error: object)\r\n {\r\n this.scriptErrors.add(\r\n {\r\n error,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n public clear(): void\r\n {\r\n this.requests.clear();\r\n this.scripts.clear();\r\n this.logMessages.clear();\r\n this.scriptErrors.clear();\r\n }\r\n\r\n public show(): void\r\n {\r\n // eslint-disable-next-line max-len\r\n console.log('--- Monitor --------------------------------------------------------------------------------');\r\n\r\n if (Sys.hasChanges())\r\n {\r\n console.log('--- Changes ---');\r\n console.log(PaneDataStore.getChanges());\r\n }\r\n\r\n if (this.requests.size > 0)\r\n {\r\n console.log('--- Requests ---');\r\n this.requests.forEach((request) =>\r\n {\r\n console.log(request);\r\n });\r\n }\r\n\r\n if (this.scripts.size > 0)\r\n {\r\n console.log('--- Scripts ---');\r\n this.scripts.forEach((script, key) =>\r\n {\r\n console.log(`${key} source: ${script}`);\r\n });\r\n }\r\n\r\n if (this.scriptErrors.size > 0)\r\n {\r\n console.log('--- Script Errors ---');\r\n this.scriptErrors.forEach((scriptError) =>\r\n {\r\n console.log(scriptError);\r\n });\r\n }\r\n\r\n if (this.logMessages.size > 0)\r\n {\r\n console.log('--- Messages ---');\r\n this.logMessages.forEach((logMessage) =>\r\n {\r\n const formattedTimestamp = Sys.formatDate(\r\n logMessage['timestamp'], 'hh:mm:ss.fff');\r\n console.log(`${formattedTimestamp}: ${logMessage['message']}`);\r\n });\r\n }\r\n\r\n if (Sys.keyListeners.size > 0)\r\n {\r\n console.log('--- Key Listeners ---');\r\n Sys.keyListeners.forEach((listener: EventListener, config: string) =>\r\n {\r\n console.log(config);\r\n });\r\n }\r\n\r\n if (TrackableModel.models.size > 0)\r\n {\r\n console.log('--- Models ---');\r\n TrackableModel.models.forEach((\r\n model: ITrackable,\r\n dataId: string | null) =>\r\n {\r\n console.log(`${dataId}: ${JSON.stringify(model)}`);\r\n });\r\n }\r\n // eslint-disable-next-line max-len\r\n console.log('--- End ------------------------------------------------------------------------------------------');\r\n }\r\n}\r\n","import { observable } from 'mobx';\r\nimport TrackableModel from '../core/TrackableModel';\r\nimport { AccessLevel } from '../mustangui/Api';\r\n\r\nexport default class Credentials extends TrackableModel\r\n{\r\n /* eslint-disable */\r\n @observable\r\n private _UserName: string | null = null;\r\n public get UserName(): string | null\r\n {\r\n return this._UserName;\r\n }\r\n public set UserName(value: string | null)\r\n {\r\n this.setProperty('_UserName', value);\r\n this.Message = null;\r\n }\r\n\r\n @observable\r\n private _Password: string | null = null;\r\n public get Password(): string | null\r\n {\r\n return this._Password;\r\n }\r\n public set Password(value: string | null)\r\n {\r\n this.setProperty('_Password', value);\r\n this.Message = null;\r\n }\r\n\r\n @observable\r\n private _EmailAddress: string | null = null;\r\n public get EmailAddress(): string | null\r\n {\r\n return this._EmailAddress;\r\n }\r\n public set EmailAddress(value: string | null)\r\n {\r\n this.setProperty('_EmailAddress', value);\r\n this.EmailMessage = null;\r\n }\r\n\r\n @observable\r\n private _DisplayName: string | null = null;\r\n public get DisplayName(): string | null\r\n {\r\n return this._DisplayName;\r\n }\r\n public set DisplayName(value: string | null)\r\n {\r\n this._DisplayName = value;\r\n }\r\n\r\n @observable\r\n private _Message: string | null = null;\r\n public get Message(): string | null\r\n {\r\n return this._Message;\r\n }\r\n public set Message(value: string | null)\r\n {\r\n this._Message = value;\r\n }\r\n\r\n @observable\r\n private _EmailMessage: string | null = null;\r\n public get EmailMessage(): string | null\r\n {\r\n return this._EmailMessage;\r\n }\r\n public set EmailMessage(value: string | null)\r\n {\r\n this._EmailMessage = value;\r\n }\r\n\r\n @observable\r\n private _WidgetProperties: object | null = null;\r\n public get WidgetProperties(): object | null\r\n {\r\n return this._WidgetProperties;\r\n }\r\n public set WidgetProperties(value: object | null)\r\n {\r\n this._WidgetProperties = value;\r\n }\r\n /* eslint-enable */\r\n\r\n constructor()\r\n {\r\n super('Credentials');\r\n\r\n this.dataId = 'Credentials';\r\n this.ignoreChanges = true;\r\n this.UserName = null;\r\n this.Password = null;\r\n this.WidgetProperties =\r\n {\r\n EmailAddress:\r\n {\r\n accessLevel: AccessLevel.enterable,\r\n businessErrors: [],\r\n },\r\n Password:\r\n {\r\n accessLevel: AccessLevel.enterable,\r\n businessErrors: [],\r\n },\r\n UserName:\r\n {\r\n accessLevel: AccessLevel.enterable,\r\n businessErrors: [],\r\n },\r\n };\r\n }\r\n\r\n protected getPropertyNames(): string[]\r\n {\r\n return Object.keys(this);\r\n }\r\n\r\n protected loadData(data: TrackableModel)\r\n {\r\n for (const property of Object.keys(data))\r\n {\r\n this.setPropertyValue(property, data![property]);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n protected setPropertyValue(propName: string, value: any): void\r\n {\r\n this[propName] = value;\r\n }\r\n\r\n public getPrimaryKey(): string\r\n {\r\n throw new Error('Not implemented');\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getPropertyValue(propName: string): any\r\n {\r\n return this[propName];\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n public getReadOnlyProperties(propName: string): any\r\n {\r\n return this.WidgetProperties![propName];\r\n }\r\n}\r\n","import Sys from '../core/Sys';\r\nimport\r\n{\r\n AuthenticatedPage,\r\n AuthenticatedPageConfig,\r\n} from '../pages/AuthenticatedPage';\r\nimport { ErrorPage, ErrorPageConfig } from '../pages/ErrorPage';\r\nimport { GuestPage, GuestPageConfig } from '../pages/GuestPage';\r\nimport { LandingPage, LandingPageConfig } from '../pages/LandingPage';\r\nimport CustomIconStore from '../stores/CustomIconStore';\r\nimport BaseService from './BaseService';\r\n\r\nexport interface SystemConfig\r\n{\r\n ajaxTimeoutMilliSeconds: number;\r\n authenticatedPage: AuthenticatedPageConfig;\r\n availableLanguages: { code: string; description: string }[];\r\n colorPalette:\r\n {\r\n danger: string;\r\n information: string;\r\n primary: string;\r\n secondary: string;\r\n success: string;\r\n warning: string;\r\n };\r\n currentLanguageCode: string;\r\n customIconsByName: { [name: string]: string };\r\n dateFormat: string;\r\n dayAbbreviations: string[];\r\n days: string[];\r\n decimalSeparator: string;\r\n enableEmailAuthentication: boolean;\r\n environmentBannerColor: string | null;\r\n errorPage: ErrorPageConfig;\r\n favIconUrl: string;\r\n guestPage: GuestPageConfig;\r\n landingPage: LandingPageConfig;\r\n monthAbbreviations: string[];\r\n months: string[];\r\n nonProdEnvironment: string;\r\n reCaptchaSiteKey: string;\r\n rootUrl: string;\r\n siteName: string;\r\n thousandsSeparator: string;\r\n translations: object;\r\n useConfiguredAuthentication: boolean;\r\n}\r\n\r\nexport default class SystemConfigService\r\n{\r\n private static async getSystemConfig(\r\n languageCode: string | null\r\n ): Promise\r\n {\r\n let requestUrl = 'SystemConfig';\r\n if (languageCode)\r\n {\r\n requestUrl += `/${languageCode}`;\r\n }\r\n\r\n return BaseService.requestObject(requestUrl, null, null, null, 'GET');\r\n }\r\n\r\n private static setFavIcon(favIconUrl: string): void\r\n {\r\n const favIcon = document.getElementById('favIcon') as HTMLLinkElement;\r\n\r\n if (favIcon)\r\n {\r\n favIcon.href = favIconUrl;\r\n }\r\n }\r\n\r\n private static setLanguage(code: string): void\r\n {\r\n const html: HTMLElement = document.documentElement;\r\n\r\n if (html)\r\n {\r\n html.lang = code;\r\n }\r\n }\r\n\r\n public static async loadConfig(\r\n languageCode: string | null\r\n ): Promise\r\n {\r\n const config: SystemConfig = await SystemConfigService.getSystemConfig(\r\n languageCode);\r\n\r\n SystemConfigService.setFavIcon(config.favIconUrl);\r\n SystemConfigService.setLanguage(config.currentLanguageCode);\r\n AuthenticatedPage.setConfig(config.authenticatedPage);\r\n BaseService.requestTimeoutMilliseconds = config.ajaxTimeoutMilliSeconds;\r\n CustomIconStore.load(config.customIconsByName);\r\n ErrorPage.setConfig(config.errorPage);\r\n\r\n if (config.useConfiguredAuthentication)\r\n {\r\n // Guest/Unauthenticated pages are only available if Use Configured\r\n // Authentication is enabled.\r\n GuestPage.setConfig(config.guestPage);\r\n LandingPage.setConfig(config.landingPage);\r\n }\r\n\r\n // FUTURE\r\n // Move these items out of a generic settings collection and into\r\n // specialized services / stores. That way the information can be\r\n // organized according to business domain.\r\n //\r\n // Heading comments are provided as an indication of some preliminary\r\n // thinking about where these settings can go.\r\n\r\n // Authentication\r\n Sys.settings.enableEmailAuthentication =\r\n config.enableEmailAuthentication;\r\n Sys.settings.useConfiguredAuthentication =\r\n config.useConfiguredAuthentication;\r\n\r\n // Language\r\n Sys.settings.availableLanguages = config.availableLanguages;\r\n Sys.settings.currentLanguageCode = config.currentLanguageCode;\r\n Sys.settings.dateFormat = config.dateFormat;\r\n Sys.settings.dayAbbreviations = config.dayAbbreviations;\r\n Sys.settings.days = config.days;\r\n Sys.settings.decimalSeparator = config.decimalSeparator;\r\n Sys.settings.monthAbbreviations = config.monthAbbreviations;\r\n Sys.settings.months = config.months;\r\n Sys.settings.thousandsSeparator = config.thousandsSeparator;\r\n Sys.settings.translations = config.translations;\r\n\r\n // Site\r\n Sys.settings.environmentBannerColor = config.environmentBannerColor;\r\n Sys.settings.nonProdEnvironment = config.nonProdEnvironment;\r\n Sys.settings.reCaptchaSiteKey = config.reCaptchaSiteKey;\r\n Sys.settings.rootUrl = config.rootUrl;\r\n Sys.settings.siteName = config.siteName;\r\n\r\n // Theme\r\n Sys.settings.baselineGridSize = 4;\r\n Sys.settings.colorPalette = config.colorPalette;\r\n }\r\n}\r\n","import * as WebFont from 'webfontloader';\r\nimport Sys from './core/Sys';\r\n\r\nSys.baseUrl = 'dynamic/';\r\n\r\nWebFont.load(\r\n {\r\n google:\r\n {\r\n families: ['Roboto:400,700,900'],\r\n },\r\n });\r\n\r\n// Determine when the document has been loaded.\r\ndocument.onreadystatechange = () =>\r\n{\r\n Sys.onReadyStateChange();\r\n};\r\n"],"sourceRoot":""}