{"version":3,"sources":["pages/expenses/ExpensesAPI.tsx","contexts/StateContext.tsx","pages/site/NavbarWithSidebar.tsx","utils/AccountsAPI.tsx","hooks/useConfirmation.tsx","hooks/useToast.tsx","pages/timesheets/Timesheet.ts","pages/expenses/ExpenseReport.ts","contexts/UsersContext.tsx","contexts/ConfirmContext.tsx","components/ConfirmDialog.tsx","hooks/useStateRef.tsx","utils/TSFunctions.ts","components/GenericAutocomplete.tsx","hooks/useLoggedInUser.tsx","components/UserAutocomplete.tsx","hooks/useIsMobile.tsx","hooks/useUsersContext.tsx","components/DateChanger.tsx","hooks/useMountEffect.tsx","pages/creditCards/CreditCardAPI.tsx","contexts/JobsContext.tsx","pages/files/FileAPI.ts","pages/files/FilePreviewDialog.tsx","pages/files/FilePondWrapper.tsx","pages/files/FileEditDialog.tsx","components/IconButtonMenu.tsx","pages/files/FileList.tsx","pages/files/FileDialog.tsx","pages/dashboards/DashboardComponents/TileGroup.tsx","hooks/useUsers.tsx","contexts/DefaultClaimsContext.tsx","contexts/LoadingContext.tsx","utils/AxiosConfig.tsx","pages/usermanagement/ChangePasswordPanel.tsx","components/LoaderButton.js","contexts/AppBarContext.tsx","components/AppliedRoute.js","components/ProtectedRoute.tsx","pages/site/NotFound.tsx","components/DashboardComponent.tsx","pages/dashboards/AdminDashboard.tsx","pages/site/ConfirmEmail.tsx","pages/site/ResetPassword.tsx","pages/dashboards/AccountDashboard.tsx","pages/usermanagement/ChangePassword.tsx","pages/dashboards/AccountingDashboard.tsx","components/ForgotPasswordDialog.tsx","pages/site/Login.tsx","pages/dashboards/DashboardComponents/Tile.tsx","pages/dashboards/BroadcastAPI.tsx","pages/dashboards/DashboardComponents/DraftEditor.tsx","pages/dashboards/Dashboard.tsx","pages/Routes.tsx","App.tsx","pages/site/SettingsDialog.tsx","components/CacheBuster.js","hooks/useLoadContextEffect.tsx","hooks/useLoadContext.tsx","contexts/EmployeeInfoContext.tsx","serviceWorker.js","index.js","utils/CYMAAPI.tsx","utils/Functions.js","pages/timesheets/TimesheetAPI.tsx","contexts/ToastContext.tsx"],"names":["axiosInstance","AxiosConfig","instance","getExpensesForWeekEnding","userId","weekEndingDate","token","url","config","undefined","cancelToken","get","then","response","data","getExpensesForJob","jobNumber","params","weekEnding","getUTCDateString","flatMap","header","details","map","detail","postExpenses","post","putExpenses","id","put","putExpenseFiles","detailId","files","downloadExpenseReportExport","company","approvedOnly","unExportedOnly","responseType","window","URL","createObjectURL","Blob","link","document","createElement","filename","headers","substring","indexOf","getUTCAmericanDateString","href","setAttribute","body","appendChild","click","StateContext","arr","createContext","globalAny","global","drawerWidth","useStyles","makeStyles","theme","grow","flexGrow","height","color","overflowX","rightMenuItem","margin","marginRight","spacing","marginLeft","rightMenuMarginAuto","appBar","backgroundColor","palette","primary","main","transition","transitions","create","easing","sharp","duration","leavingScreen","zIndex","appBarShift","breakpoints","down","width","up","easeOut","enteringScreen","drawerPaper","type","background","paper","colors","blue","content","padding","display","overlfow","paddingLeft","contentShift","drawerHeader","alignItems","mixins","toolbar","justifyContent","footerList","paddingTop","mainList","overflowY","selectedListItemRoot","light","selected","secondary","userName","fontWeight","pageTitle","whiteSpace","darkModeToggle","SideBarListItem","list","item","goToLocation","location","closeParent","i","useState","open","setOpen","classes","itemLocation","matchLocation","divider","Fragment","key","hideDivider","subHeaderText","disableSticky","pathname","button","onClick","e","options","o","root","icon","text","closeDropdown","in","timeout","unmountOnExit","SidebarList","closeOnClick","props","filter","hidden","NavbarWithSidebar","useTheme","isMobile","useMediaQuery","noSsr","localDrawerOpen","localStorage","getItem","isAuthenticated","drawerOpen","setDrawerOpen","setItem","toString","useLocation","dialogType","state","filesOpen","settingsOpen","useLoggedInUser","employeeInfo","toast","useToast","title","showSearch","searchOptions","showSearchOptions","updateSearchOn","searchValue","appBarData","setAppBarData","useLayoutEffect","handleResizeList","getElementById","rectHeader","getBoundingClientRect","style","innerHeight","bottom","handleResizeContent","mainHeader","rectMainHeader","addEventListener","removeProperty","removeEventListener","useEffect","drawerItems","hasClaim","isInRole","creditCards","length","isInRoles","hasSkillClaim","history","push","search","Provider","value","className","position","clsx","elevation","edge","aria-label","getClaimValue","aria-controls","aria-haspopup","onClose","variant","anchor","ModalProps","keepMounted","disablePortal","children","goBack","handleLogout","toggleTheme","TokenGenerator","axios","CancelToken","cancelPromises","source","cancel","getSource","getCancelToken","authenticate","username","password","rememberMe","configAuth","authPacket","encodeURIComponent","catch","err","message","storeBaseURL","Promise","reject","sessionStorage","tokenExpiration","refreshToken","refreshTokenExpiration","Employee","user","deAuthenticate","impersonate","employee","isImpersonating","unImpersonate","getUsers","includeCards","includeDirectReports","includeFiles","includeJobsAndCostCodes","includeClosedCostCodes","includeClosedJobs","includeDisabled","getUser","getMe","postUser","firstName","lastName","employeeNumber","email","putUser","disabled","deleteUser","delete","putUserDirectReport","directReportId","deleteUserDirectReport","getDirectReports","d","confirmEmail","sendPasswordReset","resetPassword","newPassword","changePassword","currentPassword","adminChangePassword","putUserRole","roleName","deleteUserRole","getRoles","getUsersByClaim","claimType","claimValue","putClaim","claim","deleteClaimForUser","ClaimType","getDefaultClaims","tagValue","putDefaultClaim","deleteDefaultClaim","joinDate","lastLogin","_roles","claims","emailConfirmed","directReports","managers","jobs","earningsTypes","skills","costCodes","creditCardTransactions","isFake","expenseReportsObj","timesheetsObj","originalRoles","strRoles","hideAdmin","this","roles","dr","mn","sort","a","b","name","longName","expenseReports","er","ExpenseReport","Date","parse","periodEndingDate","timesheets","t","ts","Timesheet","r","toLowerCase","_header","role","findIndex","str","index","strRole","splice","caseSensitive","find","c","getClaim","val","useConfirmation","useContext","ConfirmationServiceContext","ToastContext","dateFormat","require","days","day","abb","hours","schedulerJobs","_dateCreated","_weekEnding","_employeeInfo","_jobs","emptyTimesheet","sortEarningsTypes","jobsClone","cloneDeep","et","canReplaceJob","forEach","shortName","desc","j","getWeekEndingDate","timesheet","getWeekEndingAsString","managerApprovedBy","accountingApprovedBy","isExpired","getTime","reduce","sum","s","h","parseStringNumber","agg","det","earningsType","reg","ot","totalHours","hoursByEarningsType","getErrors","validateJob","validateCostCode","errorMessages","isEqual","emptyDetail","jobIndex","job","Math","max","costCode","earningsTypeIndex","shopJobParts","skill","hour","isNaN","parseFloat","fieldId","clone","rowNumber","rowNum","promise","resolve","getCostCodesforJob","shopJobPartsID","code","newValue","updateDetailToNewJob","dayAbbr","hourRecord","dateOfRecord","getUTCDay","newHourRecord","emptyTicketHours","addDays","hourId","field","removeEmptyDetail","removeEmptyHours","hourRecordIndex","detailRecord","newPart","newJob","moveHourRecord","part","cloneThis","cymaJobNumber","codes","hourIndex","hourRecordHours","existingDetailTicket","existingHourRecord","existingHourRecordHours","headerId","approvalType","approvedBy","accountingApprovedDate","managerApprovedDate","timeTicket","emptyDays","totalDetail","total","getTimesheetForWeekEnding","status","validate","ticket","putTimesheet","postTimesheet","JSON","stringify","abbr","date","lastExportedDate","lastUpdatedBy","lastUpdatedDate","createdBy","createdDate","description","isPayable","emptyExpenseReport","expenseReport","expenseAmount","NaN","placeOfPurchase","dateOfPurchase","typesOfExpense","types","expenseType","schedulerJob","ccFound","updateCostCodes","valueForTest","replace","expense","comments","UsersContext","CONFIRM_TYPES","ConfirmationDialog","confirm","onSubmit","Button","yes","no","autoFocus","buttons","yesnocancel","yesno","ThemeProvider","Dialog","transitionDuration","exit","DialogTitle","DialogContent","split","DialogContentText","DialogActions","React","ConfirmationServiceProvider","setConfirm","awaitingPromiseRef","useRef","current","Boolean","catchOnCancel","useStateRef","originalValue","setState","ref","input","getUTCDate","cDate","UTC","getUTCFullYear","getUTCMonth","utcDate","setDate","getDate","roundToDigit","n","digits","multiplicator","pow","rounded","round","Number","EPSILON","toFixed","dateFormatter","format","dateParsed","valueOf","decimalFormatter","decimals","formatNumber","currencyFormatter","formatCurrency","number","getUniqueObj","getId","seen","hasOwnProperty","partition","isValid","elem","pass","fail","merge","cloneArr","getKey","remove","combinedRef","refs","isNumeric","includes","localeCompare","listboxComponent","tooltip","border","paddingBottom","listItem","listItemStatus","paddingRight","gridTemplateColumns","listItemLabel","listItemField","textAlign","listIcon","grey","searchTextField","dontRotate","transform","listbox","minHeight","listItemText","flex","minWidth","overflow","textOverflow","listItemTitle","fontSize","listItemContent","listItemActions","listItemAction","stacked","flexDirection","GenericAutocomplete","label","filterFields","idField","labelField","_titleField","titleField","contentField","deletable","editable","onDelete","onEdit","getNewSuggestion","suggestNew","showNewSuggestion","newSuggestionText","inputRef","onlyShowSuggestionIfEmpty","noContent","placeholder","TextFieldProps","useIsMobile","handleDelete","option","preventDefault","stopPropagation","handleEdit","filterOptions","inputValue","fields","filtered","sugg","unshift","getOptionLabel","getOptionSelected","ListboxComponent","renderOption","enterDelay","enterNextDelay","disableHoverListener","size","renderInput","inputProps","autoComplete","fullWidth","popupIndicatorOpen","popupIcon","limitTags","ListboxProps","rows","renderRow","cloneElement","top","OuterElementContext","OuterElementType","forwardRef","outerProps","other","itemData","Children","toArray","smUp","itemCount","itemSize","getChildSize","child","isValidElement","ListSubheader","gridRef","resetAfterIndex","useResetCache","outerElementType","innerElementType","overscanCount","EmployeeInfoContext","UserAutocomplete","autoHighlight","useUsersContext","textField","verticalAlign","datePickerContainer","boxSizing","dateInput","dense","DateChanger","parentDate","onChange","dateValue","parentDateValue","event","parsedDate","target","parsed","InputProps","disableUnderline","useMountEffectDefault","fun","useMountEffect","getAllCardAssignments","putCardAssignmentForUser","assignment","postCardAssignment","deleteCardAssignment","getCardTransactions","beginDate","endDate","putCardTransaction","transaction","postCardTransactions","transactions","deleteCardTransaction","deleteCardTransactionAssignment","uploadCardTransactions","file","FormData","append","emailCCUnprocessedTransactions","getGLCategories","postGLCategory","category","putGLCategory","deleteGLCategory","getCardTransactionsForUser","getUnassignedCardTransactionsForUser","getUnassignedCardTransactions","JobsContext","getFile","fileId","onProgress","onUploadProgress","getFileAndDownload","fileName","contentFilename","confirmPostFile","loadImage","distance","x1","y1","x2","y2","FilePreviewDialog","origDistance","scale","x","y","prevScale","origX","origY","prevX","prevY","end","img","touches","clientX","clientY","currScale","currX","currY","setTimeout","handleLoad","toastError","fileNickname","imgElement","start","zoom","trackPromise","uniqueId","loadImageOptions","canvas","orientation","contain","maxWidth","getComputedStyle","getPropertyValue","maxHeight","pixelRatio","devicePixelRatio","imageSmoothingQuality","parseMetaData","fullScreen","fileExtension","close","FilePondWrapper","setFiles","pond","setPond","removeFile","load","error","deleteFile","oninit","console","log","onupdatefiles","fileItems","fileItem","server","process","fieldName","metadata","progress","abort","transfer","postFile","lengthComputable","loaded","addFile","Axios","isCancel","revert","fetch","fileSource","labelIdle","imagePreviewMaxFileSize","imagePreviewMaxHeight","acceptedFileTypes","registerPlugin","FilePondPluginImagePreview","FilePondPluginImageExifOrientation","FilePondPluginFileValidateType","FileEditDialog","fileChanges","setFileChanges","activeElement","blur","save","TextField","onBlur","defaultValue","IconButtonMenu","Icon","menuProps","iconButtonProps","anchorEl","setAnchorEl","IconButton","currentTarget","Menu","FileList","editDialogOpenIndex","setEditDialogOpenIndex","handleFileDelete","downloadFile","childProps","ListItem","setSelectedFile","selectedFileID","showFile","ContainerProps","ContainerComponent","Checkbox","checked","tabIndex","disableRipple","ListItemText","linkedRecordType","ListItemSecondaryAction","right","MoreVert","MenuItem","deleteMode","Edit","Image","CloudDownload","Delete","updateFile","TabPanel","Typography","component","aria-labelledby","Box","p","undoSpan","textDecoration","float","minHeightDialog","tabs","tabPanel","FileDialog","setTabIndex","selectedFile","setDeleteMode","deletedFiles","setDeletedFiles","propsSelectedFileID","useHistory","locationState","previewFileId","selectedUserID","getUserFiles","oldFiles","newFile","setSelected","fileIndex","addToDeleted","removedFiles","editedFile","newfileName","renameFile","editedFileIndex","revertDeletedFile","tempDeleteFile","tempFile","success","autoClose","hideProgressBar","pauseOnHover","draggable","handleCancel","reason","cleanup","previewFile","AppBar","colorPrimary","colorSecondary","Toolbar","Tabs","newTabIndex","indicator","Tab","creditCardTransactionAssignments","expenseReportAssignments","fileToReturn","dismiss","promises","all","responses","errors","container","marginInline","darkTheme","common","white","darkThemeTitle","TileGroup","hide","noGrid","muitheme","useUsers","initialVal","users","setUsers","updateFunc","addNew","u","updatedUsers","us","DefaultClaimsContext","LoadingServiceContext","LoadingServiceProvider","setOptions","loadPromise","useCallback","minTimeToShow","finally","clearTimeout","newO","LoadingDialog","prod","test","local","getBaseURL","clearBaseURL","removeItem","newLocation","getBaseUrlName","refresh","accessToken","Authorization","getAccessToken","refreshTokens","Cancel","refreshPromise","getInstance","createAuthRefreshInterceptor","failedRequest","refreshAuth","interceptors","request","use","baseURL","strExp","getTokenExpiration","rootPaper","paperHeader","paperTitle","upperRightIcon","paperContent","actionButton","actionContainer","ResetPassword","setCurrentPassword","setNewPassword","confirmPassword","setConfirmPassword","showPasswords","setShowPasswords","checkErrors","setCheckErrors","requireCurrent","savePassword","toastSuccess","endAdornment","onMouseDown","helperText","onKeyDown","keyCode","LoaderButton","isLoading","loadingText","AppBarContext","AppliedRoute","C","cProps","rest","render","ProtectedRoute","M","mobileComponent","mobileSize","auth","cRole","empRoles","pageRoles","authorized","empRole","Authorized","innerWidth","to","from","NotFound","grid","gridItem","mobileGridItem","mobilePaper","cardContent","mobileCardContent","linkTile","cursor","green","red","purple","pink","orange","teal","brown","hover","borderRadius","boxShadow","DashboardComponent","createButton","Grid","zeroMinWidth","defaultContent","Paper","fileReader","fileReaderInputProps","createContent","visible","createTitle","direction","justify","AdminDashboard","themeGrey","marginTop","textPaper","elementPaper","ConfirmEmail","confirmed","setConfirmed","query","setUsername","passwordsDontMatch","setPasswordsDontMatch","useLoadContext","validatePassword","keyPress","resetForm","passReq","uname","onKeyPress","newPass","confPass","reset","Save","ChevronRight","AccountDashboard","ChangePassword","ChangePasswordPanel","selectedUser","select","optionPicker","checkboxWithLabel","AccountingDashboard","setApprovedOnly","setUnExportedOnly","selectedCompany","setSelectedCompany","setWeekEnding","downloadTimesheetExport","FormControl","InputLabel","shrink","htmlFor","Select","Input","displayEmpty","FormControlLabel","control","ForgotPasswordDialog","clearForm","handleClose","handleSubmit","handlePasswordReset","fontFamily","maxLoginWidth","left","loginForm","form","logo","forgotPassword","checkboxRoot","loginFeatures","spacer","Login","setIsLoading","setPassword","dialogOpen","setDialogOpen","setRememberMe","mobile","trim","userHasAuthenticated","square","alt","src","appVersion","FormGroup","labelPlacement","ButtonBase","wrapper","card","cardActions","iconBox","easeInOut","standard","lineHeight","iconLoading","actionTextButton","textTransform","actionIcon","Tile","actionText","ActionIcon","actionOnClick","loading","Card","raised","CardContent","CircularProgress","gutterBottom","Divider","CardActions","Launch","putBroadcast","broadcast","listPlugin","createListPlugin","linkifyPlugin","createLinkifyPlugin","editor","editorHeader","broadcastContainer","editorHeaderIcon","editorHeaderIconButton","DraftEditor","draftRef","editorState","onEditorChange","saving","readOnly","Editor","PluginEditor","showUrlInput","setShowUrlInput","urlValue","setUrlValue","toggleInlineStyle","RichUtils","confirmLink","contentStateWithEntity","getCurrentContent","createEntity","entityKey","getLastCreatedEntityKey","newEditorState","EditorState","set","currentContent","toggleLink","getSelection","FormatBold","FormatItalic","FormatUnderlined","toggleCode","Code","isCollapsed","contentState","startKey","getStartKey","startOffset","getStartOffset","linkKey","getBlockForKey","getEntityAt","getEntity","getData","Link","selection","LinkOff","gridColumn","handleKeyCommand","command","newState","keyBindingFn","getDefaultKeyBinding","decorators","decorator","plugins","which","CompositeDecorator","strategy","contentBlock","callback","findEntityRanges","character","getType","rel","broadcastTitleText","broadcastTitle","broadcastTitleTextField","Dashboard","ccTrx","setCCTrx","expenses","setExpenses","setTimesheet","broadcasts","setBroadcasts","broadcastsRef","activeBroadcast","setActiveBroadcast","createEmpty","setEditorState","editorStateRef","setSaving","savingTitle","setSavingTitle","trx","last","getFuture","getBroadcasts","unstable_batchedUpdates","convertFromRaw","createWithContent","getAPITimesheet","getAPIExpenseReport","newWE","xs","lg","original","newBroadcast","convertToRaw","broad","newEditor","getLastChangeType","deleteBroadcast","newActiveBroadcast","MobileStepper","steps","activeStep","nextButton","KeyboardArrowRight","backButton","KeyboardArrowLeft","sm","getTotalHours","Timer","getTotalExpenses","AttachMoney","assignments","CreditCard","Admin","Accounting","Manager","CreditCardDashboard","lazy","GLMapManager","MobileShopTimesheet","ShopDashboard","ValidateImportedParts","DesktopTimesheets","MobileTimesheets","MobileExpenseReports","DesktopExpenses","Approvals","ProjectData","ProjectValidate","JobDashboard","JobCosting","ManageUsers","SchedulerDashboard","MobileScheduler","BillRatesDashboard","ShopClock","ShopClockManager","SoDashboard","PODashboard","Routes","path","exact","configure","LoadingIndicator","promiseInProgress","usePromiseTracker","preventScroll","ctrlKey","div","createMuiTheme","withRouter","setEmployeeInfo","setJobs","refreshJobs","setRefreshJobs","updateUser","defaultClaims","setDefaultClaims","isDarkMode","setIsDarkMode","overrides","MuiTooltip","responsiveFontSizes","employeeId","isAccountingUp","isAdmin","getAllJobs","getUserAssignedJobs","refreshHandle","meHandle","setInterval","clearInterval","authenticated","empInfo","LocalizationProvider","dateAdapter","MomentUtils","clear","fallback","CacheBuster","backIcon","dialogTitle","dialogContent","centerContent","partData","formControl","marginBottom","formControlEarningsType","bold","autocomplete","listItemImpersonate","SettingsDialog","toggleWeekEnding","prevEmpInfo","existingClaim","removeClaim","addClaim","wasInRole","native","multiple","values","setRoles","packageJson","version","buildId","isLatestVersion","refreshCacheAndReload","caches","keys","names","reload","json","meta","latestVersion","currentVersion","latestBuildId","currentBuildId","shouldForceRefresh","versionA","versionB","versionsA","versionsB","shift","semverGreaterThan","isLatestBuild","Component","useLoadContextEffect","dispatch","context","initialValue","uuid","updateId","setValue","isLocalhost","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","LicenseManager","setLicenseKey","appHeight","iH","documentElement","setProperty","debounce","ReactDOM","App","origin","contentType","ready","unregister","checkValidServiceWorker","getJob","getFullJob","getUsersForJob","fullJob","getSchedulerJobAssignments","isSchedule","postUserJob","deleteUserJob","postJobAccessRequest","putCostCodeDescriptionAndClosed","dateClosed","postUserCostCode","deleteUserCostCode","getCYMAGl","getSkills","putSkill","assignSkillToUser","removeSkillFromUser","deleteSkill","getBillRates","putBillRate","rate","saveAsNew","deleteBillRate","isBillRateValid","regRate","otRate","validateRate","getCustomers","totalCCCost","cc","openPOValue","materialCost","otherCost","laborCostPay","laborCostBillable","strToRGB","hash","charCodeAt","toUpperCase","getRGBLightness","parseInt","pSBC","c0","c1","l","g","P","f","m","pSBCr","slice","Message","msg","prototype","setUTCDate","newDate","getNested","theObject","separator","obj","property","setNested","newVal","getTimesheetsForJob","sendRequestToReopenEmail","recordType","sendTimesheetReminder","postShopTimesheet","newTransaction"],"mappings":"4GAGA,+NAKMA,EAAgBC,IAAYC,WAc3B,SAASC,EAAyBC,EAAgBC,EAAwBC,GAC/E,IAAMC,EAAM,aAAeH,EAAS,aAAeC,EAE/CG,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASC,EAAkBC,EAAmBX,EAAyBC,GAC5E,IAAMC,EAAG,oBAAgBS,EAAhB,aAELR,EAAc,CAAES,OAAQ,IAM5B,YALcR,IAAVH,IACFE,EAAOE,YAAcJ,QAEAG,IAAnBJ,IAA8BG,EAAOS,OAAOC,WAAaC,YAAiBd,EAAgB,eAEvFL,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OACxCA,EAASC,KAA+BM,SAAQ,SAACC,GAChD,OAAOA,EAAOC,QAAQC,KAAI,SAACC,GAEzB,OADAA,EAAOH,OAASA,EACTG,WAMR,SAASC,EAAaJ,GAG3B,OAAOrB,EAAc0B,KAFT,YAEmBL,GAAQT,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG9D,SAASa,EAAYN,GAC1B,IAAMd,EAAM,aAAec,EAAOO,GAElC,OAAO5B,EAAc6B,IAAItB,EAAKc,GAAQT,MAAK,SAACC,GAAD,OAAcA,EAASC,QAS7D,SAASgB,EAAgBC,EAAkBC,GAChD,IAAMzB,EAAG,4BAAwBwB,EAAxB,UACT,OAAO/B,EAAc6B,IAAItB,EAAKyB,GAAOpB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAK5D,SAASmB,EACdC,EACA7B,EACA8B,EACAC,EACA9B,GAEA,IAAMC,EAAM,oBAAsB2B,EAAU,mBAAqB7B,GAAkB8B,EAAe,iBAAmB,KAAOC,EAAiB,mBAAqB,IAE9J5B,EAAc,CAChB6B,aAAc,QAOhB,YAJc5B,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAc,IAAD,QACjDN,EAAM+B,OAAOC,IAAIC,gBAAgB,IAAIC,KAAK,CAAC5B,EAASC,QACpD4B,EAAOC,SAASC,cAAc,KAChCC,EAAQ,oBACVhC,EAASiC,QAAQ,8BADP,aACV,EAAyCC,WACvC,UAAAlC,EAASiC,QAAQ,8BAAjB,eAAyCE,QAAQ,MAAO,GACxD,UAAAnC,EAASiC,QAAQ,8BAAjB,eAAyCE,QAAQ,SAAU,UAHnD,mCAIeC,YAAyB5C,GAJxC,SASZ,OAJAqC,EAAKQ,KAAO3C,EACZmC,EAAKS,aAAa,WAAYN,GAC9BF,SAASS,KAAKC,YAAYX,GAC1BA,EAAKY,QACEzC,O,iCC1GX,WAIe0C,IAFa,SAAoBC,GAApB,OAA4BC,wBAA6BD,K,uiBCmDxEE,EAAiBC,EACjBC,GAAc,IACrBC,GAAYC,aAAW,SAACC,GAAD,cAAmB,CAC9CC,KAAM,CACJC,SAAU,EACVC,OAAQ,OACRC,MAAO,QACPC,UAAW,UAEbC,cAAe,CACbC,OAAQ,OACRC,aAAcR,EAAMS,QAAQ,GAC5BC,WAAYV,EAAMS,QAAQ,IAE5BE,oBAAqB,CACnBD,WAAY,QAEdE,OAAQ,CACNC,gBAAiBb,EAAMc,QAAQC,QAAQC,KACvCZ,MAAO,UACPa,WAAYjB,EAAMkB,YAAYC,OAAO,CAAC,SAAU,SAAU,CACxDC,OAAQpB,EAAMkB,YAAYE,OAAOC,MACjCC,SAAUtB,EAAMkB,YAAYI,SAASC,gBAEvCC,OAAQ,MAEVC,aAAW,mBACRzB,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BC,MAAM,SAFC,cAIR5B,EAAM0B,YAAYG,GAAG,MAAQ,CAC5BD,MAAM,gBAAD,OAAkB/B,GAAlB,SALE,0BAOE,cAPF,2BAQGA,IARH,2BASGG,EAAMkB,YAAYC,OAAO,CAAC,SAAU,SAAU,CACxDC,OAAQpB,EAAMkB,YAAYE,OAAOU,QACjCR,SAAUtB,EAAMkB,YAAYI,SAASS,kBAX9B,GAcXC,YAAa,CACXnB,gBAAwC,SAAvBb,EAAMc,QAAQmB,KAAkBjC,EAAMc,QAAQoB,WAAWC,MAAQC,IAAOC,KAAK,IAC9FT,MAAO/B,IAETyC,QAAQ,aACNC,QAAS,EACTC,QAAS,OACTC,SAAU,OACVxB,WAAYjB,EAAMkB,YAAYC,OAAO,CAAC,SAAU,WAAY,CAC1DC,OAAQpB,EAAMkB,YAAYE,OAAOC,MACjCC,SAAUtB,EAAMkB,YAAYI,SAASC,iBAEtCvB,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BjB,YAAY,IACZF,YAAa,EACbkC,YAAa7C,KAGjB8C,cAAY,GACV1B,WAAYjB,EAAMkB,YAAYC,OAAO,CAAC,SAAU,WAAY,CAC1DC,OAAQpB,EAAMkB,YAAYE,OAAOU,QACjCR,SAAUtB,EAAMkB,YAAYI,SAASS,kBAH7B,cAKT/B,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BjB,WAAY,EACZF,aAAa,MAPL,cASTR,EAAM0B,YAAYG,GAAG,MAAQ,CAC5Ba,YAAa7C,KAVL,GAaZ+C,aAAa,yBACXJ,QAAS,OACTK,WAAY,SACZN,QAASvC,EAAMS,QAAQ,EAAG,IACvBT,EAAM8C,OAAOC,SAJN,IAKVC,eAAgB,aAElBC,WAAY,CACVC,WAAY,GAEdC,SAAU,CACRC,UAAW,QAEbC,qBAAsB,CACpB,aAAc,CACZxC,gBAAiBb,EAAMc,QAAQC,QAAQC,KACvC,UAAW,CACTH,gBAAiBb,EAAMc,QAAQC,QAAQuC,SAI7CC,SAAU,GACVC,UAAW,CACTpD,MAAOJ,EAAMc,QAAQ0C,UAAUxC,MAEjCyC,SAAU,CACRjB,QAAS,eACTkB,WAAY,OACZhD,WAAY,OACZF,YAAa,GAEfmD,UAAW,CACTpD,OAAQ,oBACRqD,WAAY,SACZF,WAAY,QAEdG,eAAgB,CACdnD,WAAY,EACZF,YAAa,YAIJsD,GAAkB,SAAC,GAc1B,EAbJC,KAaK,IAAD,IAZJC,EAYI,EAZJA,KACAC,EAWI,EAXJA,aACAC,EAUI,EAVJA,SACAC,EASI,EATJA,YACAC,EAQI,EARJA,EAQI,EACoBC,oBAAkB,GADtC,mBACGC,EADH,KACSC,EADT,KAEEC,EAAU1E,KAcZ2E,EAAY,UAAGT,EAAKU,qBAAR,QAAyBV,EAAKE,SAC9C,OAAOF,EAAKW,QACV,kBAAC,IAAMC,SAAP,CAAgBC,IAAKT,GAClBJ,EAAKc,YAAc,KAAO,kBAAC,IAAD,MAC1Bd,EAAKe,cAAgB,kBAAC,IAAD,CAAeC,eAAa,GAAEhB,EAAKe,eAAiC,MAG5F,kBAAC,IAAMH,SAAP,CAAgBC,IAAKT,GACnB,kBAAC,IAAD,CACEb,SAAUW,GAAYO,KAAY,OAAKP,QAAL,IAAKA,OAAL,EAAKA,EAAUe,UACjDC,OAAM,UAAElB,EAAKkB,cAAP,SACNL,IAAKT,EACLe,QAxBU,SAACnB,GAAD,OAAU,SAACoB,GAEnB,IAAD,GADL,OAAIpB,QAAJ,IAAIA,OAAJ,EAAIA,EAAME,UAAsB,OAAZD,QAAY,IAAZA,KAAY,OAAGD,QAAH,IAAGA,OAAH,EAAGA,EAAME,WAEnC,OAAJF,QAAI,IAAJA,GAAA,UAAAA,EAAMmB,eAAN,cAAAnB,GACW,OAAXG,QAAW,IAAXA,QAGEH,EAAKqB,SAASd,GAAQ,SAACe,GAAD,OAAQA,MAiBrBH,CAAQnB,GACjBQ,QAAS,CAAEe,KAAMf,EAAQnB,qBAAsBE,SAAUiB,EAAQjB,WAEhES,EAAKwB,KAAO,kBAAC,IAAD,KAAexB,EAAKwB,MAAuB,KACxD,kBAAC,IAAD,CAAczE,QAASiD,EAAKyB,OAC3BzB,EAAKqB,UAAYrB,EAAK0B,cAAgBpB,EAAO,kBAAC,IAAD,MAAiB,kBAAC,IAAD,MAAiB,MAEjFN,EAAKqB,UAAYrB,EAAK0B,cACrB,kBAAC,IAAD,CAAUC,GAAIrB,EAAMsB,QAAQ,OAAOC,eAAa,GAC9C,kBAACC,GAAD,CAAa/B,KAAMC,EAAKqB,QAASpB,aAAcA,EAAcC,SAAUA,EAAUC,YAAaH,EAAK+B,aAvBtF,kBAAMxB,GAAQ,SAuBsG7H,KAEjI,OAKGoJ,GAAc,SAACE,GAA6F,IAAD,EACtH,OACE,kBAAC,IAAMpB,SAAP,eACGoB,EAAMjC,YADT,aACG,EACGkC,QAAO,SAACjC,GAAD,wBAAWA,EAAKkC,cAAhB,YACR1I,KAAI,SAACwG,EAAMI,GAAP,OACH,kBAACN,GAAD,eAAiBe,IAAK,WAAaT,GAAO4B,EAA1C,CAAiDhC,KAAMA,EAAMI,EAAGA,UAM3D,SAAS+B,GAAkBH,GAAQ,IAAD,MACzCxB,EAAU1E,KACVE,EAAQoG,cACRC,EAAWC,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAChEC,EAAkBC,aAAaC,QAAQ,cAJE,EAKXrC,mBAAsC,SAApBmC,GAAwD,UAApBA,KAAuCH,GAAYL,EAAMW,kBALpG,mBAKxCC,EALwC,KAK5BC,EAL4B,KAM/CJ,aAAaK,QAAQ,aAArB,OAAmCF,QAAnC,IAAmCA,OAAnC,EAAmCA,EAAYG,YAE/C,IAAM7C,EAAW8C,cACXC,GAA4C,UAAI/C,EAASgD,aAAb,aAAG,EAAyBD,WACxEE,GAA2B,UAAfF,GACZG,GAA8B,aAAfH,GAX0B,GAaxBI,cAAhBC,GAbwC,qBAczCC,GAAQC,cAdiC,GAgBXnD,mBAA4B,CAC9DoD,MAAO,OACPC,YAAY,EACZC,cAAe,GACfC,mBAAmB,EACnBC,eAAgB,OAChBC,YAAa,KAtBgC,qBAgBxCC,GAhBwC,MAgB5BC,GAhB4B,MAyBzC1D,GAAI,OAAGsC,QAAH,IAAGA,KAAeP,EAG5B4B,2BAAgB,WACd,IAAMC,EAAmB,WAEvB,IAIU,EAJN5K,EAASsB,SAASuJ,eAAe,cACjCC,EAAU,OAAG9K,QAAH,IAAGA,OAAH,EAAGA,EAAQ+K,wBAErBtE,EAAOnF,SAASuJ,eAAe,YAC/BpE,IACFA,EAAKuE,MAAMnI,OAAS5B,OAAOgK,aAAP,iBAAsBH,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAYI,cAAlC,QAA4C,GAAK,OAInEC,EAAsB,WAC1B,IAIa,EAJTC,EAAa9J,SAASuJ,eAAe,gBACrCQ,EAAc,OAAGD,QAAH,IAAGA,OAAH,EAAGA,EAAYL,wBAE7B/F,EAAU1D,SAASuJ,eAAe,iBAClC7F,IACFA,EAAQgG,MAAMnI,OAAS5B,OAAOgK,aAAP,iBAAsBI,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAgBH,cAAtC,QAAgD,GAAK,OAShF,IALKnC,GAAYL,EAAMW,kBACrBpI,OAAOqK,iBAAiB,SAAUV,GAClCA,KAGE7B,EACF9H,OAAOqK,iBAAiB,SAAUH,GAClCA,QACK,CACL,IAAInG,EAAU1D,SAASuJ,eAAe,iBAClC7F,GACFA,EAAQgG,MAAMO,eAAe,UAIjC,OAAO,WACLtK,OAAOuK,oBAAoB,SAAUZ,GACrC3J,OAAOuK,oBAAoB,SAAUL,MAEtC,CAACpC,EAAUL,EAAMW,kBAEpBoC,qBAAU,WACH/C,EAAMW,iBAAiBE,GAAc,KACzC,CAACb,EAAMW,kBAEV,IAKMqC,GAAc,CAClB,CAAErE,SAAS,EAAMI,cAAe,OAAQD,aAAa,GACrD,CAAEW,KAAM,YAAaD,KAAM,kBAAC,IAAD,MAAetB,SAAU,IAAKgC,OAAM,OAAEoB,SAAF,IAAEA,QAAF,EAAEA,GAAc2B,SAAS,mBAAoB,SAC5G,CACExD,KAAM,YACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,aACVgC,SAAqB,OAAZoB,SAAY,IAAZA,QAAA,EAAAA,GAAc2B,SAAS,mBAAoB,WAA3C,OAAsD3B,SAAtD,IAAsDA,QAAtD,EAAsDA,GAAc2B,SAAS,aAAc,aAAY,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WAE1I,CACEzD,KAAM,iBACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,iBACVgC,QACc,OAAZoB,SAAY,IAAZA,QAAA,EAAAA,GAAc2B,SAAS,mBAAoB,YAC1C,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,oBAAmB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WAEvI,CACEzD,KAAM,aACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,aACVgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,kBAAiB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,oBAAmB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WAElJ,CAAEzD,KAAM,WAAYD,KAAM,kBAAC,IAAD,MAAiBtB,SAAU,YAAagC,QAAoB,OAAZoB,SAAY,IAAZA,QAAA,EAAAA,GAAc2B,SAAS,kBAAmB,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WACvJ,CACEzD,KAAM,eACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,eACVgC,OAAqD,KAA7C,iBAACoB,SAAD,IAACA,IAAD,UAACA,GAAc6B,mBAAf,aAAC,EAA2BC,cAA5B,QAAsC,MAAY,OAAC9B,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,aAAc,YAEpG,CAAE5D,KAAM,cAAeD,KAAM,kBAAC,IAAD,MAAWtB,SAAU,cAAegC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAcgC,oBAAmB,OAAChC,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WACnI,CACEzD,KAAM,iBACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,QACVgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,oBAAmB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,aAAc,YAE5J,CACE5D,KAAM,eACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,eACVgC,SACE,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,oBAAmB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YAGjK,CAAE5D,KAAM,YAAaD,KAAM,kBAAC,IAAD,MAActB,SAAU,aAAcgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YAC5H,CACE5D,KAAM,QACND,KAAM,kBAAC,IAAD,MACNL,QAAS,kBAAMa,EAAMuD,QAAQC,KAAKtF,EAASe,SAAWf,EAASuF,OAAhD,2BAA8DvF,EAASgD,OAAvE,IAAsFD,WAAY,YACjHf,QAAoB,OAAZoB,SAAY,IAAZA,QAAA,EAAAA,GAAc2B,SAAS,eAAgB,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WAEpF,CAAEvE,SAAS,EAAMI,cAAe,WAAYmB,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YACvG,CAAE5D,KAAM,YAAaD,KAAM,kBAAC,IAAD,MAAetB,SAAU,sBAAuBgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YACtI,CAAE5D,KAAM,cAAeD,KAAM,kBAAC,IAAD,MAAgBtB,SAAU,gBAAiBgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YACnI,CACE5D,KAAM,cACND,KAAM,kBAAC,IAAD,MACNtB,SAAU,eACVgC,SACE,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,YAAW,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc2B,SAAS,aAAc,oBAAmB,OAAC3B,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YAEjK,CAAE5D,KAAM,cAAeD,KAAM,kBAAC,IAAD,MAActB,SAAU,cAAegC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,UAAW,aAAc,YAC/H,CAAE1E,SAAS,EAAMI,cAAe,aAAcmB,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,QAAS,iBACzF,CAAE5D,KAAM,YAAaD,KAAM,kBAAC,IAAD,MAAoBtB,SAAU,uBAAwBgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,QAAS,iBAC5H,CAAE5D,KAAM,aAAcD,KAAM,kBAAC,IAAD,MAAatB,SAAU,aAAcgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc+B,UAAU,CAAC,QAAS,iBAC5G,CAAE1E,SAAS,EAAMI,cAAe,QAASmB,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,WACzE,CAAEzD,KAAM,kBAAmBD,KAAM,kBAAC,IAAD,MAAYtB,SAAU,eAAgBgC,SAAQ,OAACoB,SAAD,IAACA,QAAD,EAACA,GAAc4B,SAAS,YAGzG,OACE,kBAAC,IAAcQ,SAAf,CAAwBC,MAAO,CAAC5B,GAAYC,KAC1C,yBAAK4B,UAAWpF,EAAQvE,MACtB,kBAAC,IAAD,CACE4J,SAAS,SACTD,UAAWE,YAAKtF,EAAQ5D,OAAT,eACZ4D,EAAQ/C,YAAc6C,KAEzByF,UAAW,EACXlM,GAAG,gBAEH,kBAAC,IAAD,KACGmI,EAAMW,gBACL,kBAAC,IAAD,CAAYqD,KAAK,QAAQ5J,MAAM,UAAU6J,aAAW,OAAO9E,QAAS,kBAAM0B,GAAc,SAACvC,GAAD,OAAWA,OACjG,kBAAC,IAAD,OAEA,KACJ,kBAAC,IAAD,CAAY0F,KAAK,QAAQ5J,MAAM,UAAU6J,aAAW,OAAO9E,QAAS,wBAAMa,EAAMuD,QAAQC,KAAd,iBAAmBlC,SAAnB,IAAmBA,QAAnB,EAAmBA,GAAc4C,cAAc,sBAA/C,QAAiE,OACzI,kBAAC,IAAD,OAEF,kBAAC,IAAD,CAAYN,UAAWpF,EAAQb,WAAYoE,GAAWN,OACrDzB,EAAMW,gBAAkB,kBAAC,IAAD,CAAYiD,UAAWpF,EAAQf,UAAY4C,EAAoC,GAArC,OAAYiB,SAAZ,IAAYA,QAAZ,EAAYA,GAAc7D,UAA8B,KAC3H,kBAAC,IAAD,CACEuG,KAAK,MACLC,aAAW,WACXE,gBAAe,kBACfC,gBAAc,OACdjF,QAAS,kBAAMa,EAAMuD,QAAQC,KAAKtF,EAASe,SAAWf,EAASuF,OAAhD,2BAA8DvF,EAASgD,OAAvE,IAAsFD,WAAY,eACjH7G,MAAM,UACNwJ,UAAWE,YAAKtF,EAAQlE,cAAgB0F,EAAMW,gBAAgD,GAA9BnC,EAAQ7D,sBAExE,kBAAC,IAAD,SAIN,kBAAC,IAAD,CACE2D,KAAMA,GACN+F,QAAS,kBAAMxD,GAAc,IAC7ByD,QAASjE,EAAW,YAAc,aAClCkE,OAAO,OACP/F,QAAS,CACPrC,MAAOqC,EAAQxC,aAEjBwI,WAAY,CAAEC,aAAa,EAAMC,eAAe,IAEhD,yBAAK7M,GAAI,aAAc+L,UAAWpF,EAAQ5B,cACxC,kBAAC,IAAD,CAAYuC,QAAS,kBAAM0B,GAAc,KACvC,kBAAC,IAAD,CAAa+C,UAAWpF,EAAQhB,cAGpC,kBAAC,IAAD,MACCwC,EAAMW,gBACL,kBAAC,IAAD,CAAM9I,GAAG,WAAW+L,UAAWpF,EAAQrB,UACrC,kBAAC2C,GAAD,CAAa/B,KAAMiF,GAAa/E,aAhIvB,SAACC,GACpB8B,EAAMuD,QAAQC,KAAKtF,GACfmC,GAAUQ,GAAc,IA8H0C3C,SAAUA,KAEtE,MAEN,yBACErG,GAAI,gBACJ+L,UAAWE,YAAKtF,EAAQlC,QAAT,eACZkC,EAAQ7B,aAAe2B,MAG1B,0BAAMsF,UAAWE,YAAK,cAAexF,GAAO,WAAa,KAAM0B,EAAM2E,UACpErD,IAAgBH,GAAY,kBAAC,IAAD,CAAYtJ,GAAG,SAASyG,KAAM6C,GAAWG,aAAcA,GAAcC,MAAOA,GAAO8C,QAAS,kBAAMrE,EAAMuD,QAAQqB,YAAe,KAC5J,kBAAC,IAAD,CACEtG,KAAM8C,GACNE,aAAcA,GACdC,MAAOA,GACP8C,QAAS,kBAAMrE,EAAMuD,QAAQqB,UAC7BC,aAAc7E,EAAM6E,aACpBC,YAAa9E,EAAM8E,YACnBnE,gBAAiBX,EAAMW,wB,+pCC/b7B1K,EAAgBC,IAAYC,WAE5B4O,EAAiBC,IAAMC,YAIhBC,EAAiB,SAACC,GAC7BA,EAAOC,UAGIC,EAAY,WACvB,OAAON,EAAeI,UAGXG,EAAiB,SAACH,GAC7B,cAAOA,QAAP,IAAOA,OAAP,EAAOA,EAAQ5O,OAOJgP,EAAe,SAACC,EAAkBC,EAAkBC,EAAqBnP,GACpF,IAAMC,EAAM,kBAERmP,EAAa,CACf5M,QAAS,CACP,eAAgB,qCAElBpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,GAGzCkP,EAAa,YAAcC,mBAAmBL,GAAY,aAAeK,mBAAmBJ,GAEhG,OAAOxP,EACJ0B,KAAKnB,EAAKoP,EAAYD,GACtBG,OAAM,SAACC,GACN,MAAoB,kBAAhBA,EAAIC,SACNC,YAAa,QACbN,EAAWhP,iBAAcD,EAClBT,EAAc0B,KAAKnB,EAAKoP,EAAYD,IAEtCO,QAAQC,OAAOJ,MAEvBlP,MAAK,SAACC,GAAD,OAAcA,EAASC,QAC5BF,MAAK,SAACE,GASL,OARAqP,eAAetF,QAAQ,cAAe/J,EAAKR,OAC3C6P,eAAetF,QAAQ,wBAAyB/J,EAAKsP,iBACrDD,eAAetF,QAAQ,eAAgB/J,EAAKuP,cAC5CF,eAAetF,QAAQ,yBAA0B/J,EAAKwP,wBAClDb,GAAYjF,aAAaK,QAAQ,cAAe/J,EAAKR,OACrDmP,GAAYjF,aAAaK,QAAQ,wBAAyB/J,EAAKsP,iBAC/DX,GAAYjF,aAAaK,QAAQ,eAAgB/J,EAAKuP,cACtDZ,GAAYjF,aAAaK,QAAQ,yBAA0B/J,EAAKwP,wBAC7D,IAAIC,EAASzP,EAAK0P,UAKlBC,EAAiB,WAAO,IAAD,EAS9BrN,EAAO,gBAAkBwM,mBAAkB,UAACO,eAAe1F,QAAQ,uBAAxB,QAA2C,IAE1F,OAAOzK,EAAc0B,KAVT,UAUmB0B,EARd,CACfN,QAAS,CACP,eAAgB,wCAUT4N,EAAc,SAACtQ,GAC1B,IAEII,EAAS,CACXS,OAAQ,CAAEb,WAGZ,OAAOJ,EACJ0B,KAPS,eAOC,KAAMlB,GAChBI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAC5BF,MAAK,SAACE,GACLqP,eAAetF,QAAQ,cAAe/J,EAAKR,OAC3C6P,eAAetF,QAAQ,wBAAyB/J,EAAKsP,iBACrDD,eAAetF,QAAQ,eAAgB/J,EAAKuP,cAC5CF,eAAetF,QAAQ,yBAA0B/J,EAAKwP,wBACtD,IAAMK,EAAW,IAAIJ,EAASzP,EAAK0P,MAEnC,OADAG,EAASC,iBAAkB,EACpBD,MAKAE,EAAgB,WAG3B,OAAO7Q,EACJ0B,KAHS,kBAITd,MAAK,SAACC,GAAD,OAAcA,EAASC,QAC5BF,MAAK,SAACE,GAKL,OAJAqP,eAAetF,QAAQ,cAAe/J,EAAKR,OAC3C6P,eAAetF,QAAQ,wBAAyB/J,EAAKsP,iBACrDD,eAAetF,QAAQ,eAAgB/J,EAAKuP,cAC5CF,eAAetF,QAAQ,yBAA0B/J,EAAKwP,wBAC/C,IAAIC,EAASzP,EAAK0P,UAMlBM,EAAW,SACtBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA/Q,GAEA,IAEIE,EAAS,CACXsC,QAAS,GACTpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,EAC3CQ,OAAQ,IAWV,YARqBR,IAAjBsQ,IAA4BvQ,EAAOS,OAAO8P,aAAeA,QAChCtQ,IAAzBuQ,IAAoCxQ,EAAOS,OAAO+P,qBAAuBA,QACxDvQ,IAAjBwQ,IAA4BzQ,EAAOS,OAAOgQ,aAAeA,QAC7BxQ,IAA5ByQ,IAAuC1Q,EAAOS,OAAOiQ,wBAA0BA,QACzDzQ,IAAtB2Q,IAAiC5Q,EAAOS,OAAOmQ,kBAAoBA,QACxC3Q,IAA3B0Q,IAAsC3Q,EAAOS,OAAOkQ,uBAAyBA,QACzD1Q,IAApB4Q,IAA+B7Q,EAAOS,OAAOoQ,gBAAkBA,GAE5DrR,EAAcW,IAhBT,YAgBkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,KAAKS,KAAI,SAACiP,GAAD,OAAU,IAAID,EAASC,UAGvFc,EAAU,SACrBlR,EACA2Q,EACAC,EACAC,EACAC,EACAC,EACA7Q,GAEA,IAAMC,EAAM,aAAeH,EAEvBI,EAAS,CACXsC,QAAS,GACTpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,EAC3CQ,OAAQ,IASV,YANqBR,IAAjBsQ,IAA4BvQ,EAAOS,OAAO8P,aAAeA,QAChCtQ,IAAzBuQ,IAAoCxQ,EAAOS,OAAO+P,qBAAuBA,QACxDvQ,IAAjBwQ,IAA4BzQ,EAAOS,OAAOgQ,aAAeA,QAC7BxQ,IAA5ByQ,IAAuC1Q,EAAOS,OAAOiQ,wBAA0BA,QACpDzQ,IAA3B0Q,IAAsC3Q,EAAOS,OAAOkQ,uBAAyBA,GAE1EnR,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAc,IAAI0P,EAAS1P,EAASC,UAGpEyQ,EAAQ,SAACjR,GACpB,IAEIE,EAAS,CAAEsC,QAAS,GAAIpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,GAEvE,OAAOT,EAAcW,IAJT,eAIkBH,GAAQI,MAAK,SAACC,GAAD,OAAc,IAAI0P,EAAS1P,EAASC,UAGpE0Q,EAAW,SAAChB,GAAyC,IAAD,EAS3DpN,EACF,aACAwM,mBAAmBY,EAAKiB,WACxB,aACA7B,mBAAmBY,EAAKkB,UACxB,aACA9B,mBAAmBY,EAAKhJ,UACxB,mBACAoI,mBAAmBY,EAAKmB,gBACxB,UACA/B,mBAAmBY,EAAKoB,OACxB,YACAhC,mBAAmBY,EAAKtO,SACxB,aACA0N,mBAAkB,UAACY,EAAKhB,gBAAN,QAAkB,IAEtC,OAAOxP,EAAc0B,KAxBT,YAwBmB0B,EAtBd,CACfN,QAAS,CACP,eAAgB,uCAoB6BlC,MAAK,SAACC,GAAD,OAAc,IAAI0P,EAAS1P,EAASC,UAG/E+Q,EAAU,SAACzR,EAAgBoQ,GACtC,IAAMjQ,EAAM,aAAeH,EAQvBgD,EACF,aACAwM,mBAAmBY,EAAKiB,WACxB,aACA7B,mBAAmBY,EAAKkB,UACxB,aACA9B,mBAAmBY,EAAKhJ,UACxB,mBACAoI,mBAAmBY,EAAKmB,gBACxB,UACA/B,mBAAmBY,EAAKoB,OACxB,YACAhC,mBAAmBY,EAAKtO,SACxB,aACA0N,mBAAmBY,EAAKsB,UAE1B,OAAO9R,EAAc6B,IAAItB,EAAK6C,EAtBb,CACfN,QAAS,CACP,eAAgB,uCAoB4BlC,MAAK,SAACC,GAAD,OAAc,IAAI0P,EAAS1P,EAASC,UAG9EiR,EAAa,SAAC3R,EAAgBE,GACzC,IAAMC,EAAM,aAAeH,EAEvBI,EAAS,CAAEsC,QAAS,GAAIpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,GAEvE,OAAOT,EAAcgS,OAAOzR,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,SAG1DmR,EAAsB,SAAC7R,EAAgB8R,GAClD,IAAM3R,EAAG,oBAAgBH,EAAhB,0BAAwC8R,GACjD,OAAOlS,EAAc6B,IAAItB,GAAKK,MAAK,SAACC,GAAD,OAAc,IAAI0P,EAAS1P,EAASC,UAG5DqR,EAAyB,SAAC/R,EAAgB8R,EAAwB5R,GAC7E,IAAMC,EAAG,oBAAgBH,EAAhB,0BAAwC8R,GAC7C1R,EAAS,CACXsC,QAAS,GACTpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,GAE7C,OAAOT,EAAcgS,OAAOzR,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,SAG1DsR,EAAmB,SAC9BhS,EACA2Q,EACAE,EACAC,EACAC,EACA7Q,GAEA,IAAMC,EAAG,oBAAgBH,EAAhB,kBACLI,EAAS,CACXE,iBAAuBD,IAAVH,EAAsBA,OAAQG,EAC3CQ,OAAQ,IAQV,YALqBR,IAAjBsQ,IAA4BvQ,EAAOS,OAAO8P,aAAeA,QACxCtQ,IAAjBwQ,IAA4BzQ,EAAOS,OAAOgQ,aAAeA,QAC7BxQ,IAA5ByQ,IAAuC1Q,EAAOS,OAAOiQ,wBAA0BA,QACpDzQ,IAA3B0Q,IAAsC3Q,EAAOS,OAAOkQ,uBAAyBA,GAE1EnR,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,KAAKS,KAAI,SAAC8Q,GAAD,OAAO,IAAI9B,EAAS8B,UAiBpFC,EAAe,SAAClS,EAAgBE,GAC3C,IAAMC,EAAM,aAAeH,EAAS,gBAEhCgD,EAAO,SAAW9C,EAQtB,OAAON,EAAc0B,KAAKnB,EAAK6C,EANd,CACfN,QAAS,CACP,eAAgB,uCAI6BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGlEyR,EAAoB,SAAChD,GAChC,IAEInM,EAAO,YAAcwM,mBAAmBL,GAQ5C,OAAOvP,EAAc0B,KAVT,8BAUmB0B,EANd,CACfN,QAAS,CACP,eAAgB,uCAI6BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGlE0R,EAAgB,SAACjD,EAAkBjP,EAAemS,GAC7D,IAEIrP,EAAO,YAAcwM,mBAAmBL,GAAY,UAAYjP,EAAQ,gBAAkBsP,mBAAmB6C,GAQjH,OAAOzS,EAAc0B,KAVT,0BAUmB0B,EANd,CACfN,QAAS,CACP,eAAgB,uCAI6BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGlE4R,EAAiB,SAACtS,EAAgBuS,EAAyBF,GACtE,IAAMlS,EAAM,aAAeH,EAAS,kBAEhCgD,EAAO,mBAAqBwM,mBAAmB+C,GAAmB,gBAAkB/C,mBAAmB6C,GAQ3G,OAAOzS,EAAc0B,KAAKnB,EAAK6C,EANd,CACfN,QAAS,CACP,eAAgB,uCAI6BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGlE8R,EAAsB,SAACxS,EAAgBqS,GAClD,IAAMlS,EAAM,aAAeH,EAAS,uBAEhCgD,EAAO,eAAiBwM,mBAAmB6C,GAQ/C,OAAOzS,EAAc0B,KAAKnB,EAAK6C,EANd,CACfN,QAAS,CACP,eAAgB,uCAI6BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGlE+R,EAAc,SAACzS,EAAgB0S,GAC1C,IAAMvS,EAAM,aAAeH,EAAS,UAAY0S,EAQhD,OAAO9S,EAAc6B,IAAItB,EANR,CACfuC,QAAS,CACP,eAAgB,uCAIsBlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAG3DiS,EAAiB,SAAC3S,EAAgB0S,GAC7C,IAAMvS,EAAM,aAAeH,EAAS,UAAY0S,EAQhD,OAAO9S,EAAcgS,OAAOzR,EANX,CACfuC,QAAS,CACP,eAAgB,uCAIyBlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAI9DkS,EAAW,SAAC1S,GACvB,IACIE,EAAS,CAAEsC,QAAS,GAAIpC,iBAAuBD,IAAVH,EAAsBA,OAAQG,GACvE,OAAOT,EAAcW,IAFT,SAEkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,SAsDvDmS,EAAkB,SAACC,EAAmBC,EAAqB7S,GACtE,IAAMC,EAAM,2BAAoB2S,IAAeC,EAAU,WAAOA,GAAe,IAE3EzD,EAAa,CACfhP,iBAAuBD,IAAVH,EAAsBA,OAAQG,GAG7C,OAAOT,EAAcW,IAAIJ,EAAKmP,GAAY9O,MAAK,SAACC,GAAD,OAAcA,EAASC,SAG3DsS,EAAW,SAAChT,EAAgBiT,GACvC,IAAM9S,EAAM,aAAeH,EAAS,UAQhCgD,EAAO,aAAewM,mBAAmByD,EAAMH,WAAa,eAAiBtD,mBAAmByD,EAAMF,YAE1G,OAAOnT,EAAc6B,IAAItB,EAAK6C,EARb,CACfN,QAAS,CACP,eAAgB,uCAM4BlC,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGjEwS,EAAqB,SAAClT,EAAgBmT,GACjD,IAAMhT,EAAM,aAAeH,EAAS,qBAAuBwP,mBAAmB2D,GAI9E,OAAOvT,EAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,SAKlD0S,EAAmB,SAACN,EAAoBC,EAAqB7S,GACxE,IAEIE,EAA6B,CAC/BS,OAAQ,IAOV,OAJIX,IAAOE,EAAOE,YAAcJ,QACdG,IAAdyS,IAAyB1S,EAAOS,OAAOiS,UAAYtD,mBAAmBsD,IACtEC,IAAY3S,EAAOS,OAAOwS,SAAW7D,mBAAmBuD,IAErDnT,EAAcW,IAVT,kBAUkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGvD4S,EAAkB,SAACL,GAE9B,OAAOrT,EAAc6B,IADT,kBACkBwR,GAAOzS,MAAK,SAACC,GAAD,OAAcA,EAASC,SAGtD6S,EAAqB,SAAC/R,GACjC,IAAMrB,EAAG,0BAAsBqB,GAC/B,OAAO5B,EAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,SAoDlDyP,EAAb,WAuDE,WAAYC,GAAwB,IAAD,gEAtDnC5O,QAsDmC,OArDnC6P,eAqDmC,OApDnCC,cAoDmC,OAnDnClK,cAmDmC,OAlDnCmK,oBAkDmC,OAjDnCC,WAiDmC,OAhDnC1P,aAgDmC,OA/CnC0R,cA+CmC,OA9CnCC,eA8CmC,OA7CnCC,YA6CmC,OA5CnCC,YA4CmC,OA3CnCC,oBA2CmC,OA1CnClC,cA0CmC,OAzCnCmC,mBAyCmC,OAxCnCC,cAwCmC,OAvCnClS,WAuCmC,OAtCnCmS,UAsCmC,OArCnCC,mBAqCmC,OApCnCC,YAoCmC,OAnCnCC,eAmCmC,OAlCnCpH,iBAkCmC,OAjCnCqH,4BAiCmC,OA/BnCC,QAAkB,EA+BiB,KA9BnC5D,iBAA2B,EA8BQ,KA5BnC6D,uBA4BmC,OA3BnCC,mBA2BmC,OAzBnCC,mBAyBmC,OAxBnCC,cAwBmC,OAvBnCC,eAuBmC,EACjCC,KAAKlT,GAAK4O,EAAK5O,GACfkT,KAAKrD,UAAYjB,EAAKiB,UACtBqD,KAAKpD,SAAWlB,EAAKkB,SACrBoD,KAAKtN,SAAWgJ,EAAKhJ,SACrBsN,KAAKnD,eAAiBnB,EAAKmB,eAC3BmD,KAAKlD,MAAQpB,EAAKoB,MAClBkD,KAAK5S,QAAUsO,EAAKtO,QACpB4S,KAAKlB,SAAWpD,EAAKoD,SACrBkB,KAAKjB,UAAYrD,EAAKqD,UACtBiB,KAAKhB,OAAStD,EAAKuE,MACnBD,KAAKf,OAASvD,EAAKuD,OACnBe,KAAKd,eAAiBxD,EAAKwD,eAC3Bc,KAAKhD,SAAWtB,EAAKsB,SAErBgD,KAAKN,OAAL,iBAAchE,QAAd,IAAcA,OAAd,EAAcA,EAAI,cAAlB,SACAsE,KAAKlE,gBAAL,iBAAuBJ,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAI,uBAA3B,SAEAsE,KAAKb,cAAL,oBAAsBzD,EAAKyD,qBAA3B,aAAqB,EAAgC1S,KAAI,SAACyT,GAAD,OAAQ,IAAIzE,EAASyE,aAA9E,QAAsF,GACtFF,KAAKZ,SAAL,oBAAiB1D,EAAK0D,gBAAtB,aAAgB,EAA2B3S,KAAI,SAAC0T,GAAD,OAAQ,IAAI1E,EAAS0E,aAApE,QAA4E,GAC5EH,KAAK9S,MAAQwO,EAAKxO,MAClB8S,KAAKX,KAAO3D,EAAK2D,KACjBW,KAAKT,OAAL,UAAc7D,EAAK6D,cAAnB,aAAc,EAAaa,MAAK,SAACC,EAAGC,GAAJ,OAAWD,EAAEE,KAAOD,EAAEC,MAAQ,EAAI,KAClEP,KAAKV,cAAL,oBAAqB5D,EAAK4D,qBAA1B,aAAqB,EAAoBc,MAAK,SAACC,EAAGC,GAAJ,MAA0B,WAAfD,EAAEG,UAAyB,EAAmB,WAAfF,EAAEE,SAAwB,EAAIH,EAAEG,SAAWF,EAAEE,UAAY,EAAI,YAArJ,QAA4J,GAC5JR,KAAKR,UAAY9D,EAAK8D,UACtBQ,KAAK5H,YAAcsD,EAAKtD,YACxB4H,KAAKP,uBAAyB/D,EAAK+D,uBAEnCO,KAAKL,kBAAL,oBACEjE,EAAK+E,sBADP,aACE,EAAqBhU,KAAI,SAAC4H,GAAO,IAAD,IACxBqM,EAAK,IAAIC,IAAc,EAAM,IAAIC,KAAKA,KAAKC,MAAL,oBAAWxM,EAAEyM,wBAAb,aAAW,EAAoB9K,kBAA/B,QAA6C,KAAM0F,EAAK2D,MAEpG,OADAqB,EAAG1U,KAAOqI,EACHqM,YAJX,QAKQ,GACRV,KAAKJ,cAAL,oBACElE,EAAKqF,kBADP,aACE,EAAiBtU,KAAI,SAACuU,GAAO,IAAD,IACpBC,EAAK,IAAIC,IAAU,EAAM,IAAIN,KAAKA,KAAKC,MAAL,oBAAWG,EAAEF,wBAAb,aAAW,EAAoB9K,kBAA/B,QAA6C,KAAM0F,EAAK2D,KAAM3D,EAAK4D,eAE3G,OADA2B,EAAGjV,KAAOgV,EACHC,YAJX,QAKQ,GAERjB,KAAKF,SAAL,oBAAgBpE,EAAKuE,aAArB,aAAgB,EAAYxT,KAAI,SAAC0U,GAAD,uBAAOA,EAAEZ,YAAT,aAAO,EAAQa,wBAA/C,QAAiE,GACjEpB,KAAKC,MAAQvE,EAAKuE,MAClBD,KAAKH,cAAL,sBAA0BG,KAAKhB,cAA/B,QAAyC,IACzCgB,KAAKD,WAAY,EAnGrB,gDAkCE,WACE,OAAOC,KAAKL,kBAAkBlT,KAAI,SAAC4H,GAAD,OAAOA,EAAEgN,aAnC/C,sBAsCE,WACE,OAAOrB,KAAKJ,cAAcnT,KAAI,SAAC4H,GAAD,OAAOA,EAAEgN,aAvC3C,iBA+CE,WACE,OAAOrB,KAAKhB,QAhDhB,IA0CE,SAAUiB,GAAgB,IAAD,EACvBD,KAAKhB,OAASiB,EACdD,KAAKF,SAAL,iBAAgBG,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAOxT,KAAI,SAAC0U,GAAD,uBAAOA,EAAEZ,YAAT,aAAO,EAAQa,wBAA1C,QAA4D,KA5ChE,oBAmDE,WACE,OAAOpB,KAAKpD,UAAYoD,KAAKrD,UAAtB,UAAqCqD,KAAKrD,UAA1C,YAAuDqD,KAAKpD,UAAaoD,KAAKtN,WApDzF,uBA6GE,SAAU4O,GAAwB,IAAD,IAC/B,OAAO,iBAACtB,WAAD,IAACA,MAAD,UAACA,KAAMH,qBAAP,aAAC,EAAqB0B,WAAU,SAACJ,GAAD,OAAOA,EAAEZ,KAAKa,gBAAkBE,EAAKF,wBAArE,SAAwF,IAAM,IA9GzG,sBAiHE,SAASE,GAAwB,IAAD,OAC9B,OAAOtB,KAAKF,SAAS5K,QAAO,SAACsM,GAAD,QAAW,EAAKzB,WAAqB,UAARyB,MAAkBtT,QAApE,OAA4EoT,QAA5E,IAA4EA,OAA5E,EAA4EA,EAAMF,gBAAkB,IAlH/G,uBAqHE,SAAUnB,GAA2B,IAAD,OAClC,OAAOD,KAAKF,SAAS5K,QAAO,SAACsM,GAAD,QAAW,EAAKzB,WAAqB,UAARyB,MAAkBD,WAAU,SAACzB,GAAD,OAAmB,OAALG,QAAK,IAALA,OAAA,EAAAA,EAAOsB,WAAU,SAACJ,GAAD,OAAOA,EAAEC,gBAAkBtB,OAAa,MAAM,IAtHtK,qBAyHE,SAAQwB,GACNtB,KAAKF,SAASrH,KAAK6I,EAAKF,iBA1H5B,sBA6HE,SAASnB,GACPD,KAAKF,SAAWG,EAAMxT,KAAI,SAAC0U,GAAD,OAAOA,EAAEC,mBA9HvC,wBAiIE,SAAWE,GACT,IAAMG,EAAQzB,KAAKF,SAASyB,WAAU,SAACG,GAAD,OAAaA,IAAYJ,EAAKF,iBAChEK,GAAS,GAAGzB,KAAKF,SAAS6B,OAAOF,EAAO,KAnIhD,wBAsIE,WACEzB,KAAKC,MAAQD,KAAKH,cAClBG,KAAKF,SAAWE,KAAKH,cAAcpT,KAAI,SAAC0U,GAAD,uBAAOA,EAAEZ,YAAT,aAAO,EAAQa,mBAxI1D,sBA2IE,SAASlQ,GAAkE,IAAD,EAAnD0Q,EAAmD,wDACxE,iBAAO5B,KAAKf,cAAZ,aAAO,EAAa4C,MAAK,SAACC,GAAD,OAAQF,GAAiBE,EAAE1D,YAAclN,GAAS4Q,EAAE1D,UAAUgD,gBAAkBlQ,EAAKkQ,mBA5IlH,uBA+IE,SAAUlQ,GAAoE,IAAD,EAArD0Q,EAAqD,wDAC3E,iBAAO5B,KAAKf,cAAZ,aAAO,EAAa/J,QAAO,SAAC4M,GAAD,OAAQF,GAAiBE,EAAE1D,YAAclN,GAAS4Q,EAAE1D,UAAUgD,gBAAkBlQ,EAAKkQ,mBAhJpH,2BAmJE,SAAclQ,GAAmC,IAAD,IAC9C,iBAAO8O,KAAKf,cAAZ,iBAAO,EAAa4C,MAAK,SAACC,GAAD,OAAOA,EAAE1D,YAAclN,YAAhD,aAAO,EAAgDmN,aApJ3D,sBAuJE,SAASnN,EAAc0H,GAAyD,IAA1CgJ,EAAyC,wDACzErD,EAAQyB,KAAK+B,SAAS7Q,EAAM0Q,GAChC,YAAiBjW,IAAV4S,IAAyBqD,GAAiBrD,EAAMF,aAAezF,GAAU2F,EAAMF,WAAW+C,gBAAkBxI,EAAMwI,iBAzJ7H,2BA4JE,WACE,QAAOpB,KAAK+B,SAAS,SAAS,KA7JlC,sBAgKE,SAASxD,GACHyB,KAAKf,OAAQe,KAAKf,OAAOxG,KAAK8F,GAC7ByB,KAAKf,OAAS,CAACV,KAlKxB,yBAqKE,SAAYzR,GACV,IAAI2U,EAAQzB,KAAKf,OAAOsC,WAAU,SAAChD,GAAD,OAAWA,EAAMzR,KAAOA,KAC1D,IAAe,IAAX2U,EACJ,OAAOzB,KAAKf,OAAO0C,OAAOF,EAAO,GAAG,MAxKxC,oBAsGE,SAAaO,GACX,OAAO,IAAIvG,EAAJ,aACLiE,QAAQ,GACLsC,QAzGT,M,iCChjBA,sDAGaC,EAAkB,kBAAMC,qBAAWC,O,iCCHhD,qDAGa1L,EAAW,kBAAMyL,qBAAWE,O,8HCKrCC,EAAaC,EAAQ,IASnBC,EAAuD,CAC3D,CAAEC,IAAK,SAAUC,IAAK,MAAOC,WAAO/W,GACpC,CAAE6W,IAAK,SAAUC,IAAK,MAAOC,WAAO/W,GACpC,CAAE6W,IAAK,UAAWC,IAAK,MAAOC,WAAO/W,GACrC,CAAE6W,IAAK,YAAaC,IAAK,MAAOC,WAAO/W,GACvC,CAAE6W,IAAK,WAAYC,IAAK,OAAQC,WAAO/W,GACvC,CAAE6W,IAAK,SAAUC,IAAK,MAAOC,WAAO/W,GACpC,CAAE6W,IAAK,WAAYC,IAAK,MAAOC,WAAO/W,IASnBuV,E,WASnB,WAAY3K,EAAwBnK,GAA4G,IAA1FiT,EAAyF,uDAAvE,GAAIC,EAAmE,uDAAnC,GAAIqD,EAA+B,uDAAJ,GAAI,yBAR/ItB,aAQ+I,OAP/IuB,kBAO+I,OAN/IC,iBAM+I,OAL/IC,mBAK+I,OAJ/IC,MAAmB,GAI4H,KAH/IJ,cAA2B,GAGoH,KAF/IrD,mBAE+I,EAC7IU,KAAKqB,QAAUrB,KAAKgD,iBACpBhD,KAAKqB,QAAQP,iBAAmB1U,EAChC4T,KAAK6C,YAAczW,EACnB4T,KAAK5T,WAAaA,EAClB4T,KAAK4C,aAAe,IAAIhC,KACxBZ,KAAK8C,cAAgBvM,EACrByJ,KAAKzJ,aAAeA,EAEpByJ,KAAKX,KAAOA,EAEZW,KAAK2C,cAAgBA,EAErB3C,KAAKV,cAAgB2D,YAAkB3D,G,sCAOzC,WAAY,IAAD,EACL4D,EAAYC,oBAAUnD,KAAK+C,OAE/B,OADA,UAAA/C,KAAKV,qBAAL,SAAoBpK,QAAO,SAACkO,GAAD,OAAQA,EAAGC,iBAAeC,SAAQ,SAACF,GAAD,OAAQF,EAAUzK,KAAK,CAAEvM,UAAWkX,EAAGG,UAAWC,KAAMJ,EAAGG,eACjHL,G,IAPT,SAASO,GACPzD,KAAK+C,MAAQU,I,sBAgBf,WACE,OAAOzD,KAAK6C,a,IARd,SAAezW,GACTA,IAAe4T,KAAK6C,cACtB7C,KAAKqB,QAAQP,iBAAmB1U,EAChC4T,KAAK6C,YAAca,YAAkBtX,M,wBAazC,WACE,OAAO4T,KAAK8C,e,IANd,SAAiBvM,GACfyJ,KAAKqB,QAAQ/V,OAASiL,EAAazJ,GACnCkT,KAAK8C,cAAgBvM,I,gBAavB,WACE,OAAOyJ,KAAKqB,S,IAPd,SAASsC,GAAY,IAAD,IAClBA,EAAUrY,OAAV,UAAmBqY,EAAUrY,cAA7B,QAAuC0U,KAAK8C,cAAchW,GAC1D6W,EAAU7C,iBAAV,UAA6B6C,EAAU7C,wBAAvC,QAA2Dd,KAAK4D,wBAChE5D,KAAKqB,QAAUsC,I,kBAOjB,WACE,SAAO3D,KAAKqB,QAAQwC,mBAAqB7D,KAAKqB,QAAQyC,sBAAwB9D,KAAK+D,a,qBAGrF,WAAiB,IAAD,EACd,QAAQ,IAAInD,MAAOoD,WAAX,UAAuBhE,KAAK6C,mBAA5B,aAAuB,EAAkBmB,YAA1C,MAA+E,K,sBAGxF,WACE,OAAOhE,KAAKqB,QAAQ7U,QAAQyX,QAAO,SAACC,EAAK3G,GAAN,OAAY2G,EAAM3G,EAAEmF,MAAMuB,QAAO,SAACE,EAAGC,GAAJ,OAAUD,EAAIE,YAAkBD,EAAE1B,SAAQ,KAAI,K,+BAGpH,WACE,OAAO1C,KAAKqB,QAAQ7U,QAAQyX,QAC1B,SAACK,EAAKC,GAAS,IAAD,YACZ,OAAKA,EAAIC,eAEL,oBAACD,EAAIC,oBAAL,aAAC,EAAkBtW,QAAQ,cAA3B,SAAsC,IAAM,IAAK,oBAACqW,EAAIC,oBAAL,aAAC,EAAkBtW,QAAQ,aAA3B,SAAqC,IAAM,EAC9FoW,EAAIG,KAAOF,EAAI7B,MAAMuB,QAAO,SAACE,EAAGC,GAAJ,OAAUD,EAAIE,YAAkBD,EAAE1B,SAAQ,IAC7D,oBAAC6B,EAAIC,oBAAL,aAAC,EAAkBtW,QAAQ,aAA3B,SAAqC,IAAM,IACpDoW,EAAII,IAAMH,EAAI7B,MAAMuB,QAAO,SAACE,EAAGC,GAAJ,OAAUD,EAAIE,YAAkBD,EAAE1B,SAAQ,IAGhE4B,GARuBA,IAUhC,CAAEG,IAAK,EAAGC,GAAI,M,0BAIlB,WAAsB,IAAD,MACbC,EAAa3E,KAAK4E,oBACxB,OAAQ,UAACD,EAAWF,WAAZ,QAAmB,GAAK,KAAM,UAACE,EAAWD,UAAZ,QAAkB,GAAK,IAAM,UAACC,EAAWF,WAAZ,QAAmB,GAAK,K,6BAG7F,WACE,QAAOzE,KAAKqB,QAAQwC,oB,gCAGtB,WACE,QAAO7D,KAAKqB,QAAQyC,uB,mBAGtB,WACE,MAAO,c,kBAGT,WACE,OAAO9D,KAAK6E,c,uBAGd,WAAkE,IAAD,OAAvDC,IAAuD,yDAAnCC,IAAmC,yDAC3DC,EAA0B,GAC1BL,EAAa,EAiEjB,OA/DA3E,KAAKqB,QAAQ7U,QAAQ8W,SAAQ,SAAC5W,EAAQ2G,GAAO,IAAD,cAC1C,IAAI4R,kBAAQvY,EAAQ,EAAKwY,eAAzB,CAKA,GAAIJ,EAAa,CAAC,IAAD,QACXK,EAAQ,UAAG,EAAK9F,YAAR,aAAG,EAAWkC,WAAU,SAAC6D,GACnC,OAAOA,EAAIlZ,YAAcQ,EAAOR,cAUhB,KAPlBiZ,EAAWE,KAAKC,IAAL,UACTH,SADS,SACI,EACb,EAAKxC,cAAcpB,WAAU,SAAC6D,GAC5B,OAAOA,EAAIlZ,YAAcQ,EAAOR,iBAIgG,KAA7G,oBAAC,EAAKoT,qBAAN,aAAC,EAAoBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc7W,EAAO8X,cAAgBpB,EAAGC,wBAAlF,SAAqG,IAC1H2B,EAAcvM,KAAK,mBAAqB/L,EAAOR,UAAY,cAAgBmH,EAAI,KAKjF0R,GACqB,KAApBrY,EAAO6Y,UAAoB7Y,EAAO6Y,WAC0E,KAA7G,oBAAC,EAAKjG,qBAAN,aAAC,EAAoBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc7W,EAAO8X,cAAgBpB,EAAGC,wBAAlF,SAAqG,IAErG2B,EAAcvM,KAAK,6BAA+BpF,EAAI,IAGxD,IAAMmS,EAAiB,UAAG,EAAKlG,qBAAR,aAAG,EAAoBiC,WAAU,SAACiD,GACvD,OAAOA,EAAajB,YAAc7W,EAAO8X,iBAGvC,YAAKlF,qBAAL,eAAoBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc7W,EAAO8X,cAAgBpB,EAAGC,mBAAkB3W,EAAO+Y,cAC5GT,EAAcvM,KAAd,UAAsB/L,EAAO8X,aAA7B,mCAEyB,IAAvBgB,GAA0BR,EAAcvM,KAAK,6BAA+B/L,EAAO8X,aAAe,cAAgBnR,EAAI,KAElH,OAAJ,QAAI,IAAJ,eAAMkD,oBAAN,eAAoBgJ,SAAiD,KAAnC,OAAJ,QAAI,IAAJ,eAAMhJ,oBAAN,mBAAoBgJ,cAApB,eAA4BlH,UAAiB3L,EAAOgZ,OAAOV,EAAcvM,KAAK,6BAA+BpF,EAAI,IAEnJ3G,EAAOgW,MAAMY,SAAQ,SAACqC,GAChBA,EAAKjD,OACHiD,EAAKjD,MAAQ,GACfsC,EAAcvM,KAAK,kCAAoCkN,EAAKjD,OACnDiD,EAAKjD,MAAQ,EACtBsC,EAAcvM,KAAK,sBAAwBkN,EAAKjD,OACvCkD,MAAMC,WAAWF,EAAKjD,MAAM1M,cACrCgP,EAAcvM,KAAK,2BAA6BkN,EAAKjD,OAEvDiC,GAAckB,WAAWF,EAAKjD,MAAM1M,aAEpCgP,EAAcvM,KAAK,yBAIJ,IAAfkM,GACFK,EAAcvM,KAAK,yCAErBkM,EAAa,MAGRK,I,kBAGT,WACE,OAAO7B,oBAAUnD,Q,0BAGnB,SAAa8F,EAAiBlN,GAC5B,IAAImN,EAAQ5C,oBAAUnD,MAItB,OAHI+F,EAAM1E,QAAQyE,KAAalN,IAC7BmN,EAAM1E,QAAQyE,GAAWlN,GAEpBmN,I,uBAGT,WACE,IAAIA,EAAQ5C,oBAAUnD,MAEtB,OADA+F,EAAM1E,QAAQ7U,QAAQiM,KAAKsN,EAAMb,eAC1Ba,I,6BAGT,WACE,IAAIA,EAAQ5C,oBAAUnD,MAEtB,OADoB+F,EAAM1E,QAAQ7U,QAAQ+U,WAAU,SAAC7U,GAAD,OAAaA,EAAOI,OACnD,GAEnBiZ,EAAM1E,QAAQ7U,QAAQiM,KAAKsN,EAAMb,eAFJa,I,0BAOjC,SAAaC,GACX,IAAID,EAAQ5C,oBAAUnD,MAClBzT,EAASwZ,EAAM1E,QAKnB,OAJA9U,EAAOC,QAAQmV,OAAOqE,EAAW,GACH,IAA1BzZ,EAAOC,QAAQ6L,SACjB9L,EAAOC,QAAU,CAACuZ,EAAMb,gBAEnBa,I,kCAGT,SAAqBE,EAAgBza,GACnC,IAAIua,EAAQ5C,oBAAUnD,MAClBkG,EAA+B,KAC/BxZ,EAASqZ,EAAM1E,QAAQ7U,QAAQyZ,GAOnC,GALKvZ,EAAOgZ,OAA+C,IAAtCK,EAAMjD,cAAcvD,OAAOlH,SAC9C3L,EAAOgZ,MAAQK,EAAMjD,cAAcvD,OAAO,GAAGgB,MAI3C7T,EAAOR,WAAkC,KAArBQ,EAAOR,UAAkB,CAAC,IAAD,IAC/C,GAAIQ,EAAOR,aAAeQ,EAAO8S,UAAU,GAAK9S,EAAO8S,UAAU,GAAGtT,UAAY,IAAK,CAAC,IAAD,UAC/EkZ,EAAG,oBAAGW,EAAM1G,YAAT,aAAG,EAAYwC,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,oBAAtD,kBAAoE6Z,EAAMpD,qBAA1E,aAAoE,EAAqBd,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,aAChGga,GAAnC,iBAACd,QAAD,IAACA,GAAD,UAACA,EAAK5F,iBAAN,aAAC,EAAgBnH,cAAjB,QAA2B,GAAK,EAAa8C,QAAQgL,QAAR,OAAgBf,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAK5F,WACvD4G,YAAmB1Z,EAAOR,UAAWV,GAGlDkB,EAAOR,YAAa,oBAAC8T,KAAKV,qBAAN,aAAC,EAAoBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc7W,EAAOR,WAAakX,EAAGC,wBAA/E,SAAkG,IAAM,IAC9H3W,EAAO8X,aAAe9X,EAAOR,gBAG/BQ,EAAO8S,UAAY,GAGrB,OAAI0G,EACKA,EAAQpa,MAAK,SAACC,GACnB,IAGY,IAHRW,EAASqZ,EAAM1E,QAAQ7U,QAAQyZ,IACnCvZ,EAAO+Y,kBAAe9Z,EACtBe,EAAO2Z,oBAAiB1a,EACpBe,KACFA,EAAO8S,UAAYzT,EACc,KAA7B,UAAAW,EAAO8S,iBAAP,eAAkBnH,UAAc3L,EAAO6Y,SAAP,UAAkB7Y,EAAO8S,UAAU,UAAnC,aAAkB,EAAqB8G,OAE7E,OAAOP,KAGF5K,QAAQgL,QAAQJ,K,0BAmC3B,SAAaE,EAAgBH,EAAiBS,EAAe/a,GAA0C,IAAD,IAoB7D,IAnBnCua,EAAQ5C,oBAAUnD,MAChBpH,EAAK,OAAG2N,QAAH,IAAGA,IAAY,GAG1B,OAAI,UAAAR,EAAM1E,eAAN,mBAAe7U,QAAQyZ,UAAvB,eAAiCH,MAAalN,EACzCuC,QAAQgL,QAAQnG,MAGpB+F,EAAM1E,QAAQ7U,QAAQyZ,IAE3BF,EAAM1E,QAAQ7U,QAAQyZ,GAAQH,GAAWlN,EAGpCmN,EAAM1E,QAAQ7U,QAAQyZ,GAAQP,OAA+C,IAAtCK,EAAMjD,cAAcvD,OAAOlH,SACrE0N,EAAM1E,QAAQ7U,QAAQyZ,GAAQP,MAAQK,EAAMjD,cAAcvD,OAAO,GAAGgB,MAGtD,cAAZuF,EACKC,EAAMS,qBAAqBP,EAAQza,IACrB,iBAAZsa,IACL,oBAAC9F,KAAKV,qBAAN,aAAC,EAAoBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc3K,GAASwK,EAAGC,wBAApE,SAAuF,IAAM,IAC/F0C,EAAM1E,QAAQ7U,QAAQyZ,GAAQR,kBAAe9Z,EAC7Coa,EAAM1E,QAAQ7U,QAAQyZ,GAAQI,oBAAiB1a,GAI5CwP,QAAQgL,QAAQJ,KAlBoB5K,QAAQC,OAAO2K,K,+BAqB5D,SAAkBE,EAAgBQ,EAAiBF,GACjD,IAAIR,EAAQ5C,oBAAUnD,MAChBpH,EAAQgN,MAAMW,IAA0B,OAAbA,QAAkC5a,IAAb4a,GAAuC,KAAbA,EAAkB,IAAMA,EAexG,GAZAR,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMY,SAAQ,SAACoD,EAAYrT,GACvD,IAAImP,GAE6CA,EAAV,kBAA5BkE,EAAWC,aAAiC,IAAI/F,KAAKA,KAAKC,MAAM6F,EAAWC,eAC3ED,EAAWC,eAEXpE,EAAKC,EAAIoE,aAAanE,MAAQgE,GACvCV,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMf,OAAOtO,EAAG,MAKlC,MAAVuF,EAAgB,CACpB,IAAIiO,EAAgBd,EAAMe,mBAC1BD,EAAc5Z,SAAW8Y,EAAM1E,QAAQ7U,QAAQyZ,GAAQnZ,GACvD+Z,EAAcF,aAAeI,YAAQhB,EAAMlD,YAAaN,EAAKhB,WAAU,SAACiB,GAAD,OAASA,EAAIC,MAAQgE,KAAW,GACvGI,EAAcnE,MAAQ9J,EACtBmN,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMjK,KAAKoO,GAE3C,OAAOd,I,mCA6BT,SAAsBE,EAAgBe,EAAgBC,EAAeV,GAAiG,IAUrF,IAVGW,EAAiF,wDAA7CC,IAA6C,yDAC/JpB,EAAQ5C,oBAAUnD,MAChBpH,EAAmB,UAAVqO,GAAqBrB,MAAMW,IAA2B,OAAbA,EAAoB,IAAMA,EAG9Ea,EAAkBrB,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMnB,WAAU,SAACmF,EAAYrT,GAC/E,OAAOqT,EAAW5Z,KAAOka,KAGvBI,GAAmB,IACP,UAAVH,GAAgC,MAAVrO,GAA2B,IAAVA,IAAgBuO,EAIzDpB,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAM0E,GAAiBH,GAASrO,GAH9DmN,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMf,OAAOyF,EAAiB,GACxDF,GAAsE,KAAjD,UAAAnB,EAAM1E,QAAQ7U,QAAQyZ,UAAtB,mBAA+BvD,aAA/B,eAAsCrK,SAAc0N,EAAM1E,QAAQ7U,QAAQmV,OAAOsE,EAAQ,KAMtH,OAAOF,I,oCAGT,SAAuBE,EAAgBgB,EAAeV,GACpD,IAAIR,EAAQ5C,oBAAUnD,MAGlBqH,EAAetB,EAAM1E,QAAQ7U,QAAQyZ,GAOzC,OAJA,OAAIoB,QAAJ,IAAIA,OAAJ,EAAIA,EAAc5B,gBAChB4B,EAAa5B,aAAawB,GAASV,GAG9BR,I,8BAGT,SAAiBE,EAAgBe,EAAgBM,EAAuBC,EAAuB/C,GAA2C,IAAD,IACnIuB,EAAQ5C,oBAAUnD,MAQtB,OALc,UAAG+F,EAAM1E,QAAQ7U,QAAQyZ,UAAzB,iBAAG,EAA+BvD,aAAlC,aAAG,EAAsCb,MAAK,SAAC6E,EAAYrT,GACvE,OAAOqT,EAAW5Z,KAAOka,MAMlBjB,EAAMyB,eAAevB,EAAQe,EAAQM,EAASC,EAAQ/C,GAAc,GAGtErJ,QAAQC,OAAO2K,K,4BAGxB,SAAeE,EAAgBe,EAAgBS,EAAoBrC,EAAoBZ,GAA6D,IAAvCkD,IAAsC,yDAC7I3B,EAAQ2B,EAAYvE,oBAAUnD,MAAQA,KAEpC9T,EAAYkZ,EAAIuC,cAGtB,GACE5B,EAAM1E,QAAQ7U,QAAQyZ,GAAQ/Z,YAAcA,GAC5C6Z,EAAM1E,QAAQ7U,QAAQyZ,GAAQzB,eAAiBA,GAC/CuB,EAAM1E,QAAQ7U,QAAQyZ,GAAQI,iBAAmBoB,EAAK3a,GACtD,CAAC,IAAD,YAEA,GAAmD,IAA/CiZ,EAAM1E,QAAQ7U,QAAQyZ,GAAQvD,MAAMrK,OAAc,CACpD,IAAI3L,EAASqZ,EAAM1E,QAAQ7U,QAAQyZ,GAMnC,OALAvZ,EAAO8X,aAAeA,EACtB9X,EAAO2Z,eAAiBoB,EAAK3a,GAC7BJ,EAAO+Y,aAAegC,EACtB/a,EAAOR,UAAYA,EAEZka,YAAmBla,GAAWJ,MAAK,SAAC8b,GAAW,IAAD,IAGnD,OAFAlb,EAAO8S,UAAYoI,EACnBlb,EAAO6Y,SAAP,iBAAkBqC,QAAlB,IAAkBA,GAAlB,UAAkBA,EAAQ,UAA1B,aAAkB,EAAYtB,YAA9B,QAAsC,MAC/BP,KAKX,IAAI8B,EAAS,UAAG9B,EAAM1E,QAAQ7U,QAAQyZ,UAAzB,iBAAG,EAA+BvD,aAAlC,aAAG,EAAsCnB,WAAU,SAACmF,EAAYrT,GAC3E,OAAOqT,EAAW5Z,KAAOka,KAI3B,IAAmB,IAAfa,EAAkB,OAAO1M,QAAQC,OAAO2K,GAG5C,IAAIW,EAAU,UAAGX,EAAM1E,QAAQ7U,QAAQyZ,UAAzB,iBAAG,EAA+BvD,aAAlC,iBAAG,EAAsCf,OAAOkG,EAAW,UAA3D,aAAG,EAA6D,GAG1EC,EAAe,UAAgC,kBAArBpB,EAAWhE,MAAqBmD,WAAWa,EAAWhE,OAASgE,EAAWhE,aAArF,QAA+F,EAG9GqF,EAAuBhC,EAAM1E,QAAQ7U,QAAQqV,MAC/C,SAACnV,GAAD,OAAYA,EAAOR,YAAcA,GAAaQ,EAAO8X,eAAiBA,GAAgB9X,EAAO2Z,iBAAmBoB,EAAK3a,MAGvH,GAAIib,EAAsB,CAExB,IAAIC,EAAqBD,EAAqBrF,MAAMb,MAAK,SAAC8D,GAAD,OAAUA,EAAKgB,gBAAL,OAAsBD,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAYC,iBAGrG,GAAIqB,EAAoB,CAAC,IAAD,EAClBC,EAAuB,UAAwC,kBAA7BD,EAAmBtF,MAAqBmD,WAAWmC,EAAmBtF,OAASsF,EAAmBtF,aAA7G,QAAuH,EAIlJ,OADAsF,EAAmBtF,MAAQuF,EAA0BH,EAC9C3M,QAAQgL,QAAQJ,GAKvB,OAFAW,EAAWzZ,SAAW8a,EAAqBjb,GAC3Cib,EAAqBrF,MAAMjK,KAAKiO,GACzBvL,QAAQgL,QAAQJ,GAK3B,IAAIrZ,EAASsT,KAAKkF,cAWlB,OAVAxY,EAAOgW,MAAMjK,KAAKiO,GAElBha,EAAOwb,SAAWnC,EAAM1E,QAAQvU,GAChCJ,EAAOR,UAAYA,EACnBQ,EAAO8X,aAAeA,EACtB9X,EAAO2Z,eAAiBoB,EAAK3a,GAC7BJ,EAAO+Y,aAAegC,EAEtB1B,EAAM1E,QAAQ7U,QAAQiM,KAAK/L,GAEpB0Z,YAAmBla,GAAWJ,MAAK,SAAC8b,GAAW,IAAD,IAGnD,OAFAlb,EAAO8S,UAAYoI,EACnBlb,EAAO6Y,SAAP,iBAAkBqC,QAAlB,IAAkBA,GAAlB,UAAkBA,EAAQ,UAA1B,aAAkB,EAAYtB,YAA9B,QAAsC,MAC/BP,KAIX,OAAO5K,QAAQgL,QAAQJ,K,6BAGzB,SAAgBoC,EAAwCC,GACtD,IAAIrC,EAAQ5C,oBAAUnD,MAQtB,MAPqB,eAAjBmI,GACFpC,EAAM1E,QAAQyC,qBAAuBsE,EACrCrC,EAAM1E,QAAQgH,uBAAyBD,EAAa,IAAIxH,UAASjV,GACvC,YAAjBwc,IACTpC,EAAM1E,QAAQwC,kBAAoBuE,EAClCrC,EAAM1E,QAAQiH,oBAAsBF,EAAa,IAAIxH,UAASjV,GAEzDoa,I,0BAGT,SAAaoC,GACX,MAAqB,eAAjBA,EACKnI,KAAKqB,QAAQyC,qBACM,YAAjBqE,GACFnI,KAAKqB,QAAQwC,oB,mCAKxB,WACE,OAAOxX,YAAiB2T,KAAK6C,e,4BAG/B,SAAeoD,GAAiB,IAAD,EACvBsC,EAAavI,KAAKqB,QAAQ7U,QAAQyZ,GACpC1D,EAAOvC,KAAKwI,YAWhB,OATU,OAAVD,QAAU,IAAVA,GAAA,UAAAA,EAAY7F,aAAZ,SAAmBY,SAAQ,SAACoD,GAC1B,IAAIlE,GAE6CA,EAAV,kBAA5BkE,EAAWC,aAAiC,IAAI/F,KAAKA,KAAKC,MAAM6F,EAAWC,eAC3ED,EAAWC,gBAEbpE,EAAKC,EAAIoE,aAAalE,MAAQgE,EAAWhE,UAG7CH,I,2BAqBT,WAAiB,IAAD,SACVkG,EAAczI,KAAKkF,cAoBvB,OAnBAuD,EAAYvc,UAAY,UACxB,UAAA8T,KAAKqB,QAAQ7U,eAAb,SAAsB8W,SAAQ,SAAC5W,GAAY,IAAD,EACxC,UAAAA,EAAOgW,aAAP,SAAcY,SAAQ,SAACoD,GACrB,IAAIlE,EAE6CA,EAAV,kBAA5BkE,EAAWC,aAAiC,IAAI/F,KAAKA,KAAKC,MAAM6F,EAAWC,eAC3ED,EAAWC,aAEtB,IAAIE,EAAgB4B,EAAY/F,MAAMb,MAAK,SAACxB,GAAD,iBAAOO,KAAKC,MAAL,oBAAWR,EAAEsG,oBAAb,aAAW,EAAgB3Q,kBAA3B,QAAyC,OAAzC,UAAiDwM,SAAjD,aAAiD,EAAKwB,cACnG6C,KACHA,EAAgB,EAAKC,oBACPH,aAAenE,EAC7BiG,EAAY/F,MAAMjK,KAAKoO,IAGzBA,EAAcnE,MAAQ2B,YAAkBqC,EAAWhE,OAAS2B,YAAkBwC,EAAcnE,aAIzF+F,I,2BAGT,WAAiB,IAAD,EACd,iBAAOzI,KAAKqB,QAAQ7U,eAApB,aAAO,EAAsByX,QAAO,SAACyE,EAAOhc,GAAY,IAAD,EACrD,OACEgc,GAAK,UACLhc,EAAOgW,aADF,aACL,EAAcuB,QAAO,SAACC,EAAKwC,GACzB,OAAOxC,EAAMG,YAAkBqC,EAAWhE,SACzC,MAEJ,K,6BAIL,SAAgBlX,GAA0C,IAAD,OACvD,OAAIwU,KAAK8C,eAAiB9C,KAAK6C,YACb8F,YAA0B3I,KAAK8C,cAAchW,GAAIkT,KAAK4D,wBAAyBpY,GAE5FM,MAAK,SAACC,GACL,IAAIga,EAAQ5C,oBAAU,GAGtB,OAFgC,IAA5BpX,EAASS,QAAQ6L,SAActM,EAASS,QAAU,CAACuZ,EAAMb,gBAC7Da,EAAM/Z,KAAOD,EACNga,KAERhL,OAAM,SAACC,GACN,GAAIA,EAAIjP,SAAU,CAChB,GAA4B,MAAxBiP,EAAIjP,SAAS6c,OAAgB,OAAOzN,QAAQC,OAAOJ,GACvD,IAAI+K,EAAQ5C,oBAAU,GAEtB,OADA4C,EAAM/Z,KAAO+Z,EAAM/C,iBACZ7H,QAAQgL,QAAQJ,GAClB,OAAO5K,QAAQC,OAAOJ,MAG1BG,QAAQC,OAAO,CACpBH,QAAS,0BAA4B+E,KAAK8C,cAAgB,GAAK,mBAAqB9C,KAAK6C,YAAc,GAAK,wB,kBAKlH,WAAwF,IAAnFiC,IAAkF,yDAA9DC,IAA8D,yDAArC8D,IAAqC,yDACjF9C,EAAQ5C,oBAAUnD,MACtB,OAAK6I,GAAsE,IAA1D9C,EAAMlB,UAAUC,EAAaC,GAAkB1M,OAmBvD8C,QAAQC,OAAO,wDAlBtB2K,EAAM1E,QAAQ7U,QAAUuZ,EAAM1E,QAAQ7U,QAAQ0I,QAAO,SAAC4T,GACpD,OAAQ7D,kBAAQ6D,EAAQ/C,EAAMb,kBAG5Ba,EAAM1E,QAAQvU,GACTic,YAAahD,EAAM/Z,MAAMF,MAAK,SAACC,GAGpC,OAFgC,IAA5BA,EAASS,QAAQ6L,SAActM,EAASS,QAAU,CAACuZ,EAAMb,gBAC7Da,EAAM/Z,KAAOD,EACNga,KAGFiD,YAAcjD,EAAM/Z,MAAMF,MAAK,SAACC,GAGrC,OAFgC,IAA5BA,EAASS,QAAQ6L,SAActM,EAASS,QAAU,CAACuZ,EAAMb,gBAC7Da,EAAM/Z,KAAOD,EACNga,Q,4BASf,WAAoC,IAAD,EACjC,OAAO7E,EAAU8B,eAAV,UAAyBhD,KAAK4C,oBAA9B,aAA8CjX,K,yBAGvD,WAAiC,IAAD,EAC9B,OAAOuV,EAAUgE,YAAV,UAAsBlF,KAAK4C,oBAA3B,aAA2CjX,K,8BAGpD,WAAqC,IAAD,EAClC,OAAOuV,EAAU4F,iBAAV,UAA2B9G,KAAK4C,oBAAhC,aAAgDjX,K,uBAGzD,WACE,OAAOsd,KAAKpI,MAAMoI,KAAKC,UAAU3G,O,mCA3ZnC,SAA4B7V,EAA0BiX,EAAsBtE,GAC1E,IAAI0G,EAAQ5C,oBAAUQ,GAOtB,GALKjX,EAAOgZ,OAA+C,IAAtCK,EAAMjD,cAAcvD,OAAOlH,SAC9C3L,EAAOgZ,MAAQK,EAAMjD,cAAcvD,OAAO,GAAGgB,MAI3C7T,EAAOR,WAAkC,KAArBQ,EAAOR,UAAkB,CAAC,IAAD,IAC/C,GAAIQ,EAAOR,aAAeQ,EAAO8S,UAAU,GAAK9S,EAAO8S,UAAU,GAAGtT,UAAY,IAAK,CAAC,IAAD,UAC/EkZ,EAAG,2BAAI/F,QAAJ,IAAIA,IAAQ0G,EAAM1G,YAAlB,aAAG,EAAsBwC,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,oBAAhE,QAA8E6Z,EAAMpD,cAAcd,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,aAChJQ,EAAO8S,UAAP,iBAAmB4F,QAAnB,IAAmBA,OAAnB,EAAmBA,EAAK5F,iBAAxB,QAAqC,GACJ,KAA7B,UAAA9S,EAAO8S,iBAAP,eAAkBnH,QAAc3L,EAAO6Y,SAAP,UAAkB7Y,EAAO8S,UAAU,UAAnC,aAAkB,EAAqB8G,KACtE5Z,EAAO6Y,cAAW5Z,EACvBe,EAAO+Y,kBAAe9Z,EACtBe,EAAO2Z,oBAAiB1a,GAGtB,oBAACoa,EAAMzG,qBAAP,aAAC,EAAqBiC,WAAU,SAAC6B,GAAD,OAAQA,EAAGG,YAAc7W,EAAOR,WAAakX,EAAGC,wBAAhF,SAAmG,IAAM,EAC3G3W,EAAO8X,aAAe9X,EAAOR,UAE7BQ,EAAO8X,aAAe,QAGxB9X,EAAO8S,UAAY,GACnB9S,EAAO6Y,cAAW5Z,EAGpB,OAAOe,I,wCA4DT,SAAkCA,EAA0BN,EAAkBqa,EAAiBF,GAC7F,IAAM3N,EAAS2N,GAAyB,KAAbA,EAAsBlC,YAAkBkC,GAAtB,EAe7C,GAZA7Z,EAAOgW,MAAMY,SAAQ,SAACoD,EAAYrT,GAChC,IAAImP,GAE6CA,EAAV,kBAA5BkE,EAAWC,aAAiC,IAAI/F,KAAKA,KAAKC,MAAM6F,EAAWC,eAC3ED,EAAWC,eAEXpE,EAAKC,EAAIoE,aAAanE,MAAQgE,GACvC/Z,EAAOgW,MAAMf,OAAOtO,EAAG,MAKX,IAAVuF,EAAc,CAClB,IAAIiO,EAAgB3F,EAAU4F,mBAC9BD,EAAc5Z,SAAWP,EAAOI,GAChC+Z,EAAcF,aAAetE,EAAW0E,YAAQ3a,EAAYmW,EAAKhB,WAAU,SAACiB,GAAD,OAASA,EAAIC,MAAQgE,KAAW,GAAI,kBAC/GI,EAAcnE,MAAQ9J,EACtBlM,EAAOgW,MAAMjK,KAAKoO,GAEpB,OAAOna,I,4BAsLT,SAAsBA,EAA0Byc,GAAe,IAAD,IACxD5G,EAAOvC,KAAKwI,YAUhB,OATM,OAAN9b,QAAM,IAANA,GAAA,UAAAA,EAAQgW,aAAR,SAAeY,SAAQ,SAACoD,GACtB,IAAIlE,GAE6CA,EAAV,kBAA5BkE,EAAWC,aAAiC,IAAI/F,KAAKA,KAAKC,MAAM6F,EAAWC,eAC3ED,EAAWC,gBAEbpE,EAAKC,EAAIoE,aAAalE,MAAQ2B,YAAkBqC,EAAWhE,WAGtE,OAAOH,QAAP,IAAOA,GAAP,UAAOA,EAAMV,MAAK,SAACtE,GAAD,OAAOA,EAAEkF,MAAQ0G,YAAnC,aAAO,EAAmCzG,Q,2BAG5C,SAAqBhW,GAA2B,IAAD,EAC7C,cAAOA,QAAP,IAAOA,GAAP,UAAOA,EAAQgW,aAAf,aAAO,EAAeuB,QAAO,SAACC,EAAKwC,GAAN,aAAqBxC,EAAMG,YAAiB,iBAACqC,QAAD,IAACA,OAAD,EAACA,EAAYhE,aAAb,QAAsB,KAAI,K,4BA2GrG,WAA4D,IAAtC0G,EAAqC,uDAA9B,IAAIxI,KAC/B,MAAO,CACL9T,QAAInB,EACJL,YAAQK,EACR+P,UAAM/P,EACNmV,sBAAkBnV,EAClBkY,uBAAmBlY,EACnB2c,yBAAqB3c,EACrBmY,0BAAsBnY,EACtB0c,4BAAwB1c,EACxB0d,sBAAkB1d,EAClBa,QAAS,CAACwT,KAAKkF,YAAYkE,IAC3BE,mBAAe3d,EACf4d,qBAAiB5d,EACjB6d,eAAW7d,EACX8d,YAAapH,EAAW+G,EAAM,4B,yBAIlC,WAAyD,IAAtCA,EAAqC,uDAA9B,IAAIxI,KAC5B,MAAO,CACL9T,QAAInB,EACJuc,cAAUvc,EACVO,eAAWP,EACX+d,iBAAa/d,EACb+Z,WAAO/Z,EACP6Y,kBAAc7Y,EACd4Z,cAAU5Z,EACV0a,oBAAgB1a,EAChB8Z,kBAAc9Z,EACdY,YAAQZ,EACR+W,MAAO,GACPlD,UAAW,GACXgK,eAAW7d,EACXge,WAAW,EACXF,YAAapH,EAAW+G,EAAM,yBAC9BE,mBAAe3d,EACf4d,qBAAiB5d,K,8BAIrB,WAA6D,IAArCyd,EAAoC,uDAA7B,IAAIxI,KACjC,MAAO,CACL9T,QAAInB,EACJsB,cAAUtB,EACVgb,kBAAchb,EACd+W,MAAO,EACP+G,YAAapH,EAAW+G,EAAM,yBAC9BI,eAAW7d,EACX2d,mBAAe3d,EACf4d,qBAAiB5d,K,uBAIrB,WACE,OAAOsd,KAAKpI,MAAMoI,KAAKC,UAAU3G,Q,qICvvBjCF,EAAaC,EAAQ,IAeJ3B,E,WAQnB,WAAYpK,EAAwBnK,GAAwE,IAAtDiT,EAAqD,uDAAnC,GAAIsD,EAA+B,uDAAJ,GAAI,yBAP3GtB,aAO2G,OAN3GuB,kBAM2G,OAL3GC,iBAK2G,OAJ3GC,mBAI2G,OAH3GzD,KAAkB,GAGyF,KAF3GsD,cAA2B,GAGzB3C,KAAKqB,QAAUrB,KAAK4J,qBACpB5J,KAAKqB,QAAQP,iBAAmB1U,EAChC4T,KAAK6C,YAAczW,EACnB4T,KAAK5T,WAAaA,EAClB4T,KAAK4C,aAAe,IAAIhC,KACxBZ,KAAK8C,cAAgBvM,EACrByJ,KAAKzJ,aAAeA,EACpByJ,KAAKX,KAAOA,EACZW,KAAK2C,cAAgBA,E,4CAUvB,WACE,OAAO3C,KAAK6C,a,IARd,SAAezW,GACTA,IAAe4T,KAAK6C,cACtB7C,KAAKqB,QAAQP,iBAAmB1U,EAChC4T,KAAK6C,YAAca,YAAkBtX,M,wBAazC,WACE,OAAO4T,KAAK8C,e,IANd,SAAiBvM,GACfyJ,KAAKqB,QAAQ/V,OAASiL,EAAazJ,GACnCkT,KAAK8C,cAAgBvM,I,gBAavB,WACE,OAAOyJ,KAAKqB,S,IAPd,SAASwI,GAAgB,IAAD,IACtBA,EAAcve,OAAd,UAAuBue,EAAcve,cAArC,QAA+C0U,KAAK8C,cAAchW,GAClE+c,EAAc/I,iBAAd,UAAiC+I,EAAc/I,wBAA/C,QAAmEd,KAAK4D,wBACxE5D,KAAKqB,QAAUwI,I,kBAOjB,WACE,OAAO1G,oBAAUnD,KAAKhU,Q,kBAGxB,WACE,SAAOgU,KAAKqB,QAAQwC,mBAAqB7D,KAAKqB,QAAQyC,sBAAwB9D,KAAK+D,a,qBAGrF,WAAiB,IAAD,EACd,QAAQ,IAAInD,MAAOoD,WAAX,UAAuBhE,KAAK6C,mBAA5B,aAAuB,EAAkBmB,YAA1C,MAA+E,K,6BAGxF,WACE,QAAOhE,KAAKqB,QAAQwC,oB,gCAGtB,WACE,QAAO7D,KAAKqB,QAAQyC,uB,yBAGtB,WACE,OAAO9D,KAAKqB,QAAQ7U,QAAQyX,QAAO,SAACC,EAAK3G,GAAN,aAAY2G,GAAG,UAAI3G,EAAEuM,qBAAN,QAAuB,KAAI,K,mBAG/E,WACE,MAAO,a,kBAGT,WACE,OAAO9J,KAAK6E,c,uBAGd,WAAkE,IAAD,OAAnCE,IAAmC,yDAC3DC,EAA0B,GA6B9B,OA3BAhF,KAAKqB,QAAQ7U,QAAQ8W,SAAQ,SAAC5W,EAAQ2G,GAAO,IAAD,kBAC1C,IAAI4R,kBAAQvY,EAAQ,EAAKwY,eAAzB,EAEIU,MAAK,UAAClZ,EAAOod,qBAAR,QAAyBC,OAAQ,UAACrd,EAAOod,qBAAR,QAAyB,IAAM,IACvE9E,EAAcvM,KAAK,wCAAgC/L,EAAOod,qBAAvC,QAAwD,GAAK,YAAczW,EAAI,IAE/F3G,EAAOR,WAAkC,KAArBQ,EAAOR,WAAkB8Y,EAAcvM,KAAK,wBAA0B/L,EAAOR,UAAY,YAAcmH,EAAI,IAE/H3G,EAAOsd,iBAA8C,KAA3Btd,EAAOsd,iBAAwBhF,EAAcvM,KAAK,8BAAgC/L,EAAOsd,gBAAkB,YAAc3W,EAAI,MAG1J,iBAAC3G,QAAD,IAACA,OAAD,EAACA,EAAQud,sBAAT,QAA2B,IAAM,EAAKpH,aACrC,EAAKxB,QAAQP,mBAAoB,iBAACpU,QAAD,IAACA,OAAD,EAACA,EAAQud,sBAAT,QAA2B,IAAM,EAAK5I,QAAQP,mBAC/EpU,EAAOud,iBAERjF,EAAcvM,KAAK,kBAAoBpM,YAAiBK,EAAOud,gBAAkB,WAAa5W,EAAI,KAEb,IAAnF,EAAK6W,iBAAiB3I,WAAU,SAAC4I,GAAD,OAAWA,EAAM5J,OAAS7T,EAAO0d,gBACnEpF,EAAcvM,KAAK,0BAA4B/L,EAAO0d,YAAc,WAAa/W,EAAI,IAEvF,IAAI+R,EAAM,EAAK/F,KAAKwC,MAAK,SAAC4B,GAAD,OAAOA,EAAEvX,YAAcQ,EAAOR,aACnDme,EAAe,EAAK1H,cAAcd,MAAK,SAAC4B,GAAD,OAAOA,EAAEvX,YAAcQ,EAAOR,aACrEoe,GACF,iBAAClF,QAAD,IAACA,GAAD,UAACA,EAAK5F,iBAAN,aAAC,EAAgB+B,WAAU,SAACO,GAAD,OAAOA,EAAEwE,OAAS5Z,EAAO6Y,mBAApD,SAAkE,IAAM,IAAK,iBAAC8E,QAAD,IAACA,GAAD,UAACA,EAAc7K,iBAAf,aAAC,EAAyB+B,WAAU,SAACO,GAAD,OAAOA,EAAEwE,OAAS5Z,EAAO6Y,mBAA7D,SAA2E,IAAM,EAC5JR,IAAqBuF,GAAStF,EAAcvM,KAAK,uBAAyB/L,EAAO6Y,SAAW,UAAYlS,EAAI,QAG3G2R,I,kBAoBT,WACE,OAAO7B,oBAAUnD,Q,0BAGnB,SAAa8F,EAAiBlN,GAC5B,IAAImN,EAAQ5C,oBAAUnD,MAItB,OAHI+F,EAAM1E,QAAQyE,KAAalN,IAC7BmN,EAAM1E,QAAQyE,GAAWlN,GAEpBmN,I,uBAGT,WACE,IAAIA,EAAQ5C,oBAAUnD,MAEtB,OADA+F,EAAM1E,QAAQ7U,QAAQiM,KAAKsN,EAAMb,eAC1Ba,I,6BAGT,WACE,IAAIA,EAAQ5C,oBAAUnD,MAEtB,OADoB+F,EAAM1E,QAAQ7U,QAAQ+U,WAAU,SAAC7U,GAAD,OAAaA,EAAOI,OACnD,GAEnBiZ,EAAM1E,QAAQ7U,QAAQiM,KAAKsN,EAAMb,eAFJa,I,0BAOjC,SAAaC,GACX,IAAID,EAAQ5C,oBAAUnD,MAClBzT,EAASwZ,EAAM1E,QAKnB,OAJA9U,EAAOC,QAAQmV,OAAOqE,EAAW,GACH,IAA1BzZ,EAAOC,QAAQ6L,SACjB9L,EAAOC,QAAU,CAACuZ,EAAMb,gBAEnBa,I,6BAGT,SAAgBE,EAAgBza,GAC9B,IAAIua,EAAQ5C,oBAAUnD,MAClBkG,EAA+B,KAC/BxZ,EAASqZ,EAAM1E,QAAQ7U,QAAQyZ,GAEnC,GAAIvZ,EAAOR,WAAkC,KAArBQ,EAAOR,WAC7B,GAAIQ,EAAOR,aAAeQ,EAAO8S,UAAU,GAAK9S,EAAO8S,UAAU,GAAGtT,UAAY,IAAK,CAAC,IAAD,UAC/EkZ,EAAG,oBAAGW,EAAM1G,YAAT,aAAG,EAAYwC,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,oBAAtD,kBAAoE6Z,EAAMpD,qBAA1E,aAAoE,EAAqBd,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,aAChGga,GAAnC,iBAACd,QAAD,IAACA,GAAD,UAACA,EAAK5F,iBAAN,aAAC,EAAgBnH,cAAjB,QAA2B,GAAK,EAAa8C,QAAQgL,QAAR,OAAgBf,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAK5F,WACvD4G,YAAmB1Z,EAAOR,UAAWV,SAGtDkB,EAAO8S,UAAY,GACnB9S,EAAO6Y,cAAW5Z,EAGpB,OAAIua,EACKA,EAAQpa,MAAK,SAACC,GACnB,IACY,EADRW,EAASqZ,EAAM1E,QAAQ7U,QAAQyZ,GAC/BvZ,IACFA,EAAO8S,UAAYzT,EACc,KAA7B,UAAAW,EAAO8S,iBAAP,eAAkBnH,UAAc3L,EAAO6Y,SAAW7Y,EAAO8S,UAAU,GAAG8G,OAE5E,OAAOP,KAGF5K,QAAQgL,QAAQJ,K,yBAuB3B,SAAYE,EAAgBH,EAAiBS,EAAe/a,GAC1D,IAAIua,EAAQ5C,oBAAUnD,MAChBpH,EAAQ2N,GAAY,GAG1B,GAAIR,EAAM1E,QAAQ7U,QAAQyZ,GAAQH,KAAalN,EAC7C,OAAOuC,QAAQgL,QAAQJ,GAKzB,GAFAA,EAAM1E,QAAQ7U,QAAQyZ,GAAQH,GAAWlN,EAEzB,cAAZkN,EACF,OAAOC,EAAMwE,gBAAgBtE,EAAQza,GAChC,GAAgB,kBAAZsa,EAA6B,CACtC,IAAI0E,EAAejE,EAWnB,OAVAiE,EAAeA,EAAaC,QAAQ,IAAK,IAGvCD,EAFE5E,MAAM4E,IAAkC,OAAjBA,EAEV,EAEAnG,YAAkBmG,GAGnCzE,EAAM1E,QAAQ7U,QAAQyZ,GAAQH,GAAW0E,EAElCrP,QAAQgL,QAAQJ,GAEvB,OAAO5K,QAAQgL,QAAQJ,K,6BAI3B,SAAgBoC,EAAwCC,GACtD,IAAIrC,EAAQ5C,oBAAUnD,MAQtB,MAPqB,eAAjBmI,GACFpC,EAAM1E,QAAQyC,qBAAuBsE,EACrCrC,EAAM1E,QAAQgH,uBAAyBD,EAAa,IAAIxH,UAASjV,GACvC,YAAjBwc,IACTpC,EAAM1E,QAAQwC,kBAAoBuE,EAClCrC,EAAM1E,QAAQiH,oBAAsBF,EAAa,IAAIxH,UAASjV,GAEzDoa,I,0BAGT,SAAaoC,GACX,MAAqB,eAAjBA,EACKnI,KAAKqB,QAAQyC,qBACM,YAAjBqE,GACFnI,KAAKqB,QAAQwC,oB,mCAKxB,WACE,OAAOxX,YAAiB2T,KAAK6C,e,2BAG/B,WAAiB,IAAD,EACV4F,EAAczI,KAAKkF,cAGvB,OAFAuD,EAAYwB,eAAiB,UAC7BxB,EAAYqB,cAAZ,UAA4B9J,KAAKqB,QAAQ7U,eAAzC,aAA4B,EAAsByX,QAAO,SAACC,EAAKxX,GAAN,aAAiBwX,GAAG,UAAIxX,EAAOod,qBAAX,QAA4B,KAAI,GACtGrB,I,8BAGT,WAAoB,IAAD,EACjB,iBAAOzI,KAAKqB,QAAQ7U,eAApB,aAAO,EAAsByX,QAAO,SAACC,EAAKxX,GAAN,aAAiBwX,GAAG,UAAIxX,EAAOod,qBAAX,QAA4B,KAAI,K,iCAI1F,SAAoBte,GAA8C,IAAD,OAC/D,OAAIwU,KAAK8C,eAAiB9C,KAAK6C,YACbxX,YAAyB2U,KAAKzJ,aAAazJ,GAAIkT,KAAK4D,wBAAyBpY,GAE1FM,MAAK,SAACC,GACL,IAAIga,EAAQ5C,oBAAU,GAKtB,OAJgC,IAA5BpX,EAASS,QAAQ6L,SACnBtM,EAASS,QAAU,CAACuZ,EAAMb,gBAE5Ba,EAAM/Z,KAAOD,EACNga,KAERhL,OAAM,SAACC,GAAS,IAAD,EACV+K,EAAQ5C,oBAAU,GACtB,GAA8B,OAAvB,OAAHnI,QAAG,IAAHA,GAAA,UAAAA,EAAKjP,gBAAL,eAAe6c,QACjB,MAAM5N,EAIR,OADA+K,EAAM/Z,KAAO+Z,EAAM6D,qBACZzO,QAAQgL,QAAQJ,MAGpB5K,QAAQC,OAAO,6BAA+B4E,KAAKzJ,aAAe,GAAK,kBAAoByJ,KAAK6C,YAAc,GAAK,uB,kBAI9H,WAA4F,IAAvFiC,IAAsF,yDAAlEC,IAAkE,yDAAzC8D,IAAyC,yDACrF9C,EAAQ5C,oBAAUnD,MAItB,OAHA+F,EAAM/Z,KAAKQ,QAAUuZ,EAAM/Z,KAAKQ,QAAQ0I,QAAO,SAACxI,GAC9C,OAAQuY,kBAAQvY,EAAQqZ,EAAMb,kBAE3B2D,GAAsE,IAA1D9C,EAAMlB,UAAUC,EAAaC,GAAkB1M,OAevD8C,QAAQC,OAAO,4DAdlB2K,EAAM/Z,KAAKc,GACND,YAAYkZ,EAAM/Z,MAAMF,MAAK,SAACC,GAGnC,OAFAga,EAAM/Z,KAAOD,EACqB,IAA9Bga,EAAM/Z,KAAKQ,QAAQ6L,SAAc0N,EAAM/Z,KAAKQ,QAAU,CAACuZ,EAAMb,gBAC1Da,KAGFpZ,YAAaoZ,EAAM/Z,MAAMF,MAAK,SAACC,GAGpC,OAFAga,EAAM/Z,KAAOD,EACqB,IAA9Bga,EAAM/Z,KAAKQ,QAAQ6L,SAAc0N,EAAM/Z,KAAKQ,QAAU,CAACuZ,EAAMb,gBAC1Da,O,gCASf,WAA2C,IAAD,EACxC,OAAOpF,EAAciJ,mBAAd,UAAiC5J,KAAK4C,oBAAtC,aAAsDjX,K,yBAG/D,WAAe,IAAD,EACZ,OAAOgV,EAAcuE,YAAd,UAA0BlF,KAAK4C,oBAA/B,aAA+CjX,K,4BAGxD,WACE,OAAOgV,EAAcuJ,oB,8BAxOvB,SAAuBxd,EAA6Bge,GAAkC,IAAD,YACnF,OACGzF,kBAAQvY,EAAQsT,KAAKkF,gBACtBU,MAAK,UAAClZ,EAAOod,qBAAR,QAAyBC,OAC9B,UAACrd,EAAOod,qBAAR,QAAyB,IAAM,IAC9Bpd,EAAOR,WACa,KAArBQ,EAAOR,YACNQ,EAAOsd,iBACmB,KAA3Btd,EAAOsd,kBACP,iBAACtd,QAAD,IAACA,OAAD,EAACA,EAAQud,sBAAT,QAA2B,IAAMS,EAAQ7H,aACxC6H,EAAQrJ,QAAQP,mBAAoB,iBAACpU,QAAD,IAACA,OAAD,EAACA,EAAQud,sBAAT,QAA2B,IAAMS,EAAQrJ,QAAQP,mBACrFpU,EAAOud,iBAC2E,IAAnFjK,KAAKkK,iBAAiB3I,WAAU,SAAC4I,GAAD,OAAWA,EAAM5J,OAAS7T,EAAO0d,gBAC5C,QAApB1d,EAAO6Y,aAAwB,oBAAC7Y,EAAO8S,iBAAR,aAAC,EAAkB+B,WAAU,SAAC+E,GAAD,OAAUA,EAAKA,OAAS5Z,EAAO6Y,mBAA5D,SAA0E,IAAM,K,kCAwEpH,SAA4B7Y,EAA6Bmd,EAA8BxK,GACrF,IAAI0G,EAAQ5C,oBAAU0G,GAGtB,GAAInd,EAAOR,WAAkC,KAArBQ,EAAOR,WAC7B,GAAIQ,EAAOR,aAAeQ,EAAO8S,UAAU,GAAK9S,EAAO8S,UAAU,GAAGtT,UAAY,IAAK,CAAC,IAAD,YAC/EkZ,EAAG,2BAAI/F,QAAJ,IAAIA,IAAQ0G,EAAM1G,YAAlB,aAAG,EAAsBwC,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,oBAAhE,kBAA8E6Z,EAAMpD,qBAApF,aAA8E,EAAqBd,MAAK,SAACuD,GAAD,OAASA,EAAIlZ,YAAcQ,EAAOR,aACjJQ,EAAO8S,UAAP,iBAAmB4F,QAAnB,IAAmBA,OAAnB,EAAmBA,EAAK5F,iBAAxB,QAAqC,GACJ,KAA7B,UAAA9S,EAAO8S,iBAAP,eAAkBnH,QAAc3L,EAAO6Y,SAAP,UAAkB7Y,EAAO8S,UAAU,UAAnC,aAAkB,EAAqB8G,KACtE5Z,EAAO6Y,cAAW5Z,QAGzBe,EAAO8S,UAAY,GACnB9S,EAAO6Y,cAAW5Z,EAEpB,OAAOe,I,gCAwIT,WAAmE,IAAzC0c,EAAwC,uDAAjC,IAAIxI,KACnC,MAAO,CACL9T,QAAInB,EACJL,YAAQK,EACR+P,UAAM/P,EACNmV,sBAAkBnV,EAClBkY,uBAAmBlY,EACnB2c,yBAAqB3c,EACrBmY,0BAAsBnY,EACtB0c,4BAAwB1c,EACxB0d,sBAAkB1d,EAClBa,QAAS,CAACwT,KAAKkF,YAAYkE,IAC3BE,mBAAe3d,EACf4d,qBAAiB5d,EACjB6d,eAAW7d,EACX8d,YAAapH,EAAW+G,EAAM,4B,yBAIlC,WAA4D,IAAzCA,EAAwC,uDAAjC,IAAIxI,KAC5B,MAAO,CACL9T,QAAInB,EACJuc,cAAUvc,EACVse,oBAAgBte,EAChBqe,qBAAiBre,EACjBye,iBAAaze,EACbme,mBAAene,EACfO,eAAWP,EACX4Z,cAAU5Z,EACV6T,UAAW,GACXmL,cAAUhf,EACVY,YAAQZ,EACRuB,MAAO,GACPoc,mBAAe3d,EACf4d,qBAAiB5d,EACjB6d,eAAW7d,EACXge,WAAW,EACXF,YAAapH,EAAW+G,EAAM,4B,4BAIlC,WACE,MAAO,CACL,CACE7I,KAAM,WAER,CACEA,KAAM,cAER,CACEA,KAAM,QAER,CACEA,KAAM,WAER,CACEA,KAAM,SAER,CACEA,KAAM,WAER,CACEA,KAAM,qBAER,CACEA,KAAM,sBAER,CACEA,KAAM,UAER,CACEA,KAAM,wBAER,CACEA,KAAM,aAER,CACEA,KAAM,c,uCCjcd,WAEaqK,EAAejc,wBAAgD,CAAC,GAAI,aAAU,eAE5Eic,O,2ICAHC,E,sFCDCC,EAAqB,SAAC,GAAkH,IAAhHvX,EAA+G,EAA/GA,KAA+G,IAAzGmD,aAAyG,MAAjG,GAAiG,OAA7F6C,QAA6F,EAA/EmQ,oBAA+E,MAAjE,GAAiE,MAA7DxY,YAA6D,MAAtD2Z,EAAcE,QAAwC,EAA/BC,EAA+B,EAA/BA,SAAU1R,EAAqB,EAArBA,QAASrK,EAAY,EAAZA,MAChI8b,EACJ,kBAACE,EAAA,EAAD,CAAQnX,IAAI,UAAUzE,MAAM,UAAUkK,QAAQ,YAAYnF,QAAS4W,GACjE,4CAGEE,EACJ,kBAACD,EAAA,EAAD,CAAQnX,IAAI,MAAMzE,MAAM,UAAUkK,QAAQ,YAAYnF,QAAS,kBAAM4W,GAAS,KAC5E,wCAGEG,EACJ,kBAACF,EAAA,EAAD,CAAQnX,IAAI,KAAKzE,MAAM,YAAY+E,QAAS,kBAAM4W,GAAS,KACzD,uCAGE3Q,EACJ,kBAAC4Q,EAAA,EAAD,CAAQnX,IAAI,SAASzE,MAAM,YAAY+E,QAASkF,EAAS8R,WAAS,GAChE,2CAIAC,EAAiB,GACrB,OAAQna,GACN,KAAK2Z,EAAcS,YACjBD,EAAU,CAACH,EAAKC,EAAI9Q,GACpB,MACF,KAAKwQ,EAAcU,MACjBF,EAAU,CAACH,EAAKC,GAChB,MACF,KAAKN,EAAcE,QACnB,QACEM,EAAU,CAACN,EAAS1Q,GAIxB,OACE,kBAACmR,EAAA,EAAD,CAAevc,MAAOA,GACpB,kBAACwc,EAAA,EAAD,CAAQlY,KAAMA,EAAMmY,mBAAoB,CAAEC,KAAM,IAC9C,kBAACC,EAAA,EAAD,KAAclV,GACd,kBAACmV,EAAA,EAAD,KACGnC,EAAYoC,MAAM,MAAMrf,KAAI,SAAC+W,EAAMnQ,GAAP,OAC3B,kBAAC0Y,EAAA,EAAD,CAAmBjY,IAAK,QAAUT,GAAImQ,OAG1C,kBAACwI,EAAA,EAAD,KAAgBX,O,SD5CZR,O,qBAAAA,I,iBAAAA,I,8BAAAA,M,KAcL,IAAM1I,EAA6B8J,IAAMtd,cAAkFwM,QAAQC,QAE7H8Q,EAA8B,SAAC,GAAyB,IAAvBtS,EAAsB,EAAtBA,SAAU3K,EAAY,EAAZA,MAAY,EACpCgd,IAAM3Y,SAAqC,MADP,mBAC3DyX,EAD2D,KAClDoB,EADkD,KAG5DC,EAAqBH,IAAMI,SAgCjC,OACE,oCACE,kBAAClK,EAA2BxJ,SAA5B,CAAqCC,MA7BhB,SAACtE,GAMxB,OAJE6X,EADqB,kBAAZ7X,EACE,CAAEoC,MAAO,UAAWgT,YAAapV,GAEjCA,GAEN,IAAI6G,SAAwB,SAACgL,EAAS/K,GAC3CgR,EAAmBE,QAAU,CAAEnG,UAAS/K,cAsBsBxB,SAAUA,IACxE,kBAAC,EAAD,eAAoB3K,MAAOA,EAAOsE,KAAMgZ,QAAQxB,GAAUC,SAXzC,SAACjf,GAChBqgB,EAAmBE,SACrBF,EAAmBE,QAAQnG,QAAQpa,GAGrCogB,EAAW,OAMyE7S,QAnBlE,YACP,OAAPyR,QAAO,IAAPA,OAAA,EAAAA,EAASyB,gBAAiBJ,EAAmBE,SAC/CF,EAAmBE,QAAQlR,SAG7B+Q,EAAW,QAcmGpB,O,qFEzD3G,SAAS0B,EAAeC,GAA0E,IAAD,EAC5EpZ,mBAAYoZ,GADgE,mBAC/FvW,EAD+F,KACxFwW,EADwF,KAEhGC,EAAMP,iBAAUK,GAMtB,OAJA1U,qBAAU,WACR4U,EAAIN,QAAUnW,IACb,CAACA,IAEG,CAACA,EAAOwW,EAAUC,K,4mBCLpB,SAASvI,IAAuD,IAArCwI,EAAoC,uDAAX,EACzD,MAAwB,kBAAVA,EAAqBA,EAAQhH,WAAWgH,GAGjD,SAASC,EAAW1D,GACzB,IAAM2D,EAAwB,kBAAT3D,EAAoB,IAAIxI,KAAKA,KAAKC,MAAMuI,IAASA,EACtE,OAAO,IAAIxI,KAAKA,KAAKoM,IAAID,EAAME,iBAAkBF,EAAMG,cAAeH,EAAMD,eAGvE,SAASpJ,EAAkB0F,GAChC,IAAM+D,EAAUL,EAAW1D,GAC3B,OAAO,IAAIxI,KAAJ,OAASuM,QAAT,IAASA,OAAT,EAASA,EAASC,SAAe,OAAPD,QAAO,IAAPA,OAAA,EAAAA,EAASE,YAAa,UAAIF,QAAJ,IAAIA,OAAJ,EAAIA,EAASvG,gBAG/D,SAAS0G,EAAa1U,GAAqD,IAC5E2U,EAD+CC,EAA4B,uDAAX,EAEpE,GAAqB,kBAAV5U,EACT2U,EAAI1H,WAAWjN,OACV,IAAqB,kBAAVA,EAEX,OAAOmR,IADZwD,EAAI3U,EAGN,IAAI6U,EAAgBpI,KAAKqI,IAAI,GAAIF,GAC7BG,GAAWtI,KAAKuI,OAAOL,EAAIM,OAAOC,SAAWL,GAAiBA,GAAeM,QAAQP,GAEzF,OAAO3H,WAAW8H,GAGb,IAAMK,EACX,eAACC,EAAD,uDAAU,aAAV,OACA,SAAC9hB,GACC,IAAI+hB,EAAa,IAAItN,KAAKA,KAAKC,MAAM1U,EAAOyM,QAC5C,YAAwBjN,IAAjBQ,EAAOyM,OAAwC,OAAjBzM,EAAOyM,OAAmC,KAAjBzM,EAAOyM,OAAgBsV,IAAetI,MAAMsI,EAAWC,WACjH9L,IAAW6L,EAAYD,GACvB9hB,EAAOyM,QAGFwV,EACX,eAACC,EAAD,uDAAY,EAAZ,OACA,SAACliB,GACC,YAAwBR,IAAjBQ,EAAOyM,OAAwC,OAAjBzM,EAAOyM,OAAmC,KAAjBzM,EAAOyM,MAAe0V,EAAaniB,EAAOyM,MAAOyV,GAAYliB,EAAOyM,QAG/H,SAAS2V,EAAkBpiB,GAChC,YAAwBR,IAAjBQ,EAAOyM,OAAwC,OAAjBzM,EAAOyM,OAAmC,KAAjBzM,EAAOyM,OAAgBzM,EAAOyM,MAAQ,IAAM,IAAM0V,EAAaniB,EAAOyM,OAASzM,EAAOyM,MAG/I,SAAS4V,EAAe5V,GAC7B,YAAiBjN,IAAViN,GAAiC,OAAVA,GAA4B,KAAVA,QAA0BjN,IAAViN,EAAsB,IAAM,IAAM0V,EAAa1V,GAASA,EAGnH,SAAS0V,EAAaG,GAAyD,IAA/BJ,EAA8B,uDAAX,EACxE,YAAkB1iB,IAAX8iB,EACHpK,EAAkBoK,GACfV,QAAQM,GACR5D,QAAQ,0BAA2B,OACtC,GAUC,SAASiE,EAAgBrO,EAAQsO,GACtC,IAAIC,EAAO,GACX,OAAOvO,EAAEnL,QAAO,SAACjC,GACf,OAAO2b,EAAKC,eAAeF,EAAM1b,MAAkB2b,EAAKD,EAAM1b,KAAS,MAIpE,SAAS6b,EAAapgB,EAAUqgB,GACrC,OAAOrgB,EAAIuV,QAAO,WAAe+K,GAAf,uBAAEC,EAAF,KAAQC,EAAR,YAAyBH,EAAQC,GAAQ,CAAC,GAAD,mBAAKC,GAAL,CAAWD,IAAOE,GAAQ,CAACD,EAAD,sBAAWC,GAAX,CAAiBF,OAAS,CAAC,GAAW,KActH,SAASG,EAASH,EAAStgB,GAAgF,IAAtEoF,EAAqE,uDAArC,KAAMsb,IAA+B,yDAC3GrJ,EAAQqJ,EAAWjM,oBAAUzU,GAAOA,EAClC2gB,EAAS,SAAChb,GAAD,MAAuB,kBAARP,EAAP,OAA0BO,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAIP,GAAOA,EAAIO,IAC5DoN,EAAQsE,EAAMxE,WAAU,SAACO,GAAD,OAAOuN,EAAOvN,KAAOuN,EAAOL,MAGxD,OAFIvN,GAAS,EAAGsE,EAAMpE,OAAOF,EAAO,EAAGuN,GAClCjJ,EAAMtN,KAAKuW,GACTjJ,EAGF,SAASuJ,EAAUN,EAAStgB,GAAgF,IAAtEoF,EAAqE,uDAArC,KAAMsb,IAA+B,yDAC5GrJ,EAAQqJ,EAAWjM,oBAAUzU,GAAOA,EAClC2gB,EAAS,SAAChb,GAAD,MAAuB,kBAARP,EAAP,OAA0BO,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAIP,GAAOA,EAAIO,IAC5DoN,EAAQsE,EAAMxE,WAAU,SAACO,GAAD,OAAOuN,EAAOvN,KAAOuN,EAAOL,MAExD,OADIvN,GAAS,GAAGsE,EAAMpE,OAAOF,EAAO,GAC7BsE,EAGF,IAAMwJ,EAAc,SAACC,GAAD,OAAmF,SAACnb,GAC7Gmb,EAAKlM,SAAQ,SAACsJ,GACO,oBAARA,EACTA,EAAIvY,GACKuY,IACTA,EAAIN,QAAUjY,QASb,SAASob,EAAUjO,GACxB,OACGoE,MAAMpE,KACNoE,MAAMvB,EAAkB7C,IAItB,IAAMyB,EAAoB,SAACG,GAChC,OAAOA,EAAGhD,MAAK,SAACC,EAAGC,GACjB,OAAID,EAAEkD,YAAcjD,EAAEiD,UAAkB,IAGpB,cAAhBjD,EAAEiD,aAA+C,cAAhBlD,EAAEkD,aAA+BjD,EAAEiD,UAAUmM,SAAS,OAASrP,EAAEkD,UAAUmM,SAAS,OAASpP,EAAEiD,UAAUoM,cAActP,EAAEkD,gB,q+EChI5JxU,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvC2gB,iBAAkB,GAClBC,QAAS,CACP/f,gBAAiBb,EAAMc,QAAQoB,WAAWC,MAC1C0e,OAAQ,mBAEV9c,KAAM,CACJb,WAAY,EACZ4d,cAAe,GAEjBC,SAAU,CACRnf,MAAO,OACPY,QAAS,eAEXwe,eAAgB,CACdze,QAASvC,EAAMS,QAAQ,GACvBwgB,aAAc,EACdve,YAAa1C,EAAMS,QAAQ,GAC3BmB,MAAO,OACPY,QAAS,OACT0e,oBAAqB,mBAEvBC,cAAe,CACb5e,QAAS,SAEX6e,cAAe,CACb7gB,OAAQ,OACRC,YAAa,EACb6gB,UAAW,QAEbC,SAAU,CACR/gB,OAAQ,OACRC,YAAa,EACbJ,MAAOJ,EAAMc,QAAQygB,KAAK,MAE5BC,gBAAiB,CACf5f,MAAO,QAET6f,WAAY,CACVC,UAAW,OACXthB,MAAOJ,EAAMc,QAAQC,QAAQC,MAE/B2gB,QAAS,CACPC,UAAW,QACXvhB,UAAW,qBAEbwhB,aAAc,CACZrf,QAAS,cACTsf,KAAM,WACNC,SAAU,EACVC,SAAU,SACVC,aAAc,YAEhBC,cAAe,CACb3hB,OAAQ,OACRG,WAAY,EACZgD,WAAY,OACZlB,QAAS,OACToB,WAAY,SACZue,SAAU,OAEZC,gBAAgB,aACd7hB,OAAQ,OACR0hB,aAAc,WACdD,SAAU,SACVpe,WAAY,SACZlB,YAAa,OACb2e,UAAW,OACXzf,MAAO,QACN5B,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BwgB,SAAU,SAGdE,gBAAgB,aACd7f,QAAS,cACT2f,SAAU,SACVzhB,WAAY,OACZohB,KAAM,YACL9hB,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BwgB,SAAU,QAGdG,eAAgB,CACdH,SAAU,WAEZI,QAAS,CACPC,cAAe,cAiCZ,SAASC,EAAT,GA8B4D,IAAD,IAxBhEC,EAwBgE,EAxBhEA,MACAC,EAuBgE,EAvBhEA,aACAtd,EAsBgE,EAtBhEA,QAsBgE,IArBhEud,eAqBgE,MArBtD,KAqBsD,EApBhEC,EAoBgE,EApBhEA,WACYC,EAmBoD,EAnBhEC,WAmBgE,IAlBhEC,oBAkBgE,MAlBjD,cAkBiD,MAjBhEC,iBAiBgE,aAhBhEC,gBAgBgE,SAfhEC,EAegE,EAfhEA,SACAC,EAcgE,EAdhEA,OAcgE,IAbhE9Y,eAagE,MAbtD,WAasD,EAXhE+Y,GAWgE,EAZhEC,WAYgE,EAXhED,kBAWgE,IAVhEE,yBAUgE,MAV5C,SAU4C,MAThEC,yBASgE,MAT5C,SAAC/d,GAAD,qBAAkBA,EAAlB,MAS4C,EARhEge,EAQgE,EARhEA,SAQgE,IAPhEC,iCAOgE,SANhE3B,EAMgE,EANhEA,SAMgE,IALhEQ,eAKgE,aAJhEoB,iBAIgE,SAHhEC,EAGgE,EAHhEA,YACAC,EAEgE,EAFhEA,eACG7d,EAC6D,yUAC1DxB,EAAU1E,IACVuG,GAAWyd,cAEjBvB,EAAUA,GAAWlc,GACrBwc,EAAU,oBAAGA,SAAH,QAAiBC,SAAjB,QAAgC,OAE1C,IAAIC,GAAqBD,IAAkD,kBAAfD,EAA0BA,EAAa,QAE7FkB,GAAe,SAACC,GAAD,OAAY,SAAC5e,GAChCA,EAAE6e,iBACF7e,EAAE8e,kBACM,OAARf,QAAQ,IAARA,KAAWa,KAGPG,GAAa,SAACH,GAAD,OAAY,SAAC5e,GAC9BA,EAAE6e,iBACF7e,EAAE8e,kBACI,OAANd,QAAM,IAANA,KAASY,KAGX,OACE,kBAAC,IAAD,eACEI,cAAe,SAAC/e,EAAc6B,GAAgB,IAAD,EACrCmd,EAAkC,KAArBnd,EAAMmd,WAAN,OAA0Bre,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAOqe,WAAand,EAAMmd,WACjE1a,EAAK,OAAG0a,QAAH,IAAGA,OAAH,EAAGA,EAAYlS,cAG1B,IAFekS,GAA6B,KAAfA,EAElB,cAAOhf,QAAP,IAAOA,IAAW,GAE7B,IAAMif,EAAM,OAAG3B,QAAH,IAAGA,IAAgB,CAACC,EAASG,GAAYC,GAC3B,kBAAfH,GAA2BE,KAAeF,GAAYyB,EAAO9a,KAAKqZ,GAE7E,IAAM0B,EAAQ,iBACZlf,QADY,IACZA,OADY,EACZA,EAASY,QAAO,SAAC+d,GAAY,IAAD,EAC1B,OAAO,UAAAM,EAAOre,QAAO,SAAC+R,GAAD,iBAAW,UAAkB,kBAAVA,EAAP,OAA4BgM,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAShM,GAASA,EAAMgM,EAAQra,UAA7D,mBAAsEwI,mBAAtE,iDAAuFlT,QAAQ0K,KAAU,YAAlI,eAAsIP,QAAS,YAF5I,QAGN,GAGR,GAAIia,GAA8B,KAAV1Z,KAAkB+Z,GAAiD,IAApBa,EAASnb,QAAe,CAC7F,IAAIob,EAAOnB,EAAiBgB,GAC5BG,EAAI,mBAAwB,EACF,QAAtBjB,EAA6BgB,EAASE,QAAQD,GAC7CD,EAAS/a,KAAKgb,GAGrB,OAAOD,GAETG,eAAsC,kBAAf7B,EAA0B,SAACmB,GAAD,8BAAiBA,QAAjB,IAAiBA,OAAjB,EAAiBA,EAASnB,UAA1B,QAAmD,IAAKA,EACzG8B,kBAAsC,kBAAZ/B,EAAuB,SAACoB,EAAWra,GAAZ,OAA+B,OAANqa,QAAM,IAANA,OAAA,EAAAA,EAASpB,OAAT,OAAsBjZ,QAAtB,IAAsBA,OAAtB,EAAsBA,EAAQiZ,KAAWA,EACnHgC,iBAAkBA,EAClBC,aAAc,SAACb,GAAiB,IAAD,EAC7B,OAAKA,EAEH,kBAAC,IAAD,CACEvc,MAAK,UAAEuc,EAAOhB,UAAT,QAA0B,GAC/Bxe,QAAS,CAAEoc,QAASpc,EAAQoc,SAC5BkE,WAAY,IACZC,eAAgB,IAChBC,qBAAsB1H,SAAS0G,EAAOhB,IAAiBgB,EAAM,oBAE7D,yBAAK1b,MAAO,CAAEyZ,SAAUA,EAAWA,EAAW,UAAOrlB,GAAakN,UAAWpF,EAAQuc,UACjFiD,EAAM,kBAwCNR,EAAkBQ,EAAOjB,KAvCzB,oCACE,yBAAKnZ,UAAWE,YAAKtF,EAAQqd,aAAcU,EAAU/d,EAAQ+d,QAAU,KACrE,yBAAKja,MAAO,CAAE1G,MAAO+hB,EAAY,OAAS,IAAM/Z,UAAWpF,EAAQ0d,eAChE8B,EAAOjB,KAETY,EAAY,KACX,yBAAKrb,MAAO,CAAE5F,YAAa6f,EAAU,OAAI7lB,GAAakN,UAAWpF,EAAQ4d,iBACtE4B,EAAOhB,KAIbE,GAAYD,IAAZ,OAAyBe,QAAzB,IAAyBA,OAAzB,EAAyBA,EAAM,cAA/B,OAAmDA,QAAnD,IAAmDA,OAAnD,EAAmDA,EAAM,WACxD,yBAAKpa,UAAWE,YAAKtF,EAAQ6d,gBAAiBE,EAAU/d,EAAQ+d,QAAU,UAC7C7lB,KAApB,OAANsnB,QAAM,IAANA,OAAA,EAAAA,EAAM,YACC,OAANA,QAAM,IAANA,OAAA,EAAAA,EAAM,WACJ,kBAAC,IAAD,CAAM7B,SAAS,UAAU7Z,MAAO,CAAElI,MAAO,SAEzC,kBAAC,IAAD,CAAc+hB,SAAS,YAEvB,MACG,OAAN6B,QAAM,IAANA,OAAA,EAAAA,EAAM,YACL,yBAAKpa,UAAWpF,EAAQ8d,gBACtB,kBAAC,IAAD,CAAOH,SAAS,aAEhB,KACHe,EACC,kBAAC,IAAD,CAAYtZ,UAAWpF,EAAQ8d,eAAgBnd,QAASgf,GAAWH,GAASiB,KAAK,SAC/E,kBAAC,IAAD,CAAM9C,SAAS,aAEf,KACHc,EACC,kBAAC,IAAD,CAAYrZ,UAAWpF,EAAQ8d,eAAgBnd,QAAS4e,GAAaC,GAASiB,KAAK,SACjF,kBAAC,IAAD,CAAQ9C,SAAS,aAEjB,MAEJ,QA/CM,MAwDtB+C,YAAa,SAAChoB,GAKZ,OACE,kBAAC,IAAD,wBACO2mB,QADP,IACOA,IAAkB,GACnB3mB,EAFN,CAGEioB,WAAU,2BAAOjoB,EAAOioB,YAAd,IAA0BxH,IARxB,SAACvY,GACflI,EAAOioB,WAAP,IAAyB9H,QAAUjY,EAC/Bqe,IAAUA,EAASpG,QAAUjY,MAO/BwE,UAAWpF,EAAQgd,gBACnBkB,MAAOA,EACPpY,QAASA,EACTsZ,YAAaA,MAInBwB,cAAY,EACZC,WAAS,EACT7gB,QAAS,CAAE8gB,mBAAoB9gB,EAAQid,WAAYE,QAASnd,EAAQmd,SACpE4D,UAAW,kBAAC,IAAD,MACXlgB,QAAO,OAAEA,QAAF,IAAEA,IAAW,GACpBmgB,UAAW,EACXC,aAAc,CAAEC,KAAM,GAAKnD,EAAU,EAAI,KACrCvc,IASV,SAAS2f,EAAU3f,GAAiC,IAC1CjJ,EAAuBiJ,EAAvBjJ,KAAMyV,EAAiBxM,EAAjBwM,MAAOlK,EAAUtC,EAAVsC,MACrB,OAAO0U,IAAM4I,aAAa7oB,EAAKyV,GAAQ,CACrClK,MAAM,2BACDA,GADA,IAEHud,IAAMvd,EAAMud,IAPM,MAYxB,IAAMC,EAAsB9I,IAAMtd,cAAc,IAE1CqmB,EAAmB/I,IAAMgJ,YAA2B,SAAChgB,EAAO2X,GAChE,IAAMsI,EAAajJ,IAAM/J,WAAW6S,GACpC,OAAO,uCAAKnI,IAAKA,GAAS3X,EAAWigB,OAcvC,IAAMrB,EAAmB5H,IAAMgJ,YAA2B,SAA0BhgB,EAAO2X,GAAM,IAAD,IAC/D3X,EAAvB2E,EADsF,EACtFA,SAAaub,EADyE,4BAExFR,EAAI,iBAAGQ,QAAH,IAAGA,OAAH,EAAGA,EAAOR,YAAV,QAAkB,EACtBlhB,EAAU1E,IACVqmB,EAAWnJ,IAAMoJ,SAASC,QAAQ1b,GAClC3K,EAAQoG,cACRkgB,EAAOhgB,YAActG,EAAM0B,YAAYG,GAAG,MAAO,CAAE0E,OAAO,IAC1DggB,EAAYJ,EAAS/c,OACrBod,EAAWd,GAAQY,EAAO,GAAK,IAE/BG,EAAe,SAACC,GACpB,OAAI1J,IAAM2J,eAAeD,IAAUA,EAAMzkB,OAAS2kB,IACzC,GAGFJ,GAUHK,EApCR,SAAuB9pB,GACrB,IAAM4gB,EAAMX,IAAMI,OAAyB,MAM3C,OALAJ,IAAMjU,WAAU,WACK,MAAf4U,EAAIN,SACNM,EAAIN,QAAQyJ,gBAAgB,GAAG,KAEhC,CAAC/pB,IACG4gB,EA6BSoJ,CAAcR,GAE9B,OACE,yBAAK5I,IAAKA,EAAK/T,UAAWpF,EAAQmc,kBAChC,kBAACmF,EAAoBpc,SAArB,CAA8BC,MAAOuc,GACnC,kBAAC,IAAD,CACEC,SAAUA,EACVhmB,QAbFomB,EAAY,EACP,EAAIC,EAENL,EAAS3oB,IAAIipB,GAAczR,QAAO,SAAC5D,EAAGC,GAAJ,OAAUD,EAAIC,IAAG,IAU9B,GACtBzP,MAAM,OACN+b,IAAKkJ,EACLG,iBAAkBjB,EAClBkB,iBAAiB,KACjBT,SAAU,SAAChU,GAAD,OAAWiU,EAAaN,EAAS3T,KAC3C0U,cAAe,EACfX,UAAWA,GAEVZ,S,iCC/WX,qDAGate,EAAkB,kBAAM4L,qBAAWkU,O,iCCHhD,+DAaO,SAASC,EAIdphB,GACA,OACE,kBAAC,IAAD,eACEqhB,eAAa,EACbjC,cAAY,EACZxC,QAAQ,KACRD,aAAc,CAAC,WAAY,WAAY,kBACvCI,WAAW,WACXF,WAAW,WACXG,aAAa,YACThd,M,iCC3BV,uDAEa8d,EAAc,WACzB,IAAM9jB,EAAQoG,cACd,OAAOE,YAActG,EAAM0B,YAAYC,KAAK,S,iCCJ9C,sDAGa2lB,EAAkB,kBAAMrU,qBAAW0I,O,sJCI1C7b,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCunB,UAAW,GACX3J,MAAO,CACLxd,MAAO,UACPihB,UAAW,SACX9gB,OAAQ,OACRinB,cAAe,SACf5lB,MAAO,QAET4D,KAAM,CACJ2c,SAAU,OACV5f,QAASvC,EAAMS,QAAQ,GACvBL,MAAO,WAETqnB,oBAAqB,CACnBlnB,OAAQ,OACRmnB,UAAW,cAEbC,UAAW,CACTplB,QAAS,KAAOvC,EAAMS,QAAQ,GAAK,KACnCL,MAAO,WAETwnB,MAAO,CACLllB,YAAa,EACbue,aAAc,GAEhBoE,UAAW,CACTzjB,MAAO,OACPY,QAAS,YAeE,SAASqlB,EAAT,GAA4J,IAAD,IAApID,aAAoI,aAArHvC,iBAAqH,SAAlGyC,EAAkG,EAAlGA,WAAYC,EAAsF,EAAtFA,SAAsF,IAA5E5qB,kBAA4E,SAAzD6hB,EAAyD,EAAzDA,OAAQpV,EAAiD,EAAjDA,UAAiD,IAAtCmE,gBAAsC,SAClKvJ,EAAU1E,IADwJ,EAEhJuE,mBAAelH,EAAasX,YAAkBqT,GAAcA,GAFoF,mBAEjK3N,EAFiK,KAE3JgE,EAF2J,KAGlK6J,EAAY7N,EAAK+E,UACjB+I,EAAkBH,EAAW5I,UA+BnC,OANAnW,qBAAU,WACJif,IAAcC,GAChBF,EAAS,IAAIpW,KAAKqW,MAEnB,CAACA,EAAWC,EAAiBF,IAG9B,yBAAKne,UAAWE,YAAKtF,EAAQijB,oBAAqB7d,EAAWyb,EAAY7gB,EAAQ6gB,UAAY,KAC3F,kBAAC,IAAD,CAAYlgB,QAnBC,SAAC+iB,GAChB/J,GAAQ,SAAChE,GACP,OAAO0D,YAAW/F,YAAQqC,GAAO,QAiBFvQ,UAAWE,YAAKtF,EAAQgB,KAAMoiB,EAAQpjB,EAAQojB,MAAQ,IAAKtf,MAAO,CAAEoZ,UAAW,kBAAoB3T,SAAUA,GAC1I,kBAAC,IAAD,CAAiBoU,SAAS,aAE5B,kBAAC,IAAD,CACEtd,IAAI,iBACJhH,GAAG,OACH0C,OAAO,QACP0kB,KAAK,QACLhjB,KAAK,OACL8lB,SAxCiB,SAACG,GACtB,IAEIC,EAFAxe,EAAQue,EAAME,OAAOze,MACrB0e,EAAS1W,KAAKC,MAAMjI,GAELwe,EAAfxR,MAAM0R,GAAsB,IAAI1W,KAClB,IAAIA,KAAK0W,GAE3BF,EAAahrB,EAAasX,YAAkB0T,GAAcA,EAC1DhK,EAAQN,YAAWsK,KAiCfxe,MAAOvM,YAAiB0qB,EAAY9I,GACpCpV,UAAWpF,EAAQ+iB,UACnBpC,WAAY,CACV7c,MAAO,CAAE+Y,UAAW,WAEtBiH,WAAY,CACVC,kBAAkB,EAClBlD,WAAW,EACXzb,UAAWpF,EAAQmjB,WAErB5Z,SAAUA,IAEZ,kBAAC,IAAD,CAAY5I,QAlCI,SAAC+iB,GACnB/J,GAAQ,SAAChE,GAAD,OAAU0D,YAAW/F,YAAQqC,EAAM,QAiCPvQ,UAAWE,YAAKtF,EAAQgB,KAAMoiB,EAAQpjB,EAAQojB,MAAQ,IAAK7Z,SAAUA,GACrG,kBAAC,IAAD,CAAiBoU,SAAS,aACd,O,iCC/GpB,+EAGe,SAASqG,EAAsBC,GAC5C1f,oBAAU0f,EAAK,IAEV,SAASC,EAAeD,GAC7B1f,oBAAU0f,EAAK,M,iCCJjB,unBAIMxsB,EAAgBC,IAAYC,WAK3B,SAASwsB,EAAsBpsB,GACpC,IAEIE,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAPT,6BAOkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAc7D,SAAS6rB,EAAyBhb,EAAwBib,GAC/D,IAAMrsB,EAAM,8BAAgCoR,EAE5C,OAAO3R,EAAc6B,IAAItB,EAAKqsB,GAAYhsB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGjE,SAAS+rB,EAAmBD,GAGjC,OAAO5sB,EAAc0B,KAFT,6BAEmBkrB,GAAYhsB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGlE,SAASgsB,EAAqBlrB,GACnC,IAAMrB,EAAM,8BAAgCqB,EAE5C,OAAO5B,EAAcgS,OAAOzR,GAevB,SAASwsB,EAAoBC,EAAkBC,EAAgB3sB,GACpE,IAAIC,EAAM,8BAENC,EAAc,GAoBlB,YAnBcC,IAAVH,IACFE,EAAOE,YAAcJ,IAGnB0sB,GAAaC,KACf1sB,GAAY,KAGVysB,IACFzsB,EAAMA,EAAM,aAAeY,YAAiB6rB,IAG1CC,IACED,IACFzsB,GAAY,KAEdA,EAAMA,EAAM,WAAaY,YAAiB8rB,IAGrCjtB,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAc7D,SAASosB,EAAmBtrB,EAAYurB,GAC7C,IAAM5sB,EAAM,+BAAiCqB,EAE7C,OAAO5B,EAAc6B,IAAItB,EAAK4sB,GAAavsB,MAAK,SAACC,GAAD,OAAcA,EAASC,QASlE,SAASssB,EAAqBC,GAGnC,OAAOrtB,EAAc0B,KAFT,mCAEmB2rB,GAAczsB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGpE,SAASwsB,EAAsB1rB,GACpC,IAAMrB,EAAM,+BAAiCqB,EAE7C,OAAO5B,EAAcgS,OAAOzR,GAgCvB,SAASgtB,EAAgC3rB,GAC9C,IAAMrB,EAAM,2CAA6CqB,EAEzD,OAAO5B,EAAcgS,OAAOzR,GAgBvB,SAASitB,EAAuBC,GACrC,IAEIrqB,EAAO,IAAIsqB,SACftqB,EAAKuqB,OAAO,OAAQF,GAIpB,OAAOztB,EAAc0B,KAPT,oCAOmB0B,EAFlB,CAAEN,QAAS,CAAE,eAAgB,yBAEGlC,MAAK,SAACC,GAAD,OAAcA,EAASC,QA8BpE,SAAS8sB,EAA+BttB,GAC7C,IAEIE,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAPT,0CAOkBH,GAKzB,SAASqtB,EAAgBvtB,GAC9B,IAEIE,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAPT,gBAOkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAc7D,SAASgtB,EAAeC,GAG7B,OAAO/tB,EAAc0B,KAFT,gBAEmBqsB,GAAUntB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGhE,SAASktB,EAAcpsB,EAAYmsB,GACxC,IAAMxtB,EAAM,iBAAmBqB,EAE/B,OAAO5B,EAAc6B,IAAItB,EAAKwtB,GAAUntB,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG/D,SAASmtB,EAAiBrsB,GAC/B,IAAMrB,EAAM,iBAAmBqB,EAE/B,OAAO5B,EAAcgS,OAAOzR,GAKvB,SAAS2tB,EAA2BtsB,EAAYorB,EAA0BC,EAAwB3sB,GACvG,IAAIC,EAAM,mBAAqBqB,EAAK,qBAEhCorB,GAAaC,KACf1sB,GAAY,KAGVysB,IACFzsB,EAAMA,EAAM,aAAeY,YAAiB6rB,IAG1CC,IACED,IACFzsB,GAAY,KAEdA,EAAMA,EAAM,WAAaY,YAAiB8rB,IAG5C,IAAIzsB,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASqtB,EAAqCvsB,EAAYtB,GAC/D,IAAMC,EAAM,mBAAqBqB,EAAK,0BAClCpB,EAAc,GAIlB,YAHcC,IAAVH,IACFE,EAAOE,YAAcJ,GAEhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASstB,EAA8B9tB,GAC5C,IACIE,EAAc,GAIlB,YAHcC,IAAVH,IACFE,EAAOE,YAAcJ,GAEhBN,EAAcW,IALT,yCAKkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,U,iCClTpE,WAIautB,EAAc5qB,wBAA4B,CAAC,GAAI,aAAU,eAEvD4qB,O,yQCFTruB,E,MAAgBC,EAAYC,WA2B3B,SAASouB,EAAQC,EAAgBC,EAAuBluB,GAC7D,IAAMC,EAAM,kBAAoBguB,EAAS,QAErC/tB,EAAc,CAChB6B,aAAc,OACdosB,iBAAkBD,GAOpB,YAJc/tB,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAGzB,SAASkuB,EAAmBH,EAAgBI,EAAmBH,EAAuBluB,GAC3F,IAAMC,EAAM,kBAAoBguB,EAAS,QAErC/tB,EAAc,CAChB6B,aAAc,OACdosB,iBAAkBD,GAOpB,YAJc/tB,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAC1C,IAAMN,EAAM+B,OAAOC,IAAIC,gBAAgB,IAAIC,KAAK,CAAC5B,EAASC,QACpD4B,EAAOC,SAASC,cAAc,KAChCgsB,EAAkB/tB,EAASiC,QAAQ,uBAAuBC,UAAUlC,EAASiC,QAAQ,uBAAuBE,QAAQ,KAAO,GAK/H,OAJAN,EAAKQ,KAAO3C,EACZmC,EAAKS,aAAa,WAAlB,OAA8BwrB,QAA9B,IAA8BA,IAAYC,GAC1CjsB,SAASS,KAAKC,YAAYX,GAC1BA,EAAKY,QACEzC,EAASC,QAiCb,SAAS+tB,EAAgBN,GAC9B,IAAMhuB,EAAM,kBAAoBguB,EAChC,OAAOvuB,EAAc6B,IAAItB,GAAKK,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,Q,YC7F1CguB,EAAY1X,EAAQ,KAElBvT,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJrF,SAAU,OAIR8qB,EAAW,SAACC,EAAIC,EAAIC,EAAIC,GAAb,OAAoBhV,KAAKqI,IAAIrI,KAAKqI,IAAI0M,EAAKF,EAAI,GAAK7U,KAAKqI,IAAI2M,EAAKF,EAAI,GAAI,KAE5E,SAASG,EAAkBrlB,GAAQ,IAAD,MACzCxB,EAAU1E,IAEhBiJ,qBAAU,WACR,IAAIuiB,EAAe,EACfC,EAAQ,EACRC,EAAI,EACJC,EAAI,EACJC,EAAY,EACZC,EAAQ,EACRC,EAAQ,EACRC,EAAQ,EACRC,EAAQ,EAER3gB,EAASE,cAmCP0gB,EAAM,SAACC,GAAD,OAAsB,SAAC5mB,GACjC,GAAyB,IAArBA,EAAE6mB,QAAQ7iB,OACZyiB,EAAQL,EACRM,EAAQL,EACRE,EAAQvmB,EAAE6mB,QAAQ,GAAGC,QACrBN,EAAQxmB,EAAE6mB,QAAQ,GAAGE,aAChB,GAAyB,IAArB/mB,EAAE6mB,QAAQ7iB,OAAc,CACjCkiB,EAAe,EACf,IAAIc,EAAYb,EACZc,EAAQV,EACRW,EAAQV,EACZW,YAAW,WACY,IAAjBjB,GAAsBC,IAAUa,GAAaC,IAAUV,GAASW,IAAUV,IAC5EF,EAAY,EACZG,EAAQ,EACRC,EAAQ,EACRN,EAAI,EACJC,EAAI,EACJF,EAAQ,EACRS,EAAI1jB,MAAMmU,mBAAqB,MAC/BuP,EAAI1jB,MAAMoZ,UAAY,SAAW6J,EAAQ,OAE1C,QAIDiB,EAAa,SAACR,EAAKjvB,GACvB,GAAiB,UAAbivB,EAAI/pB,KACNwqB,YAAWzmB,EAAMuB,MAAO,wBAA0BvB,EAAM0jB,KAAKgD,kBACxD,CACL,IAAIC,EAAa/tB,SAASuJ,eAAenC,EAAM0jB,KAAK7rB,GAAK,kBACzD,GAAI8uB,EAAY,CACd,IAAIjG,EAAK,OAAGiG,QAAH,IAAGA,OAAH,EAAGA,EAAYrtB,YAAY0sB,GACpCtF,EAAM7oB,GAAKmI,EAAM0jB,KAAK7rB,GAAK,SAC3B8uB,EAAWrkB,MAAM9G,OAAS,IAChB,OAAVmrB,QAAU,IAAVA,KAAY/jB,iBAAiB,aApErB,SAACojB,GAAD,OAAsB,SAAC5mB,GACnC4mB,EAAI1jB,MAAMmU,mBAAqB,KACN,IAArBrX,EAAE6mB,QAAQ7iB,QACZyiB,EAAQL,EACRM,EAAQL,EACRE,EAAQvmB,EAAE6mB,QAAQ,GAAGC,QACrBN,EAAQxmB,EAAE6mB,QAAQ,GAAGE,SACZ/mB,EAAE6mB,QAAQ7iB,QAAU,IACf,IAAVmiB,IAAaG,EAAYH,EAAQ,GACrCI,GAASvmB,EAAE6mB,QAAQ,GAAGC,QAAU9mB,EAAE6mB,QAAQ,GAAGC,SAAW,EACxDN,GAASxmB,EAAE6mB,QAAQ,GAAGE,QAAU/mB,EAAE6mB,QAAQ,GAAGE,SAAW,EACxDb,EAAeN,EAAS5lB,EAAE6mB,QAAQ,GAAGC,QAAS9mB,EAAE6mB,QAAQ,GAAGE,QAAS/mB,EAAE6mB,QAAQ,GAAGC,QAAS9mB,EAAE6mB,QAAQ,GAAGE,WAyD1DS,CAAMlG,IACvC,OAAViG,QAAU,IAAVA,KAAY/jB,iBAAiB,YAtDtB,SAACojB,GAAD,OAAsB,SAAC5mB,GAAO,IAAD,QACpC6lB,EAAE,UAAG7lB,EAAE6mB,QAAQ,UAAb,aAAG,EAAcC,QACnBf,EAAE,UAAG/lB,EAAE6mB,QAAQ,UAAb,aAAG,EAAcC,QACnBhB,EAAE,UAAG9lB,EAAE6mB,QAAQ,UAAb,aAAG,EAAcE,QACnBf,EAAE,UAAGhmB,EAAE6mB,QAAQ,UAAb,aAAG,EAAcE,QAEnB/mB,EAAE6mB,QAAQ7iB,OAAS,GACrBmiB,EAAQG,EAAYV,EAASC,EAAIC,EAAIC,EAAIC,GAAME,EAC/CE,EAAIK,IAAUZ,EAAKE,GAAM,EAAIQ,GAC7BF,EAAIK,IAAUZ,EAAKE,GAAM,EAAIQ,GAC7BI,EAAI1jB,MAAMoZ,UAAV,oBAAmC8J,EAAnC,cAA0CC,EAA1C,qBAAwDF,EAAxD,OAEAC,EAAIK,GAASZ,EAAKU,GAClBF,EAAIK,GAASZ,EAAKU,GAClBI,EAAI1jB,MAAMoZ,UAAV,oBAAmC8J,EAAnC,cAA0CC,EAA1C,qBAAwDF,EAAxD,OAwC4CsB,CAAKnG,IACrC,OAAViG,QAAU,IAAVA,KAAY/jB,iBAAiB,WAAYmjB,EAAIrF,IACnC,OAAViG,QAAU,IAAVA,KAAY/jB,iBAAiB,cAAemjB,EAAIrF,OA4BtD,OAvBI1gB,EAAM0jB,MAAQ1jB,EAAM1B,MACtBwoB,uBACEvC,EAAQvkB,EAAM0jB,KAAKqD,UAAU,cAAWzhB,YAAeH,IAAStO,MAAK,SAACC,GACpE,IAAIijB,EAAOnhB,SAASuJ,eAAenC,EAAM0jB,KAAK7rB,GAAK,kBAC/CmvB,EAAwB,CAC1BC,QAAQ,EACRC,YAAa,EACbC,SAAS,EACTC,SAAUrN,EAAOnJ,WAAWrY,OAAO8uB,iBAAiBtN,GAAMuN,iBAAiB,SAAS9R,QAAQ,KAAM,KAAO,QAAK9e,EAC9G6wB,UAAWxN,EAAOnJ,WAAWrY,OAAO8uB,iBAAiBtN,GAAMuN,iBAAiB,UAAU9R,QAAQ,KAAM,KAAO,QAAK9e,EAChH8wB,WAAYjvB,OAAOkvB,iBACnBC,sBAAuB,QAKzB,OAHA3C,EAAU4C,cAAc7wB,EAASC,MAAM,SAACA,GACtCguB,EAAUjuB,EAASC,KAAMyvB,EAAYQ,MAEhC9gB,QAAQgL,cAEjBpL,OAAM,SAACC,GACP0gB,YAAWzmB,EAAMuB,MAAOwE,EAAIC,YAIzB,WACLb,EAAOC,YAER,CAACpF,EAAM0jB,KAAM1jB,EAAMuB,MAAOvB,EAAM1B,OAUnC,OACE,oCACE,kBAACkY,EAAA,EAAD,CAAQ5S,UAAWpF,EAAQe,KAAMjB,KAAM0B,EAAM1B,KAAMspB,YAAY,GAC7D,kBAACjR,EAAA,EAAD,CAAarU,MAAO,CAAEzH,gBAAiB,UAAWT,MAAO,WAAY,UAAA4F,EAAM0jB,YAAN,eAAYgD,eAAZ,UAA2B1mB,EAAM0jB,YAAjC,aAA2B,EAAYmE,gBAAiB,IAC7H,kBAACjR,EAAA,EAAD,CAAetU,MAAO,CAAE+Y,UAAW,UAAYxjB,IAAI,UAAAmI,EAAM0jB,YAAN,eAAY7rB,IAAK,mBACpE,kBAACkf,EAAA,EAAD,KACE,kBAACf,EAAA,EAAD,CAAQ7W,QAdK,WACfa,EAAM0jB,MAAQ1jB,EAAM1B,MACtBwoB,uBAAanC,EAAmB3kB,EAAM0jB,KAAKqD,SAAU/mB,EAAM0jB,KAAKgD,aAAe1mB,EAAM0jB,KAAKmE,gBAAgB/hB,OAAM,SAACC,GAC/G0gB,YAAWzmB,EAAMuB,MAAOwE,OAWS3L,MAAM,WAArC,YAGA,kBAAC4b,EAAA,EAAD,CAAQ7W,QAAS,yBAAMa,QAAN,IAAMA,OAAN,EAAMA,EAAO8nB,SAAS1tB,MAAM,WAA7C,W,4GC5IK,SAAS2tB,EAAgB/nB,GAAQ,IAAD,IACnB3B,mBAAgB,IADG,mBACtCpG,EADsC,KAC/B+vB,EAD+B,OAErB3pB,mBAAc,IAFO,mBAEtC4pB,EAFsC,KAEhCC,EAFgC,KAGvC/iB,EAASE,cA+BT8iB,EAAa,SAAC3D,EAAQ4D,EAAMC,IFiE7B,SAAoB7D,GACzB,IAAMhuB,EAAM,kBAAoBguB,EAChC,OAAOvuB,EAAcgS,OAAOzR,GAAKK,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,SElE7CuxB,CAAW9D,GAAQ3tB,MACjB,SAACC,GACKkJ,EAAMmoB,YAAYnoB,EAAMmoB,WAAW3D,GACvC4D,OAEF,SAACriB,GACCsiB,EAAMtiB,EAAIjP,SAAWiP,EAAIjP,SAASkP,QAAUD,EAAIC,SAChDygB,YAAWzmB,EAAMuB,MAAOwE,OA+B9B,OACE,kBAAC,WAAD,CACEzD,MAAO,CAAEpF,WAAY,QACrBya,IAAK,SAACA,GAAD,OAASuQ,EAAQvQ,IACtB1f,MAAOA,EACPswB,OAAQ,WAxEVC,QAAQC,IAAI,oCAAqCR,IAyE/CS,cAAe,SAACC,GACdX,EAASW,EAAUnxB,KAAI,SAACoxB,GAAD,OAAcA,EAASlF,UAEhDmF,OAAQ,CACNC,QA1Ec,SAACC,EAAWrF,EAAMsF,EAAUZ,EAAMC,EAAOY,EAAUC,EAAOC,EAAU9pB,GAiBtF,OFwCG,SAAkBqkB,EAAYkB,EAAkBH,EAAuBluB,GAC5E,IAEI8C,EAAO,IAAIsqB,SAEftqB,EAAKuqB,OAAO,QAASF,GACrBrqB,EAAKuqB,OAAO,WAAYgB,GAExB,IAAInuB,EAAc,GAOlB,YANcC,IAAVH,IACFE,EAAOE,YAAcJ,GAEvBE,EAAOsC,QAAU,CAAE,eAAgB,uBACnCtC,EAAOiuB,iBAAmBD,EAEnBxuB,EAAc0B,KAdT,iBAcmB0B,EAAM5C,GAAQI,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,QEnEzDqyB,CAAS1F,EAAMA,EAAKpY,MAJC,SAAClM,GACpB6pB,EAAS7pB,EAAEiqB,iBAAkBjqB,EAAEkqB,OAAQlqB,EAAEqU,SAGHnO,YAAeH,IACpDtO,MAAK,SAACC,GACDkJ,EAAMupB,SAASvpB,EAAMupB,QAAQzyB,GACjCsxB,EAAKtxB,EAASe,OAEfiO,OAAM,SAACC,GACqB,IAAD,IAArByjB,IAAMC,SAAS1jB,KAClBsiB,EAAK,iBAACtiB,QAAD,IAACA,GAAD,UAACA,EAAKjP,gBAAN,aAAC,EAAekP,eAAhB,eAA2BD,QAA3B,IAA2BA,OAA3B,EAA2BA,EAAKC,SACrCygB,YAAWzmB,EAAMuB,MAAOwE,OAIvB,CACLmjB,MAAO,WACLhkB,YAAeC,GACf+jB,OAuDAQ,OAAQvB,EACR9N,OAAQ8N,EACRwB,MAvCY,SAACC,EAAYxB,EAAMC,EAAOY,EAAUC,EAAOnwB,GAkB3D,OAbAwrB,EAAQqF,GAJa,SAACxqB,GACpB6pB,EAAS7pB,EAAEiqB,iBAAkBjqB,EAAEkqB,OAAQlqB,EAAEqU,SAGTnO,YAAeH,IAAStO,MACxD,SAACC,GACCiC,EAAQjC,EAASiC,SACjBqvB,EAAKtxB,EAASC,SAEhB,SAACgP,GAC4B,IAAD,IAArByjB,IAAMC,SAAS1jB,KAClBsiB,EAAK,iBAACtiB,QAAD,IAACA,GAAD,UAACA,EAAKjP,gBAAN,aAAC,EAAekP,eAAhB,eAA2BD,QAA3B,IAA2BA,OAA3B,EAA2BA,EAAKC,SACrCygB,YAAWzmB,EAAMuB,MAAOwE,OAKvB,CACLmjB,MAAO,WACLhkB,YAAeC,GACf+jB,QAoBFW,UAAS,UAAE7pB,EAAM0c,aAAR,QAAiB,iFAC1BoN,wBAAwB,MACxBC,sBAAsB,MACtBC,kBAAmB,CAAC,UAAW,mBAC/B/tB,KAAK,SA9FXguB,yBAAeC,IAA4BC,IAAoCC,K,sGCPzEtwB,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJrF,SAAU,EACVW,gBAAiBb,EAAMc,QAAQoB,WAAWC,WAI/B,SAASkuB,GAAerqB,GAAQ,IAAD,IACtCxB,EAAU1E,KACVE,EAAQoG,cACRwnB,EAAatnB,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAH5B,EAKNyW,IAAM3Y,SAAS,IALT,mBAKrCisB,EALqC,KAKxBC,EALwB,KAY5C,OACE,kBAAC/T,EAAA,EAAD,CAAQ5S,UAAWpF,EAAQe,KAAMjB,KAAM0B,EAAM1B,KAAMspB,WAAYA,GAC7D,kBAACjR,EAAA,EAAD,kBACA,kBAACC,EAAA,EAAD,KACE,0BACEb,SAAU,SAAC3W,GACTA,EAAE6e,iBACF,IAAIlE,EAAYnhB,SAAS4xB,cACrB,OAAJzQ,QAAI,IAAJA,KAAM0Q,OACFzqB,EAAM0qB,MAAM1qB,EAAM0qB,KAAKJ,KAG7B,kBAACK,GAAA,EAAD,CACErf,KAAM,eACNoR,MAAO,YACP7kB,IAAI,UAAAmI,EAAM0jB,YAAN,eAAY7rB,IAAK,YACrB+yB,OArBW,SAAC1I,GACpBoI,EAAYpI,EAAME,OAAO9W,MAAQ4W,EAAME,OAAOze,MAC9C4mB,EAAeD,IAoBPruB,KAAK,OACL4uB,aAAY,UAAE7qB,EAAM0jB,YAAR,aAAE,EAAYgD,iBAIhC,kBAAC3P,EAAA,EAAD,KACE,kBAACf,EAAA,EAAD,CAAQ7W,QAAS,yBAAMa,QAAN,IAAMA,OAAN,EAAMA,EAAO8nB,SAAS1tB,MAAM,WAA7C,UAGA,kBAAC4b,EAAA,EAAD,CAAQ7W,QAAS,yBAAMa,QAAN,IAAMA,OAAN,EAAMA,EAAO0qB,KAAKJ,IAAclwB,MAAM,WAAvD,U,wBCjDO,SAAS0wB,GAAT,GAAiG,IAAvEC,EAAsE,EAAtEA,KAAsE,IAAhEC,iBAAgE,WAApDt0B,EAAoD,MAAzCu0B,uBAAyC,WAAvBv0B,EAAuB,EAATsJ,EAAS,wDAC7EgX,IAAM3Y,SAAS,MAD8D,mBACtG6sB,EADsG,KAC5FC,EAD4F,KAEvG7sB,EAAOgZ,QAAQ4T,GAUrB,OACE,6BACE,kBAACE,EAAA,EAAD,eAAYjsB,QAVI,SAAC+iB,GACnBiJ,EAAYjJ,EAAMmJ,iBASsBJ,GACpC,kBAACF,EAAD,OAEF,kBAACO,GAAA,EAAD,eAAMJ,SAAUA,EAAUzmB,aAAW,EAACnG,KAAMA,EAAM+F,QATlC,WAClB8mB,EAAY,QAQkEH,GACzEhrB,EAAM2E,W,kCCHT7K,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJ3D,MAAO,OACPsB,WAAY,GAEdsC,KAAM,CACJhF,YAAa,WAIF,SAAS+wB,GAASvrB,GAC/B,IAAMxB,EAAU1E,KADsB,EAEgBkd,IAAM3Y,UAAU,GAFhC,mBAE/BmtB,EAF+B,KAEVC,EAFU,KAIhCzxB,EAAQoG,cACRC,EAAWC,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAEhEuV,EAAU9I,eAcV0e,EAAmB,SAACttB,GACxB,IAAIslB,EAAO1jB,EAAM/H,MAAN,OAAYmG,QAAZ,IAAYA,IAAKotB,GACxB9H,GAAQ1jB,EAAMsoB,YAChBxS,EAAQ,8CAA8Cjf,MAAK,WACzDmJ,EAAMsoB,WAAW5E,MAGrB+H,GAAwB,IAGpBE,EAAe,SAACjI,GAChBA,GACFoD,uBAAanC,EAAmBjB,EAAKqD,SAAUrD,EAAKgD,aAAehD,EAAKmE,gBAAgB/hB,OAAM,SAACC,GAC7F0gB,YAAWzmB,EAAMuB,MAAOwE,OAI9B,OACE,oCACE,kBAAC,KAAD,MACG,gBAAG5L,EAAH,EAAGA,OAAQyB,EAAX,EAAWA,MAAX,OACC,kBAAC,KAAD,CAAezB,OAAQA,EAAQyB,MAAOA,EAAOgI,UAAWpF,EAAQe,KAAMihB,SAAU,GAAID,UAAWvgB,EAAM/H,MAAMmL,OAAQ+c,SAAUngB,EAAM/H,QAChI,SAAC2zB,GACA,IAAItpB,EAAQspB,EAAWtpB,MACnBkK,EAAQof,EAAWpf,MACnBzV,EAAO60B,EAAW70B,KAAKyV,GAC3B,OACE,kBAACqf,EAAA,EAAD,CACEhtB,IAAK9H,EAAKc,GAAK,IAAM2U,EACrB3U,GAAId,EAAKc,GAAK,IAAM2U,EACpBoV,OAAK,EACL1iB,QAAM,EACNC,QAAS,WA5CL,IAACwE,IA6CS5M,EAAKc,GA5C7BmI,EAAM8rB,gBAAiB9rB,EAAM8rB,gBAAgBnoB,IAAU3D,EAAM+rB,eAAiB,GAAKpoB,GAC9E3D,EAAMgsB,UAAUhsB,EAAMgsB,SAASroB,IA8C1BsoB,eAAgB,CAAE3pB,MAAOA,GACzB4pB,mBAAmB,OAElBlsB,EAAM8rB,gBACL,kBAACK,EAAA,EAAD,CACEnoB,KAAK,QACLooB,QAASpsB,EAAM+rB,iBAAmBh1B,EAAKc,GACvCw0B,UAAW,EACXC,eAAa,EACbnN,WAAY,CAAE,kBAAkB,uBAAlB,OAA0CpoB,EAAKc,OAE7D,KACJ,kBAAC00B,EAAA,EAAD,CACE10B,GAAE,8BAAyBd,EAAKc,IAChCkD,QAAShE,EAAK2vB,aAAe3vB,EAAK8wB,cAClCrqB,UAAWpG,YAAiBL,EAAKyd,cAAgBzd,EAAKy1B,iBAAmB,IAAMz1B,EAAKy1B,iBAAmB,IACvGlqB,MAAO,CAAE2Z,aAAc,cAEzB,kBAACwQ,EAAA,EAAD,CAAyBnqB,MAAO,CAAEoqB,MAAO,IACrCrsB,EAaA,kBAACyqB,GAAD,CAAgBC,KAAM4B,MACpB,kBAACC,GAAA,EAAD,CAAUztB,QAAS,kBAAOa,EAAM6sB,WAAanB,EAAiBlf,GAASif,EAAuBjf,KAC5F,kBAACsgB,EAAA,EAAD,CAAMlpB,UAAWpF,EAAQgB,OAD3B,QAIA,kBAACotB,GAAA,EAAD,CAAUztB,QAAS,uBAAqB,oBAAdpI,EAAKkF,KAAL,OAAkC0vB,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAe50B,GAAjD,UAAyDiJ,EAAMgsB,gBAA/D,aAAyD,OAAAhsB,EAAiBjJ,EAAKc,MACvG,kBAACk1B,EAAA,EAAD,CAAWnpB,UAAWpF,EAAQgB,OADhC,WAIA,kBAACotB,GAAA,EAAD,CAAUztB,QAAS,yBAAMwsB,QAAN,IAAMA,OAAN,EAAMA,EAAe50B,KACtC,kBAACi2B,GAAA,EAAD,CAAeppB,UAAWpF,EAAQgB,OADpC,YAIA,kBAACotB,GAAA,EAAD,CAAUztB,QAAS,kBAAMusB,EAAiBlf,KACxC,kBAACygB,EAAA,EAAD,CAAQrpB,UAAWpF,EAAQgB,OAD7B,WAzBF,oCACE,kBAAC4rB,EAAA,EAAD,CAAYjsB,QAAS,kBAAOa,EAAM6sB,WAAanB,EAAiBlf,GAASif,EAAuBjf,IAASlK,MAAO,CAAE9H,YAAa,MAC5HwF,EAAM6sB,WAAa,kBAACI,EAAA,EAAD,MAAa,kBAACH,EAAA,EAAD,OAEnC,kBAAC1B,EAAA,EAAD,CAAYjsB,QAAS,uBAAqB,oBAAdpI,EAAKkF,KAAL,OAAkC0vB,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAe50B,GAAjD,UAAyDiJ,EAAMgsB,gBAA/D,aAAyD,OAAAhsB,EAAiBjJ,EAAKc,KAAMyK,MAAO,CAAE9H,YAAa,MACrI,kBAACuyB,EAAA,EAAD,OAEF,kBAAC3B,EAAA,EAAD,CAAYjsB,QAAS,yBAAMwsB,QAAN,IAAMA,OAAN,EAAMA,EAAe50B,KACxC,kBAACi2B,GAAA,EAAD,gBA8BpB,kBAAC3C,GAAD,CACE/rB,KAAMktB,GAAuB,EAC7B1D,MAAO,kBAAM2D,GAAwB,IACrCf,KAxGoB,SAACJ,GACzB,IAAI5G,EAAO1jB,EAAM/H,MAAMuzB,GACvB9H,EAAI,2BAAQA,GAAS4G,GACjBtqB,EAAMktB,YAAYltB,EAAMktB,WAAWxJ,GACvC+H,GAAwB,IAqGpB/H,KAAM1jB,EAAM/H,MAAMuzB,GAClBjqB,MAAOvB,EAAMuB,SC9HrB,SAAS4rB,GAASntB,GAAa,IACrB2E,EAAkD3E,EAAlD2E,SAAUhB,EAAwC3D,EAAxC2D,MAAO6I,EAAiCxM,EAAjCwM,MAAO/H,EAA0BzE,EAA1ByE,YAAgByb,EADpB,YAC8BlgB,EAD9B,4CAG5B,OACE,kBAACotB,EAAA,EAAD,eAAYC,UAAU,MAAMhhB,KAAK,WAAWnM,OAAQyD,IAAU6I,EAAO3U,GAAE,0BAAqB2U,GAAS8gB,kBAAA,qBAA+B9gB,IAAa0T,GAC9Ivc,IAAU6I,GAAS/H,EAClB,kBAAC8oB,EAAA,EAAD,CACEC,EAAG,EACHlrB,MAAO,CACL/F,QAAS,MACTW,WAAY,OACZtB,MAAO,OACPzB,OAAQ,OACRqC,QAASmH,IAAU6I,EAAQ,GAAK,OAChCkV,UAAW,eAGZ/c,GAED,MAKV,IAAM7K,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJmc,UAAW,qBACXgG,UAAW,cAEb3mB,QAAS,CACPF,gBAAiB,WAEnB2C,UAAW,CACT3C,gBAAiB,SAEnB4yB,SAAU,CACRrzB,MAAO,QACPsD,WAAY,OACZgwB,eAAgB,YAChBC,MAAO,SAETC,gBAAiB,CACfhS,UAAW,QACXzhB,OAAQ,QACRunB,UAAW,cAEbmM,KAAM,CACJzzB,MAAO,SAET0zB,SAAU,CACRlyB,MAAO,OACPzB,OAAQ,yBAIG,SAAS4zB,GAAW/tB,GAAQ,IAAD,gBAClCxB,EAAU1E,KACVE,EAAQoG,cACRwnB,EAAatnB,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAHhC,EAKRyW,IAAM3Y,SAAS,GALP,mBAKjCguB,EALiC,KAKvB2B,EALuB,OAMdhX,IAAM3Y,SAAN,UAA8B2B,EAAM/H,aAApC,QAA6C,IAN/B,mBAMjCA,EANiC,KAM1B+vB,EAN0B,OAOAhR,IAAM3Y,SAAN,iBAAe2B,QAAf,IAAeA,GAAf,UAAeA,EAAOiuB,oBAAtB,aAAe,EAAqBp2B,UAApC,QAA0C,IAP1C,mBAOjCo2B,EAPiC,KAOnBnC,EAPmB,OAQJ9U,IAAM3Y,UAAS,GARX,mBAQjCwuB,EARiC,KAQrBqB,EARqB,OASAlX,IAAM3Y,SAAgB,IATtB,mBASjC8vB,GATiC,KASnBC,GATmB,KAWlCC,GAAmB,OAAGruB,QAAH,IAAGA,GAAH,UAAGA,EAAOiuB,oBAAV,aAAG,EAAqBp2B,GAE3CqG,GAAW8C,cACXuC,GAAU+qB,cAEVC,GAAqBrwB,GAASgD,MAC9BstB,GAAa,OAAGD,SAAH,IAAGA,QAAH,EAAGA,GAAgB,iCAAyBvuB,EAAMnI,UAA/B,QAAqC,KAErExB,GAAM,UAAG2J,EAAMyuB,sBAAT,kBAA2BzuB,EAAMsB,oBAAjC,aAA2B,EAAoBzJ,GAG3DkL,qBAAU,WACR,IAAIoC,EAASE,cAgBb,OAfIhP,INjFD,SAAsBA,EAAgBE,GAC3C,IAAMC,EAAM,mBAAqBH,EAAS,SAEtCI,EAAc,GAMlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,QMyEhD23B,CAAar4B,GAAQ8O,EAAO5O,OACzBM,MAAK,SAACoB,GAAD,OACJ+vB,GAAS,SAAC2G,GACR,OAAI12B,EACKA,EAAMkT,MAAK,SAACC,EAAGC,GAAO,IAAD,IAC1B,OAAO,UAACD,EAAEoJ,mBAAH,QAAkB,IAAlB,UAAwBnJ,EAAEmJ,mBAA1B,QAAyC,GAAK,GAAK,KAElD,SAGf1O,OAAM,SAACC,GACFyjB,IAAMC,SAAS1jB,IACnB0gB,YAAWzmB,EAAMuB,MAAOwE,MAEvB,kBAAMZ,EAAOC,YACnB,CAAC/O,GAAQ2J,EAAMuB,QAElBwB,qBAAU,WACR+oB,EAAgBuC,MACf,CAACA,KAEJ,IAMM9E,GAAU,SAACqF,GAAiC,IAAxBC,IAAuB,yDAC3CC,EAAY72B,EAAMqU,WAAU,SAACoX,GAAD,OAAUA,EAAK7rB,KAAO+2B,EAAQ/2B,OAC3C,IAAfi3B,IACF9G,GAAS,SAAC2G,GAAD,OAAeC,GAAf,mBAA2BD,OAChCE,GAAa/C,EAAgB8C,EAAQ/2B,MAIvCswB,GAAa,SAACtwB,GAA6B,IAAzBk3B,IAAwB,yDAC1CD,EAAY72B,EAAMqU,WAAU,SAACoX,GAAD,OAAUA,EAAK7rB,KAAOA,KACtD,GAAIi3B,GAAa,EAAG,CAClB,IAAIE,EAAehb,KAAKpI,MAAMoI,KAAKC,UAAUhc,EAAMyU,OAAOoiB,EAAW,KACrE9G,EAAS,YAAI/vB,IACT82B,GAAcX,IAAgB,SAACO,GAAD,4BAAkBA,GAAlB,YAA+BK,SAI/D9B,GAAa,SAAC+B,GACdA,EAAWvI,cN1CZ,SAAoBlC,EAAgB0K,GACzC,IAAM14B,EAAM,kBAAoBguB,EAAS,kBAAoB0K,EAC7D,OAAOj5B,EAAc6B,IAAItB,GAAKK,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,QMyCxCo4B,CAAWF,EAAWlI,SAAUkI,EAAWvI,cACxC7vB,MAAK,SAACC,GACL,IAAIs4B,EAAkBn3B,EAAMqU,WAAU,SAACoX,GAAD,OAAUA,EAAK7rB,KAAOf,EAASe,OAC5C,IAArBu3B,IACFn3B,EAAMyU,OAAO0iB,EAAiB,EAAGt4B,GACjCkxB,EAAS,YAAI/vB,QAGhB6N,OAAM,SAACC,GACN0gB,YAAWzmB,EAAMuB,MAAOwE,OAkB1BspB,GAAoB,SAAC3L,GACzBoB,EAAgBpB,EAAKqD,UAClBlwB,MAAK,SAACC,GACLyyB,GAAQ7F,GAAM,MAEf5d,OAAM,SAACC,GACN0gB,YAAWzmB,EAAMuB,MAAOwE,OAIxBuiB,GAAa,SAAC5E,GAClB,ON5EG,SAAwBc,GAC7B,IAAMhuB,EAAM,kBAAoBguB,EAAS,UACzC,OAAOvuB,EAAc6B,IAAItB,GAAKK,MAAK,SAACqV,GAAD,OAAOA,EAAEnV,QM0EnCu4B,CAAe5L,EAAKqD,UACxBlwB,MAAK,SAAC04B,GACDA,EAAUpH,GAAWoH,EAAS13B,IAC7BswB,GAAWzE,EAAK7rB,IAAI,GACzBmI,EAAMuB,MAAMiuB,QAAQ,gBAAiB,CACnC3rB,SAAU,cACV4rB,UAAW,IACXC,iBAAiB,EACjBC,cAAc,EACdC,WAAW,OAGd9pB,OAAM,SAACC,GACN0gB,YAAWzmB,EAAMuB,MAAOwE,OAqBxB8pB,GAAe,SAACzwB,EAAG0wB,GACR,kBAAXA,IAGFC,KACI/vB,EAAMqE,SACRrE,EAAMqE,YAgBN0rB,GAAU,WACd93B,EAAMoW,SAAQ,SAACqV,GACO,SAAhBA,EAAK/P,QAAmBmR,EAAgBpB,EAAKqD,UAAUjhB,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,SAEpGooB,GAAa9f,SAAQ,SAACqV,GACpB4E,GAAW5E,EAAKqD,UAAUjhB,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,UAI/DiqB,GAAc,SAACn4B,GAAQ,IAAD,EAC1B0L,GAAQC,KAAKtF,GAASe,SAAtB,2BAAsCf,GAASgD,OAA/C,kBAA+D,iCAAyBlB,EAAMnI,UAA/B,QAAqC,IAAMA,MAG5G,OACE,oCACE,kBAAC2e,EAAA,EAAD,CACE5S,UAAWpF,EAAQe,KACnBjB,KAAI,UAAE0B,EAAM1B,YAAR,SACJspB,WAAYA,EACZR,SAAU,KACV/H,WAAS,EACThb,QAASwrB,GACTrxB,QAAS,CAAErC,MAAOyrB,EAAa,GAAKppB,EAAQovB,kBAE5C,kBAAChX,EAAA,EAAD,CAAetU,MAAO,CAAE/F,QAAS,IAC/B,kBAAC0zB,EAAA,EAAD,CAAQpsB,SAAS,SAASrF,QAAS,CAAE0xB,aAAc1xB,EAAQzD,QAASo1B,eAAgB3xB,EAAQhB,YAC1F,kBAAC4yB,EAAA,EAAD,KACE,kBAACC,EAAA,EAAD,CACEzsB,UAAWpF,EAAQqvB,KACnBlqB,MAAO0oB,EACPtK,SArJU,SAACG,EAAOoO,GAC9BtC,EAAYsC,GACZpC,GAAc,GACdE,GAAgB,KAmJJ9pB,QAAS,WACTL,aAAW,mBACXzF,QAAS,CAAE+xB,UAAW/xB,EAAQhB,YAE9B,kBAACgzB,EAAA,EAAD,CAAK9T,MAAM,WACX,kBAAC8T,EAAA,EAAD,CAAK9T,MAAM,eACX,kBAAC8T,EAAA,EAAD,CAAK9T,MAAM,iBAIjB,kBAACyQ,GAAD,CAAUxpB,MAAO0oB,EAAU7f,MAAO,EAAG5I,UAAWpF,EAAQsvB,UACtD,kBAAC/F,EAAD,CAAiBxmB,MAAOvB,EAAMuB,MAAOgoB,QAASA,GAASpB,WAAYA,GAAYzL,MAAO,kEAExF,kBAACyQ,GAAD,CAAUvpB,UAAWpF,EAAQsvB,SAAUnqB,MAAO0oB,EAAU7f,MAAO,EAAG/H,aAAW,GAC3E,kBAAC8mB,GAAD,CACEhqB,MAAOvB,EAAMuB,MACbtJ,MAAOA,EAAMgI,QACX,SAACyjB,GAAD,mBACQ,OAAJA,QAAI,IAAJA,GAAA,UAAAA,EAAM+M,wCAAN,eAAwCrtB,QAAS,IAAS,OAAJsgB,QAAI,IAAJA,GAAA,UAAAA,EAAMgN,gCAAN,eAAgCttB,QAAS,KAAW,OAALpD,QAAK,IAALA,GAAA,UAAAA,EAAOiuB,oBAAP,eAAqBlH,aAArB,OAAkCrD,QAAlC,IAAkCA,OAAlC,EAAkCA,EAAMqD,aAEnJmG,WAAYA,GACZ5E,WAAYA,GACZwD,gBAAiB9rB,EAAM2wB,aAAe7E,EAAkB,KACxDC,eAAgBkC,EAChBpB,WAAYA,EACZb,SAAUgE,MAGd,kBAAC7C,GAAD,CAAUvpB,UAAWpF,EAAQsvB,SAAUnqB,MAAO0oB,EAAU7f,MAAO,GAC7D,kBAAC+e,GAAD,CACEhqB,MAAOvB,EAAMuB,MACbtJ,MAAOA,EACPi1B,WAAYA,GACZ5E,WAAYA,GACZwD,gBAAiB9rB,EAAM2wB,aAAe7E,EAAkB,KACxDC,eAAgBkC,EAChBjC,SAAUgE,OAIhB,kBAACjZ,EAAA,EAAD,KACG8V,GAA2B,IAAbR,EACb,6BACG8B,GAAa/qB,OAAS,EACrB,kBAAC4S,EAAA,EAAD,CAAQ7W,QA3JH,WACjBa,EAAMuB,MAAMqvB,UACZzC,GAAa9f,SAAQ,SAACqV,GAAD,OAAU2L,GAAkB3L,MACjD0K,GAAgB,IAChBpuB,EAAMuB,MAAMiuB,QAAQ,oBAAqB,CACvC3rB,SAAU,cACV4rB,UAAW,IACXC,iBAAiB,EACjBC,cAAc,EACdC,WAAW,KAkJ4Bx1B,MAAM,WAAnC,QAGE,KACJ,kBAAC4b,EAAA,EAAD,CAAQ7W,QAtHC,WACnB,IAAI0xB,EAAkB,GACtB1C,GAAa9f,SAAQ,SAACqV,GACpBmN,EAASrtB,KAAK8kB,GAAW5E,OAG3Bxd,QAAQ4qB,IAAID,GACTh6B,MAAK,SAACk6B,GACL3C,GAAgB,OAEjBtoB,OAAM,SAACkrB,GACNA,EAAO3iB,SAAQ,SAACtI,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,SAGpDmoB,GAAc,IAwG2B9zB,MAAM,WAArC,SAKF,6BACE,kBAAC4b,EAAA,EAAD,CAAQ7W,QAAS0wB,GAAcz1B,MAAM,WAArC,SAGc,IAAbiyB,EAAiB,KAChB,kBAACrW,EAAA,EAAD,CAAQ7W,QAAS,kBAAM+uB,GAAc,IAAO9zB,MAAM,aAAlD,UAIF,kBAAC4b,EAAA,EAAD,CAAQ7W,QAxGD,WAEjB,GADA4wB,KACI/vB,EAAM2wB,aAAc,CACtB,IAAIjN,EAAOzrB,EAAM2U,MAAK,SAAC8W,GAAD,OAAUA,EAAK7rB,KAAOo2B,KAC5CjuB,EAAM2wB,aAAajN,GAEjB1jB,EAAMqE,SACRrE,EAAMqE,WAiG+BjK,MAAM,WAAnC,WAOR,kBAACirB,EAAD,CAAmB3B,KAAMzrB,EAAM2U,MAAK,SAAC8W,GAAD,OAAUA,EAAK7rB,KAAO22B,MAAgBlwB,OAAMkwB,GAA8B1G,MAAO,kBAAMvkB,GAAQqB,UAAUrD,MAAOvB,EAAMuB,W,iCCtVhK,sGAKMzH,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCi3B,UAAW,CACTz0B,QAAS,OACTD,QAASvC,EAAMS,QAAQ,GACvBI,gBAAiB,UACjBggB,OAAQ,aAAe7gB,EAAMc,QAAQoB,WAAWC,MAChDP,MAAO,OACP8lB,UAAW,aACXwP,aAAc,GAEhBzvB,MAAO,CACL5G,gBAAiB,UACjBT,MAAOJ,EAAMc,QAAQoB,WAAWC,MAChCI,QAAS,KAAOvC,EAAMS,QAAQ,GAAK,MAErC02B,UAAW,CACT/2B,MAAOJ,EAAMc,QAAQs2B,OAAOC,MAC5BxW,OAAQ,aAAe7gB,EAAMc,QAAQs2B,OAAOC,OAE9CC,eAAgB,CACdl3B,MAAOJ,EAAMc,QAAQs2B,OAAOC,WAajB,SAASE,EAAT,GAAiH,IAA5F9vB,EAA2F,EAA3FA,MAAOkD,EAAoF,EAApFA,SAAoF,IAA1E6sB,YAA0E,aAA5D/2B,eAA4D,MAAlD,EAAkD,MAA/Cg3B,cAA+C,aAA/Bz3B,aAA+B,MAAvB,QAAuB,EACvHwE,EAAU1E,IACV43B,EAAWtxB,cAEjB,OACE,kBAAC,IAAD,CACEkC,MAAO,CACL9F,QAASg1B,EAAO,OAAS,GACzBj1B,QAASm1B,EAASj3B,QAAQA,GAC1BF,OAAO,QAAD,OAAUm3B,EAASj3B,QAAQA,GAA3B,MACNmB,MAAM,eAAD,OAAiB,EAAI81B,EAASj3B,QAAQA,GAAtC,OACL4gB,UAAW,QAEbzX,UAAWE,YAAKtF,EAAQyyB,UAAqB,SAAVj3B,EAAmBwE,EAAQ2yB,UAAY,IAC1EptB,UAAW,EACXspB,UAAU,YAEV,gCACE,kBAAC,IAAD,CAAYzpB,UAAWE,YAAKtF,EAAQiD,MAAiB,SAAVzH,EAAmBwE,EAAQ8yB,eAAiB,KAAM7vB,IAE9FgwB,EACC,CAAE9sB,YAEF,kBAAC,IAAD,CAAMssB,WAAS,EAACx2B,QAASA,GACtBkK,M,6FC1DEgtB,EAAW,SAACC,GAAgB,IAAD,EACZvzB,mBAAQ,OAAauzB,QAAb,IAAaA,IAAc,IADvB,mBAC/BC,EAD+B,KACxBC,EADwB,KAsBtC,MAAO,CAACD,EAAOC,EAnBf,SAAoBrrB,EAAgBsrB,GAAwC,IAAjBC,EAAgB,wDACzEF,GAAS,SAACG,GACR,IAAIC,EAAehkB,oBAAU+jB,GACzBzlB,EAAQylB,EAAE3lB,WAAU,SAAC6lB,GAAD,OAAQA,EAAGt6B,KAAO4O,EAAK5O,MAY/C,OAXI2U,GAAS,EACPulB,EACFA,EAAWG,EAAa1lB,GAAQ0lB,EAAc1lB,GACzC0lB,EAAaxlB,OAAOF,EAAO,EAAG/F,GAC5BurB,IACTE,EAAa1uB,KAAKiD,GACdsrB,GACFA,EAAWG,EAAaA,EAAa9uB,OAAS,GAAI8uB,EAAcA,EAAa9uB,OAAS,GAExF8uB,EAAeA,EAAa/mB,MAAK,SAACC,EAAGC,GAAJ,OAAWD,EAAE3N,SAAW4N,EAAE5N,UAAY,EAAI,MAEtEy0B,S,iCCtBb,+CAGaE,EAAuB54B,YAA6B,CAAC,GAAI,eAEvD44B,O,4LCOFC,EAAwB34B,wBAAiGwM,QAAQC,QAEjImsB,EAAyB,SAAC,GAAyB,IAAD,IAAtB3tB,EAAsB,EAAtBA,SAAU3K,EAAY,EAAZA,MAAY,EAC/BqE,mBAA0B,IADK,mBACtDgB,EADsD,KAC7CkzB,EAD6C,KAGvDC,EAAcC,uBAAY,SAACxhB,EAAuBjL,GAAoD,IAAD,EAAjC0sB,EAAiC,uDAAT,IAC5F/a,EAAM4O,YAAW,kBAAMgM,GAAW,SAACjzB,GAAD,4BAAWA,GAAX,CAAc,CAAE2R,UAASjL,UAAS0sB,wBAAmBA,GAC3F,wBACEzhB,QADF,IACEA,OADF,EACEA,EAAS0hB,SAAQ,WACfC,aAAajb,GACb4a,GAAW,SAACjzB,GACV,IAAIuzB,EAAI,YAAOvzB,GAEf,OADAuzB,EAAKnmB,OAAO,EAAG,GACRmmB,eANb,QAQQ3sB,QAAQC,WAEf,IAEH,OACE,oCACE,kBAACksB,EAAsB3uB,SAAvB,CAAgCC,MAAO6uB,EAAa7tB,SAAUA,IAC9D,kBAACmuB,EAAD,CAAe94B,MAAOA,EAAOsE,MAAM,iBAACe,QAAD,IAACA,OAAD,EAACA,EAAS+D,cAAV,QAAoB,GAAK,EAAG4C,QAAO,OAAE3G,QAAF,IAAEA,GAAF,UAAEA,EAAU,UAAZ,aAAE,EAAc2G,YAKtFlM,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCsC,QAAS,CAAEE,QAAS,OAAQD,QAASvC,EAAMS,QAAQ,GAAK,iBACxD+E,KAAM,CAAEjF,OAAQ,QAChByL,QAAS,CAAExJ,QAAS,eAAgBklB,UAAW,aAAcnnB,OAAQ,OAAQmC,YAAa1C,EAAMS,QAAQ,QAG7Fq4B,EAAgB,SAAC,GAA2C,IAAzCx0B,EAAwC,EAAxCA,KAAwC,IAAlC0H,eAAkC,MAAxB,WAAwB,EAAZhM,EAAY,EAAZA,MACpDwE,EAAU1E,IAChB,OACE,kBAAC,IAAD,CAAeE,MAAOA,GACpB,kBAAC,IAAD,CAAQsE,KAAMA,EAAMmY,mBAAoB,CAAEC,KAAM,IAC9C,kBAAC,IAAD,CAAe9S,UAAWpF,EAAQlC,SAChC,kBAAC,IAAD,CAAkBsH,UAAWpF,EAAQgB,OACrC,yBAAKoE,UAAWpF,EAAQwH,SACtB,kBAAC,IAAD,CAAY1B,QAAQ,MAAM0B,S,gCCrDtC,iNAIa+sB,EAAO,yCACPC,EAAO,6CACPC,EAAQ,0BAGd,SAASC,IAAc,IAAD,IAC3B,2BACE9sB,eAAe1F,QAAQ,kBADzB,QAEED,aAAaC,QAAQ,kBAFvB,QAGGnI,OAAO2F,SAAS/E,KAAKF,QAAQ,cAAgB,GAAKV,OAAO2F,SAAS/E,KAAKF,QAAQ,cAAgB,EAAI+5B,EAAOD,EAIxG,SAASI,IACd/sB,eAAegtB,WAAW,WAC1B3yB,aAAa2yB,WAAW,WAGnB,SAASntB,EAAa/H,GAC3B,IAAIm1B,EACJ,OAAQn1B,EAASiO,eACf,IAAK,OACHknB,EAAcL,EACd,MACF,IAAK,QACHK,EAAcJ,EACd,MACF,IAAK,OACL,IAAK,OACL,QACEI,EAAcN,EAGlB3sB,eAAetF,QAAQ,UAAWuyB,GAClC5yB,aAAaK,QAAQ,UAAWuyB,GAG3B,SAASC,IACd,OAAQJ,KACN,KAAKH,EACH,MAAO,OACT,KAAKC,EACH,MAAO,OACT,KAAKC,EACH,MAAO,QACT,QACE,MAAO,QAIN,IAAMM,EAAU,SAACp9B,EAAyBq9B,EAAqBltB,GACpE,IASIjN,EAAO,SAAWwM,mBAAmB2tB,GAAe,iBAAmB3tB,mBAAmBS,GAE9F,OAAOnQ,EACJwB,KAZS,WAYC0B,EAVI,CACfN,QAAS,CACP,eAAgB,oCAChB06B,cAAe,QAQhB58B,MAAK,SAACC,GAAD,OAAcA,EAASC,QAC5B+O,OAAM,SAACC,GAAD,OAASA,MA6Bb,SAAS2tB,IACd,OAAOttB,eAAe1F,QAAQ,eAShC,SAASizB,EAAcx9B,GAAW,IAAD,QAC3Bq9B,EAAW,oBAAGptB,eAAe1F,QAAQ,sBAA1B,QAA4CD,aAAaC,QAAQ,sBAAjE,QAAmF,GAC9F4F,EAAY,oBAAGF,eAAe1F,QAAQ,uBAA1B,QAA6CD,aAAaC,QAAQ,uBAAlE,QAAqF,GACrG,MAAoB,KAAhB8yB,GAAuC,KAAjBltB,EAA4BJ,QAAQC,OAAO,IAAInB,IAAM4uB,OAAO,qBAE7EL,EAAQp9B,EAAUq9B,EAAaltB,GAAczP,MAAK,SAACC,GACxDsP,eAAetF,QAAQ,cAAehK,EAASP,OAC/C6P,eAAetF,QAAQ,eAAgBhK,EAASwP,cAChDF,eAAetF,QAAQ,wBAAyBhK,EAASuP,iBACzDD,eAAetF,QAAQ,yBAA0BhK,EAASyP,wBACtD9F,aAAaC,QAAQ,gBAAgBD,aAAaK,QAAQ,cAAehK,EAASP,OAClFkK,aAAaC,QAAQ,0BAA0BD,aAAaK,QAAQ,wBAAyBhK,EAASuP,iBACtG5F,aAAaC,QAAQ,iBAAiBD,aAAaK,QAAQ,eAAgBhK,EAASwP,cACpF7F,aAAaC,QAAQ,2BAA2BD,aAAaK,QAAQ,yBAA0BhK,EAASyP,2BA8CnGrQ,IA1CK,WAClB,IAAIC,EACA09B,EACEC,EAAc,SAAdA,IA+BJ,OA9BK39B,IACHA,EAAW6O,IAAM7J,OAAO,CAAEpC,QAAS,CAAE,8BAA+B,OACpEg7B,IAA6B59B,EA1Df,SAACA,GAAD,OAAc,SAAC69B,GAAmB,IAAD,IAEnD,GAA4D,UAA3C,OAAbA,QAAa,IAAbA,GAAA,UAAAA,EAAel9B,gBAAf,mBAAyBiC,eAAzB,eAAmC,kBAkBrC,OAAOmN,QAAQgL,QAAQ8iB,GAlB4C,IAAD,IAC9DR,EAAW,UAAGptB,eAAe1F,QAAQ,sBAA1B,QAA4CD,aAAaC,QAAQ,eAC5E4F,EAAY,UAAGF,eAAe1F,QAAQ,uBAA1B,QAA6CD,aAAaC,QAAQ,gBAClF,OAAI8yB,GAAeltB,EACVitB,EAAQp9B,EAAUq9B,EAAaltB,GAAczP,MAAK,SAACC,GAUxD,OATAsP,eAAetF,QAAQ,cAAehK,EAASP,OAC/C6P,eAAetF,QAAQ,eAAgBhK,EAASwP,cAChDF,eAAetF,QAAQ,wBAAyBhK,EAASuP,iBACzDD,eAAetF,QAAQ,yBAA0BhK,EAASyP,wBACtD9F,aAAaC,QAAQ,gBAAgBD,aAAaK,QAAQ,cAAehK,EAASP,OAClFkK,aAAaC,QAAQ,0BAA0BD,aAAaK,QAAQ,wBAAyBhK,EAASuP,iBACtG5F,aAAaC,QAAQ,iBAAiBD,aAAaK,QAAQ,eAAgBhK,EAASwP,cACpF7F,aAAaC,QAAQ,2BAA2BD,aAAaK,QAAQ,yBAA0BhK,EAASyP,wBAErGL,QAAQgL,kBAXnB,GAqDyC+iB,CAAY99B,IAEnDA,EAAS+9B,aAAaC,QAAQC,KAAI,SAACD,GAAa,IAAD,EAKiC,EAF9E,OAFAA,EAAQE,QAAR,UAAkBF,EAAQE,eAA1B,QAAqCnB,IACrCiB,EAAQp7B,QAAR,cAAmC,UAAY26B,IAC3B,aAAhBS,EAAQ39B,KAAsC,oBAAhB29B,EAAQ39B,KAA6C,gCAAhB29B,EAAQ39B,IAA8C29B,GAExHN,IAAkB,IAAIloB,MAAOoD,UAnC1C,WACE,IAAIulB,EAASluB,eAAe1F,QAAQ,yBACpC,OAAO4zB,EAAS,IAAI3oB,KAAKA,KAAKC,MAAM0oB,GAAU,KAAiB,IAAI3oB,KAAK,GAiCpB4oB,GAAqBxlB,UAUjE,UATA8kB,EAAiBF,EAAcG,KAC5Bj9B,MAAK,WAEJ,OADAg9B,OAAiBn9B,EACVy9B,KAERruB,OAAM,SAACC,GAEN,OADA8tB,OAAiBn9B,EACVwP,QAAQC,OAAO,IAAInB,IAAM4uB,OAAO7tB,cAE3C,QAAyBouB,EAElBN,EACHA,EAAeh9B,MAAK,WAClB,OAAOs9B,KAETA,MAKHh+B,GAET,MAAO,CACLA,SAAU29B,EACVP,QAAS,kBAAMI,EAAcG,OAIlB59B,I,2NC9JT4D,EAAYC,aAAW,SAACC,GAAD,YAAY,CACvCuF,KAAM,GACNi1B,WAAS,GACPj4B,QAASvC,EAAMS,QAAQ,GACvBinB,UAAW,cAFJ,cAGN1nB,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BC,MAAO,SAJF,cAMN5B,EAAM0B,YAAYG,GAAG,MAAQ,CAC5BD,MAAO,OACPrB,OAAQP,EAAMS,QAAQ,GAAK,YARtB,wBAUE,gBAVF,GAYTg6B,YAAa,CAAEj4B,QAAS,QACxBk4B,WAAY,CACVh6B,WAAY,EACZF,YAAa,QAEfm6B,eAAgB,GAChBC,aAAc,CACZ9Z,cAAe9gB,EAAMS,QAAQ,IAE/Bo6B,aAAc,CACZt6B,OAAQP,EAAMS,QAAQ,IAExBq6B,gBAAiB,CACfv6B,OAAQ,OACRozB,MAAO,QACPnxB,QAAS,eAEXgD,KAAM,CACJyb,aAAcjhB,EAAMS,QAAQ,QAIjB,SAASs6B,EAAc/0B,GAAQ,IAAD,IACrCxB,EAAU1E,IAD2B,EAEGuE,mBAAiB,IAFpB,mBAEpCuK,EAFoC,KAEnBosB,EAFmB,OAGL32B,mBAAiB,IAHZ,mBAGpCqK,EAHoC,KAGvBusB,EAHuB,OAIG52B,mBAAiB,IAJpB,mBAIpC62B,EAJoC,KAInBC,EAJmB,OAKD92B,oBAAkB,GALjB,mBAKpC+2B,EALoC,KAKrBC,EALqB,OAMLh3B,oBAAkB,GANb,mBAMpCi3B,EANoC,KAMvBC,EANuB,OAQpBtoB,qBAAWkU,KAA3B7f,EARoC,oBASrCmF,EAAI,UAAGzG,EAAMyG,YAAT,QAAiBnF,EAErBjL,EAAM,iBAAGoQ,QAAH,IAAGA,OAAH,EAAGA,EAAM5O,UAAT,QAAe,GACrB29B,EAAiBx1B,EAAMw1B,eAUvBzT,EAAW,SAAC3iB,GAChB,OAAQA,EAAEgjB,OAAOvqB,IACf,IAAK,kBACHm9B,EAAmB51B,EAAEgjB,OAAOze,OAC5B,MACF,IAAK,cACHsxB,EAAe71B,EAAEgjB,OAAOze,OACxB,MACF,IAAK,kBACHwxB,EAAmB/1B,EAAEgjB,OAAOze,SAS5B8xB,EAAe,WAEjB,IAAIxkB,EADFvI,IAAgBwsB,GAEEjkB,EAAhBukB,EAA0B7sB,YAAetS,EAAQuS,EAAiBF,GACvDG,YAAoBxS,EAAQqS,GAE3Coe,uBAAa7V,GACVpa,MAAK,SAACC,GACL4+B,YAAa11B,EAAMuB,MAAO,kCAjChCyzB,EAAmB,IACnBC,EAAe,IACfE,EAAmB,IACnBI,GAAe,GACfF,GAAiB,MAgCZvvB,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,OACrC0gB,YAAWzmB,EAAMuB,MAAO,4BAGjC,OACE,kBAAC,IAAD,CAAOqC,UAAWpF,EAAQg2B,WACxB,yBAAK5wB,UAAWpF,EAAQi2B,aACtB,kBAAC,IAAD,CAAYnwB,QAAQ,KAAKV,UAAWpF,EAAQk2B,YACzC,6BAAuBjuB,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAMhJ,YAIlC,0BAAMsY,SAAU0f,GACd,yBAAK7xB,UAAWpF,EAAQo2B,cACrBY,EACC,kBAAC,IAAD,CACE39B,GAAG,kBACH6kB,MAAM,mBACN/Y,MAAOiF,EACPmZ,SAAUA,EACV1C,WAAS,EACTpjB,KAAMm5B,EAAgB,OAAS,WAC/BhW,aAAa,mBACbkD,WAAY,CACVqT,aACE,kBAAC,IAAD,CAAgB9xB,SAAS,OACvB,kBAAC,IAAD,CAAY1E,QAAS,kBAAMk2B,GAAiB,SAACjqB,GAAD,OAAQA,MAAIwqB,YAAa,SAACx2B,GAAD,OAAOA,EAAE6e,mBAC3EmX,EAAgB,kBAAC,IAAD,MAAoB,kBAAC,IAAD,WAM7C,KACJ,kBAAC,IAAD,CACEv9B,GAAG,cACH6kB,MAAM,eACN/Y,MAAO+E,EACPqZ,SAAUA,EACV1C,WAAS,EACTwW,WAAY,gEACZ55B,KAAMm5B,EAAgB,OAAS,WAC/BhW,aAAa,eACbrX,UAAW1R,EACXisB,WAAY,CACVqT,aACE,kBAAC,IAAD,CAAgB9xB,SAAS,OACvB,kBAAC,IAAD,CAAY1E,QAAS,kBAAMk2B,GAAiB,SAACjqB,GAAD,OAAQA,MAAIwqB,YAAa,SAACx2B,GAAD,OAAOA,EAAE6e,mBAC3EmX,EAAgB,kBAAC,IAAD,MAAoB,kBAAC,IAAD,WAM/C,kBAAC,IAAD,CACEv9B,GAAG,kBACH6kB,MAAM,mBACN/Y,MAAOuxB,EACPnT,SAAUA,EACV6I,OA1EK,SAACxrB,GACdm2B,EAAkC,KAAnBn2B,EAAEgjB,OAAOze,QA0EhB0b,WAAS,EACTgJ,MAAOiN,GAAe5sB,IAAgBwsB,EACtCW,WAAYP,GAAe5sB,IAAgBwsB,EAAkB,+BAA4Bx+B,EACzFuF,KAAMm5B,EAAgB,OAAS,WAC/BhW,aAAa,eACb0W,UAAW,SAAC12B,GACQ,KAAdA,EAAE22B,SAAgBN,KAExB1tB,UAAW1R,EACXisB,WAAY,CACVqT,aACE,kBAAC,IAAD,CAAgB9xB,SAAS,OACvB,kBAAC,IAAD,CAAY1E,QAAS,kBAAMk2B,GAAiB,SAACjqB,GAAD,OAAQA,MAAIwqB,YAAa,SAACx2B,GAAD,OAAOA,EAAE6e,mBAC3EmX,EAAgB,kBAAC,IAAD,MAAoB,kBAAC,IAAD,YAQjD,yBAAKxxB,UAAWpF,EAAQs2B,iBACtB,kBAAC,IAAD,CAAQ16B,MAAM,UAAUkK,QAAQ,YAAYV,UAAWpF,EAAQq2B,aAAc11B,QAASs2B,GACpF,kBAAC,IAAD,CAAM7xB,UAAWpF,EAAQgB,OAD3B,a,wHC7KK,SAASw2B,EAAT,GAAkH,IAAD,IAAzFC,iBAAyF,SAAtEx2B,EAAsE,EAAtEA,KAAsE,IAAhEy2B,mBAAgE,MAAlD,GAAkD,MAA9CtyB,iBAA8C,MAAlC,GAAkC,MAA9BmE,gBAA8B,SAAT/H,EAAS,yEAC9H,OACE,kBAAC,IAAD,eAAQsE,QAAQ,YAAYlK,MAAM,UAAUwJ,UAAWE,YAAKF,EAAW,gBAAiBmE,SAAUA,GAAYkuB,GAAej2B,GACzHi2B,EAAmBC,EAAPz2B,K,gCCRpB,aAkBa02B,EAAgB38B,YAAgC,CAAC,GAAI,eAEnD28B,O,kJCjBA,SAASC,EAAT,GAAiE,IAA9BC,EAA6B,EAAxChJ,UAAqBiJ,EAAmB,EAA1Bt2B,MAAkBu2B,EAAQ,qCAC7E,OAAO,kBAAC,IAAD,iBAAWA,EAAX,CAAiBC,OAAQ,SAACx2B,GAAD,OAAW,kBAACq2B,EAAD,iBAAOr2B,EAAWs2B,QC2BhD,SAASG,EAAT,GAkBL,IAjBGJ,EAiBJ,EAjBPhJ,UACiBqJ,EAgBV,EAhBPC,gBAgBO,IAfPC,kBAeO,MAfM,IAeN,EAdAN,EAcA,EAdPt2B,MACiB62B,EAaV,EAbPl2B,gBAaO,IAZPqK,MAAO8rB,OAYA,MAZQ,GAYR,EAXJP,EAWI,8FACP,OACE,kBAAC,IAAD,iBACMA,EADN,CAEEC,OAAQ,SAACx2B,GAAD,OACG,IAAT62B,EACyB,MAAvBP,EAAOh1B,cACLg1B,EAAOh1B,aAAazJ,GAwBhC,SAAoBk/B,EAAkBC,GACpC,IAAIC,GAAa,EAEjB,GAA0B,KAAb,OAATD,QAAS,IAATA,OAAA,EAAAA,EAAW5zB,QACb,OAAO,EAOT,OAJA2zB,EAAS1oB,SAAQ,SAAC6oB,GAChBD,EAAaA,IAAuB,OAATD,QAAS,IAATA,OAAA,EAAAA,EAAW/9B,QAAQi+B,EAAQ5rB,QAAS,KAG1D2rB,EAlCKE,CAAWb,EAAOh1B,aAAa0J,MAAO8rB,GACpCJ,GAAKE,GAAcr+B,OAAO6+B,WAAaR,EACrC,kBAACF,EAAD,iBAAO12B,EAAWs2B,EAAYC,IAE9B,kBAACF,EAAD,iBAAOr2B,EAAWs2B,EAAYC,IAGhC,kBAAC,IAAD,CAAUc,GAAG,kBAMjB,kBAAC,GAAD,MAGF,kBAAC,IAAD,CAAUA,GAAI,CAAEp4B,SAAU,SAAUiC,MAAO,CAAEo2B,KAAMt3B,EAAM9B,iBCvEpD,SAASq5B,IACtB,OAAO,yBAAKj1B,MAAO,CAAEpF,WAAY,QAASme,UAAW,SAAUjhB,MAAO,UAA/D,kB,uECKHN,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJrF,SAAU,GAEZs9B,KAAM,CACJpQ,SAAU,OACV7sB,OAAQ,QAEVk9B,SAAU,CACR77B,MAAO,OACPwrB,SAAU,SAEZsQ,eAAgB,CACd97B,MAAO,QAETO,MAAO,CACL4f,SAAU,QACVH,UAAW,QACXwL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,OACTrC,OAAQ,QAEVw9B,YAAa,CACXp7B,QAASvC,EAAMS,QAAQ,GACvB4gB,UAAW,SACX7e,QAAS,OACTwf,SAAU,UAEZ4b,YAAa,CACXx9B,MAAOJ,EAAMc,QAAQ2E,KAAK1E,QAC1BohB,SAAU,SACV5f,QAAS,MACTmB,WAAY,OACZ8jB,cAAe,SACf5lB,MAAO,OACPrB,OAAQ,QAEVs9B,kBAAmB,CACjBz9B,MAAOJ,EAAMc,QAAQ2E,KAAK1E,QAC1BohB,SAAU,SACVze,WAAY,OACZ8jB,cAAe,SACf5lB,MAAO,OACPrB,OAAQ,QAEVu9B,SAAU,CACRC,OAAQ,UACRv7B,QAAS,QACT,UAAW,CACTkxB,eAAgB,SAGpBrxB,KAAM,CACJxB,gBAAiB,WAEnBm9B,MAAO,CACLn9B,gBAAiB,WAEnBo9B,IAAK,CACHp9B,gBAAiB,WAEnBq9B,OAAQ,CACNr9B,gBAAiB,WAEnB0gB,KAAM,CACJ1gB,gBAAiB,WAEnBs9B,KAAM,CACJt9B,gBAAiB,WAEnBu9B,OAAQ,CACNv9B,gBAAiB,WAEnBw9B,KAAM,CACJx9B,gBAAiB,WAEnBy9B,MAAO,CACLz9B,gBAAiB,WAEnB09B,MAAO,CACL,UAAW,CACTt4B,OAAQ,mBACRyb,UAAW,cACX8c,aAAc,MACdC,UAAW,uCACXx9B,WAAY,YAeH,SAASy9B,EAAT,GAA+H,IAAD,IAAhGtiB,eAAgG,MAAtF,GAAsF,EAAlF7U,EAAkF,EAAlFA,MAAkF,IAA3EE,aAA2E,MAAnE,GAAmE,EAC3IF,EAAMqvB,UACN,IAAMpyB,EAAU1E,IACVE,EAAQoG,cACRC,EAAWC,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IA0BhEo4B,EAAe,SAACz5B,EAAyBL,EAAkCwB,GAC/E,IAAMrC,EACJ,kBAAC46B,EAAA,EAAD,CAAM56B,MAAI,EAAC66B,cAAY,EAACj1B,UAAWvD,EAAW7B,EAAQk5B,eAAiBl5B,EAAQi5B,SAAU54B,IAAKA,GAtB5E,SAACK,EAAyBL,EAAkCwB,GAAuB,IAAD,IAClF/D,EAQdw8B,EACJ,0BAAMl1B,UAAWpF,EAAQs5B,SAAU34B,QAASD,EAAOC,SACjD,kBAAC45B,EAAA,EAAD,CAAOn1B,UAAWE,YAAKzD,EAAW7B,EAAQm5B,YAAcn5B,EAAQrC,MAAOqC,EAAQ+5B,MAAO/5B,EAAO,UAACU,EAAO9E,aAAR,QAAiBJ,EAAMc,QAAQC,QAAQC,QAClI,yBAAK4I,UAAWvD,EAAW7B,EAAQq5B,kBAAoBr5B,EAAQo5B,aAAc14B,EAAOuC,SAK1F,OAAOvC,EAAO85B,YAhBM18B,EAgBiB,UAAC4C,EAAO5C,eAAR,QAAmBw8B,EAdpD,kBAAC,IAAD,eAAiBj6B,IAAKA,GAASK,EAAO+5B,sBACnC38B,IAamEw8B,EAMrEI,CAAch6B,EAAQL,EAAKwB,IAGhC,OAAOnB,EAAOi6B,QAAUn7B,EAAO,MAGjC,OACE,6BACGyD,EAnCe,SAACA,GACnB,OAAO,4BAAKA,GAkCD23B,CAAY33B,GAAS,KAC9B,yBAAKmC,UAAWpF,EAAQe,MACtB,kBAACq5B,EAAA,EAAD,CAAM3H,WAAS,EAACoI,UAAU,MAAM5+B,QAAS4F,EAAW,EAAI,EAAGi5B,QAAQ,SAAS11B,UAAWpF,EAAQg5B,MAC5FphB,EAAQ5e,KAAI,SAAC0H,EAAQd,GAAT,OAAeu6B,EAAaz5B,EAAQd,EAAGiC,SCxJ/C,SAASk5B,EAAev5B,GACrCA,EAAMuB,MAAMqvB,UAEZ,IAAMxa,EAAU,CACd,CACEjX,QAAS,WACPa,EAAMuD,QAAQC,KAAK,eAErB/B,MAAO,YACP03B,SAAS,IAIb,OAAO,kBAACT,EAAD,CAAoBj3B,MAAM,kBAAkB2U,QAASA,EAAS7U,MAAOvB,EAAMuB,Q,mCCF9Ei4B,EAAY,UAEZ1/B,EAAYC,aAAW,SAACC,GAAD,MAAY,CAEvCuO,aAAc,CACZhM,QAAS,QAEXjF,OAAQ,CACNmiC,UAAW,QAEbt9B,MAAO,CACL5B,OAAQ,OACRJ,OAAQ,OACR4hB,SAAU,QACVqL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,OACTglB,cAAe,SACf9mB,WAAYV,EAAMS,QAAQ,IAE5Bi/B,UAAW,CACT3d,SAAU,QACVH,UAAW,QACXwL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,OACT3B,gBAAiB2+B,EACjBp/B,MAAO,SAETu/B,aAAc,CACZ5d,SAAU,QACVH,UAAW,QACXwL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,QAEXo7B,YAAa,CACXx9B,MAAO,QACP+hB,SAAU,SACV5f,QAAS,MACTmB,WAAY,OACZ8jB,cAAe,SACf5lB,MAAO,OACPrB,OAAQ,QAEV8B,KAAM,CACJxB,gBAxDc,WA0DhBm9B,MAAO,CACLn9B,gBA1De,WA4DjBo9B,IAAK,CACHp9B,gBA5Da,WA8Dfu9B,OAAQ,CACNv9B,gBA9DgB,WAgElB0gB,KAAM,CACJ1gB,gBAAiB2+B,OAIN,SAASI,EAAa55B,GAAQ,IAAD,EACR3B,oBAAS,GADD,mBACnCw7B,EADmC,KACxBC,EADwB,KAEpCt7B,EAAU1E,IAoBhB,OAlBAiJ,qBAAU,WACR,IAAIg3B,EAAQ/5B,EAAM9B,SAASuF,OAErBpN,EAAS0jC,EAAM/gC,UAAU+gC,EAAM9gC,QAAQ,YAAc,EAAG8gC,EAAM9gC,QAAQ,YAEtE1C,EAAQwjC,EAAM/gC,UAAU+gC,EAAM9gC,QAAQ,WAAa,GAEzD6tB,uBAAave,YAAalS,EAAQE,IAAQM,MACxC,WACE6+B,YAAa11B,EAAMuB,MAAO,kDAC1Bu4B,GAAa,MAEf,SAAC/zB,GACC0gB,YAAWzmB,EAAMuB,MAAOwE,QAG3B,CAAC/F,EAAM9B,SAASuF,OAAQzD,EAAMuB,QAG/B,yBAAKqC,UAAWpF,EAAQ+J,cACtB,kBAAC6kB,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQlH,OAAQgN,QAAQ,MAA/C,iBAIA,6BACA,kBAACs0B,EAAA,EAAD,CAAM3H,WAAS,EAACoI,UAAU,MAAM5+B,QAAS,EAAG6+B,QAAQ,UAClD,kBAACP,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQm7B,cACxB,kBAACZ,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQk7B,WACxB,kBAACtM,EAAA,EAAD,mJAGE,6BACA,6BAJF,gEASDyM,EACC,0BACEj2B,UAAU,UACVzE,QAAS,WACPa,EAAMuD,QAAQC,KAAK,YAGrB,kBAACu1B,EAAA,EAAD,CAAOn1B,UAAWE,YAAKtF,EAAQrC,MAAO,QAASqC,EAAQnC,OACrD,yBAAKuH,UAAWpF,EAAQo5B,aAAxB,WAGF,Q,wDCxHR99B,EAAYC,aAAW,SAACC,GAAD,MAAY,CAEvCuO,aAAc,CACZhM,QAAS,QAEXjF,OAAQ,GACR6E,MAAO,CACL5B,OAAQ,OACRJ,OAAQ,OACR4hB,SAAU,QACVqL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,OACTglB,cAAe,SACf9mB,WAAYV,EAAMS,QAAQ,IAE5Bi/B,UAAW,CACT3d,SAAU,QACVqL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,cACT3B,gBAAiB,UACjBT,MAAO,SAETu/B,aAAc,CACZ5d,SAAU,QACVqL,SAAU,QACV7qB,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,MACRQ,UAAW,SACX7e,QAAS,OACTggB,cAAe,UAEjBob,YAAa,CACXx9B,MAAO,QACP+hB,SAAU,SACV5f,QAAS,MACTmB,WAAY,OACZ8jB,cAAe,SACf5lB,MAAO,OACPrB,OAAQ,QAEVgnB,UAAW,CACTnnB,MAAO,QACPuzB,MAAO,OACP/xB,MAAO,QAETsD,OAAQ,CACNu6B,UAAWz/B,EAAMS,QAAQ,GACzBF,OAAQ,QAEVQ,QAAS,CACPF,gBAAiBb,EAAMc,QAAQC,QAAQC,MAEzCwC,UAAW,CACT3C,gBAAiBb,EAAMc,QAAQ0C,UAAUxC,UAI9B,SAAS+5B,EAAc/0B,GAAQ,IAAD,EACX3B,mBAAS,IADE,mBACpCmH,EADoC,KAC1Bw0B,EAD0B,OAEL37B,mBAAS,IAFJ,mBAEpCqK,EAFoC,KAEvBusB,EAFuB,OAGG52B,mBAAS,IAHZ,mBAGpC62B,EAHoC,KAGnBC,EAHmB,OAIS92B,oBAAS,GAJlB,mBAIpC47B,EAJoC,KAIhBC,EAJgB,OAKT77B,oBAAS,GALA,mBAKpCw7B,EALoC,KAKzBC,EALyB,KAOrCt7B,EAAU1E,IACVvD,EAAQyJ,EAAM9B,SAASuF,OAAOzK,UAAUgH,EAAM9B,SAASuF,OAAOxK,QAAQ,WAAa,GAEzFkhC,YAAehE,IAAe,CAAE10B,MAAO,mBAEvC,IAAM24B,EAAmB,WACnB1xB,IAAgBwsB,GAAmC,KAAhBxsB,GAA0C,KAApBwsB,GAC3Dl1B,EAAMuB,MAAM8mB,MAAM,iCAAkC,CAClDxkB,SAAU,cACV4rB,UAAW,IACXC,iBAAiB,EACjB3vB,cAAc,EACd4vB,cAAc,EACdC,WAAW,IAEbsK,GAAsB,IAEtBA,GAAsB,IAIpB1xB,EAAoB,WACpBjS,EAAM6M,OAAS,EACjB0jB,uBAAare,YAAcjD,EAAUjP,EAAOmS,IAAc7R,MACxD,WACEmJ,EAAMuB,MAAMiuB,QAAQ,+BAAgC,CAClD3rB,SAAU,cACV4rB,UAAW,IACXC,iBAAiB,EACjB3vB,cAAc,EACd4vB,cAAc,EACdC,WAAW,IAEbkK,GAAa,MAEf,SAAC/zB,GACC0gB,YAAWzmB,EAAMuB,MAAOwE,MAI5B0gB,YAAWzmB,EAAMuB,MAAO,+BAItB84B,EAAW,SAACj7B,GACF,UAAVA,EAAEP,KACJ2J,KAIE8xB,EAA2B,GAE7BC,EAAU,kBAACnN,EAAA,EAAD,mIAEVoN,EACF,kBAAC7P,EAAA,EAAD,CACE9yB,GAAI,WACJ6kB,MAAO,WACPqF,SAAU,SAAC3iB,GAAD,OAAO46B,EAAY56B,EAAEgjB,OAAOze,QACtC82B,WAAYJ,EACZp+B,KAAM,OACN2H,UAAWpF,EAAQ+iB,UACnB5d,MAAO6B,EACPjL,OAAO,QACP+J,QAAQ,aAIRo2B,EACF,kBAAC/P,EAAA,EAAD,CACE9yB,GAAI,eACJ6kB,MAAO,eACP2L,MAAO4R,EACPlY,SAAU,SAAC3iB,GAAD,OAAO61B,EAAe71B,EAAEgjB,OAAOze,QACzCinB,OAAQwP,EACRK,WAAYJ,EACZp+B,KAAM,WACN2H,UAAWpF,EAAQ+iB,UACnB5d,MAAO+E,EACPnO,OAAO,QACP+J,QAAQ,aAIRq2B,EACF,kBAAChQ,EAAA,EAAD,CACE9yB,GAAI,mBACJ6kB,MAAO,mBACP2L,MAAO4R,EACPlY,SAAU,SAAC3iB,GAAD,OAAO+1B,EAAmB/1B,EAAEgjB,OAAOze,QAC7CinB,OAAQwP,EACRK,WAAYJ,EACZp+B,KAAM,WACN2H,UAAWpF,EAAQ+iB,UACnB5d,MAAOuxB,EACP36B,OAAO,QACP+J,QAAQ,aAIRs2B,EACF,6BACE,kBAAC5kB,EAAA,EAAD,CAAQ7W,QAASqJ,EAAmBlE,QAAQ,YAAYV,UAAWE,YAAKtF,EAAQU,SAC9E,kBAAC27B,EAAA,EAAD,MACA,yBAAKv4B,MAAO,CAAEyZ,SAAU,UAF1B,SAKC8d,EACC,kBAAC7jB,EAAA,EAAD,CACE7W,QAAS,WACPa,EAAMuD,QAAQC,KAAK,WAErBc,QAAQ,YACRlK,MAAM,UACNwJ,UAAWE,YAAKtF,EAAQU,QACxBoD,MAAO,CAAE5H,WAAY,QAPvB,QAUE,yBAAK4H,MAAO,CAAEyZ,SAAU,UACxB,kBAAC+e,EAAA,EAAD,OAEA,MAQR,OAJAR,EAAU92B,KAAK+2B,GACfD,EAAU92B,KAAK,8BAAO,CAACg3B,EAAOE,EAASC,KACvCL,EAAU92B,KAAKo3B,GAGb,yBAAKh3B,UAAWpF,EAAQ+J,cACtB,kBAACqwB,EAAA,EAAD,CAAM3H,WAAS,EAACoI,UAAU,MAAM5+B,QAAS,EAAG6+B,QAAQ,UAClD,kBAACP,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQm7B,cACxB,kBAACvM,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQlH,OAAQgN,QAAQ,MAA/C,kBAGA,kBAACy0B,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQk7B,UAAW31B,UAAW,GAC7CxN,EAAM6M,QAAU,EACf,kBAACgqB,EAAA,EAAD,wIAEAkN,MC1NC,SAASS,EAAiB/6B,GAAQ,IAAD,EAC9C,UAAAA,EAAMuB,aAAN,SAAaqvB,UAIbuJ,YAAehE,IAAe,CAAE10B,MAAO,eAEvC,IAAM2U,EAA6B,CACjC,CACEjX,QAAS,WACPa,EAAMuD,QAAQC,KAAK,oBAErB/B,MAAO,kBACP03B,SAAS,IAIb,OAAO,kBAACT,EAAD,CAAoBtiB,QAASA,EAAS7U,MAAOvB,EAAMuB,Q,aClB7C,SAASy5B,EAAeh7B,GAGrC,OAFAm6B,YAAehE,IAAe,CAAE10B,MAAO,oBAEhC,kBAACw5B,EAAA,EAAD,CAAqBx0B,KAAMzG,EAAMk7B,aAAc35B,MAAOvB,EAAMuB,MAAOi0B,gBAAc,I,qGCWpF17B,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJhD,QAASvC,EAAMS,QAAQ,IAEzB0gC,OAAQ,CACNv/B,MAAO,QACPyf,UAAW,OACX9e,QAAS,SAEX6+B,aAAc,CACZ7gC,OAAQ,OACRiC,QAAS,cACTZ,MAAO,MACPW,QAASvC,EAAMS,QAAQ,IAEzB4gC,kBAAmB,CACjB9gC,OAAQ,OACRiC,QAAS,mBAIE,SAAS8+B,EAAoBt7B,GAC1CA,EAAMuB,MAAMqvB,UACZ,IAAMpyB,EAAU1E,IAEhBqgC,YAAehE,IAAe,CAAE10B,MAAO,yBAEvC,IANiD,EAOTpD,oBAAS,GAPA,mBAO1CjG,EAP0C,KAO5BmjC,EAP4B,OAQLl9B,oBAAS,GARJ,mBAQ1ChG,EAR0C,KAQ1BmjC,EAR0B,OASHn9B,mBAAiB,SATd,mBAS1Co9B,EAT0C,KASzBC,EATyB,OAUbr9B,mBAASoQ,YAAkBqD,YAAQ,IAAInG,MAAS,KAVnC,mBAU1CxU,EAV0C,KAU9BwkC,EAV8B,KA4B3CvlB,EAA6B,CACjC,CACEjX,QAVoB,WACtB2nB,uBAAa8U,YAAwBH,EAAiBrkC,YAAiBD,GAAaiB,EAAcC,IAAiByN,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,OAUxJtE,MAAO,uBACPrH,MAAO,OACP++B,SAAS,GAEX,CACEh6B,QAZkB,WACpB2nB,uBAAa5uB,YAA4BujC,EAAiBrkC,YAAiBD,GAAaiB,EAAcC,IAAiByN,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,OAY5JtE,MAAO,qBACPrH,MAAO,OACP++B,SAAS,IAIb,OACE,yBAAKv1B,UAAU,OACb,yBAAKA,UAAWpF,EAAQe,MACtB,kBAACw5B,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQ48B,cACxB,kBAACvZ,EAAA,EAAD,CAAaC,WAAY3qB,EAAY4qB,SA/BtB,SAACpe,GACtBg4B,EAAch4B,MAgCR,kBAACk4B,EAAA,EAAD,CAAaj4B,UAAWpF,EAAQ28B,QAC9B,kBAACW,EAAA,EAAD,CAAYC,QAAM,EAACC,QAAQ,6BAA3B,WAGA,kBAACC,EAAA,EAAD,CAAQt4B,MAAO83B,EAAiB1Z,SAzCpB,SAACG,GACrBwZ,EAAmBxZ,EAAME,OAAOze,QAwCiCiU,MAAO,kBAACskB,EAAA,EAAD,CAAO5wB,KAAK,UAAUzT,GAAG,8BAAgCskC,cAAY,EAAC7wB,KAAK,WA/CnI,CAAC,QAAS,MAAO,SAAU,OAAQ,QAgD9B9T,KAAI,SAACW,GACd,OACE,kBAACy0B,EAAA,EAAD,CAAU/tB,IAAK1G,EAASwL,MAAOxL,GAC7B,4BAAKA,SAOf,kBAACikC,EAAA,EAAD,CACEJ,QAAQ,6BACRp4B,UAAWpF,EAAQ68B,kBACnB3e,MAAM,gBACN2f,QACE,kBAAClQ,EAAA,EAAD,CACEC,QAASh0B,EACT2pB,SAAU,SAAC3iB,GACTm8B,GAAgB,SAACnjC,GAAD,OAAmBA,MAErCuL,MAAM,eACNvJ,MAAM,cAIZ,kBAACgiC,EAAA,EAAD,CACEJ,QAAQ,+BACRp4B,UAAWpF,EAAQ68B,kBACnB3e,MAAM,mBACN2f,QACE,kBAAClQ,EAAA,EAAD,CACEC,QAAS/zB,EACT0pB,SAAU,SAAC3iB,GACTo8B,GAAkB,SAACnjC,GAAD,OAAqBA,MAEzCsL,MAAM,iBACNvJ,MAAM,eAKd,6BACA,kBAACs+B,EAAD,CAAoBtiB,QAASA,EAAS7U,MAAOvB,EAAMuB,U,wEClIrDzH,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCunB,UAAW,CACThnB,OAAQ,OACRqB,MAAO,YAII,SAAS0gC,GAAqBt8B,GAAQ,IAAD,EAClB3B,mBAAS,IADS,mBAC3CmH,EAD2C,KACjCw0B,EADiC,KAG5Cx7B,EAAU1E,KAEVyiC,EAAY,WAChBvC,EAAY,KAGRwC,EAAc,WAClBD,IACAv8B,EAAMw8B,eAGFC,EAAe,WACnBz8B,EAAM08B,oBAAoBl3B,GAC1B+2B,IACAC,KASF,OACE,kBAAChmB,GAAA,EAAD,CAAQlY,KAAM0B,EAAM1B,KAAM+F,QAASm4B,EAAalP,kBAAgB,oBAAoB7oB,aAAW,EAAC2iB,UAAU,GACxG,kBAACzQ,GAAA,EAAD,uBACA,kBAACC,GAAA,EAAD,KACE,kBAACE,GAAA,EAAD,mDACA,kBAAC6T,EAAA,EAAD,CACE9yB,GAAI,iBACJ6kB,MAAO,WACPpR,KAAM,WACNyW,SAAU,SAACG,GACT8X,EAAY9X,EAAME,OAAOze,QAE3B82B,WAlBS,SAACr7B,GACF,UAAVA,EAAEP,KACJ49B,KAiBI94B,MAAO6B,EACPvJ,KAAM,OACN2H,UAAWpF,EAAQ+iB,UACnBhnB,OAAO,QACP+J,QAAQ,WACR6R,WAAS,KAIb,kBAACY,GAAA,EAAD,KACE,kBAACf,EAAA,EAAD,CAAQ7W,QAASq9B,EAAapiC,MAAM,aAApC,UAGA,kBAAC4b,EAAA,EAAD,CAAQ7W,QAASs9B,EAAcriC,MAAM,WAArC,Y,kCClDFN,GAAYC,aAAW,SAACC,GAAD,YAAY,CACvCyH,MAAO,CACLk7B,WAAY,kCACZviC,MAAOJ,EAAMc,QAAQC,QAAQC,MAE/B4c,MAAO,CACLhc,MAAO,OACPmgB,SAAU,QACVqL,SAAUwV,QACVriC,OAAQ,QAEV4B,OAAK,GACHI,QAASvC,EAAMS,QAAQ,GACvBF,OAAQ,QAFL,cAGFP,EAAM0B,YAAYG,GAAG,MAAQ,CAC5B49B,UAAWz/B,EAAMS,QAAQ,GACzB2sB,SAAUwV,UALT,cAOF5iC,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BkI,SAAU,WACVgc,IAAK,OACLgd,KAAM,EACNjhC,MAAO,OACPzB,OAAQ,oBACRqB,OAAQ,KACRkmB,UAAW,eAdV,yBAgBO,UAhBP,GAkBLob,UAAU,eACP9iC,EAAM0B,YAAYC,KAAK,MAAQ,CAC9BkI,SAAU,WACVjI,MAAO,OACPzB,OAAQ,MACRunB,UAAW,aACX7B,IAAK,eAAiB7lB,EAAMS,QAAQ,GAAK,MACzCoiC,KAAM,EACNtiC,OAAQ,SAGZwiC,KAAK,aACHxgC,QAASvC,EAAMS,QAAQ,GACvBF,OAAQP,EAAMS,QAAQ,GACtByC,WAAYlD,EAAMS,QAAQ,IACzBT,EAAM0B,YAAYC,KAAK,MAAQ,CAC9B+f,UAAW,oBACX7gB,gBAAiB,kBACjB29B,aAAcx+B,EAAMS,QAAQ,KAGhCuiC,KAAM,CACJzgC,QAASvC,EAAMS,QAAQ,IAEzByE,OAAQ,CACNu6B,UAAWz/B,EAAMS,QAAQ,GACzBshB,SAAU,QACV3hB,MAAO,QACPG,OAAQ,OACRqB,MAAO,OACP48B,aAAc,EACdj8B,QAASvC,EAAMS,QAAQ,GACvB2sB,SAAUwV,SAEZK,eAAgB,CACdziC,YAAa,IACbE,WAAY,OACZ8B,QAAS,QACTi9B,UAAWz/B,EAAMS,QAAQ,IAE3BiL,WAAY,CACVioB,MAAO,OACPpzB,OAAQ,KAEV2iC,aAAc,CACZ/gB,SAAU,QAEZghB,cAAe,CACbvhC,MAAO,OACPwrB,SAAUwV,QACVriC,OAAQ,QAEV6iC,OAAQ,CACNxhC,MAAO,OACPzB,OAAQH,EAAMS,QAAQ,QAIX,SAAS4iC,GAAMr9B,GAAQ,IAAD,EACD3B,oBAAS,GADR,mBAC5B43B,EAD4B,KACjBqH,EADiB,OAEHj/B,mBAAS,IAFN,mBAE5BmH,EAF4B,KAElBw0B,EAFkB,OAGH37B,mBAAS,IAHN,mBAG5BoH,EAH4B,KAGlB83B,EAHkB,OAICl/B,oBAAS,GAJV,mBAI5Bm/B,EAJ4B,KAIhBC,EAJgB,OAKCp/B,oBAAS,GALV,mBAK5BqH,EAL4B,KAKhBg4B,EALgB,KAO7B1jC,EAAQoG,cACR5B,EAAU1E,GAAUE,GACpB2jC,EAASr9B,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAEpE45B,YAAehE,IAAe,CAAE10B,MAAO,eAEvC,IAIMg7B,EAAe,SAACva,GACf,OAALA,QAAK,IAALA,KAAOjE,iBAJAzY,EAASpC,OAAS,GAAKqC,EAASrC,OAAS,GAWhDk6B,GAAa,GAEbxW,uBAAavhB,YAAaC,EAASo4B,OAAQn4B,EAAUC,IAClD7O,MAAK,SAAC4P,GACL,IAAIvI,EAAW8B,EAAM9B,SAASgD,MAAQlB,EAAM9B,SAASgD,MAAMo2B,KAAKr4B,SAAW,KACvE86B,EAAQ/5B,EAAM9B,SAASgD,MAAQlB,EAAM9B,SAASgD,MAAMo2B,KAAK7zB,OAAS,KACtE65B,GAAa,GACbt9B,EAAM69B,sBAAqB,GAAM,OAAC3/B,QAAD,IAACA,IAAY,KAAb,OAAoB67B,QAApB,IAAoBA,IAAS,IAAKtzB,EAAMf,MAE1EI,OAAM,SAACC,GACNu3B,GAAa,GACb7W,YAAWzmB,EAAMuB,MAAOwE,OAf1B0gB,YAAWzmB,EAAMuB,MAAO,wCAmC5B,OACE,kBAACw3B,EAAA,EAAD,CAAOn1B,UAAWpF,EAAQrC,MAAO4H,UAAW,EAAG+5B,OAAQH,GACrD,kBAACvQ,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQiD,MAAO6C,QAAQ,MAA9C,QAGCq5B,EAAS,yBAAKI,IAAI,aAAaC,IAAK,cAAepiC,MAAM,MAAMgI,UAAWpF,EAAQw+B,OAAW,KAE5F,kBAAC5P,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQiD,MAAO6C,QAAQ,MAC3C3K,KAAUskC,YAGf,yBAAKr6B,UAAWpF,EAAQs+B,WACtB,kBAACoB,GAAA,EAAD,CAAWnoB,SAAU0mB,EAAc74B,UAAWpF,EAAQu+B,MACpD,kBAACpS,EAAA,EAAD,CAAWxU,WAAS,EAAC7R,QAAQ,WAAWrI,KAAK,OAAO0H,MAAO6B,EAAUuc,SAAU,SAAC3iB,GAAD,OAAO46B,EAAY56B,EAAEgjB,OAAOze,QAAQC,UAAWpF,EAAQoZ,MAAO8E,MAAM,aACnJ,yBAAK9Y,UAAWpF,EAAQ4+B,SACxB,kBAACzS,EAAA,EAAD,CACErmB,QAAQ,WACRrI,KAAK,WACL0H,MAAO8B,EACPsc,SAAU,SAAC3iB,GAAD,OAAOm+B,EAAYn+B,EAAEgjB,OAAOze,QACtC82B,WA1BO,SAACr7B,GACF,UAAVA,EAAEP,KACJ49B,KAyBM74B,UAAWpF,EAAQoZ,MACnB8E,MAAM,aAER,yBAAK9Y,UAAWpF,EAAQ2+B,eACtB,kBAACf,EAAA,EAAD,CACEC,QACE,kBAAClQ,EAAA,EAAD,CACEC,QAAS1mB,EACTqc,SAAU,SAAC3iB,GACTs+B,EAAct+B,EAAEgjB,OAAOgK,UAEzBzoB,MAAM,aACNvJ,MAAM,UACN6kB,KAAK,QACLzgB,QAAS,CAAEe,KAAMf,EAAQ0+B,gBAG7BxgB,MAAM,cACNyhB,eAAe,QACfv6B,UAAWpF,EAAQkH,WACnBlH,QAAS,CAAEke,MAAO,2BAEpB,kBAAC0hB,GAAA,EAAD,CAAYj/B,QAAS,kBAAMs+B,GAAc,IAAO75B,UAAWpF,EAAQy+B,gBACjE,kBAAC7P,EAAA,EAAD,CAAY9oB,QAAQ,WAApB,uBAGJ,kBAAC0xB,GAAA,EAAD,CAAc/5B,KAAK,SAASg6B,UAAWA,EAAW92B,QAASs9B,EAAch9B,KAAK,QAAQy2B,YAAY,gBAAgBtyB,UAAWpF,EAAQU,WAGxIs+B,EAAa,kBAAClB,GAAD,CAAsBh+B,KAAMk/B,EAAYhB,YAAa,kBAAMiB,GAAc,IAAQ7R,WAAY5rB,EAAO08B,oBAlE1F,SAACl3B,GAC3BshB,uBACEte,YAAkBhD,GACf3O,MAAK,SAACC,GACL4+B,YAAa11B,EAAMuB,MAAO,0CAA4CiE,MAEvEM,OAAM,SAACC,GAAD,OAAS0gB,YAAWzmB,EAAMuB,MAAOwE,UA4DuH,M,mKC1MjKjM,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCqkC,QAAS,CACP7hC,QAAS,YACTN,WAAY,QAEdoiC,KAAM,CACJtiB,SAAU,UACVyd,UAAWz/B,EAAMS,QAAQ,IAE3Bm9B,YAAa,CACX/zB,SAAU,WACViX,cAAe,GAEjByjB,YAAa,CACX7hC,YAAa1C,EAAMS,QAAQ,GAC3BwgB,aAAcjhB,EAAMS,QAAQ,IAE9BkE,QAAS,CACP86B,UAAWz/B,EAAMS,QAAQ,IAE3B+jC,QAAS,CACP36B,SAAU,WACVjI,MAAO5B,EAAMS,QAAQ,GACrBN,OAAQH,EAAMS,QAAQ,GACtB8B,QAASvC,EAAMS,QAAQ,GACvBg/B,WAAYz/B,EAAMS,QAAQ,GAC1B+B,QAAS,OACTpC,MAAO,QACPa,WAAYjB,EAAMkB,YAAYC,OAAO,CAAC,SAAU,CAC9CC,OAAQpB,EAAMkB,YAAYE,OAAOqjC,UACjCnjC,SAAUtB,EAAMkB,YAAYI,SAASojC,YAGzCl/B,KAAM,CACJm/B,WAAY3kC,EAAMS,QAAQ,GAC1B0hB,SAAUniB,EAAMS,QAAQ,GACxBF,OAAQ,OACRH,MAAO,SAETwkC,YAAa,CACXhjC,MAAM,eAAD,OAAiB5B,EAAMS,QAAQ,GAA/B,QAEPgH,MAAO,CACL4Z,UAAW,QACXjhB,MAAOJ,EAAMc,QAAQ2E,KAAKjC,UAC1B2e,SAAUniB,EAAMS,QAAQ,MACxB2sB,SAAU,oBACV5sB,YAAa,EACbE,WAAY,QAEdiJ,MAAO,CACL0X,UAAW,QACXjhB,MAAOJ,EAAMc,QAAQ2E,KAAK1E,QAC1BohB,SAAUniB,EAAMS,QAAQ,OAE1BokC,iBAAkB,CAChBC,cAAe,OACf1kC,MAAOJ,EAAMc,QAAQ2E,KAAKjC,UAC1Bd,YAAa1C,EAAMS,QAAQ,GAC3BuhB,SAAU,SACVpe,WAAY,SACZZ,eAAgB,SAElB+hC,WAAY,CACV5iB,SAAU,QACV5hB,OAAQ,OACRC,YAAa,OAiBF,SAASwkC,GAAT,GAAqI,IAArHv9B,EAAoH,EAApHA,MAAOkC,EAA6G,EAA7GA,MAAOonB,EAAsG,EAAtGA,KAAM3wB,EAAgG,EAAhGA,MAAOuK,EAAyF,EAAzFA,SAAUs6B,EAA+E,EAA/EA,WAAYC,EAAmE,EAAnEA,WAAYC,EAAuD,EAAvDA,cAAuD,IAAxC3N,YAAwC,aAA1B4N,eAA0B,SAC3I5gC,EAAU1E,KAEhB,OACE,yBAAK8J,UAAWpF,EAAQ6/B,SACtB,kBAACgB,GAAA,EAAD,CAAM/8B,MAAO,CAAE9F,QAASg1B,EAAO,OAAS,IAAM5tB,UAAWpF,EAAQ8/B,KAAMgB,QAAM,GAC3E,kBAACC,GAAA,EAAD,CAAa37B,UAAWpF,EAAQo5B,aAC7B7M,EACC,kBAACsU,GAAA,EAAD,CAAMz7B,UAAWE,YAAKtF,EAAQggC,QAASY,EAAU5gC,EAAQogC,YAAc,IAAKt8B,MAAO,CAAEzH,gBAAiBT,GAASklC,QAAM,GAClHF,EAAU,kBAACI,GAAA,EAAD,CAAkB57B,UAAWpF,EAAQgB,OAAW,kBAACurB,EAAD,CAAMnnB,UAAWpF,EAAQgB,QAEpF,KACJ,kBAAC4tB,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQiD,MAAOg+B,cAAY,GAAlD,OACGh+B,QADH,IACGA,IAAS,QAEZ,kBAAC2rB,EAAA,EAAD,CAAYxpB,UAAWpF,EAAQmF,MAAO87B,cAAY,GAAlD,OACG97B,QADH,IACGA,IAAS,QAEXgB,EACAs6B,EAAa,kBAACS,GAAA,EAAD,CAAS97B,UAAWpF,EAAQG,UAAc,MAE1D,kBAACghC,GAAA,EAAD,CAAa/7B,UAAWpF,EAAQ+/B,aAC7BU,GAAcC,EACbC,EACE,kBAACnpB,EAAA,EAAD,CAAQ1T,MAAO,CAAE1G,MAAOsjC,EAAa,OAAS,IAAMt7B,UAAWpF,EAAQqgC,iBAAkB1/B,QAASggC,EAAelgB,KAAK,SACnHggB,EACAC,GAA4B,IAAfA,EAAsB,kBAACU,GAAA,EAAD,CAAQh8B,UAAWpF,EAAQugC,aAAiB,kBAACG,EAAD,CAAYt7B,UAAWpF,EAAQugC,aAAiB,MAGlI,kBAAC3R,EAAA,EAAD,KAAa6R,GAEb,Q,0CCpHRhpC,GAAgBC,KAAYC,WAgB3B,SAAS0pC,GAAaC,GAE3B,OAAO7pC,GAAc6B,IADX,cACoBgoC,GAAWjpC,MAAK,SAACC,GAAD,OAAcA,EAASC,Q,8KCTjEgpC,GAAaC,eACbC,GAAgBC,eAEhBpmC,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJrF,SAAU,EACVqC,QAASvC,EAAMS,QAAQ,IAEzB0lC,OAAQ,CACNvkB,UAAW,QAEbwkB,aAAc,CACZ5jC,QAAS,OACTZ,MAAO,OACPggB,UAAW5hB,EAAMS,QAAQ,GACzBkkC,WAAY3kC,EAAMS,QAAQ,GAC1B0hB,SAAUniB,EAAMS,QAAQ,GACxBI,gBAAiB,iBACjBqgB,oBAAqB,kBAEvBmlB,mBAAoB,CAClBjZ,SAAU,QACV7sB,OAAQ,QAEV+lC,iBAAkB,CAChBnmC,OAAQH,EAAMS,QAAQ,GAAK,gBAC3BmB,MAAO5B,EAAMS,QAAQ,GAAK,gBAC1B8B,QAASvC,EAAMS,QAAQ,IACvBF,OAAQ,QAEVgmC,uBAAwB,CACtB/H,aAAc,GAEhB7/B,KAAM,OAGO,SAAS6nC,GAAT,GAAkG,IAA3EC,EAA0E,EAA1EA,SAAUC,EAAgE,EAAhEA,YAAaC,EAAmD,EAAnDA,eAAgBxjB,EAAmC,EAAnCA,SAAUyjB,EAAyB,EAAzBA,OAAQC,EAAiB,EAAjBA,SACvFriC,EAAU1E,KAEVgnC,EAASC,KAH+F,EAKvF9zB,qBAAWkU,MAA3B7f,EALuG,sBAOtEjD,oBAAkB,GAPoD,mBAOvG2iC,EAPuG,KAOzFC,EAPyF,OAQ9E5iC,mBAAiB,IAR6D,mBAQvG6iC,EARuG,KAQ7FC,EAR6F,KA6BxGC,EAAoB,SAACnlC,GAAD,OAAkB0kC,EAAeU,aAAUD,kBAAkBV,EAAazkC,KAuB9FqlC,EAAc,SAACliC,GACnBA,EAAE6e,iBACF,IACMsjB,EADeb,EAAYc,oBACWC,aAAa,OAAQ,UAAW,CAAEjrC,IAAK0qC,IAC7EQ,EAAYH,EAAuBI,0BACnCC,EAAiBC,eAAYC,IAAIpB,EAAa,CAAEqB,eAAgBR,IACtEZ,EAAeU,aAAUW,WAAWJ,EAAgBA,EAAeK,eAAgBP,IACnFT,GAAgB,GAChBE,EAAY,KAiBd,OACE,qCACe,OAAZ7/B,QAAY,IAAZA,OAAA,EAAAA,EAAc4B,SAAS,UACtB,yBAAKU,UAAWpF,EAAQ4hC,cACtB,kBAAChV,GAAA,EAAD,CAAYjsB,QA9DL,kBAAMiiC,EAAkB,SA8DFx9B,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAC3E,kBAACijB,GAAA,EAAD,CAAYt+B,UAAWpF,EAAQ8hC,oBAEjC,kBAAClV,GAAA,EAAD,CAAYjsB,QA/DF,kBAAMiiC,EAAkB,SA+DFx9B,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAC9E,kBAACkjB,GAAA,EAAD,CAAcv+B,UAAWpF,EAAQ8hC,oBAEnC,kBAAClV,GAAA,EAAD,CAAYjsB,QAnEA,kBAAMiiC,EAAkB,cAmEFx9B,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAChF,kBAACmjB,GAAA,EAAD,CAAkBx+B,UAAWpF,EAAQ8hC,oBAEvC,kBAAClV,GAAA,EAAD,CAAYjsB,QApEL,kBAAMwhC,EAAeU,aAAUgB,WAAW3B,KAoEpB98B,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAC3E,kBAACqjB,GAAA,EAAD,CAAM1+B,UAAWpF,EAAQ8hC,oBAE3B,kBAAClV,GAAA,EAAD,CAAYjsB,QA9DE,SAACC,GAGrB,GAFAA,EAAE6e,kBACgByiB,EAAYuB,eACfM,cAAe,CAC5B,IAAMC,EAAe9B,EAAYc,oBAC3BiB,EAAW/B,EAAYuB,eAAeS,cACtCC,EAAcjC,EAAYuB,eAAeW,iBAEzCC,EAD2BL,EAAaM,eAAeL,GACpBM,YAAYJ,GAEjDnsC,EAAM,GACV,GAAIqsC,EAEFrsC,EADqBgsC,EAAaQ,UAAUH,GACzBI,UAAUzsC,IAG/ByqC,GAAgB,GAChBE,EAAY3qC,KA6C4BoN,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAClF,kBAACikB,GAAA,EAAD,CAAMt/B,UAAWpF,EAAQ8hC,oBAE3B,kBAAClV,GAAA,EAAD,CAAYjsB,QAjCD,SAACC,GAClBA,EAAE6e,iBACF,IAAMklB,EAAYzC,EAAYuB,eACzBkB,EAAUZ,eAAe5B,EAAeU,aAAUW,WAAWtB,EAAayC,EAAW,QA8BnDv/B,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAC/E,kBAACmkB,GAAA,EAAD,CAASx/B,UAAWpF,EAAQ8hC,oBAE9B,kBAAClV,GAAA,EAAD,CAAYjsB,QAASge,EAAUvZ,UAAWpF,EAAQ+hC,uBAAwBthB,KAAK,SAC7E,kBAACgO,GAAA,EAAD,CAAQrpB,UAAWpF,EAAQ8hC,oBAE5BM,EAAS,kBAACpB,GAAA,EAAD,CAAkBl9B,MAAO,CAAE+gC,WAAY,eAAiBz/B,UAAWE,YAAKtF,EAAQ8hC,oBAAwB,MAElH,KACJ,kBAACQ,EAAD,CACEnpB,IAAK8oB,EACLC,YAAaA,EACb3e,SAnCW,SAACoe,GAChBQ,EAAeR,IAmCXmD,iBAnGmB,SAACC,EAAS7C,GACjC,IAAM8C,EAAWnC,aAAUiC,iBAAiB5C,EAAa6C,GACzD,OAAIC,GACF7C,EAAe6C,GACR,WAEF,eA8FH3C,SAAUA,KAAY,OAACv/B,QAAD,IAACA,OAAD,EAACA,EAAc4B,SAAS,UAC9CugC,aAxFe,SAACrkC,GAGpB,OAFkB,IAAdA,EAAE22B,SAAe32B,EAAE6e,iBAEhBylB,gCAAqBtkC,IAsFxBukC,WAAY,CAACC,IACbC,QAAS,CAAC5D,GAAeF,MAE3B,kBAACvpB,GAAA,EAAD,CAAQlY,KAAM0iC,GACZ,kBAACrqB,GAAA,EAAD,kBACA,kBAACC,GAAA,EAAD,KACE,kBAAC+T,EAAA,EAAD,CAAWhnB,MAAOu9B,EAAUnf,SAAU,SAAC3iB,GAAD,OAAO+hC,EAAY/hC,EAAEgjB,OAAOze,QAAQ82B,WAjD3D,SAACr7B,GACN,KAAZA,EAAE0kC,OAAcxC,EAAYliC,OAkD5B,kBAAC2X,GAAA,EAAD,KACE,kBAACf,EAAA,EAAD,CAAQ7W,QAAS,kBAAM8hC,GAAgB,IAAQ7mC,MAAM,WAArD,SAGA,kBAAC4b,EAAA,EAAD,CAAQ7W,QAASmiC,EAAalnC,MAAM,WAApC,WAgBH,IAUMwpC,GAAY,IAAIG,sBAAmB,CAC9C,CACEC,SAnBG,SAA0BC,EAAcC,EAAU1B,GACvDyB,EAAaE,kBAAiB,SAACC,GAC7B,IAAM1C,EAAY0C,EAAUpB,YAC5B,OAAqB,OAAdtB,GAAsE,SAAhDc,EAAaQ,UAAUtB,GAAW2C,YAC9DH,IAgBD7W,UAbqB,SAACrtB,GAAW,IAC3BxJ,EAAQwJ,EAAMwiC,aAAaQ,UAAUhjC,EAAM0hC,WAAWuB,UAAtDzsC,IACFgI,EAAU1E,KAChB,OACE,uBAAGX,KAAM3C,EAAK4rB,OAAQ,SAAUkiB,IAAI,sBAAsB1gC,UAAWpF,EAAQ7F,MAC1EqH,EAAM2E,c,oBCxKP7K,GAAYC,aAAW,SAACC,GAAD,MAAY,CACvCuF,KAAM,CACJrF,SAAU,EACVqC,QAASvC,EAAMS,QAAQ,IAEzB0lC,OAAQ,CACNvkB,UAAW,QAEbwkB,aAAc,CACZ5jC,QAAS,OACTZ,MAAO,OACPggB,UAAW5hB,EAAMS,QAAQ,GACzBkkC,WAAY3kC,EAAMS,QAAQ,GAC1B0hB,SAAUniB,EAAMS,QAAQ,GACxBI,gBAAiB,iBACjBqgB,oBAAqB,kBAEvBmlB,mBAAoB,CAClB9lC,OAAQ,QAEV+lC,iBAAkB,CAChBnmC,OAAQH,EAAMS,QAAQ,GAAK,gBAC3BmB,MAAO5B,EAAMS,QAAQ,GAAK,gBAC1B8B,QAASvC,EAAMS,QAAQ,IACvBF,OAAQ,QAEVgmC,uBAAwB,CACtB/H,aAAc,GAEhB+L,mBAAoB,CAClBhqC,OAAQ,OACRqB,MAAO,OACPynC,WAAY,cAEdmB,eAAgB,CACdhoC,QAAS,OACT0e,oBAAqB,gBACrB3e,QAASvC,EAAMS,QAAQ,IAEzBgqC,wBAAyB,CACvBpB,WAAY,aACZ9oC,OAAQP,EAAMS,QAAQ,GAAK,eAIhB,SAASiqC,GAAU1kC,GAAQ,IAAD,oBACjCxB,EAAU1E,KACVE,EAAQoG,cACRmD,EAAU+qB,cACV/sB,EAAQC,eACRsU,EAAU9I,eALuB,EAMhBC,qBAAWkU,MAA3B7f,EANgC,oBAOvC64B,YAAehE,IAAe,CAAE10B,MAAO,cAEvC,IAAMg/B,EAAWrpB,iBAAO,MATe,EAWb/Y,qBAXa,mBAWhCsmC,EAXgC,KAWzBC,EAXyB,OAYPvmC,qBAZO,mBAYhCwmC,EAZgC,KAYtBC,EAZsB,OAaLzmC,qBAbK,mBAahCqQ,EAbgC,KAarBq2B,EAbqB,OAeYvtB,aAAyB,IAfrC,mBAehCwtB,EAfgC,KAepBC,EAfoB,KAeLC,EAfK,OAgBO7mC,mBAAiB,GAhBxB,mBAgBhC8mC,EAhBgC,KAgBfC,GAhBe,QAiBe5tB,aAAyBqqB,eAAYwD,eAjBpD,qBAiBhC3E,GAjBgC,MAiBnB4E,GAjBmB,MAiBHC,GAjBG,SAkBXlnC,oBAAkB,GAlBP,qBAkBhCuiC,GAlBgC,MAkBxB4E,GAlBwB,SAmBDnnC,oBAAkB,GAnBjB,qBAmBhConC,GAnBgC,MAmBnBC,GAnBmB,SAoBHrnC,mBAAeoQ,YAAkBqD,YAAQ,IAAInG,MAAoB,OAAZrK,QAAY,IAAZA,OAAA,EAAAA,EAAc2B,SAAS,4BAA6B,UAAW,EAAI,KApBrH,qBAoBhC9L,GApBgC,MAoBpBwkC,GApBoB,MAsBvC54B,qBAAU,WAAO,IAAD,IACVoC,EAASE,cAKb,OAJI/D,IAAgB,iBAACA,QAAD,IAACA,GAAD,UAACA,EAAc6B,mBAAf,aAAC,EAA2BC,cAA5B,QAAsC,GAAK,GAC7DghB,aAAqC9iB,EAAazJ,GAAIsN,EAAO5O,OAC1DM,MAAK,SAAC8uC,GAAD,OAASf,EAASe,MACvB7/B,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,MAC/B,kBAAMZ,EAAOC,YACnB,CAAC9D,EAAcC,IAElBwB,qBAAU,WACR,IAAIoC,EAASE,cAmBb,OAlBI/D,GFhGD,WAAiH,IAA1FskC,EAAyF,uDAA1E,EAAGC,EAAuE,wDAA3CtvC,EAA2C,uCACjHC,EAAM,cAENC,EAAc,GAMlB,YALcC,IAAVH,IACFE,EAAOE,YAAcJ,EACrBE,EAAOS,OAAS,CAAE0uC,OAAMC,cAGnB5vC,GAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QEwF9D+uC,CApBkB,EAoBL,OAAgBxkC,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAc4B,SAAS,SAAUiC,EAAO5O,OAClEM,MAAK,SAACwU,GACL06B,oCAAwB,WAEtB,GADAd,EAAa,OAAC55B,QAAD,IAACA,IAAK,IACfA,EAAEjI,OAAS,EAAG,CAChB,IAAIo/B,EACJ,IAAK,IAAD,IACFA,EAAewD,0BAAehyB,KAAKpI,MAAL,iBAAWP,QAAX,IAAWA,GAAX,UAAWA,EAAIA,EAAEjI,OAAS,UAA1B,aAAW,EAAmB4C,eAA9B,QAAyC,KACvE,SACAw8B,EAAe,KAEjB8C,GAAe9C,EAAeX,eAAYoE,kBAAkBzD,GAAgBX,eAAYwD,eACxFD,GAAmB/5B,EAAEjI,OAAS,UAInC0C,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,MAC/B,kBAAMZ,EAAOC,YACnB,CAACkgC,GAAgBhkC,EAAc2jC,EAAe1jC,IAEjDwB,qBAAU,WACR,IAAIoC,EAASE,cACb,GAAI/D,EAAc,CAChB,IAAKA,EAAa2B,SAAS,mBAAoB,QAC7B,IAAIgJ,KAAU3K,EAAcnK,IAEzC+uC,gBAAgB/gC,EAAO5O,OACvBM,MAAK,SAACmV,GAAD,OAAQ+4B,EAAa/4B,MAC1BlG,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,MAGtC,IAAKzE,EAAa2B,SAAS,kBAAmB,QAC/B,IAAIyI,KAAcpK,EAAcnK,IAE1CgvC,oBAAoBhhC,EAAO5O,OAC3BM,MAAK,SAACqV,GAAD,OAAO44B,EAAY54B,MACxBpG,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,MAGxC,OAAO,kBAAMZ,EAAOC,YACnB,CAACkgC,GAAgBhkC,EAAc2jC,EAAe1jC,EAAOpK,KAExD4L,qBAAU,WACR,IAAIqjC,EAAQ33B,YAAkBqD,YAAQ,IAAInG,MAAoB,OAAZrK,QAAY,IAAZA,OAAA,EAAAA,EAAc2B,SAAS,4BAA6B,UAAW,EAAI,IACjH9L,GAAW4X,YAAcq3B,EAAMr3B,WAAW4sB,GAAcyK,KAC3D,CAAC9kC,EAAcnK,KA8GlB,OACE,yBAAKyM,UAAWpF,EAAQe,MACtB,kBAACq5B,EAAA,EAAD,CAAM3H,WAAS,EAACx2B,QAAS,GACvB,kBAACm+B,EAAA,EAAD,CAAM56B,MAAI,EAACqoC,GAAI,GAAIC,GAAI,GACrB,kBAACvN,EAAA,EAAD,CAAO+E,QAAM,EAACl6B,UAAWpF,EAAQ6hC,mBAAoBt8B,UAAW,GAC9D,kBAACg1B,EAAA,EAAD,CAAO+E,QAAM,EAACl6B,UAAWpF,EAAQgmC,iBAClB,OAAZljC,QAAY,IAAZA,OAAA,EAAAA,EAAc4B,SAAS,UACtB,kBAACynB,EAAA,EAAD,CACE9rB,IAAG,iBAAEmmC,QAAF,IAAEA,GAAF,UAAEA,EAAaG,UAAf,aAAE,EAA+B1jC,aAAjC,QAA0C,GAC7Cwd,KAAK,QACLrb,UAAWpF,EAAQimC,wBACnB/nB,MAAM,QACNmO,aAAY,iBAAEma,QAAF,IAAEA,GAAF,UAAEA,EAAaG,UAAf,aAAE,EAA+B1jC,aAAjC,QAA0C,GACtDmpB,OA5Ca,SAACxrB,GAC5B,IAAImnC,EAAWvB,EACXl0B,EAAQ5C,qBAAU82B,GAClBlF,EAAYhvB,EAAMq0B,GACtB,GAAKrF,EAGEA,EAAUr+B,MAAQrC,EAAEgjB,OAAOze,UAHlB,CACd,IAAM6iC,EAAe,CAAE/kC,MAAOrC,EAAEgjB,OAAOze,MAAOqC,QAASgO,KAAKC,UAAUwyB,wBAAalB,GAAeluB,QAAQmqB,uBAC1G1wB,EAAMpE,OAAOy4B,EAAiB,EAAGqB,GAEnCvB,EAAcn0B,GAEdyV,YAAW,WAAO,IAAD,OACX,UAAAzV,EAAMq0B,UAAN,eAAwB1jC,UAAxB,UAAkCyjC,EAAc7tB,eAAhD,iBAAkC,EAAwB8tB,UAA1D,aAAkC,EAA0C1jC,QAC9Eo+B,GAAa/uB,EAAMq0B,IAChBtuC,MAAK,SAACwU,GACL,IAAIyF,EAAQ5C,qBAAU82B,GAClBx4B,EAAQsE,EAAMxE,WAAU,SAACo6B,GAAD,OAAWA,EAAM7uC,KAAOwT,EAAExT,MAClD2U,GAAS,EAAGsE,EAAMpE,OAAOF,EAAO,EAAGnB,GAClCyF,EAAMtN,KAAK6H,GAChB45B,EAAcn0B,GACd40B,IAAe,MAEhB5/B,OAAM,SAACC,GACNk/B,EAAcsB,GACdb,IAAe,GACfjf,YAAWllB,EAAOwE,QAEvB,KAEH2/B,IAAe,IAiBDrmB,WAAS,EACTtX,SAAU64B,KAGZ,kBAACxT,EAAA,EAAD,CAAY9oB,QAAQ,KAAKV,UAAWpF,EAAQ+lC,oBAA5C,iBACGS,QADH,IACGA,GADH,UACGA,EAAaG,UADhB,aACG,EAA+B1jC,aADlC,QAC2C,SAI/C,kBAAC++B,GAAD,CACEC,SAAUA,EACVC,YAAaA,GACbC,eArFW,SAACgG,GAClBA,EAAUC,qBAAuBD,EAAUnF,sBAAwB+D,GAAeluB,QAAQmqB,sBAC5Fjb,YAAW,WAET,GAAIogB,EAAUnF,sBAAwB+D,GAAeluB,QAAQmqB,oBAAqB,CAAC,IAAD,IAC5E1B,EAAS,iBAAGoF,QAAH,IAAGA,GAAH,UAAGA,EAAe7tB,eAAlB,aAAG,EAAyB8tB,UAA5B,QAAgD,GAC7DrF,EAAU95B,QAAUgO,KAAKC,UAAUwyB,wBAAaE,EAAUnF,sBAC1D3B,GAAaC,GACVjpC,MAAK,SAACwU,GACL,IAAIyF,EAAQ5C,qBAAU82B,GAClBx4B,EAAQsE,EAAMxE,WAAU,SAACo6B,GAAD,OAAWA,EAAM7uC,KAAOwT,EAAExT,MAClD2U,GAAS,EAAGsE,EAAMpE,OAAOF,EAAO,EAAGnB,GAClCyF,EAAMtN,KAAK6H,GAChB45B,EAAcn0B,GACd00B,IAAU,MAEX1/B,OAAM,SAACC,GACNy/B,IAAU,GACV/e,YAAWllB,EAAOwE,SAGvB,KAEHy/B,IAAU,IAEZF,GAAeqB,IA6DLxpB,SAnHK,WACfrH,EAAQ,mDAAmDjf,MAAK,WAAO,IAAD,IACpE2uC,IAAU,KAEV,UAAIR,EAAWG,UAAf,aAAI,EAA6BttC,IFvJhC,SAAyBA,GAC9B,IAAIrB,EAAM,eAAiBqB,EAC3B,OAAO5B,GAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,QEsJ7C8vC,CAAe,UAAC7B,EAAWG,UAAZ,aAAC,EAA6BttC,IAAIiO,OAAM,SAACC,GAChEy/B,IAAU,GACV/e,YAAW1gB,EAAKxE,MAEL2E,QAAQgL,WAEfra,MAAK,WACXkvC,oCAAwB,WAAO,IAAD,IACxBj1B,EAAQ5C,qBAAU82B,GACtBl0B,EAAMpE,OAAOy4B,EAAiB,GAC9BF,EAAcn0B,GAEd,IAAIg2B,EAAqBh2B,EAAM1N,OAAS+hC,EAAkBA,EAAkBA,GAAmB,EAAIA,EAAkB,EAAI,EAErHr0B,EAAM1N,OAAS,EAAGkiC,GAAezD,eAAYoE,kBAAkBD,0BAAehyB,KAAKpI,MAAL,iBAAWkF,QAAX,IAAWA,GAAX,UAAWA,EAAQg2B,UAAnB,aAAW,EAA6B9gC,eAAxC,QAAmD,OAChIs/B,GAAezD,eAAYwD,eAEhCD,GAAmB0B,GACnBtB,IAAU,aA6FN5E,OAAQA,IAAU6E,GAClB5E,SAAU4E,KAEZ,kBAACsB,GAAA,EAAD,CACEC,MAAOhC,EAAW5hC,OAClBS,SAAS,SACTS,QAAQ,OACR2iC,WAAY9B,EACZ+B,WACE,kBAAClxB,EAAA,EAAD,CAAQiJ,KAAK,QAAQ9f,QAjJhB,WACjB4mC,oCAAwB,WACtB,GAAIZ,EAAkB,EAAIH,EAAW5hC,OAAQ,CAAC,IAAD,IACvCo/B,EAAewD,0BAAehyB,KAAKpI,MAAL,iBAAWo5B,QAAX,IAAWA,GAAX,UAAWA,EAAaG,EAAkB,UAA1C,aAAW,EAAmCn/B,eAA9C,QAAyD,KAC3Fs/B,GAAezD,eAAYoE,kBAAkBzD,SAE7C8C,GAAezD,eAAYwD,eAE7BD,IAAmB,SAAC9sB,GAAD,OAAOA,EAAI,SAyIsBvQ,SAAU64B,IAAUuE,IAAoBH,EAAW5hC,SAAsB,OAAZ9B,QAAY,IAAZA,OAAA,EAAAA,EAAc4B,SAAS,UAAW,GAAK,IAA9I,OAEE,kBAACikC,GAAA,EAAD,OAGJC,WACE,kBAACpxB,EAAA,EAAD,CAAQiJ,KAAK,QAAQ9f,QA3IhB,WACjB4mC,oCAAwB,WAAO,IAAD,IACxBvD,EAAewD,0BAAehyB,KAAKpI,MAAL,iBAAWo5B,QAAX,IAAWA,GAAX,UAAWA,EAAaG,EAAkB,UAA1C,aAAW,EAAmCn/B,eAA9C,QAAyD,KAC3Fs/B,GAAezD,eAAYoE,kBAAkBzD,IAC7C4C,IAAmB,SAAC9sB,GAAD,OAAOA,EAAI,SAuIsBvQ,SAAU64B,IAA8B,IAApBuE,GAC5D,kBAACkC,GAAA,EAAD,MADF,YAQR,kBAACzO,EAAA,EAAD,CAAM56B,MAAI,EAACqoC,GAAI,GAAIC,GAAI,GACrB,kBAAC/U,GAAA,EAAD,CAAW9vB,MAAK,kBAAarK,YAAiBD,GAAY,UAAYsD,QAAS,GAC5E6G,KAAgB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAc2B,SAAS,mBAAoB,SAC3D,kBAAC21B,EAAA,EAAD,CAAM56B,MAAI,EAACqoC,GAAI,GAAIiB,GAAI,GACrB,kBAACtI,GAAD,CACEv9B,MAAO,QACPkC,MAAK,iBAAE+K,QAAF,IAAEA,OAAF,EAAEA,EAAW64B,uBAAb,QAAgC,EACrCxc,KAAMyc,KACNptC,MAAOJ,EAAMc,QAAQC,QAAQC,KAC7BikC,WAAW,mBACXE,cAAe,kBAAM57B,EAAQC,KAAK,eAClC07B,YAAU,EACVE,SAAU1wB,KAGZ,KACHpN,KAAgB,OAACA,QAAD,IAACA,OAAD,EAACA,EAAc2B,SAAS,kBAAmB,SAC1D,kBAAC21B,EAAA,EAAD,CAAM56B,MAAI,EAACqoC,GAAI,GAAIiB,GAAI,GACrB,kBAACtI,GAAD,CACEv9B,MAAO,WACPkC,MAAO4V,YAAc,iBAACsrB,QAAD,IAACA,OAAD,EAACA,EAAU4C,0BAAX,QAAiC,GACtD1c,KAAM2c,KACNttC,MAAO49B,KAAM,KACbiH,WAAW,iBACXE,cAAe,kBAAM57B,EAAQC,KAAK,cAClC07B,YAAU,EACVE,SAAUyF,KAGZ,MACH,iBAACvjC,QAAD,IAACA,GAAD,UAACA,EAAc6B,mBAAf,aAAC,EAA2BC,cAA5B,QAAsC,GAAK,EAC1C,kBAACw1B,EAAA,EAAD,CAAM56B,MAAI,EAACqoC,GAAI,GAAIiB,GAAI,GACrB,kBAACtI,GAAD,CACEv9B,MAAO,0BACPkC,MAAK,OAAEghC,QAAF,IAAEA,OAAF,EAAEA,EAAO31B,QAAO,SAACC,EAAK02B,GAAN,OAAc12B,EAAM02B,EAAIgC,YAAY1nC,QAAO,SAACmL,GAAD,OAAOA,EAAE/U,UAAF,OAAaiL,QAAb,IAAaA,OAAb,EAAaA,EAAczJ,OAAIuL,SAAQ,GAC9G2nB,KAAM6c,KACNxtC,MAAO69B,KAAI,KACXgH,WAAW,8BACXE,cAAe,kBAAM57B,EAAQC,KAAK,iBAClC07B,YAAU,EACVE,SAAUuF,KAGZ,SCpVhB,IAAMkD,GAAQ,CAAC,SACTC,GAAa,CAAC,aAAc,YAAa,SACzCC,GAAU,CAAC,UAAW,aAAc,YAAa,SAEjDC,GAAsBC,gBAAK,kBAAM,8EACjCC,GAAeD,gBAAK,kBAAM,mCAE1BE,GAAsBF,gBAAK,kBAAM,mCACjCG,GAAgBH,gBAAK,kBAAM,8EAC3BI,GAAwBJ,gBAAK,kBAAM,8EAEnCK,GAAoBL,gBAAK,kBAAM,uEAC/BM,GAAmBN,gBAAK,kBAAM,yDAC9BO,GAAuBP,gBAAK,kBAAM,yDAClCQ,GAAkBR,gBAAK,kBAAM,uEAE7BS,GAAYT,gBAAK,kBAAM,uEAEvBU,GAAcV,gBAAK,kBAAM,8EACzBW,GAAkBX,gBAAK,kBAAM,8EAE7BY,GAAeZ,gBAAK,kBAAM,8EAC1Ba,GAAab,gBAAK,kBAAM,8EAExBc,GAAcd,gBAAK,kBAAM,8EAEzBe,GAAqBf,gBAAK,kBAAM,+EAChCgB,GAAkBhB,gBAAK,kBAAM,uEAE7BiB,GAAqBjB,gBAAK,kBAAM,8EAEhCkB,GAAYlB,gBAAK,kBAAM,mCACvBmB,GAAmBnB,gBAAK,kBAAM,8EAC9BoB,GAAcpB,gBAAK,kBAAM,8EACzBqB,GAAcrB,gBAAK,kBAAM,8EAEhB,SAASsB,GAAT,GAAkD,IAAhC3d,EAA+B,EAA/BA,WAAYjrB,EAAmB,EAAnBA,gBAC3C,OACE,kBAAC,IAAD,KAEE,kBAACy1B,EAAD,CAAcoT,KAAK,SAASC,OAAK,EAACpc,UAAWgQ,GAAOr9B,MAAO4rB,IAC3D,kBAACwK,EAAD,CAAcoT,KAAK,gBAAgBC,OAAK,EAACpc,UAAWuM,EAAc55B,MAAO4rB,IACzE,kBAACwK,EAAD,CAAcoT,KAAK,iBAAiBC,OAAK,EAACpc,UAAW0H,EAAe/0B,MAAO4rB,IAC3E,kBAACwK,EAAD,CACEoT,KAAK,SACLC,OAAK,EACLpc,UAAW,SAACrtB,GAAD,OAAW,kBAAC,IAAD,CAAUq3B,GAAIr3B,EAAM9B,SAASe,UAAYe,EAAM9B,SAASuF,OAASzD,EAAM9B,SAASuF,OAAS,OAC/GzD,MAAO4rB,IAIT,kBAAC6K,EAAD,CAAgB+S,KAAK,IAAIC,OAAK,EAACpc,UAAWqX,GAAW1kC,MAAO4rB,EAAYjrB,gBAAiBA,IACzF,kBAAC81B,EAAD,CAAgB+S,KAAK,aAAaC,OAAK,EAACpc,UAAWqX,GAAW1kC,MAAO4rB,EAAYjrB,gBAAiBA,IAClG,kBAAC81B,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAWsb,GAAa3oC,MAAO4rB,EAAYjrB,gBAAiBA,IACtG,kBAAC81B,EAAD,CAAgB+S,KAAK,mBAAmBC,OAAK,EAACpc,UAAWub,GAAiB5oC,MAAO4rB,EAAYjrB,gBAAiBA,IAC9G,kBAAC81B,EAAD,CAAgB+S,KAAK,WAAWC,OAAK,EAACpc,UAAW0N,EAAkB/6B,MAAO4rB,EAAYjrB,gBAAiBA,IACvG,kBAAC81B,EAAD,CAAgB+S,KAAK,kBAAkBC,OAAK,EAACpc,UAAW2N,EAAgBh7B,MAAO4rB,EAAYjrB,gBAAiBA,IAC5G,kBAAC81B,EAAD,CAAgB+S,KAAK,YAAYC,OAAK,EAACpc,UAAWob,GAAiB9R,gBAAiB6R,GAAsBxoC,MAAO4rB,EAAYjrB,gBAAiBA,IAC9I,kBAAC81B,EAAD,CAAgB+S,KAAK,aAAaC,OAAK,EAACpc,UAAWib,GAAmB3R,gBAAiB4R,GAAkBvoC,MAAO4rB,EAAYjrB,gBAAiBA,IAC7I,kBAAC81B,EAAD,CAAgB+S,KAAK,iBAAiBC,OAAK,EAACpc,UAAW8a,GAAqBnoC,MAAO4rB,EAAYjrB,gBAAiBA,IAChH,kBAAC81B,EAAD,CAAgB+S,KAAK,QAAQC,OAAK,EAACpc,UAAW+a,GAAepoC,MAAO4rB,EAAYjrB,gBAAiBA,IACjG,kBAAC81B,EAAD,CAAgB+S,KAAK,iBAAiBC,OAAK,EAACpc,UAAWgb,GAAuBroC,MAAO4rB,EAAYjrB,gBAAiBA,IAClH,kBAAC81B,EAAD,CAAgB+S,KAAK,cAAcC,OAAK,EAACpc,UAAW4b,GAAiBjpC,MAAO4rB,EAAYjrB,gBAAiBA,IACzG,kBAAC81B,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAW2a,GAAqBhoC,MAAO4rB,EAAYjrB,gBAAiBA,IAC9G,kBAAC81B,EAAD,CAAgB+S,KAAK,aAAaC,OAAK,EAACpc,UAAWqb,GAAW1oC,MAAO4rB,EAAYjrB,gBAAiBA,IAClG,kBAAC81B,EAAD,CAAgB+S,KAAK,aAAaC,OAAK,EAACpc,UAAW8b,GAAWnpC,MAAO4rB,EAAYjrB,gBAAiBA,IAClG,kBAAC81B,EAAD,CAAgB+S,KAAK,oBAAoBC,OAAK,EAACpc,UAAW+b,GAAkBppC,MAAO4rB,EAAYjrB,gBAAiBA,IAChH,kBAAC81B,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAWic,GAAatpC,MAAO4rB,EAAYjrB,gBAAiBA,IAGtG,kBAAC81B,EAAD,CAAgB+S,KAAK,sBAAsBC,OAAK,EAACpc,UAAW2b,GAAoBhpC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO+8B,KAC5I,kBAACtR,EAAD,CAAgB+S,KAAK,gBAAgBC,OAAK,EAACpc,UAAWwb,GAAc7oC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO+8B,KAChI,kBAACtR,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAWgc,GAAarpC,MAAO4rB,EAAYjrB,gBAAiBA,IACtG,kBAAC81B,EAAD,CAAgB+S,KAAK,cAAcC,OAAK,EAACpc,UAAWyb,GAAY9oC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO+8B,KAG5H,kBAACtR,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAW6a,GAAcloC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO88B,KAC/H,kBAACrR,EAAD,CAAgB+S,KAAK,uBAAuBC,OAAK,EAACpc,UAAWiO,EAAqBt7B,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO88B,KAC9I,kBAACrR,EAAD,CAAgB+S,KAAK,aAAaC,OAAK,EAACpc,UAAW6b,GAAoBlpC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO88B,KAGnI,kBAACrR,EAAD,CAAgB+S,KAAK,kBAAkBC,OAAK,EAACpc,UAAWkM,EAAgBv5B,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO68B,KACpI,kBAACpR,EAAD,CAAgB+S,KAAK,eAAeC,OAAK,EAACpc,UAAW0b,GAAa/oC,MAAO4rB,EAAYjrB,gBAAiBA,EAAiBqK,MAAO68B,KAG9H,kBAAC,IAAD,CAAOxa,UAAWkK,K,4LCxExBh2B,KAAMmoC,YAEC,IAAMC,GAAmB,SAAC,GAAsB,IAAD,IAAnBrrC,YAAmB,SAC5CsrC,EAAsBC,8BAAtBD,kBACFjyB,EAAMP,iBAAuB,MAenC,OAZAnV,2BAAgB,WAAO,IAAD,EACd6nC,EAAgB,SAAC1qC,GACjBA,EAAE2qC,SAAS3qC,EAAE6e,kBAGnB,UAAAtG,EAAIN,eAAJ,SAAazU,iBAAiB,QAASknC,GACvC,IAAIE,EAAMryB,EAAIN,QACd,OAAO,WACF,OAAH2yB,QAAG,IAAHA,KAAKlnC,oBAAoB,QAASgnC,OAI/BF,GAAqBtrC,EAC1B,yBACEqZ,IAAKA,EACLrV,MAAO,CACLuB,SAAU,QACVgc,IAAK,EACLgd,KAAM,EACNr6B,OAAQ,EACRkqB,MAAO,EACP9Q,UAAW,OACXG,SAAU,OACVlhB,gBAAiB,sBACjBW,OAAQ,MAGV,yBACE8G,MAAO,CACL/H,OAAQ,OACRiC,QAAS,QACTqjB,IAAK,MACLgd,KAAM,MACNh5B,SAAU,QACV6X,UAAW,uBACX9f,MAAO,UAGT,kBAAC,KAAD,CAAQK,KAAK,YAAY7B,MAAM,UAAUD,OAAQ,IAAKyB,MAAO,GAAI0G,MAAO,CAAE9F,QAAS,YAGrF,MAGO20B,GAAY8Y,aAAe,CACtCnvC,QAAS,CACPC,QAAS,CACPC,KAAM,WAERwC,UAAW,CACTxC,KAAM,WAERiB,KAAM,UAiNKiuC,iBA7Mf,SAAalqC,GAAQ,IAAD,QACsB3B,qBADtB,mBACXiD,EADW,KACG6oC,EADH,OAEM9rC,mBAAoB,IAF1B,mBAEX+L,EAFW,KAELggC,EAFK,OAGoB/rC,mBAAiB,GAHrC,mBAGXgsC,EAHW,KAGEC,EAHF,OAIoB3Y,aAAS,IAJ7B,mBAIXE,EAJW,KAIJC,EAJI,KAIMyY,EAJN,OAKwBlsC,mBAAyB,IALjD,mBAKXmsC,EALW,KAKIC,EALJ,OASkBpsC,oBADnB,GARC,mBASXqsC,EATW,KASCC,EATD,KAUd3wC,EAAQiwC,aAAe,CACzBnvC,QAAS,CACPC,QAAS,CACPC,KAAM,WAERwC,UAAW,CACTxC,KAAM,WAERiB,KAAMyuC,EAAa,OAAS,SAE9BE,UAAW,CACTC,WAAY,CACVjwB,QAAS,CACPuB,SAAU,WAKlBniB,EAAQ8wC,aAAoB9wC,GAE5B,IAAM2G,KAAkB,UAAAyF,eAAe1F,QAAQ,sBAAvB,QAAyCD,aAAaC,QAAQ,gBAEhFqqC,EAAU,OAAGzpC,QAAH,IAAGA,OAAH,EAAGA,EAAczJ,GAC3BgP,EAAe,OAAGvF,QAAH,IAAGA,OAAH,EAAGA,EAAcuF,gBAChCmkC,EAAc,iBAAG1pC,QAAH,IAAGA,OAAH,EAAGA,EAAc+B,UAAU,CAAC,QAAS,sBAArC,SACd4nC,EAAO,iBAAG3pC,QAAH,IAAGA,OAAH,EAAGA,EAAc4B,SAAS,gBAA1B,SAGbH,qBAAU,WACR,IAAIoC,EAASE,cAoBb,OAnBK0lC,GAAcpqC,GACjBmmB,uBACEtf,YAAMrC,EAAO5O,OAAOM,MAAK,SAAC4P,GACpBI,IAAiBJ,EAAKI,iBAAkB,GAC5CsjC,EAAgB1jC,GAChB2jC,EAAQ3jC,EAAK2D,MACb0nB,EAASrrB,EAAKyD,mBAEhBpE,OAAM,SAACC,GACPokC,OAAgBzzC,GAChB0P,eAAegtB,WAAW,eAC1BhtB,eAAegtB,WAAW,gBAC1B3yB,aAAa2yB,WAAW,eACxB3yB,aAAa2yB,WAAW,gBACxBD,eACAnzB,EAAMuD,QAAQC,KAAK,aAIhB2B,EAAOC,SACb,CAACzE,EAAiBoqC,EAAYlkC,EAAiB7G,EAAMuD,QAASuuB,IAGjE/uB,qBAAU,WACR,IAAIoC,EAASE,cACb,GAAK0lC,GAAeV,EAUpB,OATIW,EACFE,cAAW,EAAM/lC,EAAO5O,OACrBM,MAAK,SAACC,GAAD,OAAcszC,EAAQtzC,MAC3BgP,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,MAEpColC,aAAoBJ,GAAY,GAAM,GAAM,EAAM5lC,EAAO5O,OACtDM,MAAK,SAACC,GAAD,OAAcszC,EAAQtzC,MAC3BgP,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,MAE/B,kBAAMZ,EAAOC,YACnB,CAAC2lC,EAAYC,EAAgBX,IAGhCtnC,qBAAU,WACR,IAAIoC,EAASE,cACb,GAAK0lC,EAUL,OATKC,EAKHjkC,aAAS,GAAM,GAAO,GAAO,GAAO,GAAO,GAAO,EAAO5B,EAAO5O,OAC7DM,MAAK,SAACC,GAAD,OAAcg7B,EAASh7B,EAASqU,MAAK,SAACC,EAAGC,GAAJ,OAAWD,EAAE3N,SAAW4N,EAAE5N,UAAY,EAAI,SACpFqI,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,MANpCsC,YAAiB0iC,GAAY,GAAO,GAAO,GAAM,EAAO5lC,EAAO5O,OAC5DM,MAAK,SAACoU,GAAD,OAAQ6mB,EAAS7mB,EAAGE,MAAK,SAACC,EAAGC,GAAJ,OAAWD,EAAE3N,SAAW4N,EAAE5N,UAAY,EAAI,SACxEqI,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,MAM/B,kBAAMZ,EAAOC,YACnB,CAAC2lC,EAAYC,EAAgBC,EAASnZ,IAGzC/uB,qBAAU,WACR,IAAIqoC,EAAeC,EACflmC,EAASE,cAgBb,OAdI1E,IACFyqC,EAAgBE,aAAY,WAC1Bp1C,KAAYq9B,YACX,OAED5yB,IACF0qC,EAAWC,aAAY,WACrB9jC,YAAMrC,EAAO5O,OACVM,MAAK,SAAC4P,GACL0jC,EAAgB1jC,MAEjBX,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,QACnC,MAEE,WACLwlC,cAAcH,GACdG,cAAcF,GACdlmC,EAAOC,YAER,CAACzE,IAGJoC,qBAAU,WACR,IAAIoC,EAASE,cAOb,OALI1E,GACF8I,cACG5S,MAAK,SAACmT,GAAD,OAAYygC,EAAiBzgC,MAClClE,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,KAAOwE,MAE/BZ,EAAOC,SACb,CAACzE,IAGJ,IAkBMmE,EAAc,WAClBsB,eAAetF,QAAQ,eAAgB4pC,GAAY3pC,YACnDN,aAAaK,QAAQ,eAAgB4pC,GAAY3pC,YACjD4pC,GAAeD,IAIX9e,EAAa,CACjBjrB,gBAAiBA,EACjBk9B,qBA3B2B,SAAC2N,EAAwBttC,EAAkButC,GAAuB,IAAD,EACxFD,GAAexrC,EAAMuD,QAAQC,KAAKtF,GAAyB,WAAbA,EAAZ,OAAoCA,QAApC,IAAoCA,IAAY,GAAhD,UAAqDutC,EAAQvnC,cAAc,sBAA3E,QAA6F,MA2BnI5C,aAAcA,EACdC,WACAuD,cACA4lC,cAGF,OACE,oCACE,kBAACn0B,GAAA,EAAD,CAAevc,MAAOA,GACpB,kBAAC,KAAD,CAA6BA,MAAOA,GAClC,kBAAC,KAAD,CAAwBA,MAAOA,GAC7B,kBAAC0xC,GAAA,EAAD,CAAsBC,YAAaC,MACjC,kBAACzqB,GAAA,EAAoBzd,SAArB,CAA8BC,MAAO,CAACrC,EAAc6oC,IAClD,kBAACh9B,GAAA,EAAazJ,SAAd,CAAuBC,MAAOpC,MAC5B,kBAAC+iB,GAAA,EAAY5gB,SAAb,CAAsBC,MAAO,CAACyG,EAAMggC,EAAS,kBAAME,GAAe,SAACp+B,GAAD,OAAOA,EAAI,QAC3E,kBAACyJ,GAAA,EAAajS,SAAd,CAAuBC,MAAO,CAACkuB,EAAOC,EAAUyY,IAC9C,kBAACnY,GAAA,EAAqB1uB,SAAtB,CAA+BC,MAAO,CAAC6mC,EAAeC,IACpD,kBAACtqC,GAAA,EAAD,CACEQ,gBAAiBA,EACjBkE,aA1CH,SAACqd,GACpBxb,cACGZ,OAAM,kBAAMI,QAAQgL,aACpBra,MAAK,WACJszC,OAAgBzzC,GAChB6K,KAAMqvB,UAENxqB,eAAeylC,QACfprC,aAAaorC,QACb7rC,EAAMuD,QAAQC,KAAK,cAkCDD,QAASvD,EAAMuD,QACfuB,YAAaA,EACb4lC,WAAYA,EACZnpC,MAAOA,MAEP,kBAAC,WAAD,CAAUuqC,SAAU,kBAAC,GAAD,CAAkBxtC,MAAM,KAC1C,kBAACirC,GAAD,CAAQ3d,WAAYA,EAAYjrB,gBAAiBA,MAGrD,kBAAC,GAAD,eAUlB,kBAACorC,GAAA,EAAD,CAAazpC,MAAO,CAAE9F,QAAS,e,8XCjQ/B1C,EAAYC,aAAW,SAACC,GAAD,MAAY,CACvCotC,WAAY,CAAEvjC,SAAU,WAAYg5B,KAAM7iC,EAAMS,QAAQ,GAAIolB,IAAK7lB,EAAMS,QAAQ,IAC/EuxC,SAAU,CAAEtwB,UAAW,kCACvBuwB,YAAa,CACXpxC,gBAAiBb,EAAMc,QAAQC,QAAQC,KACvCqgB,UAAW,UAEb6wB,cAAe,CACb1vC,QAAS,OACTD,QAASvC,EAAMS,QAAQ,GAAK,QAE9B0xC,cAAe,CACbvwC,MAAO,QAETwwC,SAAU,CACR7vC,QAASvC,EAAMS,QAAQ,GACvBogB,OAAQ,4BACRtgB,OAAQP,EAAMS,QAAQ,IAExBsD,KAAM,CACJb,WAAY,EACZ4d,cAAe,EACflf,MAAO,QAETmf,SAAU,CACRnf,MAAO,OACPY,QAAS,eAEXwe,eAAgB,CACdze,QAASvC,EAAMS,QAAQ,GACvBwgB,aAAc,EACdve,YAAa1C,EAAMS,QAAQ,GAC3BmB,MAAO,OACPY,QAAS,OACT0e,oBAAqB,mBAEvBC,cAAe,CACb5e,QAAS,SAEX6e,cAAe,CACb7gB,OAAQ,OACRC,YAAa,EACboB,MAAO,iBACPyf,UAAW,SAEbC,SAAU,CACR/gB,OAAQ,OACRC,YAAa,EACbJ,MAAOJ,EAAMc,QAAQygB,KAAK,MAE5B8wB,YAAa,CACXC,aAActyC,EAAMS,QAAQ,IAE9B8xC,wBAAyB,CACvBhyC,OAAQ,OACRC,YAAa,EACboB,MAAO,kBAET4wC,KAAM,CACJ9uC,WAAY,QAEd+uC,aAAc,GACdC,oBAAqB,CAAEvyC,OAAQ,YAGlB,SAASwyC,EAAe3sC,GAAQ,IAAD,EACtCxB,EAAU1E,EAAUkG,GACpBhG,EAAQoG,cAF8B,EAGJ6M,qBAAWkU,KAHP,mBAGrC7f,EAHqC,KAGvB6oC,EAHuB,KAItC5oC,EAAQ0L,qBAAWE,KACnB9M,EAAWC,YAActG,EAAM0B,YAAYC,KAAK,MAAO,CAAE4E,OAAO,IAL1B,EAO5B+gB,cAATuQ,EAPqC,oBAStCtuB,EAAU+qB,cACVpwB,EAAW8C,cAmBX4rC,EAAmB,WACvB,GAAKtrC,EAAL,CAEA,IACI2P,EACA47B,EAAcvrC,EAEZwP,EAAQ5C,oBAAU5M,GAEpBwrC,EAAa,OAAGxrC,QAAH,IAAGA,OAAH,EAAGA,EAAcwL,SAAS,6BAEvCggC,GACF77B,EAAU1H,YAAmBjI,EAAazJ,GAAI,6BAC9CiZ,EAAMi8B,YAAYD,EAAcj1C,IAChCsyC,EAAgBr5B,IAEhBG,EAAU5H,YAAQ,OAAC/H,QAAD,IAACA,OAAD,EAACA,EAAczJ,GAbrB,CAAEsR,UAAW,4BAA6BC,WAAY,SAatBvS,MAAK,SAACgW,GAChDiE,EAAMk8B,SAASngC,GACfs9B,EAAgBr5B,MAIpBG,EAAQnL,OAAM,SAAC1G,GACb+qC,EAAgB0C,GAChBpmB,YAAWllB,EAAOnC,QAiBtB,OACE,kBAAC,IAAD,CAAQd,KAAM0B,EAAM1B,KAAM+F,QAASrE,EAAMqE,QAASujB,WAAYvnB,EAAUgf,WAAS,EAAC+H,SAAS,MACzF,kBAAC,IAAD,CAAavvB,GAAG,sBAAsB+L,UAAWpF,EAAQytC,aACvD,kBAAC,IAAD,CAAYroC,UAAWpF,EAAQ4oC,WAAYjoC,QAASa,EAAMqE,SACxD,kBAAC,IAAD,CAAiBT,UAAWpF,EAAQwtC,YAEtC,0BAAM1pC,MAAO,CAAE/H,OAAQ,OAAQ4hB,SAAU,YAAzC,aAEF,kBAAC,IAAD,CAAevY,UAAWpF,EAAQ0tC,eAChC,kBAAC,IAAD,CAAMtoC,UAAWpF,EAAQT,MAEtBuD,EACC,oCACE,kBAAC,IAAD,CAAetC,eAAa,GAA5B,WACA,kBAAC,IAAD,CAAUE,QAAM,EAACC,QAxER,SAACjB,GAAD,OAAc,SAACkB,GAC9BiB,GAAUL,EAAMqE,UACpBd,EAAQC,KAAKtF,IAsEuBD,CAAa,YAAa2F,UAAWpF,EAAQuc,UACrE,kBAAC,IAAD,CAAchgB,QAAQ,eACtB,kBAAC,IAAD,KACE,kBAAC,IAAD,QAGJ,kBAAC,IAAD,CACEmE,QAAM,EACNP,SAAO,EACPQ,QAAS,WACPa,EAAMqE,UACNrE,EAAM6E,gBAERjB,UAAWpF,EAAQuc,UAEnB,kBAAC,IAAD,CAAchgB,QAAQ,YACtB,kBAAC,IAAD,KACE,kBAAC,IAAD,SAIJ,KAGJ,kBAAC,IAAD,CAAeiE,eAAa,GAA5B,YAOCsC,EACC,kBAAC,IAAD,CAAUpC,QAAM,EAACP,SAAO,EAACQ,QAASytC,EAAkBhpC,UAAWpF,EAAQuc,UACrE,kBAAC,IAAD,CAAchgB,QAAQ,iCACtB,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAQiJ,KAAK,MAAM+d,SAAU6qB,EAAkBxgB,QAAO,iBAAE9qB,QAAF,IAAEA,OAAF,EAAEA,EAAc2B,SAAS,4BAA6B,eAAtD,aAGxD,MAGS,OAAZ3B,QAAY,IAAZA,OAAA,EAAAA,EAAc2rC,UAAU,YAAxB,OAAoC3rC,QAApC,IAAoCA,OAApC,EAAoCA,EAAcuF,iBACjD,oCACE,kBAAC,IAAD,CAAe7H,eAAa,GAA5B,SACA,kBAAC,IAAD,CAAUL,SAAO,EAACiF,UAAWpF,EAAQuc,UACnC,kBAAC,IAAD,CAAchgB,QAAQ,QACtB,kBAAC,IAAD,CAAyBuH,MAAO,CAAEyZ,SAAU,QAC1C,kBAAC,IAAD,CAAQmxB,QAAM,EAAC7tB,WAAS,EAAC1b,MAAO2vB,cAAkBvR,SAlH9C,SAAC3iB,GACnB6G,YAAa7G,EAAEgjB,OAAOze,OACtBJ,EAAQiS,QAAQtX,EAASe,SAAUf,EAASgD,SAiH5B,4BAAQyC,MAAM,QAAd,QACA,4BAAQA,MAAM,SAAd,SACA,4BAAQA,MAAM,QAAd,WAIN,kBAAC,IAAD,CAAUhF,SAAO,EAACiF,UAAWpF,EAAQuc,UACnC,kBAAC,IAAD,CAAchgB,QAAQ,YACtB,kBAAC,IAAD,CAAyBuH,MAAO,CAAEyZ,SAAU,QAC1C,kBAAC,IAAD,CAAQoxB,UAAQ,EAAC9tB,WAAS,EAAC1b,MAAOrC,EAAauJ,SAAUkX,SAvHpD,SAACG,GACpB,IAAMkrB,EAASlrB,EAAME,OAAOze,MACtBmN,EAAQ5C,oBAAU5M,GACnB,OAALwP,QAAK,IAALA,KAAOu8B,SAASD,GAChBjD,EAAgBr5B,KAoHA,kBAAC,IAAD,CAAUnN,MAAM,SAAhB,SACA,kBAAC,IAAD,CAAUA,MAAM,cAAhB,cACA,kBAAC,IAAD,CAAUA,MAAM,WAAhB,cAIN,kBAAC,IAAD,CAAUhF,SAAO,EAACiF,UAAWE,YAAKtF,EAAQuc,SAAUvc,EAAQkuC,sBAC1D,kBAAC,IAAD,CAAc3xC,QAAQ,kBACtB,kBAAC,IAAD,CAAyBuH,MAAO,CAAEyZ,SAAU,QACzCza,EAAauF,gBACZ,kBAAC,IAAD,CAAQ1H,SAAqB,OAAZmC,QAAY,IAAZA,OAAA,EAAAA,EAAcuF,iBA/FrB,SAACzH,GAC3B0H,cACGjQ,MAAK,SAACC,GAAD,OAAcqzC,OAAgBzzC,MACnCoP,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,YA4FmDrP,GACrE,kBAAC,IAAD,gBAGF,kBAAC,IAAD,CACEkN,UAAWpF,EAAQiuC,aACnBptC,QAASwyB,EACTluB,MAAO,KACPoe,SAjGC,SAAC3iB,EAAGuE,IACvB,OAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAO9L,KACT8O,YAAW,OAAChD,QAAD,IAACA,OAAD,EAACA,EAAO9L,IAChBhB,MAAK,SAACC,GAAD,OAAcqzC,EAAgB,IAAI3jC,IAAS,CAAEK,iBAAiB,QACnEf,OAAM,SAACC,GAAD,OAAS0gB,YAAWllB,EAAOwE,OA8FpB6X,YAAY,QACZxjB,MAAM,YACNglB,cAAY,EACZvB,eAAgB,CAAEoB,KAAM,cAMhC,KAGJ,kBAAC,IAAD,CAAejgB,eAAa,GAA5B,SAEA,kBAAC,IAAD,CAAUE,QAAM,EAACC,QAAS,kBAAM5G,OAAO+F,KAAK,yCAA0C,WAAWsF,UAAWpF,EAAQuc,UAClH,kBAAC,IAAD,CAAchgB,QAAQ,eACtB,kBAAC,IAAD,KACE,kBAAC,IAAD,QAGJ,kBAAC,IAAD,CAAUmE,QAAM,EAACC,QAAS,kBAAM5G,OAAO+F,KAAK,yBAA0B,WAAWsF,UAAWpF,EAAQuc,UAClG,kBAAC,IAAD,CAAchgB,QAAQ,SACtB,kBAAC,IAAD,KACE,kBAAC,IAAD,QAGJ,kBAAC,IAAD,CAAU6I,UAAWpF,EAAQuc,UAC3B,kBAAC,IAAD,CAAchgB,QAAS,UAAYpB,IAAUskC,aAC7C,kBAAC,IAAD,KACE,yBAAKF,IAAI,MAAMC,IAAK,cAAepiC,MAAM,KAAKzB,OAAO,KAAKyJ,UAAU,iCAK5E,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAQzE,QAASa,EAAMqE,QAASjK,MAAM,WAAtC,a,wJChSRR,EAAOqkC,WAAaqP,EAAYC,QAChC3zC,EAAO4zC,QAAUF,EAAYE,QAE7B,IAgBqBzB,E,kDACnB,WAAY/rC,GAAQ,IAAD,8BACjB,cAAMA,IACDkB,MAAQ,CACXk+B,SAAS,EACTqO,iBAAiB,EACjBC,sBAAuB,WACrBllB,QAAQC,IAAI,wCACZ,IAAIoI,EAAW,GACX8c,QAEFA,OAAOC,OAAO/2C,MAAK,SAAUg3C,GAAQ,IAAD,gBACjBA,GADiB,IAClC,gCAASviC,EAAT,QAAwBulB,EAASrtB,KAAKmqC,OAAO1lC,OAAOqD,KADlB,kCAKtCpF,QAAQ4qB,IAAID,GAAUh6B,MAAK,WACzB0B,OAAO2F,SAAS4vC,QAAO,QAhBZ,E,qDAsBnB,WAAqB,IAAD,OAClBnkB,MAAM,cACH9yB,MAAK,SAACC,GAAD,OAAcA,EAASi3C,UAC5Bl3C,MAAK,SAACm3C,GACL,IAAMC,EAAgBD,EAAKT,QACrBW,EAAiBt0C,EAAOqkC,WAExBkQ,EAAgBH,EAAKR,QACrBY,EAAiBx0C,EAAO4zC,QAExBa,EAjDY,SAACC,EAAUC,GAInC,IAHA,IAAMC,EAAYF,EAASz3B,MAAM,OAE3B43B,EAAYF,EAAS13B,MAAM,OAC1B23B,EAAUprC,QAAUqrC,EAAUrrC,QAAQ,CAC3C,IAAMgI,EAAIwN,OAAO41B,EAAUE,SAErBrjC,EAAIuN,OAAO61B,EAAUC,SAE3B,GAAItjC,IAAMC,EAEV,OAAOD,EAAIC,GAAKsF,MAAMtF,GAExB,OAAO,EAoC0BsjC,CAAkBV,EAAeC,GACtDU,EAAgBT,IAAkBC,EAEpCC,IAAuBO,GACrBP,GAAoB7lB,QAAQC,IAAR,kCAAuCwlB,EAAvC,2BACnBW,GAAepmB,QAAQC,IAAR,gCAAqC2lB,EAArC,2BACpB,EAAKltC,MAAMwsC,0BAEXllB,QAAQC,IAAR,0DAA+DwlB,EAA/D,+BACA,EAAKv2B,SAAS,CAAE0nB,SAAS,EAAOqO,iBAAiB,U,oBAKzD,WACE,OAAO,yBAAU1iC,KAAK/K,MAAQpG,EAAOqkC,gB,GAhDAjnB,IAAM63B,a,mKCvBlCC,EAAuB,SAACC,EAAUprC,GAC7C+e,aAAe,WACbqsB,GAAS,SAAC3jC,GACR,OAAO,2BAAKA,GAAMzH,U,SCDXw2B,EAAiB,SAAC6U,EAASC,GAAkB,IAAD,EACpC5wC,mBAAiB6wC,eAA7BC,EADgD,sBAE7BliC,qBAAW+hC,GAFkB,mBAEhDrrC,EAFgD,KAEzCyrC,EAFyC,KAOvD,OAHAN,EAAqBM,EAAD,YAAC,eAAeH,GAAhB,IAA8BE,cAG3C,CAACxrC,EAAOyrC,EAFAzrC,EAAMwrC,WAAaA,IAKrBhV,O,gCCdf,aAGahZ,EAAsB3nB,YAAmC,CAAC,GAAI,eAE5D2nB,O,mJCOTkuB,EAAc/3B,QACW,cAA7B/e,OAAO2F,SAASoxC,UAEe,UAA7B/2C,OAAO2F,SAASoxC,UAEhB/2C,OAAO2F,SAASoxC,SAASC,MACvB,2DAsCN,SAASC,EAAgBC,EAAOh5C,GAC9Bi5C,UAAUC,cACPC,SAASH,GACT54C,MAAK,SAAAg5C,GACJA,EAAaC,cAAgB,WAC3B,IAAMC,EAAmBF,EAAaG,WACd,MAApBD,IAGJA,EAAiBE,cAAgB,WACA,cAA3BF,EAAiB7uC,QACfwuC,UAAUC,cAAcO,YAI1B1nB,QAAQC,IACN,iHAKEhyB,GAAUA,EAAO05C,UACnB15C,EAAO05C,SAASN,KAMlBrnB,QAAQC,IAAI,sCAGRhyB,GAAUA,EAAO25C,WACnB35C,EAAO25C,UAAUP,WAO5B/pC,OAAM,SAAAuiB,GACLG,QAAQH,MAAM,4CAA6CA,M,mBCvFjEgoB,eAAeC,cAAc,2HAE7B,IAAMC,EAAY,WAChB,IAAIC,EAAKj4C,OAAOgK,YAChB3J,SAAS63C,gBAAgBnuC,MAAMouC,YAAY,gBAA3C,UAA+DF,EAA/D,QAGFj4C,OAAOqK,iBAAiB,SAAU+tC,mBAASJ,EAAW,MACtDA,IAEAK,IAASpa,OAAO,kBAAC,IAAD,KAAQ,kBAACqa,EAAA,EAAD,CAAKhyC,IAAI,SAAmBjG,SAASuJ,eAAe,SDGrE,SAAkB1L,GACvB,GAA6C,kBAAmBi5C,UAAW,CAGzE,GADkB,IAAIl3C,IAAIswB,GAAwBvwB,OAAO2F,SAAS/E,MACpD23C,SAAWv4C,OAAO2F,SAAS4yC,OAIvC,OAGFv4C,OAAOqK,iBAAiB,QAAQ,WAC9B,IAAM6sC,EAAK,UAAM3mB,GAAN,sBAEPumB,IAgEV,SAAiCI,EAAOh5C,GAEtCkzB,MAAM8lB,EAAO,CACX12C,QAAS,CAAE,iBAAkB,YAE5BlC,MAAK,SAAAC,GAEJ,IAAMi6C,EAAcj6C,EAASiC,QAAQnC,IAAI,gBAEnB,MAApBE,EAAS6c,QACO,MAAfo9B,IAA8D,IAAvCA,EAAY93C,QAAQ,cAG5Cy2C,UAAUC,cAAcqB,MAAMn6C,MAAK,SAAAg5C,GACjCA,EAAaoB,aAAap6C,MAAK,WAC7B0B,OAAO2F,SAAS4vC,eAKpB0B,EAAgBC,EAAOh5C,MAG1BqP,OAAM,WACL0iB,QAAQC,IACN,oEAvFAyoB,CAAwBzB,EAAOh5C,GAI/Bi5C,UAAUC,cAAcqB,MAAMn6C,MAAK,WACjC2xB,QAAQC,IACN,iHAMJ+mB,EAAgBC,EAAOh5C,OC1B/Bk5C,I,u7BChBM15C,EAAgBC,IAAYC,WAI3B,SAAS+0C,IAAyF,IAA9E7jC,EAA6E,wDAAzC9Q,EAAyC,uCAClGC,EAAM,aAENC,EAAc,GAQlB,YAPcC,IAAVH,IACFE,EAAOE,YAAcJ,EACrBE,EAAOS,OAAS,SAGQR,IAAtB2Q,IAAiC5Q,EAAOS,OAAOmQ,kBAAoBA,GAEhEpR,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASo6C,EAAOl6C,GAAsG,IAAnFm6C,EAAkF,wDAArD76C,EAAqD,uCACtHC,EAAM,cAAgBS,EAEtBR,EAA6B,CAAES,OAAQ,IAO3C,YANcR,IAAVH,IACFE,EAAOE,YAAcJ,QAGJG,IAAf06C,IAA0B36C,EAAOS,OAAOk6C,WAAaA,GAElDn7C,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAgB7D,SAASs6C,EAAep6C,EAAmBV,GAChD,IAAIC,EAAM,cAAgBS,EAAY,YAElCR,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,KAAKS,KAAI,SAAC8Q,GAAD,OAAO,IAAI9B,IAAS8B,SAG1F,SAAS6iC,EACd90C,EACAgR,EACAD,EACAkqC,EACA/6C,GAEA,IAAIC,EAAM,aAAeH,EAAS,QAE9BI,EAAc,GAUlB,YATcC,IAAVH,IACFE,EAAOE,YAAcJ,EACrBE,EAAOS,OAAS,SAGQR,IAAtB2Q,IAAiC5Q,EAAOS,OAAOmQ,kBAAoBA,QACxC3Q,IAA3B0Q,IAAsC3Q,EAAOS,OAAOkQ,uBAAyBA,QACjE1Q,IAAZ46C,IAAuB76C,EAAOS,OAAOo6C,QAAUA,GAE5Cr7C,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASw6C,EAA2Bl7C,EAAgBwV,EAAwBtV,GACjF,IAAIC,EAAG,oBAAgBH,EAAhB,SAEHI,EAA6B,CAAES,OAAQ,IAO3C,YANcR,IAAVH,IACFE,EAAOE,YAAcJ,QAGEG,IAArBmV,IAAgCpV,EAAOS,OAAO2U,iBAAmBzU,YAAiBqX,YAAkB5C,KAEjG5V,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,KAAKS,KAAI,SAAC2Y,GAAD,mBAAC,eAAcA,GAAf,IAAoBqhC,YAAY,UAQtG,SAASC,EAAYp7C,EAAgB8Z,GAC1C,IAAM3Z,EAAG,mBAAeH,EAAf,SACT,OAAOJ,EAAc0B,KAAKnB,EAAK2Z,GAAKtZ,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG3D,SAAS26C,EAAcr7C,EAAgB8Z,GAC5C,IAAM3Z,EAAG,mBAAeH,EAAf,SACHI,EAAS,CAAEM,KAAMoZ,GACvB,OAAOla,EAAcgS,OAAOzR,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGhE,SAAS46C,EAAqB16C,EAAmB+O,GACtD,IAAMxP,EAAG,oBAAgBS,EAAhB,WACT,OAAOhB,EAAc0B,KAAKnB,EAAK,CAAEwP,YAAWnP,MAAK,SAACC,GAAD,OAAcA,EAASC,QAKnE,SAASoa,EAAmBla,EAAmBV,GACpD,IAAMC,EAAM,cAAgBS,EAAY,aAEpCR,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAAS66C,EAAgCvgC,GAC9C,IAAM7a,EAAG,oBAAgB6a,EAAKpa,UAArB,sBAA4Coa,EAAKA,MAEtDhY,EAAO,IAAIsqB,SACftqB,EAAKuqB,OAAO,cAAevS,EAAKoD,aAChCpb,EAAKuqB,OAAO,aAAcvS,EAAKwgC,WAAazkC,IAAWiE,EAAKwgC,WAAY,kBAAoB,IAI5F,OAAO57C,EAAc6B,IAAItB,EAAK6C,EAFZ,CAAEN,QAAS,CAAE,eAAgB,yBAEHlC,MAAK,SAACC,GAAD,OAAcA,EAASC,QAQnE,SAAS+6C,EAAiBz7C,EAAgBgb,GAC/C,IAAM7a,EAAG,mBAAeH,EAAf,cACT,OAAOJ,EAAc0B,KAAKnB,EAAK6a,GAAMxa,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG5D,SAASg7C,EAAmB17C,EAAgBgb,GACjD,IAAM7a,EAAG,mBAAeH,EAAf,cACHI,EAAS,CAAEM,KAAMsa,GACvB,OAAOpb,EAAcgS,OAAOzR,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAiBhE,SAASi7C,EAAUz7C,GACxB,IAEIE,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAPX,WAOoBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAK7D,SAASk7C,EAAU17C,GACxB,IAEIE,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAPT,eAOkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASm7C,EAASzhC,GAEvB,OAAOxa,EAAc6B,IADZ,cACqB2Y,GAAO5Z,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG5D,SAASo7C,EAAkB97C,EAAgBoa,GAChD,IAAMja,EAAG,mBAAeH,EAAf,WACT,OAAOJ,EAAc0B,KAAKnB,EAAKia,GAAO5Z,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASq7C,EAAoB/7C,EAAgBoa,GAClD,IAAMja,EAAG,mBAAeH,EAAf,mBAAgCoa,EAAMnF,MAC/C,OAAOrV,EAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGxD,SAASs7C,EAAY5hC,GAC1B,IAAMja,EAAG,sBAAkBia,EAAMnF,MACjC,OAAOrV,EAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,QAKxD,SAASu7C,EAAa/7C,GAC3B,IAEIE,EAAc,GAGlB,YAFcC,IAAVH,IAAqBE,EAAOE,YAAcJ,GAEvCN,EAAcW,IALT,kBAKkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASw7C,EAAYC,GAAuD,IAAvCC,EAAsC,wDAC1Ej8C,EAAG,mCAA+Bi8C,EAAY,OAAS,SAC7D,OAAOx8C,EAAc6B,IAAItB,EAAKg8C,GAAM37C,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG3D,SAAS27C,EAAeF,GAC7B,IAAMh8C,EAAG,yBAAqBg8C,EAAK36C,IACnC,OAAO5B,EAAcgS,OAAOzR,GAAKK,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGxD,SAAS47C,EAAgBH,GAC9B,IAAMxhB,EAAmB,GAIzB,OAHKwhB,EAAK/hC,OAAOugB,EAAOxtB,KAAK,gCACxBgvC,EAAKI,UAAYp4B,YAAUg4B,EAAKI,UAAYJ,EAAKI,QAAU,IAAG5hB,EAAOxtB,KAAK,+CAC1EgvC,EAAKK,SAAWr4B,YAAUg4B,EAAKK,SAAWL,EAAKK,OAAS,IAAG7hB,EAAOxtB,KAAK,4CACrEwtB,EAGF,IAAM8hB,EAAe,SAACN,GAC3B,OAAgB,OAATA,QAA0B97C,IAAT87C,GAA+B,KAATA,GAAgBh4B,YAAUg4B,IAASpjC,YAAkBojC,IAAS,GAKvG,SAASO,EAAax8C,GAC3B,IAEIE,EAAc,GAGlB,YAFcC,IAAVH,IAAqBE,EAAOE,YAAcJ,GAEvCN,EAAcW,IALT,kBAKkBH,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAoI7D,SAASi8C,EAAYC,GAA0C,IAAD,UAA1BhI,EAA0B,wDACnE,OAAO,iBAACgI,QAAD,IAACA,OAAD,EAACA,EAAIC,mBAAL,QAAoB,IAApB,iBAA0BD,QAA1B,IAA0BA,OAA1B,EAA0BA,EAAIE,oBAA9B,QAA8C,IAA9C,iBAAoDF,QAApD,IAAoDA,OAApD,EAAoDA,EAAIG,iBAAxD,QAAqE,IAAMnI,EAAO,iBAAGgI,QAAH,IAAGA,OAAH,EAAGA,EAAII,oBAAP,QAAuB,EAAvB,iBAA2BJ,QAA3B,IAA2BA,OAA3B,EAA2BA,EAAIK,yBAA/B,QAAoD,K,+YCtY3IlmC,EAAaC,EAAQ,IAkBlB,SAASkmC,IAEd,IAFkC,IAAXhnC,EAAU,uDAAJ,GACzBinC,EAAO,EACFp1C,EAAI,EAAGA,EAAImO,EAAInJ,OAAQhF,IAC9Bo1C,EAAOjnC,EAAIknC,WAAWr1C,KAAOo1C,GAAQ,GAAKA,GAG5C,IAAI3mC,GAAa,IAAP2mC,EAAc,UAAYzyC,SAAS,IAAI2yC,cAEjD,MAAO,IAAM,QAAQ16C,UAAU,EAAG,EAAI6T,EAAEzJ,QAAUyJ,EAG7C,SAAS8mC,EAAgBpnC,GAO9B,OAHIqnC,SAAS,KAAOrnC,EAAIvT,UAAU,EAAG,IACjC46C,SAAS,KAAOrnC,EAAIvT,UAAU,EAAG,IACjC46C,SAAS,KAAOrnC,EAAIvT,UAAU,EAAG,KAChB,EAoBhB,IAAM66C,EAAO,SAACrmB,EAAGsmB,EAAIC,EAAIC,GAC9B,IAAI9nC,EACF+nC,EACA5oC,EACA6oC,EACAC,EACApoC,EACAoD,EACA/Q,EAAIw1C,SACJQ,EAAIhkC,KAAKuI,MACTvN,EAAiB,iBAAN2oC,EACb,GAAiB,kBAANvmB,GAAkBA,GAAK,GAAKA,EAAI,GAAmB,kBAAPsmB,GAA8B,MAAVA,EAAG,IAAwB,MAAVA,EAAG,IAAgBC,IAAO3oC,EAAI,OAAO,KACjI,IAAIipC,EAAQ,SAAC/rC,GACX,IAAIgQ,EAAIhQ,EAAElF,OACRoiB,EAAI,GACN,GAAIlN,EAAI,EAAG,CAAC,IAAD,EACMhQ,EAAIA,EAAEuO,MAAM,KADlB,mBAGT,GAFC3K,EADQ,KACL+nC,EADK,KACF5oC,EADE,KACCD,EADD,MAETkN,EAAIhQ,EAAElF,QACE,GAAKkV,EAAI,EAAG,OAAO,KAC3BkN,EAAEtZ,EAAI9N,EAAW,MAAT8N,EAAE,GAAaA,EAAEooC,MAAM,GAAKpoC,EAAEooC,MAAM,IAC5C9uB,EAAEyuB,EAAI71C,EAAE61C,GACRzuB,EAAEna,EAAIjN,EAAEiN,GACRma,EAAEpa,EAAIA,EAAIwF,WAAWxF,IAAM,MACtB,CACL,GAAU,IAANkN,GAAiB,IAANA,GAAWA,EAAI,EAAG,OAAO,KACpCA,EAAI,IAAGhQ,EAAI,IAAMA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAAMgQ,EAAI,EAAIhQ,EAAE,GAAKA,EAAE,GAAK,KACtFA,EAAIlK,EAAEkK,EAAEgsC,MAAM,GAAI,IACR,IAANh8B,GAAiB,IAANA,GAEbkN,EAAEtZ,EAAK5D,GAAK,GAAM,IAElBkd,EAAEyuB,EAAK3rC,GAAK,GAAM,IAElBkd,EAAEna,EAAK/C,GAAK,EAAK,IACjBkd,EAAEpa,EAAIgpC,GAAO,IAAJ9rC,GAAW,MAAS,MAG7Bkd,EAAEtZ,EAAI5D,GAAK,GAEXkd,EAAEyuB,EAAK3rC,GAAK,EAAK,IAEjBkd,EAAEna,EAAQ,IAAJ/C,EACNkd,EAAEpa,GAAK,GAGX,OAAOoa,GAST,OAPArW,EAAI2kC,EAAG1wC,OAAS,EAChB+L,EAAI/D,EAAK2oC,EAAG3wC,OAAS,GAAkB,MAAP2wC,IAAc5kC,EAAaA,EAC3DglC,EAAIE,EAAMP,GACVI,EAAI1mB,EAAI,EACRzhB,EAAIgoC,GAAa,MAAPA,EAAaM,EAAMN,GAAMG,EAAI,CAAEhoC,EAAG,EAAG+nC,EAAG,EAAG5oC,EAAG,EAAGD,GAAI,GAAM,CAAEc,EAAG,IAAK+nC,EAAG,IAAK5oC,EAAG,IAAKD,GAAI,GAEnG8oC,EAAI,GADJ1mB,EAAI0mB,GAAS,EAAL1mB,EAASA,GAEZ2mB,GAAMpoC,GACPioC,GACF9nC,EAAIkoC,EAAEF,EAAIC,EAAEjoC,EAAIshB,EAAIzhB,EAAEG,GACtB+nC,EAAIG,EAAEF,EAAIC,EAAEF,EAAIzmB,EAAIzhB,EAAEkoC,GACtB5oC,EAAI+oC,EAAEF,EAAIC,EAAE9oC,EAAImiB,EAAIzhB,EAAEV,KAEtBa,EAAIkoC,EAAE,KAAD,IAAEF,EAAC,SAAGC,EAAEjoC,EAAK,GAAIshB,EAAC,SAAGzhB,EAAEG,EAAK,GAAM,KACvC+nC,EAAIG,EAAE,KAAD,IAAEF,EAAC,SAAGC,EAAEF,EAAK,GAAIzmB,EAAC,SAAGzhB,EAAEkoC,EAAK,GAAM,KACvC5oC,EAAI+oC,EAAE,KAAD,IAAEF,EAAC,SAAGC,EAAE9oC,EAAK,GAAImiB,EAAC,SAAGzhB,EAAEV,EAAK,GAAM,MAEzCD,EAAI+oC,EAAE/oC,EACNW,EAAIA,EAAEX,EAENA,GADA+oC,EAAI/oC,GAAK,GAAKW,GAAK,GACVX,EAAI,EAAIW,EAAIA,EAAI,EAAIX,EAAIA,EAAI8oC,EAAInoC,EAAIyhB,EAAK,EAC9Cre,EAAU,OAASglC,EAAI,KAAO,KAAOjoC,EAAI,IAAM+nC,EAAI,IAAM5oC,GAAK8oC,EAAI,IAAMC,EAAM,IAAJhpC,GAAY,IAAO,IAAM,IAC3F,KAAO,WAAiB,SAAJc,EAAmB,MAAJ+nC,EAAgB,IAAJ5oC,GAAW8oC,EAAIC,EAAM,IAAJhpC,GAAW,IAAIrK,SAAS,IAAIuzC,MAAM,EAAGH,OAAIz9C,GAAa,IAf7G,MAkBhB,SAAS+vB,EAAWllB,EAAOwE,GAAM,IAAD,cAChCyjB,IAAMC,SAAS1jB,IAClBxE,EAAM8mB,OAEG,OAAHtiB,QAAG,IAAHA,OAAA,EAAAA,EAAKjP,UACHiP,EAAIjP,SAASC,KAAb,8BACEgP,EAAIjP,SAASC,KAAKiP,eADpB,QAC+BD,EAAIjP,SAASC,KAAKw9C,eADjD,QAC4DxuC,EAAIC,eADhE,QAC2ED,EAAIjP,SAASC,KADxF,iBAEEgP,QAFF,IAEEA,GAFF,UAEEA,EAAKjP,gBAFP,aAEE,EAAekP,eAFjB,QAE4B,kBAH9B,2BAIED,QAJF,IAIEA,OAJF,EAIEA,EAAKC,eAJP,QAIkBD,EAAIhF,kBAJtB,QAIoC,kBAExC,CACE8C,SAAU,cACV4rB,UAAW,IACXC,iBAAiB,EACjB3vB,cAAc,EACd4vB,cAAc,EACdC,WAAW,IAKZ,SAAS8F,EAAan0B,EAAOizC,GAAsB,IAAjB50C,EAAgB,uDAAN,IACjD2B,EAAMiuB,QAAQglB,EAAK,CACjB3wC,SAAU,cACV4rB,UAAW7vB,EACX8vB,iBAAiB,EACjB3vB,cAAc,EACd4vB,cAAc,EACdC,WAAW,IASR,SAASx4B,EAAiB+c,EAAM6E,GACrC,IAAI7E,EAWF,MAAO,GAVP,GAAoB,kBAATA,EAOT,OAAO/G,EAAW,IAAIzB,KAAKwI,EAAK6D,iBAAkB7D,EAAK8D,cAAe9D,EAAK0D,cAA1D,OAAyEmB,QAAzE,IAAyEA,IAAU,cANpG,IACE,OAAO5L,EAAW+G,EAAD,OAAO6E,QAAP,IAAOA,IAAU,cAAc,GAChD,SACA,MAAO,IAWR,SAAS9f,EAAyBib,GACvC,OAAIA,EACkB,kBAATA,EACF/G,EAAW+G,EAAM,cAAc,GAE/B/G,EAAW,IAAIzB,KAAKwI,EAAK6D,iBAAkB7D,EAAK8D,cAAe9D,EAAK0D,cAAe,cAGrF,GAMXlM,KAAK8oC,UAAU3iC,QAAU,SAAUxE,GACjC,IAAI6G,EAAO,IAAIxI,KAAKZ,KAAKmO,WAEzB,OADA/E,EAAKugC,WAAWvgC,EAAK0D,aAAevK,GAC7B6G,GAKF,IAAMrC,EAAU,SAAUqC,EAAM7G,GAAO,IAAD,IACvCqnC,EAAU,IAAIhpC,KAAJ,iBAASwI,QAAT,IAASA,OAAT,EAASA,EAAM+E,iBAAf,QAA4B,GAE1C,OADAy7B,EAAQD,YAAW,iBAACvgC,QAAD,IAACA,OAAD,EAACA,EAAM0D,oBAAP,QAAuB,GAAKvK,GACxCqnC,GA4CF,SAASC,EAAUC,EAAWrL,GAAwB,IAAlBsL,EAAiB,uDAAL,IACrD,IACE,OAAOtL,EACJh0B,QAAQ,IAAKs/B,GACbt/B,QAAQ,IAAK,IACbqB,MAAMi+B,GACN9lC,QAAO,SAAC+lC,EAAKC,GACZ,OAAOD,EAAIC,KACVH,GACL,MAAO9uC,GACP,QAKG,SAASkvC,EAAUJ,EAAWK,EAAQ1L,GAAwB,IAAlBsL,EAAiB,uDAAL,IAC7D,IACE,OAAOtL,EACJh0B,QAAQ,IAAKs/B,GACbt/B,QAAQ,IAAK,IACbqB,MAAMi+B,GACN9lC,QAAO,SAAC+lC,EAAKC,EAAU52C,EAAG4/B,GAEzB,OADI5/B,IAAM4/B,EAAI56B,OAAS,IAAG2xC,EAAIC,GAAYE,GACnCH,EAAIC,KACVH,GACL,MAAO9uC,GACP,U,gCCpRJ,mSAKM9P,EAAgBC,IAAYC,WAc3B,SAASud,EAA0Brd,EAAgBC,EAAwBC,GAChF,IAAMC,EAAM,aAAeH,EAAS,eAAiBC,EAEjDG,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OAAcA,EAASC,QAG7D,SAASgd,EAAcrF,GAG5B,OAAOzY,EAAc0B,KAFT,cAEmB+W,GAAW7X,MAAK,SAACC,GAAD,OAAcA,EAASC,QAGjE,SAAS+c,EAAapF,GAC3B,IAAMlY,EAAM,eAAiBkY,EAAU7W,GAEvC,OAAO5B,EAAc6B,IAAItB,EAAKkY,GAAW7X,MAAK,SAACC,GAAD,OAAcA,EAASC,QAShE,SAASo+C,EAAoBl+C,EAAmBX,EAAyBC,GAC9E,IAAMC,EAAG,oBAAgBS,EAAhB,eAELR,EAAc,CAAES,OAAQ,IAM5B,YALcR,IAAVH,IACFE,EAAOE,YAAcJ,QAEAG,IAAnBJ,IAA8BG,EAAOS,OAAOC,WAAaC,YAAiBd,EAAgB,eAEvFL,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAD,OACxCA,EAASC,KAA4BM,SAAQ,SAACC,GAC7C,OAAOA,EAAOC,QAAQC,KAAI,SAACC,GAEzB,OADAA,EAAOH,OAASA,EACTG,WAOR,SAAS29C,EACd33C,EACA0W,EACAkhC,EACArvC,EACAzP,GAEA,IAAMC,EAAM,mBAAqBiH,EAAW,mBAExChH,EAAc,GAKlB,OAJIF,IACFE,EAAOE,YAAcJ,GAGhBN,EAAc0B,KAAKnB,EAAK,CAAEwP,UAASmO,OAAMkhC,cAAc5+C,GAGzD,SAAS6+C,EAAsBj/C,EAAgBE,GACpD,IAAMC,EAAM,mBAAqBH,EAAS,qBAEtCI,EAAc,GAKlB,YAJcC,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAIzB,SAAS8+C,EAAkBl/C,EAAgBm/C,GAChD,IAAMh/C,EAAG,mBAAeH,EAAf,oBACT,OAAOJ,EAAc0B,KAAKnB,EAAKg/C,GAAgB3+C,MAAK,SAACC,GAAD,OAAcA,EAASC,QAItE,SAAS6kC,EACdzjC,EACA7B,EACA8B,EACAC,EACA9B,GAEA,IAAMC,EAAM,sBAAwB2B,EAAU,mBAAqB7B,GAAkB8B,EAAe,iBAAmB,KAAOC,EAAiB,mBAAqB,IAEhK5B,EAAc,CAChB6B,aAAc,QAOhB,YAJc5B,IAAVH,IACFE,EAAOE,YAAcJ,GAGhBN,EAAcW,IAAIJ,EAAKC,GAAQI,MAAK,SAACC,GAAc,IAAD,QACjDN,EAAM+B,OAAOC,IAAIC,gBAAgB,IAAIC,KAAK,CAAC5B,EAASC,QACpD4B,EAAOC,SAASC,cAAc,KAChCC,EAAQ,oBACVhC,EAASiC,QAAQ,8BADP,aACV,EAAyCC,WACvC,UAAAlC,EAASiC,QAAQ,8BAAjB,eAAyCE,QAAQ,MAAO,GACxD,UAAAnC,EAASiC,QAAQ,8BAAjB,eAAyCE,QAAQ,SAAU,UAHnD,oCAIgBC,YAAyB5C,GAJzC,SASZ,OAJAqC,EAAKQ,KAAO3C,EACZmC,EAAKS,aAAa,WAAYN,GAC9BF,SAASS,KAAKC,YAAYX,GAC1BA,EAAKY,QACEzC,O,gCCvIX,qDAGaqW,EAAezT,wBAAqB6H,KAElC4L,Q","file":"static/js/main.3a52b8dd.chunk.js","sourcesContent":["import { AxiosResponse, CancelToken } from 'axios';\r\nimport { User } from '../../utils/AccountsAPI';\r\nimport { CreatedUpdatedTable } from '../../utils/APIReturnTypes';\r\nimport AxiosConfig from '../../utils/AxiosConfig';\r\nimport { CostCode } from '../../utils/CYMAAPI';\r\nimport { getUTCAmericanDateString, getUTCDateString } from '../../utils/Functions';\r\nimport { FileUploads } from '../files/FileAPI';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*-------------------------------Expenses-------------------------------------*/\r\nexport function getExpensesById(id: number, token?: CancelToken): Promise {\r\n const url = '/expenses/' + id;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getExpensesForWeekEnding(userId: string, weekEndingDate: string, token?: CancelToken): Promise {\r\n const url = '/accounts/' + userId + '/expenses/' + weekEndingDate;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getExpensesForJob(jobNumber: string, weekEndingDate?: string, token?: CancelToken): Promise {\r\n const url = `cyma/jobs/${jobNumber}/expenses`;\r\n\r\n var config: any = { params: {} };\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n if (weekEndingDate !== undefined) config.params.weekEnding = getUTCDateString(weekEndingDate, 'yyyy-mm-dd');\r\n\r\n return axiosInstance.get(url, config).then((response) =>\r\n (response.data as ExpenseReportHeader[]).flatMap((header) => {\r\n return header.details.map((detail) => {\r\n detail.header = header;\r\n return detail;\r\n });\r\n })\r\n );\r\n}\r\n\r\nexport function postExpenses(header: ExpenseReportHeader): Promise {\r\n const url = '/expenses';\r\n\r\n return axiosInstance.post(url, header).then((response) => response.data);\r\n}\r\n\r\nexport function putExpenses(header: ExpenseReportHeader): Promise {\r\n const url = '/expenses/' + header.id;\r\n\r\n return axiosInstance.put(url, header).then((response) => response.data);\r\n}\r\n\r\nexport function putExpensesApproval(userId: string, type: 'manager' | 'accounting', approved: boolean): Promise {\r\n const url = `/expenses/${userId}/approvals/${type}/${approved}`;\r\n\r\n return axiosInstance.put(url).then((response) => response.data);\r\n}\r\n\r\nexport function putExpenseFiles(detailId: number, files: FileUploads[]) {\r\n const url = `/expenses/details/${detailId}/files`;\r\n return axiosInstance.put(url, files).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Export----------------------------------------*/\r\n\r\nexport function downloadExpenseReportExport(\r\n company: string,\r\n weekEndingDate: Date | string,\r\n approvedOnly: boolean,\r\n unExportedOnly: boolean,\r\n token?: CancelToken\r\n): Promise> {\r\n const url = '/expenses/export/' + company + '?weekEndingDate=' + weekEndingDate + (approvedOnly ? '&approved=true' : '') + (unExportedOnly ? '&unexported=true' : '');\r\n\r\n var config: any = {\r\n responseType: 'blob',\r\n };\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => {\r\n const url = window.URL.createObjectURL(new Blob([response.data]));\r\n const link = document.createElement('a');\r\n var filename =\r\n response.headers['content-disposition']?.substring(\r\n response.headers['content-disposition']?.indexOf('=') + 1,\r\n response.headers['content-disposition']?.indexOf('xlsx') + 4\r\n ) ?? `expensesDownload_${getUTCAmericanDateString(weekEndingDate)}.xlsx`;\r\n link.href = url;\r\n link.setAttribute('download', filename);\r\n document.body.appendChild(link);\r\n link.click();\r\n return response;\r\n });\r\n}\r\n\r\n/*-------------------------------Interfaces----------------------------------------*/\r\n\r\nexport interface ExpenseReportHeader extends CreatedUpdatedTable {\r\n id?: number;\r\n userId?: string;\r\n user?: User;\r\n periodEndingDate?: string | Date;\r\n managerApprovedBy?: string;\r\n managerApprovedDate?: string | Date;\r\n accountingApprovedBy?: string;\r\n accountingApprovedDate?: string | Date;\r\n lastExportedDate?: string | Date;\r\n details: ExpenseReportDetail[];\r\n}\r\n\r\nexport interface ExpenseReportDetail extends CreatedUpdatedTable {\r\n id?: number;\r\n headerId?: number;\r\n dateOfPurchase?: Date | string;\r\n placeOfPurchase?: string;\r\n expenseType?: string;\r\n expenseAmount?: number;\r\n jobNumber?: string;\r\n costCode?: string;\r\n costCodes: CostCode[];\r\n comments?: string;\r\n isPayable?: boolean;\r\n header?: ExpenseReportHeader;\r\n files: FileUploads[];\r\n}\r\n","import { createContext } from 'react';\r\n\r\nexport const StateContext = (arr) => createContext<[T, Function]>(arr);\r\n\r\nexport default StateContext;\r\n","import React, { useLayoutEffect, useState } from 'react';\r\nimport { Theme } from '@material-ui/core/styles';\r\nimport {\r\n AppBar,\r\n Toolbar,\r\n IconButton,\r\n makeStyles,\r\n Drawer,\r\n Divider,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n useMediaQuery,\r\n useTheme,\r\n Typography,\r\n ListSubheader,\r\n Collapse,\r\n colors,\r\n} from '@material-ui/core';\r\nimport {\r\n Menu as MenuIcon,\r\n ChevronLeft,\r\n BarChart,\r\n People,\r\n Dashboard,\r\n Assignment,\r\n Timer,\r\n CreditCard,\r\n AttachMoney,\r\n ExpandLess,\r\n ExpandMore,\r\n BusinessCenter,\r\n PermMedia,\r\n AccountBalance,\r\n Settings,\r\n CheckBox,\r\n Home,\r\n Event as EventIcon,\r\n Today,\r\n Receipt,\r\n LocalShipping,\r\n LocalAtm,\r\n} from '@material-ui/icons';\r\nimport clsx from 'clsx';\r\nimport AppBarContext, { AppBarContextData } from '../../contexts/AppBarContext';\r\nimport { useLocation } from 'react-router-dom';\r\nimport FileDialog from '../files/FileDialog';\r\nimport SettingsDialog from './SettingsDialog';\r\nimport { useEffect } from 'react';\r\nimport { useLoggedInUser } from '../../hooks/useLoggedInUser';\r\nimport { useToast } from '../../hooks/useToast';\r\n\r\nexport const globalAny: any = global;\r\nexport const drawerWidth = 250;\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n grow: {\r\n flexGrow: 1,\r\n height: '100%',\r\n color: 'white',\r\n overflowX: 'hidden',\r\n },\r\n rightMenuItem: {\r\n margin: 'auto',\r\n marginRight: -theme.spacing(1),\r\n marginLeft: theme.spacing(1),\r\n },\r\n rightMenuMarginAuto: {\r\n marginLeft: 'auto',\r\n },\r\n appBar: {\r\n backgroundColor: theme.palette.primary.main,\r\n color: 'inherit',\r\n transition: theme.transitions.create(['margin', 'width'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n zIndex: 1200,\r\n },\r\n appBarShift: {\r\n [theme.breakpoints.down('sm')]: {\r\n width: `100%`,\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n width: `calc(100vw - ${drawerWidth}px)`,\r\n },\r\n boxSizing: 'border-box',\r\n marginLeft: drawerWidth,\r\n transition: theme.transitions.create(['margin', 'width'], {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerPaper: {\r\n backgroundColor: theme.palette.type === 'dark' ? theme.palette.background.paper : colors.blue[50],\r\n width: drawerWidth,\r\n },\r\n content: {\r\n padding: 0,\r\n display: 'flex',\r\n overlfow: 'auto',\r\n transition: theme.transitions.create(['margin', 'padding'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n [theme.breakpoints.down('sm')]: {\r\n marginLeft: -drawerWidth,\r\n marginRight: 0,\r\n paddingLeft: drawerWidth,\r\n },\r\n },\r\n contentShift: {\r\n transition: theme.transitions.create(['margin', 'padding'], {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n [theme.breakpoints.down('sm')]: {\r\n marginLeft: 0,\r\n marginRight: -drawerWidth,\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n paddingLeft: drawerWidth,\r\n },\r\n },\r\n drawerHeader: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 1),\r\n ...theme.mixins.toolbar,\r\n justifyContent: 'flex-end',\r\n },\r\n footerList: {\r\n paddingTop: 0,\r\n },\r\n mainList: {\r\n overflowY: 'auto',\r\n },\r\n selectedListItemRoot: {\r\n '&$selected': {\r\n backgroundColor: theme.palette.primary.main,\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.light,\r\n },\r\n },\r\n },\r\n selected: {},\r\n secondary: {\r\n color: theme.palette.secondary.main,\r\n },\r\n userName: {\r\n display: 'inline-block',\r\n fontWeight: 'bold',\r\n marginLeft: 'auto',\r\n marginRight: 0,\r\n },\r\n pageTitle: {\r\n margin: 'auto 5px auto 4px',\r\n whiteSpace: 'nowrap',\r\n fontWeight: 'bold',\r\n },\r\n darkModeToggle: {\r\n marginLeft: 0,\r\n marginRight: 'auto',\r\n },\r\n}));\r\n\r\nexport const SideBarListItem = ({\r\n list,\r\n item,\r\n goToLocation,\r\n location,\r\n closeParent,\r\n i,\r\n}: {\r\n list: any[];\r\n item: any;\r\n goToLocation?: Function;\r\n location?: any;\r\n closeParent?: Function;\r\n i: number;\r\n}) => {\r\n const [open, setOpen] = useState(false);\r\n const classes = useStyles();\r\n\r\n const onClick = (item) => (e) => {\r\n if (item?.location) goToLocation?.(item?.location);\r\n else {\r\n item?.onClick?.();\r\n closeParent?.();\r\n }\r\n\r\n if (item.options) setOpen((o) => !o);\r\n };\r\n\r\n const closeOptions = () => setOpen(false);\r\n\r\n let itemLocation = item.matchLocation ?? item.location;\r\n return item.divider ? (\r\n \r\n {item.hideDivider ? null : }\r\n {item.subHeaderText ? {item.subHeaderText} : null}\r\n \r\n ) : (\r\n \r\n \r\n {item.icon ? {item.icon} : null}\r\n \r\n {item.options && !item.closeDropdown ? open ? : : null}\r\n \r\n {item.options && !item.closeDropdown ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport const SidebarList = (props: { list: any[]; goToLocation?: Function; location?: any; closeParent?: Function }) => {\r\n return (\r\n \r\n {props.list\r\n ?.filter((item) => !item.hidden ?? true)\r\n .map((item, i) => (\r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default function NavbarWithSidebar(props) {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n const localDrawerOpen = localStorage.getItem('drawerOpen');\r\n const [drawerOpen, setDrawerOpen] = useState(localDrawerOpen === 'true' ? true : localDrawerOpen === 'false' ? false : !isMobile && props.isAuthenticated);\r\n localStorage.setItem('drawerOpen', drawerOpen?.toString());\r\n\r\n const location = useLocation();\r\n const dialogType: 'files' | 'settings' | undefined = (location.state as any)?.dialogType;\r\n const filesOpen = dialogType === 'files';\r\n const settingsOpen = dialogType === 'settings';\r\n\r\n const [employeeInfo] = useLoggedInUser();\r\n const toast = useToast();\r\n\r\n const [appBarData, setAppBarData] = useState({\r\n title: 'Home',\r\n showSearch: false,\r\n searchOptions: [],\r\n showSearchOptions: false,\r\n updateSearchOn: 'blur',\r\n searchValue: '',\r\n });\r\n\r\n const open = drawerOpen ?? !isMobile;\r\n\r\n //full height layout\r\n useLayoutEffect(() => {\r\n const handleResizeList = () => {\r\n // set list height\r\n let header = document.getElementById('listHeader');\r\n let rectHeader = header?.getBoundingClientRect();\r\n\r\n let list = document.getElementById('mainList');\r\n if (list) {\r\n list.style.height = window.innerHeight - (rectHeader?.bottom ?? 0) + 'px';\r\n }\r\n };\r\n\r\n const handleResizeContent = () => {\r\n let mainHeader = document.getElementById('navbarHeader');\r\n let rectMainHeader = mainHeader?.getBoundingClientRect();\r\n\r\n let content = document.getElementById('drawerContent');\r\n if (content) {\r\n content.style.height = window.innerHeight - (rectMainHeader?.bottom ?? 0) + 'px';\r\n }\r\n };\r\n\r\n if (!isMobile && props.isAuthenticated) {\r\n window.addEventListener('resize', handleResizeList);\r\n handleResizeList();\r\n }\r\n\r\n if (isMobile) {\r\n window.addEventListener('resize', handleResizeContent);\r\n handleResizeContent();\r\n } else {\r\n let content = document.getElementById('drawerContent');\r\n if (content) {\r\n content.style.removeProperty('height');\r\n }\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResizeList);\r\n window.removeEventListener('resize', handleResizeContent);\r\n };\r\n }, [isMobile, props.isAuthenticated]);\r\n\r\n useEffect(() => {\r\n if (!props.isAuthenticated) setDrawerOpen(false);\r\n }, [props.isAuthenticated]);\r\n\r\n const goToLocation = (location) => {\r\n props.history.push(location);\r\n if (isMobile) setDrawerOpen(false);\r\n };\r\n\r\n const drawerItems = [\r\n { divider: true, subHeaderText: 'TIPS', hideDivider: true },\r\n { text: 'Dashboard', icon: , location: '/', hidden: employeeInfo?.hasClaim('DisableDashboard', 'true') },\r\n {\r\n text: 'Timesheet',\r\n icon: ,\r\n location: '/Timesheet',\r\n hidden: (employeeInfo?.hasClaim('DisableTimesheet', 'true') || employeeInfo?.hasClaim('department', 'shop')) && !employeeInfo?.isInRole('Admin'),\r\n },\r\n {\r\n text: 'Shop Timesheet',\r\n icon: ,\r\n location: '/ShopTimesheet',\r\n hidden:\r\n employeeInfo?.hasClaim('DisableTimesheet', 'true') ||\r\n (!employeeInfo?.hasClaim('department', 'shop') && !employeeInfo?.hasClaim('department', 'Shop Manager') && !employeeInfo?.isInRole('Admin')),\r\n },\r\n {\r\n text: 'Shop Clock',\r\n icon: ,\r\n location: '/ShopClock',\r\n hidden: !employeeInfo?.hasClaim('department', 'Shop Clock') && !employeeInfo?.hasClaim('department', 'Shop Manager') && !employeeInfo?.isInRole('Admin'),\r\n },\r\n { text: 'Expenses', icon: , location: '/Expenses', hidden: employeeInfo?.hasClaim('DisableExpenses', 'true') && !employeeInfo?.isInRole('Admin') },\r\n {\r\n text: 'Company Card',\r\n icon: ,\r\n location: '/CreditCards',\r\n hidden: (employeeInfo?.creditCards?.length ?? 0) === 0 && !employeeInfo?.isInRoles(['Accounting', 'Admin']),\r\n },\r\n { text: 'My Schedule', icon: , location: '/MySchedule', hidden: !employeeInfo?.hasSkillClaim() && !employeeInfo?.isInRole('Admin') },\r\n {\r\n text: 'Shop Dashboard',\r\n icon: ,\r\n location: '/Shop',\r\n hidden: !employeeInfo?.hasClaim('Department', 'Shop') && !employeeInfo?.hasClaim('Department', 'Shop Manager') && !employeeInfo?.isInRoles(['Accounting', 'Admin']),\r\n },\r\n {\r\n text: 'PO Dashboard',\r\n icon: ,\r\n location: '/PODashboard',\r\n hidden:\r\n !employeeInfo?.hasClaim('Department', 'Shop') && !employeeInfo?.hasClaim('Department', 'Shop Manager') && !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']),\r\n },\r\n\r\n { text: 'Approvals', icon: , location: '/Approvals', hidden: !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']) },\r\n {\r\n text: 'Files',\r\n icon: ,\r\n onClick: () => props.history.push(location.pathname + location.search, { ...(location.state as any), dialogType: 'files' }),\r\n hidden: employeeInfo?.hasClaim('DisableFiles', 'true') && !employeeInfo?.isInRole('Admin'),\r\n },\r\n { divider: true, subHeaderText: 'PROJECTS', hidden: !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']) },\r\n { text: 'Scheduler', icon: , location: '/SchedulerDashboard', hidden: !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']) },\r\n { text: 'Manage Jobs', icon: , location: '/JobDashboard', hidden: !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']) },\r\n {\r\n text: 'SaleOrders ',\r\n icon: ,\r\n location: '/SoDashboard',\r\n hidden:\r\n !employeeInfo?.hasClaim('Department', 'Shop') && !employeeInfo?.hasClaim('Department', 'Shop Manager') && !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']),\r\n },\r\n { text: 'Job Costing', icon: , location: '/JobCosting', hidden: !employeeInfo?.isInRoles(['Manager', 'Accounting', 'Admin']) },\r\n { divider: true, subHeaderText: 'ACCOUNTING', hidden: !employeeInfo?.isInRoles(['Admin', 'Accounting']) },\r\n { text: 'Dashboard', icon: , location: '/AccountingDashboard', hidden: !employeeInfo?.isInRoles(['Admin', 'Accounting']) },\r\n { text: 'Bill Rates', icon: , location: '/BillRates', hidden: !employeeInfo?.isInRoles(['Admin', 'Accounting']) },\r\n { divider: true, subHeaderText: 'ADMIN', hidden: !employeeInfo?.isInRole('Admin') },\r\n { text: 'User Management', icon: , location: '/ManageUsers', hidden: !employeeInfo?.isInRole('Admin') },\r\n ];\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n {props.isAuthenticated ? (\r\n setDrawerOpen((open) => !open)}>\r\n \r\n \r\n ) : null}\r\n props.history.push(employeeInfo?.getClaimValue('defaultHome') ?? '/')}>\r\n \r\n \r\n {appBarData.title}\r\n {props.isAuthenticated ? {!isMobile ? employeeInfo?.userName : ''} : null}\r\n props.history.push(location.pathname + location.search, { ...(location.state as any), dialogType: 'settings' })}\r\n color='inherit'\r\n className={clsx(classes.rightMenuItem, !props.isAuthenticated ? classes.rightMenuMarginAuto : '')}\r\n >\r\n \r\n \r\n \r\n \r\n setDrawerOpen(false)}\r\n variant={isMobile ? 'temporary' : 'persistent'}\r\n anchor='left'\r\n classes={{\r\n paper: classes.drawerPaper,\r\n }}\r\n ModalProps={{ keepMounted: true, disablePortal: true }}\r\n >\r\n
\r\n setDrawerOpen(false)}>\r\n \r\n \r\n
\r\n \r\n {props.isAuthenticated ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n
{props.children}
\r\n {employeeInfo && filesOpen ? props.history.goBack()} /> : null}\r\n props.history.goBack()}\r\n handleLogout={props.handleLogout}\r\n toggleTheme={props.toggleTheme}\r\n isAuthenticated={props.isAuthenticated}\r\n />\r\n
\r\n \r\n
\r\n );\r\n}\r\n","import axios, { AxiosRequestConfig, CancelToken, CancelTokenSource } from 'axios';\r\nimport { CreditCardAssignment, CreditCardTransaction } from '../pages/creditCards/CreditCardAPI';\r\nimport ExpenseReport from '../pages/expenses/ExpenseReport';\r\nimport { ExpenseReportHeader } from '../pages/expenses/ExpensesAPI';\r\nimport { FileUploads } from '../pages/files/FileAPI';\r\nimport Timesheet from '../pages/timesheets/Timesheet';\r\nimport { TimeRecordHeader } from '../pages/timesheets/TimesheetAPI';\r\nimport { CostCode, CYMAJob, EarningsType, Skill } from './CYMAAPI';\r\nimport AxiosConfig, { storeBaseURL } from './AxiosConfig';\r\nimport { CreatedUpdatedTable } from './APIReturnTypes';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\nconst TokenGenerator = axios.CancelToken;\r\n\r\n/*----------------------------------Cancel Tokens----------------------------------------*/\r\n\r\nexport const cancelPromises = (source: CancelTokenSource) => {\r\n source.cancel();\r\n};\r\n\r\nexport const getSource = (): CancelTokenSource => {\r\n return TokenGenerator.source();\r\n};\r\n\r\nexport const getCancelToken = (source: CancelTokenSource): CancelToken => {\r\n return source?.token;\r\n};\r\n\r\n/*----------------------------------Authentication----------------------------------------*/\r\n\r\n//Send authentication info and set the return value to the local state\r\n//saves between browser runs\r\nexport const authenticate = (username: string, password: string, rememberMe: boolean, token?: CancelToken): Promise => {\r\n const url = '/authentication';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n cancelToken: token !== undefined ? token : undefined,\r\n };\r\n\r\n let authPacket = 'username=' + encodeURIComponent(username) + '&password=' + encodeURIComponent(password);\r\n\r\n return axiosInstance\r\n .post(url, authPacket, configAuth)\r\n .catch((err) => {\r\n if (err.message === 'Network Error') {\r\n storeBaseURL('prod');\r\n configAuth.cancelToken = undefined;\r\n return axiosInstance.post(url, authPacket, configAuth);\r\n }\r\n return Promise.reject(err);\r\n })\r\n .then((response) => response.data)\r\n .then((data: any) => {\r\n sessionStorage.setItem('accessToken', data.token);\r\n sessionStorage.setItem('accessTokenExpiration', data.tokenExpiration);\r\n sessionStorage.setItem('refreshToken', data.refreshToken);\r\n sessionStorage.setItem('refreshTokenExpiration', data.refreshTokenExpiration);\r\n if (rememberMe) localStorage.setItem('accessToken', data.token);\r\n if (rememberMe) localStorage.setItem('accessTokenExpiration', data.tokenExpiration);\r\n if (rememberMe) localStorage.setItem('refreshToken', data.refreshToken);\r\n if (rememberMe) localStorage.setItem('refreshTokenExpiration', data.refreshTokenExpiration);\r\n return new Employee(data.user);\r\n });\r\n};\r\n\r\n//no call to api, but sets local state back to deauth\r\nexport const deAuthenticate = () => {\r\n const url = '/logout';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body = 'RefreshToken=' + encodeURIComponent(sessionStorage.getItem('refreshToken') ?? '');\r\n\r\n return axiosInstance.post(url, body, configAuth);\r\n};\r\n\r\n//Impersonate a user and swap your auth token with theirs\r\nexport const impersonate = (userId: string): Promise => {\r\n const url = '/impersonate';\r\n\r\n let config = {\r\n params: { userId },\r\n };\r\n\r\n return axiosInstance\r\n .post(url, null, config)\r\n .then((response) => response.data)\r\n .then((data: any) => {\r\n sessionStorage.setItem('accessToken', data.token);\r\n sessionStorage.setItem('accessTokenExpiration', data.tokenExpiration);\r\n sessionStorage.setItem('refreshToken', data.refreshToken);\r\n sessionStorage.setItem('refreshTokenExpiration', data.refreshTokenExpiration);\r\n const employee = new Employee(data.user);\r\n employee.isImpersonating = true;\r\n return employee;\r\n });\r\n};\r\n\r\n//undo impersonation\r\nexport const unImpersonate = (): Promise => {\r\n const url = '/unimpersonate';\r\n\r\n return axiosInstance\r\n .post(url)\r\n .then((response) => response.data)\r\n .then((data: any) => {\r\n sessionStorage.setItem('accessToken', data.token);\r\n sessionStorage.setItem('accessTokenExpiration', data.tokenExpiration);\r\n sessionStorage.setItem('refreshToken', data.refreshToken);\r\n sessionStorage.setItem('refreshTokenExpiration', data.refreshTokenExpiration);\r\n return new Employee(data.user);\r\n });\r\n};\r\n\r\n/*------------------------------------Accounts-------------------------------------------*/\r\n\r\nexport const getUsers = (\r\n includeCards?: boolean,\r\n includeDirectReports?: boolean,\r\n includeFiles?: boolean,\r\n includeJobsAndCostCodes?: boolean,\r\n includeClosedCostCodes?: boolean,\r\n includeClosedJobs?: boolean,\r\n includeDisabled?: boolean,\r\n token?: CancelToken\r\n): Promise => {\r\n const url = '/accounts';\r\n\r\n var config = {\r\n headers: {},\r\n cancelToken: token !== undefined ? token : undefined,\r\n params: {} as any,\r\n };\r\n\r\n if (includeCards !== undefined) config.params.includeCards = includeCards;\r\n if (includeDirectReports !== undefined) config.params.includeDirectReports = includeDirectReports;\r\n if (includeFiles !== undefined) config.params.includeFiles = includeFiles;\r\n if (includeJobsAndCostCodes !== undefined) config.params.includeJobsAndCostCodes = includeJobsAndCostCodes;\r\n if (includeClosedJobs !== undefined) config.params.includeClosedJobs = includeClosedJobs;\r\n if (includeClosedCostCodes !== undefined) config.params.includeClosedCostCodes = includeClosedCostCodes;\r\n if (includeDisabled !== undefined) config.params.includeDisabled = includeDisabled;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data.map((user) => new Employee(user)));\r\n};\r\n\r\nexport const getUser = (\r\n userId: string,\r\n includeCards?: boolean,\r\n includeDirectReports?: boolean,\r\n includeFiles?: boolean,\r\n includeJobsAndCostCodes?: boolean,\r\n includeClosedCostCodes?: boolean,\r\n token?: CancelToken\r\n): Promise => {\r\n const url = '/accounts/' + userId;\r\n\r\n var config = {\r\n headers: {},\r\n cancelToken: token !== undefined ? token : undefined,\r\n params: {} as any,\r\n };\r\n\r\n if (includeCards !== undefined) config.params.includeCards = includeCards;\r\n if (includeDirectReports !== undefined) config.params.includeDirectReports = includeDirectReports;\r\n if (includeFiles !== undefined) config.params.includeFiles = includeFiles;\r\n if (includeJobsAndCostCodes !== undefined) config.params.includeJobsAndCostCodes = includeJobsAndCostCodes;\r\n if (includeClosedCostCodes !== undefined) config.params.includeClosedCostCodes = includeClosedCostCodes;\r\n\r\n return axiosInstance.get(url, config).then((response) => new Employee(response.data));\r\n};\r\n\r\nexport const getMe = (token?: CancelToken): Promise => {\r\n const url = '/accounts/me';\r\n\r\n var config = { headers: {}, cancelToken: token !== undefined ? token : undefined };\r\n\r\n return axiosInstance.get(url, config).then((response) => new Employee(response.data));\r\n};\r\n\r\nexport const postUser = (user: CreateUser): Promise => {\r\n const url = '/accounts';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body =\r\n 'FirstName=' +\r\n encodeURIComponent(user.firstName) +\r\n '&LastName=' +\r\n encodeURIComponent(user.lastName) +\r\n '&Username=' +\r\n encodeURIComponent(user.userName) +\r\n '&EmployeeNumber=' +\r\n encodeURIComponent(user.employeeNumber) +\r\n '&Email=' +\r\n encodeURIComponent(user.email) +\r\n '&Company=' +\r\n encodeURIComponent(user.company) +\r\n '&Password=' +\r\n encodeURIComponent(user.password ?? '');\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => new Employee(response.data));\r\n};\r\n\r\nexport const putUser = (userId: string, user: EditUser): Promise => {\r\n const url = '/accounts/' + userId;\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body =\r\n 'FirstName=' +\r\n encodeURIComponent(user.firstName) +\r\n '&LastName=' +\r\n encodeURIComponent(user.lastName) +\r\n '&Username=' +\r\n encodeURIComponent(user.userName) +\r\n '&EmployeeNumber=' +\r\n encodeURIComponent(user.employeeNumber) +\r\n '&Email=' +\r\n encodeURIComponent(user.email) +\r\n '&Company=' +\r\n encodeURIComponent(user.company) +\r\n '&Disabled=' +\r\n encodeURIComponent(user.disabled);\r\n\r\n return axiosInstance.put(url, body, configAuth).then((response) => new Employee(response.data));\r\n};\r\n\r\nexport const deleteUser = (userId: string, token?: CancelToken): Promise => {\r\n const url = '/accounts/' + userId;\r\n\r\n var config = { headers: {}, cancelToken: token !== undefined ? token : undefined };\r\n\r\n return axiosInstance.delete(url, config).then((response) => response.data);\r\n};\r\n\r\nexport const putUserDirectReport = (userId: string, directReportId: string): Promise => {\r\n const url = `/accounts/${userId}/directreports/${directReportId}`;\r\n return axiosInstance.put(url).then((response) => new Employee(response.data));\r\n};\r\n\r\nexport const deleteUserDirectReport = (userId: string, directReportId: string, token?: CancelToken): Promise => {\r\n const url = `/accounts/${userId}/directreports/${directReportId}`;\r\n var config = {\r\n headers: {},\r\n cancelToken: token !== undefined ? token : undefined,\r\n };\r\n return axiosInstance.delete(url, config).then((response) => response.data);\r\n};\r\n\r\nexport const getDirectReports = (\r\n userId: string,\r\n includeCards?: boolean,\r\n includeFiles?: boolean,\r\n includeJobsAndCostCodes?: boolean,\r\n includeClosedCostCodes?: boolean,\r\n token?: CancelToken\r\n): Promise => {\r\n const url = `/accounts/${userId}/directreports`;\r\n var config = {\r\n cancelToken: token !== undefined ? token : undefined,\r\n params: {} as any,\r\n };\r\n\r\n if (includeCards !== undefined) config.params.includeCards = includeCards;\r\n if (includeFiles !== undefined) config.params.includeFiles = includeFiles;\r\n if (includeJobsAndCostCodes !== undefined) config.params.includeJobsAndCostCodes = includeJobsAndCostCodes;\r\n if (includeClosedCostCodes !== undefined) config.params.includeClosedCostCodes = includeClosedCostCodes;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data.map((d) => new Employee(d)));\r\n};\r\n\r\n/*------------------------------------Account Maintenance-------------------------------------------*/\r\n\r\nexport const sendEmailConfirmation = (userId: string): Promise => {\r\n const url = '/accounts/' + userId + '/sendemailconfirmation';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const confirmEmail = (userId: string, token: string): Promise => {\r\n const url = '/accounts/' + userId + '/confirmemail';\r\n\r\n var body = 'Token=' + token;\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const sendPasswordReset = (username: string): Promise => {\r\n const url = '/accounts/sendpasswordreset';\r\n\r\n let body = 'Username=' + encodeURIComponent(username);\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const resetPassword = (username: string, token: string, newPassword: string): Promise => {\r\n const url = '/accounts/resetpassword';\r\n\r\n let body = 'Username=' + encodeURIComponent(username) + '&Token=' + token + '&NewPassword=' + encodeURIComponent(newPassword);\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const changePassword = (userId: string, currentPassword: string, newPassword: string): Promise => {\r\n const url = '/accounts/' + userId + '/changepassword';\r\n\r\n let body = 'CurrentPassword=' + encodeURIComponent(currentPassword) + '&NewPassword=' + encodeURIComponent(newPassword);\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const adminChangePassword = (userId: string, newPassword: string): Promise => {\r\n const url = '/accounts/' + userId + '/adminchangepassword';\r\n\r\n let body = 'NewPassword=' + encodeURIComponent(newPassword);\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const putUserRole = (userId: string, roleName: string): Promise => {\r\n const url = '/accounts/' + userId + '/roles/' + roleName;\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.put(url, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const deleteUserRole = (userId: string, roleName: string): Promise => {\r\n const url = '/accounts/' + userId + '/roles/' + roleName;\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n return axiosInstance.delete(url, configAuth).then((response) => response.data);\r\n};\r\n\r\n/*--------------------------------------Roles---------------------------------------------*/\r\nexport const getRoles = (token?: CancelToken): Promise => {\r\n const url = '/roles';\r\n var config = { headers: {}, cancelToken: token !== undefined ? token : undefined };\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n};\r\n\r\nexport const getRole = (roleId: string, token?: CancelToken): Promise => {\r\n const url = '/roles/' + roleId;\r\n var config = { headers: {}, cancelToken: token !== undefined ? token : undefined };\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n};\r\n\r\nexport const postRoles = (userId: string): Promise => {\r\n const url = '/roles';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body = 'Name=' + encodeURIComponent(userId);\r\n\r\n return axiosInstance.post(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const putRoles = (userId: string, roleId: string): Promise => {\r\n const url = '/roles/' + roleId;\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body = 'Name=' + encodeURIComponent(userId);\r\n\r\n return axiosInstance.put(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const deleteRole = (roleId: string): Promise => {\r\n const url = '/roles/' + roleId;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n};\r\n\r\n/*------------------------------------Claims-------------------------------------------*/\r\n\r\nexport const getClaimsForUser = (userId: string, token?: CancelToken): Promise => {\r\n const url = '/accounts/' + userId + '/claims';\r\n\r\n let configAuth = {\r\n cancelToken: token !== undefined ? token : undefined,\r\n };\r\n\r\n return axiosInstance.get(url, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const getUsersByClaim = (claimType: string, claimValue?: string, token?: CancelToken): Promise => {\r\n const url = `/accounts/claims/${claimType}` + (claimValue ? `/${claimValue}` : '');\r\n\r\n let configAuth = {\r\n cancelToken: token !== undefined ? token : undefined,\r\n };\r\n\r\n return axiosInstance.get(url, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const putClaim = (userId: string, claim: Claim): Promise => {\r\n const url = '/accounts/' + userId + '/claims';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n };\r\n\r\n let body = 'claimType=' + encodeURIComponent(claim.claimType) + '&claimValue=' + encodeURIComponent(claim.claimValue);\r\n\r\n return axiosInstance.put(url, body, configAuth).then((response) => response.data);\r\n};\r\n\r\nexport const deleteClaimForUser = (userId: string, ClaimType: string): Promise => {\r\n const url = '/accounts/' + userId + '/claims?claimType=' + encodeURIComponent(ClaimType);\r\n\r\n //let body = 'claimType=' + encodeURIComponent(ClaimType);\r\n\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n};\r\n\r\n/*------------------------------------Default Claims-------------------------------------------*/\r\n\r\nexport const getDefaultClaims = (claimType?: string, claimValue?: string, token?: CancelToken): Promise => {\r\n const url = '/default/claims';\r\n\r\n let config: AxiosRequestConfig = {\r\n params: {},\r\n };\r\n\r\n if (token) config.cancelToken = token;\r\n if (claimType !== undefined) config.params.claimType = encodeURIComponent(claimType);\r\n if (claimValue) config.params.tagValue = encodeURIComponent(claimValue);\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n};\r\n\r\nexport const putDefaultClaim = (claim: DefaultClaim): Promise => {\r\n const url = '/default/claims';\r\n return axiosInstance.put(url, claim).then((response) => response.data);\r\n};\r\n\r\nexport const deleteDefaultClaim = (id: number): Promise => {\r\n const url = `/default/claims/${id}`;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n};\r\n\r\nexport const defaultClaims: DefaultClaim[] = [\r\n { id: 1, claimType: 'Skill', claimValue: 'Electrician' },\r\n { id: 2, claimType: 'Skill', claimValue: 'Mechanical' },\r\n { id: 3, claimType: 'Skill', claimValue: 'Install' },\r\n];\r\n\r\n/*------------------------------------System-------------------------------------------*/\r\n\r\nexport const systemStatus = (): Promise => {\r\n const url = '/status';\r\n\r\n return axiosInstance.post(url).then((response) => response.data);\r\n};\r\n\r\n/* -------------------- User Management -------------------- */\r\nexport interface BaseUser {\r\n firstName: string;\r\n lastName: string;\r\n userName: string;\r\n employeeNumber: string;\r\n email: string;\r\n company: string;\r\n}\r\n\r\nexport interface CreateUser extends BaseUser {\r\n password?: string;\r\n}\r\n\r\nexport interface User extends BaseUser {\r\n id: string;\r\n joinDate: Date;\r\n lastLogin: Date;\r\n roles: Role[];\r\n claims: Claim[];\r\n emailConfirmed: boolean;\r\n disabled: boolean;\r\n directReports: User[];\r\n managers: User[];\r\n files: FileUploads[];\r\n jobs: CYMAJob[];\r\n earningsTypes: EarningsType[];\r\n skills: Skill[];\r\n costCodes: CostCode[];\r\n creditCards: CreditCardAssignment[];\r\n creditCardTransactions: CreditCardTransaction[];\r\n expenseReports: ExpenseReportHeader[];\r\n timesheets: TimeRecordHeader[];\r\n}\r\n\r\nexport class Employee implements User {\r\n id: string;\r\n firstName: string;\r\n lastName: string;\r\n userName: string;\r\n employeeNumber: string;\r\n email: string;\r\n company: string;\r\n joinDate: Date;\r\n lastLogin: Date;\r\n _roles: Role[];\r\n claims: Claim[];\r\n emailConfirmed: boolean;\r\n disabled: boolean;\r\n directReports: Employee[];\r\n managers: Employee[];\r\n files: FileUploads[];\r\n jobs: CYMAJob[];\r\n earningsTypes: EarningsType[];\r\n skills: Skill[];\r\n costCodes: CostCode[];\r\n creditCards: CreditCardAssignment[];\r\n creditCardTransactions: CreditCardTransaction[];\r\n\r\n isFake: boolean = false;\r\n isImpersonating: boolean = false;\r\n\r\n expenseReportsObj: ExpenseReport[];\r\n timesheetsObj: Timesheet[];\r\n\r\n originalRoles: Role[];\r\n strRoles: string[];\r\n hideAdmin: boolean;\r\n\r\n get expenseReports() {\r\n return this.expenseReportsObj.map((e) => e._header);\r\n }\r\n\r\n get timesheets() {\r\n return this.timesheetsObj.map((e) => e._header);\r\n }\r\n\r\n set roles(roles: Role[]) {\r\n this._roles = roles;\r\n this.strRoles = roles?.map((r) => r.name?.toLowerCase()) ?? [];\r\n }\r\n\r\n get roles() {\r\n return this._roles;\r\n }\r\n\r\n get fullName() {\r\n return this.lastName && this.firstName ? `${this.firstName} ${this.lastName}` : this.userName;\r\n }\r\n\r\n constructor(user: User | Employee) {\r\n this.id = user.id;\r\n this.firstName = user.firstName;\r\n this.lastName = user.lastName;\r\n this.userName = user.userName;\r\n this.employeeNumber = user.employeeNumber;\r\n this.email = user.email;\r\n this.company = user.company;\r\n this.joinDate = user.joinDate;\r\n this.lastLogin = user.lastLogin;\r\n this._roles = user.roles;\r\n this.claims = user.claims;\r\n this.emailConfirmed = user.emailConfirmed;\r\n this.disabled = user.disabled;\r\n\r\n this.isFake = user?.['isFake'] ?? false;\r\n this.isImpersonating = user?.['isImpersonating'] ?? false;\r\n\r\n this.directReports = (user.directReports as User[])?.map((dr) => new Employee(dr)) ?? [];\r\n this.managers = (user.managers as User[])?.map((mn) => new Employee(mn)) ?? [];\r\n this.files = user.files;\r\n this.jobs = user.jobs;\r\n this.skills = user.skills?.sort((a, b) => (a.name < b.name ? -1 : 1));\r\n this.earningsTypes = user.earningsTypes?.sort((a, b) => (a.longName === 'Hourly' ? -1 : b.longName === 'Hourly' ? 1 : a.longName < b.longName ? -1 : 1)) ?? [];\r\n this.costCodes = user.costCodes;\r\n this.creditCards = user.creditCards;\r\n this.creditCardTransactions = user.creditCardTransactions;\r\n\r\n this.expenseReportsObj =\r\n user.expenseReports?.map((e) => {\r\n const er = new ExpenseReport(this, new Date(Date.parse(e.periodEndingDate?.toString() ?? '')), user.jobs);\r\n er.data = e;\r\n return er;\r\n }) ?? [];\r\n this.timesheetsObj =\r\n user.timesheets?.map((t) => {\r\n const ts = new Timesheet(this, new Date(Date.parse(t.periodEndingDate?.toString() ?? '')), user.jobs, user.earningsTypes);\r\n ts.data = t;\r\n return ts;\r\n }) ?? [];\r\n\r\n this.strRoles = user.roles?.map((r) => r.name?.toLowerCase()) ?? [];\r\n this.roles = user.roles;\r\n this.originalRoles = [...(this._roles ?? [])];\r\n this.hideAdmin = false;\r\n }\r\n\r\n static empty(val: any) {\r\n return new Employee({\r\n isFake: true,\r\n ...val,\r\n });\r\n }\r\n\r\n wasInRole(role: string): boolean {\r\n return (this?.originalRoles?.findIndex((r) => r.name.toLowerCase() === role.toLowerCase()) ?? -1) > -1;\r\n }\r\n\r\n isInRole(role: string): boolean {\r\n return this.strRoles.filter((str) => !(this.hideAdmin && str === 'admin')).indexOf(role?.toLowerCase()) > -1;\r\n }\r\n\r\n isInRoles(roles: string[]): boolean {\r\n return this.strRoles.filter((str) => !(this.hideAdmin && str === 'admin')).findIndex((strRoles) => roles?.findIndex((r) => r.toLowerCase() === strRoles) > -1) > -1;\r\n }\r\n\r\n addRole(role: string) {\r\n this.strRoles.push(role.toLowerCase());\r\n }\r\n\r\n setRoles(roles: string[]) {\r\n this.strRoles = roles.map((r) => r.toLowerCase());\r\n }\r\n\r\n removeRole(role: string) {\r\n const index = this.strRoles.findIndex((strRole) => strRole === role.toLowerCase());\r\n if (index > -1) this.strRoles.splice(index, 1);\r\n }\r\n\r\n resetRoles() {\r\n this.roles = this.originalRoles;\r\n this.strRoles = this.originalRoles.map((r) => r.name?.toLowerCase());\r\n }\r\n\r\n getClaim(type: string, caseSensitive: boolean = false): Claim | undefined {\r\n return this.claims?.find((c) => (caseSensitive && c.claimType === type) || c.claimType.toLowerCase() === type.toLowerCase());\r\n }\r\n\r\n getClaims(type: string, caseSensitive: boolean = false): Claim[] | undefined {\r\n return this.claims?.filter((c) => (caseSensitive && c.claimType === type) || c.claimType.toLowerCase() === type.toLowerCase());\r\n }\r\n\r\n getClaimValue(type: string): string | undefined {\r\n return this.claims?.find((c) => c.claimType === type)?.claimValue;\r\n }\r\n\r\n hasClaim(type: string, value: string, caseSensitive: boolean = false): boolean {\r\n let claim = this.getClaim(type, caseSensitive);\r\n return claim !== undefined && ((caseSensitive && claim.claimValue === value) || claim.claimValue.toLowerCase() === value.toLowerCase());\r\n }\r\n\r\n hasSkillClaim() {\r\n return this.getClaim('skill', false) ? true : false;\r\n }\r\n\r\n addClaim(claim: Claim) {\r\n if (this.claims) this.claims.push(claim);\r\n else this.claims = [claim];\r\n }\r\n\r\n removeClaim(id: string): Claim | undefined {\r\n let index = this.claims.findIndex((claim) => claim.id === id);\r\n if (index === -1) return;\r\n return this.claims.splice(index, 1)[0];\r\n }\r\n}\r\n\r\nexport interface EditUser extends BaseUser {\r\n id: string;\r\n emailConfirmed: boolean;\r\n disabled: boolean;\r\n}\r\n\r\nexport interface Claim {\r\n id: string;\r\n userId: string;\r\n claimType: string;\r\n claimValue: string;\r\n}\r\n\r\nexport interface DefaultClaim extends CreatedUpdatedTable {\r\n id: number;\r\n claimType: string;\r\n claimValue: string;\r\n}\r\n\r\nexport interface Role {\r\n roleId: string;\r\n name: string;\r\n}\r\n","import { useContext } from 'react'\r\nimport { ConfirmationServiceContext } from '../contexts/ConfirmContext'\r\n\r\nexport const useConfirmation = () => useContext(ConfirmationServiceContext)","import { useContext } from 'react'\r\nimport { ToastContext } from '../contexts/ToastContext'\r\n\r\nexport const useToast = () => useContext(ToastContext)","import { cloneDeep, isEqual } from 'lodash';\r\nimport { TimeRecordHeader, TimeRecordDetail, TimeRecordHours, getTimesheetForWeekEnding, postTimesheet, putTimesheet } from './TimesheetAPI';\r\nimport { ShopJobParts, ShopJobHeader } from '../shop/ShopJobsAPI';\r\nimport { CancelToken } from 'axios';\r\nimport { addDays, getUTCDateString } from '../../utils/Functions';\r\nimport { getCostCodesforJob, EarningsType, CYMAJob } from '../../utils/CYMAAPI';\r\nimport { getWeekEndingDate, parseStringNumber, sortEarningsTypes } from '../../utils/TSFunctions';\r\nimport { Employee } from '../../utils/AccountsAPI';\r\nlet dateFormat = require('dateformat'); //formats dates very well\r\n\r\n/*\r\n Name: Timesheet\r\n Author: Tyler Kennedy\r\n Date: 9/8/2020\r\n Purpose: Timesheet Middleware\r\n*/\r\n\r\nconst days: { day: string; abb: string; hours?: number }[] = [\r\n { day: 'Sunday', abb: 'Sun', hours: undefined },\r\n { day: 'Monday', abb: 'Mon', hours: undefined },\r\n { day: 'Tuesday', abb: 'Tue', hours: undefined },\r\n { day: 'Wednesday', abb: 'Wed', hours: undefined },\r\n { day: 'Thursday', abb: 'Thur', hours: undefined },\r\n { day: 'Friday', abb: 'Fri', hours: undefined },\r\n { day: 'Saturday', abb: 'Sat', hours: undefined },\r\n];\r\n\r\n/*\r\n------------------------------------------------------\r\n-------------------Timesheet Class--------------------\r\n------------------------------------------------------\r\n*/\r\n\r\nexport default class Timesheet {\r\n _header: TimeRecordHeader;\r\n _dateCreated: Date | null;\r\n _weekEnding: Date;\r\n _employeeInfo: Employee;\r\n _jobs: CYMAJob[] = [];\r\n schedulerJobs: CYMAJob[] = [];\r\n earningsTypes?: EarningsType[];\r\n\r\n constructor(employeeInfo: Employee, weekEnding: Date, jobs: CYMAJob[] = [], earningsTypes: EarningsType[] = [], schedulerJobs: CYMAJob[] = []) {\r\n this._header = this.emptyTimesheet();\r\n this._header.periodEndingDate = weekEnding;\r\n this._weekEnding = weekEnding;\r\n this.weekEnding = weekEnding;\r\n this._dateCreated = new Date();\r\n this._employeeInfo = employeeInfo;\r\n this.employeeInfo = employeeInfo;\r\n\r\n this.jobs = jobs;\r\n\r\n this.schedulerJobs = schedulerJobs;\r\n\r\n this.earningsTypes = sortEarningsTypes(earningsTypes);\r\n }\r\n\r\n set jobs(j) {\r\n this._jobs = j;\r\n }\r\n\r\n get jobs() {\r\n var jobsClone = cloneDeep(this._jobs);\r\n this.earningsTypes?.filter((et) => et.canReplaceJob).forEach((et) => jobsClone.push({ jobNumber: et.shortName, desc: et.shortName }));\r\n return jobsClone;\r\n }\r\n\r\n set weekEnding(weekEnding: Date) {\r\n if (weekEnding !== this._weekEnding) {\r\n this._header.periodEndingDate = weekEnding;\r\n this._weekEnding = getWeekEndingDate(weekEnding);\r\n }\r\n }\r\n\r\n get weekEnding(): Date {\r\n return this._weekEnding;\r\n }\r\n\r\n set employeeInfo(employeeInfo: Employee) {\r\n this._header.userId = employeeInfo.id;\r\n this._employeeInfo = employeeInfo;\r\n }\r\n\r\n get employeeInfo(): Employee {\r\n return this._employeeInfo;\r\n }\r\n\r\n set data(timesheet) {\r\n timesheet.userId = timesheet.userId ?? this._employeeInfo.id;\r\n timesheet.periodEndingDate = timesheet.periodEndingDate ?? this.getWeekEndingAsString();\r\n this._header = timesheet;\r\n }\r\n\r\n get data() {\r\n return this._header;\r\n }\r\n\r\n get locked() {\r\n return this._header.managerApprovedBy || this._header.accountingApprovedBy || this.isExpired ? true : false;\r\n }\r\n\r\n get isExpired() {\r\n return (new Date().getTime() - this._weekEnding?.getTime()) / (1000 * 60 * 60 * 24) > 21;\r\n }\r\n\r\n get totalHours() {\r\n return this._header.details.reduce((sum, d) => sum + d.hours.reduce((s, h) => s + parseStringNumber(h.hours), 0), 0);\r\n }\r\n\r\n get hoursByEarningsType() {\r\n return this._header.details.reduce(\r\n (agg, det) => {\r\n if (!det.earningsType) return agg;\r\n\r\n if ((det.earningsType?.indexOf('Reg') ?? -1) > -1 || (det.earningsType?.indexOf('Rg') ?? -1) > -1) {\r\n agg.reg += det.hours.reduce((s, h) => s + parseStringNumber(h.hours), 0);\r\n } else if ((det.earningsType?.indexOf('OT') ?? -1) > -1) {\r\n agg.ot += det.hours.reduce((s, h) => s + parseStringNumber(h.hours), 0);\r\n }\r\n\r\n return agg;\r\n },\r\n { reg: 0, ot: 0 } as Record<'reg' | 'ot', number>\r\n );\r\n }\r\n\r\n get otHoursWarning() {\r\n const totalHours = this.hoursByEarningsType;\r\n return ((totalHours.reg ?? 0) < 40 && (totalHours.ot ?? 0) > 0) || (totalHours.reg ?? 0) > 40;\r\n }\r\n\r\n get isManagerApproved() {\r\n return this._header.managerApprovedBy ? true : false;\r\n }\r\n\r\n get isAccountingApproved() {\r\n return this._header.accountingApprovedBy ? true : false;\r\n }\r\n\r\n get objType() {\r\n return 'timesheet';\r\n }\r\n\r\n get errors() {\r\n return this.getErrors();\r\n }\r\n\r\n getErrors(validateJob = true, validateCostCode = true): string[] {\r\n let errorMessages: string[] = [];\r\n let totalHours = 0;\r\n\r\n this._header.details.forEach((detail, i) => {\r\n if (isEqual(detail, this.emptyDetail())) {\r\n return;\r\n }\r\n\r\n //First Checking TimeTicketDetail\r\n if (validateJob) {\r\n let jobIndex = this.jobs?.findIndex((job) => {\r\n return job.jobNumber === detail.jobNumber;\r\n });\r\n\r\n jobIndex = Math.max(\r\n jobIndex ?? -1,\r\n this.schedulerJobs.findIndex((job) => {\r\n return job.jobNumber === detail.jobNumber;\r\n })\r\n );\r\n\r\n if (jobIndex === -1 && (this.earningsTypes?.findIndex((et) => et.shortName === detail.earningsType && et.canReplaceJob) ?? -1) === -1) {\r\n errorMessages.push('Invalid Job #: [' + detail.jobNumber + '], on row:' + (i + 1));\r\n }\r\n }\r\n\r\n if (\r\n validateCostCode &&\r\n (detail.costCode === '' || !detail.costCode) &&\r\n (this.earningsTypes?.findIndex((et) => et.shortName === detail.earningsType && et.canReplaceJob) ?? -1) === -1\r\n ) {\r\n errorMessages.push('Invalid Cost Code on row:' + (i + 1));\r\n }\r\n\r\n const earningsTypeIndex = this.earningsTypes?.findIndex((earningsType) => {\r\n return earningsType.shortName === detail.earningsType;\r\n });\r\n\r\n if (this.earningsTypes?.findIndex((et) => et.shortName === detail.earningsType && et.canReplaceJob) && detail.shopJobParts)\r\n errorMessages.push(`${detail.earningsType} cannot have a part assigned!`);\r\n\r\n if (earningsTypeIndex === -1) errorMessages.push('Invalid Earnings Type #: [' + detail.earningsType + '], on row:' + (i + 1));\r\n\r\n if (this?.employeeInfo?.skills && this?.employeeInfo?.skills?.length !== 0 && !detail.skill) errorMessages.push('No skill assigned on row:' + (i + 1));\r\n\r\n detail.hours.forEach((hour) => {\r\n if (hour.hours) {\r\n if (hour.hours > 24) {\r\n errorMessages.push('No more than 24 hours per day: ' + hour.hours);\r\n } else if (hour.hours < 0) {\r\n errorMessages.push('No negative hours: ' + hour.hours);\r\n } else if (isNaN(parseFloat(hour.hours.toString()))) {\r\n errorMessages.push('Hours must be a number: ' + hour.hours);\r\n }\r\n totalHours += parseFloat(hour.hours.toString());\r\n } else {\r\n errorMessages.push('Empty hour record!');\r\n }\r\n });\r\n\r\n if (totalHours === 0) {\r\n errorMessages.push('Total hours must be greater than zero');\r\n }\r\n totalHours = 0;\r\n });\r\n\r\n return errorMessages;\r\n }\r\n\r\n copy(): Timesheet {\r\n return cloneDeep(this);\r\n }\r\n\r\n updateHeader(fieldId: string, value: any): Timesheet {\r\n let clone = cloneDeep(this);\r\n if (clone._header[fieldId] !== value) {\r\n clone._header[fieldId] = value;\r\n }\r\n return clone;\r\n }\r\n\r\n newDetail(): Timesheet {\r\n let clone = cloneDeep(this);\r\n clone._header.details.push(clone.emptyDetail());\r\n return clone;\r\n }\r\n\r\n withEmptyDetail(): Timesheet {\r\n var clone = cloneDeep(this);\r\n var existingIndex = clone._header.details.findIndex((detail) => !detail.id);\r\n if (existingIndex > -1) return clone;\r\n else {\r\n clone._header.details.push(clone.emptyDetail());\r\n return clone;\r\n }\r\n }\r\n\r\n removeDetail(rowNumber: number): Timesheet {\r\n let clone = cloneDeep(this);\r\n let header = clone._header;\r\n header.details.splice(rowNumber, 1);\r\n if (header.details.length === 0) {\r\n header.details = [clone.emptyDetail()];\r\n }\r\n return clone;\r\n }\r\n\r\n updateDetailToNewJob(rowNum: number, token?: CancelToken): Promise {\r\n let clone = cloneDeep(this);\r\n let promise: Promise | null = null;\r\n let detail = clone._header.details[rowNum];\r\n\r\n if (!detail.skill && clone._employeeInfo.skills.length === 1) {\r\n detail.skill = clone._employeeInfo.skills[0].name;\r\n }\r\n\r\n //if valid job number\r\n if (detail.jobNumber && detail.jobNumber !== '') {\r\n if (detail.jobNumber !== (detail.costCodes[0] ? detail.costCodes[0].jobNumber : '')) {\r\n let job = clone.jobs?.find((job) => job.jobNumber === detail.jobNumber) ?? clone.schedulerJobs?.find((job) => job.jobNumber === detail.jobNumber);\r\n if ((job?.costCodes?.length ?? 0) > 0) promise = Promise.resolve(job?.costCodes);\r\n else promise = getCostCodesforJob(detail.jobNumber, token);\r\n }\r\n\r\n if (detail.jobNumber && (this.earningsTypes?.findIndex((et) => et.shortName === detail.jobNumber && et.canReplaceJob) ?? -1) > -1) {\r\n detail.earningsType = detail.jobNumber;\r\n }\r\n } else {\r\n detail.costCodes = [];\r\n }\r\n\r\n if (promise) {\r\n return promise.then((response) => {\r\n let detail = clone._header.details[rowNum];\r\n detail.shopJobParts = undefined;\r\n detail.shopJobPartsID = undefined;\r\n if (detail) {\r\n detail.costCodes = response;\r\n if (detail.costCodes?.length === 1) detail.costCode = detail.costCodes[0]?.code;\r\n }\r\n return clone;\r\n });\r\n } else {\r\n return Promise.resolve(clone);\r\n }\r\n }\r\n\r\n static updateDetailToNewJob(detail: TimeRecordDetail, timesheet: Timesheet, jobs?: CYMAJob[]): TimeRecordDetail {\r\n let clone = cloneDeep(timesheet);\r\n\r\n if (!detail.skill && clone._employeeInfo.skills.length === 1) {\r\n detail.skill = clone._employeeInfo.skills[0].name;\r\n }\r\n\r\n //if valid job number\r\n if (detail.jobNumber && detail.jobNumber !== '') {\r\n if (detail.jobNumber !== (detail.costCodes[0] ? detail.costCodes[0].jobNumber : '')) {\r\n let job = (jobs ?? clone.jobs)?.find((job) => job.jobNumber === detail.jobNumber) ?? clone.schedulerJobs.find((job) => job.jobNumber === detail.jobNumber);\r\n detail.costCodes = job?.costCodes ?? [];\r\n if (detail.costCodes?.length === 1) detail.costCode = detail.costCodes[0]?.code;\r\n else detail.costCode = undefined;\r\n detail.shopJobParts = undefined;\r\n detail.shopJobPartsID = undefined;\r\n }\r\n\r\n if ((clone.earningsTypes?.findIndex((et) => et.shortName === detail.jobNumber && et.canReplaceJob) ?? -1) > -1) {\r\n detail.earningsType = detail.jobNumber;\r\n } else {\r\n detail.earningsType = '';\r\n }\r\n } else {\r\n detail.costCodes = [];\r\n detail.costCode = undefined;\r\n }\r\n\r\n return detail;\r\n }\r\n\r\n updateDetail(rowNum: number, fieldId: string, newValue: any, token?: CancelToken): Promise {\r\n let clone = cloneDeep(this);\r\n const value = newValue ?? '';\r\n\r\n //no update\r\n if (clone._header?.details[rowNum]?.[fieldId] === value) {\r\n return Promise.resolve(this);\r\n }\r\n\r\n if (!clone._header.details[rowNum]) return Promise.reject(clone);\r\n\r\n clone._header.details[rowNum][fieldId] = value;\r\n\r\n // TODO : FIX bad earnings type for job\r\n if (!clone._header.details[rowNum].skill && clone._employeeInfo.skills.length === 1) {\r\n clone._header.details[rowNum].skill = clone._employeeInfo.skills[0].name;\r\n }\r\n\r\n if (fieldId === 'jobNumber') {\r\n return clone.updateDetailToNewJob(rowNum, token);\r\n } else if (fieldId === 'earningsType') {\r\n if ((this.earningsTypes?.findIndex((et) => et.shortName === value && et.canReplaceJob) ?? -1) > -1) {\r\n clone._header.details[rowNum].shopJobParts = undefined;\r\n clone._header.details[rowNum].shopJobPartsID = undefined;\r\n }\r\n }\r\n\r\n return Promise.resolve(clone);\r\n }\r\n\r\n updateTicketHours(rowNum: number, dayAbbr: string, newValue: any): Timesheet {\r\n let clone = cloneDeep(this);\r\n const value = isNaN(newValue) || newValue === null || newValue === undefined || newValue === '' ? '0' : newValue;\r\n\r\n //clear all records for that day\r\n clone._header.details[rowNum].hours.forEach((hourRecord, i) => {\r\n let day: Date | undefined;\r\n\r\n if (typeof hourRecord.dateOfRecord === 'string') day = new Date(Date.parse(hourRecord.dateOfRecord));\r\n else day = hourRecord.dateOfRecord;\r\n\r\n if (day && days[day.getUTCDay()].abb === dayAbbr) {\r\n clone._header.details[rowNum].hours.splice(i, 1);\r\n }\r\n });\r\n\r\n //add record back if needed\r\n if (!(value === '0')) {\r\n let newHourRecord = clone.emptyTicketHours();\r\n newHourRecord.detailId = clone._header.details[rowNum].id;\r\n newHourRecord.dateOfRecord = addDays(clone._weekEnding, days.findIndex((day) => day.abb === dayAbbr) - 6);\r\n newHourRecord.hours = value;\r\n clone._header.details[rowNum].hours.push(newHourRecord);\r\n }\r\n return clone;\r\n }\r\n\r\n static updateTicketHoursForDetail(detail: TimeRecordDetail, weekEnding: Date, dayAbbr: string, newValue: string): TimeRecordDetail {\r\n const value = !newValue || newValue === '' ? 0 : parseStringNumber(newValue);\r\n\r\n //clear all records for that day\r\n detail.hours.forEach((hourRecord, i) => {\r\n let day: Date | undefined;\r\n\r\n if (typeof hourRecord.dateOfRecord === 'string') day = new Date(Date.parse(hourRecord.dateOfRecord));\r\n else day = hourRecord.dateOfRecord;\r\n\r\n if (day && days[day.getUTCDay()].abb === dayAbbr) {\r\n detail.hours.splice(i, 1);\r\n }\r\n });\r\n\r\n //add record back if needed\r\n if (!(value === 0)) {\r\n let newHourRecord = Timesheet.emptyTicketHours();\r\n newHourRecord.detailId = detail.id;\r\n newHourRecord.dateOfRecord = dateFormat(addDays(weekEnding, days.findIndex((day) => day.abb === dayAbbr) - 6), 'isoUtcDateTime');\r\n newHourRecord.hours = value;\r\n detail.hours.push(newHourRecord);\r\n }\r\n return detail;\r\n }\r\n\r\n updateTicketHoursByID(rowNum: number, hourId: string, field: string, newValue: any, removeEmptyDetail: boolean = false, removeEmptyHours: boolean = true): Timesheet {\r\n let clone = cloneDeep(this);\r\n const value = (field === 'hours' && isNaN(newValue)) || newValue === null ? '0' : newValue;\r\n\r\n //find hour record\r\n let hourRecordIndex = clone._header.details[rowNum].hours.findIndex((hourRecord, i) => {\r\n return hourRecord.id === hourId;\r\n });\r\n\r\n if (hourRecordIndex > -1) {\r\n if (field === 'hours' && (value === '0' || value === 0) && removeEmptyHours) {\r\n clone._header.details[rowNum].hours.splice(hourRecordIndex, 1);\r\n if (removeEmptyDetail && clone._header.details[rowNum]?.hours?.length === 0) clone._header.details.splice(rowNum, 1);\r\n } else {\r\n clone._header.details[rowNum].hours[hourRecordIndex][field] = value;\r\n }\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n updateTicketDetailPart(rowNum: number, field: string, newValue: any): Timesheet {\r\n let clone = cloneDeep(this);\r\n\r\n //find hour record\r\n let detailRecord = clone._header.details[rowNum];\r\n\r\n //update shopJobParts\r\n if (detailRecord?.shopJobParts) {\r\n detailRecord.shopJobParts[field] = newValue;\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n changeTicketPart(rowNum: number, hourId: string, newPart: ShopJobParts, newJob: ShopJobHeader, earningsType: string): Promise {\r\n let clone = cloneDeep(this) as Timesheet;\r\n\r\n //find hour record\r\n let hourRecord = clone._header.details[rowNum]?.hours?.find((hourRecord, i) => {\r\n return hourRecord.id === hourId;\r\n });\r\n\r\n //update shopJobParts\r\n if (hourRecord) {\r\n //move/update detail if necessary\r\n return clone.moveHourRecord(rowNum, hourId, newPart, newJob, earningsType, false);\r\n }\r\n\r\n return Promise.reject(clone);\r\n }\r\n\r\n moveHourRecord(rowNum: number, hourId: string, part: ShopJobParts, job: ShopJobHeader, earningsType: string, cloneThis = true): Promise {\r\n let clone = cloneThis ? cloneDeep(this) : this;\r\n\r\n const jobNumber = job.cymaJobNumber;\r\n\r\n //if necessary to move\r\n if (\r\n clone._header.details[rowNum].jobNumber !== jobNumber ||\r\n clone._header.details[rowNum].earningsType !== earningsType ||\r\n clone._header.details[rowNum].shopJobPartsID !== part.id\r\n ) {\r\n //if only hour record, just swap job number & earnings type\r\n if (clone._header.details[rowNum].hours.length === 1) {\r\n let detail = clone._header.details[rowNum];\r\n detail.earningsType = earningsType;\r\n detail.shopJobPartsID = part.id;\r\n detail.shopJobParts = part;\r\n detail.jobNumber = jobNumber;\r\n\r\n return getCostCodesforJob(jobNumber).then((codes) => {\r\n detail.costCodes = codes;\r\n detail.costCode = codes?.[0]?.code ?? 'ALL';\r\n return clone;\r\n });\r\n }\r\n\r\n //find hour record\r\n let hourIndex = clone._header.details[rowNum]?.hours?.findIndex((hourRecord, i) => {\r\n return hourRecord.id === hourId;\r\n });\r\n\r\n //if no hour record found, quit\r\n if (hourIndex === -1) return Promise.reject(clone);\r\n\r\n //remove matching hour record (we know this exists from index earlier)\r\n let hourRecord = clone._header.details[rowNum]?.hours?.splice(hourIndex, 1)?.[0];\r\n\r\n //get numeric hours\r\n let hourRecordHours = (typeof hourRecord.hours === 'string' ? parseFloat(hourRecord.hours) : hourRecord.hours) ?? 0;\r\n\r\n //find matching detail\r\n let existingDetailTicket = clone._header.details.find(\r\n (detail) => detail.jobNumber === jobNumber && detail.earningsType === earningsType && detail.shopJobPartsID === part.id\r\n );\r\n\r\n if (existingDetailTicket) {\r\n //find record for same day on detail\r\n let existingHourRecord = existingDetailTicket.hours.find((hour) => hour.dateOfRecord === hourRecord?.dateOfRecord);\r\n\r\n //if exists, try to merge\r\n if (existingHourRecord) {\r\n let existingHourRecordHours = (typeof existingHourRecord.hours === 'string' ? parseFloat(existingHourRecord.hours) : existingHourRecord.hours) ?? 0;\r\n\r\n //if same part, add hours to existing record\r\n existingHourRecord.hours = existingHourRecordHours + hourRecordHours;\r\n return Promise.resolve(clone);\r\n } else {\r\n //else move hour record\r\n hourRecord.detailId = existingDetailTicket.id;\r\n existingDetailTicket.hours.push(hourRecord);\r\n return Promise.resolve(clone);\r\n }\r\n } //else fallthrough to add new detail ticket\r\n\r\n // add new ticket\r\n let detail = this.emptyDetail();\r\n detail.hours.push(hourRecord);\r\n\r\n detail.headerId = clone._header.id;\r\n detail.jobNumber = jobNumber;\r\n detail.earningsType = earningsType;\r\n detail.shopJobPartsID = part.id;\r\n detail.shopJobParts = part;\r\n\r\n clone._header.details.push(detail);\r\n\r\n return getCostCodesforJob(jobNumber).then((codes) => {\r\n detail.costCodes = codes;\r\n detail.costCode = codes?.[0]?.code ?? 'ALL';\r\n return clone;\r\n });\r\n }\r\n\r\n return Promise.resolve(clone);\r\n }\r\n\r\n updateApprovals(approvalType: 'Accounting' | 'Manager', approvedBy: string | undefined) {\r\n let clone = cloneDeep(this);\r\n if (approvalType === 'Accounting') {\r\n clone._header.accountingApprovedBy = approvedBy;\r\n clone._header.accountingApprovedDate = approvedBy ? new Date() : undefined;\r\n } else if (approvalType === 'Manager') {\r\n clone._header.managerApprovedBy = approvedBy;\r\n clone._header.managerApprovedDate = approvedBy ? new Date() : undefined;\r\n }\r\n return clone;\r\n }\r\n\r\n getApprovals(approvalType: 'Accounting' | 'Manager') {\r\n if (approvalType === 'Accounting') {\r\n return this._header.accountingApprovedBy;\r\n } else if (approvalType === 'Manager') {\r\n return this._header.managerApprovedBy;\r\n } else return false;\r\n }\r\n\r\n //formatted returns\r\n getWeekEndingAsString() {\r\n return getUTCDateString(this._weekEnding);\r\n }\r\n\r\n getHoursAsDays(rowNum: number) {\r\n const timeTicket = this._header.details[rowNum];\r\n let days = this.emptyDays();\r\n\r\n timeTicket?.hours?.forEach((hourRecord) => {\r\n let day: Date | undefined;\r\n\r\n if (typeof hourRecord.dateOfRecord === 'string') day = new Date(Date.parse(hourRecord.dateOfRecord));\r\n else day = hourRecord.dateOfRecord;\r\n\r\n if (day) days[day.getUTCDay()].hours = hourRecord.hours;\r\n });\r\n\r\n return days;\r\n }\r\n\r\n static getHoursForDay(detail: TimeRecordDetail, abbr: string) {\r\n let days = this.emptyDays();\r\n detail?.hours?.forEach((hourRecord) => {\r\n let day: Date | undefined;\r\n\r\n if (typeof hourRecord.dateOfRecord === 'string') day = new Date(Date.parse(hourRecord.dateOfRecord));\r\n else day = hourRecord.dateOfRecord;\r\n\r\n if (day) days[day.getUTCDay()].hours = parseStringNumber(hourRecord.hours);\r\n });\r\n\r\n return days?.find((d) => d.abb === abbr)?.hours;\r\n }\r\n\r\n static getTotalHours(detail: TimeRecordDetail) {\r\n return detail?.hours?.reduce((sum, hourRecord) => sum + parseStringNumber(hourRecord?.hours ?? 0), 0);\r\n }\r\n\r\n getGridTotals() {\r\n let totalDetail = this.emptyDetail();\r\n totalDetail.jobNumber = 'Totals:';\r\n this._header.details?.forEach((detail) => {\r\n detail.hours?.forEach((hourRecord) => {\r\n let day: Date | undefined;\r\n\r\n if (typeof hourRecord.dateOfRecord === 'string') day = new Date(Date.parse(hourRecord.dateOfRecord));\r\n else day = hourRecord.dateOfRecord;\r\n\r\n let newHourRecord = totalDetail.hours.find((a) => Date.parse(a.dateOfRecord?.toString() ?? '') === day?.getTime());\r\n if (!newHourRecord) {\r\n newHourRecord = this.emptyTicketHours();\r\n newHourRecord.dateOfRecord = day;\r\n totalDetail.hours.push(newHourRecord);\r\n }\r\n\r\n newHourRecord.hours = parseStringNumber(hourRecord.hours) + parseStringNumber(newHourRecord.hours);\r\n });\r\n });\r\n\r\n return totalDetail;\r\n }\r\n\r\n getTotalHours() {\r\n return this._header.details?.reduce((total, detail) => {\r\n return (\r\n total +\r\n detail.hours?.reduce((sum, hourRecord) => {\r\n return sum + parseStringNumber(hourRecord.hours);\r\n }, 0)\r\n );\r\n }, 0);\r\n }\r\n\r\n //api calls\r\n getAPITimesheet(token?: CancelToken): Promise {\r\n if (this._employeeInfo && this._weekEnding) {\r\n const promise = getTimesheetForWeekEnding(this._employeeInfo.id, this.getWeekEndingAsString(), token);\r\n return promise\r\n .then((response) => {\r\n let clone = cloneDeep(this) as Timesheet;\r\n if (response.details.length === 0) response.details = [clone.emptyDetail()];\r\n clone.data = response;\r\n return clone;\r\n })\r\n .catch((err) => {\r\n if (err.response) {\r\n if (err.response.status !== 404) return Promise.reject(err);\r\n let clone = cloneDeep(this) as Timesheet;\r\n clone.data = clone.emptyTimesheet();\r\n return Promise.resolve(clone);\r\n } else return Promise.reject(err);\r\n });\r\n } else {\r\n return Promise.reject({\r\n message: 'Timesheet is missing: ' + (this._employeeInfo ? '' : 'Employee Info ') + (this._weekEnding ? '' : 'Week Ending Date'),\r\n });\r\n }\r\n }\r\n\r\n save(validateJob = true, validateCostCode = true, validate = true): Promise {\r\n let clone = cloneDeep(this) as Timesheet;\r\n if (!validate || clone.getErrors(validateJob, validateCostCode).length === 0) {\r\n clone._header.details = clone._header.details.filter((ticket) => {\r\n return !isEqual(ticket, clone.emptyDetail());\r\n });\r\n\r\n if (clone._header.id) {\r\n return putTimesheet(clone.data).then((response) => {\r\n if (response.details.length === 0) response.details = [clone.emptyDetail()];\r\n clone.data = response;\r\n return clone;\r\n });\r\n } else {\r\n return postTimesheet(clone.data).then((response) => {\r\n if (response.details.length === 0) response.details = [clone.emptyDetail()];\r\n clone.data = response;\r\n return clone;\r\n });\r\n }\r\n } else {\r\n return Promise.reject('Timesheet not saved. Fix data errors before saving.');\r\n }\r\n }\r\n\r\n //empty data function versions\r\n emptyTimesheet(): TimeRecordHeader {\r\n return Timesheet.emptyTimesheet(this._dateCreated ?? undefined);\r\n }\r\n\r\n emptyDetail(): TimeRecordDetail {\r\n return Timesheet.emptyDetail(this._dateCreated ?? undefined);\r\n }\r\n\r\n emptyTicketHours(): TimeRecordHours {\r\n return Timesheet.emptyTicketHours(this._dateCreated ?? undefined);\r\n }\r\n\r\n emptyDays() {\r\n return JSON.parse(JSON.stringify(days));\r\n }\r\n\r\n //empty data (static versions)\r\n static emptyTimesheet(date = new Date()): TimeRecordHeader {\r\n return {\r\n id: undefined,\r\n userId: undefined,\r\n user: undefined,\r\n periodEndingDate: undefined,\r\n managerApprovedBy: undefined,\r\n managerApprovedDate: undefined,\r\n accountingApprovedBy: undefined,\r\n accountingApprovedDate: undefined,\r\n lastExportedDate: undefined,\r\n details: [this.emptyDetail(date)],\r\n lastUpdatedBy: undefined,\r\n lastUpdatedDate: undefined,\r\n createdBy: undefined,\r\n createdDate: dateFormat(date, \"yyyy-mm-dd'T'HH:MM:ss\"),\r\n };\r\n }\r\n\r\n static emptyDetail(date = new Date()): TimeRecordDetail {\r\n return {\r\n id: undefined,\r\n headerId: undefined,\r\n jobNumber: undefined,\r\n description: undefined,\r\n skill: undefined,\r\n earningsType: undefined,\r\n costCode: undefined,\r\n shopJobPartsID: undefined,\r\n shopJobParts: undefined,\r\n header: undefined,\r\n hours: [],\r\n costCodes: [],\r\n createdBy: undefined,\r\n isPayable: true,\r\n createdDate: dateFormat(date, \"yyyy-mm-dd'T'HH:MM:ss\"),\r\n lastUpdatedBy: undefined,\r\n lastUpdatedDate: undefined,\r\n };\r\n }\r\n\r\n static emptyTicketHours(date = new Date()): TimeRecordHours {\r\n return {\r\n id: undefined,\r\n detailId: undefined,\r\n dateOfRecord: undefined,\r\n hours: 0,\r\n createdDate: dateFormat(date, \"yyyy-mm-dd'T'HH:MM:ss\"),\r\n createdBy: undefined,\r\n lastUpdatedBy: undefined,\r\n lastUpdatedDate: undefined,\r\n };\r\n }\r\n\r\n static emptyDays() {\r\n return JSON.parse(JSON.stringify(days));\r\n }\r\n}\r\n","import { ExpenseReportDetail, ExpenseReportHeader, getExpensesForWeekEnding, postExpenses, putExpenses } from './ExpensesAPI';\r\nimport { getUTCDateString } from '../../utils/Functions';\r\nimport { cloneDeep, isEqual } from 'lodash';\r\nimport { CYMAJob, getCostCodesforJob } from '../../utils/CYMAAPI';\r\nimport { Employee } from '../../utils/AccountsAPI';\r\nimport { CancelToken } from 'axios';\r\nimport { getWeekEndingDate, parseStringNumber } from '../../utils/TSFunctions';\r\nlet dateFormat = require('dateformat'); //formats dates very well\r\n\r\n/*\r\n Name: ExpenseReport\r\n Author: Tyler Kennedy\r\n Date: 9/24/2020\r\n Purpose: Expene Report Middleware\r\n*/\r\n\r\n/*\r\n------------------------------------------------------\r\n------------------ExpenseReport Class-----------------\r\n------------------------------------------------------\r\n*/\r\n\r\nexport default class ExpenseReport {\r\n _header: ExpenseReportHeader;\r\n _dateCreated: Date;\r\n _weekEnding: Date;\r\n _employeeInfo: Employee;\r\n jobs: CYMAJob[] = [];\r\n schedulerJobs: CYMAJob[] = [];\r\n\r\n constructor(employeeInfo: Employee, weekEnding: Date, jobs: CYMAJob[] = [], schedulerJobs: CYMAJob[] = []) {\r\n this._header = this.emptyExpenseReport();\r\n this._header.periodEndingDate = weekEnding;\r\n this._weekEnding = weekEnding;\r\n this.weekEnding = weekEnding;\r\n this._dateCreated = new Date();\r\n this._employeeInfo = employeeInfo;\r\n this.employeeInfo = employeeInfo;\r\n this.jobs = jobs;\r\n this.schedulerJobs = schedulerJobs;\r\n }\r\n\r\n set weekEnding(weekEnding: Date) {\r\n if (weekEnding !== this._weekEnding) {\r\n this._header.periodEndingDate = weekEnding;\r\n this._weekEnding = getWeekEndingDate(weekEnding);\r\n }\r\n }\r\n\r\n get weekEnding(): Date {\r\n return this._weekEnding;\r\n }\r\n\r\n set employeeInfo(employeeInfo: Employee) {\r\n this._header.userId = employeeInfo.id;\r\n this._employeeInfo = employeeInfo;\r\n }\r\n\r\n get employeeInfo(): Employee {\r\n return this._employeeInfo;\r\n }\r\n\r\n set data(expenseReport) {\r\n expenseReport.userId = expenseReport.userId ?? this._employeeInfo.id;\r\n expenseReport.periodEndingDate = expenseReport.periodEndingDate ?? this.getWeekEndingAsString();\r\n this._header = expenseReport;\r\n }\r\n\r\n get data() {\r\n return this._header;\r\n }\r\n\r\n get header() {\r\n return cloneDeep(this.data);\r\n }\r\n\r\n get locked() {\r\n return this._header.managerApprovedBy || this._header.accountingApprovedBy || this.isExpired ? true : false;\r\n }\r\n\r\n get isExpired() {\r\n return (new Date().getTime() - this._weekEnding?.getTime()) / (1000 * 60 * 60 * 24) > 21;\r\n }\r\n\r\n get isManagerApproved() {\r\n return this._header.managerApprovedBy ? true : false;\r\n }\r\n\r\n get isAccountingApproved() {\r\n return this._header.accountingApprovedBy ? true : false;\r\n }\r\n\r\n get totalExpenses() {\r\n return this._header.details.reduce((sum, d) => sum + (d.expenseAmount ?? 0), 0);\r\n }\r\n\r\n get objType() {\r\n return 'expenses';\r\n }\r\n\r\n get errors() {\r\n return this.getErrors();\r\n }\r\n\r\n getErrors(validateJob = true, validateCostCode = true): string[] {\r\n let errorMessages: string[] = [];\r\n\r\n this._header.details.forEach((detail, i) => {\r\n if (isEqual(detail, this.emptyDetail())) return;\r\n\r\n if (isNaN(detail.expenseAmount ?? NaN) || (detail.expenseAmount ?? 0) <= 0)\r\n errorMessages.push('Invailid Expense Amount [ ' + (detail.expenseAmount ?? 0) + ' ] row: ' + (i + 1));\r\n\r\n if (!detail.jobNumber || detail.jobNumber === '') errorMessages.push('Invalid Job Number [ ' + detail.jobNumber + ' ] row: ' + (i + 1));\r\n\r\n if (!detail.placeOfPurchase || detail.placeOfPurchase === '') errorMessages.push('Merchant Cannot be Empty [ ' + detail.placeOfPurchase + ' ] row: ' + (i + 1));\r\n\r\n if (\r\n (detail?.dateOfPurchase ?? '') > this._weekEnding ||\r\n (this._header.periodEndingDate && (detail?.dateOfPurchase ?? '') > this._header.periodEndingDate) ||\r\n !detail.dateOfPurchase\r\n )\r\n errorMessages.push('Invalid date: [' + getUTCDateString(detail.dateOfPurchase) + ' ] row ' + (i + 1));\r\n\r\n if (this.typesOfExpense().findIndex((types) => types.name === detail.expenseType) === -1)\r\n errorMessages.push('Invalid Expense Type: [' + detail.expenseType + ' ] row ' + (i + 1));\r\n\r\n let job = this.jobs.find((j) => j.jobNumber === detail.jobNumber);\r\n let schedulerJob = this.schedulerJobs.find((j) => j.jobNumber === detail.jobNumber);\r\n let ccFound =\r\n (job?.costCodes?.findIndex((c) => c.code === detail.costCode) ?? -1) > -1 || (schedulerJob?.costCodes?.findIndex((c) => c.code === detail.costCode) ?? -1) > -1;\r\n if (validateCostCode && !ccFound) errorMessages.push('Invalid Cost Code: [' + detail.costCode + '] row ' + (i + 1));\r\n });\r\n\r\n return errorMessages;\r\n }\r\n\r\n static detailHasErrors(detail: ExpenseReportDetail, expense: ExpenseReport): boolean {\r\n return (\r\n !isEqual(detail, this.emptyDetail()) || //empty is no error\r\n isNaN(detail.expenseAmount ?? NaN) || //NaN expense amount\r\n (detail.expenseAmount ?? 0) <= 0 || //negative expense amount\r\n !detail.jobNumber || //no job\r\n detail.jobNumber === '' || //empty job\r\n !detail.placeOfPurchase || //no merchant\r\n detail.placeOfPurchase === '' || //empty merchant\r\n (detail?.dateOfPurchase ?? '') > expense._weekEnding || //future purchase\r\n (expense._header.periodEndingDate && (detail?.dateOfPurchase ?? '') > expense._header.periodEndingDate) || //future purchase\r\n !detail.dateOfPurchase || //no date\r\n this.typesOfExpense().findIndex((types) => types.name === detail.expenseType) === -1 || //not valid type of expense\r\n (detail.costCode !== 'ALL' && !((detail.costCodes?.findIndex((code) => code.code === detail.costCode) ?? -1) > -1)) //bad cost code\r\n );\r\n }\r\n\r\n copy(): ExpenseReport {\r\n return cloneDeep(this);\r\n }\r\n\r\n updateHeader(fieldId: string, value: any): ExpenseReport {\r\n let clone = cloneDeep(this);\r\n if (clone._header[fieldId] !== value) {\r\n clone._header[fieldId] = value;\r\n }\r\n return clone;\r\n }\r\n\r\n newDetail(): ExpenseReport {\r\n let clone = cloneDeep(this);\r\n clone._header.details.push(clone.emptyDetail());\r\n return clone;\r\n }\r\n\r\n withEmptyDetail(): ExpenseReport {\r\n var clone = cloneDeep(this);\r\n var existingIndex = clone._header.details.findIndex((detail) => !detail.id);\r\n if (existingIndex > -1) return clone;\r\n else {\r\n clone._header.details.push(clone.emptyDetail());\r\n return clone;\r\n }\r\n }\r\n\r\n removeDetail(rowNumber: number): ExpenseReport {\r\n let clone = cloneDeep(this);\r\n let header = clone._header;\r\n header.details.splice(rowNumber, 1);\r\n if (header.details.length === 0) {\r\n header.details = [clone.emptyDetail()];\r\n }\r\n return clone;\r\n }\r\n\r\n updateCostCodes(rowNum: number, token?: CancelToken): Promise {\r\n let clone = cloneDeep(this);\r\n let promise: Promise | null = null;\r\n let detail = clone._header.details[rowNum];\r\n\r\n if (detail.jobNumber && detail.jobNumber !== '') {\r\n if (detail.jobNumber !== (detail.costCodes[0] ? detail.costCodes[0].jobNumber : '')) {\r\n let job = clone.jobs?.find((job) => job.jobNumber === detail.jobNumber) ?? clone.schedulerJobs?.find((job) => job.jobNumber === detail.jobNumber);\r\n if ((job?.costCodes?.length ?? 0) > 0) promise = Promise.resolve(job?.costCodes);\r\n else promise = getCostCodesforJob(detail.jobNumber, token);\r\n }\r\n } else {\r\n detail.costCodes = [];\r\n detail.costCode = undefined;\r\n }\r\n\r\n if (promise)\r\n return promise.then((response) => {\r\n let detail = clone._header.details[rowNum];\r\n if (detail) {\r\n detail.costCodes = response;\r\n if (detail.costCodes?.length === 1) detail.costCode = detail.costCodes[0].code;\r\n }\r\n return clone;\r\n });\r\n else {\r\n return Promise.resolve(clone);\r\n }\r\n }\r\n\r\n static updateDetailToNewJob(detail: ExpenseReportDetail, expenseReport: ExpenseReport, jobs?: CYMAJob[]): ExpenseReportDetail {\r\n let clone = cloneDeep(expenseReport);\r\n\r\n //if valid job number\r\n if (detail.jobNumber && detail.jobNumber !== '') {\r\n if (detail.jobNumber !== (detail.costCodes[0] ? detail.costCodes[0].jobNumber : '')) {\r\n let job = (jobs ?? clone.jobs)?.find((job) => job.jobNumber === detail.jobNumber) ?? clone.schedulerJobs?.find((job) => job.jobNumber === detail.jobNumber);\r\n detail.costCodes = job?.costCodes ?? [];\r\n if (detail.costCodes?.length === 1) detail.costCode = detail.costCodes[0]?.code;\r\n else detail.costCode = undefined;\r\n }\r\n } else {\r\n detail.costCodes = [];\r\n detail.costCode = undefined;\r\n }\r\n return detail;\r\n }\r\n\r\n // used to be updateReportDetail\r\n updateField(rowNum: number, fieldId: string, newValue: any, token?: CancelToken): Promise {\r\n let clone = cloneDeep(this);\r\n const value = newValue || '';\r\n\r\n //no update\r\n if (clone._header.details[rowNum][fieldId] === value) {\r\n return Promise.resolve(clone);\r\n }\r\n\r\n clone._header.details[rowNum][fieldId] = value;\r\n\r\n if (fieldId === 'jobNumber') {\r\n return clone.updateCostCodes(rowNum, token);\r\n } else if (fieldId === 'expenseAmount') {\r\n let valueForTest = newValue;\r\n valueForTest = valueForTest.replace('$', '');\r\n if (isNaN(valueForTest) || valueForTest === null) {\r\n //could need more error checking isNaN\r\n valueForTest = 0;\r\n } else {\r\n valueForTest = parseStringNumber(valueForTest);\r\n }\r\n\r\n clone._header.details[rowNum][fieldId] = valueForTest; //may not be needed\r\n\r\n return Promise.resolve(clone);\r\n } else {\r\n return Promise.resolve(clone);\r\n }\r\n }\r\n\r\n updateApprovals(approvalType: 'Accounting' | 'Manager', approvedBy: string | undefined) {\r\n let clone = cloneDeep(this);\r\n if (approvalType === 'Accounting') {\r\n clone._header.accountingApprovedBy = approvedBy;\r\n clone._header.accountingApprovedDate = approvedBy ? new Date() : undefined;\r\n } else if (approvalType === 'Manager') {\r\n clone._header.managerApprovedBy = approvedBy;\r\n clone._header.managerApprovedDate = approvedBy ? new Date() : undefined;\r\n }\r\n return clone;\r\n }\r\n\r\n getApprovals(approvalType: 'Accounting' | 'Manager') {\r\n if (approvalType === 'Accounting') {\r\n return this._header.accountingApprovedBy;\r\n } else if (approvalType === 'Manager') {\r\n return this._header.managerApprovedBy;\r\n } else return false;\r\n }\r\n\r\n //formated returns\r\n getWeekEndingAsString() {\r\n return getUTCDateString(this._weekEnding);\r\n }\r\n\r\n getGridTotals() {\r\n let totalDetail = this.emptyDetail();\r\n totalDetail.dateOfPurchase = 'Totals:';\r\n totalDetail.expenseAmount = this._header.details?.reduce((sum, detail) => sum + (detail.expenseAmount ?? 0), 0);\r\n return totalDetail;\r\n }\r\n\r\n getTotalExpenses() {\r\n return this._header.details?.reduce((sum, detail) => sum + (detail.expenseAmount ?? 0), 0);\r\n }\r\n\r\n //API CALLS\r\n getAPIExpenseReport(token?: CancelToken): Promise {\r\n if (this._employeeInfo && this._weekEnding) {\r\n const promise = getExpensesForWeekEnding(this.employeeInfo.id, this.getWeekEndingAsString(), token);\r\n return promise\r\n .then((response) => {\r\n let clone = cloneDeep(this);\r\n if (response.details.length === 0) {\r\n response.details = [clone.emptyDetail()];\r\n }\r\n clone.data = response;\r\n return clone;\r\n })\r\n .catch((err) => {\r\n let clone = cloneDeep(this);\r\n if (err?.response?.status !== 404) {\r\n throw err;\r\n }\r\n\r\n clone.data = clone.emptyExpenseReport();\r\n return Promise.resolve(clone);\r\n });\r\n } else {\r\n return Promise.reject('Expense Report is missing' + (this.employeeInfo ? '' : 'Employee Info') + (this._weekEnding ? '' : 'Week Ending Data'));\r\n }\r\n }\r\n\r\n save(validateJob = true, validateCostCode = true, validate = true): Promise {\r\n let clone = cloneDeep(this);\r\n clone.data.details = clone.data.details.filter((detail) => {\r\n return !isEqual(detail, clone.emptyDetail());\r\n });\r\n if (!validate || clone.getErrors(validateJob, validateCostCode).length === 0) {\r\n if (clone.data.id) {\r\n return putExpenses(clone.data).then((response) => {\r\n clone.data = response;\r\n if (clone.data.details.length === 0) clone.data.details = [clone.emptyDetail()];\r\n return clone;\r\n });\r\n } else {\r\n return postExpenses(clone.data).then((response) => {\r\n clone.data = response;\r\n if (clone.data.details.length === 0) clone.data.details = [clone.emptyDetail()];\r\n return clone;\r\n });\r\n }\r\n } else {\r\n return Promise.reject('Expense report not saved. Fix data errors before saving.');\r\n }\r\n }\r\n\r\n //empty Data\r\n emptyExpenseReport(): ExpenseReportHeader {\r\n return ExpenseReport.emptyExpenseReport(this._dateCreated ?? undefined);\r\n }\r\n\r\n emptyDetail() {\r\n return ExpenseReport.emptyDetail(this._dateCreated ?? undefined);\r\n }\r\n\r\n typesOfExpense() {\r\n return ExpenseReport.typesOfExpense();\r\n }\r\n\r\n //static versions of functions\r\n static emptyExpenseReport(date = new Date()): ExpenseReportHeader {\r\n return {\r\n id: undefined,\r\n userId: undefined,\r\n user: undefined,\r\n periodEndingDate: undefined,\r\n managerApprovedBy: undefined,\r\n managerApprovedDate: undefined,\r\n accountingApprovedBy: undefined,\r\n accountingApprovedDate: undefined,\r\n lastExportedDate: undefined,\r\n details: [this.emptyDetail(date)],\r\n lastUpdatedBy: undefined,\r\n lastUpdatedDate: undefined,\r\n createdBy: undefined,\r\n createdDate: dateFormat(date, \"yyyy-mm-dd'T'HH:MM:ss\"),\r\n };\r\n }\r\n\r\n static emptyDetail(date = new Date()): ExpenseReportDetail {\r\n return {\r\n id: undefined,\r\n headerId: undefined,\r\n dateOfPurchase: undefined,\r\n placeOfPurchase: undefined,\r\n expenseType: undefined,\r\n expenseAmount: undefined,\r\n jobNumber: undefined,\r\n costCode: undefined,\r\n costCodes: [],\r\n comments: undefined,\r\n header: undefined,\r\n files: [],\r\n lastUpdatedBy: undefined,\r\n lastUpdatedDate: undefined,\r\n createdBy: undefined,\r\n isPayable: true,\r\n createdDate: dateFormat(date, \"yyyy-mm-dd'T'HH:MM:ss\"),\r\n };\r\n }\r\n\r\n static typesOfExpense() {\r\n return [\r\n {\r\n name: 'Airfare',\r\n },\r\n {\r\n name: 'Rental Car',\r\n },\r\n {\r\n name: 'Fuel',\r\n },\r\n {\r\n name: 'Lodging',\r\n },\r\n {\r\n name: 'Meals',\r\n },\r\n {\r\n name: 'Mileage',\r\n },\r\n {\r\n name: 'Boot Reimbursment',\r\n },\r\n {\r\n name: 'Reimb. Exp. on Top',\r\n },\r\n {\r\n name: 'Travel',\r\n },\r\n {\r\n name: 'Medical Reimbursment',\r\n },\r\n {\r\n name: 'Insurance',\r\n },\r\n {\r\n name: 'Other',\r\n },\r\n ];\r\n }\r\n}\r\n","import { Employee } from '../utils/AccountsAPI';\r\nimport { createContext } from 'react';\r\n\r\nexport const UsersContext = createContext<[Employee[], Function, Function]>([[], () => {}, () => {}]);\r\n\r\nexport default UsersContext;\r\n","//https://dev.to/dmtrkovalenko/the-neatest-way-to-handle-alert-dialogs-in-react-1aoe\r\n\r\nimport React from 'react';\r\nimport { ConfirmationDialog } from '../components/ConfirmDialog';\r\n\r\nexport enum CONFIRM_TYPES {\r\n confirm,\r\n yesno,\r\n yesnocancel,\r\n}\r\nexport interface ConfirmationOptions {\r\n catchOnCancel?: boolean;\r\n type?: CONFIRM_TYPES;\r\n variant?: 'danger' | 'info';\r\n title: string;\r\n description: string;\r\n}\r\n\r\n// we will pass the opening dialog function directly to consumers\r\nexport const ConfirmationServiceContext = React.createContext<(options: ConfirmationOptions | string) => Promise>(Promise.reject);\r\n\r\nexport const ConfirmationServiceProvider = ({ children, theme }) => {\r\n const [confirm, setConfirm] = React.useState(null);\r\n\r\n const awaitingPromiseRef = React.useRef<{\r\n resolve: (a?: boolean) => void;\r\n reject: (a?: boolean) => void;\r\n }>();\r\n\r\n const openConfirmation = (options: ConfirmationOptions | string) => {\r\n if (typeof options === 'string') {\r\n setConfirm({ title: 'Confirm', description: options });\r\n } else {\r\n setConfirm(options);\r\n }\r\n return new Promise((resolve, reject) => {\r\n awaitingPromiseRef.current = { resolve, reject };\r\n });\r\n };\r\n\r\n const handleClose = () => {\r\n if (confirm?.catchOnCancel && awaitingPromiseRef.current) {\r\n awaitingPromiseRef.current.reject();\r\n }\r\n\r\n setConfirm(null);\r\n };\r\n\r\n const handleSubmit = (response) => {\r\n if (awaitingPromiseRef.current) {\r\n awaitingPromiseRef.current.resolve(response);\r\n }\r\n\r\n setConfirm(null);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Button, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, ThemeProvider } from '@material-ui/core';\r\nimport { CONFIRM_TYPES } from '../contexts/ConfirmContext';\r\n\r\nexport const ConfirmationDialog = ({ open, title = '', variant = '', description = '', type = CONFIRM_TYPES.confirm, onSubmit, onClose, theme }) => {\r\n const confirm = (\r\n \r\n );\r\n const yes = (\r\n \r\n );\r\n const no = (\r\n \r\n );\r\n const cancel = (\r\n \r\n );\r\n\r\n var buttons: any[] = [];\r\n switch (type) {\r\n case CONFIRM_TYPES.yesnocancel:\r\n buttons = [yes, no, cancel];\r\n break;\r\n case CONFIRM_TYPES.yesno:\r\n buttons = [yes, no];\r\n break;\r\n case CONFIRM_TYPES.confirm:\r\n default:\r\n buttons = [confirm, cancel];\r\n break;\r\n }\r\n\r\n return (\r\n \r\n \r\n {title}\r\n \r\n {description.split('\\n').map((desc, i) => (\r\n {desc}\r\n ))}\r\n \r\n {buttons}\r\n \r\n \r\n );\r\n};\r\n","import { useState, useRef, useEffect, MutableRefObject, SetStateAction, Dispatch } from 'react';\r\n\r\nexport function useStateRef(originalValue: T): [T, Dispatch>, MutableRefObject] {\r\n const [state, setState] = useState(originalValue);\r\n const ref = useRef(originalValue);\r\n\r\n useEffect(() => {\r\n ref.current = state;\r\n }, [state]);\r\n\r\n return [state, setState, ref];\r\n}\r\n","import dateFormat from 'dateformat';\r\nimport { cloneDeep } from 'lodash';\r\nimport { MutableRefObject } from 'react';\r\nimport { EarningsType } from './CYMAAPI';\r\n\r\nexport function parseStringNumber(input: string | number = 0): number {\r\n return typeof input === 'number' ? input : parseFloat(input);\r\n}\r\n\r\nexport function getUTCDate(date: Date | string): Date {\r\n const cDate = typeof date === 'string' ? new Date(Date.parse(date)) : date;\r\n return new Date(Date.UTC(cDate.getUTCFullYear(), cDate.getUTCMonth(), cDate.getUTCDate()));\r\n}\r\n\r\nexport function getWeekEndingDate(date: Date | string): Date {\r\n const utcDate = getUTCDate(date);\r\n return new Date(utcDate?.setDate(utcDate?.getDate() + (6 - utcDate?.getUTCDay())));\r\n}\r\n\r\nexport function roundToDigit(value: string | number, digits: number = 0): number {\r\n let n: number;\r\n if (typeof value === 'string') {\r\n n = parseFloat(value);\r\n } else if (typeof value === 'number') {\r\n n = value;\r\n } else return NaN;\r\n\r\n var multiplicator = Math.pow(10, digits);\r\n let rounded = (Math.round((n + Number.EPSILON) * multiplicator) / multiplicator).toFixed(digits);\r\n\r\n return parseFloat(rounded);\r\n}\r\n\r\nexport const dateFormatter =\r\n (format = 'mm/dd/yyyy') =>\r\n (params) => {\r\n var dateParsed = new Date(Date.parse(params.value));\r\n return params.value !== undefined && params.value !== null && params.value !== '' && dateParsed && !isNaN(dateParsed.valueOf())\r\n ? dateFormat(dateParsed, format)\r\n : params.value;\r\n };\r\n\r\nexport const decimalFormatter =\r\n (decimals = 2) =>\r\n (params) => {\r\n return params.value !== undefined && params.value !== null && params.value !== '' ? formatNumber(params.value, decimals) : params.value;\r\n };\r\n\r\nexport function currencyFormatter(params) {\r\n return params.value !== undefined && params.value !== null && params.value !== '' ? (params.value ? '$' : '') + formatNumber(params.value) : params.value;\r\n}\r\n\r\nexport function formatCurrency(value) {\r\n return value !== undefined && value !== null && value !== '' ? (value !== undefined ? '$' : '') + formatNumber(value) : value;\r\n}\r\n\r\nexport function formatNumber(number?: number | string, decimals: number = 2): string {\r\n return number !== undefined\r\n ? parseStringNumber(number)\r\n .toFixed(decimals)\r\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')\r\n : '';\r\n}\r\n\r\nexport function getUnique(a: (string | number)[]): (string | number)[] {\r\n var seen = {};\r\n return a.filter((item) => {\r\n return seen.hasOwnProperty(item) ? false : (seen[item] = true);\r\n });\r\n}\r\n\r\nexport function getUniqueObj(a: T[], getId: (obj: T) => string): T[] {\r\n var seen = {};\r\n return a.filter((item) => {\r\n return seen.hasOwnProperty(getId(item)) ? false : (seen[getId(item)] = true);\r\n });\r\n}\r\n\r\nexport function partition(arr: T[], isValid: (elem: T) => boolean) {\r\n return arr.reduce(([pass, fail], elem) => (isValid(elem) ? [[...pass, elem], fail] : [pass, [...fail, elem]]), [[] as T[], [] as T[]]);\r\n}\r\n\r\nexport function unCamelCase(str: string | undefined): string | undefined {\r\n return (\r\n str // insert a space before all single caps\r\n ?.replace(/([A-Z][a-z])/g, ' $1')\r\n // uppercase the first character\r\n .replace(/^./, function (str) {\r\n return str.toUpperCase();\r\n })\r\n );\r\n}\r\n\r\nexport function merge(elem: T, arr: T[], key: string | ((e: T) => any) = 'id', cloneArr: boolean = true): T[] {\r\n let clone = cloneArr ? cloneDeep(arr) : arr;\r\n const getKey = (e) => (typeof key === 'string' ? e?.[key] : key(e));\r\n let index = clone.findIndex((c) => getKey(c) === getKey(elem));\r\n if (index > -1) clone.splice(index, 1, elem);\r\n else clone.push(elem);\r\n return clone;\r\n}\r\n\r\nexport function remove(elem: T, arr: T[], key: string | ((e: T) => any) = 'id', cloneArr: boolean = true): T[] {\r\n let clone = cloneArr ? cloneDeep(arr) : arr;\r\n const getKey = (e) => (typeof key === 'string' ? e?.[key] : key(e));\r\n let index = clone.findIndex((c) => getKey(c) === getKey(elem));\r\n if (index > -1) clone.splice(index, 1);\r\n return clone;\r\n}\r\n\r\nexport const combinedRef = (refs: (MutableRefObject | ((instance: HTMLDivElement | null) => void))[]) => (e) => {\r\n refs.forEach((ref) => {\r\n if (typeof ref === 'function') {\r\n ref(e);\r\n } else if (ref) {\r\n ref.current = e;\r\n }\r\n });\r\n};\r\n\r\nexport const isUUID = (val: string) => {\r\n return val.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i) !== null;\r\n};\r\n\r\nexport function isNumeric(str: string | number) {\r\n return (\r\n !isNaN(str as unknown as number) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...\r\n !isNaN(parseStringNumber(str))\r\n ); // ...and ensure strings of whitespace fail\r\n}\r\n\r\nexport const sortEarningsTypes = (et: EarningsType[]): EarningsType[] => {\r\n return et.sort((a, b) => {\r\n if (a.shortName === b.shortName) return 0;\r\n // note the + converts a boolean to a number (1 or 0)\r\n return (\r\n +(b.shortName === 'Reg Hours') - +(a.shortName === 'Reg Hours') || +b.shortName.includes('OT') - +a.shortName.includes('OT') || b.shortName.localeCompare(a.shortName)\r\n );\r\n });\r\n};\r\n","import { IconButton, ListSubheader, makeStyles, TextField, Tooltip, useMediaQuery, useTheme, TextFieldProps } from '@material-ui/core';\r\nimport { Delete, Edit, Search, Event, Flag, FlagOutlined } from '@material-ui/icons';\r\nimport { Autocomplete, AutocompleteProps } from '@material-ui/lab';\r\nimport React from 'react';\r\nimport { ListChildComponentProps, VariableSizeList } from 'react-window';\r\nimport clsx from 'clsx';\r\nimport { useIsMobile } from '../hooks/useIsMobile';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n listboxComponent: {},\r\n tooltip: {\r\n backgroundColor: theme.palette.background.paper,\r\n border: '2px solid black',\r\n },\r\n list: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n },\r\n listItem: {\r\n width: '100%',\r\n display: 'inline-flex',\r\n },\r\n listItemStatus: {\r\n padding: theme.spacing(1),\r\n paddingRight: 0,\r\n paddingLeft: theme.spacing(2),\r\n width: '100%',\r\n display: 'grid',\r\n gridTemplateColumns: '20% 30% 10% 40%',\r\n },\r\n listItemLabel: {\r\n padding: '4px 0',\r\n },\r\n listItemField: {\r\n margin: 'auto',\r\n marginRight: 2,\r\n textAlign: 'left',\r\n },\r\n listIcon: {\r\n margin: 'auto',\r\n marginRight: 0,\r\n color: theme.palette.grey[500],\r\n },\r\n searchTextField: {\r\n width: '100%',\r\n },\r\n dontRotate: {\r\n transform: 'none',\r\n color: theme.palette.primary.main,\r\n },\r\n listbox: {\r\n minHeight: '200px',\r\n overflowX: 'hidden !important' as 'hidden',\r\n },\r\n listItemText: {\r\n display: 'inline-flex',\r\n flex: '1 1 auto',\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n listItemTitle: {\r\n margin: 'auto',\r\n marginLeft: 0,\r\n fontWeight: 'bold',\r\n display: 'flex',\r\n whiteSpace: 'nowrap',\r\n fontSize: '1em',\r\n },\r\n listItemContent: {\r\n margin: 'auto',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n paddingLeft: '10px',\r\n textAlign: 'left',\r\n width: '100%',\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: '.8em',\r\n },\r\n },\r\n listItemActions: {\r\n display: 'inline-flex',\r\n fontSize: '1.25em',\r\n marginLeft: 'auto',\r\n flex: '0 0 auto',\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: '1em',\r\n },\r\n },\r\n listItemAction: {\r\n fontSize: 'inherit',\r\n },\r\n stacked: {\r\n flexDirection: 'column',\r\n },\r\n}));\r\n\r\nexport interface IGenericAutocomplete\r\n extends Partial> {\r\n label?: string;\r\n filterFields?: string[];\r\n idField?: string | ((option: T, value: T) => boolean);\r\n labelField?: string | ((option: T) => string);\r\n titleField?: string;\r\n contentField?: string;\r\n deletable?: boolean;\r\n editable?: boolean;\r\n onDelete?: (option: T) => void;\r\n onEdit?: (option: T) => void;\r\n variant?: 'filled' | 'outlined' | 'standard' | undefined;\r\n suggestNew?: boolean;\r\n getNewSuggestion?: (inputVal: string) => T;\r\n showNewSuggestion?: 'top' | 'bottom';\r\n onlyShowSuggestionIfEmpty?: boolean;\r\n newSuggestionText?: (text: string) => string;\r\n inputRef?: any;\r\n minWidth?: number;\r\n stacked?: boolean;\r\n multiple?: Multiple;\r\n freeSolo?: FreeSolo;\r\n disableClearable?: DisableClearable;\r\n noContent?: boolean;\r\n placeholder?: string;\r\n TextFieldProps?: TextFieldProps;\r\n}\r\n\r\nexport function GenericAutocomplete<\r\n T,\r\n Multiple extends boolean | undefined = undefined,\r\n DisableClearable extends boolean | undefined = undefined,\r\n FreeSolo extends boolean | undefined = undefined\r\n>({\r\n label,\r\n filterFields,\r\n options,\r\n idField = 'id',\r\n labelField,\r\n titleField: _titleField,\r\n contentField = 'description',\r\n deletable = false,\r\n editable = false,\r\n onDelete,\r\n onEdit,\r\n variant = 'outlined',\r\n suggestNew = false,\r\n getNewSuggestion,\r\n showNewSuggestion = 'bottom',\r\n newSuggestionText = (text) => `Add \"${text}\"`,\r\n inputRef,\r\n onlyShowSuggestionIfEmpty = false,\r\n minWidth,\r\n stacked = false,\r\n noContent = false,\r\n placeholder,\r\n TextFieldProps,\r\n ...props\r\n}: IGenericAutocomplete) {\r\n const classes = useStyles();\r\n const isMobile = useIsMobile();\r\n\r\n stacked = stacked || isMobile;\r\n labelField = labelField ?? _titleField ?? 'name';\r\n\r\n let titleField: string = _titleField ? _titleField : typeof labelField === 'string' ? labelField : 'name';\r\n\r\n const handleDelete = (option) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onDelete?.(option);\r\n };\r\n\r\n const handleEdit = (option) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onEdit?.(option);\r\n };\r\n\r\n return (\r\n {\r\n const inputValue = state.inputValue === '' ? props?.inputValue : state.inputValue;\r\n const value = inputValue?.toLowerCase();\r\n const empty = !inputValue || inputValue === '';\r\n\r\n if (empty) return options ?? [];\r\n\r\n const fields = filterFields ?? [idField, titleField, contentField];\r\n if (typeof labelField === 'string' && titleField !== labelField) fields.push(labelField);\r\n\r\n const filtered =\r\n options?.filter((option) => {\r\n return fields.filter((field) => (typeof field === 'string' ? option?.[field] : field(option, value))?.toLowerCase?.()?.indexOf(value) > -1)?.length > 0;\r\n }) ?? [];\r\n\r\n // Suggest the creation of a new value\r\n if (getNewSuggestion && value !== '' && (!onlyShowSuggestionIfEmpty || filtered.length === 0)) {\r\n let sugg = getNewSuggestion(inputValue);\r\n sugg['__isNewSuggestion'] = true;\r\n if (showNewSuggestion === 'top') filtered.unshift(sugg);\r\n else filtered.push(sugg);\r\n }\r\n\r\n return filtered;\r\n }}\r\n getOptionLabel={typeof labelField === 'string' ? (option: any) => option?.[labelField as string] ?? '' : labelField}\r\n getOptionSelected={typeof idField === 'string' ? (option: T, value: T) => option?.[idField] === value?.[idField] : idField}\r\n ListboxComponent={ListboxComponent as React.ComponentType>}\r\n renderOption={(option: any) => {\r\n if (!option) return null;\r\n return (\r\n \r\n
\r\n {!option['__isNewSuggestion'] ? (\r\n <>\r\n
\r\n
\r\n {option[titleField]}\r\n
\r\n {noContent ? null : (\r\n
\r\n {option[contentField]}\r\n
\r\n )}\r\n
\r\n {editable || deletable || option?.['isSchedule'] || option?.['isFlagged'] ? (\r\n
\r\n {option?.['isFlagged'] !== undefined ? (\r\n option?.['isFlagged'] ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : null}\r\n {option?.['isSchedule'] ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {editable ? (\r\n \r\n \r\n \r\n ) : null}\r\n {deletable ? (\r\n \r\n \r\n \r\n ) : null}\r\n
\r\n ) : null}\r\n \r\n ) : (\r\n newSuggestionText(option[titleField])\r\n )}\r\n
\r\n \r\n );\r\n }}\r\n renderInput={(params) => {\r\n const refFunc = (e) => {\r\n params.inputProps['ref'].current = e;\r\n if (inputRef) inputRef.current = e;\r\n };\r\n return (\r\n \r\n );\r\n }}\r\n autoComplete\r\n fullWidth\r\n classes={{ popupIndicatorOpen: classes.dontRotate, listbox: classes.listbox }}\r\n popupIcon={}\r\n options={options ?? []}\r\n limitTags={2}\r\n ListboxProps={{ rows: 1 + (stacked ? 1 : 0) }}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\n//https://material-ui.com/components/autocomplete/#virtualization\r\n\r\nconst LISTBOX_PADDING = 8; // px\r\n\r\nfunction renderRow(props: ListChildComponentProps) {\r\n const { data, index, style } = props;\r\n return React.cloneElement(data[index], {\r\n style: {\r\n ...style,\r\n top: (style.top as number) + LISTBOX_PADDING,\r\n },\r\n });\r\n}\r\n\r\nconst OuterElementContext = React.createContext({});\r\n\r\nconst OuterElementType = React.forwardRef((props, ref) => {\r\n const outerProps = React.useContext(OuterElementContext);\r\n return
;\r\n});\r\n\r\nfunction useResetCache(data: any) {\r\n const ref = React.useRef(null);\r\n React.useEffect(() => {\r\n if (ref.current != null) {\r\n ref.current.resetAfterIndex(0, true);\r\n }\r\n }, [data]);\r\n return ref;\r\n}\r\n\r\n// Adapter for react-window\r\nconst ListboxComponent = React.forwardRef(function ListboxComponent(props, ref) {\r\n const { children, ...other } = props as any;\r\n const rows = other?.rows ?? 1;\r\n const classes = useStyles();\r\n const itemData = React.Children.toArray(children);\r\n const theme = useTheme();\r\n const smUp = useMediaQuery(theme.breakpoints.up('sm'), { noSsr: true });\r\n const itemCount = itemData.length;\r\n const itemSize = rows * (smUp ? 30 : 36);\r\n\r\n const getChildSize = (child: React.ReactNode) => {\r\n if (React.isValidElement(child) && child.type === ListSubheader) {\r\n return 48;\r\n }\r\n\r\n return itemSize;\r\n };\r\n\r\n const getHeight = () => {\r\n if (itemCount > 8) {\r\n return 8 * itemSize;\r\n }\r\n return itemData.map(getChildSize).reduce((a, b) => a + b, 0);\r\n };\r\n\r\n const gridRef = useResetCache(itemCount);\r\n\r\n return (\r\n
\r\n \r\n getChildSize(itemData[index])}\r\n overscanCount={5}\r\n itemCount={itemCount}\r\n >\r\n {renderRow}\r\n \r\n \r\n
\r\n );\r\n});\r\n","import { useContext } from 'react';\r\nimport EmployeeInfoContext from '../contexts/EmployeeInfoContext';\r\n\r\nexport const useLoggedInUser = () => useContext(EmployeeInfoContext);\r\n","import React from 'react';\r\nimport { Employee } from '../utils/AccountsAPI';\r\nimport { GenericAutocomplete, IGenericAutocomplete } from './GenericAutocomplete';\r\n\r\ninterface IUserAutocomplete<\r\n Multiple extends boolean | undefined = undefined,\r\n DisableClearable extends boolean | undefined = undefined,\r\n FreeSolo extends boolean | undefined = undefined\r\n> extends IGenericAutocomplete {\r\n label?: string;\r\n TextFieldProps?: any;\r\n}\r\n\r\nexport function UserAutocomplete<\r\n Multiple extends boolean | undefined = undefined,\r\n DisableClearable extends boolean | undefined = undefined,\r\n FreeSolo extends boolean | undefined = undefined\r\n>(props: IUserAutocomplete) {\r\n return (\r\n \r\n );\r\n}\r\n","import { useMediaQuery, useTheme } from '@material-ui/core';\r\n\r\nexport const useIsMobile = () => {\r\n const theme = useTheme();\r\n return useMediaQuery(theme.breakpoints.down('sm'));\r\n};\r\n","import { useContext } from 'react';\r\nimport UsersContext from '../contexts/UsersContext';\r\n\r\nexport const useUsersContext = () => useContext(UsersContext);\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ArrowForwardIos } from '@material-ui/icons';\r\nimport { addDays, getUTCDateString } from '../utils/Functions';\r\nimport { TextField, makeStyles, IconButton } from '@material-ui/core';\r\nimport { getUTCDate, getWeekEndingDate } from '../utils/TSFunctions';\r\nimport clsx from 'clsx';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n textField: {},\r\n input: {\r\n color: 'inherit',\r\n textAlign: 'center',\r\n margin: 'auto',\r\n verticalAlign: 'middle',\r\n width: 'auto',\r\n },\r\n icon: {\r\n fontSize: '25px',\r\n padding: theme.spacing(1),\r\n color: 'inherit',\r\n },\r\n datePickerContainer: {\r\n margin: 'auto',\r\n boxSizing: 'border-box',\r\n },\r\n dateInput: {\r\n padding: '0 ' + theme.spacing(1) + 'px',\r\n color: 'inherit',\r\n },\r\n dense: {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n fullWidth: {\r\n width: '100%',\r\n display: 'flex',\r\n },\r\n}));\r\n\r\nexport interface DateChangerProps {\r\n parentDate: Date;\r\n onChange: Function;\r\n weekEnding?: boolean;\r\n format?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n dense?: boolean;\r\n fullWidth?: boolean;\r\n}\r\n\r\nexport default function DateChanger({ dense = false, fullWidth = false, parentDate, onChange, weekEnding = true, format, className, disabled = false }: DateChangerProps) {\r\n const classes = useStyles();\r\n const [date, setDate] = useState(weekEnding ? getWeekEndingDate(parentDate) : parentDate);\r\n const dateValue = date.valueOf();\r\n const parentDateValue = parentDate.valueOf();\r\n\r\n const calendarChange = (event) => {\r\n let value = event.target.value;\r\n let parsed = Date.parse(value);\r\n let parsedDate;\r\n if (isNaN(parsed)) parsedDate = new Date();\r\n else parsedDate = new Date(parsed);\r\n\r\n parsedDate = weekEnding ? getWeekEndingDate(parsedDate) : parsedDate;\r\n setDate(getUTCDate(parsedDate));\r\n };\r\n\r\n // Moves Date to previous week\r\n const backWeek = (event) => {\r\n setDate((date) => {\r\n return getUTCDate(addDays(date, -7));\r\n });\r\n };\r\n\r\n // Moves Date to next week\r\n const forwardWeek = (event) => {\r\n setDate((date) => getUTCDate(addDays(date, 7)));\r\n };\r\n\r\n useEffect(() => {\r\n if (dateValue !== parentDateValue) {\r\n onChange(new Date(dateValue));\r\n }\r\n }, [dateValue, parentDateValue, onChange]);\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","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport { useEffect } from 'react';\r\n\r\nexport default function useMountEffectDefault(fun) {\r\n useEffect(fun, []);\r\n}\r\nexport function useMountEffect(fun) {\r\n useEffect(fun, []);\r\n}\r\n","import { CancelToken } from 'axios';\r\nimport { Employee, User } from '../../utils/AccountsAPI';\r\nimport { CreatedUpdatedTable } from '../../utils/APIReturnTypes';\r\nimport AxiosConfig from '../../utils/AxiosConfig';\r\nimport { getUTCDateString, addDays } from '../../utils/Functions';\r\nimport { FileUploads } from '../files/FileAPI';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*----------------------------------Credit Cards------------------------------------------*/\r\n\r\n// Assignments\r\nexport function getAllCardAssignments(token?: CancelToken): Promise {\r\n const url = '/company/cards/assignments';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getCardAssignmentForUser(employeeNumber: string, token?: CancelToken): Promise {\r\n const url = '/company/cards/assignments/' + employeeNumber;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putCardAssignmentForUser(employeeNumber: string, assignment: CreditCardAssignment): Promise {\r\n const url = '/company/cards/assignments/' + employeeNumber;\r\n\r\n return axiosInstance.put(url, assignment).then((response) => response.data);\r\n}\r\n\r\nexport function postCardAssignment(assignment): Promise {\r\n const url = '/company/cards/assignments';\r\n\r\n return axiosInstance.post(url, assignment).then((response) => response.data);\r\n}\r\n\r\nexport function deleteCardAssignment(id: string): Promise {\r\n const url = '/company/cards/assignments/' + id;\r\n\r\n return axiosInstance.delete(url);\r\n}\r\n\r\n// Transactions\r\nexport function getAllCardTransactions(token?: CancelToken): Promise {\r\n const url = '/company/cards/transactions';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getCardTransactions(beginDate?: Date, endDate?: Date, token?: CancelToken): Promise {\r\n var url = '/company/cards/transactions';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n if (beginDate || endDate) {\r\n url = url + '?';\r\n }\r\n\r\n if (beginDate) {\r\n url = url + 'begindate=' + getUTCDateString(beginDate);\r\n }\r\n\r\n if (endDate) {\r\n if (beginDate) {\r\n url = url + '&';\r\n }\r\n url = url + 'enddate=' + getUTCDateString(endDate);\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getCardTransaction(id: string, token?: CancelToken): Promise {\r\n const url = '/company/cards/transactions/' + id;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putCardTransaction(id: string, transaction: CreditCardTransaction): Promise {\r\n const url = '/company/cards/transactions/' + id;\r\n\r\n return axiosInstance.put(url, transaction).then((response) => response.data);\r\n}\r\n\r\nexport function postCardTransaction(transaction: CreditCardTransaction): Promise {\r\n const url = '/company/cards/transactions';\r\n\r\n return axiosInstance.post(url, transaction).then((response) => response.data);\r\n}\r\n\r\nexport function postCardTransactions(transactions: CreditCardTransaction[]): Promise {\r\n const url = '/company/cards/transactions/bulk';\r\n\r\n return axiosInstance.post(url, transactions).then((response) => response.data);\r\n}\r\n\r\nexport function deleteCardTransaction(id: string): Promise {\r\n const url = '/company/cards/transactions/' + id;\r\n\r\n return axiosInstance.delete(url);\r\n}\r\n\r\n// Transaction Assignments\r\nexport function getCardTransactionAssignments(token?: CancelToken): Promise {\r\n const url = '/company/cards/transactions/assignments';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getCardTransactionAssignment(id: string, token?: CancelToken): Promise {\r\n const url = '/company/cards/transactions/assignments/' + id;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putAssignmentsForTransaction(transactionId: string, assignments: CreditCardTransactionAssignment[]): Promise {\r\n const url = '/company/cards/transactions/' + transactionId + '/assignments';\r\n\r\n return axiosInstance.put(url, assignments).then((response) => response.data);\r\n}\r\n\r\nexport function deleteCardTransactionAssignment(id: string): Promise {\r\n const url = '/company/cards/transactions/assignments/' + id;\r\n\r\n return axiosInstance.delete(url);\r\n}\r\n\r\nexport function putManagerApprovals(id: string, approved: boolean): Promise {\r\n var url = '/company/cards/transactions/assignments/' + id + '/managerapproval/' + approved;\r\n\r\n return axiosInstance.put(url).then((response) => response.data);\r\n}\r\n\r\nexport function putAccountingApprovals(id: string, approved: boolean): Promise {\r\n var url = '/company/cards/transactions/assignments/' + id + '/accountingapproval/' + approved;\r\n\r\n return axiosInstance.put(url).then((response) => response.data);\r\n}\r\n\r\n// Files\r\nexport function uploadCardTransactions(file: File): Promise {\r\n const url = '/company/cards/transactions/excel';\r\n\r\n var body = new FormData();\r\n body.append('file', file);\r\n\r\n var config = { headers: { 'Content-Type': 'multipart/form-data' } };\r\n\r\n return axiosInstance.post(url, body, config).then((response) => response.data);\r\n}\r\n\r\nexport function getCreditCardExportAndDownload(weekEnding: Date, approvedOnly: boolean, unExportedOnly: boolean, token?: CancelToken): Promise {\r\n const url =\r\n `/company/cards/transactions/export?beginDate=${getUTCDateString(addDays(weekEnding, -6))}&endDate=${getUTCDateString(weekEnding)}` +\r\n (approvedOnly ? '&approved=true' : '') +\r\n (unExportedOnly ? '&unexported=true' : '');\r\n\r\n var config: any = {\r\n responseType: 'blob',\r\n };\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => {\r\n const url = window.URL.createObjectURL(new Blob([response.data]));\r\n const link = document.createElement('a');\r\n var filename = response.headers['content-disposition'].substring(response.headers['content-disposition'].indexOf('=') + 1);\r\n link.href = url;\r\n link.setAttribute('download', filename);\r\n document.body.appendChild(link);\r\n link.click();\r\n return response;\r\n });\r\n}\r\n\r\n// Emails\r\nexport function emailCCUnprocessedTransactions(token?: CancelToken): Promise {\r\n const url = '/company/cards/transactions/notifyusers';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config);\r\n}\r\n\r\n/*---------------------------------GL Categories------------------------------------------*/\r\n\r\nexport function getGLCategories(token?: CancelToken): Promise {\r\n const url = '/glcategories';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getGLCategory(id: string, token?: CancelToken): Promise {\r\n const url = '/glcategories/' + id;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function postGLCategory(category: GLCategory): Promise {\r\n const url = '/glcategories';\r\n\r\n return axiosInstance.post(url, category).then((response) => response.data);\r\n}\r\n\r\nexport function putGLCategory(id: string, category: GLCategory): Promise {\r\n const url = '/glcategories/' + id;\r\n\r\n return axiosInstance.put(url, category).then((response) => response.data);\r\n}\r\n\r\nexport function deleteGLCategory(id: string): Promise {\r\n const url = '/glcategories/' + id;\r\n\r\n return axiosInstance.delete(url);\r\n}\r\n\r\n/*-------------------------------Unassigned-------------------------------------*/\r\n\r\nexport function getCardTransactionsForUser(id: string, beginDate: Date | string, endDate: Date | string, token: CancelToken): Promise {\r\n var url = '/accounts/users/' + id + '/cardtransactions';\r\n\r\n if (beginDate || endDate) {\r\n url = url + '?';\r\n }\r\n\r\n if (beginDate) {\r\n url = url + 'begindate=' + getUTCDateString(beginDate);\r\n }\r\n\r\n if (endDate) {\r\n if (beginDate) {\r\n url = url + '&';\r\n }\r\n url = url + 'enddate=' + getUTCDateString(endDate);\r\n }\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getUnassignedCardTransactionsForUser(id: string, token: CancelToken): Promise {\r\n const url = '/accounts/users/' + id + '/unassignedtransactions';\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getUnassignedCardTransactions(token: CancelToken): Promise {\r\n const url = '/company/cards/transactions/unassigned';\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Interfaces-------------------------------------*/\r\nexport interface CreditCardAssignment extends CreatedUpdatedTable {\r\n id: string;\r\n userId: string;\r\n user: User | Employee;\r\n accountNumber: string;\r\n cardDisabled: number;\r\n}\r\n\r\nexport interface CreditCardTransaction extends CreatedUpdatedTable {\r\n id: string;\r\n accountNumber: string;\r\n transactionDate: Date;\r\n postDate: Date;\r\n merchantName: string;\r\n originalAmount: number;\r\n originalReferenceNumber: string;\r\n assignments: CreditCardTransactionAssignment[];\r\n}\r\n\r\nexport interface CreditCardTransactionAssignment extends CreatedUpdatedTable {\r\n id: string;\r\n transactionId: string;\r\n userId?: string;\r\n user: User | Employee;\r\n amount: number;\r\n referenceNumber: string;\r\n categoryCode?: string;\r\n category?: string;\r\n jobNumber?: string;\r\n costCode?: string;\r\n dateEntered?: Date;\r\n lastUpdatedBy?: string;\r\n lastUpdatedDate?: Date;\r\n managerApprovedBy?: string;\r\n managerApprovedDate?: Date;\r\n accountingApprovedBy?: string;\r\n accountingApprovedDate?: Date;\r\n lastExportedDate?: Date;\r\n glCategoryId?: number;\r\n glCategory?: GLCategory;\r\n files?: FileUploads[];\r\n}\r\n\r\nexport interface CreditCardTransactionAssignmentWithUser extends CreditCardTransactionAssignment {\r\n user: User | Employee;\r\n}\r\n\r\nexport interface GLCategory {\r\n id: number;\r\n glCode: string;\r\n categoryName: string;\r\n e2PartName: string;\r\n}\r\n","import { CYMAJob } from '../utils/CYMAAPI';\r\nimport { createContext } from 'react';\r\n\r\ntype IJobsContext = [CYMAJob[], Function, () => void];\r\n\r\nexport const JobsContext = createContext([[], () => {}, () => {}]);\r\n\r\nexport default JobsContext;\r\n","import { AxiosResponse, CancelToken } from 'axios';\r\nimport { CreatedUpdatedTable } from '../../utils/APIReturnTypes';\r\nimport AxiosConfig from '../../utils/AxiosConfig';\r\nimport { CreditCardTransactionAssignment } from '../creditCards/CreditCardAPI';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*-------------------------------------Files----------------------------------------------*/\r\nexport function getFiles(token: CancelToken): Promise {\r\n const url = '/company/files';\r\n\r\n var config: any = {};\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((r) => r.data);\r\n}\r\n\r\nexport function getUserFiles(userId: string, token?: CancelToken): Promise {\r\n const url = '/accounts/users/' + userId + '/files';\r\n\r\n var config: any = {};\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((r) => r.data);\r\n}\r\n\r\nexport function getFile(fileId: string, onProgress?: Function, token?: CancelToken): Promise> {\r\n const url = '/company/files/' + fileId + '/file';\r\n\r\n var config: any = {\r\n responseType: 'blob',\r\n onUploadProgress: onProgress,\r\n };\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config);\r\n}\r\n\r\nexport function getFileAndDownload(fileId: string, fileName?: string, onProgress?: Function, token?: CancelToken): Promise {\r\n const url = '/company/files/' + fileId + '/file';\r\n\r\n var config: any = {\r\n responseType: 'blob',\r\n onUploadProgress: onProgress,\r\n };\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => {\r\n const url = window.URL.createObjectURL(new Blob([response.data]));\r\n const link = document.createElement('a');\r\n var contentFilename = response.headers['content-disposition'].substring(response.headers['content-disposition'].indexOf('=') + 1);\r\n link.href = url;\r\n link.setAttribute('download', fileName ?? contentFilename);\r\n document.body.appendChild(link);\r\n link.click();\r\n return response.data;\r\n });\r\n}\r\n\r\nexport function getFileData(fileId: string, token?: CancelToken): Promise {\r\n const url = '/company/files/' + fileId;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((r) => r.data);\r\n}\r\n\r\nexport function postFile(file: File, fileName: string, onProgress?: Function, token?: CancelToken): Promise {\r\n const url = '/company/files';\r\n\r\n var body = new FormData();\r\n\r\n body.append('Files', file);\r\n body.append('FileName', fileName);\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n config.headers = { 'Content-Type': 'multipart/form-data' };\r\n config.onUploadProgress = onProgress;\r\n\r\n return axiosInstance.post(url, body, config).then((r) => r.data);\r\n}\r\n\r\nexport function confirmPostFile(fileId: string): Promise {\r\n const url = '/company/files/' + fileId;\r\n return axiosInstance.put(url).then((r) => r.data);\r\n}\r\n\r\nexport function renameFile(fileId: string, newfileName: string): Promise {\r\n const url = '/company/files/' + fileId + '/name?fileName=' + newfileName;\r\n return axiosInstance.put(url).then((r) => r.data);\r\n}\r\n\r\nexport function tempDeleteFile(fileId: string): Promise {\r\n const url = '/company/files/' + fileId + '/delete';\r\n return axiosInstance.put(url).then((r) => r.data);\r\n}\r\n\r\nexport function deleteFile(fileId: string): Promise {\r\n const url = '/company/files/' + fileId;\r\n return axiosInstance.delete(url).then((r) => r.data);\r\n}\r\n\r\n/*-------------------------------------Interfaces----------------------------------------------*/\r\n\r\nexport interface FileUploads extends CreatedUpdatedTable {\r\n id: number;\r\n uniqueId: string;\r\n status: string;\r\n size?: number;\r\n type: string;\r\n userId: string;\r\n fileName: string;\r\n fileNickname: string;\r\n fileExtension: string;\r\n fileLocation: string;\r\n creditCardTransactionAssignments: CreditCardTransactionAssignment[];\r\n expenseReportAssignments: any[];\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Dialog, DialogContent, DialogActions, DialogTitle } from '@material-ui/core';\r\nimport { trackPromise } from 'react-promise-tracker';\r\nimport { toastError } from '../../utils/Functions';\r\nimport { getFile, getFileAndDownload } from './FileAPI';\r\nimport { getCancelToken, getSource } from '../../utils/AccountsAPI';\r\n\r\nvar loadImage = require('blueimp-load-image');\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n}));\r\n\r\nconst distance = (x1, y1, x2, y2) => Math.pow(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2), 0.5);\r\n\r\nexport default function FilePreviewDialog(props) {\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n var origDistance = 0;\r\n var scale = 1;\r\n var x = 0;\r\n var y = 0;\r\n var prevScale = 0;\r\n var origX = 0;\r\n var origY = 0;\r\n var prevX = 0;\r\n var prevY = 0;\r\n\r\n var source = getSource();\r\n\r\n const start = (img: HTMLElement) => (e) => {\r\n img.style.transitionDuration = '0s';\r\n if (e.touches.length === 1) {\r\n prevX = x;\r\n prevY = y;\r\n origX = e.touches[0].clientX;\r\n origY = e.touches[0].clientY;\r\n } else if (e.touches.length >= 2) {\r\n if (scale !== 1) prevScale = scale - 1;\r\n origX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\r\n origY = (e.touches[0].clientY + e.touches[1].clientY) / 2;\r\n origDistance = distance(e.touches[0].clientX, e.touches[0].clientY, e.touches[1].clientX, e.touches[1].clientY);\r\n }\r\n };\r\n\r\n const zoom = (img: HTMLElement) => (e) => {\r\n let x1 = e.touches[0]?.clientX;\r\n let x2 = e.touches[1]?.clientX;\r\n let y1 = e.touches[0]?.clientY;\r\n let y2 = e.touches[1]?.clientY;\r\n\r\n if (e.touches.length > 1) {\r\n scale = prevScale + distance(x1, y1, x2, y2) / origDistance;\r\n x = prevX + ((x1 + x2) / 2 - origX);\r\n y = prevY + ((y1 + y2) / 2 - origY);\r\n img.style.transform = `translate(${x}px,${y}px) scale(${scale})`;\r\n } else {\r\n x = prevX + (x1 - origX);\r\n y = prevY + (y1 - origY);\r\n img.style.transform = `translate(${x}px,${y}px) scale(${scale})`;\r\n }\r\n };\r\n\r\n const end = (img: HTMLElement) => (e) => {\r\n if (e.touches.length === 1) {\r\n prevX = x;\r\n prevY = y;\r\n origX = e.touches[0].clientX;\r\n origY = e.touches[0].clientY;\r\n } else if (e.touches.length === 0) {\r\n origDistance = 0;\r\n var currScale = scale;\r\n var currX = origX;\r\n var currY = origY;\r\n setTimeout(() => {\r\n if (origDistance === 0 && scale === currScale && currX === origX && currY === origY) {\r\n prevScale = 0;\r\n prevX = 0;\r\n prevY = 0;\r\n x = 0;\r\n y = 0;\r\n scale = 1;\r\n img.style.transitionDuration = '.5s';\r\n img.style.transform = 'scale(' + scale + ')';\r\n }\r\n }, 2000);\r\n }\r\n };\r\n\r\n const handleLoad = (img, data) => {\r\n if (img.type === 'error') {\r\n toastError(props.toast, 'Error loading image: ' + props.file.fileNickname);\r\n } else {\r\n var imgElement = document.getElementById(props.file.id + '_imageLocation');\r\n if (imgElement) {\r\n var child = imgElement?.appendChild(img);\r\n child.id = props.file.id + '_image';\r\n imgElement.style.zIndex = '2';\r\n imgElement?.addEventListener('touchstart', start(child));\r\n imgElement?.addEventListener('touchmove', zoom(child));\r\n imgElement?.addEventListener('touchend', end(child));\r\n imgElement?.addEventListener('touchcancel', end(child));\r\n }\r\n }\r\n };\r\n\r\n if (props.file && props.open) {\r\n trackPromise(\r\n getFile(props.file.uniqueId, () => { }, getCancelToken(source)).then((response) => {\r\n let elem = document.getElementById(props.file.id + '_imageLocation');\r\n var loadImageOptions: any = {\r\n canvas: true,\r\n orientation: 1,\r\n contain: true,\r\n maxWidth: elem ? parseFloat(window.getComputedStyle(elem).getPropertyValue('width').replace('px', '')) - 48 : undefined,\r\n maxHeight: elem ? parseFloat(window.getComputedStyle(elem).getPropertyValue('height').replace('px', '')) - 16 : undefined,\r\n pixelRatio: window.devicePixelRatio,\r\n imageSmoothingQuality: 'high',\r\n };\r\n loadImage.parseMetaData(response.data, (data) => {\r\n loadImage(response.data, handleLoad, loadImageOptions);\r\n });\r\n return Promise.resolve();\r\n })\r\n ).catch((err) => {\r\n toastError(props.toast, err.message);\r\n });\r\n }\r\n\r\n return () => {\r\n source.cancel();\r\n };\r\n }, [props.file, props.toast, props.open]);\r\n\r\n const downloadFile = () => {\r\n if (props.file && props.open) {\r\n trackPromise(getFileAndDownload(props.file.uniqueId, props.file.fileNickname + props.file.fileExtension)).catch((err) => {\r\n toastError(props.toast, err);\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {props.file?.fileNickname + props.file?.fileExtension || ''}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import React, { useState } from 'react';\r\n\r\nimport { FilePond, registerPlugin } from 'react-filepond';\r\nimport FilePondPluginImagePreview from 'filepond-plugin-image-preview';\r\nimport FilePondPluginImageExifOrientation from 'filepond-plugin-image-exif-orientation';\r\nimport FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type';\r\n\r\nimport 'filepond/dist/filepond.min.css';\r\nimport 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css';\r\nimport Axios from 'axios';\r\nimport { cancelPromises, getCancelToken, getSource } from '../../utils/AccountsAPI';\r\nimport { deleteFile, getFile, postFile } from './FileAPI';\r\nimport { toastError } from '../../utils/Functions';\r\n\r\nregisterPlugin(FilePondPluginImagePreview, FilePondPluginImageExifOrientation, FilePondPluginFileValidateType);\r\n\r\nexport default function FilePondWrapper(props) {\r\n const [files, setFiles] = useState([]);\r\n const [pond, setPond] = useState([]);\r\n const source = getSource();\r\n\r\n const handleInit = () => {\r\n console.log('FilePond instance has initialised', pond);\r\n };\r\n\r\n const processFile = (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {\r\n const progressFunc = (e) => {\r\n progress(e.lengthComputable, e.loaded, e.total);\r\n };\r\n\r\n postFile(file, file.name, progressFunc, getCancelToken(source))\r\n .then((response) => {\r\n if (props.addFile) props.addFile(response);\r\n load(response.id);\r\n })\r\n .catch((err) => {\r\n if (!Axios.isCancel(err)) {\r\n error(err?.response?.message ?? err?.message);\r\n toastError(props.toast, err);\r\n }\r\n });\r\n\r\n return {\r\n abort: () => {\r\n cancelPromises(source);\r\n abort();\r\n },\r\n };\r\n };\r\n\r\n const removeFile = (fileId, load, error) => {\r\n deleteFile(fileId).then(\r\n (response) => {\r\n if (props.removeFile) props.removeFile(fileId);\r\n load();\r\n },\r\n (err) => {\r\n error(err.response ? err.response.message : err.message);\r\n toastError(props.toast, err);\r\n }\r\n );\r\n };\r\n\r\n const fetchFile = (fileSource, load, error, progress, abort, headers) => {\r\n const progressFunc = (e) => {\r\n progress(e.lengthComputable, e.loaded, e.total);\r\n };\r\n\r\n getFile(fileSource, progressFunc, getCancelToken(source)).then(\r\n (response) => {\r\n headers(response.headers);\r\n load(response.data);\r\n },\r\n (err) => {\r\n if (!Axios.isCancel(err)) {\r\n error(err?.response?.message ?? err?.message);\r\n toastError(props.toast, err);\r\n }\r\n }\r\n );\r\n\r\n return {\r\n abort: () => {\r\n cancelPromises(source);\r\n abort();\r\n },\r\n };\r\n };\r\n\r\n return (\r\n setPond(ref)}\r\n files={files}\r\n oninit={() => handleInit()}\r\n onupdatefiles={(fileItems) => {\r\n setFiles(fileItems.map((fileItem) => fileItem.file));\r\n }}\r\n server={{\r\n process: processFile,\r\n revert: removeFile,\r\n remove: removeFile,\r\n fetch: fetchFile,\r\n }}\r\n labelIdle={props.label ?? 'Drag & Drop your files or Browse '}\r\n imagePreviewMaxFileSize='1MB'\r\n imagePreviewMaxHeight='100'\r\n acceptedFileTypes={['image/*', 'application/pdf']}\r\n type='file'\r\n />\r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Dialog, DialogContent, DialogActions, DialogTitle, TextField } from '@material-ui/core';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n}));\r\n\r\nexport default function FileEditDialog(props) {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down('xs'), { noSsr: true });\r\n\r\n const [fileChanges, setFileChanges] = React.useState({});\r\n\r\n const handleChange = (event) => {\r\n fileChanges[event.target.name] = event.target.value;\r\n setFileChanges(fileChanges);\r\n };\r\n\r\n return (\r\n \r\n Edit File\r\n \r\n {\r\n e.preventDefault();\r\n let elem: any = document.activeElement;\r\n elem?.blur();\r\n if (props.save) props.save(fileChanges);\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","import React from 'react';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Menu from '@material-ui/core/Menu';\r\nexport default function IconButtonMenu({ Icon, menuProps = undefined, iconButtonProps = undefined, ...props }) {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClick = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport { Edit, Delete, Image as ImageIcon, CloudDownload, MoreVert } from '@material-ui/icons';\r\nimport { toastError, getUTCDateString } from '../../utils/Functions';\r\nimport FileEditDialog from './FileEditDialog';\r\nimport { trackPromise } from 'react-promise-tracker';\r\nimport { useMediaQuery, useTheme, MenuItem } from '@material-ui/core';\r\nimport IconButtonMenu from '../../components/IconButtonMenu';\r\nimport { useConfirmation } from '../../hooks/useConfirmation';\r\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\r\nimport Autosizer from 'react-virtualized-auto-sizer';\r\nimport { getFileAndDownload } from './FileAPI';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n paddingTop: 0,\r\n },\r\n icon: {\r\n marginRight: '8px',\r\n },\r\n}));\r\n\r\nexport default function FileList(props) {\r\n const classes = useStyles();\r\n const [editDialogOpenIndex, setEditDialogOpenIndex] = React.useState(-1);\r\n\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'), { noSsr: true });\r\n\r\n const confirm = useConfirmation();\r\n\r\n const handleClick = (value) => {\r\n if (props.setSelectedFile) props.setSelectedFile(value === props.selectedFileID ? '' : value);\r\n else if (props.showFile) props.showFile(value);\r\n };\r\n\r\n const handleFileChanges = (fileChanges) => {\r\n var file = props.files[editDialogOpenIndex];\r\n file = { ...file, ...fileChanges };\r\n if (props.updateFile) props.updateFile(file);\r\n setEditDialogOpenIndex(-1);\r\n };\r\n\r\n const handleFileDelete = (i) => {\r\n var file = props.files[i ?? editDialogOpenIndex];\r\n if (file && props.deleteFile) {\r\n confirm('Are you sure you want to delete this file?').then(() => {\r\n props.deleteFile(file);\r\n });\r\n }\r\n setEditDialogOpenIndex(-1);\r\n };\r\n\r\n const downloadFile = (file) => {\r\n if (file)\r\n trackPromise(getFileAndDownload(file.uniqueId, file.fileNickname + file.fileExtension)).catch((err) => {\r\n toastError(props.toast, err);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {({ height, width }) => (\r\n \r\n {(childProps: ListChildComponentProps) => {\r\n let style = childProps.style;\r\n let index = childProps.index;\r\n let data = childProps.data[index];\r\n return (\r\n {\r\n handleClick(data.id);\r\n }}\r\n // @ts-ignore\r\n ContainerProps={{ style: style }}\r\n ContainerComponent='div'\r\n >\r\n {props.setSelectedFile ? (\r\n \r\n ) : null}\r\n \r\n \r\n {!isMobile ? (\r\n <>\r\n (props.deleteMode ? handleFileDelete(index) : setEditDialogOpenIndex(index))} style={{ marginRight: '0' }}>\r\n {props.deleteMode ? : }\r\n \r\n (data.type === 'application/pdf' ? downloadFile?.(data) : props.showFile?.(data.id))} style={{ marginRight: '0' }}>\r\n \r\n \r\n downloadFile?.(data)}>\r\n \r\n \r\n \r\n ) : (\r\n \r\n (props.deleteMode ? handleFileDelete(index) : setEditDialogOpenIndex(index))}>\r\n \r\n Edit\r\n \r\n (data.type === 'application/pdf' ? downloadFile?.(data) : props.showFile?.(data.id))}>\r\n \r\n Preview\r\n \r\n downloadFile?.(data)}>\r\n \r\n Download\r\n \r\n handleFileDelete(index)}>\r\n \r\n Delete\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n }}\r\n \r\n )}\r\n \r\n = 0}\r\n close={() => setEditDialogOpenIndex(-1)}\r\n save={handleFileChanges}\r\n file={props.files[editDialogOpenIndex]}\r\n toast={props.toast}\r\n />\r\n \r\n );\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Dialog, DialogContent, DialogActions, Toolbar } from '@material-ui/core';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport FilePreviewDialog from './FilePreviewDialog';\r\nimport { useLocation, useHistory } from 'react-router';\r\n\r\nimport { confirmPostFile, FileUploads, getUserFiles, renameFile, tempDeleteFile } from './FileAPI';\r\nimport { toastError } from '../../utils/Functions';\r\n\r\nimport FilePondWrapper from './FilePondWrapper';\r\nimport FileList from './FileList';\r\nimport Axios from 'axios';\r\nimport { getSource } from '../../utils/AccountsAPI';\r\n\r\nfunction TabPanel(props: any) {\r\n const { children, value, index, keepMounted, ...other } = props;\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n transform: 'translate3d(0,0,0)',\r\n boxSizing: 'border-box',\r\n },\r\n primary: {\r\n backgroundColor: '#1976D2',\r\n },\r\n secondary: {\r\n backgroundColor: 'white',\r\n },\r\n undoSpan: {\r\n color: 'black',\r\n fontWeight: 'bold',\r\n textDecoration: 'underline',\r\n float: 'right',\r\n },\r\n minHeightDialog: {\r\n minHeight: '600px',\r\n height: '600px',\r\n boxSizing: 'border-box',\r\n },\r\n tabs: {\r\n color: 'white',\r\n },\r\n tabPanel: {\r\n width: '100%',\r\n height: 'calc(100% - 64px)',\r\n },\r\n}));\r\n\r\nexport default function FileDialog(props) {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down('xs'), { noSsr: true });\r\n\r\n const [tabIndex, setTabIndex] = React.useState(0);\r\n const [files, setFiles] = React.useState(props.files ?? []);\r\n const [selectedFile, setSelectedFile] = React.useState(props?.selectedFile?.id ?? {});\r\n const [deleteMode, setDeleteMode] = React.useState(false);\r\n const [deletedFiles, setDeletedFiles] = React.useState([]);\r\n\r\n const propsSelectedFileID = props?.selectedFile?.id;\r\n\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n const locationState: any = location.state;\r\n const previewFileId = locationState?.['previewFileDialogId' + (props.id ?? '')];\r\n\r\n const userId = props.selectedUserID ?? props.employeeInfo?.id;\r\n\r\n //API calls\r\n useEffect(() => {\r\n var source = getSource();\r\n if (userId)\r\n getUserFiles(userId, source.token)\r\n .then((files) =>\r\n setFiles((oldFiles) => {\r\n if (files)\r\n return files.sort((a, b) => {\r\n return (a.createdDate ?? 0) < (b.createdDate ?? 0) ? 1 : -1;\r\n });\r\n else return [];\r\n })\r\n )\r\n .catch((err) => {\r\n if (Axios.isCancel(err)) return;\r\n toastError(props.toast, err);\r\n });\r\n return () => source.cancel();\r\n }, [userId, props.toast]);\r\n\r\n useEffect(() => {\r\n setSelectedFile(propsSelectedFileID);\r\n }, [propsSelectedFileID]);\r\n\r\n const handleTabChange = (event, newTabIndex) => {\r\n setTabIndex(newTabIndex);\r\n setDeleteMode(false);\r\n setDeletedFiles([]);\r\n };\r\n\r\n const addFile = (newFile, setSelected = true) => {\r\n var fileIndex = files.findIndex((file) => file.id === newFile.id);\r\n if (fileIndex === -1) {\r\n setFiles((oldFiles) => [newFile, ...oldFiles]);\r\n if (setSelected) setSelectedFile(newFile.id);\r\n }\r\n };\r\n\r\n const removeFile = (id, addToDeleted = true) => {\r\n var fileIndex = files.findIndex((file) => file.id === id);\r\n if (fileIndex >= 0) {\r\n var removedFiles = JSON.parse(JSON.stringify(files.splice(fileIndex, 1)));\r\n setFiles([...files]);\r\n if (addToDeleted) setDeletedFiles((oldFiles) => [...oldFiles, ...removedFiles]);\r\n }\r\n };\r\n\r\n const updateFile = (editedFile) => {\r\n if (editedFile.fileNickname) {\r\n renameFile(editedFile.uniqueId, editedFile.fileNickname)\r\n .then((response) => {\r\n var editedFileIndex = files.findIndex((file) => file.id === response.id);\r\n if (editedFileIndex !== -1) {\r\n files.splice(editedFileIndex, 1, response);\r\n setFiles([...files]);\r\n }\r\n })\r\n .catch((err) => {\r\n toastError(props.toast, err);\r\n });\r\n }\r\n };\r\n\r\n const undoDelete = () => {\r\n props.toast.dismiss();\r\n deletedFiles.forEach((file) => revertDeletedFile(file));\r\n setDeletedFiles([]);\r\n props.toast.success('Files un-deleted.', {\r\n position: 'bottom-left',\r\n autoClose: 2000,\r\n hideProgressBar: false,\r\n pauseOnHover: true,\r\n draggable: true,\r\n });\r\n };\r\n\r\n const revertDeletedFile = (file) => {\r\n confirmPostFile(file.uniqueId)\r\n .then((response) => {\r\n addFile(file, false);\r\n })\r\n .catch((err) => {\r\n toastError(props.toast, err);\r\n });\r\n };\r\n\r\n const deleteFile = (file) => {\r\n return tempDeleteFile(file.uniqueId)\r\n .then((tempFile) => {\r\n if (tempFile) removeFile(tempFile.id);\r\n else removeFile(file.id, false);\r\n props.toast.success('File Deleted.', {\r\n position: 'bottom-left',\r\n autoClose: 5000,\r\n hideProgressBar: false,\r\n pauseOnHover: true,\r\n draggable: true,\r\n });\r\n })\r\n .catch((err) => {\r\n toastError(props.toast, err);\r\n });\r\n };\r\n\r\n const finishDelete = () => {\r\n var promises: any[] = [];\r\n deletedFiles.forEach((file) => {\r\n promises.push(deleteFile(file));\r\n });\r\n\r\n Promise.all(promises)\r\n .then((responses) => {\r\n setDeletedFiles([]);\r\n })\r\n .catch((errors) => {\r\n errors.forEach((err) => toastError(props.toast, err));\r\n });\r\n\r\n setDeleteMode(false);\r\n };\r\n\r\n const handleCancel = (e, reason?) => {\r\n if (reason === 'backdropClick') {\r\n return;\r\n } else {\r\n cleanup();\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n }\r\n };\r\n\r\n const handleSave = () => {\r\n cleanup();\r\n if (props.fileToReturn) {\r\n var file = files.find((file) => file.id === selectedFile);\r\n props.fileToReturn(file);\r\n }\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n };\r\n\r\n const cleanup = () => {\r\n files.forEach((file) => {\r\n if (file.status === 'TEMP') confirmPostFile(file.uniqueId).catch((err) => toastError(props.toast, err));\r\n });\r\n deletedFiles.forEach((file) => {\r\n deleteFile(file.uniqueId).catch((err) => toastError(props.toast, err));\r\n });\r\n };\r\n\r\n const previewFile = (id) => {\r\n history.push(location.pathname, { ...(location.state as any), ['previewFileDialogId' + (props.id ?? '')]: id });\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 Upload File(s) '} />\r\n \r\n \r\n \r\n !(file?.creditCardTransactionAssignments?.length > 0 || file?.expenseReportAssignments?.length > 0) || props?.selectedFile?.uniqueId === file?.uniqueId\r\n )}\r\n updateFile={updateFile}\r\n deleteFile={deleteFile}\r\n setSelectedFile={props.fileToReturn ? setSelectedFile : null}\r\n selectedFileID={selectedFile}\r\n deleteMode={deleteMode}\r\n showFile={previewFile}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {deleteMode && tabIndex === 1 ? (\r\n
\r\n {deletedFiles.length > 0 ? (\r\n \r\n ) : null}\r\n \r\n
\r\n ) : (\r\n
\r\n \r\n {tabIndex !== 1 ? null : (\r\n \r\n )}\r\n \r\n
\r\n )}\r\n
\r\n \r\n file.id === previewFileId)} open={previewFileId ? true : false} close={() => history.goBack()} toast={props.toast} />\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { Grid, Paper, Typography } from '@material-ui/core';\r\nimport clsx from 'clsx';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n display: 'flex',\r\n padding: theme.spacing(1),\r\n backgroundColor: 'inherit',\r\n border: '1px solid ' + theme.palette.background.paper,\r\n width: '100%',\r\n boxSizing: 'border-box',\r\n marginInline: 0,\r\n },\r\n title: {\r\n backgroundColor: 'inherit',\r\n color: theme.palette.background.paper,\r\n padding: '0 ' + theme.spacing(1) + 'px',\r\n },\r\n darkTheme: {\r\n color: theme.palette.common.white,\r\n border: '1px solid ' + theme.palette.common.white,\r\n },\r\n darkThemeTitle: {\r\n color: theme.palette.common.white,\r\n },\r\n}));\r\n\r\nexport interface ITileGroup {\r\n title?: string;\r\n children?: any;\r\n hide?: boolean;\r\n spacing?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;\r\n noGrid?: boolean;\r\n theme?: 'light' | 'dark';\r\n}\r\n\r\nexport default function TileGroup({ title, children, hide = false, spacing = 2, noGrid = false, theme = 'light' }: ITileGroup) {\r\n const classes = useStyles();\r\n const muitheme = useTheme();\r\n\r\n return (\r\n \r\n \r\n {title}\r\n \r\n {noGrid ? (\r\n { children }\r\n ) : (\r\n \r\n {children}\r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { Dispatch, SetStateAction, useState } from 'react';\r\nimport { Employee } from '../utils/AccountsAPI';\r\nimport { cloneDeep } from 'lodash';\r\n\r\nexport const useUsers = (initialVal) => {\r\n const [users, setUsers] = useState(initialVal ?? []);\r\n\r\n function updateUser(user: Employee, updateFunc?: Function, addNew = false) {\r\n setUsers((u) => {\r\n var updatedUsers = cloneDeep(u);\r\n var index = u.findIndex((us) => us.id === user.id);\r\n if (index > -1) {\r\n if (updateFunc) {\r\n updateFunc(updatedUsers[index], updatedUsers, index);\r\n } else updatedUsers.splice(index, 1, user);\r\n } else if (addNew) {\r\n updatedUsers.push(user);\r\n if (updateFunc) {\r\n updateFunc(updatedUsers[updatedUsers.length - 1], updatedUsers, updatedUsers.length - 1);\r\n }\r\n updatedUsers = updatedUsers.sort((a, b) => (a.userName < b.userName ? -1 : 1));\r\n }\r\n return updatedUsers;\r\n });\r\n }\r\n\r\n return [users, setUsers, updateUser] as [Employee[], Dispatch>, (user: Employee, updateFunc?: Function | undefined, addNew?: boolean) => void];\r\n};\r\n","import StateContext from './StateContext';\r\nimport { DefaultClaim } from '../utils/AccountsAPI';\r\n\r\nexport const DefaultClaimsContext = StateContext([[], () => {}]);\r\n\r\nexport default DefaultClaimsContext;\r\n","//https://dev.to/dmtrkovalenko/the-neatest-way-to-handle-alert-dialogs-in-react-1aoe\r\n\r\nimport { CircularProgress, Dialog, DialogContent, makeStyles, ThemeProvider, Typography } from '@material-ui/core';\r\nimport React, { createContext, useCallback, useState } from 'react';\r\n\r\nexport interface ILoadingProps {\r\n promise?: Promise;\r\n message?: string;\r\n minTimeToShow?: number;\r\n}\r\n\r\n// we will pass the opening dialog function directly to consumers\r\nexport const LoadingServiceContext = createContext<(promise: Promise, message?: string, minTimeToShow?: number) => Promise>(Promise.reject);\r\n\r\nexport const LoadingServiceProvider = ({ children, theme }) => {\r\n const [options, setOptions] = useState([]);\r\n\r\n const loadPromise = useCallback((promise: Promise, message?: string, minTimeToShow: number = 1000) => {\r\n let ref = setTimeout(() => setOptions((o) => [...o, { promise, message, minTimeToShow }]), minTimeToShow);\r\n return (\r\n promise?.finally(() => {\r\n clearTimeout(ref);\r\n setOptions((o) => {\r\n let newO = [...o];\r\n newO.splice(0, 1);\r\n return newO;\r\n });\r\n }) ?? Promise.reject()\r\n );\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n 0} message={options?.[0]?.message} />\r\n \r\n );\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n content: { display: 'flex', padding: theme.spacing(2) + 'px !important' },\r\n icon: { margin: 'auto' },\r\n message: { display: 'inline-block', boxSizing: 'border-box', margin: 'auto', paddingLeft: theme.spacing(4) },\r\n}));\r\n\r\nexport const LoadingDialog = ({ open, message = 'Loading!', theme }) => {\r\n const classes = useStyles();\r\n return (\r\n \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","import axios, { AxiosInstance } from 'axios';\r\nimport createAuthRefreshInterceptor from 'axios-auth-refresh';\r\n\r\n//API URL\r\nexport const prod = 'https://tips.southerndesigninc.com/api';\r\nexport const test = 'https://testtips.southerndesigninc.com/api';\r\nexport const local = 'https://localhost:44382';\r\n\r\n//get base url each time called, to allow API switching across all calls\r\nexport function getBaseURL() {\r\n return (\r\n sessionStorage.getItem('baseUrl') ??\r\n localStorage.getItem('baseUrl') ??\r\n (window.location.href.indexOf('testtips.') > -1 || window.location.href.indexOf('localhost') > -1 ? test : prod)\r\n );\r\n}\r\n\r\nexport function clearBaseURL() {\r\n sessionStorage.removeItem('baseUrl');\r\n localStorage.removeItem('baseUrl');\r\n}\r\n\r\nexport function storeBaseURL(location: 'prod' | 'test' | 'local' | 'live') {\r\n let newLocation;\r\n switch (location.toLowerCase()) {\r\n case 'test':\r\n newLocation = test;\r\n break;\r\n case 'local':\r\n newLocation = local;\r\n break;\r\n case 'prod':\r\n case 'live':\r\n default:\r\n newLocation = prod;\r\n }\r\n\r\n sessionStorage.setItem('baseUrl', newLocation);\r\n localStorage.setItem('baseUrl', newLocation);\r\n}\r\n\r\nexport function getBaseUrlName() {\r\n switch (getBaseURL()) {\r\n case prod:\r\n return 'Live';\r\n case test:\r\n return 'Test';\r\n case local:\r\n return 'Local';\r\n default:\r\n return 'None';\r\n }\r\n}\r\n\r\nexport const refresh = (instance: AxiosInstance, accessToken: string, refreshToken: string): any => {\r\n const url = '/refresh';\r\n\r\n let configAuth = {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n Authorization: null,\r\n },\r\n };\r\n\r\n let body = 'Token=' + encodeURIComponent(accessToken) + '&RefreshToken=' + encodeURIComponent(refreshToken);\r\n\r\n return instance\r\n .post(url, body, configAuth)\r\n .then((response) => response.data)\r\n .catch((err) => err);\r\n};\r\n\r\n//called if 401\r\nconst refreshAuth = (instance) => (failedRequest) => {\r\n //if expired refresh - else normal not authed\r\n if (failedRequest?.response?.headers?.['token-expired'] === 'true') {\r\n let accessToken = sessionStorage.getItem('accessToken') ?? localStorage.getItem('accessToken');\r\n let refreshToken = sessionStorage.getItem('refreshToken') ?? localStorage.getItem('refreshToken');\r\n if (accessToken && refreshToken) {\r\n return refresh(instance, accessToken, refreshToken).then((response) => {\r\n sessionStorage.setItem('accessToken', response.token);\r\n sessionStorage.setItem('refreshToken', response.refreshToken);\r\n sessionStorage.setItem('accessTokenExpiration', response.tokenExpiration);\r\n sessionStorage.setItem('refreshTokenExpiration', response.refreshTokenExpiration);\r\n if (localStorage.getItem('accessToken')) localStorage.setItem('accessToken', response.token);\r\n if (localStorage.getItem('accessTokenExpiration')) localStorage.setItem('accessTokenExpiration', response.tokenExpiration);\r\n if (localStorage.getItem('refreshToken')) localStorage.setItem('refreshToken', response.refreshToken);\r\n if (localStorage.getItem('refreshTokenExpiration')) localStorage.setItem('refreshTokenExpiration', response.refreshTokenExpiration);\r\n\r\n return Promise.resolve();\r\n });\r\n }\r\n } else {\r\n return Promise.resolve(failedRequest);\r\n }\r\n};\r\n\r\n// Obtain the fresh token each time the function is called\r\nexport function getAccessToken() {\r\n return sessionStorage.getItem('accessToken');\r\n}\r\n\r\n// Obtain the fresh token each time the function is called\r\nfunction getTokenExpiration() {\r\n var strExp = sessionStorage.getItem('accessTokenExpiration');\r\n return strExp ? new Date(Date.parse(strExp) - 5 * 60 * 1000) : new Date(0); //allow 5 mins desync time to server\r\n}\r\n\r\nfunction refreshTokens(instance) {\r\n var accessToken = sessionStorage.getItem('accessToken') ?? localStorage.getItem('accessToken') ?? '';\r\n var refreshToken = sessionStorage.getItem('refreshToken') ?? localStorage.getItem('refreshToken') ?? '';\r\n if (accessToken === '' || refreshToken === '') return Promise.reject(new axios.Cancel('Invalid Token(s)'));\r\n else\r\n return refresh(instance, accessToken, refreshToken).then((response) => {\r\n sessionStorage.setItem('accessToken', response.token);\r\n sessionStorage.setItem('refreshToken', response.refreshToken);\r\n sessionStorage.setItem('accessTokenExpiration', response.tokenExpiration);\r\n sessionStorage.setItem('refreshTokenExpiration', response.refreshTokenExpiration);\r\n if (localStorage.getItem('accessToken')) localStorage.setItem('accessToken', response.token);\r\n if (localStorage.getItem('accessTokenExpiration')) localStorage.setItem('accessTokenExpiration', response.tokenExpiration);\r\n if (localStorage.getItem('refreshToken')) localStorage.setItem('refreshToken', response.refreshToken);\r\n if (localStorage.getItem('refreshTokenExpiration')) localStorage.setItem('refreshTokenExpiration', response.refreshTokenExpiration);\r\n });\r\n}\r\n\r\nconst AxiosConfig = () => {\r\n var instance: AxiosInstance;\r\n var refreshPromise: Promise | undefined;\r\n const getInstance = () => {\r\n if (!instance) {\r\n instance = axios.create({ headers: { 'Access-Control-Allow-Origin': '*' } });\r\n createAuthRefreshInterceptor(instance, refreshAuth(instance));\r\n // Use interceptor to inject the token to requests\r\n instance.interceptors.request.use((request) => {\r\n request.baseURL = request.baseURL ?? getBaseURL();\r\n request.headers['Authorization'] = 'bearer ' + getAccessToken();\r\n if (request.url === '/refresh' || request.url === '/authentication' || request.url === '/accounts/sendpasswordreset') return request;\r\n\r\n if (!refreshPromise && new Date().getTime() > getTokenExpiration().getTime()) {\r\n refreshPromise = refreshTokens(getInstance())\r\n .then(() => {\r\n refreshPromise = undefined;\r\n return request;\r\n })\r\n .catch((err) => {\r\n refreshPromise = undefined;\r\n return Promise.reject(new axios.Cancel(err));\r\n });\r\n return refreshPromise ?? request;\r\n } else {\r\n return refreshPromise\r\n ? refreshPromise.then(() => {\r\n return request;\r\n })\r\n : request;\r\n }\r\n });\r\n }\r\n\r\n return instance;\r\n };\r\n return {\r\n instance: getInstance,\r\n refresh: () => refreshTokens(getInstance()),\r\n };\r\n};\r\n\r\nexport default AxiosConfig();\r\n","import React, { useState, useContext } from 'react';\r\nimport { Typography, Paper, Button, TextField, InputAdornment, IconButton } from '@material-ui/core';\r\nimport { Save, Visibility, VisibilityOff } from '@material-ui/icons';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { changePassword, adminChangePassword } from '../../utils/AccountsAPI';\r\nimport { toastError, toastSuccess } from '../../utils/Functions';\r\nimport EmployeeInfoContext from '../../contexts/EmployeeInfoContext';\r\nimport { trackPromise } from 'react-promise-tracker';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {},\r\n rootPaper: {\r\n padding: theme.spacing(3),\r\n boxSizing: 'border-box',\r\n [theme.breakpoints.down('sm')]: {\r\n width: '100%',\r\n },\r\n [theme.breakpoints.up('md')]: {\r\n width: '75vw',\r\n margin: theme.spacing(3) + 'px auto',\r\n },\r\n display: 'inline-block',\r\n },\r\n paperHeader: { display: 'flex' },\r\n paperTitle: {\r\n marginLeft: 0,\r\n marginRight: 'auto',\r\n },\r\n upperRightIcon: {},\r\n paperContent: {\r\n paddingBottom: theme.spacing(1),\r\n },\r\n actionButton: {\r\n margin: theme.spacing(1),\r\n },\r\n actionContainer: {\r\n margin: 'auto',\r\n float: 'right',\r\n display: 'inline-flex',\r\n },\r\n icon: {\r\n paddingRight: theme.spacing(1),\r\n },\r\n}));\r\n\r\nexport default function ResetPassword(props) {\r\n const classes = useStyles();\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showPasswords, setShowPasswords] = useState(false);\r\n const [checkErrors, setCheckErrors] = useState(false);\r\n\r\n const [employeeInfo] = useContext(EmployeeInfoContext);\r\n const user = props.user ?? employeeInfo;\r\n\r\n const userId = user?.id ?? '';\r\n const requireCurrent = props.requireCurrent;\r\n\r\n const reset = () => {\r\n setCurrentPassword('');\r\n setNewPassword('');\r\n setConfirmPassword('');\r\n setCheckErrors(false);\r\n setShowPasswords(false);\r\n };\r\n\r\n const onChange = (e) => {\r\n switch (e.target.id) {\r\n case 'currentPassword':\r\n setCurrentPassword(e.target.value);\r\n break;\r\n case 'newPassword':\r\n setNewPassword(e.target.value);\r\n break;\r\n case 'confirmPassword':\r\n setConfirmPassword(e.target.value);\r\n break;\r\n }\r\n };\r\n\r\n const onBlur = (e) => {\r\n setCheckErrors(e.target.value !== '');\r\n };\r\n\r\n const savePassword = () => {\r\n if (newPassword === confirmPassword) {\r\n let promise;\r\n if (requireCurrent) promise = changePassword(userId, currentPassword, newPassword);\r\n else promise = adminChangePassword(userId, newPassword);\r\n\r\n trackPromise(promise)\r\n .then((response) => {\r\n toastSuccess(props.toast, 'Successfully changed password!');\r\n reset();\r\n })\r\n .catch((err) => toastError(props.toast, err));\r\n } else toastError(props.toast, 'Passwords do not match!');\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n {'Change Password - ' + user?.userName}\r\n \r\n
\r\n\r\n
\r\n
\r\n {requireCurrent ? (\r\n \r\n setShowPasswords((a) => !a)} onMouseDown={(e) => e.preventDefault()}>\r\n {showPasswords ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n ) : null}\r\n \r\n setShowPasswords((a) => !a)} onMouseDown={(e) => e.preventDefault()}>\r\n {showPasswords ? : }\r\n \r\n \r\n ),\r\n }}\r\n />\r\n {\r\n if (e.keyCode === 13) savePassword();\r\n }}\r\n disabled={!userId}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n setShowPasswords((a) => !a)} onMouseDown={(e) => e.preventDefault()}>\r\n {showPasswords ? : }\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","import React from 'react';\r\nimport { Button } from '@material-ui/core';\r\nimport './LoaderButton.css';\r\nimport clsx from 'clsx';\r\n\r\nexport default function LoaderButton({ isLoading = false, text, loadingText = '', className = '', disabled = false, ...props }) {\r\n return (\r\n \r\n );\r\n}\r\n","import StateContext from './StateContext';\r\n\r\nexport interface SearchOptions {\r\n id: string;\r\n name: string;\r\n description: string;\r\n}\r\n\r\nexport interface AppBarContextData {\r\n title?: string;\r\n\r\n showSearch?: boolean;\r\n searchOptions?: SearchOptions[];\r\n showSearchOptions?: boolean;\r\n updateSearchOn?: 'change' | 'blur' | 'submit';\r\n searchValue?: string;\r\n}\r\n\r\nexport const AppBarContext = StateContext([{}, () => {}]);\r\n\r\nexport default AppBarContext;\r\n","import React from 'react';\r\nimport { Route } from 'react-router-dom';\r\n\r\nexport default function AppliedRoute({ component: C, props: cProps, ...rest }) {\r\n return } />;\r\n}\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\n//import Loader from 'react-loader-spinner';\r\nimport { Role } from '../utils/AccountsAPI';\r\nimport { LoadingIndicator } from '../App';\r\n\r\n// const Loading = () => {\r\n// return (\r\n// \r\n// \r\n// \r\n//
\r\n// \r\n// );\r\n// };\r\n\r\nexport default function ProtectedRoute({\r\n component: C,\r\n mobileComponent: M,\r\n mobileSize = 600,\r\n props: cProps,\r\n isAuthenticated: auth,\r\n roles: cRole = [],\r\n ...rest\r\n}:\r\n | {\r\n component: any;\r\n mobileComponent?: any;\r\n mobileSize?: number;\r\n props?: any;\r\n isAuthenticated?: boolean;\r\n roles: string[];\r\n rest: any;\r\n }\r\n | any) {\r\n return (\r\n \r\n auth === true ? ( //if authenticated\r\n cProps.employeeInfo != null ? (\r\n cProps.employeeInfo.id ? ( //if employeeInfo exists\r\n Authorized(cProps.employeeInfo.roles, cRole) ? ( //if authorized\r\n M && mobileSize && window.innerWidth < mobileSize ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : (\r\n \r\n )\r\n ) : (\r\n //Loading()\r\n )\r\n ) : (\r\n //Loading()\r\n )\r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n}\r\n\r\nfunction Authorized(empRoles: Role[], pageRoles: string[]) {\r\n var authorized = false;\r\n\r\n if (pageRoles?.length === 0) {\r\n return true;\r\n }\r\n\r\n empRoles.forEach((empRole) => {\r\n authorized = authorized || pageRoles?.indexOf(empRole.name) > -1;\r\n });\r\n\r\n return authorized;\r\n}\r\n","import React from 'react';\r\n\r\nexport default function NotFound() {\r\n return
No page found.
;\r\n}\r\n","import React from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport clsx from 'clsx';\r\nimport ReactFileReader from 'react-file-reader';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n grid: {\r\n maxWidth: '100%',\r\n margin: 'auto',\r\n },\r\n gridItem: {\r\n width: '100%',\r\n maxWidth: '300px',\r\n },\r\n mobileGridItem: {\r\n width: '100%',\r\n },\r\n paper: {\r\n minWidth: '200px',\r\n minHeight: '125px',\r\n maxWidth: '300px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n height: '100%',\r\n },\r\n mobilePaper: {\r\n padding: theme.spacing(1),\r\n textAlign: 'center',\r\n display: 'flex',\r\n overflow: 'hidden',\r\n },\r\n cardContent: {\r\n color: theme.palette.text.primary,\r\n fontSize: '1.75em',\r\n padding: '1vh',\r\n fontWeight: 'bold',\r\n verticalAlign: 'middle',\r\n width: '100%',\r\n margin: 'auto',\r\n },\r\n mobileCardContent: {\r\n color: theme.palette.text.primary,\r\n fontSize: '1.75em',\r\n fontWeight: 'bold',\r\n verticalAlign: 'middle',\r\n width: '100%',\r\n margin: 'auto',\r\n },\r\n linkTile: {\r\n cursor: 'pointer',\r\n display: 'block',\r\n '&:hover': {\r\n textDecoration: 'none',\r\n },\r\n },\r\n blue: {\r\n backgroundColor: '#1976D2',\r\n },\r\n green: {\r\n backgroundColor: '#388E3C',\r\n },\r\n red: {\r\n backgroundColor: '#d32f2f',\r\n },\r\n purple: {\r\n backgroundColor: '#512DA8',\r\n },\r\n grey: {\r\n backgroundColor: '#455A64',\r\n },\r\n pink: {\r\n backgroundColor: '#ff0080',\r\n },\r\n orange: {\r\n backgroundColor: '#E64A19',\r\n },\r\n teal: {\r\n backgroundColor: '#0097A7',\r\n },\r\n brown: {\r\n backgroundColor: '#5D4037',\r\n },\r\n hover: {\r\n '&:hover': {\r\n filter: 'brightness(115%)',\r\n transform: 'scale(1.05)',\r\n borderRadius: '3px',\r\n boxShadow: '-13px 11px 25px 1px rgba(0,0,0,0.55)',\r\n transition: '.3s',\r\n },\r\n },\r\n}));\r\n\r\nexport interface DashboardButton {\r\n onClick?: any;\r\n visible?: boolean;\r\n color?: string;\r\n title?: string;\r\n fileReaderInputProps?: any;\r\n fileReader?: boolean;\r\n content?: any;\r\n}\r\n\r\nexport default function DashboardComponent({ buttons = [], toast, title = '' }: { buttons: DashboardButton[]; toast?: any; title?: string }) {\r\n toast.dismiss();\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n\r\n const createTitle = (title) => {\r\n return

{title}

;\r\n };\r\n\r\n const createContent = (button: DashboardButton, key: string | number | undefined, isMobile: boolean) => {\r\n const fileReader = (content: any) => {\r\n return (\r\n \r\n {content}\r\n \r\n );\r\n };\r\n\r\n const defaultContent = (\r\n \r\n \r\n
{button.title}
\r\n
\r\n
\r\n );\r\n\r\n return button.fileReader ? fileReader(button.content ?? defaultContent) : defaultContent;\r\n };\r\n\r\n const createButton = (button: DashboardButton, key: string | number | undefined, isMobile: boolean) => {\r\n const item = (\r\n \r\n {createContent(button, key, isMobile)}\r\n \r\n );\r\n return button.visible ? item : null;\r\n };\r\n\r\n return (\r\n
\r\n {title ? createTitle(title) : null}\r\n
\r\n \r\n {buttons.map((button, i) => createButton(button, i, isMobile))}\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport DashboardComponent from '../../components/DashboardComponent';\r\n\r\nexport default function AdminDashboard(props) {\r\n props.toast.dismiss();\r\n\r\n const buttons = [\r\n {\r\n onClick: () => {\r\n props.history.push('/Dashboard');\r\n },\r\n title: 'Dashboard',\r\n visible: true,\r\n },\r\n ];\r\n\r\n return ;\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Typography } from '@material-ui/core';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport clsx from 'clsx';\r\nimport { trackPromise } from 'react-promise-tracker';\r\nimport { confirmEmail } from '../../utils/AccountsAPI';\r\nimport { toastSuccess, toastError } from '../../utils/Functions';\r\n\r\nconst themeBlue = '#1976D2';\r\nconst themeGreen = '#388E3C';\r\nconst themeRed = '#E64A19';\r\nconst themeOrange = '#FFA000';\r\nconst themeGrey = '#455A64';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n //for material UI Icons\r\n confirmEmail: {\r\n padding: '15px',\r\n },\r\n header: {\r\n marginTop: '15vh',\r\n },\r\n paper: {\r\n margin: 'auto',\r\n height: '100%',\r\n minWidth: '200px',\r\n maxWidth: '200px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n verticalAlign: 'middle',\r\n marginLeft: theme.spacing(2),\r\n },\r\n textPaper: {\r\n minWidth: '200px',\r\n minHeight: '125px',\r\n maxWidth: '600px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n backgroundColor: themeGrey,\r\n color: 'white',\r\n },\r\n elementPaper: {\r\n minWidth: '200px',\r\n minHeight: '125px',\r\n maxWidth: '800px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n },\r\n cardContent: {\r\n color: 'white',\r\n fontSize: '1.75em',\r\n padding: '1vh',\r\n fontWeight: 'bold',\r\n verticalAlign: 'middle',\r\n width: '100%',\r\n margin: 'auto',\r\n },\r\n blue: {\r\n backgroundColor: themeBlue,\r\n },\r\n green: {\r\n backgroundColor: themeGreen,\r\n },\r\n red: {\r\n backgroundColor: themeRed,\r\n },\r\n orange: {\r\n backgroundColor: themeOrange,\r\n },\r\n grey: {\r\n backgroundColor: themeGrey,\r\n },\r\n}));\r\n\r\nexport default function ConfirmEmail(props) {\r\n const [confirmed, setConfirmed] = useState(false);\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n var query = props.location.search;\r\n\r\n const userId = query.substring(query.indexOf('?userId=') + 7, query.indexOf('&token='));\r\n\r\n const token = query.substring(query.indexOf('&token=') + 7);\r\n\r\n trackPromise(confirmEmail(userId, token)).then(\r\n () => {\r\n toastSuccess(props.toast, 'Email confirmed. Please login to use the site.');\r\n setConfirmed(true);\r\n },\r\n (err) => {\r\n toastError(props.toast, err);\r\n }\r\n );\r\n }, [props.location.search, props.toast]);\r\n\r\n return (\r\n
\r\n \r\n Confirm Email\r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n We have sent an email with a confirmation link to your email address. In order to log in to our system, please click the confirmation\r\n link.\r\n
\r\n
\r\n You will be prompted to login on a successful confirmation.\r\n
\r\n
\r\n\r\n {confirmed ? (\r\n {\r\n props.history.push('/Login');\r\n }}\r\n >\r\n \r\n
Login
\r\n
\r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Typography, TextField } from '@material-ui/core';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Button from '@material-ui/core/Button';\r\nimport clsx from 'clsx';\r\nimport { resetPassword } from '../../utils/AccountsAPI';\r\nimport { trackPromise } from 'react-promise-tracker';\r\nimport { toastError } from '../../utils/Functions';\r\nimport { ChevronRight, Save } from '@material-ui/icons';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport useLoadContext from '../../hooks/useLoadContext';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n //for material UI Icons\r\n confirmEmail: {\r\n padding: '15px',\r\n },\r\n header: {},\r\n paper: {\r\n margin: 'auto',\r\n height: '100%',\r\n minWidth: '200px',\r\n maxWidth: '200px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n verticalAlign: 'middle',\r\n marginLeft: theme.spacing(2),\r\n },\r\n textPaper: {\r\n minWidth: '200px',\r\n maxWidth: '600px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'inline-grid',\r\n backgroundColor: 'inherit',\r\n color: 'white',\r\n },\r\n elementPaper: {\r\n minWidth: '200px',\r\n maxWidth: '800px',\r\n padding: theme.spacing(2),\r\n border: '5px',\r\n textAlign: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n cardContent: {\r\n color: 'white',\r\n fontSize: '1.75em',\r\n padding: '1vh',\r\n fontWeight: 'bold',\r\n verticalAlign: 'middle',\r\n width: '100%',\r\n margin: 'auto',\r\n },\r\n textField: {\r\n color: 'white',\r\n float: 'left',\r\n width: '100%',\r\n },\r\n button: {\r\n marginTop: theme.spacing(1),\r\n margin: 'auto',\r\n },\r\n primary: {\r\n backgroundColor: theme.palette.primary.main,\r\n },\r\n secondary: {\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n}));\r\n\r\nexport default function ResetPassword(props) {\r\n const [username, setUsername] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [passwordsDontMatch, setPasswordsDontMatch] = useState(false);\r\n const [confirmed, setConfirmed] = useState(true);\r\n\r\n const classes = useStyles();\r\n const token = props.location.search.substring(props.location.search.indexOf('?token=') + 7);\r\n\r\n useLoadContext(AppBarContext, { title: 'Reset Password' });\r\n\r\n const validatePassword = () => {\r\n if (newPassword !== confirmPassword && newPassword !== '' && confirmPassword !== '') {\r\n props.toast.error('Error: Passwords do not match.', {\r\n position: 'bottom-left',\r\n autoClose: 5000,\r\n hideProgressBar: false,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n });\r\n setPasswordsDontMatch(true);\r\n } else {\r\n setPasswordsDontMatch(false);\r\n }\r\n };\r\n\r\n const sendPasswordReset = () => {\r\n if (token.length > 0) {\r\n trackPromise(resetPassword(username, token, newPassword)).then(\r\n () => {\r\n props.toast.success('Password reset successfully!', {\r\n position: 'bottom-left',\r\n autoClose: 5000,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n });\r\n setConfirmed(true);\r\n },\r\n (err) => {\r\n toastError(props.toast, err);\r\n }\r\n );\r\n } else {\r\n toastError(props.toast, 'Error: No token available.');\r\n }\r\n };\r\n\r\n const keyPress = (e) => {\r\n if (e.key === 'Enter') {\r\n sendPasswordReset();\r\n }\r\n };\r\n\r\n const resetForm: JSX.Element[] = [];\r\n\r\n var passReq = The password must be 6+ characters and include an uppercase letter, a lowercase letter, a number, and a special character.;\r\n\r\n var uname = (\r\n setUsername(e.target.value)}\r\n onKeyPress={keyPress}\r\n type={'text'}\r\n className={classes.textField}\r\n value={username}\r\n margin='dense'\r\n variant='outlined'\r\n />\r\n );\r\n\r\n var newPass = (\r\n setNewPassword(e.target.value)}\r\n onBlur={validatePassword}\r\n onKeyPress={keyPress}\r\n type={'password'}\r\n className={classes.textField}\r\n value={newPassword}\r\n margin='dense'\r\n variant='outlined'\r\n />\r\n );\r\n\r\n var confPass = (\r\n setConfirmPassword(e.target.value)}\r\n onBlur={validatePassword}\r\n onKeyPress={keyPress}\r\n type={'password'}\r\n className={classes.textField}\r\n value={confirmPassword}\r\n margin='dense'\r\n variant='outlined'\r\n />\r\n );\r\n\r\n var reset = (\r\n
\r\n \r\n {confirmed ? (\r\n {\r\n props.history.push('/Login');\r\n }}\r\n variant='contained'\r\n color='primary'\r\n className={clsx(classes.button)}\r\n style={{ marginLeft: '8px' }}\r\n >\r\n Login\r\n
\r\n \r\n \r\n ) : null}\r\n
\r\n );\r\n\r\n resetForm.push(passReq);\r\n resetForm.push(
{[uname, newPass, confPass]}
);\r\n resetForm.push(reset);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n Reset Password\r\n \r\n \r\n {token.length <= 0 ? (\r\n We have sent an email with a password reset link to your email address. In order to reset your password, please click the link.\r\n ) : (\r\n resetForm\r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport DashboardComponent, { DashboardButton } from '../../components/DashboardComponent';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport useLoadContext from '../../hooks/useLoadContext';\r\n//import EmployeeInfoContext from '../../contexts/EmployeeInfoContext';\r\n\r\nexport default function AccountDashboard(props) {\r\n props.toast?.dismiss();\r\n\r\n //const [employeeInfo] = useContext(EmployeeInfoContext);\r\n\r\n useLoadContext(AppBarContext, { title: 'My Account' });\r\n\r\n const buttons: DashboardButton[] = [\r\n {\r\n onClick: () => {\r\n props.history.push('/ChangePassword');\r\n },\r\n title: 'Change Password',\r\n visible: true,\r\n },\r\n ];\r\n\r\n return ;\r\n}\r\n","import React from 'react';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport useLoadContext from '../../hooks/useLoadContext';\r\nimport ChangePasswordPanel from './ChangePasswordPanel';\r\n\r\nexport default function ChangePassword(props) {\r\n useLoadContext(AppBarContext, { title: 'Change Password' });\r\n\r\n return ;\r\n}\r\n","import React, { useState } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport DashboardComponent, { DashboardButton } from '../../components/DashboardComponent';\r\nimport Select from '@material-ui/core/Select';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Input from '@material-ui/core/Input';\r\nimport { Checkbox, Paper } from '@material-ui/core';\r\nimport { getUTCDateString, addDays, toastError } from '../../utils/Functions';\r\nimport { getWeekEndingDate } from '../../utils/TSFunctions';\r\nimport { downloadExpenseReportExport } from '../expenses/ExpensesAPI';\r\nimport { downloadTimesheetExport } from '../timesheets/TimesheetAPI';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport useLoadContext from '../../hooks/useLoadContext';\r\nimport DateChanger from '../../components/DateChanger';\r\nimport { trackPromise } from 'react-promise-tracker';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n select: {\r\n width: '100px',\r\n textAlign: 'left',\r\n padding: '0 5px',\r\n },\r\n optionPicker: {\r\n margin: 'auto',\r\n display: 'inline-flex',\r\n width: '75%',\r\n padding: theme.spacing(1),\r\n },\r\n checkboxWithLabel: {\r\n margin: 'auto',\r\n display: 'inline-flex',\r\n },\r\n}));\r\n\r\nexport default function AccountingDashboard(props) {\r\n props.toast.dismiss();\r\n const classes = useStyles();\r\n\r\n useLoadContext(AppBarContext, { title: 'Accounting Dashboard' });\r\n\r\n const companies = ['SDSMA', 'SDS', 'SDSMAA', 'SDSA', 'TEMP'];\r\n const [approvedOnly, setApprovedOnly] = useState(true);\r\n const [unExportedOnly, setUnExportedOnly] = useState(false);\r\n const [selectedCompany, setSelectedCompany] = useState('SDSMA');\r\n const [weekEnding, setWeekEnding] = useState(getWeekEndingDate(addDays(new Date(), -7)));\r\n\r\n const companyChange = (event) => {\r\n setSelectedCompany(event.target.value);\r\n };\r\n\r\n const calendarChange = (value) => {\r\n setWeekEnding(value);\r\n };\r\n\r\n const timesheetExport = () => {\r\n trackPromise(downloadTimesheetExport(selectedCompany, getUTCDateString(weekEnding), approvedOnly, unExportedOnly)).catch((err) => toastError(props.toast, err));\r\n };\r\n\r\n const expenseExport = () => {\r\n trackPromise(downloadExpenseReportExport(selectedCompany, getUTCDateString(weekEnding), approvedOnly, unExportedOnly)).catch((err) => toastError(props.toast, err));\r\n };\r\n\r\n const buttons: DashboardButton[] = [\r\n {\r\n onClick: timesheetExport,\r\n title: 'Timesheets (to CYMA)',\r\n color: 'blue',\r\n visible: true,\r\n },\r\n {\r\n onClick: expenseExport,\r\n title: 'Expenses (to CYMA)',\r\n color: 'blue',\r\n visible: true,\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 Company\r\n \r\n \r\n \r\n\r\n {\r\n setApprovedOnly((approvedOnly) => !approvedOnly);\r\n }}\r\n value='approvedOnly'\r\n color='primary'\r\n />\r\n }\r\n />\r\n {\r\n setUnExportedOnly((unExportedOnly) => !unExportedOnly);\r\n }}\r\n value='unExportedOnly'\r\n color='primary'\r\n />\r\n }\r\n />\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions } from '@material-ui/core';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n textField: {\r\n margin: 'auto',\r\n width: '100%',\r\n },\r\n}));\r\n\r\nexport default function ForgotPasswordDialog(props) {\r\n const [username, setUsername] = useState('');\r\n\r\n const classes = useStyles();\r\n\r\n const clearForm = () => {\r\n setUsername('');\r\n };\r\n\r\n const handleClose = () => {\r\n clearForm();\r\n props.handleClose();\r\n };\r\n\r\n const handleSubmit = () => {\r\n props.handlePasswordReset(username);\r\n clearForm();\r\n handleClose();\r\n };\r\n\r\n const keyPress = (e) => {\r\n if (e.key === 'Enter') {\r\n handleSubmit();\r\n }\r\n };\r\n\r\n return (\r\n \r\n Password Reset\r\n \r\n Please enter the username of your account.\r\n {\r\n setUsername(event.target.value);\r\n }}\r\n onKeyPress={keyPress}\r\n value={username}\r\n type={'text'}\r\n className={classes.textField}\r\n margin='dense'\r\n variant='outlined'\r\n autoFocus\r\n />\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport LoaderButton from '../../components/LoaderButton';\r\nimport ForgotPasswordDialog from '../../components/ForgotPasswordDialog';\r\nimport { Typography, ButtonBase, TextField, Paper, FormGroup, FormControlLabel, Checkbox } from '@material-ui/core';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { useTheme, makeStyles } from '@material-ui/core/styles';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport { toastError, toastSuccess } from '../../utils/Functions';\r\nimport { trackPromise } from 'react-promise-tracker';\r\nimport { authenticate, sendPasswordReset } from '../../utils/AccountsAPI';\r\nimport { useLoadContext } from '../../hooks/useLoadContext';\r\nimport { globalAny } from './NavbarWithSidebar';\r\n\r\nconst maxLoginWidth = 300;\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n title: {\r\n fontFamily: '\"Aldrich\", \"Courier\", monospace',\r\n color: theme.palette.primary.main,\r\n },\r\n input: {\r\n width: '100%',\r\n minWidth: '150px',\r\n maxWidth: maxLoginWidth + 'px',\r\n margin: 'auto',\r\n },\r\n paper: {\r\n padding: theme.spacing(3),\r\n margin: 'auto',\r\n [theme.breakpoints.up('sm')]: {\r\n marginTop: theme.spacing(3),\r\n maxWidth: maxLoginWidth + 20 + 'px',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n position: 'absolute',\r\n top: '56px',\r\n left: 0,\r\n width: '100%',\r\n height: 'calc(100% - 56px)',\r\n zIndex: 1101,\r\n boxSizing: 'border-box',\r\n },\r\n overflow: 'hidden',\r\n },\r\n loginForm: {\r\n [theme.breakpoints.down('xs')]: {\r\n position: 'absolute',\r\n width: '100%',\r\n height: '1px',\r\n boxSizing: 'border-box',\r\n top: 'calc(100% - ' + theme.spacing(3) + 'px)',\r\n left: 0,\r\n margin: 'auto',\r\n },\r\n },\r\n form: {\r\n padding: theme.spacing(2),\r\n margin: theme.spacing(1),\r\n paddingTop: theme.spacing(1),\r\n [theme.breakpoints.down('xs')]: {\r\n transform: 'translateY(-100%)',\r\n backgroundColor: 'rgba(0,0,0,.35)',\r\n borderRadius: theme.spacing(1),\r\n },\r\n },\r\n logo: {\r\n padding: theme.spacing(3),\r\n },\r\n button: {\r\n marginTop: theme.spacing(3),\r\n minWidth: '150px',\r\n color: 'white',\r\n margin: 'auto',\r\n width: '100%',\r\n borderRadius: 0,\r\n padding: theme.spacing(1),\r\n maxWidth: maxLoginWidth + 'px',\r\n },\r\n forgotPassword: {\r\n marginRight: '0',\r\n marginLeft: 'auto',\r\n display: 'block',\r\n marginTop: theme.spacing(1),\r\n },\r\n rememberMe: {\r\n float: 'left',\r\n margin: '0',\r\n },\r\n checkboxRoot: {\r\n fontSize: '1rem',\r\n },\r\n loginFeatures: {\r\n width: '100%',\r\n maxWidth: maxLoginWidth + 'px',\r\n margin: 'auto',\r\n },\r\n spacer: {\r\n width: '100%',\r\n height: theme.spacing(3),\r\n },\r\n}));\r\n\r\nexport default function Login(props) {\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [username, setUsername] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n const [rememberMe, setRememberMe] = useState(true);\r\n\r\n const theme = useTheme();\r\n const classes = useStyles(theme);\r\n const mobile = useMediaQuery(theme.breakpoints.down('xs'), { noSsr: true });\r\n\r\n useLoadContext(AppBarContext, { title: 'TIPS Login' });\r\n\r\n const validateForm = () => {\r\n return username.length > 0 && password.length > 0;\r\n };\r\n\r\n const handleSubmit = (event?) => {\r\n event?.preventDefault();\r\n\r\n if (!validateForm()) {\r\n toastError(props.toast, 'Please enter username and password.');\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n trackPromise(authenticate(username.trim(), password, rememberMe))\r\n .then((user) => {\r\n var location = props.location.state ? props.location.state.from.pathname : null;\r\n var query = props.location.state ? props.location.state.from.search : null;\r\n setIsLoading(false);\r\n props.userHasAuthenticated(true, (location ?? '') + (query ?? ''), user, rememberMe);\r\n })\r\n .catch((err) => {\r\n setIsLoading(false);\r\n toastError(props.toast, err);\r\n });\r\n };\r\n\r\n const handlePasswordReset = (username) => {\r\n trackPromise(\r\n sendPasswordReset(username)\r\n .then((response) => {\r\n toastSuccess(props.toast, 'Email sent to account associated with: ' + username);\r\n })\r\n .catch((err) => toastError(props.toast, err))\r\n );\r\n };\r\n\r\n const keyPress = (e) => {\r\n if (e.key === 'Enter') {\r\n handleSubmit();\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n TIPS\r\n \r\n {mobile ? SDSMA Logo : null}\r\n {\r\n \r\n {globalAny.appVersion}\r\n \r\n }\r\n
\r\n \r\n setUsername(e.target.value)} className={classes.input} label='Username' />\r\n
\r\n setPassword(e.target.value)}\r\n onKeyPress={keyPress}\r\n className={classes.input}\r\n label='Password'\r\n />\r\n
\r\n {\r\n setRememberMe(e.target.checked);\r\n }}\r\n value='rememberMe'\r\n color='primary'\r\n size='small'\r\n classes={{ root: classes.checkboxRoot }}\r\n />\r\n }\r\n label='Remember Me'\r\n labelPlacement='start'\r\n className={classes.rememberMe}\r\n classes={{ label: 'MuiTypography-caption' }}\r\n />\r\n setDialogOpen(true)} className={classes.forgotPassword}>\r\n Forgot Password ?\r\n \r\n
\r\n \r\n \r\n
\r\n {dialogOpen ? setDialogOpen(false)} childProps={props} handlePasswordReset={handlePasswordReset} /> : null}\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Button, Card, CardActions, CardContent, CircularProgress, Divider, Typography } from '@material-ui/core';\r\nimport { Launch } from '@material-ui/icons';\r\nimport clsx from 'clsx';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n wrapper: {\r\n display: 'flow-root',\r\n background: 'none',\r\n },\r\n card: {\r\n overflow: 'visible',\r\n marginTop: theme.spacing(2),\r\n },\r\n cardContent: {\r\n position: 'relative',\r\n paddingBottom: 0,\r\n },\r\n cardActions: {\r\n paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(1),\r\n },\r\n divider: {\r\n marginTop: theme.spacing(2),\r\n },\r\n iconBox: {\r\n position: 'absolute',\r\n width: theme.spacing(6),\r\n height: theme.spacing(6),\r\n padding: theme.spacing(2),\r\n marginTop: -theme.spacing(4),\r\n display: 'flex',\r\n color: 'white',\r\n transition: theme.transitions.create(['width'], {\r\n easing: theme.transitions.easing.easeInOut,\r\n duration: theme.transitions.duration.standard,\r\n }),\r\n },\r\n icon: {\r\n lineHeight: theme.spacing(6),\r\n fontSize: theme.spacing(4),\r\n margin: 'auto',\r\n color: 'white',\r\n },\r\n iconLoading: {\r\n width: `calc(100% - ${theme.spacing(8)}px)`,\r\n },\r\n title: {\r\n textAlign: 'right',\r\n color: theme.palette.text.secondary,\r\n fontSize: theme.spacing(1.75),\r\n maxWidth: 'calc(100% - 80px)',\r\n marginRight: 0,\r\n marginLeft: 'auto',\r\n },\r\n value: {\r\n textAlign: 'right',\r\n color: theme.palette.text.primary,\r\n fontSize: theme.spacing(2.25),\r\n },\r\n actionTextButton: {\r\n textTransform: 'none',\r\n color: theme.palette.text.secondary,\r\n paddingLeft: theme.spacing(1),\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n justifyContent: 'start',\r\n },\r\n actionIcon: {\r\n fontSize: '1.5em',\r\n margin: 'auto',\r\n marginRight: 0,\r\n },\r\n}));\r\n\r\nexport interface ITile {\r\n title?: string;\r\n value?: any;\r\n Icon?: any;\r\n color?: string;\r\n children?: any;\r\n actionText?: string;\r\n ActionIcon?: any;\r\n actionOnClick?: any;\r\n hide?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nexport default function Tile({ title, value, Icon, color, children, actionText, ActionIcon, actionOnClick, hide = false, loading = false }: ITile) {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n {Icon ? (\r\n \r\n {loading ? : }\r\n \r\n ) : null}\r\n \r\n {title ?? '\\xa0'}\r\n \r\n \r\n {value ?? '\\xa0'}\r\n \r\n {children}\r\n {actionText ? : null}\r\n \r\n \r\n {actionText || ActionIcon ? (\r\n actionOnClick ? (\r\n \r\n ) : (\r\n {actionText}\r\n )\r\n ) : null}\r\n \r\n \r\n
\r\n );\r\n}\r\n","import { CancelToken } from 'axios';\r\nimport { CreatedUpdatedTable } from '../../utils/APIReturnTypes';\r\nimport AxiosConfig from '../../utils/AxiosConfig';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*-------------------------------Broadcast-------------------------------------*/\r\n\r\nexport function getBroadcasts(last: number = 5, getFuture: boolean = false, token?: CancelToken): Promise {\r\n var url = '/broadcasts';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n config.params = { last, getFuture };\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putBroadcast(broadcast: Broadcast): Promise {\r\n var url = '/broadcasts';\r\n return axiosInstance.put(url, broadcast).then((response) => response.data);\r\n}\r\n\r\nexport function deleteBroadcast(id: number): Promise {\r\n var url = '/broadcasts/' + id;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n}\r\n\r\nexport interface Broadcast extends CreatedUpdatedTable {\r\n id: number;\r\n title: string;\r\n message: string;\r\n version?: string;\r\n visibleDate?: Date;\r\n}\r\n","import { Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, makeStyles, TextField } from '@material-ui/core';\r\nimport { FormatBold, FormatItalic, FormatUnderlined, Code, Delete, Link, LinkOff } from '@material-ui/icons';\r\nimport { RichUtils, EditorState, CompositeDecorator, getDefaultKeyBinding } from 'draft-js';\r\nimport PluginEditor from '@draft-js-plugins/editor';\r\nimport React, { useContext, useState } from 'react';\r\nimport EmployeeInfoContext from '../../../contexts/EmployeeInfoContext';\r\nimport clsx from 'clsx';\r\nimport 'draft-js/dist/Draft.css';\r\nimport './DraftEditorStyles.css';\r\nimport '@draft-js-plugins/linkify/lib/plugin.css';\r\nimport createLinkifyPlugin from '@draft-js-plugins/linkify';\r\nimport createListPlugin from 'draft-js-list-plugin';\r\n\r\nconst listPlugin = createListPlugin();\r\nconst linkifyPlugin = createLinkifyPlugin();\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n padding: theme.spacing(2),\r\n },\r\n editor: {\r\n minHeight: '40vh',\r\n },\r\n editorHeader: {\r\n display: 'grid',\r\n width: '100%',\r\n minHeight: theme.spacing(3),\r\n lineHeight: theme.spacing(3),\r\n fontSize: theme.spacing(3),\r\n backgroundColor: 'rgba(0,0,0,.5)',\r\n gridTemplateColumns: 'repeat(12,1fr)',\r\n },\r\n broadcastContainer: {\r\n maxWidth: '500px',\r\n margin: 'auto',\r\n },\r\n editorHeaderIcon: {\r\n height: theme.spacing(2) + 'px !important',\r\n width: theme.spacing(2) + 'px !important',\r\n padding: theme.spacing(0.5),\r\n margin: 'auto',\r\n },\r\n editorHeaderIconButton: {\r\n borderRadius: 0,\r\n },\r\n link: {},\r\n}));\r\n\r\nexport default function DraftEditor({ draftRef, editorState, onEditorChange, onDelete, saving, readOnly }: any) {\r\n const classes = useStyles();\r\n\r\n const Editor = PluginEditor as any;\r\n\r\n const [employeeInfo] = useContext(EmployeeInfoContext);\r\n\r\n const [showUrlInput, setShowUrlInput] = useState(false);\r\n const [urlValue, setUrlValue] = useState('');\r\n\r\n const handleKeyCommand = (command, editorState) => {\r\n const newState = RichUtils.handleKeyCommand(editorState, command);\r\n if (newState) {\r\n onEditorChange(newState);\r\n return 'handled';\r\n }\r\n return 'not-handled';\r\n };\r\n\r\n const onBold = () => toggleInlineStyle('BOLD');\r\n const onUnderline = () => toggleInlineStyle('UNDERLINE');\r\n const onItalics = () => toggleInlineStyle('BOLD');\r\n const onCode = () => onEditorChange(RichUtils.toggleCode(editorState));\r\n const onKeyBinding = (e) => {\r\n if (e.keyCode === 9) e.preventDefault();\r\n\r\n return getDefaultKeyBinding(e);\r\n };\r\n\r\n const toggleInlineStyle = (type: string) => onEditorChange(RichUtils.toggleInlineStyle(editorState, type));\r\n\r\n const promptForLink = (e) => {\r\n e.preventDefault();\r\n const selection = editorState.getSelection();\r\n if (!selection.isCollapsed()) {\r\n const contentState = editorState.getCurrentContent();\r\n const startKey = editorState.getSelection().getStartKey();\r\n const startOffset = editorState.getSelection().getStartOffset();\r\n const blockWithLinkAtBeginning = contentState.getBlockForKey(startKey);\r\n const linkKey = blockWithLinkAtBeginning.getEntityAt(startOffset);\r\n\r\n let url = '';\r\n if (linkKey) {\r\n const linkInstance = contentState.getEntity(linkKey);\r\n url = linkInstance.getData().url;\r\n }\r\n\r\n setShowUrlInput(true);\r\n setUrlValue(url);\r\n }\r\n };\r\n\r\n const confirmLink = (e) => {\r\n e.preventDefault();\r\n const contentState = editorState.getCurrentContent();\r\n const contentStateWithEntity = contentState.createEntity('LINK', 'MUTABLE', { url: urlValue });\r\n const entityKey = contentStateWithEntity.getLastCreatedEntityKey();\r\n const newEditorState = EditorState.set(editorState, { currentContent: contentStateWithEntity });\r\n onEditorChange(RichUtils.toggleLink(newEditorState, newEditorState.getSelection(), entityKey));\r\n setShowUrlInput(false);\r\n setUrlValue('');\r\n };\r\n\r\n const removeLink = (e) => {\r\n e.preventDefault();\r\n const selection = editorState.getSelection();\r\n if (!selection.isCollapsed()) onEditorChange(RichUtils.toggleLink(editorState, selection, null));\r\n };\r\n\r\n const onLinkKeyPress = (e) => {\r\n if (e.which === 13) confirmLink(e);\r\n };\r\n\r\n const onChange = (editor) => {\r\n onEditorChange(editor);\r\n };\r\n\r\n return (\r\n <>\r\n {employeeInfo?.isInRole('Admin') ? (\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 \r\n \r\n {saving ? : null}\r\n
\r\n ) : null}\r\n \r\n \r\n Edit Link\r\n \r\n setUrlValue(e.target.value)} onKeyPress={onLinkKeyPress} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport function findLinkEntities(contentBlock, callback, contentState) {\r\n contentBlock.findEntityRanges((character) => {\r\n const entityKey = character.getEntity();\r\n return entityKey !== null && contentState.getEntity(entityKey).getType() === 'LINK';\r\n }, callback);\r\n}\r\n\r\nexport const DraftLink = (props) => {\r\n const { url } = props.contentState.getEntity(props.entityKey).getData();\r\n const classes = useStyles();\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nexport const decorator = new CompositeDecorator([\r\n {\r\n strategy: findLinkEntities,\r\n component: DraftLink,\r\n },\r\n]);\r\n","import { Button, Grid, makeStyles, MobileStepper, Paper, TextField, Typography, useTheme } from '@material-ui/core';\r\nimport { green, red } from '@material-ui/core/colors';\r\nimport { AttachMoney, CreditCard, KeyboardArrowLeft, KeyboardArrowRight, Timer } from '@material-ui/icons';\r\nimport React, { useContext, useRef, useState } from 'react';\r\nimport { useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport AppBarContext from '../../contexts/AppBarContext';\r\nimport EmployeeInfoContext from '../../contexts/EmployeeInfoContext';\r\nimport useLoadContext from '../../hooks/useLoadContext';\r\nimport { getSource } from '../../utils/AccountsAPI';\r\nimport { addDays, getUTCDateString, toastError } from '../../utils/Functions';\r\nimport { formatCurrency, getWeekEndingDate } from '../../utils/TSFunctions';\r\nimport { CreditCardTransaction, getUnassignedCardTransactionsForUser } from '../creditCards/CreditCardAPI';\r\nimport Tile from './DashboardComponents/Tile';\r\nimport TileGroup from './DashboardComponents/TileGroup';\r\nimport { convertFromRaw, convertToRaw, EditorState } from 'draft-js';\r\nimport { useStateRef } from '../../hooks/useStateRef';\r\nimport { Broadcast, deleteBroadcast, getBroadcasts, putBroadcast } from './BroadcastAPI';\r\nimport { cloneDeep } from 'lodash';\r\nimport { useToast } from '../../hooks/useToast';\r\nimport { unstable_batchedUpdates } from 'react-dom';\r\nimport { useConfirmation } from '../../hooks/useConfirmation';\r\nimport DraftEditor from './DashboardComponents/DraftEditor';\r\nimport ExpenseReport from '../expenses/ExpenseReport';\r\nimport Timesheet from '../timesheets/Timesheet';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n padding: theme.spacing(2),\r\n },\r\n editor: {\r\n minHeight: '40vh',\r\n },\r\n editorHeader: {\r\n display: 'grid',\r\n width: '100%',\r\n minHeight: theme.spacing(3),\r\n lineHeight: theme.spacing(3),\r\n fontSize: theme.spacing(3),\r\n backgroundColor: 'rgba(0,0,0,.5)',\r\n gridTemplateColumns: 'repeat(12,1fr)',\r\n },\r\n broadcastContainer: {\r\n margin: 'auto',\r\n },\r\n editorHeaderIcon: {\r\n height: theme.spacing(2) + 'px !important',\r\n width: theme.spacing(2) + 'px !important',\r\n padding: theme.spacing(0.5),\r\n margin: 'auto',\r\n },\r\n editorHeaderIconButton: {\r\n borderRadius: 0,\r\n },\r\n broadcastTitleText: {\r\n margin: 'auto',\r\n width: '100%',\r\n gridColumn: '2 / span 2',\r\n },\r\n broadcastTitle: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(4,1fr)',\r\n padding: theme.spacing(1),\r\n },\r\n broadcastTitleTextField: {\r\n gridColumn: '2 / span 2',\r\n margin: theme.spacing(1) + 'px auto',\r\n },\r\n}));\r\n\r\nexport default function Dashboard(props) {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const history = useHistory();\r\n const toast = useToast();\r\n const confirm = useConfirmation();\r\n const [employeeInfo] = useContext(EmployeeInfoContext);\r\n useLoadContext(AppBarContext, { title: 'Dashboard' });\r\n\r\n const draftRef = useRef(null);\r\n\r\n const [ccTrx, setCCTrx] = useState();\r\n const [expenses, setExpenses] = useState();\r\n const [timesheet, setTimesheet] = useState();\r\n const maxBroadcasts = 5;\r\n const [broadcasts, setBroadcasts, broadcastsRef] = useStateRef([]);\r\n const [activeBroadcast, setActiveBroadcast] = useState(0);\r\n const [editorState, setEditorState, editorStateRef] = useStateRef(EditorState.createEmpty());\r\n const [saving, setSaving] = useState(false);\r\n const [savingTitle, setSavingTitle] = useState(false);\r\n const [weekEnding, setWeekEnding] = useState(getWeekEndingDate(addDays(new Date(), employeeInfo?.hasClaim('defaultPreviousWeekEnding', 'true') ? -7 : 0)));\r\n\r\n useEffect(() => {\r\n var source = getSource();\r\n if (employeeInfo && (employeeInfo?.creditCards?.length ?? 0) > 0)\r\n getUnassignedCardTransactionsForUser(employeeInfo.id, source.token)\r\n .then((trx) => setCCTrx(trx))\r\n .catch((err) => toastError(toast, err));\r\n return () => source.cancel();\r\n }, [employeeInfo, toast]);\r\n\r\n useEffect(() => {\r\n var source = getSource();\r\n if (employeeInfo)\r\n getBroadcasts(maxBroadcasts, employeeInfo?.isInRole('Admin'), source.token)\r\n .then((b) => {\r\n unstable_batchedUpdates(() => {\r\n setBroadcasts(b ?? []);\r\n if (b.length > 0) {\r\n var contentState;\r\n try {\r\n contentState = convertFromRaw(JSON.parse(b?.[b.length - 1]?.message ?? ''));\r\n } catch {\r\n contentState = null;\r\n }\r\n setEditorState(contentState ? EditorState.createWithContent(contentState) : EditorState.createEmpty());\r\n setActiveBroadcast(b.length - 1);\r\n }\r\n });\r\n })\r\n .catch((err) => toastError(toast, err));\r\n return () => source.cancel();\r\n }, [setEditorState, employeeInfo, setBroadcasts, toast]);\r\n\r\n useEffect(() => {\r\n var source = getSource();\r\n if (employeeInfo) {\r\n if (!employeeInfo.hasClaim('DisableTimesheet', 'true')) {\r\n let timesheet = new Timesheet(employeeInfo, weekEnding);\r\n timesheet\r\n .getAPITimesheet(source.token)\r\n .then((ts) => setTimesheet(ts))\r\n .catch((err) => toastError(toast, err));\r\n }\r\n\r\n if (!employeeInfo.hasClaim('DisableExpenses', 'true')) {\r\n let report = new ExpenseReport(employeeInfo, weekEnding);\r\n report\r\n .getAPIExpenseReport(source.token)\r\n .then((r) => setExpenses(r))\r\n .catch((err) => toastError(toast, err));\r\n }\r\n }\r\n return () => source.cancel();\r\n }, [setEditorState, employeeInfo, setBroadcasts, toast, weekEnding]);\r\n\r\n useEffect(() => {\r\n var newWE = getWeekEndingDate(addDays(new Date(), employeeInfo?.hasClaim('defaultPreviousWeekEnding', 'true') ? -7 : 0));\r\n if (weekEnding.getTime() !== newWE.getTime()) setWeekEnding(newWE);\r\n }, [employeeInfo, weekEnding]);\r\n\r\n const handleNext = () => {\r\n unstable_batchedUpdates(() => {\r\n if (activeBroadcast + 1 < broadcasts.length) {\r\n var contentState = convertFromRaw(JSON.parse(broadcasts?.[activeBroadcast + 1]?.message ?? ''));\r\n setEditorState(EditorState.createWithContent(contentState));\r\n } else {\r\n setEditorState(EditorState.createEmpty());\r\n }\r\n setActiveBroadcast((n) => n + 1);\r\n });\r\n };\r\n\r\n const handleBack = () => {\r\n unstable_batchedUpdates(() => {\r\n var contentState = convertFromRaw(JSON.parse(broadcasts?.[activeBroadcast - 1]?.message ?? ''));\r\n setEditorState(EditorState.createWithContent(contentState));\r\n setActiveBroadcast((n) => n - 1);\r\n });\r\n };\r\n\r\n const onDelete = () => {\r\n confirm('Are you sure you want to delete this broadcast?').then(() => {\r\n setSaving(true);\r\n var promise: Promise;\r\n if (broadcasts[activeBroadcast]?.id)\r\n promise = deleteBroadcast(broadcasts[activeBroadcast]?.id).catch((err) => {\r\n setSaving(false);\r\n toastError(err, toast);\r\n });\r\n else promise = Promise.resolve();\r\n\r\n promise.then(() => {\r\n unstable_batchedUpdates(() => {\r\n var clone = cloneDeep(broadcasts);\r\n clone.splice(activeBroadcast, 1);\r\n setBroadcasts(clone);\r\n\r\n var newActiveBroadcast = clone.length > activeBroadcast ? activeBroadcast : activeBroadcast >= 1 ? activeBroadcast - 1 : 0;\r\n\r\n if (clone.length > 0) setEditorState(EditorState.createWithContent(convertFromRaw(JSON.parse(clone?.[newActiveBroadcast]?.message ?? ''))));\r\n else setEditorState(EditorState.createEmpty());\r\n\r\n setActiveBroadcast(newActiveBroadcast);\r\n setSaving(false);\r\n });\r\n });\r\n });\r\n };\r\n\r\n const onEditorChange = (newEditor: EditorState) => {\r\n if (newEditor.getLastChangeType() && newEditor.getCurrentContent() !== editorStateRef.current.getCurrentContent()) {\r\n setTimeout(() => {\r\n //if (newEditor === editorStateRef.current) {\r\n if (newEditor.getCurrentContent() === editorStateRef.current.getCurrentContent()) {\r\n var broadcast = broadcastsRef?.current?.[activeBroadcast] ?? {};\r\n broadcast.message = JSON.stringify(convertToRaw(newEditor.getCurrentContent()));\r\n putBroadcast(broadcast)\r\n .then((b) => {\r\n var clone = cloneDeep(broadcasts);\r\n var index = clone.findIndex((broad) => broad.id === b.id);\r\n if (index > -1) clone.splice(index, 1, b);\r\n else clone.push(b);\r\n setBroadcasts(clone);\r\n setSaving(false);\r\n })\r\n .catch((err) => {\r\n setSaving(false);\r\n toastError(toast, err);\r\n });\r\n }\r\n }, 1000);\r\n\r\n setSaving(true);\r\n }\r\n setEditorState(newEditor);\r\n };\r\n\r\n const onBroadcastTitleBlur = (e) => {\r\n var original = broadcasts;\r\n var clone = cloneDeep(broadcasts);\r\n var broadcast = clone[activeBroadcast];\r\n if (!broadcast) {\r\n const newBroadcast = { title: e.target.value, message: JSON.stringify(convertToRaw(editorStateRef.current.getCurrentContent())) } as Broadcast;\r\n clone.splice(activeBroadcast, 0, newBroadcast);\r\n } else broadcast.title = e.target.value;\r\n setBroadcasts(clone);\r\n\r\n setTimeout(() => {\r\n if (clone[activeBroadcast]?.title === broadcastsRef.current?.[activeBroadcast]?.title)\r\n putBroadcast(clone[activeBroadcast])\r\n .then((b) => {\r\n var clone = cloneDeep(broadcasts);\r\n var index = clone.findIndex((broad) => broad.id === b.id);\r\n if (index > -1) clone.splice(index, 1, b);\r\n else clone.push(b);\r\n setBroadcasts(clone);\r\n setSavingTitle(false);\r\n })\r\n .catch((err) => {\r\n setBroadcasts(original);\r\n setSavingTitle(false);\r\n toastError(toast, err);\r\n });\r\n }, 2000);\r\n\r\n setSavingTitle(true);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {employeeInfo?.isInRole('Admin') ? (\r\n \r\n ) : (\r\n \r\n {broadcasts?.[activeBroadcast]?.title ?? '\\xa0'}\r\n \r\n )}\r\n \r\n \r\n \r\n Next\r\n \r\n \r\n }\r\n backButton={\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n {employeeInfo && !employeeInfo?.hasClaim('DisableTimesheet', 'true') ? (\r\n \r\n history.push('/Timesheet')}\r\n ActionIcon\r\n loading={!timesheet}\r\n />\r\n \r\n ) : null}\r\n {employeeInfo && !employeeInfo?.hasClaim('DisableExpenses', 'true') ? (\r\n \r\n history.push('/Expenses')}\r\n ActionIcon\r\n loading={!expenses}\r\n />\r\n \r\n ) : null}\r\n {(employeeInfo?.creditCards?.length ?? 0) > 0 ? (\r\n \r\n sum + trx.assignments.filter((a) => a.userId === employeeInfo?.id).length, 0)}\r\n Icon={CreditCard}\r\n color={red[900]}\r\n actionText='Go To Credit Card Dashboard'\r\n actionOnClick={() => history.push('/CreditCards')}\r\n ActionIcon\r\n loading={!ccTrx}\r\n />\r\n \r\n ) : null}\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n","import React, { lazy } from 'react';\r\nimport { Route, Switch, Redirect } from 'react-router-dom';\r\nimport AppliedRoute from '../components/AppliedRoute';\r\nimport ProtectedRoute from '../components/ProtectedRoute';\r\nimport NotFound from './site/NotFound';\r\nimport AdminDashboard from './dashboards/AdminDashboard';\r\nimport ConfirmEmail from './site/ConfirmEmail';\r\nimport ResetPassword from './site/ResetPassword';\r\nimport AccountDashboard from './dashboards/AccountDashboard';\r\nimport ChangePassword from './usermanagement/ChangePassword';\r\nimport AccountingDashboard from './dashboards/AccountingDashboard';\r\nimport Login from './site/Login';\r\nimport Dashboard from './dashboards/Dashboard';\r\n\r\nconst Admin = ['Admin'];\r\nconst Accounting = ['Accounting', 'Executive', 'Admin'];\r\nconst Manager = ['Manager', 'Accounting', 'Executive', 'Admin'];\r\n\r\nconst CreditCardDashboard = lazy(() => import('./creditCards/CreditCardDashboard'));\r\nconst GLMapManager = lazy(() => import('./creditCards/GLMapManager'));\r\n\r\nconst MobileShopTimesheet = lazy(() => import('./shop/MobileShopTimesheet'));\r\nconst ShopDashboard = lazy(() => import('./shop/ShopDashboard'));\r\nconst ValidateImportedParts = lazy(() => import('./shop/ValidateImportedParts'));\r\n\r\nconst DesktopTimesheets = lazy(() => import('./timesheets/DesktopTimesheets'));\r\nconst MobileTimesheets = lazy(() => import('./timesheets/MobileTimesheets'));\r\nconst MobileExpenseReports = lazy(() => import('./expenses/MobileExpenseReports'));\r\nconst DesktopExpenses = lazy(() => import('./expenses/DesktopExpenses'));\r\n\r\nconst Approvals = lazy(() => import('./approvals/Approvals'));\r\n\r\nconst ProjectData = lazy(() => import('./bom/ProjectData'));\r\nconst ProjectValidate = lazy(() => import('./bom/ProjectValidate'));\r\n\r\nconst JobDashboard = lazy(() => import('./jobs/JobDashboard'));\r\nconst JobCosting = lazy(() => import('./jobs/JobCosting'));\r\n\r\nconst ManageUsers = lazy(() => import('./usermanagement/ManageUsers'));\r\n\r\nconst SchedulerDashboard = lazy(() => import('./scheduler/SchedulerDashboard'));\r\nconst MobileScheduler = lazy(() => import('./scheduler/MobileScheduler'));\r\n\r\nconst BillRatesDashboard = lazy(() => import('./usermanagement/billRates/BillRatesDashboard'));\r\n\r\nconst ShopClock = lazy(() => import('./shop/ShopClock'));\r\nconst ShopClockManager = lazy(() => import('./shop/ShopClockManager'));\r\nconst SoDashboard = lazy(() => import('./saleOrder/SODashboard'));\r\nconst PODashboard = lazy(() => import('./purchaseOrders/PODashboard'));\r\n\r\nexport default function Routes({ childProps, isAuthenticated }) {\r\n return (\r\n \r\n {/* Un-Authorized Routes */}\r\n \r\n \r\n \r\n }\r\n props={childProps}\r\n />\r\n\r\n {/* User (Authorized) Routes */}\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 {/* Manager (Authorized) Routes */}\r\n \r\n \r\n \r\n \r\n\r\n {/* Accounting (Authorized) Routes */}\r\n \r\n \r\n \r\n\r\n {/* Admin (Authorized) Routes */}\r\n \r\n \r\n\r\n {/* Not-Found Routes */}\r\n \r\n \r\n );\r\n}\r\n","import React, { useState, useEffect, Suspense, useRef } from 'react';\r\nimport { withRouter } from 'react-router-dom';\r\nimport Routes from './pages/Routes';\r\nimport './App.css';\r\nimport { toast } from 'react-toastify'; // Toast link https://fkhadra.github.io/react-toastify/\r\nimport 'react-toastify/dist/ReactToastify.min.css';\r\nimport { trackPromise, usePromiseTracker } from 'react-promise-tracker';\r\nimport Loader from 'react-loader-spinner';\r\nimport { ThemeProvider, createMuiTheme, responsiveFontSizes } from '@material-ui/core';\r\nimport NavbarWithSidebar from './pages/site/NavbarWithSidebar';\r\nimport { LocalizationProvider } from '@material-ui/pickers';\r\nimport MomentUtils from '@material-ui/pickers/adapter/moment';\r\nimport { ConfirmationServiceProvider } from './contexts/ConfirmContext';\r\nimport CacheBuster from './components/CacheBuster';\r\nimport EmployeeInfoContext from './contexts/EmployeeInfoContext';\r\nimport ToastContext from './contexts/ToastContext';\r\nimport { getMe, deAuthenticate, Employee, getSource, getUsers, getDirectReports, getDefaultClaims, DefaultClaim } from './utils/AccountsAPI';\r\nimport { CYMAJob, getAllJobs, getUserAssignedJobs } from './utils/CYMAAPI';\r\nimport JobsContext from './contexts/JobsContext';\r\nimport UsersContext from './contexts/UsersContext';\r\nimport { toastError } from './utils/Functions';\r\nimport AxiosConfig, { clearBaseURL } from './utils/AxiosConfig';\r\nimport { useUsers } from './hooks/useUsers';\r\nimport { useLayoutEffect } from 'react';\r\nimport DefaultClaimsContext from './contexts/DefaultClaimsContext';\r\nimport { LoadingServiceProvider } from './contexts/LoadingContext';\r\n\r\ntoast.configure();\r\n\r\nexport const LoadingIndicator = ({ open = false }) => {\r\n const { promiseInProgress } = usePromiseTracker();\r\n const ref = useRef(null);\r\n // eslint-disable-next-line\r\n\r\n useLayoutEffect(() => {\r\n const preventScroll = (e) => {\r\n if (e.ctrlKey) e.preventDefault();\r\n };\r\n\r\n ref.current?.addEventListener('wheel', preventScroll);\r\n var div = ref.current;\r\n return () => {\r\n div?.removeEventListener('wheel', preventScroll);\r\n };\r\n });\r\n\r\n return promiseInProgress || open ? (\r\n \r\n \r\n \r\n
\r\n \r\n ) : null;\r\n};\r\n\r\nexport const darkTheme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: '#1976d2', //'#03a9f4', //blue\r\n },\r\n secondary: {\r\n main: '#f57c00', //'#ff8a65', //orange\r\n },\r\n type: 'dark',\r\n },\r\n});\r\n\r\nfunction App(props) {\r\n const [employeeInfo, setEmployeeInfo] = useState();\r\n const [jobs, setJobs] = useState([]);\r\n const [refreshJobs, setRefreshJobs] = useState(1);\r\n const [users, setUsers, updateUser] = useUsers([]);\r\n const [defaultClaims, setDefaultClaims] = useState([]);\r\n\r\n //const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)', { noSsr: true });\r\n const darkMode = true; // (sessionStorage.getItem('isDarkMode') ?? localStorage.getItem('isDarkMode'))?.toLowerCase() === 'true' ?? true; //prefersDarkMode;\r\n const [isDarkMode, setIsDarkMode] = useState(darkMode);\r\n let theme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: '#1976d2', //'#03a9f4', //blue\r\n },\r\n secondary: {\r\n main: '#f57c00', //'#ff8a65', //orange\r\n },\r\n type: isDarkMode ? 'dark' : 'light',\r\n },\r\n overrides: {\r\n MuiTooltip: {\r\n tooltip: {\r\n fontSize: '1em',\r\n },\r\n },\r\n },\r\n });\r\n theme = responsiveFontSizes(theme);\r\n\r\n const isAuthenticated = sessionStorage.getItem('accessToken') ?? localStorage.getItem('accessToken') ? true : false;\r\n\r\n const employeeId = employeeInfo?.id;\r\n const isImpersonating = employeeInfo?.isImpersonating;\r\n const isAccountingUp = employeeInfo?.isInRoles(['Admin', 'Accounting']) ?? false;\r\n const isAdmin = employeeInfo?.isInRole('Admin') ?? false;\r\n\r\n // get logged in user\r\n useEffect(() => {\r\n var source = getSource();\r\n if (!employeeId && isAuthenticated) {\r\n trackPromise(\r\n getMe(source.token).then((user: Employee) => {\r\n if (isImpersonating) user.isImpersonating = true;\r\n setEmployeeInfo(user);\r\n setJobs(user.jobs);\r\n setUsers(user.directReports);\r\n })\r\n ).catch((err) => {\r\n setEmployeeInfo(undefined);\r\n sessionStorage.removeItem('accessToken');\r\n sessionStorage.removeItem('refreshToken');\r\n localStorage.removeItem('accessToken');\r\n localStorage.removeItem('refreshToken');\r\n clearBaseURL();\r\n props.history.push('/Login');\r\n });\r\n }\r\n\r\n return source.cancel;\r\n }, [isAuthenticated, employeeId, isImpersonating, props.history, setUsers]);\r\n\r\n //jobs\r\n useEffect(() => {\r\n var source = getSource();\r\n if (!employeeId || !refreshJobs) return;\r\n if (isAccountingUp)\r\n getAllJobs(true, source.token)\r\n .then((response) => setJobs(response))\r\n .catch((err) => toastError(toast, err));\r\n else\r\n getUserAssignedJobs(employeeId, true, true, true, source.token)\r\n .then((response) => setJobs(response))\r\n .catch((err) => toastError(toast, err));\r\n\r\n return () => source.cancel();\r\n }, [employeeId, isAccountingUp, refreshJobs]);\r\n\r\n //direct reports\r\n useEffect(() => {\r\n var source = getSource();\r\n if (!employeeId) return;\r\n if (!isAccountingUp)\r\n getDirectReports(employeeId, false, false, true, false, source.token)\r\n .then((dr) => setUsers(dr.sort((a, b) => (a.userName < b.userName ? -1 : 1))))\r\n .catch((err) => toastError(toast, err));\r\n else\r\n getUsers(true, false, false, false, false, false, false, source.token)\r\n .then((response) => setUsers(response.sort((a, b) => (a.userName < b.userName ? -1 : 1))))\r\n .catch((err) => toastError(toast, err));\r\n\r\n return () => source.cancel();\r\n }, [employeeId, isAccountingUp, isAdmin, setUsers]);\r\n\r\n //refreshes\r\n useEffect(() => {\r\n var refreshHandle, meHandle;\r\n let source = getSource();\r\n\r\n if (isAuthenticated)\r\n refreshHandle = setInterval(() => {\r\n AxiosConfig.refresh();\r\n }, 30 * 60 * 1000); //every 30 m\r\n\r\n if (isAuthenticated)\r\n meHandle = setInterval(() => {\r\n getMe(source.token)\r\n .then((user: Employee) => {\r\n setEmployeeInfo(user);\r\n })\r\n .catch((err) => toastError(toast, err));\r\n }, 5 * 60 * 1000); //every 5 mins\r\n\r\n return () => {\r\n clearInterval(refreshHandle);\r\n clearInterval(meHandle);\r\n source.cancel();\r\n };\r\n }, [isAuthenticated]);\r\n\r\n //default claims\r\n useEffect(() => {\r\n let source = getSource();\r\n\r\n if (isAuthenticated)\r\n getDefaultClaims()\r\n .then((claims) => setDefaultClaims(claims))\r\n .catch((err) => toastError(toast, err));\r\n\r\n return source.cancel;\r\n }, [isAuthenticated]);\r\n\r\n //Sets\r\n const userHasAuthenticated = (authenticated: boolean, location: string, empInfo: Employee) => {\r\n if (authenticated) props.history.push(location && location !== '/Login' ? location ?? '' : empInfo.getClaimValue('defaultHome') ?? '/');\r\n };\r\n\r\n //deauth for logouts\r\n const handleLogout = (event) => {\r\n deAuthenticate()\r\n .catch(() => Promise.resolve())\r\n .then(() => {\r\n setEmployeeInfo(undefined);\r\n toast.dismiss();\r\n\r\n sessionStorage.clear();\r\n localStorage.clear();\r\n props.history.push('/Login');\r\n });\r\n };\r\n\r\n const toggleTheme = () => {\r\n sessionStorage.setItem('isDarkMode', (!isDarkMode).toString());\r\n localStorage.setItem('isDarkMode', (!isDarkMode).toString());\r\n setIsDarkMode(!isDarkMode);\r\n };\r\n\r\n //pass all these props to children\r\n const childProps = {\r\n isAuthenticated: isAuthenticated,\r\n userHasAuthenticated: userHasAuthenticated,\r\n employeeInfo: employeeInfo,\r\n toast,\r\n toggleTheme,\r\n isDarkMode,\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n setRefreshJobs((r) => r + 1)]}>\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}\r\n\r\nexport default withRouter(App);\r\n","import React, { useContext } from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n Button,\r\n ListItem,\r\n List,\r\n ListItemText,\r\n useMediaQuery,\r\n ListItemSecondaryAction,\r\n Switch,\r\n ListSubheader,\r\n Select,\r\n MenuItem,\r\n IconButton,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { AccountCircle, ArrowForwardIos, ContactMail, ExitToApp, Help } from '@material-ui/icons';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport EmployeeInfoContext from '../../contexts/EmployeeInfoContext';\r\nimport { Claim, deleteClaimForUser, putClaim, impersonate, unImpersonate, Employee } from '../../utils/AccountsAPI';\r\nimport { globalAny } from './NavbarWithSidebar';\r\nimport { cloneDeep } from 'lodash';\r\nimport { toastError } from '../../utils/Functions';\r\nimport ToastContext from '../../contexts/ToastContext';\r\nimport { storeBaseURL, getBaseUrlName } from '../../utils/AxiosConfig';\r\nimport { UserAutocomplete } from '../../components/UserAutocomplete';\r\nimport { useUsersContext } from '../../hooks/useUsersContext';\r\nimport clsx from 'clsx';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n backButton: { position: 'absolute', left: theme.spacing(1), top: theme.spacing(1) },\r\n backIcon: { transform: 'rotate(.5turn) translateX(2px)' },\r\n dialogTitle: {\r\n backgroundColor: theme.palette.primary.main,\r\n textAlign: 'center',\r\n },\r\n dialogContent: {\r\n display: 'flex',\r\n padding: theme.spacing(1) + 'px 0',\r\n },\r\n centerContent: {\r\n width: '100%',\r\n },\r\n partData: {\r\n padding: theme.spacing(1),\r\n border: '1px solid rgba(0,0,0,.24)',\r\n margin: theme.spacing(2),\r\n },\r\n list: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n width: '100%',\r\n },\r\n listItem: {\r\n width: '100%',\r\n display: 'inline-flex',\r\n },\r\n listItemStatus: {\r\n padding: theme.spacing(1),\r\n paddingRight: 0,\r\n paddingLeft: theme.spacing(2),\r\n width: '100%',\r\n display: 'grid',\r\n gridTemplateColumns: '20% 30% 10% 40%',\r\n },\r\n listItemLabel: {\r\n padding: '4px 0',\r\n },\r\n listItemField: {\r\n margin: 'auto',\r\n marginRight: 0,\r\n width: 'min(150px,70%)',\r\n textAlign: 'right',\r\n },\r\n listIcon: {\r\n margin: 'auto',\r\n marginRight: 0,\r\n color: theme.palette.grey[500],\r\n },\r\n formControl: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n formControlEarningsType: {\r\n margin: 'auto',\r\n marginRight: 0,\r\n width: 'min(150px,70%)',\r\n },\r\n bold: {\r\n fontWeight: 'bold',\r\n },\r\n autocomplete: {},\r\n listItemImpersonate: { height: '72px' },\r\n}));\r\n\r\nexport default function SettingsDialog(props) {\r\n const classes = useStyles(props);\r\n const theme = useTheme();\r\n const [employeeInfo, setEmployeeInfo] = useContext(EmployeeInfoContext);\r\n const toast = useContext(ToastContext);\r\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n\r\n const [users] = useUsersContext();\r\n\r\n const history = useHistory();\r\n const location = useLocation();\r\n\r\n const goToLocation = (location) => (e) => {\r\n if (isMobile) props.onClose();\r\n history.push(location);\r\n };\r\n\r\n const onAPISwitch = (e) => {\r\n storeBaseURL(e.target.value);\r\n history.replace(location.pathname, location.state);\r\n };\r\n\r\n const onRoleChange = (event) => {\r\n const values = event.target.value;\r\n const clone = cloneDeep(employeeInfo);\r\n clone?.setRoles(values);\r\n setEmployeeInfo(clone);\r\n };\r\n\r\n const toggleWeekEnding = () => {\r\n if (!employeeInfo) return;\r\n\r\n const claim = { claimType: 'defaultPreviousWeekEnding', claimValue: 'true' } as Claim;\r\n let promise;\r\n var prevEmpInfo = employeeInfo;\r\n\r\n const clone = cloneDeep(employeeInfo);\r\n\r\n let existingClaim = employeeInfo?.getClaim('defaultPreviousWeekEnding');\r\n\r\n if (existingClaim) {\r\n promise = deleteClaimForUser(employeeInfo.id, 'defaultPreviousWeekEnding');\r\n clone.removeClaim(existingClaim.id);\r\n setEmployeeInfo(clone);\r\n } else {\r\n promise = putClaim(employeeInfo?.id, claim).then((c) => {\r\n clone.addClaim(c);\r\n setEmployeeInfo(clone);\r\n });\r\n }\r\n\r\n promise.catch((e) => {\r\n setEmployeeInfo(prevEmpInfo);\r\n toastError(toast, e);\r\n });\r\n };\r\n\r\n const onRevertImpersonate = (e) => {\r\n unImpersonate()\r\n .then((response) => setEmployeeInfo(undefined))\r\n .catch((err) => toastError(toast, err));\r\n };\r\n\r\n const onSelectUser = (e, value) => {\r\n if (value?.id)\r\n impersonate(value?.id)\r\n .then((response) => setEmployeeInfo(new Employee({ isImpersonating: true } as Employee)))\r\n .catch((err) => toastError(toast, err));\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Settings\r\n \r\n \r\n \r\n {/* Account */}\r\n {employeeInfo ? (\r\n <>\r\n Account\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n props.onClose();\r\n props.handleLogout();\r\n }}\r\n className={classes.listItem}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n\r\n {/* Settings */}\r\n Settings\r\n {/* \r\n \r\n \r\n \r\n \r\n */}\r\n {employeeInfo ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n\r\n {/* Admin Settings */}\r\n {employeeInfo?.wasInRole('Admin') || employeeInfo?.isImpersonating ? (\r\n <>\r\n Admin\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 {employeeInfo.isImpersonating ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n ) : null}\r\n\r\n {/* About */}\r\n About\r\n {/* window.open('https://sdsma.formstack.com/forms/sds_support_request', '_blank')} className={classes.listItem}> */}\r\n window.open('https://sdsma.on.spiceworks.com/portal', '_blank')} className={classes.listItem}>\r\n \r\n \r\n \r\n \r\n \r\n window.open('https://sdsma.com/tips', '_blank')} className={classes.listItem}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n SDS\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","// for cache busting\r\n// https://dev.to/flexdinesh/cache-busting-a-react-app-22lk\r\n\r\nimport React from 'react';\r\n\r\nimport packageJson from '../../package.json';\r\nglobal.appVersion = packageJson.version;\r\nglobal.buildId = packageJson.buildId;\r\n\r\nconst semverGreaterThan = (versionA, versionB) => {\r\n const versionsA = versionA.split(/\\./g);\r\n\r\n const versionsB = versionB.split(/\\./g);\r\n while (versionsA.length || versionsB.length) {\r\n const a = Number(versionsA.shift());\r\n\r\n const b = Number(versionsB.shift());\r\n // eslint-disable-next-line no-continue\r\n if (a === b) continue;\r\n // eslint-disable-next-line no-restricted-globals\r\n return a > b || isNaN(b);\r\n }\r\n return false;\r\n};\r\n\r\nexport default class CacheBuster extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n loading: true,\r\n isLatestVersion: false,\r\n refreshCacheAndReload: () => {\r\n console.log('Clearing cache and hard reloading...');\r\n var promises = [];\r\n if (caches) {\r\n // Service worker cache should be cleared with caches.delete()\r\n caches.keys().then(function (names) {\r\n for (let name of names) promises.push(caches.delete(name));\r\n });\r\n }\r\n // delete browser cache and hard reload\r\n Promise.all(promises).then(() => {\r\n window.location.reload(true);\r\n });\r\n },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n fetch('/meta.json')\r\n .then((response) => response.json())\r\n .then((meta) => {\r\n const latestVersion = meta.version;\r\n const currentVersion = global.appVersion;\r\n\r\n const latestBuildId = meta.buildId;\r\n const currentBuildId = global.buildId;\r\n\r\n const shouldForceRefresh = semverGreaterThan(latestVersion, currentVersion);\r\n const isLatestBuild = latestBuildId === currentBuildId;\r\n\r\n if (shouldForceRefresh || !isLatestBuild) {\r\n if (shouldForceRefresh) console.log(`We have a new version - ${latestVersion}. Should force refresh`);\r\n if (!isLatestBuild) console.log(`We have a new build - ${currentBuildId}. Should force refresh`);\r\n this.state.refreshCacheAndReload();\r\n } else {\r\n console.log(`You already have the latest version and build - ${latestVersion}. No cache refresh needed.`);\r\n this.setState({ loading: false, isLatestVersion: true });\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n return {global.appVersion};\r\n }\r\n}\r\n","import { useMountEffect } from './useMountEffect';\r\n\r\nexport const useLoadContextEffect = (dispatch, value) => {\r\n useMountEffect(() => {\r\n dispatch((a) => {\r\n return { ...a, ...value };\r\n });\r\n });\r\n};\r\n\r\nexport default useLoadContextEffect;\r\n","import { useContext, useState } from 'react';\r\nimport { useLoadContextEffect } from './useLoadContextEffect';\r\nimport { v4 as uuid } from 'uuid';\r\n\r\nexport const useLoadContext = (context, initialValue) => {\r\n const [updateId] = useState(uuid());\r\n const [value, setValue] = useContext(context);\r\n\r\n useLoadContextEffect(setValue, { ...initialValue, updateId });\r\n const loaded = value.updateId === updateId;\r\n\r\n return [value, setValue, loaded];\r\n};\r\n\r\nexport default useLoadContext;\r\n","import StateContext from './StateContext';\r\nimport { Employee } from '../utils/AccountsAPI';\r\n\r\nexport const EmployeeInfoContext = StateContext([{}, () => { }]);\r\n\r\nexport default EmployeeInfoContext;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\nimport './index.css';\r\nimport App from './App.tsx';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { debounce } from 'lodash'\r\n\r\nimport { LicenseManager } from \"ag-grid-enterprise\";\r\nLicenseManager.setLicenseKey(\"SDS_Mechanical__Automation_SDSMA_multi_2_Devs__6_January_2021_[v2]_MTYwOTg5MTIwMDAwMA==fe67df600eb759074885c4c2eb801f7c\");\r\n\r\nconst appHeight = () => {\r\n let iH = window.innerHeight;\r\n document.documentElement.style.setProperty('--innerHeight', `${iH}px`)\r\n}\r\n\r\nwindow.addEventListener('resize', debounce(appHeight, 100))\r\nappHeight()\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.register();\r\n","import { AxiosRequestConfig, CancelToken } from 'axios';\r\nimport dateFormat from 'dateformat';\r\nimport moment from 'moment';\r\nimport { Employee, User } from './AccountsAPI';\r\nimport AxiosConfig from './AxiosConfig';\r\nimport { getUTCDateString } from './Functions';\r\nimport { getWeekEndingDate, isNumeric, parseStringNumber } from './TSFunctions';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*-------------------------------Jobs-------------------------------------*/\r\n\r\nexport function getAllJobs(includeClosedJobs: boolean = false, token?: CancelToken): Promise {\r\n var url = '/cyma/jobs';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n config.params = {} as any;\r\n }\r\n\r\n if (includeClosedJobs !== undefined) config.params.includeClosedJobs = includeClosedJobs;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getJob(jobNumber: string, getFullJob: boolean = false, token?: CancelToken): Promise {\r\n var url = '/cyma/jobs/' + jobNumber;\r\n\r\n var config: AxiosRequestConfig = { params: {} };\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n if (getFullJob !== undefined) config.params.getFullJob = getFullJob;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putJob(jobNumber: string, visibleUntilDate: Date, token?: CancelToken): Promise {\r\n var url = '/cyma/jobs/' + jobNumber;\r\n\r\n var config: any = { params: {} };\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n if (visibleUntilDate !== undefined) config.params.visibleUntilDate = moment(visibleUntilDate).toISOString();\r\n\r\n return axiosInstance.put(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getUsersForJob(jobNumber: string, token?: CancelToken): Promise {\r\n var url = '/cyma/jobs/' + jobNumber + '/accounts';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data.map((d) => new Employee(d)));\r\n}\r\n\r\nexport function getUserAssignedJobs(\r\n userId: string,\r\n includeClosedJobs?: boolean,\r\n includeClosedCostCodes?: boolean,\r\n fullJob?: boolean,\r\n token?: CancelToken\r\n): Promise {\r\n var url = '/accounts/' + userId + '/jobs';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n config.params = {} as any;\r\n }\r\n\r\n if (includeClosedJobs !== undefined) config.params.includeClosedJobs = includeClosedJobs;\r\n if (includeClosedCostCodes !== undefined) config.params.includeClosedCostCodes = includeClosedCostCodes;\r\n if (fullJob !== undefined) config.params.fullJob = fullJob;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getSchedulerJobAssignments(userId: string, periodEndingDate: Date, token?: CancelToken): Promise {\r\n var url = `/schedule/${userId}/jobs`;\r\n\r\n var config: AxiosRequestConfig = { params: {} };\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n if (periodEndingDate !== undefined) config.params.periodEndingDate = getUTCDateString(getWeekEndingDate(periodEndingDate));\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data.map((job) => ({ ...job, isSchedule: true })));\r\n}\r\n\r\nexport function putUserJobs(userId: string, jobs: CYMAJob[]): Promise {\r\n const url = `accounts/${userId}/jobs`;\r\n return axiosInstance.put(url, jobs).then((response) => response.data);\r\n}\r\n\r\nexport function postUserJob(userId: string, job: CYMAJob): Promise {\r\n const url = `accounts/${userId}/jobs`;\r\n return axiosInstance.post(url, job).then((response) => response.data);\r\n}\r\n\r\nexport function deleteUserJob(userId: string, job: CYMAJob): Promise {\r\n const url = `accounts/${userId}/jobs`;\r\n const config = { data: job };\r\n return axiosInstance.delete(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function postJobAccessRequest(jobNumber: string, message: string): Promise {\r\n const url = `cyma/jobs/${jobNumber}/access`;\r\n return axiosInstance.post(url, { message }).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Cost Codes-------------------------------------*/\r\n\r\nexport function getCostCodesforJob(jobNumber: string, token?: CancelToken): Promise {\r\n const url = '/cyma/jobs/' + jobNumber + '/costcodes';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putCostCodeDescriptionAndClosed(code: CostCode): Promise {\r\n const url = `cyma/jobs/${code.jobNumber}/costcodes/${code.code}`;\r\n\r\n var body = new FormData();\r\n body.append('description', code.description);\r\n body.append('dateClosed', code.dateClosed ? dateFormat(code.dateClosed, 'isoUtcDateTime') : '');\r\n\r\n var config: any = { headers: { 'Content-Type': 'multipart/form-data' } };\r\n\r\n return axiosInstance.put(url, body, config).then((response) => response.data);\r\n}\r\n\r\nexport function putUserCostCodes(userId: string, codes: CostCode[]): Promise {\r\n const url = `accounts/${userId}/costcodes`;\r\n return axiosInstance.put(url, codes).then((response) => response.data);\r\n}\r\n\r\nexport function postUserCostCode(userId: string, code: CostCode): Promise {\r\n const url = `accounts/${userId}/costcodes`;\r\n return axiosInstance.post(url, code).then((response) => response.data);\r\n}\r\n\r\nexport function deleteUserCostCode(userId: string, code: CostCode): Promise {\r\n const url = `accounts/${userId}/costcodes`;\r\n const config = { data: code };\r\n return axiosInstance.delete(url, config).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Earnings Types-------------------------------------*/\r\nexport function getEarningsTypesForUser(userId: string, token?: CancelToken): Promise {\r\n const url = '/accounts/' + userId + '/earningstypes';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------GL Codes-------------------------------------*/\r\n\r\nexport function getCYMAGl(token?: CancelToken): Promise {\r\n var url = '/cyma/gl';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Skills-------------------------------------*/\r\n\r\nexport function getSkills(token?: CancelToken): Promise {\r\n const url = '/cyma/skills';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putSkill(skill: Skill): Promise {\r\n const url = `cyma/skills`;\r\n return axiosInstance.put(url, skill).then((response) => response.data);\r\n}\r\n\r\nexport function assignSkillToUser(userId: string, skill: Skill): Promise {\r\n const url = `accounts/${userId}/skills`;\r\n return axiosInstance.post(url, skill).then((response) => response.data);\r\n}\r\n\r\nexport function removeSkillFromUser(userId: string, skill: Skill): Promise {\r\n const url = `accounts/${userId}/skills/${skill.name}`;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n}\r\n\r\nexport function deleteSkill(skill: Skill): Promise {\r\n const url = `cyma/skills/${skill.name}`;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Bill Rates-------------------------------------*/\r\n\r\nexport function getBillRates(token?: CancelToken): Promise {\r\n const url = '/cyma/billrates';\r\n\r\n var config: any = {};\r\n if (token !== undefined) config.cancelToken = token;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function putBillRate(rate: BillRate, saveAsNew = false): Promise {\r\n const url = `cyma/billrates?createNew=${saveAsNew ? 'true' : 'false'}`;\r\n return axiosInstance.put(url, rate).then((response) => response.data);\r\n}\r\n\r\nexport function deleteBillRate(rate: BillRate): Promise {\r\n const url = `cyma/billrates/${rate.id}`;\r\n return axiosInstance.delete(url).then((response) => response.data);\r\n}\r\n\r\nexport function isBillRateValid(rate: BillRate): string[] {\r\n const errors: string[] = [];\r\n if (!rate.skill) errors.push('Bill rate must have skill!');\r\n if (!rate.regRate || !isNumeric(rate.regRate) || rate.regRate < 0) errors.push('Reg rate must be a valid positive number!');\r\n if (!rate.otRate || !isNumeric(rate.otRate) || rate.otRate < 0) errors.push('OT rate must be a valid positive number!');\r\n return errors;\r\n}\r\n\r\nexport const validateRate = (rate?: string | number) => {\r\n return rate === null || rate === undefined || rate === '' || (isNumeric(rate) && parseStringNumber(rate) >= 0);\r\n};\r\n\r\n/*-------------------------------Customer-------------------------------------*/\r\n\r\nexport function getCustomers(token?: CancelToken): Promise {\r\n const url = '/cyma/customers';\r\n\r\n var config: any = {};\r\n if (token !== undefined) config.cancelToken = token;\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport interface CYMAJob {\r\n jobNumber: string;\r\n desc?: string;\r\n typeId?: string;\r\n custId?: string;\r\n custName?: string;\r\n manager?: string;\r\n startDate?: Date;\r\n endDate?: Date;\r\n open?: boolean;\r\n visibleUntil?: Date;\r\n\r\n contractVal?: number;\r\n billToDate?: number;\r\n costToDate?: number;\r\n pymtToDate?: number;\r\n\r\n //location\r\n locationName?: string;\r\n address1?: string;\r\n address2?: string;\r\n city?: string;\r\n state?: string;\r\n country?: string;\r\n\r\n isSchedule?: boolean;\r\n\r\n users?: User[];\r\n costCodes?: CostCode[];\r\n}\r\n\r\nexport interface FullCYMAJob extends CYMAJob {\r\n masterJobId?: string;\r\n futureField?: string;\r\n contractNo?: string;\r\n orderNo?: string;\r\n billing?: number;\r\n bdgtToDate?: number;\r\n chargeCost?: number;\r\n dmPct?: number;\r\n dlPct?: number;\r\n subPct?: number;\r\n odcPct?: number;\r\n ovhPct?: number;\r\n unkPct?: number;\r\n costPct?: number;\r\n budgetType?: number;\r\n segment1?: string;\r\n segment2?: string;\r\n segment3?: string;\r\n segment4?: string;\r\n segment5?: string;\r\n applyGa?: boolean;\r\n exceedContract?: boolean;\r\n applyOvh?: boolean;\r\n invoiceBy?: number;\r\n useSalesAccount?: number;\r\n invoiceFee?: number;\r\n fee?: boolean;\r\n fixedFee?: number;\r\n feeProdId?: string;\r\n changeOrd?: number;\r\n invoiceDl?: number;\r\n markUpBy?: number;\r\n begInvToDate?: number;\r\n begPymToDate?: number;\r\n retProd?: string;\r\n retPct?: number;\r\n locationId?: string;\r\n costCode?: boolean;\r\n ref1?: string;\r\n ref2?: string;\r\n ref3?: string;\r\n sellerId?: string;\r\n certified?: boolean;\r\n groupId?: string;\r\n unused?: string;\r\n createdBy?: string;\r\n updatedBy?: string;\r\n lastModified?: Date;\r\n}\r\n\r\nexport interface EarningsType {\r\n vwId: number;\r\n empId: number;\r\n typeRcdId: number;\r\n longName: string;\r\n shortName: string;\r\n includeInWebPortal: boolean;\r\n canReplaceJob: boolean;\r\n status: number;\r\n}\r\n\r\nexport interface CostCode {\r\n jobNumber: string;\r\n code: string;\r\n description: string;\r\n dateClosed: Date;\r\n revAmt?: number;\r\n budgAmt?: number;\r\n contractAmt?: number;\r\n\r\n //injected\r\n totalInvoiced?: number;\r\n materialCost?: number;\r\n openPOValue?: number;\r\n laborCostBillable?: number;\r\n laborCostPay?: number;\r\n otherCost?: number;\r\n\r\n createdBy?: string;\r\n createdDate?: Date;\r\n updatedBy?: string;\r\n updatedDate?: Date;\r\n budgUnits?: number;\r\n unitCost?: number;\r\n billChgOrd?: number;\r\n nonBillChgOrd?: number;\r\n fldMeasure?: number;\r\n estToComplete?: number;\r\n markUpPct?: number;\r\n billable?: boolean;\r\n estUnits?: number;\r\n compUnits?: number;\r\n unused?: string;\r\n\r\n users: User[];\r\n}\r\n\r\nexport function totalCCCost(cc?: CostCode, isAdmin: boolean = false) {\r\n return (cc?.openPOValue ?? 0) + (cc?.materialCost ?? 0) + (cc?.otherCost ?? 0) + (isAdmin ? cc?.laborCostPay ?? 0 : cc?.laborCostBillable ?? 0);\r\n}\r\n\r\nexport interface CYMAGl {\r\n account: string;\r\n status: string;\r\n description: string;\r\n retEarnAcct: string;\r\n accountType: string;\r\n statementId: string;\r\n ratioId: string;\r\n classType: string;\r\n debitBoolean: boolean;\r\n cashflowType: string;\r\n createUserId: string;\r\n noteAutoPopup: boolean;\r\n segment1: string;\r\n segment2: string;\r\n segment3: string;\r\n segment4: string;\r\n segment5: string;\r\n segment6: string;\r\n segment7: string;\r\n segment8: string;\r\n segment9: string;\r\n segment10: string;\r\n accntIdStr: string;\r\n bUnused: boolean;\r\n subType: string;\r\n tdc: string;\r\n subTdc: string;\r\n activity: string;\r\n property: string;\r\n subTdcDesc: string;\r\n encumber: string;\r\n parentAccountId: string;\r\n coe: string;\r\n fundSrc: string;\r\n printSummary: boolean;\r\n createdDate: Date;\r\n updatedDate: Date;\r\n costRptId: string;\r\n unused: string;\r\n}\r\n\r\nexport interface Skill {\r\n name: string;\r\n description?: string;\r\n}\r\n\r\nexport interface BillRate {\r\n id?: number;\r\n skill?: string; //required\r\n regRate?: number; //required\r\n otRate?: number; //required\r\n custId?: string;\r\n jobNumber?: string;\r\n userId?: string;\r\n user?: User;\r\n isDisabled?: boolean;\r\n effectiveDate?: Date;\r\n}\r\n\r\nexport interface Customer {\r\n custId: string;\r\n method: number;\r\n typeId: string;\r\n name: string;\r\n address: string;\r\n address2: string;\r\n city: string;\r\n state: string;\r\n zip: string;\r\n country: string;\r\n phone: string;\r\n termsCode: string;\r\n emailAddress: string;\r\n}\r\n","import Axios from 'axios';\r\n\r\nvar dateFormat = require('dateformat'); //formats dates very well\r\n\r\nexport function insertObjectIntoSorted(array, newItem, key) {\r\n var low = 0;\r\n var high = array.length;\r\n\r\n while (low < high) {\r\n var mid = (low + high) >>> 1; //integer division\r\n if (array[mid][key] < newItem[key]) low = mid + 1;\r\n else high = mid;\r\n }\r\n\r\n array.splice(low, 0, newItem);\r\n\r\n return array;\r\n}\r\n\r\n//https://stackoverflow.com/questions/3426404/create-a-hexadecimal-colour-based-on-a-string-with-javascript\r\nexport function strToRGB(str = '') {\r\n var hash = 0;\r\n for (var i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n\r\n var c = ((hash * 100) & 0x00ffffff).toString(16).toUpperCase();\r\n\r\n return '#' + '00000'.substring(0, 6 - c.length) + c;\r\n}\r\n\r\nexport function getRGBLightness(str) {\r\n var r,\r\n g,\r\n b = 0;\r\n r = parseInt('0x' + str.substring(1, 3));\r\n g = parseInt('0x' + str.substring(3, 5));\r\n b = parseInt('0x' + str.substring(5, 7));\r\n return (r + g + b) / 3;\r\n}\r\n\r\nexport function strToCSSString(str, opacity) {\r\n var r,\r\n g,\r\n b = 0;\r\n r = parseInt('0x' + str.substring(1, 3));\r\n g = parseInt('0x' + str.substring(3, 5));\r\n b = parseInt('0x' + str.substring(5, 7));\r\n return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';\r\n}\r\n\r\nexport function isGUID(str) {\r\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);\r\n}\r\n\r\n//https://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors\r\n// Version 4.0\r\n// percentage (+-1), color 0, color 1, true/false for linear/log blending\r\nexport const pSBC = (p, c0, c1, l) => {\r\n let r,\r\n g,\r\n b,\r\n P,\r\n f,\r\n t,\r\n h,\r\n i = parseInt,\r\n m = Math.round,\r\n a = typeof c1 == 'string';\r\n if (typeof p !== 'number' || p < -1 || p > 1 || typeof c0 !== 'string' || (c0[0] !== 'r' && c0[0] !== '#') || (c1 && !a)) return null;\r\n var pSBCr = (d) => {\r\n let n = d.length,\r\n x = {};\r\n if (n > 9) {\r\n [r, g, b, a] = d = d.split(',');\r\n n = d.length;\r\n if (n < 3 || n > 4) return null;\r\n x.r = i(r[3] === 'a' ? r.slice(5) : r.slice(4));\r\n x.g = i(g);\r\n x.b = i(b);\r\n x.a = a ? parseFloat(a) : -1;\r\n } else {\r\n if (n === 8 || n === 6 || n < 4) return null;\r\n if (n < 6) d = '#' + d[1] + d[1] + d[2] + d[2] + d[3] + d[3] + (n > 4 ? d[4] + d[4] : '');\r\n d = i(d.slice(1), 16);\r\n if (n === 9 || n === 5) {\r\n // eslint-disable-next-line\r\n x.r = (d >> 24) & 255;\r\n // eslint-disable-next-line\r\n x.g = (d >> 16) & 255;\r\n // eslint-disable-next-line\r\n x.b = (d >> 8) & 255;\r\n x.a = m((d & 255) / 0.255) / 1000;\r\n } else {\r\n // eslint-disable-next-line\r\n x.r = d >> 16;\r\n // eslint-disable-next-line\r\n x.g = (d >> 8) & 255;\r\n // eslint-disable-next-line\r\n x.b = d & 255;\r\n x.a = -1;\r\n }\r\n }\r\n return x;\r\n };\r\n h = c0.length > 9;\r\n h = a ? (c1.length > 9 ? true : c1 === 'c' ? !h : false) : h;\r\n f = pSBCr(c0);\r\n P = p < 0;\r\n t = c1 && c1 !== 'c' ? pSBCr(c1) : P ? { r: 0, g: 0, b: 0, a: -1 } : { r: 255, g: 255, b: 255, a: -1 };\r\n p = P ? p * -1 : p;\r\n P = 1 - p;\r\n if (!f || !t) return null;\r\n if (l) {\r\n r = m(P * f.r + p * t.r);\r\n g = m(P * f.g + p * t.g);\r\n b = m(P * f.b + p * t.b);\r\n } else {\r\n r = m((P * f.r ** 2 + p * t.r ** 2) ** 0.5);\r\n g = m((P * f.g ** 2 + p * t.g ** 2) ** 0.5);\r\n b = m((P * f.b ** 2 + p * t.b ** 2) ** 0.5);\r\n }\r\n a = f.a;\r\n t = t.a;\r\n f = a >= 0 || t >= 0;\r\n a = f ? (a < 0 ? t : t < 0 ? a : a * P + t * p) : 0;\r\n if (h) return 'rgb' + (f ? 'a(' : '(') + r + ',' + g + ',' + b + (f ? ',' + m(a * 1000) / 1000 : '') + ')';\r\n else return '#' + (4294967296 + r * 16777216 + g * 65536 + b * 256 + (f ? m(a * 255) : 0)).toString(16).slice(1, f ? undefined : -2);\r\n};\r\n\r\nexport function toastError(toast, err) {\r\n if (!Axios.isCancel(err))\r\n toast.error(\r\n 'Error: ' + err\r\n ? err?.response\r\n ? err.response.data\r\n ? err.response.data.message ?? err.response.data.Message ?? err.message ?? err.response.data\r\n : err?.response?.message ?? 'Undefined Error'\r\n : err?.message ?? err.toString() ?? 'Undefined Error'\r\n : 'Undefined Error',\r\n {\r\n position: 'bottom-left',\r\n autoClose: 10000,\r\n hideProgressBar: false,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n }\r\n );\r\n}\r\n\r\nexport function toastSuccess(toast, msg, timeout = 5000) {\r\n toast.success(msg, {\r\n position: 'bottom-left',\r\n autoClose: timeout,\r\n hideProgressBar: false,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n });\r\n}\r\n\r\nexport function getLocalDateString(date) {\r\n var dateParsed = new Date(Date.parse(date));\r\n return dateFormat(dateParsed, 'yyyy-mm-dd');\r\n}\r\n\r\nexport function getUTCDateString(date, format) {\r\n if (date) {\r\n if (typeof date === 'string') {\r\n try {\r\n return dateFormat(date, format ?? 'yyyy-mm-dd', true);\r\n } catch {\r\n return '';\r\n }\r\n } else {\r\n return dateFormat(new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()), format ?? 'yyyy-mm-dd');\r\n }\r\n } else {\r\n return '';\r\n }\r\n}\r\n\r\n//This is used in agGrid or anything that need a data converted to American format\r\nexport function getUTCAmericanDateString(date) {\r\n if (date) {\r\n if (typeof date === 'string') {\r\n return dateFormat(date, 'yyyy-mm-dd', true);\r\n } else {\r\n return dateFormat(new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()), 'yyyy-mm-dd');\r\n }\r\n } else {\r\n return '';\r\n }\r\n}\r\n\r\n//https://stackoverflow.com/questions/563406/add-days-to-javascript-date\r\n// eslint-disable-next-line\r\nDate.prototype.addDays = function (days) {\r\n var date = new Date(this.valueOf());\r\n date.setUTCDate(date.getUTCDate() + days);\r\n return date;\r\n};\r\n\r\n//https://stackoverflow.com/questions/563406/add-days-to-javascript-date\r\n// eslint-disable-next-line\r\nexport const addDays = function (date, days) {\r\n var newDate = new Date(date?.valueOf() ?? 0);\r\n newDate.setUTCDate((date?.getUTCDate() ?? 0) + days);\r\n return newDate;\r\n};\r\n\r\nexport function unCamelCase(str) {\r\n return (\r\n str // insert a space before all single caps\r\n ?.replace(/([A-Z][a-z])/g, ' $1')\r\n // uppercase the first character\r\n ?.replace(/^./, function (str) {\r\n return str.toUpperCase();\r\n })\r\n );\r\n}\r\n\r\n/*\r\nconst useBetterCallback = (callback, values) => {\r\n const self = useRef({\r\n values: values,\r\n handler: (...args) => {\r\n return callback(...args, self.current.values)\r\n }\r\n });\r\n self.current.values = values\r\n return self.current.handler\r\n}\r\n*/\r\nexport function EmpitifyJson(toEmpty, emptyDefaults = { string: '', boolean: 'false', number: '0', undefined: '' }) {\r\n let data = toEmpty;\r\n let keys = Object.keys(data);\r\n keys.forEach((key) => {\r\n let type = typeof data[key];\r\n if (type === 'object') {\r\n //RECUSION\r\n data[key] = EmpitifyJson(data[key]);\r\n } else if (type) {\r\n data[key] = emptyDefaults[type];\r\n } else {\r\n data[key] = null;\r\n }\r\n });\r\n return data;\r\n}\r\n\r\n//http://blog.nicohaemhouts.com/2015/08/03/accessing-nested-javascript-objects-with-string-key/\r\nexport function getNested(theObject, path, separator = '.') {\r\n try {\r\n return path\r\n .replace('[', separator)\r\n .replace(']', '')\r\n .split(separator)\r\n .reduce((obj, property) => {\r\n return obj[property];\r\n }, theObject);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n}\r\n\r\n//altered from above\r\nexport function setNested(theObject, newVal, path, separator = '.') {\r\n try {\r\n return path\r\n .replace('[', separator)\r\n .replace(']', '')\r\n .split(separator)\r\n .reduce((obj, property, i, src) => {\r\n if (i === src.length - 1) obj[property] = newVal;\r\n return obj[property];\r\n }, theObject);\r\n } catch (err) {\r\n return undefined;\r\n }\r\n}\r\n","import { AxiosResponse, CancelToken } from 'axios';\r\nimport { User } from '../../utils/AccountsAPI';\r\nimport { CreatedUpdatedTable } from '../../utils/APIReturnTypes';\r\nimport AxiosConfig from '../../utils/AxiosConfig';\r\nimport { CostCode } from '../../utils/CYMAAPI';\r\nimport { getUTCAmericanDateString, getUTCDateString } from '../../utils/Functions';\r\nimport { ShopJobParts } from '../shop/ShopJobsAPI';\r\n\r\nconst axiosInstance = AxiosConfig.instance();\r\n\r\n/*-------------------------------Timesheet-------------------------------------*/\r\nexport function getTimesheetById(id: string, token?: CancelToken): Promise {\r\n const url = '/timesheets/' + id;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function getTimesheetForWeekEnding(userId: string, weekEndingDate: string, token?: CancelToken): Promise {\r\n const url = '/accounts/' + userId + '/timesheets/' + weekEndingDate;\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => response.data);\r\n}\r\n\r\nexport function postTimesheet(timesheet: TimeRecordHeader): Promise {\r\n const url = '/timesheets';\r\n\r\n return axiosInstance.post(url, timesheet).then((response) => response.data);\r\n}\r\n\r\nexport function putTimesheet(timesheet: TimeRecordHeader): Promise {\r\n const url = '/timesheets/' + timesheet.id;\r\n\r\n return axiosInstance.put(url, timesheet).then((response) => response.data);\r\n}\r\n\r\nexport function putTimesheetApproval(userId: string, type: 'manager' | 'accounting', approved: boolean): Promise {\r\n const url = `/timesheets/${userId}/approvals/${type}/${approved}`;\r\n\r\n return axiosInstance.put(url).then((response) => response.data);\r\n}\r\n\r\nexport function getTimesheetsForJob(jobNumber: string, weekEndingDate?: string, token?: CancelToken): Promise {\r\n const url = `cyma/jobs/${jobNumber}/timesheets`;\r\n\r\n var config: any = { params: {} };\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n if (weekEndingDate !== undefined) config.params.weekEnding = getUTCDateString(weekEndingDate, 'yyyy-mm-dd');\r\n\r\n return axiosInstance.get(url, config).then((response) =>\r\n (response.data as TimeRecordHeader[]).flatMap((header) => {\r\n return header.details.map((detail) => {\r\n detail.header = header;\r\n return detail;\r\n });\r\n })\r\n );\r\n}\r\n\r\n/*-------------------------------Email Notifications-------------------------------*/\r\nexport function sendRequestToReopenEmail(\r\n userName: string,\r\n date: Date,\r\n recordType: 'Timesheet' | 'Expense Report' | 'Credit Card Report',\r\n message?: string,\r\n token?: CancelToken\r\n) {\r\n const url = '/accounts/users/' + userName + '/requesttoreopen';\r\n\r\n var config: any = {};\r\n if (token) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.post(url, { message, date, recordType }, config);\r\n}\r\n\r\nexport function sendTimesheetReminder(userId: string, token?: CancelToken) {\r\n const url = '/accounts/users/' + userId + '/timesheetreminder';\r\n\r\n var config: any = {};\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config);\r\n}\r\n\r\n/*-------------------------------Shop Timesheet-------------------------------------*/\r\nexport function postShopTimesheet(userId: string, newTransaction: NewTransactionData) {\r\n const url = `accounts/${userId}/timesheets/shop`;\r\n return axiosInstance.post(url, newTransaction).then((response) => response.data);\r\n}\r\n\r\n/*-------------------------------Export----------------------------------------*/\r\nexport function downloadTimesheetExport(\r\n company: string,\r\n weekEndingDate: Date | string,\r\n approvedOnly: boolean,\r\n unExportedOnly: boolean,\r\n token?: CancelToken\r\n): Promise> {\r\n const url = '/timesheets/export/' + company + '?weekEndingDate=' + weekEndingDate + (approvedOnly ? '&approved=true' : '') + (unExportedOnly ? '&unexported=true' : '');\r\n\r\n var config: any = {\r\n responseType: 'blob',\r\n };\r\n\r\n if (token !== undefined) {\r\n config.cancelToken = token;\r\n }\r\n\r\n return axiosInstance.get(url, config).then((response) => {\r\n const url = window.URL.createObjectURL(new Blob([response.data]));\r\n const link = document.createElement('a');\r\n var filename =\r\n response.headers['content-disposition']?.substring(\r\n response.headers['content-disposition']?.indexOf('=') + 1,\r\n response.headers['content-disposition']?.indexOf('xlsx') + 4\r\n ) ?? `timesheetDownload_${getUTCAmericanDateString(weekEndingDate)}.xlsx`;\r\n link.href = url;\r\n link.setAttribute('download', filename);\r\n document.body.appendChild(link);\r\n link.click();\r\n return response;\r\n });\r\n}\r\n\r\n/*-------------------------------Interfaces----------------------------------------*/\r\nexport interface NewTransactionData {\r\n date: string;\r\n hours: number;\r\n newStatus?: string;\r\n notes?: string;\r\n earningsType?: string;\r\n shopJobPartsID?: number;\r\n}\r\n\r\nexport interface TimeRecordHeader extends CreatedUpdatedTable {\r\n id?: string;\r\n userId?: string;\r\n user?: User;\r\n periodEndingDate?: string | Date;\r\n managerApprovedBy?: string;\r\n managerApprovedDate?: string | Date;\r\n accountingApprovedBy?: string;\r\n accountingApprovedDate?: string | Date;\r\n lastExportedDate?: string | Date;\r\n details: TimeRecordDetail[];\r\n}\r\n\r\nexport interface TimeRecordDetail extends CreatedUpdatedTable {\r\n id?: string;\r\n headerId?: string;\r\n jobNumber?: string;\r\n description?: string;\r\n skill?: string;\r\n earningsType?: string;\r\n costCode?: string;\r\n shopJobPartsID?: number;\r\n shopJobParts?: ShopJobParts;\r\n costCodes: CostCode[];\r\n isPayable?: boolean;\r\n perDiem?: boolean;\r\n header?: TimeRecordHeader;\r\n hours: TimeRecordHours[];\r\n}\r\n\r\nexport interface TimeRecordHours extends CreatedUpdatedTable {\r\n id?: string;\r\n detailId?: string;\r\n dateOfRecord?: string | Date;\r\n hours?: number | string;\r\n detail?: TimeRecordDetail;\r\n}\r\n","import { createContext } from 'react';\r\nimport { Toast, toast } from 'react-toastify';\r\n\r\nexport const ToastContext = createContext(toast);\r\n\r\nexport default ToastContext;"],"sourceRoot":""}